12#include "comms/field/basic/CommonFuncs.h"
13#include "comms/field/details/FieldOpHelpers.h"
14#include "comms/field/details/MembersVersionDependency.h"
34template <comms::field::details::MembersVersionDependency TVersionDependency,
typename... TMembers>
35struct BundleVersionDependencyDetectHelper;
37template <
typename... TMembers>
38struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_NotSpecified, TMembers...>
40 static constexpr bool Value = CommonFuncs::IsAnyFieldVersionDependentBoolType<TMembers...>::value;
43template <
typename... TMembers>
44struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_Independent, TMembers...>
46 static constexpr bool Value =
false;
49template <
typename... TMembers>
50struct BundleVersionDependencyDetectHelper<
comms::field::details::MembersVersionDependency_Dependent, TMembers...>
52 static constexpr bool Value =
true;
58template <
typename TFieldBase, comms::field::details::MembersVersionDependency TVersionDependency,
typename TMembers>
61template <
typename TFieldBase, comms::field::details::MembersVersionDependency TVersionDependency,
typename... TMembers>
62class Bundle<TFieldBase, TVersionDependency,
std::tuple<TMembers...> > :
public TFieldBase
65 using ValueType = std::tuple<TMembers...>;
66 using Members = ValueType;
67 using VersionType =
typename TFieldBase::VersionType;
68 using CommsTag = comms::field::tag::Bundle;
71 explicit Bundle(
const ValueType& val)
76 explicit Bundle(ValueType&& val)
77 : m_members(
std::move(val))
81 Bundle(
const Bundle&) =
default;
82 Bundle(Bundle&&) =
default;
83 ~Bundle() noexcept = default;
85 Bundle& operator=(const Bundle&) = default;
86 Bundle& operator=(Bundle&&) = default;
88 const ValueType& value()
const
98 const ValueType& getValue()
const
103 template <
typename T>
104 void setValue(T&& val)
106 value() = std::forward<T>(val);
109 constexpr std::size_t length()
const
112 value(), std::size_t(0), comms::field::details::FieldLengthSumCalcHelper<>());
115 template <std::
size_t TFromIdx>
116 constexpr std::size_t lengthFrom()
const
119 comms::util::tupleAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value>(
122 comms::field::details::FieldLengthSumCalcHelper<>());
125 template <std::
size_t TUntilIdx>
126 constexpr std::size_t lengthUntil()
const
129 comms::util::tupleAccumulateFromUntil<0, TUntilIdx>(
132 comms::field::details::FieldLengthSumCalcHelper<>());
135 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
136 constexpr std::size_t lengthFromUntil()
const
139 comms::util::tupleAccumulateFromUntil<TFromIdx, TUntilIdx>(
142 comms::field::details::FieldLengthSumCalcHelper<>());
145 static constexpr std::size_t minLength()
148 comms::util::tupleTypeAccumulate<Members>(
149 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
152 template <std::
size_t TFromIdx>
153 static constexpr std::size_t minLengthFrom()
156 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value, Members>(
157 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
160 template <std::
size_t TUntilIdx>
161 static constexpr std::size_t minLengthUntil()
164 comms::util::tupleTypeAccumulateFromUntil<0, TUntilIdx, Members>(
165 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
168 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
169 static constexpr std::size_t minLengthFromUntil()
172 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, TUntilIdx, Members>(
173 std::size_t(0), comms::field::details::FieldMinLengthSumCalcHelper<>());
176 static constexpr std::size_t maxLength()
179 comms::util::tupleTypeAccumulate<Members>(
180 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
183 template <std::
size_t TFromIdx>
184 static constexpr std::size_t maxLengthFrom()
187 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, std::tuple_size<ValueType>::value, Members>(
188 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
191 template <std::
size_t TUntilIdx>
192 static constexpr std::size_t maxLengthUntil()
195 comms::util::tupleTypeAccumulateFromUntil<0, TUntilIdx, Members>(
196 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
199 template <std::
size_t TFromIdx, std::
size_t TUntilIdx>
200 static constexpr std::size_t maxLengthFromUntil()
203 comms::util::tupleTypeAccumulateFromUntil<TFromIdx, TUntilIdx, Members>(
204 std::size_t(0), comms::field::details::FieldMaxLengthSumCalcHelper<>());
207 constexpr bool valid()
const
217 template <
typename TIter>
225 template <std::
size_t TFromIdx,
typename TIter>
228 return readFromAndUpdateLen<TFromIdx>(iter, len);
231 template <std::
size_t TFromIdx,
typename TIter>
232 ErrorStatus readFromAndUpdateLen(TIter& iter, std::size_t& len)
235 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeReadHelper(es, iter, len));
239 template <std::
size_t TUntilIdx,
typename TIter>
240 ErrorStatus readUntil(TIter& iter, std::size_t len)
242 return readUntilAndUpdateLen<TUntilIdx>(iter, len);
245 template <std::
size_t TUntilIdx,
typename TIter>
246 ErrorStatus readUntilAndUpdateLen(TIter& iter, std::size_t& len)
249 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeReadHelper(es, iter, len));
253 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
254 ErrorStatus readFromUntil(TIter& iter, std::size_t len)
256 return readFromUntilAndUpdateLen<TFromIdx, TUntilIdx>(iter, len);
259 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
260 ErrorStatus readFromUntilAndUpdateLen(TIter& iter, std::size_t& len)
263 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeReadHelper(es, iter, len));
267 static constexpr bool hasReadNoStatus()
269 return CommonFuncs::AllFieldsHaveReadNoStatusBoolType<TMembers...>::value;
272 template <
typename TIter>
273 void readNoStatus(TIter& iter)
278 template <std::
size_t TFromIdx,
typename TIter>
279 void readFromNoStatus(TIter& iter)
281 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeReadNoStatusHelper(iter));
284 template <std::
size_t TUntilIdx,
typename TIter>
285 void readUntilNoStatus(TIter& iter)
287 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeReadNoStatusHelper(iter));
290 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
291 void readFromUntilNoStatus(TIter& iter)
293 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeReadNoStatusHelper(iter));
296 bool canWrite()
const
300 value(),
true, comms::field::details::FieldCanWriteCheckHelper<>());
303 template <
typename TIter>
304 ErrorStatus write(TIter& iter, std::size_t len)
const
311 template <std::
size_t TFromIdx,
typename TIter>
312 ErrorStatus writeFrom(TIter& iter, std::size_t len)
const
315 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeWriteHelper(es, iter, len));
319 template <std::
size_t TUntilIdx,
typename TIter>
320 ErrorStatus writeUntil(TIter& iter, std::size_t len)
const
323 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeWriteHelper(es, iter, len));
327 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
328 ErrorStatus writeFromUntil(TIter& iter, std::size_t len)
const
331 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeWriteHelper(es, iter, len));
335 static constexpr bool hasWriteNoStatus()
337 return CommonFuncs::AllFieldsHaveWriteNoStatusBoolType<TMembers...>::value;
340 template <
typename TIter>
341 void writeNoStatus(TIter& iter)
const
346 template <std::
size_t TFromIdx,
typename TIter>
347 void writeFromNoStatus(TIter& iter)
const
349 comms::util::template tupleForEachFrom<TFromIdx>(value(), makeWriteNoStatusHelper(iter));
352 template <std::
size_t TUntilIdx,
typename TIter>
353 void writeUntilNoStatus(TIter& iter)
const
355 comms::util::template tupleForEachUntil<TUntilIdx>(value(), makeWriteNoStatusHelper(iter));
358 template <std::
size_t TFromIdx, std::
size_t TUntilIdx,
typename TIter>
359 void writeFromUntilNoStatus(TIter& iter)
const
361 comms::util::template tupleForEachFromUntil<TFromIdx, TUntilIdx>(value(), makeWriteNoStatusHelper(iter));
364 static constexpr bool isVersionDependent()
366 return details::BundleVersionDependencyDetectHelper<TVersionDependency, TMembers...>::Value;
369 static constexpr bool hasNonDefaultRefresh()
371 return CommonFuncs::AnyFieldHasNonDefaultRefreshBoolType<TMembers...>::value;
374 bool setVersion(VersionType
version)
376 return CommonFuncs::setVersionForMembers(value(),
version);
380 template <
typename TIter>
381 static comms::field::details::FieldReadHelper<TIter> makeReadHelper(
comms::ErrorStatus& es, TIter& iter, std::size_t& len)
383 return comms::field::details::FieldReadHelper<TIter>(es, iter, len);
386 template <
typename TIter>
387 static comms::field::details::FieldReadNoStatusHelper<TIter> makeReadNoStatusHelper(TIter& iter)
389 return comms::field::details::FieldReadNoStatusHelper<TIter>(iter);
392 template <
typename TIter>
393 static comms::field::details::FieldWriteHelper<TIter> makeWriteHelper(
ErrorStatus& es, TIter& iter, std::size_t len)
395 return comms::field::details::FieldWriteHelper<TIter>(es, iter, len);
398 template <
typename TIter>
399 static comms::field::details::FieldWriteNoStatusHelper<TIter> makeWriteNoStatusHelper(TIter& iter)
401 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:1917
void tupleForEach(TTuple &&tuple, TFunc &&func)
Invoke provided functor for every element in the tuple.
Definition Tuple.h:239
constexpr TValue tupleAccumulate(TTuple &&tuple, const TValue &value, TFunc &&func)
Performs "accumulate" algorithm on every element of the tuple.
Definition Tuple.h:586
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:17
@ Success
Used to indicate successful outcome of the operation.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:64
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:36