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 namespace messagehandler_detail {
9 struct no_more{};
10 
11 template <typename CcClient, typename Message>
12 struct dispatcher {
13  bool operator()(CcClient* p, MessageHead& m) {
14  if (m.typeTag == Message::typeTag) {
15  p->handleMessageCb(m.get<Message>());
16  using Wrap = MessageWrap<Message>;
17  auto& wrap = static_cast<Wrap&>(m);
18  wrap.~Wrap();
19  return true;
20  }
21  return false;
22  }
23 };
24 
25 template <typename CcClient>
26 struct dispatcher<CcClient, JustBytes> {
27  bool operator()(CcClient* p, MessageHead& m) {
28  if (m.typeTag > 1000) { //only deliver user messages
29  auto j = &m.get<uint8_t>();
30  p->handleJustBytesCb(m.typeTag, j);
31  }
32  return false;
33  }
34 };
35 
36 }
37 
38 template <typename CcClient, typename ... Messages>
40  static void tryDispatch(CcClient* p, MessageHead& w){
41  }
42  void handleMessage(MessageHead& w) {
43  }
44 };
45 
46 template <typename CcClient, typename M, typename ... Messages>
47 struct MessageHandler<CcClient, M, Messages...> {
48  static void tryDispatch(CcClient* p, MessageHead& e) {
50  NEH::tryDispatch(p, e);
51  }
52  void handleMessage(MessageHead& w) {
53  tryDispatch(static_cast<CcClient*>(this), w);
54  }
55 
56  using NEH = MessageHandler<CcClient, Messages ...>;
57 };
58 
59 }}
Definition: MessageHandler.hpp:12
Definition: Message.hpp:42
A special type of message.
Definition: Message.hpp:143
Definition: Message.hpp:76
Definition: MessageHandler.hpp:9
Definition: Base.hpp:12
Definition: MessageHandler.hpp:39