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