27 template<
typename Opt,
typename From,
typename To>
61 if (other.has_value()) {
69 if (other.has_value()) {
78 if (other.has_value()) {
87 if (other.has_value()) {
92 template<
typename... Args>
95 emplace(util::forward<Args>(args)...);
98 template<
typename U,
typename... Args>
101 emplace(list, util::forward<Args>(args)...);
104 template<
typename U = T>
123 if (other.has_value()) {
130 if (other.has_value()) {
136 template<
typename U = T>
147 if (other.has_value()) {
156 if (other.has_value()) {
164 constexpr explicit operator bool()
const {
return has_value(); }
177 constexpr auto operator*() && ->
decltype(
auto) {
return util::move(*this).value(); }
178 constexpr auto operator*() const&& -> decltype(auto) {
return util::move(*this).value(); }
180 constexpr auto value() & ->
decltype(
auto) {
184 constexpr auto value() const& -> decltype(auto) {
188 constexpr auto value() && ->
decltype(
auto) {
192 constexpr auto value() const&& -> decltype(auto) {
197 template<concepts::ConvertibleTo<T> U = T>
199 constexpr auto value_or(U&& fallback)
const& -> T {
200 return has_value() ?
value() :
static_cast<T
>(util::forward<U>(fallback));
203 template<concepts::ConvertibleTo<T> U = T>
205 return has_value() ? util::move(*this).value() :
static_cast<T
>(util::forward<U>(fallback));
213 return util::addressof(
value());
220 return util::addressof(
value());
227 return util::addressof(
value()) + 1;
234 return util::addressof(
value()) + 1;
278 template<
typename... Args>
279 constexpr auto emplace(Args&&... args) ->
decltype(
auto) {
281 set_value(m_storage, util::forward<Args>(args)...);
289 if (a.has_value() && b.has_value()) {
291 }
else if (a.has_value()) {
294 }
else if (b.has_value()) {
301 template<concepts::DecaySameAs<Optional> Self, concepts::Invocable<meta::Like<Self, Value>> F,
302 typename R = meta::InvokeResult<F, meta::Like<Self, Value>>>
305 if (self.has_value()) {
311 template<concepts::DecaySameAs<Optional> Self, concepts::Invocable<meta::Like<Self, Value>> F,
312 typename R = meta::UnwrapRefDecay<meta::InvokeResult<F, meta::Like<Self, Value>>>>
314 if (self.has_value()) {
327 template<concepts::DecaySameAs<Optional> Self, concepts::InvocableTo<Optional> F>
330 return self.has_value() ? util::forward<Self>(self) :
function::invoke(util::forward<F>(f));
336template<
typename T, concepts::EqualityComparableWith<T> U>
338 return (!a && !b) || (a && b && *a == *b);
346template<
typename T,
typename U>
348constexpr auto operator==(
Optional<T> const& a, U
const& b) ->
bool {
349 return a.has_value() && *a == b;
352template<
typename T, concepts::ThreeWayComparableWith<T> U>
355 return types::strong_ordering::equal;
357 if (
auto result = a.has_value() <=> b.has_value(); result != 0) {
365 return a.has_value() <=>
false;
368template<
typename T,
typename U>
371 if (!a.has_value()) {
372 return types::strong_ordering::less;
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition optional_forward_declaration.h:5
constexpr ~Optional()=default
constexpr ~Optional()
Definition optional.h:110
constexpr auto operator*() &&-> decltype(auto)
Definition optional.h:177
constexpr auto operator->() -> Pointer
Definition optional.h:172
constexpr auto value_or(U &&fallback) const &-> T
Definition optional.h:199
constexpr auto operator*() &-> decltype(auto)
Definition optional.h:175
constexpr auto value() &&-> decltype(auto)
Definition optional.h:188
constexpr auto size() const -> types::size_t
Definition optional.h:238
constexpr auto begin() const -> ConstPointer
Definition optional.h:216
constexpr auto data() const -> ConstPointer
Definition optional.h:241
constexpr auto operator*() const &&-> decltype(auto)
Definition optional.h:178
constexpr auto end() -> Pointer
Definition optional.h:223
constexpr auto value() const &&-> decltype(auto)
Definition optional.h:192
constexpr auto front() -> Optional< Reference >
Definition optional.h:243
decltype(get_value(util::declval< Storage & >())) Reference
Definition optional.h:166
constexpr auto operator=(Optional &&) -> Optional &=default
decltype(get_value(util::declval< Storage const & >())) ConstReference
Definition optional.h:167
constexpr friend auto tag_invoke(types::Tag< function::monad::fail >, Self &&self, F &&f) -> Optional
Definition optional.h:329
constexpr friend auto tag_invoke(types::Tag< function::monad::fmap >, Self &&self, F &&f) -> Optional< R >
Definition optional.h:313
constexpr auto begin() -> Pointer
Definition optional.h:209
constexpr auto operator[](types::ssize_t index) -> Reference
Definition optional.h:259
constexpr friend auto tag_invoke(types::Tag< function::monad::bind >, Self &&self, F &&f) -> R
Definition optional.h:304
constexpr Optional(Optional &&other)
Definition optional.h:66
constexpr auto operator*() const &-> decltype(auto)
Definition optional.h:176
constexpr Optional(types::InPlace, std::initializer_list< U > list, Args &&... args)
Definition optional.h:100
constexpr friend void tag_invoke(types::Tag< util::swap >, Optional &a, Optional &b)
Definition optional.h:286
constexpr auto value() const &-> decltype(auto)
Definition optional.h:184
decltype(util::addressof(util::declval< Reference >())) Pointer
Definition optional.h:169
constexpr Optional(Optional const &)=default
constexpr auto data() -> Pointer
Definition optional.h:240
decltype(util::addressof(util::declval< ConstReference >())) ConstPointer
Definition optional.h:170
constexpr auto operator=(Optional const &other) -> Optional &requires(concepts::Copyable< T > &&!concepts::TriviallyCopyAssignable< Storage >)
Definition optional.h:121
constexpr Optional(Optional const &other)
Definition optional.h:58
T Value
Definition optional.h:45
constexpr auto operator->() const -> ConstPointer
Definition optional.h:173
constexpr auto operator=(Optional &&other) -> Optional &requires(!concepts::TriviallyMoveAssignable< Storage >)
Definition optional.h:129
constexpr Optional(NullOpt)
Definition optional.h:48
constexpr auto empty() const -> bool
Definition optional.h:237
constexpr auto operator=(Optional const &) -> Optional &=default
constexpr auto back() const -> Optional< ConstReference >
Definition optional.h:257
constexpr auto at(types::ssize_t index) -> Optional< Reference >
Definition optional.h:262
constexpr auto end() const -> ConstPointer
Definition optional.h:230
constexpr Optional(types::InPlace, Args &&... args)
Definition optional.h:94
constexpr auto operator[](types::ssize_t index) const -> ConstReference
Definition optional.h:260
constexpr auto emplace(Args &&... args) -> decltype(auto)
Definition optional.h:279
constexpr Optional()=default
constexpr auto value_or(U &&fallback) &&-> T
Definition optional.h:204
constexpr void reset()
Definition optional.h:276
constexpr Optional(Optional &&)=default
constexpr auto back() -> Optional< Reference >
Definition optional.h:256
constexpr auto value() &-> decltype(auto)
Definition optional.h:180
constexpr auto front() const -> Optional< ConstReference >
Definition optional.h:249
constexpr auto operator=(NullOpt) -> Optional &
Definition optional.h:116
constexpr auto has_value() const -> bool
Definition optional.h:163
constexpr auto at(types::ssize_t index) const -> Optional< ConstReference >
Definition optional.h:269
Definition operations.h:11
Definition operations.h:99
Definition operations.h:40
Implicit conversion for this test refers to the ability to return a value of function from a type.
Definition operations.h:89
Definition language.h:367
Definition constructible_from_cref_optional.h:8
Definition optional_storage.h:16
Definition any_storable.h:9
constexpr auto invoke
Definition invoke.h:100
ptrdiff_t ssize_t
Definition ssize_t.h:6
constexpr auto in_place
Definition in_place.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr struct di::util::SwapFunction swap
Definition erasure_cast.h:7
constexpr struct di::vocab::SetValueFunction set_value
Optional(T) -> Optional< T >
constexpr auto operator<=>(Optional< T > const &a, Optional< U > const &b) -> meta::CompareThreeWayResult< T, U >
Definition optional.h:353
constexpr auto nullopt
Definition nullopt.h:15
meta::Conditional< OptionalStorage< meta::WrapReference< T >, T >, meta::WrapReference< T >, BasicOptionalStorage< T > > StorageFor
Definition storage_for.h:11
constexpr struct di::vocab::SetNulloptFunction set_nullopt
constexpr auto operator==(StatusCode< T > const &a, StatusCode< U > const &b) -> bool
Definition status_code_equality.h:7
constexpr struct di::vocab::IsNulloptFunction is_nullopt
constexpr auto get_value
Definition get_value.h:15
constexpr auto front
Definition access.h:58
constexpr auto at
Definition access.h:147
constexpr auto begin
Definition begin.h:44