M5Utility 0.0.2 git rev:5c1a751
Loading...
Searching...
No Matches
m5::stl::optional< T > Class Template Reference

#include <optional.hpp>

Inheritance diagram for m5::stl::optional< T >:
m5::stl::detail::optional_move_assign_base< T, bool > m5::stl::detail::optional_delete_ctor_base< T, EnableCopy, EnableMove > m5::stl::detail::optional_delete_assign_base< T, EnableCopy, EnableMove >

Public Types

using value_type = T
 

Public Member Functions

template<class F >
TL_OPTIONAL_11_CONSTEXPR detail::invoke_result_t< F, T & > and_then (F &&f) &
 
template<class F >
TL_OPTIONAL_11_CONSTEXPR detail::invoke_result_t< F, T && > and_then (F &&f) &&
 
template<class F >
constexpr detail::invoke_result_t< F, const T & > and_then (F &&f) const &
 
template<class F >
constexpr detail::invoke_result_t< F, const T && > and_then (F &&f) const &&
 
template<class F >
TL_OPTIONAL_11_CONSTEXPR decltype(optional_map_impl(std::declval< optional & >(), std::declval< F && >())) map (F &&f) &
 Carries out some operation on the stored object if there is one.
 
template<class F >
TL_OPTIONAL_11_CONSTEXPR decltype(optional_map_impl(std::declval< optional && >(), std::declval< F && >())) map (F &&f) &&
 
template<class F >
constexpr decltype(optional_map_impl(std::declval< const optional & >(), std::declval< F && >())) map (F &&f) const &
 
template<class F >
constexpr decltype(optional_map_impl(std::declval< const optional && >(), std::declval< F && >())) map (F &&f) const &&
 
template<class F >
TL_OPTIONAL_11_CONSTEXPR decltype(optional_map_impl(std::declval< optional & >(), std::declval< F && >())) transform (F &&f) &
 Carries out some operation on the stored object if there is one.
 
template<class F >
TL_OPTIONAL_11_CONSTEXPR decltype(optional_map_impl(std::declval< optional && >(), std::declval< F && >())) transform (F &&f) &&
 
template<class F >
constexpr decltype(optional_map_impl(std::declval< const optional & >(), std::declval< F && >())) transform (F &&f) const &
 
template<class F >
constexpr decltype(optional_map_impl(std::declval< const optional && >(), std::declval< F && >())) transform (F &&f) const &&
 
template<class F , detail::enable_if_ret_void< F > * = nullptr>
optional< T > TL_OPTIONAL_11_CONSTEXPR or_else (F &&f) &
 Calls f if the optional is empty.
 
template<class F , detail::disable_if_ret_void< F > * = nullptr>
optional< T > TL_OPTIONAL_11_CONSTEXPR or_else (F &&f) &
 
template<class F , detail::enable_if_ret_void< F > * = nullptr>
optional< T > or_else (F &&f) &&
 
template<class F , detail::disable_if_ret_void< F > * = nullptr>
optional< T > TL_OPTIONAL_11_CONSTEXPR or_else (F &&f) &&
 
template<class F , detail::enable_if_ret_void< F > * = nullptr>
optional< T > or_else (F &&f) const &
 
template<class F , detail::disable_if_ret_void< F > * = nullptr>
optional< T > TL_OPTIONAL_11_CONSTEXPR or_else (F &&f) const &
 
template<class F , detail::enable_if_ret_void< F > * = nullptr>
optional< T > or_else (F &&f) const &&
 
template<class F , detail::disable_if_ret_void< F > * = nullptr>
optional< T > or_else (F &&f) const &&
 
template<class F , class U >
map_or (F &&f, U &&u) &
 Maps the stored value with f if there is one, otherwise returns u.
 
template<class F , class U >
map_or (F &&f, U &&u) &&
 
template<class F , class U >
map_or (F &&f, U &&u) const &
 
template<class F , class U >
map_or (F &&f, U &&u) const &&
 
template<class F , class U >
detail::invoke_result_t< U > map_or_else (F &&f, U &&u) &
 
template<class F , class U >
detail::invoke_result_t< U > map_or_else (F &&f, U &&u) &&
 
template<class F , class U >
detail::invoke_result_t< U > map_or_else (F &&f, U &&u) const &
 
template<class F , class U >
detail::invoke_result_t< U > map_or_else (F &&f, U &&u) const &&
 
