14#include "comms/frame/details/SyncPrefixLayerBase.h"
15#include "comms/frame/details/SyncPrefixLayerOptionsParser.h"
19COMMS_MSVC_WARNING_PUSH
20COMMS_MSVC_WARNING_DISABLE(4189)
44template <
typename TField,
typename TNextLayer,
typename... TOptions>
45class SyncPrefixLayer :
public comms::frame::details::SyncPrefixLayerBase<TField, TNextLayer, TOptions...>
47 using BaseImpl = comms::frame::details::SyncPrefixLayerBase<TField, TNextLayer, TOptions...>;
48 using ParsedOptionsInternal = comms::frame::details::SyncPrefixLayerOptionsParser<TOptions...>;
52 using Field =
typename BaseImpl::Field;
75 static constexpr
bool hasExtendingClass()
77 return ParsedOptionsInternal::HasExtendingClass;
108 template <
typename TMsg,
typename TIter,
typename TNextLayerReader,
typename... TExtraValues>
114 TNextLayerReader&& nextLayerReader,
115 TExtraValues... extraValues)
117 auto& thisObj = BaseImpl::thisLayer();
118 auto* msgPtr = BaseImpl::toMsgPtr(msg);
119 auto beforeReadIter = iter;
121 auto es = thisObj.doReadField(msgPtr, field, iter, size);
123 BaseImpl::updateMissingSize(field, size, extraValues...);
130 bool verified = thisObj.verifyFieldValue(field);
135 auto fieldLen =
static_cast<std::size_t
>(std::distance(beforeReadIter, iter));
136 return nextLayerReader.read(msg, iter, size - fieldLen, extraValues...);
156 template <
typename TMsg,
typename TIter,
typename TNextLayerWriter>
162 TNextLayerWriter&& nextLayerWriter)
const
164 auto& thisObj = BaseImpl::thisLayer();
165 thisObj.prepareFieldForWrite(field);
166 auto es = thisObj.doWriteField(&msg, field, iter, size);
167 if (es != ErrorStatus::Success) {
172 return nextLayerWriter.write(msg, iter, size - field.length());
184 return field ==
Field();
196 static_cast<void>(field);
203struct SyncPrefixLayerCheckHelper
205 static const bool Value =
false;
208template <
typename TField,
typename TNextLayer>
209struct SyncPrefixLayerCheckHelper<SyncPrefixLayer<TField, TNextLayer> >
211 static const bool Value =
true;
222 return details::SyncPrefixLayerCheckHelper<T>::Value;
229COMMS_MSVC_WARNING_POP
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Contains various compiler related definitions.
Protocol layer that uses "sync" field as a prefix to all the subsequent data written by other (next) ...
Definition SyncPrefixLayer.h:46
static bool verifyFieldValue(const Field &field)
Verify the validity of the field.
Definition SyncPrefixLayer.h:182
comms::ErrorStatus doRead(Field &field, TMsg &msg, TIter &iter, std::size_t size, TNextLayerReader &&nextLayerReader, TExtraValues... extraValues)
Customized read functionality, invoked by read().
Definition SyncPrefixLayer.h:109
SyncPrefixLayer(SyncPrefixLayer &&)=default
Move constructor.
typename ParsedOptionsInternal::ExtendingClass ExtendingClass
Type of real extending class.
Definition SyncPrefixLayer.h:57
static void prepareFieldForWrite(Field &field)
Prepare field for writing.
Definition SyncPrefixLayer.h:194
SyncPrefixLayer(const SyncPrefixLayer &)=default
Copy constructor.
comms::ErrorStatus doWrite(Field &field, const TMsg &msg, TIter &iter, std::size_t size, TNextLayerWriter &&nextLayerWriter) const
Customized write functionality, invoked by write().
Definition SyncPrefixLayer.h:157
~SyncPrefixLayer() noexcept=default
Destructor.
constexpr bool isSyncPrefixLayer()
Compile time check of whether the provided type is a variant of SyncPrefixLayer.
Definition SyncPrefixLayer.h:220
SyncPrefixLayer()=default
Default constructor.
typename BaseImpl::Field Field
Type of the field object used to read/write "sync" value.
Definition SyncPrefixLayer.h:52
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.