COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
process.h
1//
2// Copyright 2019 - 2025 (C). Alex Robenko. All rights reserved.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
8#pragma once
9
10#include "comms/Message.h"
11#include "comms/details/detect.h"
12
13#include <type_traits>
14
15namespace comms
16{
17
18namespace details
19{
20
21template <typename T>
22using ProcessMsgDecayType = typename std::decay<T>::type;
23
24template <bool TIsMessage, bool TIsMsgPtr>
25struct ProcessMsgIdRetrieveHelper
26{
27 template <typename T>
28 using Type = void;
29};
30
31template <>
32struct ProcessMsgIdRetrieveHelper<true, false>
33{
34 template <typename T>
35 using Type = comms::MessageIdType<T>;
36};
37
38template <>
39struct ProcessMsgIdRetrieveHelper<false, true>
40{
41private:
42 template <typename T>
43 using ElementType = typename T::element_type;
44public:
45 template <typename T>
46 using Type =
47 typename ProcessMsgIdRetrieveHelper<comms::isMessage<ElementType<T> >(), hasElementType<ElementType<T> >()>::
48 template Type<ElementType<T> >;
49};
50
51template <typename T>
52using ProcessMsgIdType =
53 typename ProcessMsgIdRetrieveHelper<comms::isMessage<ProcessMsgDecayType<T> >(), hasElementType<ProcessMsgDecayType<T> >()>::
54 template Type<ProcessMsgDecayType<T> >;
55
56template <bool TIsMessage, bool TIsMsgPtr>
57struct ProcessMsgCastToMsgObjHelper;
58
59template <>
60struct ProcessMsgCastToMsgObjHelper<true, false>
61{
62 template <typename T>
63 static auto cast(T& msg) -> decltype(msg)
64 {
65 return msg;
66 }
67};
68
69template <>
70struct ProcessMsgCastToMsgObjHelper<false, true>
71{
72 template <typename T>
73 static auto cast(T& msg) -> decltype(*msg)
74 {
75 return *msg;
76 }
77};
78
79template <typename T>
80using ProcessMsgCastParamIsMessage =
81 std::integral_constant<
82 bool,
83 isMessage<ProcessMsgDecayType<T> >()
84 >;
85
86template <typename T>
87using ProcessMsgCastParamIsMsgPtr =
88 std::integral_constant<
89 bool,
90 hasElementType<ProcessMsgDecayType<T> >()
91 >;
92
93template <typename T>
94auto processMsgCastToMsgObj(T& msg) ->
95 decltype(ProcessMsgCastToMsgObjHelper<ProcessMsgCastParamIsMessage<T>::value, ProcessMsgCastParamIsMsgPtr<T>::value>::cast(msg))
96{
97 return ProcessMsgCastToMsgObjHelper<ProcessMsgCastParamIsMessage<T>::value, ProcessMsgCastParamIsMsgPtr<T>::value>::cast(msg);
98}
99
100} // namespace details
101
102} // namespace comms
Contains definition of Message object interface and various base classes for custom messages.
Main namespace for all classes / functions of COMMS library.
typename comms::util::LazyDeepConditional< TMsg::InterfaceOptions::HasMsgIdType >::template Type< comms::details::MessageIdTypeRetriever, comms::util::AliasType, TDefaultType, TMsg > MessageIdType
Get type of message ID used by interface class.
Definition Message.h:563