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
13#include <cstdint>
14#include <cstddef>
15#include <limits>
16#include <type_traits>
17
18namespace comms
19{
20
21namespace util
22{
23
24template <typename...>
25struct Accumulate;
26
27template <typename...>
28struct AccumulateFromUntil;
29
30template <bool TCond>
31struct Conditional;
32
33namespace details
34{
35
36template<bool TEmpty>
37struct AccumulateLoop
38{
39 template <
40 template<typename...> class TAlg,
41 template<typename...> class TTransformOp,
42 template<typename...> class TBinaryOp,
43 typename TStart,
44 typename... TRest
45 >
46 using Type = typename TAlg<>::template Type<TTransformOp, TBinaryOp, TStart, TRest...>;
47};
48
49template<>
50struct AccumulateLoop<true>
51{
52 template <
53 template<typename...> class TAlg,
54 template<typename...> class TTransformOp,
55 template<typename...> class TBinaryOp,
56 typename TStart,
57 typename... TRest
58 >
59 using Type = TStart;
60};
61
62template<bool TEmpty>
63struct AccumulateFromUntilLoop
64{
65 template <
66 std::size_t TFrom,
67 std::size_t TUntil,
68 template<typename...> class TAlg,
69 template<typename...> class TTransformOp,
70 template<typename...> class TBinaryOp,
71 typename TStart,
72 typename... TRest
73 >
74 using Type = typename TAlg<>::template Type<TFrom, TUntil, TTransformOp, TBinaryOp, TStart, TRest...>;
75};
76
77template<>
78struct AccumulateFromUntilLoop<true>
79{
80 template <
81 std::size_t TFrom,
82 std::size_t TUntil,
83 template<typename...> class TAlg,
84 template<typename...> class TTransformOp,
85 template<typename...> class TBinaryOp,
86 typename TStart,
87 typename... TRest
88 >
89 using Type = TStart;
90};
91
92template <bool TEmpty>
93struct AccumulateImpl
94{
95 template <
96 template<typename...> class TTransformOp,
97 template<typename...> class TBinaryOp,
98 typename TStart,
99 typename T,
100 typename... TRest>
101 using Type =
102 typename AccumulateLoop<0U == sizeof...(TRest)>::template Type<
103 comms::util::Accumulate,
104 TTransformOp,
105 TBinaryOp,
106 typename TBinaryOp<>::template Type<
107 TStart,
108 typename TTransformOp<>::template Type<T>
109 >,
110 TRest...>;
111};
112
113template <>
114struct AccumulateImpl<true>
115{
116 template <
117 template<typename...> class TTransformOp,
118 template<typename...> class TBinaryOp,
119 typename TStart,
120 typename...>
121 using Type = TStart;
122};
123
124template <bool TEmpty>
125struct AccumulateFromUntilImpl
126{
127 template <
128 std::size_t TFrom,
129 std::size_t TUntil,
130 template<typename...> class TTransformOp,
131 template<typename...> class TBinaryOp,
132 typename TStart,
133 typename T,
134 typename... TRest>
135 using Type =
136 typename Conditional<
137 0U < TFrom
138 >::template Type<
139 typename AccumulateFromUntilImpl<
140 0U == sizeof...(TRest)
141 >::template Type<
142 TFrom - 1U,
143 TUntil - 1U,
144 TTransformOp,
145 TBinaryOp,
146 TStart,
147 TRest...
148 >,
149 typename AccumulateFromUntilLoop<
150 (0U == sizeof...(TRest)) || (TUntil <= 1)
151 >::template Type<
152 0U,
153 TUntil - 1,
154 comms::util::AccumulateFromUntil,
155 TTransformOp,
156 TBinaryOp,
157 typename TBinaryOp<>::template Type<
158 TStart,
159 typename TTransformOp<>::template Type<T>
160 >,
161 TRest...>
162 >;
163};
164
165template <>
166struct AccumulateFromUntilImpl<true>
167{
168 template <
169 std::size_t TFrom,
170 std::size_t TUntil,
171 template<typename...> class TTransformOp,
172 template<typename...> class TBinaryOp,
173 typename TStart,
174 typename...>
175 using Type = TStart;
176};
177
178template <bool THasFixedBitLength>
179struct FieldBitLengthIntTypeImpl
180{
181 template <typename T>
182 using Type =
183 std::integral_constant<std::size_t, T::ParsedOptions::FixedBitLength>;
184};
185
186template <>
187struct FieldBitLengthIntTypeImpl<false>
188{
189public:
190 template <typename T>
191 using Type =
192 std::integral_constant<
193 std::size_t,
194 T::maxLength() * std::numeric_limits<std::uint8_t>::digits>;
195};
196
197} // namespace details
198
199} // namespace util
200
201} // namespace comms
Main namespace for all classes / functions of COMMS library.