28template <
typename TSizeField,
typename TBase>
31 using BaseImpl = TBase;
32 using SizeField = TSizeField;
34 static const std::size_t MaxAllowedSize =
35 static_cast<std::size_t
>(SizeField::maxValue());
37 static_assert(!SizeField::isVersionDependent(),
38 "Prefix fields must not be version dependent");
41 using ValueType =
typename BaseImpl::ValueType;
42 using ElementType =
typename BaseImpl::ElementType;
52 : BaseImpl(
std::move(val))
61 std::size_t length()
const
64 sizeField.setValue(BaseImpl::getValue().size());
65 return sizeField.length() + BaseImpl::length();
68 static constexpr std::size_t minLength()
70 return SizeField::minLength();
73 static constexpr std::size_t maxLength()
75 return SizeField::maxLength() + BaseImpl::maxLength();
80 if ((!BaseImpl::valid()) || (!canWrite())) {
84 sizeField.setValue(BaseImpl::getValue().size());
85 return sizeField.valid() && BaseImpl::valid();
88 template <
typename TIter>
93 auto es = sizeField.read(iter, len);
98 auto diff =
static_cast<std::size_t
>(std::distance(fromIter, iter));
102 auto count =
static_cast<std::size_t
>(sizeField.getValue());
103 return BaseImpl::readN(count, iter, len);
106 template <
typename TIter>
107 void readNoStatus(TIter& iter)
110 sizeField.readNoStatus(iter);
111 auto count =
static_cast<std::size_t
>(sizeField.getValue());
112 BaseImpl::readNoStatusN(count, iter);
115 bool canWrite()
const
117 if (!BaseImpl::canWrite()) {
121 if (MaxAllowedSize < BaseImpl::getValue().size()) {
126 sizeField.setValue(BaseImpl::getValue().size());
127 return sizeField.canWrite();
130 template <
typename TIter>
138 sizeField.setValue(BaseImpl::getValue().size());
139 auto es = sizeField.write(iter, len);
145 return BaseImpl::write(iter, len - sizeField.length());
148 static constexpr bool hasWriteNoStatus()
153 template <
typename TIter>
154 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:170
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:1562
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.