COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Related Symbols | List of all members
comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions > Class Template Reference

#include "comms/protocol/ChecksumPrefixLayer.h"

Detailed Description

template<typename TField, typename TCalc, typename TNextLayer, typename... TOptions>
class comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >

Protocol layer that is responsible to calculate checksum on the data written by all the wrapped internal layers and prepend it before the written data. When reading, this layer is responsible to verify the checksum reported at the beginning of the read data.

This protocol layer handles checksum value that usually precedes the data. Some protocols use checksum value that follows the data. In this case use ChecksumLayer instead.

Template Parameters
TFieldType of the field that is used as to represent checksum value.
TCalcThe checksum calculater class that is used to calculate the checksum value on the provided buffer. It must have the operator() defined with the following signature:
template <typename TIter>
ResultType operator()(TIter& iter, std::size_t len) const;
It is up to the checksum calculator to choose the "ResultType" it returns. The setValue() member function is going to be used to assign the field's value.
Available checksum algorithms provided by the COMMS library reside in comms::protocol::checksum namespace (comms/protocol/checkum folder).
TNextLayerNext transport layer in protocol stack.
TOptionsExtending functionality options. Supported options are:
Inheritance diagram for comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >:
comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >

Public Types

using AllFields = typename std::decay< decltype(std::tuple_cat(std::declval< std::tuple< Field > >(), std::declval< typename TNextLayer::AllFields >())) >::type
 Type of all the fields of all the transport layers wrapped in std::tuple.
 
using AllMessages = typename NextLayer::AllMessages
 All supported messages.
 
using ChecksumCalc = TCalc
 Provided checksum calculation algorithm.
 
using ExtendingClass = typename ParsedOptionsInternal::ExtendingClass
 Type of real extending class.
 
using Field = typename BaseImpl::Field
 Type of the field object used to read/write checksum value.
 
using MsgFactory = typename NextLayer::MsgFactory
 Type of message factory.
 
using MsgPtr = typename details::ProtocolLayerMsgPtr< NextLayer >::Type
 Type of pointer to the message.
 
using NextLayer = TNextLayer
 Type of the next transport layer.
 
using ParsedOptions = details::ProtocolLayerBaseOptionsParser< TOptions... >
 Parsed options structure.
 
using ThisLayer = TDerived
 Actual derived class.
 

Public Member Functions

 ChecksumPrefixLayer ()=default
 Default constructor.
 
 ChecksumPrefixLayer (ChecksumPrefixLayer &&)=default
 Move constructor.
 
 ChecksumPrefixLayer (const ChecksumPrefixLayer &)=default
 Copy constructor.
 
 ~ChecksumPrefixLayer () noexcept=default
 Destructor.
 
template<typename TId >
MsgPtr createMsg (TId &&id, unsigned idx=0)
 Create message object given the ID.
 
template<typename TMsg , typename TIter , typename TNextLayerReader , typename... TExtraValues>
comms::ErrorStatus doRead (Field &field, TMsg &msg, TIter &iter, std::size_t size, TNextLayerReader &&nextLayerReader, TExtraValues... extraValues)
 Customized read functionality, invoked by read().
 
