13#include "comms/details/tag.h"
32template <
typename TTermField,
typename TBase>
35 using BaseImpl = TBase;
36 using TermField = TTermField;
38 static_assert(!TermField::isVersionDependent(),
39 "Suffix fields must not be version dependent");
42 using ValueType =
typename BaseImpl::ValueType;
43 using ElementType =
typename BaseImpl::ElementType;
53 : BaseImpl(
std::move(val))
62 constexpr std::size_t length()
const
64 return m_termField.length() + BaseImpl::length();
67 static constexpr std::size_t minLength()
69 return TermField::minLength() + BaseImpl::minLength();
72 static constexpr std::size_t maxLength()
74 return TermField::maxLength() + BaseImpl::maxLength();
77 template <
typename TIter>
80 using IterType =
typename std::decay<
decltype(iter)>::type;
81 using IterTag =
typename std::iterator_traits<IterType>::iterator_category;
82 static_assert(std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
83 "Only random access iterator for reading is supported with comms::option::def::SequenceTerminationFieldSuffix option");
86 typename comms::util::LazyShallowConditional<
87 std::is_integral<ElementType>::value && (
sizeof(ElementType) ==
sizeof(std::uint8_t))
93 return readInternal(iter, len, ReadElemTag());
96 static constexpr bool hasReadNoStatus()
101 template <
typename TIter>
102 void readNoStatus(TIter& iter) =
delete;
104 template <
typename TIter>
107 auto trailLen = m_termField.length();
108 auto es = BaseImpl::write(iter, len - trailLen);
113 return m_termField.write(iter, trailLen);
116 template <
typename TIter>
117 void writeNoStatus(TIter& iter)
const
119 BaseImpl::writeNoStatus(iter);
120 m_termField.writeNoStatus(iter);
123 TermField& terminationFieldSuffix()
128 const TermField& terminationFieldSuffix()
const
134 template <
typename... TParams>
135 using RawDataTag = comms::details::tag::Tag1<>;
137 template <
typename... TParams>
138 using FieldTag = comms::details::tag::Tag2<>;
140 template <
typename TIter,
typename... TParams>
146 auto es = m_termField.read(iterCpy, len);
148 std::advance(iter, std::distance(iter, iterCpy));
152 auto& elem = BaseImpl::createBack();
153 es = BaseImpl::readElement(elem, iter, len);
155 BaseImpl::value().pop_back();
163 template <
typename TIter,
typename... TParams>
166 std::size_t consumed = 0U;
167 std::size_t termFieldLen = 0U;
168 while (consumed < len) {
169 auto iterCpy = iter + consumed;
170 auto es = m_termField.read(iterCpy, len - consumed);
172 termFieldLen =
static_cast<std::size_t
>(std::distance(iter + consumed, iterCpy));
179 if (len <= consumed) {
184 auto es = BaseImpl::read(iterCpy, consumed);
189 auto fullConsumeLen = consumed + termFieldLen;
191 std::advance(iter, fullConsumeLen);
195 TermField m_termField;
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::SequenceTerminationFieldSuffix< TField > SequenceTerminationFieldSuffix
Same as comms::option::def::SequenceTerminationFieldSuffix.
Definition options.h:1585
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.
Replacement to some types from standard type_traits.