COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
DispatchMsgIdRetrieveHelper.h
1//
2// Copyright 2019 - 2026 (C). Alex Robenko. All rights reserved.
3//
4// SPDX-License-Identifier: MPL-2.0
5//
6// This Source Code Form is subject to the terms of the Mozilla Public
7// License, v. 2.0. If a copy of the MPL was not distributed with this
8// file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#pragma once
11
14#include "comms/details/tag.h"
15#include "comms/Message.h"
16#include "comms/MessageBase.h"
17#include "comms/util/Tuple.h"
19
20#include <limits>
21#include <type_traits>
22
23namespace comms
24{
25
26namespace details
27{
28
29template <typename...>
30class DispatchMsgIdRetrieveHelper
31{
32public:
33
34 template <typename TMessage>
35 static typename TMessage::MsgIdParamType doGetId()
36 {
37 static_assert(TMessage::hasMsgIdType(), "Message interface class must define its id type");
38 static_assert(!std::is_same<Tag<TMessage>, NoIdTag<> >::value, "Must be able to retrieve ID");
39
40 return doGetIdInternal<TMessage>(Tag<TMessage>());
41 }
42
43private:
44 template <typename... TParams>
45 using HasStaticIdTag = comms::details::tag::Tag1<>;
46
47 template <typename... TParams>
48 using HasDynamicIdTag = comms::details::tag::Tag2<>;
49
50 template <typename... TParams>
51 using NoIdTag = comms::details::tag::Tag3<>;
52
53 template <typename TMessage, typename...>
54 using DynamicCheckTag =
55 typename comms::util::LazyShallowConditional<
56 comms::isMessage<TMessage>() && TMessage::hasGetId()
57 >::template Type<
58 HasDynamicIdTag,
59 NoIdTag
60 >;
61
62 template <typename TMessage>
63 using Tag =
64 typename comms::util::LazyShallowConditional<
65 messageHasStaticNumId<TMessage>()
66 >::template Type<
67 HasStaticIdTag,
68 DynamicCheckTag,
69 TMessage
70 >;
71
72 template <typename TMessage, typename... TParams>
73 static typename TMessage::MsgIdParamType doGetIdInternal(HasStaticIdTag<TParams...>)
74 {
75 static_assert(comms::isMessageBase<TMessage>(), "Must be actual message");
76 static_assert(messageHasStaticNumId<TMessage>(), "Message must define static numeric ID");
77
78 return TMessage::doGetId();
79 }
80
81 template <typename TMessage, typename... TParams>
82 static typename TMessage::MsgIdParamType doGetIdInternal(HasDynamicIdTag<TParams...>)
83 {
84 static_assert(comms::isMessage<TMessage>(), "Must be actual message");
85 static_assert(TMessage::hasGetId(), "Message interface must be able to return id polymorphically");
86
87 static const typename TMessage::MsgIdType Id = TMessage().getId();
88 return Id;
89 }
90};
91
92template <typename TMessage>
93auto dispatchMsgGetMsgId() -> decltype(DispatchMsgIdRetrieveHelper<>::template doGetId<TMessage>())
94{
95 return DispatchMsgIdRetrieveHelper<>::template doGetId<TMessage>();
96}
97
98} // namespace details
99
100} // namespace comms
Contains various compiler related definitions.
Provides common base class for the custom messages with default implementation.
Contains definition of Message object interface and various base classes for custom messages.
Contains various tuple type manipulation classes and functions.
Main namespace for all classes / functions of COMMS library.
Replacement to some types from standard type_traits.