COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
CommonFuncs.h
1//
2// Copyright 2017 - 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
10#pragma once
11
12#include "comms/ErrorStatus.h"
13#include "comms/field/details/FieldOpHelpers.h"
14#include "comms/util/Tuple.h"
15
16#include <cstddef>
17#include <iterator>
18#include <tuple>
19#include <type_traits>
20
21namespace comms
22{
23
24namespace field
25{
26
27namespace basic
28{
29
30struct CommonFuncs
31{
32 template <typename TField, typename TIter>
33 static comms::ErrorStatus readSequence(TField& field, TIter& iter, std::size_t len)
34 {
35 field.clear();
36 auto remLen = len;
37 while (0 < remLen) {
38 auto& elem = field.createBack();
39 auto es = field.readElement(elem, iter, remLen);
41 field.value().pop_back();
42 return es;
43 }
44 }
45
47 }
48
49 template <typename TField, typename TIter>
50 static comms::ErrorStatus readSequenceN(TField& field, std::size_t count, TIter& iter, std::size_t& len)
51 {
52 field.clear();
53 while (0 < count) {
54 auto& elem = field.createBack();
55 auto es = field.readElement(elem, iter, len);
57 field.value().pop_back();
58 return es;
59 }
60 --count;
61 }
63 }
64
65 template <typename TField, typename TIter>
66 static void readSequenceNoStatusN(TField& field, std::size_t count, TIter& iter)
67 {
68 field.clear();
69 while (0 < count) {
70 auto& elem = field.createBack();
71 field.readElementNoStatus(elem, iter);
72 --count;
73 }
74 }
75
76 template <typename TField>
77 static bool canWriteSequence(const TField& field)
78 {
79 for (auto& elem : field.value()) {
80 if (!field.canWriteElement(elem)) {
81 return false;
82 }
83 }
84
85 return true;
86 }
87
88 template <typename TField, typename TIter>
89 static comms::ErrorStatus writeSequence(const TField& field, TIter& iter, std::size_t len)
90 {
91 auto es = ErrorStatus::Success;
92 auto remainingLen = len;
93 for (auto& elem : field.value()) {
94 if (!field.canWriteElement(elem)) {
96 break;
97 }
98
99 es = field.writeElement(elem, iter, remainingLen);
100 if (es != comms::ErrorStatus::Success) {
101 break;
102 }
103 }
104
105 return es;
106 }
107
108 template <typename TField, typename TIter>
109 static void writeSequenceNoStatus(TField& field, TIter& iter)
110 {
111 for (auto& elem : field.value()) {
112 field.writeElementNoStatus(elem, iter);
113 }
114 }
115
116 template <typename TField, typename TIter>
117 static comms::ErrorStatus writeSequenceN(const TField& field, std::size_t count, TIter& iter, std::size_t& len)
118 {
119 auto es = ErrorStatus::Success;
120 for (auto& elem : field.value()) {
121 if (count == 0) {
122 break;
123 }
124
125 es = field.writeElement(elem, iter, len);
126 if (es != ErrorStatus::Success) {
127 break;
128 }
129
130 --count;
131 }
132
133 return es;
134 }
135
136 template <typename TField, typename TIter>
137 static void writeSequenceNoStatusN(const TField& field, std::size_t count, TIter& iter)
138 {
139 for (auto& elem : field.value()) {
140 if (count == 0) {
141 break;
142 }
143
144 field.writeElementNoStatus(elem, iter);
145 --count;
146 }
147 }
148
149 template <typename TIter>
150 static void advanceWriteIterator(TIter& iter, std::size_t len)
151 {
152 using IterType = typename std::decay<decltype(iter)>::type;
153 using ByteType = typename std::iterator_traits<IterType>::value_type;
154 while (len > 0U) {
155 *iter = ByteType();
156 ++iter;
157 --len;
158 }
159 }
160
161 static constexpr std::size_t maxSupportedLength()
162 {
163 return 0xffff;
164 }
165
166 template <typename TFields, typename TVersionType>
167 static bool setVersionForMembers(TFields& fields, TVersionType version)
168 {
169 return comms::util::tupleAccumulate(fields, false, makeVersionUpdater(version));
170 }
171
172 template <typename... TFields>
173 using IsAnyFieldVersionDependentBoolType =
175 comms::util::tupleTypeIsAnyOf<std::tuple<TFields...> >(
176 comms::field::details::FieldVersionDependentCheckHelper<>())
177 >::template Type<
178 std::true_type,
179 std::false_type
180 >;
181
182 template <typename... TFields>
183 using FieldSelectMaxLengthIntType =
184 std::integral_constant<
185 std::size_t,
186 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
187 std::size_t(0), comms::field::details::FieldMaxLengthCalcHelper<>())
188 >;
189
190 template <typename... TFields>
191 using FieldSumMaxLengthIntType =
192 std::integral_constant<
193 std::size_t,
194 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
195 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>())
196 >;
197
198 template <std::size_t TFrom, std::size_t TUntil, typename... TFields>
199 using FieldSumMaxLengthFromUntilIntType =
200 std::integral_constant<
201 std::size_t,
202 comms::util::tupleTypeAccumulateFromUntil<TFrom, TUntil, std::tuple<TFields...> >(
203 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>())
204 >;
205
206 template <typename... TFields>
207 using FieldSumMinLengthIntType =
208 std::integral_constant<
209 std::size_t,
210 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
211 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>())
212 >;
213
214 template <std::size_t TFrom, std::size_t TUntil, typename... TFields>
215 using FieldSumMinLengthFromUntilIntType =
216 std::integral_constant<
217 std::size_t,
218 comms::util::tupleTypeAccumulateFromUntil<TFrom, TUntil, std::tuple<TFields...> >(
219 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>())
220 >;
221
222 template <typename... TFields>
223 using FieldSumTotalBitLengthIntType =
224 std::integral_constant<
225 std::size_t,
226 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
227 std::size_t(0), comms::field::details::FieldTotalBitLengthSumCalcHelper<>())
228 >;
229
230 template <std::size_t TFrom, std::size_t TUntil, typename... TFields>
231 using FieldSumTotalBitLengthFromUntilIntType =
232 std::integral_constant<
233 std::size_t,
234 comms::util::tupleTypeAccumulateFromUntil<TFrom, TUntil, std::tuple<TFields...> >(
235 std::size_t(0), comms::field::details::FieldTotalBitLengthSumCalcHelper<>())
236 >;
237
238 template <typename... TFields>
239 using AnyFieldHasNonDefaultRefreshBoolType =
241 comms::util::tupleTypeIsAnyOf<std::tuple<TFields...> >(
242 comms::field::details::FieldNonDefaultRefreshCheckHelper<>())
243 >::template Type<
244 std::true_type,
245 std::false_type
246 >;
247
248 template <typename... TFields>
249 using AllFieldsHaveReadNoStatusBoolType =
251 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
252 true, comms::field::details::FieldReadNoStatusDetectHelper<>())
253 >::template Type<
254 std::true_type,
255 std::false_type
256 >;
257
258 template <typename... TFields>
259 using AllFieldsHaveWriteNoStatusBoolType =
261 comms::util::tupleTypeAccumulate<std::tuple<TFields...> >(
262 true, comms::field::details::FieldWriteNoStatusDetectHelper<>())
263 >::template Type<
264 std::true_type,
265 std::false_type
266 >;
267
268private:
269
270 template <typename TVersionType>
271 static comms::field::details::FieldVersionUpdateHelper<TVersionType> makeVersionUpdater(TVersionType version)
272 {
273 return comms::field::details::FieldVersionUpdateHelper<TVersionType>(version);
274 }
275};
276
277} // namespace basic
278
279} // namespace field
280
281} // namespace comms
This file contain definition of error statuses used by comms module.
Contains various tuple type manipulation classes and functions.
constexpr TValue tupleTypeAccumulate(const TValue &value, TFunc &&func)
Performs "accumulate" algorithm on every type of the tuple.
Definition Tuple.h:686
constexpr TValue tupleTypeAccumulateFromUntil(const TValue &value, TFunc &&func)
Performs "accumulate" algorithm on specified types inside the tuple.
Definition Tuple.h:714
constexpr bool tupleTypeIsAnyOf(TFunc &&func)
Compile time check of whether any type within a tuple has a certain condition.
Definition Tuple.h:989
constexpr TValue tupleAccumulate(TTuple &&tuple, const TValue &value, TFunc &&func)
Performs "accumulate" algorithm on every element of the tuple.
Definition Tuple.h:587
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:19
@ Success
Used to indicate successful outcome of the operation.
@ InvalidMsgData
Used to indicate that a message has invalid data.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:66
Replacement to std::conditional.
Definition type_traits.h:32