31 #ifndef ETL_OPTIONAL_INCLUDED
32 #define ETL_OPTIONAL_INCLUDED
62 void operator&()
const;
79 optional_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
80 :
exception(reason_, file_name_, line_number_)
106 template <
typename T>
135 ::new (storage.template get_address<T>()) T(other.
value());
139 #if ETL_CPP11_SUPPORTED
148 ::new (storage.template get_address<T>()) T(
etl::move(other.
value()));
158 ::new (storage.template get_address<T>()) T(value_);
162 #if ETL_CPP11_SUPPORTED
168 ::new (storage.template get_address<T>()) T(
etl::move(value_));
180 storage.template get_reference<T>().~T();
191 storage.template get_reference<T>().~T();
205 if (valid && !
bool(other))
207 storage.template get_reference<T>().~T();
210 else if (
bool(other))
214 storage.template get_reference<T>() = other.
value();
218 ::new (storage.template get_address<T>()) T(other.
value());
227 #if ETL_CPP11_SUPPORTED
235 if (valid && !
bool(other))
237 storage.template get_reference<T>().~T();
240 else if (
bool(other))
244 storage.template get_reference<T>() = etl::move(other.value());
248 ::new (storage.template get_address<T>()) T(
etl::move(other.
value()));
265 storage.template get_reference<T>() = value_;
269 ::new (storage.template get_address<T>()) T(value_);
276 #if ETL_CPP11_SUPPORTED
284 storage.template get_reference<T>() = etl::move(value_);
288 ::new (storage.template get_address<T>()) T(
etl::move(value_));
301 #if defined(ETL_DEBUG)
305 return storage.template get_address<T>();
313 #if defined(ETL_DEBUG)
317 return storage.template get_address<T>();
325 #if defined(ETL_DEBUG)
329 return storage.template get_reference<T>();
337 #if defined(ETL_DEBUG)
341 return storage.template get_reference<T>();
347 ETL_EXPLICIT
operator bool()
const
355 ETL_CONSTEXPR
bool has_value() const ETL_NOEXCEPT
366 #if defined(ETL_DEBUG)
370 return storage.template get_reference<T>();
378 #if defined(ETL_DEBUG)
382 return storage.template get_reference<T>();
390 return valid ?
value() : default_value;
410 storage.template get_reference<T>().~T();
415 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && !defined(ETL_OPTIONAL_FORCE_CPP03)
420 template <
typename ... Args>
426 storage.template get_reference<T>().~T();
429 ::new (storage.template get_address<T>()) T(ETL_OR_STD::forward<Args>(args)...);
437 template <
typename T1>
443 storage.template get_reference<T>().~T();
446 ::new (storage.template get_address<T>()) T(value1);
454 template <
typename T1,
typename T2>
455 void emplace(
const T1& value1,
const T2& value2)
460 storage.template get_reference<T>().~T();
463 ::new (storage.template get_address<T>()) T(value1, value2);
471 template <
typename T1,
typename T2,
typename T3>
472 void emplace(
const T1& value1,
const T2& value2,
const T3& value3)
477 storage.template get_reference<T>().~T();
480 ::new (storage.template get_address<T>()) T(value1, value2, value3);
488 template <
typename T1,
typename T2,
typename T3,
typename T4>
489 void emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
494 storage.template get_reference<T>().~T();
497 ::new (storage.template get_address<T>()) T(value1, value2, value3, value4);
511 template <
typename T>
514 if (
bool(lhs) !=
bool(rhs))
518 else if (!
bool(lhs) && !
bool(rhs))
531 template <
typename T>
534 return !(lhs == rhs);
540 template <
typename T>
560 template <
typename T>
580 template <
typename T>
600 template <
typename T>
620 template <
typename T>
629 template <
typename T>
638 template <
typename T>
647 template <
typename T>
656 template <
typename T>
665 template <
typename T>
674 template <
typename T>
683 template <
typename T>
692 template <
typename T>
701 template <
typename T>
710 template <
typename T>
719 template <
typename T>
728 template <
typename T,
typename U>
731 return bool(lhs) ? lhs.
value() == rhs :
false;
737 template <
typename T,
typename U>
740 return !(lhs == rhs);
746 template <
typename T,
typename U>
749 return bool(rhs) ? rhs.
value() == lhs :
false;
755 template <
typename T,
typename U>
758 return !(lhs == rhs);
764 template <
typename T,
typename U>
767 return bool(lhs) ? lhs.
value() < rhs :
true;
773 template <
typename T,
typename U>
776 return bool(rhs) ? lhs < rhs.
value() :
false;
782 template <
typename T,
typename U>
785 return bool(lhs) ? lhs.
value() <= rhs :
true;
791 template <
typename T,
typename U>
794 return bool(rhs) ? lhs <= rhs.
value() :
false;
800 template <
typename T,
typename U>
803 return bool(lhs) ? lhs.
value() > rhs :
false;
809 template <
typename T,
typename U>
812 return bool(rhs) ? lhs > rhs.
value() :
true;
818 template <
typename T,
typename U>
821 return bool(lhs) ? lhs.
value() >= rhs :
false;
827 template <
typename T,
typename U>
830 return bool(rhs) ? lhs >= rhs.
value() :
true;
836 template <
typename T>
846 template <
typename T>
Definition: optional.h:49
Definition: optional.h:108
const T & value() const
Get a const reference to the value.
Definition: optional.h:376
void swap(optional &other)
Swaps this value with another.
Definition: optional.h:396
void emplace(const T1 &value1, const T2 &value2)
Definition: optional.h:455
void emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Definition: optional.h:472
optional(etl::nullopt_t)
Constructor with nullopt.
Definition: optional.h:122
void emplace(const T1 &value1)
Definition: optional.h:438
optional()
Constructor.
Definition: optional.h:114
T * operator->()
Pointer operator.
Definition: optional.h:299
T value_or(T default_value) const
Gets the value or a default if no valid.
Definition: optional.h:388
T & value()
Get a reference to the value.
Definition: optional.h:364
~optional()
Destructor.
Definition: optional.h:176
T & operator*()
Dereference operator.
Definition: optional.h:323
void reset()
Reset back to invalid.
Definition: optional.h:406
optional & operator=(etl::nullopt_t)
Assignment operator from nullopt.
Definition: optional.h:187
optional(const T &value_)
Constructor from value type.
Definition: optional.h:156
optional(const optional &other)
Copy constructor.
Definition: optional.h:130
void emplace(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Definition: optional.h:489
Definition: alignment.h:210
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
exception(string_type reason_, string_type file_, numeric_type line_)
Constructor.
Definition: exception.h:67
Definition: exception.h:47
Definition: optional.h:76
Definition: optional.h:90
Definition: absolute.h:37
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:633
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:645
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:594
etl::optional< typename etl::decay< T >::type > make_optional(T &value)
Make an optional.
Definition: optional.h:837
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:582
const nullopt_t nullopt
Definition: optional.h:69
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:606
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:621