template<typename TMsg , typename TIter , typename TNextLayerUpdater >
comms::ErrorStatus doUpdate (const TMsg &msg, Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
 Customized update functionality, invoked by update().
 
template<typename TIter , typename TNextLayerUpdater >
comms::ErrorStatus doUpdate (Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
 Customized update functionality, invoked by update().
 
template<typename TMsg , typename TIter , typename TNextLayerWriter >
comms::ErrorStatus doWrite (Field &field, const TMsg &msg, TIter &iter, std::size_t size, TNextLayerWriter &&nextLayerWriter) const
 Customized write functionality, invoked by write().
 
constexpr std::size_t length () const
 Get remaining length of wrapping transport information.
 
template<typename TMsg >
constexpr std::size_t length (const TMsg &msg) const
 Get remaining length of wrapping transport information + length of the provided message.
 
NextLayernextLayer ()
 Get access to the next layer object.
 
const NextLayernextLayer () const
 Get "const" access to the next layer object.
 
ChecksumPrefixLayeroperator= (ChecksumPrefixLayer &&)=default
 Move assignment.
 
ChecksumPrefixLayeroperator= (const ChecksumPrefixLayer &)=default
 Copy assignment.
 
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus read (TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Deserialise message from the input data sequence.
 
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus readFieldsCached (TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Deserialise message from the input data sequence while caching the read transport information fields.
 
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus readFromData (TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Finalise the read operation by reading the message payload.
 
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus readFromDataFieldsCached (TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Finalise the read operation by reading the message payload while caching the read transport information fields.
 
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus readUntilData (TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Perform read of data fields until data layer (message payload).
 
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus readUntilDataFieldsCached (TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
 Perform read of data fields until data layer (message payload) while caching the read transport information fields.
 
ThisLayerthisLayer ()
 Get access to this layer object.
 
const ThisLayerthisLayer () const
 Get "const" access to this layer object.
 
template<typename TMsg , typename TIter >
comms::ErrorStatus update (const TMsg &msg, TIter &iter, std::size_t size) const
 Update recently written (using write()) message contents data.
 
template<typename TIter >
comms::ErrorStatus update (TIter &iter, std::size_t size) const
 Update recently written (using write()) message contents data.
 
template<typename TAllFields , typename TMsg , typename TIter >
ErrorStatus updateFieldsCached (TAllFields &allFields, const TMsg &msg, TIter &iter, std::size_t size) const
 Update recently written (using writeFieldsCached()) message data as well as cached transport information fields.
 
template<typename TAllFields , typename TIter >
ErrorStatus updateFieldsCached (TAllFields &allFields, TIter &iter, std::size_t size) const
 Update recently written (using writeFieldsCached()) message data as well as cached transport information fields.
 
template<typename TMsg , typename TIter >
comms::ErrorStatus write (const TMsg &msg, TIter &iter, std::size_t size) const
 Serialise message into output data sequence.
 
template<typename TAllFields , typename TMsg , typename TIter >
comms::ErrorStatus writeFieldsCached (TAllFields &allFields, const TMsg &msg, TIter &iter, std::size_t size) const
 Serialise message into output data sequence while caching the written transport information fields.
 

Static Public Member Functions

template<typename TAllFields >
static auto accessCachedField (TAllFields &allFields) -> decltype(std::get< std::tuple_size< typename std::decay< TAllFields >::type >::value - std::tuple_size< AllFields >::value >(allFields))
 Access appropriate field from "cached" bundle of all the protocol stack fields.
 
static constexpr bool canSplitRead ()
 Compile time check whether split read "until" and "from" data layer is allowed.
 
static constexpr std::size_t doFieldLength ()
 Default implementation of field length retrieval.
 
template<typename TMsg >
static constexpr std::size_t doFieldLength (const TMsg &)
 Default implementation of field length retrieval when message is known.
 
static constexpr bool hasExtendingClass ()
 Compile time inquiry of whether this class was extended via comms::option::ExtendingClass option.
 
static constexpr bool hasVerifyBeforeRead ()
 Compile time inquiry of whether comms::option::def::ChecksumLayerVerifyBeforeRead options has been used.
 

Static Public Attributes

static const std::size_t NumOfLayers = 1 + NextLayer::NumOfLayers
 Static constant indicating amount of transport layers used.
 

Protected Member Functions

template<typename TMsg , typename TIter >
comms::ErrorStatus readField (const TMsg *msgPtr, Field &field, TIter &iter, std::size_t len)
 Read the checksum field.
 
template<typename... TExtraValues>
void setMissingSize (std::size_t val, TExtraValues... extraValues) const
 Set the missing size information if such is requested.
 
template<typename TId , typename... TExtraValues>
void setMsgId (TId val, TExtraValues... extraValues) const
 Set the message ID information if such is requested.
 
template<typename... TExtraValues>
void setMsgIndex (std::size_t val, TExtraValues... extraValues) const
 Set the message index information if such is requested.
 
template<typename... TExtraValues>
void updateMissingSize (const Field &field, std::size_t size, TExtraValues... extraValues) const
 Update the missing size information if such is requested.
 
template<typename... TExtraValues>
void updateMissingSize (std::size_t size, TExtraValues... extraValues) const
 Update the missing size information if such is requested.
 
template<typename TMsg , typename TIter >
comms::ErrorStatus writeField (const TMsg *msgPtr, const Field &field, TIter &iter, std::size_t len) const
 Write the checksum field.
 

Static Protected Member Functions

template<typename TMsg , typename TIter >
static auto calculateChecksum (const TMsg *msg, TIter &iter, std::size_t len, bool &checksumValid) -> decltype(TCalc()(iter, len))
 Calculate checksum.
 
template<typename TMsg , typename TIter >
static comms::ErrorStatus doReadField (const TMsg *msgPtr, Field &field, TIter &iter, std::size_t len)
 Read the layer field.
 
template<typename TMsg , typename TIter >
static comms::ErrorStatus doWriteField (const TMsg *msgPtr, const Field &field, TIter &iter, std::size_t len)
 Write the layer field.
 
static auto getChecksumFromField (const Field &field) -> decltype(field.getValue())
 Retrieve checksum value from the field.
 
template<std::size_t TIdx, typename TAllFields >
static FieldgetField (TAllFields &allFields)
 Retrieve reference to a layer specific field out of all fields.
 
template<typename T >
static constexpr bool isMessageObjRef ()
 Detect whether type is actual message object.
 
template<typename TChecksum , typename TMsg >
static void prepareFieldForWrite (TChecksum checksum, const TMsg *msg, Field &field)
 Prepare field for writing.
 
template<typename TMsg >
static void resetMsg (TMsg &msg)
 Reset msg in case it is a smart pointer (MsgPtr).
 
template<typename TMsg >
static auto toMsgPtr (TMsg &msg) -> decltype(toMsgPtrInternal(msg, MsgTypeTag< typename std::decay< decltype(msg)>::type >()))
 Get a pointer to the message object.
 

Related Symbols

(Note that these are not member symbols.)

#define COMMS_PROTOCOL_LAYERS_ACCESS(...)    COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
 Provide convenience access functions to protocol layers.
 
#define COMMS_PROTOCOL_LAYERS_ACCESS_INNER(...)    COMMS_PROTOCOL_LAYERS_ACCESS(__VA_ARGS__)
 Same as COMMS_PROTOCOL_LAYERS_ACCESS()
 
#define COMMS_PROTOCOL_LAYERS_ACCESS_OUTER(...)    COMMS_PROTOCOL_LAYERS_ACCESS(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
 Provide convenience access functions to protocol layers.
 
#define COMMS_PROTOCOL_LAYERS_NAMES(...)
 Provide names and convenience access functions to protocol layers.
 
#define COMMS_PROTOCOL_LAYERS_NAMES_INNER(...)    COMMS_PROTOCOL_LAYERS_NAMES(__VA_ARGS__)
 Same as COMMS_PROTOCOL_LAYERS_NAMES()
 
#define COMMS_PROTOCOL_LAYERS_NAMES_OUTER(...)    COMMS_PROTOCOL_LAYERS_NAMES(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
 Provide names and convenience access functions to protocol layers.
 

Member Typedef Documentation

◆ AllFields

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
using comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::AllFields = typename std::decay< decltype( std::tuple_cat( std::declval<std::tuple<Field> >(), std::declval<typename TNextLayer::AllFields>()) ) >::type
inherited

Type of all the fields of all the transport layers wrapped in std::tuple.

The Field type is prepended to the AllFields type of the NextLayer and reported as AllFields of this one.

◆ AllMessages

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
using comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::AllMessages = typename NextLayer::AllMessages
inherited

All supported messages.

Same as NextLayer::AllMessages or void if such doesn't exist. Expected to be overrided by comms::protocol::MsgIdLayer

◆ ExtendingClass

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
using comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::ExtendingClass = typename ParsedOptionsInternal::ExtendingClass

Type of real extending class.

Updated when comms::option::ExtendingClass extension option us used, aliasing void if the options is not used.

◆ MsgFactory

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
using comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::MsgFactory = typename NextLayer::MsgFactory
inherited

Type of message factory.

Same as NextLayer::AllMessages or void if such doesn't exist. Expected to be overrided by comms::protocol::MsgIdLayer

◆ MsgPtr

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
using comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::MsgPtr = typename details::ProtocolLayerMsgPtr<NextLayer>::Type
inherited

Type of pointer to the message.

Same as NextLayer::MsgPtr or void if such doesn't exist.

Member Function Documentation

◆ accessCachedField()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields >
static auto comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::accessCachedField ( TAllFields &  allFields) -> decltype(std::get<std::tuple_size<typename std::decay<TAllFields>::type>::value - std::tuple_size<AllFields>::value>(allFields))
staticinherited

Access appropriate field from "cached" bundle of all the protocol stack fields.

Parameters
allFieldsAll fields of the protocol stack
Returns
Reference to requested field.

◆ calculateChecksum()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter >
static auto comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::calculateChecksum ( const TMsg *  msg,
TIter &  iter,
std::size_t  len,
bool &  checksumValid 
) -> decltype(TCalc()(iter, len))
staticprotected

Calculate checksum.

The default implementation invokes operator() of provided calculation algorithm (TCalc template parameter). The function can be overriden by the extending class.

Parameters
[in]msgPointer to message object (if available), can be nullptr.
[in,out]iterIterator used for reading data, expected to be advanced
[in]lenLength of the output buffer
[out]checksumValidIndication of whether the return checksum is valid, must be populated.
Returns
The checksum value.
Note
May be non-static in the extending class, but needs to be const.

◆ createMsg()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TId >
MsgPtr comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::createMsg ( TId &&  id,
unsigned  idx = 0 
)
inherited

Create message object given the ID.

The default implementation is to forwards this call to the next layer. One of the layers (usually comms::protocol::MsgIdLayer) hides and overrides this implementation.

Template Parameters
TMsgType of message ID.
Parameters
idID of the message.
idxRelative index of the message with the same ID.
Returns
Smart pointer (variant of std::unique_ptr) to allocated message object

◆ doFieldLength() [1/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
static constexpr std::size_t comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::doFieldLength ( )
staticconstexprinherited

Default implementation of field length retrieval.

Default implementation returns

Field::minLength();
Note
Can be overriden by the extending class.

◆ doFieldLength() [2/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg >
static constexpr std::size_t comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::doFieldLength ( const TMsg &  )
staticconstexprinherited

Default implementation of field length retrieval when message is known.

Default implementation returns

Field::minLength();
Note
Can be overriden by the extending class.

◆ doRead()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter , typename TNextLayerReader , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::doRead ( Field field,
TMsg &  msg,
TIter &  iter,
std::size_t  size,
TNextLayerReader &&  nextLayerReader,
TExtraValues...  extraValues 
)

Customized read functionality, invoked by read().

First, reads the expected checksum value field, then executes the read() member function of the next layer. If the call returns comms::ErrorStatus::Success, it calculated the checksum of the read data and compares it to the calculated. If checksums match, comms::ErrorStatus::Success is returned, otherwise function returns comms::ErrorStatus::ProtocolError.

Template Parameters
TMsgType of the msg parameter.
TIterType of iterator used for reading.
TNextLayerReadernext layer reader object type.
Parameters
[out]fieldField object to read.
[in,out]msgReference to smart pointer that already holds or will hold allocated message object
[in,out]iterInput iterator used for reading.
[in]sizeSize of the data in the sequence
[in]nextLayerReaderReader object, needs to be invoked to forward read operation to the next layer.
[out]extraValuesVariadic extra output parameters passed to the "read" operatation of the protocol stack (see read() and readFieldsCached()). Need to passed on as variadic arguments to the nextLayerReader.
Returns
Status of the read operation.
Precondition
Iterator must be "random access" one.
Iterator must be valid and can be dereferenced and incremented at least "size" times;
Postcondition
The iterator will be advanced by the number of bytes was actually read. In case of an error, distance between original position and advanced will pinpoint the location of the error.

◆ doReadField()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter >
static comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::doReadField ( const TMsg *  msgPtr,
Field field,
TIter &  iter,
std::size_t  len 
)
staticprotectedinherited

Read the layer field.

The default implementation invokes read() operation of the passed field object. The function can be overriden by the extending class.

Parameters
[in]msgPtrPointer to message object (if available), can be nullptr.
[out]fieldField object value of which needs to be populated
[in,out]iterIterator used for reading, expected to be advanced
[in]lenLength of the input buffer
Note
May be non-static in the extending class

◆ doUpdate() [1/2]

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter , typename TNextLayerUpdater >
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::doUpdate ( const TMsg &  msg,
Field field,
TIter &  iter,
std::size_t  size,
TNextLayerUpdater &&  nextLayerUpdater 
) const

Customized update functionality, invoked by update().

Should be called when doWrite() returns comms::ErrorStatus::UpdateRequired.

Template Parameters
TMsgType of recently written message.
TIterType of iterator used for updating.
TNextLayerWriternext layer updater object type.
Parameters
[in]msgReference to recently written message object.
[out]fieldField object to update.
[in,out]iterAny random access iterator.
[in]sizeNumber of bytes that have been written using write().
[in]nextLayerUpdaterNext layer updater object.
Returns
Status of the update operation.

◆ doUpdate() [2/2]

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TIter , typename TNextLayerUpdater >
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::doUpdate ( Field field,
TIter &  iter,
std::size_t  size,
TNextLayerUpdater &&  nextLayerUpdater 
) const

Customized update functionality, invoked by update().

Should be called when doWrite() returns comms::ErrorStatus::UpdateRequired.

Template Parameters
TIterType of iterator used for updating.
TNextLayerWriternext layer updater object type.
Parameters
[out]fieldField object to update.
[in,out]iterAny random access iterator.
[in]sizeNumber of bytes that have been written using write().
[in]nextLayerUpdaterNext layer updater object.
Returns
Status of the update operation.

◆ doWrite()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter , typename TNextLayerWriter >
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::doWrite ( Field field,
const TMsg &  msg,
TIter &  iter,
std::size_t  size,
TNextLayerWriter &&  nextLayerWriter 
) const

Customized write functionality, invoked by write().

First, reserves the appropriate number of bytes in the output buffer which are supposed to contain valid checksum value, then executes the write() member function of the next layer. If the call returns comms::ErrorStatus::Success and it is possible to re-read what has been written (random access iterator is used for writing), the real checksum value is calculated and updated in the previously reserved area. In case non-random access iterator type is used for writing (for example std::back_insert_iterator), then this function returns comms::ErrorStatus::UpdateRequired to indicate that call to update() with random access iterator is required in order to be able to update written checksum information.

Template Parameters
TMsgType of message object.
TIterType of iterator used for writing.
TNextLayerWriternext layer writer object type.
Parameters
[out]fieldField object to update and write.
[in]msgReference to message object
[in,out]iterOutput iterator.
[in]sizeMax number of bytes that can be written.
[in]nextLayerWriterNext layer writer object.
Returns
Status of the write operation.
Precondition
Iterator must be valid and can be dereferenced and incremented at least "size" times;
Postcondition
The iterator will be advanced by the number of bytes was actually written. In case of an error, distance between original position and advanced will pinpoint the location of the error.

◆ doWriteField()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter >
static comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::doWriteField ( const TMsg *  msgPtr,
const Field field,
TIter &  iter,
std::size_t  len 
)
staticprotectedinherited

Write the layer field.

The default implementation invokes write() operation of the passed field object. The function can be overriden by the extending class.

Parameters
[in]msgPtrPointer to message object (if available), can be nullptr.
[out]fieldField object value of which needs to be written
[in,out]iterIterator used for writing, expected to be advanced
[in]lenLength of the output buffer
Note
May be non-static in the extending class, but needs to be const.

◆ getChecksumFromField()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
static auto comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::getChecksumFromField ( const Field field) -> decltype(field.getValue())
staticprotected

Retrieve checksum value from the field.

May be overridden by the extending class. Default implementation is

return field.getValue();
Parameters
[in]fieldField for this layer.

◆ getField()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<std::size_t TIdx, typename TAllFields >
static Field & comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::getField ( TAllFields &  allFields)
staticprotectedinherited

Retrieve reference to a layer specific field out of all fields.

Template Parameters
TIdxIndex of the field in tuple

◆ hasExtendingClass()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
static constexpr bool comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::hasExtendingClass ( )
staticconstexpr

Compile time inquiry of whether this class was extended via comms::option::ExtendingClass option.

If true is returned, the ExtendingClass type aliasing the real layer type.

◆ isMessageObjRef()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename T >
static constexpr bool comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::isMessageObjRef ( )
staticconstexprprotectedinherited

Detect whether type is actual message object.

Template Parameters
TType of the object
Returns
true if T type is extending comms::MessageBase, false otherwise.

◆ length() [1/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
constexpr std::size_t comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::length ( ) const
constexprinherited

Get remaining length of wrapping transport information.

The message data always get wrapped with transport information to be successfully delivered to and unpacked on the other side. This function return remaining length of the transport information. It performs a call to doFieldLength() member function to get info about current field length. To update the default behaviour just override the function in the derived class.

Returns
length of the field + length reported by the next layer.

◆ length() [2/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg >
constexpr std::size_t comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::length ( const TMsg &  msg) const
constexprinherited

Get remaining length of wrapping transport information + length of the provided message.

This function usually gets called when there is a need to identify the size of the buffer required to write provided message wrapped in the transport information. This function is very similar to length(), but adds also length of the message. It performs a call to doFieldLength() member function with message parameter to get info about current field length. To update the default behaviour just override the function in the derived class.

Template Parameters
TMsgType of message object.
Parameters
[in]msgMessage object
Returns
length of the field + length reported by the next layer.

◆ prepareFieldForWrite()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TChecksum , typename TMsg >
static void comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::prepareFieldForWrite ( TChecksum  checksum,
const TMsg *  msg,
Field field 
)
staticprotected

Prepare field for writing.

Must assign provided checksum value. May be overridden by the extending class if some complex functionality is required. The default implementation is:

field.setValue(checksum);
Parameters
[in]checksumChecksum value to assign
[in]msgPointer to message object being written, may be nullptr.
[out]fieldField, value of which needs to be populated
Note
May be non-static in the extending class. In case of non-static, must be const

◆ read()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::read ( TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Deserialise message from the input data sequence.

The function will invoke doRead() member function provided by the derived class, which must have the following signature and logic:

template<typename TMsg, typename TIter, typename TNextLayerReader, typename... TExtraValues>
Field& field, // field object used to read required data
TMsg& msg, // Ref to smart pointer to message object, or message object itself
TIter& iter, // iterator used for reading
std::size_t size, // size of the remaining data
TNextLayerReader&& nextLayerReader, // next layer reader object
TExtraValues... extraValues)
{
// internal logic prior next layer read, such as reading the field value
auto es = field.read(iter, size);
...
// request next layer to perform read operation
es = nextLayerReader.read(msg, iter, size - field.length(), extraValues...);
... // internal logic after next layer read if applicable
return es;
};
comms::ErrorStatus doRead(Field &field, TMsg &msg, TIter &iter, std::size_t size, TNextLayerReader &&nextLayerReader, TExtraValues... extraValues)
Customized read functionality, invoked by read().
Definition ChecksumPrefixLayer.h:170
typename BaseImpl::Field Field
Type of the field object used to read/write checksum value.
Definition ChecksumPrefixLayer.h:95
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:17

The signature of the nextLayerReader.read() function is the same as the signature of this read() member function. The implemented doRead() member function also may use the following inherited protected member to set values of variadic parameters in case they are provided.

  • updateMissingSize() - to calculate update missing size if such is requested.
  • setMissingSize() - to set specific value as missing size if suce information is requested.
  • setMsgId() - to set the value of message id
  • setMsgIndex() - to set the value of message index.
    Template Parameters
    TMsgType of msg parameter
    TIterType of iterator used for reading.
    Parameters
    [in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
    [in,out]iterInput iterator used for reading.
    [in]sizeSize of the data in the sequence
    [out]extraValuesExtra output parameters provided using one of the following functions: comms::protocol::missingSize(), comms::protocol::msgId(), comms::protocol::msgIndex(), comms::protocol::msgPayload().
    Returns
    Status of the operation.
    Precondition
    Iterator must be valid and can be dereferenced and incremented at least "size" times;
    Postcondition
    The iterator will be advanced by the number of bytes was actually read. In case of an error, distance between original position and advanced will pinpoint the location of the error.
    Returns comms::ErrorStatus::Success if and only if msg points to a valid object.

◆ readField()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter >
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::readField ( const TMsg *  msgPtr,
Field field,
TIter &  iter,
std::size_t  len 
)
protected

Read the checksum field.

The default implementation invokes read() operation of the passed field object. The function can be overriden by the extending class.

Parameters
[in]msgPtrPointer to message object (if available), can be nullptr.
[out]fieldField object value of which needs to be populated
[in,out]iterIterator used for reading, expected to be advanced
[in]lenLength of the input buffer
Note
May be static in the extending class
Deprecated:
Override doReadField() instead

◆ readFieldsCached()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::readFieldsCached ( TAllFields &  allFields,
TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Deserialise message from the input data sequence while caching the read transport information fields.

Very similar to read() member function, but adds "allFields" parameter to store read transport information fields. The function will also invoke the same doRead() member function provided by the derived class, as described with read().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TMsgType of msg parameter.
TIterType of iterator used for reading.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
[in,out]iterIterator used for reading.
[in]sizeNumber of bytes available for reading.
[out]extraValuesExtra output parameters provided using one of the following functions
Returns
Status of the operation.

◆ readFromData()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::readFromData ( TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Finalise the read operation by reading the message payload.

Should be called to finalise the read operation started by readUntilData().

Template Parameters
TMsgType of msg parameter
TIterType of iterator used for reading.
Parameters
[in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
[in,out]iterInput iterator used for reading.
[in]sizeSize of the data in the sequence
[out]extraValuesExtra output parameters provided using one of the following functions
Returns
Status of the operation.
Precondition
Iterator must be valid and can be dereferenced and incremented at least "size" times;
Postcondition
The iterator will be advanced by the number of bytes was actually read. In case of an error, distance between original position and advanced will pinpoint the location of the error.

◆ readFromDataFieldsCached()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::readFromDataFieldsCached ( TAllFields &  allFields,
TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Finalise the read operation by reading the message payload while caching the read transport information fields.

Should be called to finalise the read operation started by readUntilDataFieldsCached().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TMsgType of msg parameter
TIterType of iterator used for reading.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
[in,out]iterIterator used for reading.
[in]sizeNumber of bytes available for reading.
[out]extraValuesExtra output parameters provided using one of the following functions
Returns
Status of the operation.

◆ readUntilData()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::readUntilData ( TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Perform read of data fields until data layer (message payload).

Same as read by stops read operation when data layer is reached. Expected to be followed by a call to readFromData().

Template Parameters
TMsgType of msg parameter.
TIterType of iterator used for reading.
Parameters
[in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
[in,out]iterInput iterator used for reading.
[in]sizeSize of the data in the sequence
[out]extraValuesExtra output parameters provided using one of the following functions
Returns
Status of the operation.
Precondition
Iterator must be valid and can be dereferenced and incremented at least "size" times;
Postcondition
The iterator will be advanced by the number of bytes was actually read. In case of an error, distance between original position and advanced will pinpoint the location of the error.
missingSize output value is updated if and only if function returns comms::ErrorStatus::NotEnoughData.

◆ readUntilDataFieldsCached()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TMsg , typename TIter , typename... TExtraValues>
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::readUntilDataFieldsCached ( TAllFields &  allFields,
TMsg &  msg,
TIter &  iter,
std::size_t  size,
TExtraValues...  extraValues 
)
inherited

Perform read of data fields until data layer (message payload) while caching the read transport information fields.

Very similar to readUntilData() member function, but adds "allFields" parameter to store read transport information fields. The function will also invoke the same doRead() member function provided by the derived class, as described with read().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TMsgType of msg parameter
TIterType of iterator used for reading.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in,out]msgReference to smart pointer, that already holds or will hold allocated message object, or reference to actual message object (which extends comms::MessageBase).
[in,out]iterIterator used for reading.
[in]sizeNumber of bytes available for reading.
[out]extraValuesExtra output parameters provided using one of the following functions
Returns
Status of the operation.

◆ resetMsg()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg >
static void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::resetMsg ( TMsg &  msg)
staticprotectedinherited

Reset msg in case it is a smart pointer (MsgPtr).

Does nothing if passed parameter is actual message object.

See also
isMessageObjRef().

◆ setMissingSize()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename... TExtraValues>
void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::setMissingSize ( std::size_t  val,
TExtraValues...  extraValues 
) const
protectedinherited

Set the missing size information if such is requested.

Updates the value reference to which was passed to the "read" operation using comms::protocol::missingSize().

Parameters
[in]valValue to assign.
[out]extraValuesVariadic parameters passed to the "read" function such as read() or readFieldsCached()

◆ setMsgId()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TId , typename... TExtraValues>
void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::setMsgId ( TId  val,
TExtraValues...  extraValues 
) const
protectedinherited

Set the message ID information if such is requested.

Updates the value reference to which was passed to the "read" operation using comms::protocol::msgId().

Parameters
[in]valValue to assign.
[out]extraValuesVariadic parameters passed to the "read" function such as read() or readFieldsCached()

◆ setMsgIndex()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename... TExtraValues>
void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::setMsgIndex ( std::size_t  val,
TExtraValues...  extraValues 
) const
protectedinherited

Set the message index information if such is requested.

Updates the value reference to which was passed to the "read" operation using comms::protocol::msgIndex().

Parameters
[in]valValue to assign.
[out]extraValuesVariadic parameters passed to the "read" function such as read() or readFieldsCached()

◆ toMsgPtr()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg >
static auto comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::toMsgPtr ( TMsg &  msg) -> decltype(toMsgPtrInternal(msg, MsgTypeTag<typename std::decay<decltype(msg)>::type>()))
staticprotectedinherited

Get a pointer to the message object.

The function works seamlessly for both smart pointer and reference to the real object

See also
isMessageObjRef().

◆ update() [1/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter >
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::update ( const TMsg &  msg,
TIter &  iter,
std::size_t  size 
) const
inherited

Update recently written (using write()) message contents data.

Similar to other update() but also receiving recently written message object.

Parameters
[in]msgReference to message object.
[in,out]iterAny random access iterator.
[in]sizeNumber of bytes that have been written using write().
Returns
Status of the update operation.

◆ update() [2/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TIter >
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::update ( TIter &  iter,
std::size_t  size 
) const
inherited

Update recently written (using write()) message contents data.

Sometimes, when NON random access iterator is used for writing (for example std::back_insert_iterator), some transport data cannot be properly written. In this case, write() function will return comms::ErrorStatus::UpdateRequired. When such status is returned it is necessary to call update() with random access iterator on the written buffer to update written dummy information with proper values.
The function will invoke doUpdate() member function provided (or inherited) by the derived class, which must have the following signature and logic:

template<typename TIter, typename TNextLayerUpdater>
Field& field, // field object to update and re-write if necessary
TIter& iter, // iterator used for updateing
std::size_t size, // Number of remaning bytes in the output buffer.
TNextLayerUpdater&& nextLayerUpdater // next layer updater object
)
{
// internal logic prior next layer update, such as
// updating field's value and re-writing it.
field.value() = ...;
auto es = field.write(iter, size);
...
// request next layer to perform update operation
es = nextLayerUpdater.update(iter, size - field.length());
... // internal logic after next layer write if applicable
return es;
};
comms::ErrorStatus doUpdate(Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
Customized update functionality, invoked by update().
Definition ChecksumPrefixLayer.h:265

The signature of the nextLayerUpdater.update() function is the same as the signature of this update() member function.

Parameters
[in,out]iterAny random access iterator.
[in]sizeNumber of bytes that have been written using write().
Returns
Status of the update operation.

◆ updateFieldsCached() [1/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TMsg , typename TIter >
ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::updateFieldsCached ( TAllFields &  allFields,
const TMsg &  msg,
TIter &  iter,
std::size_t  size 
) const
inherited

Update recently written (using writeFieldsCached()) message data as well as cached transport information fields.

Very similar to other updateFieldsCached() member function, but adds "msg" parameter to access message object if needed.
The function will also invoke the same doUpdate() member function provided by the derived class, as described with write().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TMsgType of msg parameter.
TIterType of the random access iterator.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in]msgReference to recently written message object.
[in,out]iterRandom access iterator to the written data.
[in]sizeNumber of bytes that have been written using writeFieldsCached().
Returns
Status of the update operation.

◆ updateFieldsCached() [2/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TIter >
ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::updateFieldsCached ( TAllFields &  allFields,
TIter &  iter,
std::size_t  size 
) const
inherited

Update recently written (using writeFieldsCached()) message data as well as cached transport information fields.

Very similar to update() member function, but adds "allFields" parameter to store raw data of the message.
The function will also invoke the same doUpdate() member function provided by the derived class, as described with write().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TIterType of the random access iterator.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in,out]iterRandom access iterator to the written data.
[in]sizeNumber of bytes that have been written using writeFieldsCached().
Returns
Status of the update operation.

◆ updateMissingSize() [1/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename... TExtraValues>
void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::updateMissingSize ( const Field field,
std::size_t  size,
TExtraValues...  extraValues 
) const
protectedinherited

Update the missing size information if such is requested.

Calculates the minimal required length to be yet read. Updates the value reference to which was passed to the "read" operation using comms::protocol::missingSize().

Parameters
[in]fieldField read operation of which has failed.
[in]sizeRemaining number of bytes in the input buffer.
[out]extraValuesVariadic parameters passed to the "read" function such as read() or readFieldsCached()

◆ updateMissingSize() [2/2]

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename... TExtraValues>
void comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::updateMissingSize ( std::size_t  size,
TExtraValues...  extraValues 
) const
protectedinherited

Update the missing size information if such is requested.

Calculates the minimal required length to be yet read. Updates the value reference to which was passed to the "read" operation using comms::protocol::missingSize().

Parameters
[in]sizeRemaining number of bytes in the input buffer.
[out]extraValuesVariadic parameters passed to the "read" function such as read() or readFieldsCached()

◆ write()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TMsg , typename TIter >
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::write ( const TMsg &  msg,
TIter &  iter,
std::size_t  size 
) const
inherited

Serialise message into output data sequence.

The function will invoke doWrite() member function provided by the derived class, which must have the following signature and logic:

template<typename TMsg, typename TIter, typename TNextLayerWriter>
Field& field, // field object used to update and write required data
const TMsg& msg, // reference to ready to be sent message object
TIter& iter, // iterator used for writing
std::size_t size, // Max number of bytes that can be written.
TNextLayerWriter&& nextLayerWriter // next layer writer object
)
{
// internal logic prior next layer write, such as
// updating field's value and writing it.
field.value() = ...;
auto es = field.write(iter, size);
...
// request next layer to perform write operation
es = nextLayerWriter.write(msg, iter, size - field.length());
... // internal logic after next layer write if applicable
return es;
};
comms::ErrorStatus doWrite(Field &field, const TMsg &msg, TIter &iter, std::size_t size, TNextLayerWriter &&nextLayerWriter) const
Customized write functionality, invoked by write().
Definition ChecksumPrefixLayer.h:242

The signature of the nextLayerWriter.write() function is the same as the signature of this write() member function.

Template Parameters
TMsgType of the message being written.
TIterType of iterator used for writing.
Parameters
[in]msgReference to message object
[in,out]iterOutput iterator used for writing.
[in]sizeMax number of bytes that can be written.
Returns
Status of the write operation.
Precondition
Iterator must be valid and can be dereferenced and incremented at least "size" times;
Postcondition
The iterator will be advanced by the number of bytes was actually written. In case of an error, distance between original position and advanced will pinpoint the location of the error.
Returns
Status of the write operation.

◆ writeField()

template<typename TField , typename TCalc , typename TNextLayer , typename... TOptions>
template<typename TMsg , typename TIter >
comms::ErrorStatus comms::protocol::ChecksumPrefixLayer< TField, TCalc, TNextLayer, TOptions >::writeField ( const TMsg *  msgPtr,
const Field field,
TIter &  iter,
std::size_t  len 
) const
protected

Write the checksum field.

The default implementation invokes write() operation of the passed field object. The function can be overriden by the extending class.

Parameters
[in]msgPtrPointer to message object (if available), can be nullptr.
[out]fieldField object value of which needs to be written
[in,out]iterIterator used for writing, expected to be advanced
[in]lenLength of the output buffer
Note
May be static in the extending class, but needs to be const.
Deprecated:
Override doWriteField() instead

◆ writeFieldsCached()

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
template<typename TAllFields , typename TMsg , typename TIter >
comms::ErrorStatus comms::protocol::ProtocolLayerBase< TField, TNextLayer, TDerived, TOptions >::writeFieldsCached ( TAllFields &  allFields,
const TMsg &  msg,
TIter &  iter,
std::size_t  size 
) const
inherited

Serialise message into output data sequence while caching the written transport information fields.

Very similar to write() member function, but adds "allFields" parameter to store raw data of the message. The function will also invoke the same doWrite() member function provided by the derived class, as described with write().

Template Parameters
TAllFieldsstd::tuple of all the transport fields, must be AllFields type defined in the last layer class that defines protocol stack.
TMsgType of the message being written.
TIterType of iterator used for writing.
Parameters
[out]allFieldsReference to the std::tuple object that wraps all transport fields (AllFields type of the last protocol layer class).
[in]msgReference to the message object that is being written,
[in,out]iterIterator used for writing.
[in]sizeMax number of bytes that can be written.
Returns
Status of the write operation.

Friends And Related Symbol Documentation

◆ COMMS_PROTOCOL_LAYERS_ACCESS

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
#define COMMS_PROTOCOL_LAYERS_ACCESS (   ...)     COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
related

Provide convenience access functions to protocol layers.

The first argument is a name for innermost layer (comms::protocol::MsgDataLayer), while the last one is the name for the outermost one.

◆ COMMS_PROTOCOL_LAYERS_ACCESS_OUTER

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
#define COMMS_PROTOCOL_LAYERS_ACCESS_OUTER (   ...)     COMMS_PROTOCOL_LAYERS_ACCESS(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
related

Provide convenience access functions to protocol layers.

Similar to COMMS_PROTOCOL_LAYERS_ACCESS(), but the arguments are expected to be in reverse order, i.e. the first argument is the name of the outermost layer, while the last one is the name for the innermost one (comms::protocol::MsgDataLayer)

◆ COMMS_PROTOCOL_LAYERS_NAMES

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
#define COMMS_PROTOCOL_LAYERS_NAMES (   ...)
related
Value:
COMMS_DO_LAYER_TYPE_ALIAS(Base, __VA_ARGS__) \
COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)

Provide names and convenience access functions to protocol layers.

Similar to COMMS_PROTOCOL_LAYERS_ACCESS() but defines "Layer_<name>" type names.

Precondition
Requires definition of inner "Base" type aliasing the base class.

◆ COMMS_PROTOCOL_LAYERS_NAMES_OUTER

template<typename TField , typename TNextLayer , typename TDerived , typename... TOptions>
#define COMMS_PROTOCOL_LAYERS_NAMES_OUTER (   ...)     COMMS_PROTOCOL_LAYERS_NAMES(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
related

Provide names and convenience access functions to protocol layers.

Similar to COMMS_PROTOCOL_LAYERS_ACCESS_OUTER() but defines "Layer_<name>" type names.

Precondition
Requires definition of inner "Base" type aliasing the base class.

The documentation for this class was generated from the following file: