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
143
144template <typename...>
145class FalseType
146{
147public:
148 template <typename...>
149 using Type = std::false_type;
150};
151
152template <typename...>
153class AliasType
154{
155public:
156 template <typename T, typename...>
157 using Type = T;
158};
159
160template <typename...>
161struct LogicalOrBinaryOp
162{
163 // TFirst and TSecond are either std::true_type || std::false_type
164 template <typename TFirst, typename TSecond>
165 using Type = std::integral_constant<bool, (TFirst::value || TSecond::value)>;
166};
167
168template <typename...>
169struct LogicalAndBinaryOp
170{
171 // TFirst and TSecond are either std::true_type || std::false_type
172 template <typename TFirst, typename TSecond>
173 using Type = std::integral_constant<bool, (TFirst::value && TSecond::value)>;
174};
175
176template <typename...>
177struct IntMaxBinaryOp
178{
179 template <typename TFirst, typename TSecond>
180 using Type =
181 typename Conditional<
182 (TFirst::value >= TSecond::value)
183 >::template Type<
184 TFirst,
185 TSecond
186 >;
187};
188
189template <typename...>
190struct IntMinBinaryOp
191{
192 template <typename TFirst, typename TSecond>
193 using Type =
194 typename Conditional<
195 (TFirst::value <= TSecond::value)
196 >::template Type<
197 TFirst,
198 TSecond
199 >;
200};
201
202template <typename...>
203struct IntSumBinaryOp
204{
205 template <typename TFirst, typename TSecond>
206 using Type =
207 std::integral_constant<typename TFirst::value_type, TFirst::value + TSecond::value>;
208};
209
210template <typename...>
211class FieldMinLengthIntType
212{
213public:
214 template <typename T>
215 using Type = std::integral_constant<std::size_t, T::minLength()>;
216};
217
218template <typename...>
219class FieldMaxLengthIntType
220{
221public:
222 template <typename T>
223 using Type = std::integral_constant<std::size_t, T::maxLength()>;
224};
225
226template <typename...>
227class FieldBitLengthIntType
228{
229public:
230 template <typename T>
231 using Type =
232 typename details::FieldBitLengthIntTypeImpl<
233 T::ParsedOptions::HasFixedBitLengthLimit
234 >::template Type<T>;
235};
236
237template <typename...>
238class AlignmentIntType
239{
240public:
241 template <typename T>
242 using Type = std::integral_constant<std::size_t, alignof(T)>;
243};
244
245template <typename...>
246class SizeIntType
247{
248public:
249 template <typename T>
250 using Type = std::integral_constant<std::size_t, sizeof(T)>;
251};
252
253template <typename...>
254class MessageCheckHasStaticId
255{
256public:
257 template <typename TMessage>
258 using Type = std::integral_constant<bool, TMessage::hasStaticMsgId()>;
259};
260
261template <typename...>
262struct AccumulateFromUntil
263{
264 template <
265 std::size_t TFrom,
266 std::size_t TUntil,
267 template<typename...> class TTransformOp,
268 template<typename...> class TBinaryOp,
269 typename TStart,
270 typename... TRest>
271 using Type =
272 typename details::AccumulateFromUntilImpl<
273 (0 == sizeof...(TRest)) || (TUntil == 0U)
274 >::template Type<
275 TFrom,
276 TUntil,
277 TTransformOp,
278 TBinaryOp,
279 TStart,
280 TRest...>;
281};
282
283template <typename...>
284struct Accumulate
285{
286 template <
287 template<typename...> class TTransformOp,
288 template<typename...> class TBinaryOp,
289 typename TStart,
290 typename... TRest>
291 using Type =
292 typename AccumulateFromUntil<>::template Type<
293 0,
294 sizeof...(TRest),
295 TTransformOp,
296 TBinaryOp,
297 TStart,
298 TRest...
299 >;
300};
301
302} // namespace util
303
304} // 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