COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
message_check.h
Go to the documentation of this file.
1//
2// Copyright 2017 - 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
12
13#pragma once
14
15#include "comms/Assert.h"
16#include "comms/MessageBase.h"
17#include "comms/util/Tuple.h"
19
20#include <tuple>
21#include <type_traits>
22
23namespace comms
24{
25
26namespace details
27{
28
29template <typename TMessage>
30using MessageStaticNumIdBoolType =
31 typename comms::util::LazyDeepConditional<
32 comms::isMessageBase<TMessage>()
33 >::template Type<
34 comms::util::MessageCheckHasStaticId,
35 comms::util::FalseType,
36 TMessage
37 >;
38
39template <typename...>
40struct MessageStaticNumIdCheckHelper
41{
42 template <typename TMessage>
43 constexpr bool operator()(bool value) const
44 {
45 return value && MessageStaticNumIdBoolType<TMessage>::value;
46 }
47};
48
49template <typename... TMessages>
50using AllMessagesHaveStaticNumIdBoolType =
51 std::integral_constant<
52 bool,
53 comms::util::tupleTypeAccumulate<std::tuple<TMessages...> >(true, MessageStaticNumIdCheckHelper<>())
54 >;
55
56template <typename TAllMessages>
57struct AllMessagesHaveStaticNumIdCheckHelper;
58
59template <typename... TMessages>
60struct AllMessagesHaveStaticNumIdCheckHelper<std::tuple<TMessages...> >
61{
62 static constexpr bool Value = AllMessagesHaveStaticNumIdBoolType<TMessages...>::value;
63};
64
65template <typename TAllMessages>
66constexpr bool allMessagesHaveStaticNumId()
67{
68 return AllMessagesHaveStaticNumIdCheckHelper<TAllMessages>::Value;
69}
70
71template <typename TMessage>
72constexpr bool messageHasStaticNumId()
73{
74 return MessageStaticNumIdBoolType<TMessage>::value;
75}
76
77template <bool TAllSorted, bool TMoreThanOne, typename...>
78class AllMessagesStrongSortedCheckHelper;
79
80template <bool TMoreThanOne, typename... TParams>
81class AllMessagesStrongSortedCheckHelper<false, TMoreThanOne, TParams...>
82{
83public:
84 template <typename...>
85 using Type = std::false_type;
86};
87
88template <typename... TParams>
89class AllMessagesStrongSortedCheckHelper<true, false, TParams...>
90{
91public:
92 template <typename...>
93 using Type = std::true_type;
94};
95
96template <typename... TParams>
97class AllMessagesStrongSortedCheckHelper<true, true, TParams...>
98{
99public:
100 template <typename TMsg1, typename TMsg2, typename... TRest>
101 using Type =
103 (TMsg1::staticMsgId() < TMsg2::staticMsgId())
104 >::template Type<
105 typename AllMessagesStrongSortedCheckHelper<true, (0U < sizeof...(TRest))>::template Type<TMsg2, TRest...>,
106 std::false_type
107 >;
108};
109
110template <bool TAllSorted, bool TMoreThanOne, typename...>
111class AllMessagesWeakSortedCheckHelper;
112
113template <bool TMoreThanOne, typename... TParams >
114class AllMessagesWeakSortedCheckHelper<false, TMoreThanOne, TParams...>
115{
116public:
117 template <typename... TRest>
118 using Type = std::false_type;
119};
120
121template <typename... TParams>
122class AllMessagesWeakSortedCheckHelper<true, false, TParams...>
123{
124public:
125 template <typename... TRest>
126 using Type = std::true_type;
127};
128
129template <typename... TParams>
130class AllMessagesWeakSortedCheckHelper<true, true, TParams...>
131{
132public:
133 template <typename TMsg1, typename TMsg2, typename... TRest>
134 using Type =
136 (TMsg1::staticMsgId() <= TMsg2::staticMsgId())
137 >::template Type<
138 typename AllMessagesWeakSortedCheckHelper<true, (0U < sizeof...(TRest))>::template Type<TMsg2, TRest...>,
139 std::false_type
140 >;
141};
142
143template <typename TAllMessages>
144struct AllMessagesStrongSortedCheckHelperWrap;
145
146template <typename... TAllMessages>
147struct AllMessagesStrongSortedCheckHelperWrap<std::tuple<TAllMessages...> >
148{
149 static constexpr bool Value =
150 AllMessagesStrongSortedCheckHelper<
151 (AllMessagesHaveStaticNumIdBoolType<TAllMessages...>::value),
152 (1U < sizeof...(TAllMessages))
153 >::template Type<TAllMessages...>::value;
154};
155
156template <typename TAllMessages>
157struct AllMessagesWeakSortedCheckHelperWrap;
158
159template <typename... TAllMessages>
160struct AllMessagesWeakSortedCheckHelperWrap<std::tuple<TAllMessages...> >
161{
162 static constexpr bool Value =
163 AllMessagesWeakSortedCheckHelper<
164 (AllMessagesHaveStaticNumIdBoolType<TAllMessages...>::value),
165 (1U < sizeof...(TAllMessages))
166 >::template Type<TAllMessages...>::value;
167};
168
169template <typename TAllMessages>
170constexpr bool allMessagesAreStrongSorted()
171{
172 return AllMessagesStrongSortedCheckHelperWrap<TAllMessages>::Value;
173}
174
175template <typename TAllMessages>
176constexpr bool allMessagesAreWeakSorted()
177{
178 return AllMessagesWeakSortedCheckHelperWrap<TAllMessages>::Value;
179}
180
181} // namespace details
182
183} // namespace comms
This file contains classes required for generic custom assertion functionality.
Provides common base class for the custom messages with default implementation.
Contains various tuple type manipulation classes and functions.
constexpr TValue tupleTypeAccumulate(const TValue &value, TFunc &&func)
Performs "accumulate" algorithm on every type of the tuple.
Definition Tuple.h:686
Main namespace for all classes / functions of COMMS library.
STL namespace.
Replacement to std::conditional.
Definition type_traits.h:32
Replacement to some types from standard type_traits.