COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
type_traits.h
Go to the documentation of this file.
1//
2// Copyright 2013 - 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
16
17#include <cstddef>
18#include <type_traits>
19
20namespace comms
21{
22
23namespace util
24{
25
26template <typename...>
27struct EmptyStruct {};
28
30template <bool TCond>
32{
33 template <typename TTrue, typename TFalse>
34 using Type = TTrue;
35};
36
37template <>
39{
40 template <typename TTrue, typename TFalse>
41 using Type = TFalse;
42};
43
45template <bool TCond, typename TTrue, typename TFalse>
46using ConditionalT = typename Conditional<TCond>::template Type<TTrue, TFalse>;
47
48template <bool TCond>
49struct LazyShallowConditional
50{
51 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
52 using Type = TTrue<TParams...>;
53};
54
55template <>
56struct LazyShallowConditional<false>
57{
58 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
59 using Type = TFalse<TParams...>;
60};
61
62template <bool TCond>
63struct LazyDeepConditional
64{
65 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
66 using Type = typename TTrue<>::template Type<TParams...>;
67};
68
69template <>
70struct LazyDeepConditional<false>
71{
72 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
73 using Type = typename TFalse<>::template Type<TParams...>;
74};
75
76template <bool TCond>
77struct LazyShallowDeepConditional
78{
79 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
80 using Type = TTrue<TParams...>;
81};
82
83template <>
84struct LazyShallowDeepConditional<false>
85{
86 template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
87 using Type = typename TFalse<>::template Type<TParams...>;
88};
89
90template <typename...>
91class TypeDeepWrap
92{
93public:
94 template <typename T, typename...>
95 using Type = T;
96};
97
98template <typename...>
99class FieldCheckVersionDependent
100{
101public:
102 template <typename T>
103 using Type = std::integral_constant<bool, T::isVersionDependent()>;
104};
105
106template <typename...>
107class FieldCheckNonDefaultRefresh
108{
109public:
110 template <typename T>
111 using Type = std::integral_constant<bool, T::hasNonDefaultRefresh()>;
112};
113
114template <typename...>
115class FieldCheckVarLength
116{
117public:
118 template <typename T>
119 using Type = std::integral_constant<bool, T::minLength() != T::maxLength()>;
120};
121
122template <typename...>
123class FieldCheckReadNoStatus
124{
125public:
126 template <typename T>
127 using Type = std::integral_constant<bool, T::hasReadNoStatus()>;
128};
129
130template <typename...>
131class FieldCheckWriteNoStatus
132{
133public:
134 template <typename T>
135 using Type = std::integral_constant<bool, T::hasWriteNoStatus()>;
136};
137
138template <typename...>
139class TrueType
140{
141public:
142 template <typename...>
143 using Type = std::true_type;
144};
145
146template <typename...>
147class FalseType
148{
149public:
150 template <typename...>
151 using Type = std::false_type;
152};
153
154template <typename...>
155class AliasType
156{
157public:
158 template <typename T, typename...>
159 using Type = T;
160};
161
162template <typename...>
163struct LogicalOrBinaryOp
164{
165 // TFirst and TSecond are either std::true_type || std::false_type
166 template <typename TFirst, typename TSecond>
167 using Type = std::integral_constant<bool, (TFirst::value || TSecond::value)>;
168};
169
170template <typename...>
171struct LogicalAndBinaryOp
172{
173 // TFirst and TSecond are either std::true_type || std::false_type
174 template <typename TFirst, typename TSecond>
175 using Type = std::integral_constant<bool, (TFirst::value && TSecond::value)>;
176};
177
178template <typename...>
179struct IntMaxBinaryOp
180{
181 template <typename TFirst, typename TSecond>
182 using Type =
183 typename Conditional<
184 (TFirst::value >= TSecond::value)
185 >::template Type<
186 TFirst,
187 TSecond
188 >;
189};
190
191template <typename...>
192struct IntMinBinaryOp
193{
194 template <typename TFirst, typename TSecond>
195 using Type =
196 typename Conditional<
197 (TFirst::value <= TSecond::value)
198 >::template Type<
199 TFirst,
200 TSecond
201 >;
202};
203
204template <typename...>
205struct IntSumBinaryOp
206{
207 template <typename TFirst, typename TSecond>
208 using Type =
209 std::integral_constant<typename TFirst::value_type, TFirst::value + TSecond::value>;
210};
211
212template <typename...>
213class FieldMinLengthIntType
214{
215public:
216 template <typename T>
217 using Type = std::integral_constant<std::size_t, T::minLength()>;
218};
219
220template <typename...>
221class FieldMaxLengthIntType
222{
223public:
224 template <typename T>
225 using Type = std::integral_constant<std::size_t, T::maxLength()>;
226};
227
228template <typename...>
229class FieldBitLengthIntType
230{
231public:
232 template <typename T>
233 using Type =
234 typename details::FieldBitLengthIntTypeImpl<
235 T::ParsedOptions::HasFixedBitLengthLimit
236 >::template Type<T>;
237};
238
239template <typename...>
240class AlignmentIntType
241{
242public:
243 template <typename T>
244 using Type = std::integral_constant<std::size_t, alignof(T)>;
245};
246
247template <typename...>
248class SizeIntType
249{
250public:
251 template <typename T>
252 using Type = std::integral_constant<std::size_t, sizeof(T)>;
253};
254
255template <typename...>
256class MessageCheckHasStaticId
257{
258public:
259 template <typename TMessage>
260 using Type = std::integral_constant<bool, TMessage::hasStaticMsgId()>;
261};
262
263template <typename...>
264struct AccumulateFromUntil
265{
266 template <
267 std::size_t TFrom,
268 std::size_t TUntil,
269 template<typename...> class TTransformOp,
270 template<typename...> class TBinaryOp,
271 typename TStart,
272 typename... TRest>
273 using Type =
274 typename details::AccumulateFromUntilImpl<
275 (0 == sizeof...(TRest)) || (TUntil == 0U)
276 >::template Type<
277 TFrom,
278 TUntil,
279 TTransformOp,
280 TBinaryOp,
281 TStart,
282 TRest...>;
283};
284
285template <typename...>
286struct Accumulate
287{
288 template <
289 template<typename...> class TTransformOp,
290 template<typename...> class TBinaryOp,
291 typename TStart,
292 typename... TRest>
293 using Type =
294 typename AccumulateFromUntil<>::template Type<
295 0,
296 sizeof...(TRest),
297 TTransformOp,
298 TBinaryOp,
299 TStart,
300 TRest...
301 >;
302};
303
304} // namespace util
305
306} // namespace comms
Replacement to some types from standard type_traits.
typename Conditional< TCond >::template Type< TTrue, TFalse > ConditionalT
Replacement to std::conditional.
Definition type_traits.h:46
Main namespace for all classes / functions of COMMS library.
Replacement to std::conditional.
Definition type_traits.h:32