1 #include "hmbdc/Copyright.hpp"
4 #include "hmbdc/app/Message.hpp"
5 #include "hmbdc/app/Logger.hpp"
6 #include "hmbdc/MetaUtils.hpp"
8 namespace hmbdc {
namespace app {
10 namespace messagehandler_detail {
11 template <
typename CcClient,
typename Message>
14 if (m.typeTag == Message::typeTag) {
15 HMBDC_LOG_r(c.hmbdcName(),
this,
" received ", m.get<Message>());
16 c.handleMessageCb(m.get<Message>());
18 auto& wrap =
static_cast<Wrap&
>(m);
26 template <
typename CcClient>
29 if (m.typeTag > 1000) {
30 auto j = &m.get<uint8_t>();
31 HMBDC_LOG_r(c,
this,
" received bytes typeTag=", m.typeTag);
32 c.handleJustBytesCb(m.typeTag, j);
38 template<
class T,
class U>
39 struct ascending_by_tag
40 : std::integral_constant<bool, T::typeTag < U::typeTag>
44 template <typename CcClient, typename ... Messages>
45 struct SeqMessageDispacher {
46 bool operator()(CcClient&, MessageHead&) const{return false;}
49 template <typename CcClient, typename M, typename ... Messages>
50 struct SeqMessageDispacher<CcClient, std::tuple<M, Messages...>> {
51 bool operator()(CcClient& c, MessageHead& e) const {
52 if (!dispatcher<CcClient, M>()(c, e))
53 return SeqMessageDispacher<CcClient, std::tuple<Messages ...>>()(c, e);
61 #if __GNUC_PREREQ(9,0)
62 template <typename CcClient, typename ... Messages>
63 struct MessageDispacher {
64 bool operator()(CcClient&, MessageHead&) const;
67 template <typename CcClient, typename ... Messages>
68 struct MessageDispacher<CcClient, std::tuple<Messages...>> {
70 index_in_tuple<JustBytes, std::tuple<Messages...>>::value == sizeof...(Messages)
71 || sizeof...(Messages) <= 16
72 , "JustBytes cannot be combined with too many other types");
74 bool operator()(CcClient& c, MessageHead& e) const {
75 if constexpr (sizeof...(Messages) > 16) {
76 using SortedTupleMessages
77 = typename sort_tuple<messagehandler_detail::ascending_by_tag
78 , std::tuple<Messages...>>::type;
80 return bsearch_tuple<SortedTupleMessages>()(
82 using M = typename std::remove_reference<decltype(*t)>::type;
83 if (messagehandler_detail::dispatcher<CcClient, M>()(c, e)) {
86 if (e.typeTag < M::typeTag) return -1;
91 return messagehandler_detail::SeqMessageDispacher<
92 CcClient, std::tuple<Messages ...>>()(c, e);
99 template <typename CcClient, typename ... Messages>
100 using MessageDispacher = messagehandler_detail::SeqMessageDispacher<
101 CcClient, Messages ...>;
Definition: MessageDispacher.hpp:12
Definition: Message.hpp:78
A special type of message only used on the receiving side.
Definition: Message.hpp:182
Definition: Message.hpp:112