hmbdc
simplify-high-performance-messaging-programming
MessageHandler.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/app/Message.hpp"
5 
6 namespace hmbdc { namespace app {
7 
8 using namespace hmbdc;
9 
10 namespace detail {
11 struct no_more{};
12 
13 template <typename CcClient, typename Message>
14 struct dispatcher {
15  bool operator()(CcClient* p, MessageHead& m) {
16  if (m.typeTag == Message::typeTag) {
17  p->handleMessageCb(m.get<Message>());
18  return true;
19  }
20  return false;
21  }
22 };
23 
24 template <typename CcClient>
25 struct dispatcher<CcClient, JustBytes> {
26  bool operator()(CcClient* p, MessageHead& m) {
27  if (m.typeTag > 1000) { //only deliver user messages
28  auto j = &m.get<uint8_t>();
29  p->handleJustBytesCb(m.typeTag, j);
30  }
31  return false;
32  }
33 };
34 
35 }
36 
37 template <typename CcClient, typename ... Messages>
39  static void tryDispatch(CcClient* p, MessageHead& w){
40  }
41  void handleMessage(MessageHead& w) {
42  }
43 };
44 
45 template <typename CcClient, typename M, typename ... Messages>
46 struct MessageHandler<CcClient, M, Messages...> {
47  static void tryDispatch(CcClient* p, MessageHead& e) {
49  NEH::tryDispatch(p, e);
50  }
51  void handleMessage(MessageHead& w) {
52  tryDispatch(static_cast<CcClient*>(this), w);
53  }
54 
55  using NEH = MessageHandler<CcClient, Messages ...>;
56 };
57 
58 }}
Definition: MessageHandler.hpp:11
Definition: Message.hpp:25
A special type of message.
Definition: Message.hpp:105
Definition: MessageHandler.hpp:14
Definition: Client.hpp:11
Definition: MessageHandler.hpp:38