24template <
typename TSizeField,
typename TBase>
27 using BaseImpl = TBase;
28 using SizeField = TSizeField;
30 static const std::size_t MaxAllowedSize =
31 static_cast<std::size_t
>(SizeField::maxValue());
33 static_assert(!SizeField::isVersionDependent(),
34 "Prefix fields must not be version dependent");
37 using ValueType =
typename BaseImpl::ValueType;
38 using ElementType =
typename BaseImpl::ElementType;
48 : BaseImpl(
std::move(val))
57 std::size_t length()
const
60 sizeField.setValue(BaseImpl::getValue().size());
61 return sizeField.length() + BaseImpl::length();
64 static constexpr std::size_t minLength()
66 return SizeField::minLength();
69 static constexpr std::size_t maxLength()
71 return SizeField::maxLength() + BaseImpl::maxLength();
76 if ((!BaseImpl::valid()) || (!canWrite())) {
80 sizeField.setValue(BaseImpl::getValue().size());
81 return sizeField.valid() && BaseImpl::valid();
84 template <
typename TIter>
89 auto es = sizeField.read(iter, len);
94 auto diff =
static_cast<std::size_t
>(std::distance(fromIter, iter));
98 auto count =
static_cast<std::size_t
>(sizeField.getValue());
99 return BaseImpl::readN(count, iter, len);
102 template <
typename TIter>
103 void readNoStatus(TIter& iter)
106 sizeField.readNoStatus(iter);
107 auto count =
static_cast<std::size_t
>(sizeField.getValue());
108 BaseImpl::readNoStatusN(count, iter);
111 bool canWrite()
const
113 if (!BaseImpl::canWrite()) {
117 if (MaxAllowedSize < BaseImpl::getValue().size()) {
122 sizeField.setValue(BaseImpl::getValue().size());
123 return sizeField.canWrite();
126 template <
typename TIter>
134 sizeField.setValue(BaseImpl::getValue().size());
135 auto es = sizeField.write(iter, len);
141 return BaseImpl::write(iter, len - sizeField.length());
144 static constexpr bool hasWriteNoStatus()
149 template <
typename TIter>
150 void writeNoStatus(TIter& iter)
const =
delete;
This file contains classes required for generic custom assertion functionality.
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:168
This file contain definition of error statuses used by comms module.
comms::option::def::SequenceSizeFieldPrefix< TField > SequenceSizeFieldPrefix
Same as comms::option::def::SequenceSizeFieldPrefix.
Definition options.h:1560
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.
@ InvalidMsgData
Used to indicate that a message has invalid data.