di 0.1.0
Loading...
Searching...
No Matches
di::vocab::Optional< T > Class Template Reference

#include <di/vocab/optional/optional.h>

Inheritance diagram for di::vocab::Optional< T >:
di::meta::EnableView< Optional< T > > di::meta::EnableBorrowedContainer< Optional< T >, concepts::LValueReference< T > > di::function::monad::MonadInterface< Optional< T > >

Public Types

using Value = T
 
using Reference = decltype(get_value(util::declval<Storage&>()))
 
using ConstReference = decltype(get_value(util::declval<Storage const&>()))
 
using Pointer = decltype(util::addressof(util::declval<Reference>()))
 
using ConstPointer = decltype(util::addressof(util::declval<ConstReference>()))
 

Public Member Functions

constexpr Optional ()=default
 
constexpr Optional (NullOpt)
 
constexpr Optional (Optional const &)=default
 
constexpr Optional (Optional &&)=default
 
constexpr auto operator= (Optional const &) -> Optional &=default
 
constexpr auto operator= (Optional &&) -> Optional &=default
 
constexpr ~Optional ()=default
 
constexpr Optional (Optional const &other)
 
constexpr Optional (Optional &&other)
 
template<typename U>
requires (!concepts::SameAs<T, U> && concepts::ConstructibleFrom<T, U const&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
constexpr explicit (!concepts::ImplicitlyConvertibleTo< U const &, T >) Optional(Optional< U > const &other)
 
template<typename U>
requires (!concepts::SameAs<T, U> && concepts::ConstructibleFrom<T, U &&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
constexpr explicit (!detail::OptionalConvertibleToWorkaround< Optional, U &&, T >) Optional(Optional< U > &&other)
 
template<typename... Args>
requires (concepts::ConstructibleFrom<T, Args...>)
constexpr Optional (types::InPlace, Args &&... args)
 
template<typename U, typename... Args>
requires (concepts::ConstructibleFrom<T, std::initializer_list<U>, Args...>)
constexpr Optional (types::InPlace, std::initializer_list< U > list, Args &&... args)
 
template<typename U = T>
requires (!concepts::OneOf<meta::Decay<U>, Optional, types::InPlace> && concepts::ConstructibleFrom<T, U &&>)
constexpr explicit (!detail::OptionalConvertibleToWorkaround< Optional, U &&, T >) Optional(U &&value)
 
constexpr ~Optional ()
 
constexpr auto operator= (NullOpt) -> Optional &
 
constexpr auto operator= (Optional const &other) -> Optional &requires(concepts::Copyable< T > &&!concepts::TriviallyCopyAssignable< Storage >)
 
constexpr auto operator= (Optional &&other) -> Optional &requires(!concepts::TriviallyMoveAssignable< Storage >)
 
template<typename U = T>
requires (concepts::ConstructibleFrom<T, U> && !concepts::SameAs<meta::RemoveCVRef<U>, Optional> && (!concepts::Scalar<T> || !concepts::SameAs<meta::Decay<U>, T>) )
constexpr auto operator= (U &&value) -> Optional &
 
template<typename U>
requires (concepts::ConstructibleFrom<T, U const&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
constexpr auto operator= (Optional< U > const &other) -> Optional &
 
template<typename U>
requires (concepts::ConstructibleFrom<T, U &&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
constexpr auto operator= (Optional< U > &&other) -> Optional &
 
auto clone () const -> Optional requires(concepts::Clonable< T >)
 
constexpr auto has_value () const -> bool
 
constexpr operator bool () const
 
constexpr auto operator-> () -> Pointer
 
constexpr auto operator-> () const -> ConstPointer
 
constexpr auto operator* () &-> decltype(auto)
 
constexpr auto operator* () const &-> decltype(auto)
 
constexpr auto operator* () &&-> decltype(auto)
 
constexpr auto operator* () const &&-> decltype(auto)
 
constexpr auto value () &-> decltype(auto)
 
constexpr auto value () const &-> decltype(auto)
 
constexpr auto value () &&-> decltype(auto)
 
constexpr auto value () const &&-> decltype(auto)
 
template<concepts::ConvertibleTo< T > U = T>
requires (concepts::Copyable<T>)
constexpr auto value_or (U &&fallback) const &-> T
 
template<concepts::ConvertibleTo< T > U = T>
constexpr auto value_or (U &&fallback) &&-> T
 
constexpr auto begin () -> Pointer
 
constexpr auto begin () const -> ConstPointer
 
constexpr auto end () -> Pointer
 
constexpr auto end () const -> ConstPointer
 
constexpr auto empty () const -> bool
 
constexpr auto size () const -> types::size_t
 
constexpr auto data () -> Pointer
 
constexpr auto data () const -> ConstPointer
 
constexpr auto front () -> Optional< Reference >
 
constexpr auto front () const -> Optional< ConstReference >
 
constexpr auto back () -> Optional< Reference >
 
constexpr auto back () const -> Optional< ConstReference >
 
constexpr auto operator[] (types::ssize_t index) -> Reference
 
constexpr auto operator[] (types::ssize_t index) const -> ConstReference
 
constexpr auto at (types::ssize_t index) -> Optional< Reference >
 
constexpr auto at (types::ssize_t index) const -> Optional< ConstReference >
 
constexpr void reset ()
 
template<typename... Args>
constexpr auto emplace (Args &&... args) -> decltype(auto)
 
- Public Member Functions inherited from di::function::monad::MonadInterface< Optional< T > >
constexpr auto transform (F &&function) &-> decltype(auto)
 
constexpr auto transform (F &&function) const &-> decltype(auto)
 
constexpr auto transform (F &&function) &&-> decltype(auto)
 
constexpr auto transform (F &&function) const &&-> decltype(auto)
 
constexpr auto and_then (F &&function) &-> decltype(auto)
 
constexpr auto and_then (F &&function) const &-> decltype(auto)
 
constexpr auto and_then (F &&function) &&-> decltype(auto)
 
constexpr auto and_then (F &&function) const &&-> decltype(auto)
 
constexpr auto or_else (F &&function) &-> decltype(auto)
 
constexpr auto or_else (F &&function) const &-> decltype(auto)
 
constexpr auto or_else (F &&function) &&-> decltype(auto)
 
constexpr auto or_else (F &&function) const &&-> decltype(auto)
 
constexpr auto transform_error (F &&function) &-> decltype(auto)
 
constexpr auto transform_error (F &&function) const &-> decltype(auto)
 
constexpr auto transform_error (F &&function) &&-> decltype(auto)
 
constexpr auto transform_error (F &&function) const &&-> decltype(auto)
 

Friends

constexpr friend void tag_invoke (types::Tag< util::swap >, Optional &a, Optional &b)
 
template<concepts::DecaySameAs< Optional > Self, concepts::Invocable< meta::Like< Self, Value > > F, typename R = meta::InvokeResult<F, meta::Like<Self, Value>>>
requires (concepts::Optional<R>)
constexpr friend auto tag_invoke (types::Tag< function::monad::bind >, Self &&self, F &&f) -> R
 
template<concepts::DecaySameAs< Optional > Self, concepts::Invocable< meta::Like< Self, Value > > F, typename R = meta::UnwrapRefDecay<meta::InvokeResult<F, meta::Like<Self, Value>>>>
constexpr friend auto tag_invoke (types::Tag< function::monad::fmap >, Self &&self, F &&f) -> Optional< R >
 
template<concepts::DecaySameAs< Optional > Self, concepts::InvocableTo< Optional > F>
requires (concepts::ConstructibleFrom<Optional, Self>)
constexpr friend auto tag_invoke (types::Tag< function::monad::fail >, Self &&self, F &&f) -> Optional
 

Member Typedef Documentation

◆ ConstPointer

template<typename T>
using di::vocab::Optional< T >::ConstPointer = decltype(util::addressof(util::declval<ConstReference>()))

◆ ConstReference

template<typename T>
using di::vocab::Optional< T >::ConstReference = decltype(get_value(util::declval<Storage const&>()))

◆ Pointer

template<typename T>
using di::vocab::Optional< T >::Pointer = decltype(util::addressof(util::declval<Reference>()))

◆ Reference

template<typename T>
using di::vocab::Optional< T >::Reference = decltype(get_value(util::declval<Storage&>()))

◆ Value

template<typename T>
using di::vocab::Optional< T >::Value = T

Constructor & Destructor Documentation

◆ Optional() [1/8]

template<typename T>
di::vocab::Optional< T >::Optional ( )
constexprdefault

◆ Optional() [2/8]

template<typename T>
di::vocab::Optional< T >::Optional ( NullOpt )
inlineconstexpr

◆ Optional() [3/8]

template<typename T>
di::vocab::Optional< T >::Optional ( Optional< T > const & )
constexprdefault

◆ Optional() [4/8]

template<typename T>
di::vocab::Optional< T >::Optional ( Optional< T > && )
constexprdefault

◆ ~Optional() [1/2]

template<typename T>
di::vocab::Optional< T >::~Optional ( )
constexprdefault

◆ Optional() [5/8]

template<typename T>
di::vocab::Optional< T >::Optional ( Optional< T > const & other)
inlineconstexpr

◆ Optional() [6/8]

template<typename T>
di::vocab::Optional< T >::Optional ( Optional< T > && other)
inlineconstexpr

◆ Optional() [7/8]

template<typename T>
template<typename... Args>
requires (concepts::ConstructibleFrom<T, Args...>)
di::vocab::Optional< T >::Optional ( types::InPlace ,
Args &&... args )
inlineexplicitconstexpr

◆ Optional() [8/8]

template<typename T>
template<typename U, typename... Args>
requires (concepts::ConstructibleFrom<T, std::initializer_list<U>, Args...>)
di::vocab::Optional< T >::Optional ( types::InPlace ,
std::initializer_list< U > list,
Args &&... args )
inlineexplicitconstexpr

◆ ~Optional() [2/2]

template<typename T>
di::vocab::Optional< T >::~Optional ( )
inlineconstexpr

Member Function Documentation

◆ at() [1/2]

template<typename T>
auto di::vocab::Optional< T >::at ( types::ssize_t index) -> Optional<Reference>
inlineconstexpr

◆ at() [2/2]

template<typename T>
auto di::vocab::Optional< T >::at ( types::ssize_t index) const -> Optional<ConstReference>
inlineconstexpr

◆ back() [1/2]

template<typename T>
auto di::vocab::Optional< T >::back ( ) -> Optional<Reference>
inlineconstexpr

◆ back() [2/2]

template<typename T>
auto di::vocab::Optional< T >::back ( ) const -> Optional<ConstReference>
inlineconstexpr

◆ begin() [1/2]

template<typename T>
auto di::vocab::Optional< T >::begin ( ) -> Pointer
inlineconstexpr

◆ begin() [2/2]

template<typename T>
auto di::vocab::Optional< T >::begin ( ) const -> ConstPointer
inlineconstexpr

◆ clone()

template<typename T>
auto di::vocab::Optional< T >::clone ( ) const -> Optional requires(concepts::Clonable<T>)
inline

◆ data() [1/2]

template<typename T>
auto di::vocab::Optional< T >::data ( ) -> Pointer
inlineconstexpr

◆ data() [2/2]

template<typename T>
auto di::vocab::Optional< T >::data ( ) const -> ConstPointer
inlineconstexpr

◆ emplace()

template<typename T>
template<typename... Args>
auto di::vocab::Optional< T >::emplace ( Args &&... args) -> decltype(auto)
inlineconstexpr

◆ empty()

template<typename T>
auto di::vocab::Optional< T >::empty ( ) const -> bool
inlineconstexpr

◆ end() [1/2]

template<typename T>
auto di::vocab::Optional< T >::end ( ) -> Pointer
inlineconstexpr

◆ end() [2/2]

template<typename T>
auto di::vocab::Optional< T >::end ( ) const -> ConstPointer
inlineconstexpr

◆ explicit() [1/3]

template<typename T>
template<typename U>
requires (!concepts::SameAs<T, U> && concepts::ConstructibleFrom<T, U const&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
di::vocab::Optional< T >::explicit ( !concepts::ImplicitlyConvertibleTo< U const &, T > ) const &
inlineconstexpr

◆ explicit() [2/3]

template<typename T>
template<typename U>
requires (!concepts::SameAs<T, U> && concepts::ConstructibleFrom<T, U &&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
di::vocab::Optional< T >::explicit ( !detail::OptionalConvertibleToWorkaround< Optional< T >, U &&, T > ) &&
inlineconstexpr

◆ explicit() [3/3]

template<typename T>
template<typename U = T>
requires (!concepts::OneOf<meta::Decay<U>, Optional, types::InPlace> && concepts::ConstructibleFrom<T, U &&>)
di::vocab::Optional< T >::explicit ( !detail::OptionalConvertibleToWorkaround< Optional< T >, U &&, T > ) &&
inlineconstexpr

◆ front() [1/2]

template<typename T>
auto di::vocab::Optional< T >::front ( ) -> Optional<Reference>
inlineconstexpr

◆ front() [2/2]

template<typename T>
auto di::vocab::Optional< T >::front ( ) const -> Optional<ConstReference>
inlineconstexpr

◆ has_value()

template<typename T>
auto di::vocab::Optional< T >::has_value ( ) const -> bool
inlineconstexpr

◆ operator bool()

template<typename T>
di::vocab::Optional< T >::operator bool ( ) const
inlineexplicitconstexpr

◆ operator*() [1/4]

template<typename T>
auto di::vocab::Optional< T >::operator* ( ) && -> decltype(auto)
inlineconstexpr

◆ operator*() [2/4]

template<typename T>
auto di::vocab::Optional< T >::operator* ( ) & -> decltype(auto)
inlineconstexpr

◆ operator*() [3/4]

template<typename T>
auto di::vocab::Optional< T >::operator* ( ) const && -> decltype(auto)
inlineconstexpr

◆ operator*() [4/4]

template<typename T>
auto di::vocab::Optional< T >::operator* ( ) const & -> decltype(auto)
inlineconstexpr

◆ operator->() [1/2]

template<typename T>
auto di::vocab::Optional< T >::operator-> ( ) -> Pointer
inlineconstexpr

◆ operator->() [2/2]

template<typename T>
auto di::vocab::Optional< T >::operator-> ( ) const -> ConstPointer
inlineconstexpr

◆ operator=() [1/8]

template<typename T>
auto di::vocab::Optional< T >::operator= ( NullOpt ) -> Optional&
inlineconstexpr

◆ operator=() [2/8]

template<typename T>
auto di::vocab::Optional< T >::operator= ( Optional< T > && ) -> Optional &=default
constexprdefault

◆ operator=() [3/8]

template<typename T>
auto di::vocab::Optional< T >::operator= ( Optional< T > && other) -> Optional& requires(!concepts::TriviallyMoveAssignable<Storage>)
inlineconstexpr

◆ operator=() [4/8]

template<typename T>
auto di::vocab::Optional< T >::operator= ( Optional< T > const & ) -> Optional &=default
constexprdefault

◆ operator=() [5/8]

template<typename T>
auto di::vocab::Optional< T >::operator= ( Optional< T > const & other) -> Optional& requires(concepts::Copyable<T> && !concepts::TriviallyCopyAssignable<Storage>)
inlineconstexpr

◆ operator=() [6/8]

template<typename T>
template<typename U>
requires (concepts::ConstructibleFrom<T, U &&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
auto di::vocab::Optional< T >::operator= ( Optional< U > && other) -> Optional&
inlineconstexpr

◆ operator=() [7/8]

template<typename T>
template<typename U>
requires (concepts::ConstructibleFrom<T, U const&> && !ConstructibleFromCRefOptional<T, Optional<U>>)
auto di::vocab::Optional< T >::operator= ( Optional< U > const & other) -> Optional&
inlineconstexpr

◆ operator=() [8/8]

template<typename T>
template<typename U = T>
requires (concepts::ConstructibleFrom<T, U> && !concepts::SameAs<meta::RemoveCVRef<U>, Optional> && (!concepts::Scalar<T> || !concepts::SameAs<meta::Decay<U>, T>) )
auto di::vocab::Optional< T >::operator= ( U && value) -> Optional&
inlineconstexpr

◆ operator[]() [1/2]

template<typename T>
auto di::vocab::Optional< T >::operator[] ( types::ssize_t index) -> Reference
inlineconstexpr

◆ operator[]() [2/2]

template<typename T>
auto di::vocab::Optional< T >::operator[] ( types::ssize_t index) const -> ConstReference
inlineconstexpr

◆ reset()

template<typename T>
void di::vocab::Optional< T >::reset ( )
inlineconstexpr

◆ size()

template<typename T>
auto di::vocab::Optional< T >::size ( ) const -> types::size_t
inlineconstexpr

◆ value() [1/4]

template<typename T>
auto di::vocab::Optional< T >::value ( ) && -> decltype(auto)
inlineconstexpr

◆ value() [2/4]

template<typename T>
auto di::vocab::Optional< T >::value ( ) & -> decltype(auto)
inlineconstexpr

◆ value() [3/4]

template<typename T>
auto di::vocab::Optional< T >::value ( ) const && -> decltype(auto)
inlineconstexpr

◆ value() [4/4]

template<typename T>
auto di::vocab::Optional< T >::value ( ) const & -> decltype(auto)
inlineconstexpr

◆ value_or() [1/2]

template<typename T>
template<concepts::ConvertibleTo< T > U = T>
auto di::vocab::Optional< T >::value_or ( U && fallback) && -> T
inlineconstexpr

◆ value_or() [2/2]

template<typename T>
template<concepts::ConvertibleTo< T > U = T>
requires (concepts::Copyable<T>)
auto di::vocab::Optional< T >::value_or ( U && fallback) const & -> T
inlineconstexpr

Friends And Related Symbol Documentation

◆ tag_invoke [1/4]

template<typename T>
template<concepts::DecaySameAs< Optional > Self, concepts::Invocable< meta::Like< Self, Value > > F, typename R = meta::InvokeResult<F, meta::Like<Self, Value>>>
requires (concepts::Optional<R>)
friend auto tag_invoke ( types::Tag< function::monad::bind > ,
Self && self,
F && f ) -> R
friend

◆ tag_invoke [2/4]

template<typename T>
template<concepts::DecaySameAs< Optional > Self, concepts::InvocableTo< Optional > F>
requires (concepts::ConstructibleFrom<Optional, Self>)
friend auto tag_invoke ( types::Tag< function::monad::fail > ,
Self && self,
F && f ) -> Optional
friend

◆ tag_invoke [3/4]

template<typename T>
template<concepts::DecaySameAs< Optional > Self, concepts::Invocable< meta::Like< Self, Value > > F, typename R = meta::UnwrapRefDecay<meta::InvokeResult<F, meta::Like<Self, Value>>>>
friend auto tag_invoke ( types::Tag< function::monad::fmap > ,
Self && self,
F && f ) -> Optional<R>
friend

◆ tag_invoke [4/4]

template<typename T>
friend void tag_invoke ( types::Tag< util::swap > ,
Optional< T > & a,
Optional< T > & b )
friend

The documentation for this class was generated from the following file: