hmbdc
simplify-high-performance-messaging-programming
Messages.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/comm/Topic.hpp"
5 #include "hmbdc/app/Message.hpp"
6 
7 #include <type_traits>
8 #include <ostream>
9 
10 namespace hmbdc { namespace app { namespace netmap {
11 
13  uint8_t topicLen;
14  uint16_t& messagePayloadLen() {
15  return *reinterpret_cast<uint16_t*>(payload());
16  }
17  uint16_t const& messagePayloadLen() const {
18  return *reinterpret_cast<uint16_t const*>(payload());
19  }
20 
21 //copy message into the right place in memory
22  template <typename M>
24  copyTo(void* addrIn, comm::Topic const& t, M&& m) {
25  using Message = typename std::remove_reference<M>::type;
26  auto addr = (char*)addrIn;
27  auto h = reinterpret_cast<TransportMessageHeader*>(addr);
28  auto tl = t.copyTo(addr + sizeof(TransportMessageHeader));
29  h->topicLen = tl;
30  new (addr + sizeof(TransportMessageHeader) + tl)
31  MessageWrap<Message>(std::forward<M>(m));
32  h->messagePayloadLen() = sizeof(MessageWrap<Message>);
33  return h;
34  }
35 
37  copyTo(void* addrIn, comm::Topic const& t, uint16_t tag, void const* bytes, size_t len) {
38  auto addr = (char*)addrIn;
39  auto h = reinterpret_cast<TransportMessageHeader*>(addr);
40  auto tl = t.copyTo(addr + sizeof(TransportMessageHeader));
41  h->topicLen = tl;
42  new (addr + sizeof(TransportMessageHeader) + tl) MessageWrap<JustBytes>(tag, bytes, len);
43  h->messagePayloadLen() = sizeof(MessageWrap<JustBytes>) - sizeof(MessageWrap<JustBytes>::payload) + len;
44  return h;
45  }
46 
47  template <typename Message, typename ... Args>
49  copyToInPlace(void* addrIn, comm::Topic const& t, Args&&... args) {
50  char* addr = (char*)addrIn;
51  auto h = reinterpret_cast<TransportMessageHeader*>(addr);
52  auto tl = t.copyTo(addr + sizeof(TransportMessageHeader));
53  h->topicLen = tl;
54  new (addr + sizeof(TransportMessageHeader) + tl) MessageWrap<Message>(std::forward<Args>(args)...);
55  h->messagePayloadLen() = sizeof(MessageWrap<Message>);
56  return h;
57  }
58 
59  std::pair<char const*, char const*> topic() const {
60  char const* b = reinterpret_cast<const char*>(this)
61  + sizeof(TransportMessageHeader);
62  return std::make_pair(b, b + topicLen);
63  }
64 
65  void const* payload() const {
66  return reinterpret_cast<const char*>(this)
67  + sizeof(TransportMessageHeader) + topicLen;
68  }
69 
70  void * payload() {
71  return reinterpret_cast<char*>(this)
72  + sizeof(TransportMessageHeader) + topicLen;
73  }
74 
75  uint16_t typeTag() const {
76  auto h = static_cast<app::MessageHead const*>(payload());
77  return h->typeTag;
78  }
79 
80  template <typename Message>
81  Message& wrapped() {
82  auto wrap = static_cast<app::MessageWrap<Message>*>(payload());
83  return wrap->payload;
84  }
85 
86  template <typename Message>
87  Message const& wrapped() const {
88  auto wrap = static_cast<app::MessageWrap<Message> const *>(payload());
89  return wrap->payload;
90  }
91 
92  size_t wireSize() const {
93  return sizeof(TransportMessageHeader) + topicLen
94  + messagePayloadLen();
95  }
96 
97  size_t wireSizeContainsTopic() const {
98  return sizeof(TransportMessageHeader) + topicLen;
99  }
100 
101  template <typename Message>
102  static
103  size_t wireSize(comm::Topic const& t) {
104 
105  return sizeof(TransportMessageHeader) + strnlen(t.c_str(), sizeof(t))
106  + sizeof(MessageWrap<Message>);
107  }
108 
109 } __attribute__((packed));
110 
111 struct Subscribe
112 : hasTag<301> {
113  Subscribe(comm::Topic const&topic)
114  : topic(topic){}
115  comm::Topic topic;
116 };
117 
118 struct Unsubscribe
119 : hasTag<302> {
120  Unsubscribe(comm::Topic const&topic)
121  : topic(topic){}
122  comm::Topic topic;
123 };
124 static_assert(sizeof(Unsubscribe) == 64
125  , "do you have a pack pragma unclosed that influencs the above struct packing unexpectedly?");
126 }}}
Definition: Message.hpp:163
Definition: Messages.hpp:111
topic as in the publish / subscribe communication paradigm
Definition: Topic.hpp:14
each message type has 16 bit tag
Definition: Message.hpp:29
Definition: Message.hpp:42
Definition: Messages.hpp:118
Definition: Message.hpp:76
Definition: Base.hpp:12