14#include "comms/field/basic/CommonFuncs.h"
31template <
typename TBase>
32class SequenceElemLengthForcing :
public TBase
34 using BaseImpl = TBase;
36 using ValueType =
typename BaseImpl::ValueType;
37 using ElementType =
typename BaseImpl::ElementType;
39 SequenceElemLengthForcing() =
default;
41 explicit SequenceElemLengthForcing(
const ValueType& val)
46 explicit SequenceElemLengthForcing(ValueType&& val)
47 : BaseImpl(
std::move(val))
51 SequenceElemLengthForcing(
const SequenceElemLengthForcing&) =
default;
52 SequenceElemLengthForcing(SequenceElemLengthForcing&&) =
default;
53 SequenceElemLengthForcing& operator=(
const SequenceElemLengthForcing&) =
default;
54 SequenceElemLengthForcing& operator=(SequenceElemLengthForcing&&) =
default;
56 void forceReadElemLength(std::size_t val)
62 void clearReadElemLengthForcing()
67 std::size_t length()
const
69 if (m_forced != Cleared) {
70 return BaseImpl::getValue().size() * m_forced;
73 return BaseImpl::length();
76 std::size_t elementLength(
const ElementType& elem)
const
78 if (m_forced != Cleared) {
81 return BaseImpl::elementLength(elem);
84 static constexpr std::size_t maxElementLength()
86 return basic::CommonFuncs::maxSupportedLength();
89 template <
typename TIter>
90 ErrorStatus readElement(ElementType& elem, TIter& iter, std::size_t& len)
const
92 using IterType =
typename std::decay<
decltype(iter)>::type;
93 using IterTag =
typename std::iterator_traits<IterType>::iterator_category;
94 static_assert(std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
95 "Only random access iterator for reading is supported with comms::option::def::SequenceElemLengthForcingEnabled option");
97 if (m_forced == Cleared) {
98 return BaseImpl::readElement(elem, iter, len);
101 if (len < m_forced) {
106 auto remLen = m_forced;
107 std::advance(iter, m_forced);
109 return BaseImpl::readElement(elem, iterTmp, remLen);
112 template <
typename TIter>
113 void readElementNoStatus(ElementType& elem, TIter& iter)
const
115 using IterType =
typename std::decay<
decltype(iter)>::type;
116 using IterTag =
typename std::iterator_traits<IterType>::iterator_category;
117 static_assert(std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
118 "Only random access iterator for reading is supported with comms::option::def::SequenceElemLengthForcingEnabled option");
120 if (m_forced == Cleared) {
121 return BaseImpl::readElementNoStatus(elem, iter);
124 auto fromIter = iter;
125 auto es = BaseImpl::readElementNoStatus(elem, iter);
130 auto consumed = std::distance(fromIter, iter);
131 if (consumed < m_forced) {
132 std::advance(iter, m_forced - consumed);
136 template <
typename TIter>
139 return basic::CommonFuncs::readSequence(*
this, iter, len);
142 static constexpr bool hasReadNoStatus()
147 template <
typename TIter>
148 void readNoStatus(TIter& iter) =
delete;
150 template <
typename TIter>
151 ErrorStatus readN(std::size_t count, TIter& iter, std::size_t& len)
153 return basic::CommonFuncs::readSequenceN(*
this, count, iter, len);
156 template <
typename TIter>
157 void readNoStatusN(std::size_t count, TIter& iter) =
delete;
164 static const std::size_t Cleared = std::numeric_limits<std::size_t>::max();
165 std::size_t m_forced = Cleared;
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.
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.