14#include "comms/protocol/details/ProtocolLayerBase.h"
15#include "comms/protocol/details/SyncPrefixLayerOptionsParser.h"
16#include "comms/protocol/details/ProtocolLayerExtendingClassHelper.h"
20COMMS_MSVC_WARNING_PUSH
21COMMS_MSVC_WARNING_DISABLE(4189)
44template <
typename TField,
typename TNextLayer,
typename... TOptions>
49 details::ProtocolLayerExtendingClassT<
50 SyncPrefixLayer<TField, TNextLayer, TOptions...>,
51 details::SyncPrefixLayerOptionsParser<TOptions...>
59 details::ProtocolLayerExtendingClassT<
61 details::SyncPrefixLayerOptionsParser<TOptions...>
65 using ParsedOptionsInternal = details::SyncPrefixLayerOptionsParser<TOptions...>;
69 using Field =
typename BaseImpl::Field;
92 static constexpr
bool hasExtendingClass()
94 return ParsedOptionsInternal::HasExtendingClass;
125 template <
typename TMsg,
typename TIter,
typename TNextLayerReader,
typename... TExtraValues>
131 TNextLayerReader&& nextLayerReader,
132 TExtraValues... extraValues)
134 auto& thisObj = BaseImpl::thisLayer();
135 auto* msgPtr = BaseImpl::toMsgPtr(msg);
136 auto beforeReadIter = iter;
138 auto es = thisObj.doReadField(msgPtr, field, iter, size);
140 BaseImpl::updateMissingSize(field, size, extraValues...);
147 bool verified = thisObj.verifyFieldValue(field);
152 auto fieldLen =
static_cast<std::size_t
>(std::distance(beforeReadIter, iter));
153 return nextLayerReader.read(msg, iter, size - fieldLen, extraValues...);
173 template <
typename TMsg,
typename TIter,
typename TNextLayerWriter>
179 TNextLayerWriter&& nextLayerWriter)
const
181 auto& thisObj = BaseImpl::thisLayer();
182 thisObj.prepareFieldForWrite(field);
183 auto es = thisObj.doWriteField(&msg, field, iter, size);
184 if (es != ErrorStatus::Success) {
189 return nextLayerWriter.write(msg, iter, size - field.length());
201 return field ==
Field();
213 static_cast<void>(field);
220struct SyncPrefixLayerCheckHelper
222 static const bool Value =
false;
225template <
typename TField,
typename TNextLayer>
226struct SyncPrefixLayerCheckHelper<SyncPrefixLayer<TField, TNextLayer> >
228 static const bool Value =
true;
239 return details::SyncPrefixLayerCheckHelper<T>::Value;
246COMMS_MSVC_WARNING_POP
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Contains various compiler related definitions.
Base class for all the middle (non MsgDataLayer) protocol transport layers.
Definition ProtocolLayerBase.h:61
Protocol layer that uses "sync" field as a prefix to all the subsequent data written by other (next) ...
Definition SyncPrefixLayer.h:54
SyncPrefixLayer(const SyncPrefixLayer &)=default
Copy constructor.
typename ParsedOptionsInternal::ExtendingClass ExtendingClass
Type of real extending class.
Definition SyncPrefixLayer.h:74
typename BaseImpl::Field Field
Type of the field object used to read/write "sync" value.
Definition SyncPrefixLayer.h:69
constexpr bool isSyncPrefixLayer()
Compile time check of whether the provided type is a variant of SyncPrefixLayer.
Definition SyncPrefixLayer.h:237
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:174
static bool verifyFieldValue(const Field &field)
Verify the validity of the field.
Definition SyncPrefixLayer.h:199
SyncPrefixLayer()=default
Default constructor.
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:126
SyncPrefixLayer(SyncPrefixLayer &&)=default
Move constructor.
~SyncPrefixLayer() noexcept=default
Destructor.
static void prepareFieldForWrite(Field &field)
Prepare field for writing.
Definition SyncPrefixLayer.h:211
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.