11#include "comms/details/tag.h"
26template <
typename TTermField,
typename TBase>
29 using BaseImpl = TBase;
30 using TermField = TTermField;
32 static_assert(!TermField::isVersionDependent(),
33 "Suffix fields must not be version dependent");
36 using ValueType =
typename BaseImpl::ValueType;
37 using ElementType =
typename BaseImpl::ElementType;
47 : BaseImpl(
std::move(val))
56 constexpr std::size_t length()
const
58 return m_termField.length() + BaseImpl::length();
61 static constexpr std::size_t minLength()
63 return TermField::minLength() + BaseImpl::minLength();
66 static constexpr std::size_t maxLength()
68 return TermField::maxLength() + BaseImpl::maxLength();
71 template <
typename TIter>
74 using IterType =
typename std::decay<
decltype(iter)>::type;
75 using IterTag =
typename std::iterator_traits<IterType>::iterator_category;
76 static_assert(std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
77 "Only random access iterator for reading is supported with comms::option::def::SequenceTerminationFieldSuffix option");
80 typename comms::util::LazyShallowConditional<
81 std::is_integral<ElementType>::value && (
sizeof(ElementType) ==
sizeof(std::uint8_t))
87 return readInternal(iter, len, ReadElemTag());
90 static constexpr bool hasReadNoStatus()
95 template <
typename TIter>
96 void readNoStatus(TIter& iter) =
delete;
98 template <
typename TIter>
101 auto trailLen = m_termField.length();
102 auto es = BaseImpl::write(iter, len - trailLen);
107 return m_termField.write(iter, trailLen);
110 template <
typename TIter>
111 void writeNoStatus(TIter& iter)
const
113 BaseImpl::writeNoStatus(iter);
114 m_termField.writeNoStatus(iter);
117 TermField& terminationFieldSuffix()
122 const TermField& terminationFieldSuffix()
const
128 template <
typename... TParams>
129 using RawDataTag = comms::details::tag::Tag1<>;
131 template <
typename... TParams>
132 using FieldTag = comms::details::tag::Tag2<>;
134 template <
typename TIter,
typename... TParams>
140 auto es = m_termField.read(iterCpy, len);
142 std::advance(iter, std::distance(iter, iterCpy));
146 auto& elem = BaseImpl::createBack();
147 es = BaseImpl::readElement(elem, iter, len);
149 BaseImpl::value().pop_back();
157 template <
typename TIter,
typename... TParams>
160 std::size_t consumed = 0U;
161 std::size_t termFieldLen = 0U;
162 while (consumed < len) {
163 auto iterCpy = iter + consumed;
164 auto es = m_termField.read(iterCpy, len - consumed);
166 termFieldLen =
static_cast<std::size_t
>(std::distance(iter + consumed, iterCpy));
173 if (len <= consumed) {
178 auto es = BaseImpl::read(iterCpy, consumed);
183 auto fullConsumeLen = consumed + termFieldLen;
185 std::advance(iter, fullConsumeLen);
189 TermField m_termField;
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::SequenceTerminationFieldSuffix< TField > SequenceTerminationFieldSuffix
Same as comms::option::def::SequenceTerminationFieldSuffix.
Definition options.h:1583
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.
Replacement to some types from standard type_traits.