template<class U >
constexpr optional< typename std::decay< U >::type > conjunction (U &&u) const
 Returns u if *this has a value, otherwise an empty optional.
 
TL_OPTIONAL_11_CONSTEXPR optional disjunction (const optional &rhs) &
 Returns rhs if *this is empty, otherwise the current value.
 
constexpr optional disjunction (const optional &rhs) const &
 
TL_OPTIONAL_11_CONSTEXPR optional disjunction (const optional &rhs) &&
 
constexpr optional disjunction (const optional &rhs) const &&
 
TL_OPTIONAL_11_CONSTEXPR optional disjunction (optional &&rhs) &
 
constexpr optional disjunction (optional &&rhs) const &
 
TL_OPTIONAL_11_CONSTEXPR optional disjunction (optional &&rhs) &&
 
constexpr optional disjunction (optional &&rhs) const &&
 
optional take ()
 Takes the value out of the optional, leaving it empty.
 
constexpr optional () noexcept=default
 Constructs an optional that does not contain a value.
 
constexpr optional (nullopt_t) noexcept
 
TL_OPTIONAL_11_CONSTEXPR optional (const optional &rhs)=default
 
TL_OPTIONAL_11_CONSTEXPR optional (optional &&rhs)=default
 
template<class... Args>
constexpr optional (detail::enable_if_t< std::is_constructible< T, Args... >::value, in_place_t >, Args &&...args)
 Constructs the stored value in-place using the given arguments.
 
template<class U , class... Args>
TL_OPTIONAL_11_CONSTEXPR optional (detail::enable_if_t< std::is_constructible< T, std::initializer_list< U > &, Args &&... >::value, in_place_t >, std::initializer_list< U > il, Args &&...args)
 
template<class U = T, detail::enable_if_t< std::is_convertible< U &&, T >::value > * = nullptr, detail::enable_forward_value< T, U > * = nullptr>
constexpr optional (U &&u)
 Constructs the stored value with u.
 
template<class U = T, detail::enable_if_t<!std::is_convertible< U &&, T >::value > * = nullptr, detail::enable_forward_value< T, U > * = nullptr>
constexpr optional (U &&u)
 
template<class U , detail::enable_from_other< T, U, const U & > * = nullptr, detail::enable_if_t< std::is_convertible< const U &, T >::value > * = nullptr>
 optional (const optional< U > &rhs)
 Converting copy constructor.
 
template<class U , detail::enable_from_other< T, U, const U & > * = nullptr, detail::enable_if_t<!std::is_convertible< const U &, T >::value > * = nullptr>
 optional (const optional< U > &rhs)
 
template<class U , detail::enable_from_other< T, U, U && > * = nullptr, detail::enable_if_t< std::is_convertible< U &&, T >::value > * = nullptr>
 optional (optional< U > &&rhs)
 Converting move constructor.
 
template<class U , detail::enable_from_other< T, U, U && > * = nullptr, detail::enable_if_t<!std::is_convertible< U &&, T >::value > * = nullptr>
 optional (optional< U > &&rhs)
 
 ~optional ()=default
 Destroys the stored value if there is one.
 
optionaloperator= (nullopt_t) noexcept
 
optionaloperator= (const optional &rhs)=default
 
optionaloperator= (optional &&rhs)=default
 
template<class U = T, detail::enable_assign_forward< T, U > * = nullptr>
optionaloperator= (U &&u)
 
template<class U , detail::enable_assign_from_other< T, U, const U & > * = nullptr>
optionaloperator= (const optional< U > &rhs)
 
template<class U , detail::enable_assign_from_other< T, U, U > * = nullptr>
optionaloperator= (optional< U > &&rhs)
 
template<class... Args>
T & emplace (Args &&...args)
 
template<class U , class... Args>
detail::enable_if_t< std::is_constructible< T, std::initializer_list< U > &, Args &&... >::value, T & > emplace (std::initializer_list< U > il, Args &&...args)
 
void swap (optional &rhs) noexcept(std::is_nothrow_move_constructible< T >::value &&detail::is_nothrow_swappable< T >::value)
 
constexpr const T * operator-> () const
 Returns a pointer to the stored value.
 
TL_OPTIONAL_11_CONSTEXPR T * operator-> ()
 
TL_OPTIONAL_11_CONSTEXPR T & operator* () &
 Returns the stored value.
 
constexpr const T & operator* () const &
 
