20#ifndef RIPPLE_BASICS_EXPECTED_H_INCLUDED
21#define RIPPLE_BASICS_EXPECTED_H_INCLUDED
23#include <xrpl/basics/contract.h>
25#include <boost/outcome.hpp>
57 if (!base::_has_value(std::forward<Impl>(self)))
58 Throw<bad_expected_access>();
65 if (!base::_has_error(std::forward<Impl>(self)))
66 Throw<bad_expected_access>();
73 if (!base::_has_exception(std::forward<Impl>(self)))
74 Throw<bad_expected_access>();
113 return std::move(
val_);
119 return std::move(
val_);
127template <
typename E, std::
size_t N>
131template <
class T,
class E>
133 :
private boost::outcome_v2::result<T, E, detail::throw_policy>
135 using Base = boost::outcome_v2::result<T, E, detail::throw_policy>;
138 template <
typename U>
139 requires std::convertible_to<U, T>
141 :
Base(
boost::outcome_v2::in_place_type_t<T>{}, std::forward<U>(r))
145 template <
typename U>
146 requires std::convertible_to<U, E> && (!std::is_reference_v<U>)
148 :
Base(boost::outcome_v2::in_place_type_t<E>{}, std::move(e.
value()))
155 return Base::has_value();
161 return Base::value();
167 return Base::value();
173 return Base::error();
179 return Base::error();
183 operator bool()
const
191 [[nodiscard]]
constexpr T&
194 return this->value();
197 [[nodiscard]]
constexpr T
const&
200 return this->value();
203 [[nodiscard]]
constexpr T*
206 return &this->value();
209 [[nodiscard]]
constexpr T
const*
212 return &this->value();
220 :
private boost::outcome_v2::result<void, E, detail::throw_policy>
222 using Base = boost::outcome_v2::result<void, E, detail::throw_policy>;
231 template <
typename U>
232 requires std::convertible_to<U, E> && (!std::is_reference_v<U>)
240 return Base::error();
246 return Base::error();
250 operator bool()
const
252 return Base::has_value();
constexpr E const & error() const
constexpr Expected(Unexpected< U > e)
boost::outcome_v2::result< void, E, detail::throw_policy > Base
constexpr T const * operator->() const
constexpr T const & value() const
constexpr bool has_value() const
constexpr T const & operator*() const
constexpr E const & error() const
constexpr Expected(Unexpected< U > e)
boost::outcome_v2::result< T, E, detail::throw_policy > Base
constexpr T & operator*()
constexpr Expected(U &&r)
constexpr T * operator->()
constexpr E && value() &&
constexpr const E & value() const &
constexpr Unexpected(E const &e)
constexpr const E && value() const &&
constexpr Unexpected(E &&e)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Expected is an approximation of std::expected (hoped for in C++23)
static constexpr void wide_exception_check(Impl &&self)
static constexpr void wide_value_check(Impl &&self)
static constexpr void wide_error_check(Impl &&self)