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