TL_OPTIONAL_11_CONSTEXPR T && operator* () &&
 
constexpr const T && operator* () const &&
 
constexpr bool has_value () const noexcept
 Returns whether or not the optional has a value.
 
constexpr operator bool () const noexcept
 
TL_OPTIONAL_11_CONSTEXPR T & value () &
 Returns the contained value if there is one, otherwise throws bad_optional_access.
 
TL_OPTIONAL_11_CONSTEXPR const T & value () const &
 
TL_OPTIONAL_11_CONSTEXPR T && value () &&
 
TL_OPTIONAL_11_CONSTEXPR const T && value () const &&
 
template<class U >
constexpr T value_or (U &&u) const &
 Returns the stored value if there is one, otherwise returns u
 
template<class U >
TL_OPTIONAL_11_CONSTEXPR T value_or (U &&u) &&
 
void reset () noexcept
 Destroys the stored value if one exists, making the optional empty.
 

Detailed Description

template<class T>
class m5::stl::optional< T >

An optional object is an object that contains the storage for another object and manages the lifetime of this contained object, if any. The contained object may be initialized after the optional object has been initialized, and may be destroyed before the optional object has been destroyed. The initialization state of the contained object is tracked by the optional object.

Constructor & Destructor Documentation

◆ optional() [1/2]

template<class T >
TL_OPTIONAL_11_CONSTEXPR m5::stl::optional< T >::optional ( const optional< T > & rhs)
default

Copy constructor

If rhs contains a value, the stored value is direct-initialized with it. Otherwise, the constructed optional is empty.

◆ optional() [2/2]

template<class T >
TL_OPTIONAL_11_CONSTEXPR m5::stl::optional< T >::optional ( optional< T > && rhs)
default

Move constructor

If rhs contains a value, the stored value is direct-initialized with it. Otherwise, the constructed optional is empty.

Member Function Documentation

◆ and_then()

template<class T >
template<class F >
TL_OPTIONAL_11_CONSTEXPR detail::invoke_result_t< F, T & > m5::stl::optional< T >::and_then ( F && f) &
inline

Carries out some operation which returns an optional on the stored object if there is one.

◆ emplace()

template<class T >
template<class... Args>
T & m5::stl::optional< T >::emplace ( Args &&... args)
inline

Constructs the value in-place, destroying the current one if there is one.

◆ map_or_else()

template<class T >
template<class F , class U >
detail::invoke_result_t< U > m5::stl::optional< T >::map_or_else ( F && f,
U && u ) &
inline

Maps the stored value with f if there is one, otherwise calls u and returns the result.

◆ operator=() [1/6]

template<class T >
optional & m5::stl::optional< T >::operator= ( const optional< T > & rhs)
default

Copy assignment.

Copies the value from rhs if there is one. Otherwise resets the stored value in *this.

◆ operator=() [2/6]

template<class T >
template<class U , detail::enable_assign_from_other< T, U, const U & > * = nullptr>
optional & m5::stl::optional< T >::operator= ( const optional< U > & rhs)
inline

Converting copy assignment operator.

Copies the value from rhs if there is one. Otherwise resets the stored value in *this.

◆ operator=() [3/6]

template<class T >
optional & m5::stl::optional< T >::operator= ( nullopt_t )
inlinenoexcept

Assignment to empty.

Destroys the current value if there is one.

◆ operator=() [4/6]

template<class T >
optional & m5::stl::optional< T >::operator= ( optional< T > && rhs)
default

Move assignment.

Moves the value from rhs if there is one. Otherwise resets the stored value in *this.

◆ operator=() [5/6]

template<class T >
template<class U , detail::enable_assign_from_other< T, U, U > * = nullptr>
optional & m5::stl::optional< T >::operator= ( optional< U > && rhs)
inline

Converting move assignment operator.

Moves the value from rhs if there is one. Otherwise resets the stored value in *this.

◆ operator=() [6/6]

template<class T >
template<class U = T, detail::enable_assign_forward< T, U > * = nullptr>
optional & m5::stl::optional< T >::operator= ( U && u)
inline

Assigns the stored value from u, destroying the old value if there was one.

◆ swap()

template<class T >
void m5::stl::optional< T >::swap ( optional< T > & rhs)
inlinenoexcept

Swaps this optional with the other.

If neither optionals have a value, nothing happens. If both have a value, the values are swapped. If one has a value, it is moved to the other and the movee is left valueless.