27template <
typename TField>
28class Optional :
public
30 comms::option::def::Endian<typename TField::Endian>,
31 comms::option::def::VersionType<typename TField::VersionType>
43 using ValueType = TField;
46 using CommsTag = comms::field::tag::Optional;
50 explicit Optional(
const Field& fieldSrc, Mode mode = Mode::Tentative)
56 explicit Optional(Field&& fieldSrc, Mode mode = Mode::Tentative)
57 : m_field(
std::move(fieldSrc)),
62 Optional(
const Optional&) =
default;
64 Optional(Optional&&) =
default;
66 ~Optional() noexcept = default;
68 Optional& operator=(const Optional&) = default;
70 Optional& operator=(Optional&&) = default;
77 const Field& field()
const
87 const ValueType& value()
const
92 const ValueType& getValue()
const
98 void setValue(T&& val)
100 value() = std::forward<T>(val);
108 void setMode(Mode val)
114 std::size_t length()
const
116 if (m_mode != Mode::Exists) {
120 return m_field.length();
123 static constexpr std::size_t minLength()
128 static constexpr std::size_t maxLength()
130 return Field::maxLength();
135 if (m_mode == Mode::Missing) {
139 return m_field.valid();
143 if (m_mode != Mode::Exists) {
146 return m_field.refresh();
149 template <
typename TIter>
152 if (m_mode == Mode::Missing) {
156 if ((m_mode == Mode::Tentative) && (0U == len)) {
157 m_mode = Mode::Missing;
161 auto es = m_field.read(iter, len);
163 m_mode = Mode::Exists;
175 if (m_mode != Mode::Exists) {
179 return m_field.canWrite();
182 template <
typename TIter>
183 ErrorStatus write(TIter& iter, std::size_t len)
const
185 if (m_mode != Mode::Exists) {
189 return m_field.write(iter, len);
197 template <
typename TIter>
198 void writeNoStatus(TIter& iter)
const
200 if (m_mode != Mode::Exists) {
204 m_field.writeNoStatus(iter);
224 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:33
static constexpr bool canWrite()
Default check of whether the field has a consistent value for writing.
Definition Field.h:100
static constexpr bool setVersion(VersionType)
Default version update functionality.
Definition Field.h:109
static constexpr bool isVersionDependent()
Default check of whether the field is version dependent.
Definition Field.h:63
static constexpr bool refresh()
Default refresh functionality.
Definition Field.h:56
static constexpr bool hasReadNoStatus()
Default check of whether the field has readNoStatus() member function.
Definition Field.h:77
typename BaseImpl::VersionType VersionType
Version type.
Definition Field.h:42
static constexpr bool hasNonDefaultRefresh()
Default check of whether the field has defines refresh functionality.
Definition Field.h:70
static constexpr bool hasWriteNoStatus()
Default check of whether the field has writeNoStatus() member function.
Definition Field.h:84
static constexpr bool valid()
Default validity check.
Definition Field.h:47
Contains definition of various tag classes.
OptionalMode
Mode to be used by comms::field::Optional.
Definition OptionalMode.h:22
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.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:64
Options to specify endian.
Definition options.h:172
Provide type to be used for versioning.
Definition options.h:1171