COMMS
Template library intended to help with implementation of communication protocols.
|
#include "comms/field/Optional.h"
Adaptor class to any other field, that makes the field optional.
When field is optional, it may either exist or not. The behaviour of length(), read() and write() operations depends on the current field's mode.
TField | Proper type of the field that needs to be optional. |
TOptions | Zero or more options that modify/refine default behaviour of the field. Supported options are:
|
Public Types | |
using | CommsTag = typename BaseImpl::CommsTag |
Tag indicating type of the field. | |
using | Endian = typename BaseImpl::Endian |
Endian used for serialisation. | |
using | Field = TField |
Type of the field. | |
using | FieldType = typename ParsedOptions::FieldType |
Type of actual extending field specified via comms::option::def::FieldType. | |
using | Mode = OptionalMode |
Mode of the field. | |
using | ParsedOptions = details::OptionsParser< TOptions... > |
All the options provided to this class bundled into struct. | |
using | ValueType = Field |
Value type of this field, equal to Field. | |
using | VersionType = typename BaseImpl::VersionType |
Version type. | |
Public Member Functions | |
Optional ()=default | |
Default constructor. | |
Optional (const Field &fieldSrc) | |
Construct the field. | |
Optional (const Optional &)=default | |
Copy constructor. | |
Optional (Field &&fieldSrc) | |
Construct the field. | |
Optional (Optional &&)=default | |
Move constructor. | |
~Optional () noexcept=default | |
Destructor. | |
bool | canWrite () const |
Check of whether the field has a consistent value for writing. | |
bool | doesExist () const |
Check whether mode is equivalent to Mode::Exists. | |
Field & | field () |
Get an access to the wrapped field object. | |
const Field & | field () const |
Get an access to the wrapped field object. | |
Mode | getMode () const |
Get current optional mode. | |
const ValueType & | getValue () const |
Get value. | |
VersionType | getVersion () const |
Get version of the field. | |
bool | isMissing () const |
Check whether mode is equivalent to Mode::Missing. | |
bool | isTentative () const |
Check whether mode is equivalent to Mode::Tentative. | |
std::size_t | length () const |
Get length required to serialise the current field value. | |
Optional & | operator= (const Optional &)=default |
Copy assignment. | |
Optional & | operator= (Optional &&)=default |
Move assignment. | |
template<typename TIter > | |
ErrorStatus | read (TIter &iter, std::size_t len) |
Read field value from input data sequence. | |
template<typename TIter > | |
void | readNoStatus (TIter &iter) |
Read field value from input data sequence without error check and status report. | |
bool | refresh () |
Refresh the field's value. | |
void | setExists () |
Set mode to Mode::Exists. | |
void | setMissing () |
Set mode to Mode::Missing. | |
void | setMode (Mode val) |
Get optional mode. | |
void | setTentative () |
Set mode to Mode::Tentative. | |
template<typename U > | |
void | setValue (U &&val) |
Set value. | |
bool | setVersion (VersionType version) |
Default implementation of version update. | |
bool | valid () const |
Check validity of the field value. | |
ValueType & | value () |
Get an access to the wrapped field object. | |
const ValueType & | value () const |
Get an access to the wrapped field object. | |
template<typename TIter > | |
ErrorStatus | write (TIter &iter, std::size_t len) const |
Write current field value to output data sequence. | |
template<typename TIter > | |
void | writeNoStatus (TIter &iter) const |
Write current field value to output data sequence without error check and status report. | |
Static Public Member Functions | |
static constexpr bool | canWrite () |
Default check of whether the field has a consistent value for writing. | |
static constexpr bool | hasEmptySerialization () |
Compile time inquiry of whether comms::option::def::EmptySerialization option has been used. | |
static constexpr bool | hasFailOnInvalid () |
Compile time inquiry of whether comms::option::def::FailOnInvalid option has been used. | |
static constexpr bool | hasFieldType () |
Compile time inquiry of whether comms::option::def::FieldType option has been used. | |
static constexpr bool | hasFixedValue () |
Compile time inquiry of whether comms::option::def::FixedValue option has been used. | |
static constexpr bool | hasIgnoreInvalid () |
Compile time inquiry of whether comms::option::def::IgnoreInvalid option has been used. | |
static constexpr bool | hasName () |
Compile time inquiry of whether comms::option::def::HasName option has been used. | |
static constexpr bool | hasNonDefaultRefresh () |
Compile time check if this class has non-default refresh functionality. | |
static constexpr bool | hasReadNoStatus () |
Compile time check of whether the field has proper readNoStatus() member function. | |
static constexpr bool | hasVarLength () |
Default check of whether the field has variable length definition via comms::option::def::VarLength option. | |
static constexpr bool | hasWriteNoStatus () |
Compile time check of whether the field has proper writeNoStatus() member function. | |
static constexpr bool | isVersionDependent () |
Compile time check if this class is version dependent. | |
static constexpr std::size_t | maxLength () |
Get maximal length that is required to serialise field of this type. | |
static constexpr std::size_t | minLength () |
Get minimal length that is required to serialise field of this type. | |
static constexpr bool | valid () |
Default validity check. | |
Static Protected Member Functions | |
template<typename T , typename TIter > | |
static T | readData (TIter &iter) |
Read data from input buffer. | |
template<typename T , std::size_t TSize, typename TIter > | |
static T | readData (TIter &iter) |
Read partial data from input buffer. | |
template<typename T , typename TIter > | |
static void | writeData (T value, TIter &iter) |
Write data into the output buffer. | |
template<std::size_t TSize, typename T , typename TIter > | |
static void | writeData (T value, TIter &iter) |
Write partial data into the output buffer. | |
Related Symbols | |
(Note that these are not member symbols.) | |
template<typename T > | |
constexpr bool | isOptional () |
Compile time check function of whether a provided type is any variant of comms::field::Optional. | |
template<typename TField , typename... TOptions> | |
bool | operator!= (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Non-equality comparison operator. | |
template<typename TField , typename... TOptions> | |
bool | operator< (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Equivalence comparison operator. | |
template<typename TField , typename... TOptions> | |
bool | operator<= (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Equivalence comparison operator. | |
template<typename TField , typename... TOptions> | |
bool | operator== (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Equality comparison operator. | |
template<typename TField , typename... TOptions> | |
bool | operator> (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Equivalence comparison operator. | |
template<typename TField , typename... TOptions> | |
bool | operator>= (const Optional< TField, TOptions... > &field1, const Optional< TField, TOptions... > &field2) noexcept |
Equivalence comparison operator. | |
template<typename TField , typename... TOptions> | |
const Optional< TField, TOptions... > & | toFieldBase (const Optional< TField, TOptions... > &field) |
Upcast type of the field definition to its parent comms::field::Optional type in order to have access to its internal types. | |
template<typename TField , typename... TOptions> | |
Optional< TField, TOptions... > & | toFieldBase (Optional< TField, TOptions... > &field) |
Upcast type of the field definition to its parent comms::field::Optional type in order to have access to its internal types. | |
using comms::field::Optional< TField, TOptions >::FieldType = typename ParsedOptions::FieldType |
Type of actual extending field specified via comms::option::def::FieldType.
void if comms::option::def::FieldType hasn't been applied.
using comms::field::Optional< TField, TOptions >::Mode = OptionalMode |
Mode of the field.
|
default |
Default constructor.
The mode it is created in is OptionalMode::Tentative.
|
explicit |
Construct the field.
[in] | fieldSrc | Field to be copied from during construction. |
|
explicit |
Construct the field.
[in] | fieldSrc | Field to be moved from during construction. |
|
staticconstexprinherited |
Default check of whether the field has a consistent value for writing.
bool comms::field::Optional< TField, TOptions >::doesExist | ( | ) | const |
const ValueType & comms::field::Optional< TField, TOptions >::getValue | ( | ) | const |
Get value.
Implemented by calling value(), but can be overriden in the derived class
VersionType comms::field::Optional< TField, TOptions >::getVersion | ( | ) | const |
Get version of the field.
Exists only if comms::option::def::VersionStorage option has been provided.
|
staticconstexprinherited |
Default check of whether the field has variable length definition via comms::option::def::VarLength option.
bool comms::field::Optional< TField, TOptions >::isMissing | ( | ) | const |
bool comms::field::Optional< TField, TOptions >::isTentative | ( | ) | const |
std::size_t comms::field::Optional< TField, TOptions >::length | ( | ) | const |
Get length required to serialise the current field value.
|
staticconstexpr |
Get maximal length that is required to serialise field of this type.
|
staticconstexpr |
Get minimal length that is required to serialise field of this type.
ErrorStatus comms::field::Optional< TField, TOptions >::read | ( | TIter & | iter, |
std::size_t | len | ||
) |
Read field value from input data sequence.
If field is marked as missing (mode is OptionalMode::Missing), function returns comms::ErrorStatus::Success without advancing iterator.
If field is marked as existing (mode is OptionalMode::Exists) the read() member function of the wrapped field object is invoked.
If field is marked to be tentative (mode is OptionalMode::Tentative), the call redirected to wrapped field's read() member function if value of the "len" parameter is greater than 0, i.e. there are still bytes available for reading, and field itself is marked as existing.
Otherwise, field is marked as missing and comms::ErrorStatus::Success is returned.
[in,out] | iter | Iterator to read the data. |
[in] | len | Number of bytes available for reading. |
|
staticprotectedinherited |
Read data from input buffer.
Use this function to read data from the intput buffer maintained by the caller. The endianness of the data will be as specified in options of the class.
T | Return type |
TIter | Type of input iterator |
[in,out] | iter | Input iterator. |
|
staticprotectedinherited |
Read partial data from input buffer.
Use this function to read data from the intput buffer maintained by the caller. The endianness of the data will be as specified in options of the class.
T | Return type |
TSize | number of bytes to read |
TIter | Type of input iterator |
[in,out] | iter | Input iterator. |
void comms::field::Optional< TField, TOptions >::readNoStatus | ( | TIter & | iter | ) |
Read field value from input data sequence without error check and status report.
Similar to read(), but doesn't perform any correctness checks and doesn't report any failures.
[in,out] | iter | Iterator to read the data. |
bool comms::field::Optional< TField, TOptions >::refresh | ( | ) |
Refresh the field's value.
Will invoke the refresh() member function of the contained field, only if it is marked as "exists", otherwise false will be returned.
void comms::field::Optional< TField, TOptions >::setExists | ( | ) |
void comms::field::Optional< TField, TOptions >::setMissing | ( | ) |
void comms::field::Optional< TField, TOptions >::setTentative | ( | ) |
void comms::field::Optional< TField, TOptions >::setValue | ( | U && | val | ) |
Set value.
Implemented as re-assigning to value(), but can be overriden in the derived class.
bool comms::field::Optional< TField, TOptions >::setVersion | ( | VersionType | version | ) |
Default implementation of version update.
|
staticconstexprinherited |
Default validity check.
Always returns true, can be overriden by the derived class
bool comms::field::Optional< TField, TOptions >::valid | ( | ) | const |
Check validity of the field value.
ErrorStatus comms::field::Optional< TField, TOptions >::write | ( | TIter & | iter, |
std::size_t | len | ||
) | const |
Write current field value to output data sequence.
If field is marked as missing (mode is OptionalMode::Missing) or tentative (mode is OptionalMode::Tentative) the function returns comms::ErrorStatus::Success without advancing iterator.
If field is marked as existing (mode is OptionalMode::Exists) the write() member function of the wrapped field object is invoked.
[in,out] | iter | Iterator to write the data. |
[in] | len | Maximal number of bytes that can be written. |
|
staticprotectedinherited |
Write data into the output buffer.
Use this function to write data to the the buffer maintained by the caller. The endianness of the data will be as specified in the options provided to the class.
T | Type of the value to write. Must be integral. |
Type | of output iterator |
[in] | value | Integral type value to be written. |
[in,out] | iter | Output iterator. |
|
staticprotectedinherited |
Write partial data into the output buffer.
Use this function to write partial data to the buffer maintained by the caller. The endianness of the data will be as specified the class options.
TSize | Length of the value in bytes known in compile time. |
T | Type of the value to write. Must be integral. |
TIter | Type of output iterator |
[in] | value | Integral type value to be written. |
[in,out] | iter | Output iterator. |
void comms::field::Optional< TField, TOptions >::writeNoStatus | ( | TIter & | iter | ) | const |
Write current field value to output data sequence without error check and status report.
Similar to write(), but doesn't perform any correctness checks and doesn't report any failures.
[in,out] | iter | Iterator to write the data. |
|
related |
Compile time check function of whether a provided type is any variant of comms::field::Optional.
T | Any type. |
|
related |
Non-equality comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |
|
related |
Equivalence comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |
|
related |
Equivalence comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |
|
related |
Equality comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |
|
related |
Equivalence comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |
|
related |
Equivalence comparison operator.
[in] | field1 | First field. |
[in] | field2 | Second field. |