26 new (m_storage) T(val);
27 m_value =
reinterpret_cast<T *
>(m_storage);
32 new (m_storage) T(std::forward<T>(val));
33 m_value =
reinterpret_cast<T *
>(m_storage);
49 typename std::enable_if<
56 *m_value = std::forward<U>(u);
60 new (m_storage) T(std::forward<U>(u));
61 m_value =
reinterpret_cast<T *
>(m_storage);
70 new (m_storage) T(*other.m_value);
71 m_value =
reinterpret_cast<T *
>(m_storage);
83 new (m_storage) T(std::forward<T>(*other.m_value));
84 m_value =
reinterpret_cast<T *
>(m_storage);
94 new (m_storage) T(std::forward<Args>(args)...);
95 m_value =
reinterpret_cast<T *
>(m_storage);
104 template <
typename... Args> T &
emplace(Args &&...args)
108 new (m_storage) T(std::forward<Args>(args)...);
109 m_value =
reinterpret_cast<T *
>(m_storage);
118 const T &&
operator*() const && {
return std::move(*m_value); }
121 explicit operator bool() const noexcept {
return m_value !=
nullptr; }
122 bool has_value() const noexcept {
return m_value !=
nullptr; }
125 const T &
value() const & {
return *m_value; }
127 T &&
value() && {
return std::move(*m_value); }
128 const T &&
value() const && {
return std::move(*m_value); }
140 template <
typename Op>
Optional &assign(Op &&other)
145 using U =
typename std::conditional<
146 std::is_const<typename std::remove_reference<Op>::type>
::value,
147 const typename std::decay<Op>::type::ValueType &,
148 typename std::decay<Op>::type::ValueType>::type;
150 if ((
void *)
this == (
void *)&other)
159 if (other.has_value())
161 *m_value = std::forward<U>(other.value());
172 if (other.has_value())
174 new (m_storage) T(std::forward<U>(other.value()));
175 m_value =
reinterpret_cast<T *
>(m_storage);
181 alignas(T)
char m_storage[
sizeof(T)];
T * operator->()
Definition: Optional.h:115
const T & value() const &
Definition: Optional.h:125
Optional & operator=(U &&u)
Definition: Optional.h:52
Optional< T > & operator=(const Optional &other)
Definition: Optional.h:98
Optional()
Definition: Optional.h:23
~Optional()
Definition: Optional.h:36
bool has_value() const noexcept
Definition: Optional.h:122
T & value()&
Definition: Optional.h:124
Optional< T > & operator=(const Optional< U > &other)
Definition: Optional.h:100
uint64_t ValueType
Definition: Optional.h:21
T && operator*()&&
Definition: Optional.h:119
Optional(const Optional< T > &other)
Definition: Optional.h:66
Optional< T > & operator=(Optional< U > &&other)
Definition: Optional.h:102
Optional(Aws::Crt::InPlaceT, Args &&...args)
Definition: Optional.h:92
T & operator*()&
Definition: Optional.h:117
const T && operator*() const &&
Definition: Optional.h:118
T && value()&&
Definition: Optional.h:127
Definition: Optional.h:18
Optional(T &&val)
Definition: Optional.h:30
T & emplace(Args &&...args)
Definition: Optional.h:104
void reset()
Definition: Optional.h:130
const T & operator*() const &
Definition: Optional.h:116
const T && value() const &&
Definition: Optional.h:128
Optional(const T &val)
Definition: Optional.h:24
Definition: Allocator.h:10
const T * operator->() const
Definition: Optional.h:114
Optional(Optional< T > &&other)
Definition: Optional.h:79
Definition: TypeTraits.h:19