14#include "comms/field/basic/CommonFuncs.h"
15#include "comms/field/details/FieldOpHelpers.h"
16#include "comms/field/details/MembersVersionDependency.h"
36template <comms::field::details::MembersVersionDependency TVersionDependency,
typename... TMembers>
37struct BundleVersionDependencyDetectHelper;
39template <
typename... TMembers>
40struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_NotSpecified, TMembers...>
42 static constexpr bool Value = CommonFuncs::IsAnyFieldVersionDependentBoolType<TMembers...>::value;
45template <
typename... TMembers>
46struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_Independent, TMembers...>
48 static constexpr bool Value =
false;
51template <
typename... TMembers>
52struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_Dependent, TMembers...>
54 static constexpr bool Value =
true;
59template <
typename TFieldBase, comms::field::details::MembersVersionDependency TVersionDependency,
typename TMembers>
62template <
typename TFieldBase, comms::field::details::MembersVersionDependency TVersionDependency,
typename... TMembers>
63class Bundle<TFieldBase, TVersionDependency,
std::tuple<TMembers...> > :
public TFieldBase
66 using ValueType = std::tuple<TMembers...>;
67 using Members = ValueType;
68 using VersionType =
typename TFieldBase::VersionType;
69 using CommsTag = comms::field::tag::Bundle;
72 explicit Bundle(
const ValueType& val)
77 explicit Bundle(ValueType&& val)
78 : m_members(
std::move(val))
82 Bundle(
const Bundle&) =
default;
83 Bundle(Bundle&&) =
default;
84 ~Bundle() noexcept = default;
86 Bundle& operator=(const Bundle&) = default;
87 Bundle& operator=(Bundle&&) = default;
89 const ValueType& value()
const
99 const ValueType& getValue()
const
104 template <
typename T>
105 void setValue(T&& val)
107 value() = std::forward<T>(val);
110 constexpr std::size_t length()
const
113 value(), std::size_t(0), comms::field::details::FieldLengthSumCalcHelper<>());
116 template <std::
size_t TFromIdx>
117 constexpr std::size_t lengthFrom()
const
120 comms::util::tupleAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value>(
123 comms::field::details::FieldLengthSumCalcHelper<>());
126 template <std::
size_t TUntilIdx>
127 constexpr std::size_t lengthUntil()
const
130 comms::util::tupleAccumulateFromUntil<0, TUntilIdx>(
133 comms::field::details::FieldLengthSumCalcHelper<>());
136 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
137 constexpr std::size_t lengthFromUntil()
const
140 comms::util::tupleAccumulateFromUntil<TFromIdx, TUntilIdx>(
143 comms::field::details::FieldLengthSumCalcHelper<>());
146 static constexpr std::size_t minLength()
149 comms::util::tupleTypeAccumulate<Members>(
150 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
153 template <std::
size_t TFromIdx>
154 static constexpr std::size_t minLengthFrom()
157 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value, Members>(
158 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
161 template <std::
size_t TUntilIdx>
162 static constexpr std::size_t minLengthUntil()
165 comms::util::tupleTypeAccumulateFromUntil<0, TUntilIdx, Members>(
166 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
169 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
170 static constexpr std::size_t minLengthFromUntil()
173 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, TUntilIdx, Members>(
174 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
177 static constexpr std::size_t maxLength()
180 comms::util::tupleTypeAccumulate<Members>(
181 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
184 template <std::
size_t TFromIdx>
185 static constexpr std::size_t maxLengthFrom()
188 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value, Members>(
189 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
192 template <std::
size_t TUntilIdx>
193 static constexpr std::size_t maxLengthUntil()
196 comms::util::tupleTypeAccumulateFromUntil<0, TUntilIdx, Members>(
197 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
200 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
201 static constexpr std::size_t maxLengthFromUntil()
204 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, TUntilIdx, Members>(
205 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
208 constexpr bool valid()
const
218 template <
typename TIter>
226 template <std::
size_t TFromIdx,
typename TIter>
229 return readFromAndUpdateLen<TFromIdx>(iter, len);
232 template <std::
size_t TFromIdx,
typename TIter>
233 ErrorStatus readFromAndUpdateLen(TIter& iter, std::size_t& len)
236 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeReadHelper(es, iter, len));
240 template <std::
size_t TUntilIdx,
typename TIter>
241 ErrorStatus readUntil(TIter& iter, std::size_t len)
243 return readUntilAndUpdateLen<TUntilIdx>(iter, len);
246 template <std::
size_t TUntilIdx,
typename TIter>
247 ErrorStatus readUntilAndUpdateLen(TIter& iter, std::size_t& len)
250 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeReadHelper(es, iter, len));
254 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
255 ErrorStatus readFromUntil(TIter& iter, std::size_t len)
257 return readFromUntilAndUpdateLen<TFromIdx, TUntilIdx>(iter, len);
260 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
261 ErrorStatus readFromUntilAndUpdateLen(TIter& iter, std::size_t& len)
264 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeReadHelper(es, iter, len));
268 static constexpr bool hasReadNoStatus()
270 return CommonFuncs::AllFieldsHaveReadNoStatusBoolType<TMembers...>::value;
273 template <
typename TIter>
274 void readNoStatus(TIter& iter)
279 template <std::
size_t TFromIdx,
typename TIter>
280 void readFromNoStatus(TIter& iter)
282 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeReadNoStatusHelper(iter));
285 template <std::
size_t TUntilIdx,
typename TIter>
286 void readUntilNoStatus(TIter& iter)
288 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeReadNoStatusHelper(iter));
291 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
292 void readFromUntilNoStatus(TIter& iter)
294 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeReadNoStatusHelper(iter));
297 bool canWrite()
const
301 value(),
true, comms::field::details::FieldCanWriteCheckHelper<>());
304 template <
typename TIter>
305 ErrorStatus write(TIter& iter, std::size_t len)
const
312 template <std::
size_t TFromIdx,
typename TIter>
313 ErrorStatus writeFrom(TIter& iter, std::size_t len)
const
316 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeWriteHelper(es, iter, len));
320 template <std::
size_t TUntilIdx,
typename TIter>
321 ErrorStatus writeUntil(TIter& iter, std::size_t len)
const
324 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeWriteHelper(es, iter, len));
328 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
329 ErrorStatus writeFromUntil(TIter& iter, std::size_t len)
const
332 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeWriteHelper(es, iter, len));
336 static constexpr bool hasWriteNoStatus()
338 return CommonFuncs::AllFieldsHaveWriteNoStatusBoolType<TMembers...>::value;
341 template <
typename TIter>
342 void writeNoStatus(TIter& iter)
const
347 template <std::
size_t TFromIdx,
typename TIter>
348 void writeFromNoStatus(TIter& iter)
const
350 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeWriteNoStatusHelper(iter));
353 template <std::
size_t TUntilIdx,
typename TIter>
354 void writeUntilNoStatus(TIter& iter)
const
356 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeWriteNoStatusHelper(iter));
359 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
360 void writeFromUntilNoStatus(TIter& iter)
const
362 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeWriteNoStatusHelper(iter));
365 static constexpr bool isVersionDependent()
367 return details::BundleVersionDependencyDetectHelper<TVersionDependency, TMembers...>::Value;
370 static constexpr bool hasNonDefaultRefresh()
372 return CommonFuncs::AnyFieldHasNonDefaultRefreshBoolType<TMembers...>::value;
375 bool setVersion(VersionType
version)
377 return CommonFuncs::setVersionForMembers(value(),
version);
381 template <
typename TIter>
382 static comms::field::details::FieldReadHelper<TIter> makeReadHelper(
comms::ErrorStatus& es, TIter& iter, std::size_t& len)
384 return comms::field::details::FieldReadHelper<TIter>(es, iter, len);
387 template <
typename TIter>
388 static comms::field::details::FieldReadNoStatusHelper<TIter> makeReadNoStatusHelper(TIter& iter)
390 return comms::field::details::FieldReadNoStatusHelper<TIter>(iter);
393 template <
typename TIter>
394 static comms::field::details::FieldWriteHelper<TIter> makeWriteHelper(
ErrorStatus& es, TIter& iter, std::size_t len)
396 return comms::field::details::FieldWriteHelper<TIter>(es, iter, len);
399 template <
typename TIter>
400 static comms::field::details::FieldWriteNoStatusHelper<TIter> makeWriteNoStatusHelper(TIter& iter)
402 return comms::field::details::FieldWriteNoStatusHelper<TIter>(iter);
This file contains classes required for generic custom assertion functionality.
This file contain definition of error statuses used by comms module.
Contains various tuple type manipulation classes and functions.
Contains definition of various tag classes.
comms::option::def::VersionType< T > VersionType
Same as comms::option::def::VersionType.
Definition options.h:1930
void tupleForEach(TTuple &&tuple, TFunc &&func)
Invoke provided functor for every element in the tuple.
Definition Tuple.h:242
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.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:66
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:39