COMMS
Template library intended to help with implementation of communication protocols.
type_traits.h
Go to the documentation of this file.
1 //
2 // Copyright 2013 - 2024 (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 
13 #include <type_traits>
15 
16 namespace comms
17 {
18 
19 namespace util
20 {
21 
22 template <typename...>
23 struct EmptyStruct {};
24 
26 template <bool TCond>
28 {
29  template <typename TTrue, typename TFalse>
30  using Type = TTrue;
31 };
32 
33 template <>
34 struct Conditional<false>
35 {
36  template <typename TTrue, typename TFalse>
37  using Type = TFalse;
38 };
39 
41 template <bool TCond, typename TTrue, typename TFalse>
42 using ConditionalT = typename Conditional<TCond>::template Type<TTrue, TFalse>;
43 
44 template <bool TCond>
45 struct LazyShallowConditional
46 {
47  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
48  using Type = TTrue<TParams...>;
49 };
50 
51 template <>
52 struct LazyShallowConditional<false>
53 {
54  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
55  using Type = TFalse<TParams...>;
56 };
57 
58 template <bool TCond>
59 struct LazyDeepConditional
60 {
61  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
62  using Type = typename TTrue<>::template Type<TParams...>;
63 };
64 
65 template <>
66 struct LazyDeepConditional<false>
67 {
68  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
69  using Type = typename TFalse<>::template Type<TParams...>;
70 };
71 
72 template <bool TCond>
73 struct LazyShallowDeepConditional
74 {
75  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
76  using Type = TTrue<TParams...>;
77 };
78 
79 template <>
80 struct LazyShallowDeepConditional<false>
81 {
82  template <template<typename...> class TTrue, template<typename...> class TFalse, typename... TParams>
83  using Type = typename TFalse<>::template Type<TParams...>;
84 };
85 
86 template <typename...>
87 class TypeDeepWrap
88 {
89 public:
90  template <typename T, typename...>
91  using Type = T;
92 };
93 
94 template <typename...>
95 class FieldCheckVersionDependent
96 {
97 public:
98  template <typename T>
99  using Type = std::integral_constant<bool, T::isVersionDependent()>;
100 };
101 
102 template <typename...>
103 class FieldCheckNonDefaultRefresh
104 {
105 public:
106  template <typename T>
107  using Type = std::integral_constant<bool, T::hasNonDefaultRefresh()>;
108 };
109 
110 template <typename...>
111 class FieldCheckVarLength
112 {
113 public:
114  template <typename T>
115  using Type = std::integral_constant<bool, T::minLength() != T::maxLength()>;
116 };
117 
118 template <typename...>
119 class FieldCheckReadNoStatus
120 {
121 public:
122  template <typename T>
123  using Type = std::integral_constant<bool, T::hasReadNoStatus()>;
124 };
125 
126 template <typename...>
127 class FieldCheckWriteNoStatus
128 {
129 public:
130  template <typename T>
131  using Type = std::integral_constant<bool, T::hasWriteNoStatus()>;
132 };
133 
134 template <typename...>
135 class TrueType
136 {
137 public:
138  template <typename...>
139  using Type = std::true_type;
140 };
141 
142 
143 template <typename...>
144 class FalseType
145 {
146 public:
147  template <typename...>
148  using Type = std::false_type;
149 };
150 
151 template <typename...>
152 class AliasType
153 {
154 public:
155  template <typename T, typename...>
156  using Type = T;
157 };
158 
159 template <typename...>
160 struct 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 
167 template <typename...>
168 struct 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 
175 template <typename...>
176 struct 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 
188 template <typename...>
189 struct 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 
201 template <typename...>
202 struct 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 
209 template <typename...>
210 class FieldMinLengthIntType
211 {
212 public:
213  template <typename T>
214  using Type = std::integral_constant<std::size_t, T::minLength()>;
215 };
216 
217 template <typename...>
218 class FieldMaxLengthIntType
219 {
220 public:
221  template <typename T>
222  using Type = std::integral_constant<std::size_t, T::maxLength()>;
223 };
224 
225 template <typename...>
226 class FieldBitLengthIntType
227 {
228 public:
229  template <typename T>
230  using Type =
231  typename details::FieldBitLengthIntTypeImpl<
232  T::ParsedOptions::HasFixedBitLengthLimit
233  >::template Type<T>;
234 };
235 
236 template <typename...>
237 class AlignmentIntType
238 {
239 public:
240  template <typename T>
241  using Type = std::integral_constant<std::size_t, alignof(T)>;
242 };
243 
244 template <typename...>
245 class SizeIntType
246 {
247 public:
248  template <typename T>
249  using Type = std::integral_constant<std::size_t, sizeof(T)>;
250 };
251 
252 template <typename...>
253 class MessageCheckHasStaticId
254 {
255 public:
256  template <typename TMessage>
257  using Type = std::integral_constant<bool, TMessage::hasStaticMsgId()>;
258 };
259 
260 template <typename...>
261 struct 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 
282 template <typename...>
283 struct 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:42
Main namespace for all classes / functions of COMMS library.
Replacement to std::conditional.
Definition: type_traits.h:28