30template <
typename TField>
31class Optional :
public
33 comms::option::def::Endian<typename TField::Endian>,
34 comms::option::def::VersionType<typename TField::VersionType>
46 using ValueType = TField;
49 using CommsTag = comms::field::tag::Optional;
53 explicit Optional(
const Field& fieldSrc, Mode mode = Mode::Tentative)
59 explicit Optional(Field&& fieldSrc, Mode mode = Mode::Tentative)
60 : m_field(
std::move(fieldSrc)),
65 Optional(
const Optional&) =
default;
67 Optional(Optional&&) =
default;
69 ~Optional() noexcept = default;
71 Optional& operator=(const Optional&) = default;
73 Optional& operator=(Optional&&) = default;
80 const Field& field()
const
90 const ValueType& value()
const
95 const ValueType& getValue()
const
100 template <
typename T>
101 void setValue(T&& val)
103 value() = std::forward<T>(val);
111 void setMode(Mode val)
117 std::size_t length()
const
119 if (m_mode != Mode::Exists) {
123 return m_field.length();
126 static constexpr std::size_t minLength()
131 static constexpr std::size_t maxLength()
133 return Field::maxLength();
138 if (m_mode == Mode::Missing) {
142 return m_field.valid();
146 if (m_mode != Mode::Exists) {
149 return m_field.refresh();
152 template <
typename TIter>
155 if (m_mode == Mode::Missing) {
159 if ((m_mode == Mode::Tentative) && (0U == len)) {
160 m_mode = Mode::Missing;
164 auto es = m_field.read(iter, len);
166 m_mode = Mode::Exists;
178 if (m_mode != Mode::Exists) {
182 return m_field.canWrite();
185 template <
typename TIter>
186 ErrorStatus write(TIter& iter, std::size_t len)
const
188 if (m_mode != Mode::Exists) {
192 return m_field.write(iter, len);
200 template <
typename TIter>
201 void writeNoStatus(TIter& iter)
const
203 if (m_mode != Mode::Exists) {
207 m_field.writeNoStatus(iter);
227 Mode m_mode = Mode::Tentative;
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.
Contains definition of comms::Field class.
Contains definition of the mode used for comms::field::Optional fields.
Base class to all the field classes.
Definition Field.h:36
static constexpr bool canWrite()
Default check of whether the field has a consistent value for writing.
Definition Field.h:103
static constexpr bool setVersion(VersionType)
Default version update functionality.
Definition Field.h:112
static constexpr bool isVersionDependent()
Default check of whether the field is version dependent.
Definition Field.h:66
static constexpr bool refresh()
Default refresh functionality.
Definition Field.h:59
static constexpr bool hasReadNoStatus()
Default check of whether the field has readNoStatus() member function.
Definition Field.h:80
typename BaseImpl::VersionType VersionType
Version type.
Definition Field.h:45
static constexpr bool hasNonDefaultRefresh()
Default check of whether the field has defines refresh functionality.
Definition Field.h:73
static constexpr bool hasWriteNoStatus()
Default check of whether the field has writeNoStatus() member function.
Definition Field.h:87
static constexpr bool valid()
Default validity check.
Definition Field.h:50
Contains definition of various tag classes.
OptionalMode
Mode to be used by comms::field::Optional.
Definition OptionalMode.h:24
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.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:66
Options to specify endian.
Definition options.h:172
Provide type to be used for versioning.
Definition options.h:1184