15 #ifndef _FASTCDR_XCDR_OPTIONAL_HPP_ 16 #define _FASTCDR_XCDR_OPTIONAL_HPP_ 21 #include "detail/optional.hpp" 22 #include "../exceptions/BadOptionalAccessException.hpp" 57 const T& val) noexcept
59 ::new(&storage_.val_)T(val);
60 storage_.engaged_ =
true;
67 ::new(&storage_.val_)T(std::move(val));
68 storage_.engaged_ =
true;
75 if (val.storage_.engaged_)
77 ::new(&storage_.val_)T(val.storage_.val_);
78 storage_.engaged_ =
true;
86 if (val.storage_.engaged_)
88 ::new(&storage_.val_)T(std::move(val.storage_.val_));
89 storage_.engaged_ =
true;
105 storage_.val_.T(std::forward<Args>(_args)...);
106 storage_.engaged_ =
true;
116 bool initial_engaged =
false)
118 if (storage_.engaged_)
122 storage_.engaged_ = initial_engaged;
123 if (storage_.engaged_)
125 ::new(&storage_.val_)T();
137 if (!storage_.engaged_)
143 return storage_.val_;
154 if (!storage_.engaged_)
160 return storage_.val_;
171 if (!storage_.engaged_)
177 return std::move(storage_.val_);
188 if (!storage_.engaged_)
194 return std::move(storage_.val_);
204 return storage_.engaged_;
212 storage_.engaged_ = opt.storage_.
engaged_;
215 ::new(&storage_.val_)T(opt.storage_.
val_);
225 storage_.engaged_ = opt.storage_.engaged_;
226 if (opt.storage_.engaged_)
228 ::new(&storage_.val_)T(std::move(opt.storage_.val_));
238 ::new(&storage_.val_)T(val);
239 storage_.engaged_ =
true;
248 ::new(&storage_.val_)T(std::move(val));
249 storage_.engaged_ =
true;
265 return opt_val.storage_.
engaged_ == storage_.engaged_ &&
266 (storage_.engaged_ ? opt_val.storage_.
val_ == storage_.val_ :
true);
273 return !operator ==(opt_val);
283 T& operator *() & noexcept
285 return storage_.val_;
295 const T& operator *() const& noexcept
297 return storage_.val_;
307 T&& operator *() && noexcept
309 return std::move(storage_.val_);
319 const T&& operator *() const&& noexcept
321 return std::move(storage_.val_);
331 T* operator ->() noexcept
333 return std::addressof(storage_.val_);
343 const T* operator ->() const noexcept
345 return std::addressof(storage_.val_);
349 explicit operator bool() const noexcept
351 return storage_.engaged_;
362 #endif //_FASTCDR_XCDR_OPTIONAL_HPP_ optional(const optional< T > &val) noexcept
Copy constructor.
Definition: optional.hpp:72
static constexpr nullopt_t nullopt
nullopt is a constant of type nullopt_t that is used to indicate optional type with uninitialized sta...
Definition: optional.hpp:40
T type
Definition: optional.hpp:50
void reset(bool initial_engaged=false)
Reset the state of the optional.
Definition: optional.hpp:115
bool has_value() const
Checks whether the optional contains a value.
Definition: optional.hpp:202
void emplace(Args &&... _args)
Constructs the contained value in-place.
Definition: optional.hpp:101
optional(const T &val) noexcept
Copy constructor from an instance of the templated class.
Definition: optional.hpp:56
optional(optional< T > &&val) noexcept
Move constructor.
Definition: optional.hpp:83
An empty class type used to indicate optional type with uninitialized state.
Definition: optional.hpp:28
T & value() &
Returns the contained value.
Definition: optional.hpp:135
Definition: fixed_size_string.hpp:32
constexpr nullopt_t(int)
Definition: optional.hpp:30
const T & value() const &
Returns the contained value.
Definition: optional.hpp:152
T && value() &&
Returns the contained value.
Definition: optional.hpp:169
bool engaged_
Definition: optional.hpp:32
const T && value() const &&
Returns the contained value.
Definition: optional.hpp:186
optional(T &&val) noexcept
Move constructor from an instance of the templated class.
Definition: optional.hpp:64
static const char *const BAD_OPTIONAL_ACCESS_MESSAGE_DEFAULT
Default message used in the library.
Definition: BadOptionalAccessException.hpp:78
T val_
Definition: optional.hpp:29
This class template manages an optional contained value, i.e.
Definition: optional.hpp:46
This class is thrown as an exception when accessing the value of a null optional. ...
Definition: BadOptionalAccessException.hpp:27