20#ifndef RIPPLE_BASICS_EXPECTED_H_INCLUDED
21#define RIPPLE_BASICS_EXPECTED_H_INCLUDED
23#include <xrpl/basics/contract.h>
26#pragma clang diagnostic push
27#pragma clang diagnostic ignored "-Wdeprecated"
28#pragma clang diagnostic ignored "-Wdeprecated-declarations"
31#include <boost/outcome.hpp>
34#pragma clang diagnostic pop
65 if (!base::_has_value(std::forward<Impl>(self)))
66 Throw<bad_expected_access>();
73 if (!base::_has_error(std::forward<Impl>(self)))
74 Throw<bad_expected_access>();
81 if (!base::_has_exception(std::forward<Impl>(self)))
82 Throw<bad_expected_access>();
121 return std::move(
val_);
127 return std::move(
val_);
135template <
typename E, std::
size_t N>
139template <
class T,
class E>
141 :
private boost::outcome_v2::result<T, E, detail::throw_policy>
143 using Base = boost::outcome_v2::result<T, E, detail::throw_policy>;
146 template <
typename U>
147 requires std::convertible_to<U, T>
149 :
Base(
boost::outcome_v2::in_place_type_t<T>{}, std::forward<U>(r))
153 template <
typename U>
154 requires std::convertible_to<U, E> && (!std::is_reference_v<U>)
156 :
Base(boost::outcome_v2::in_place_type_t<E>{}, std::move(e.
value()))
163 return Base::has_value();
169 return Base::value();
175 return Base::value();
181 return Base::error();
187 return Base::error();
191 operator bool()
const
199 [[nodiscard]]
constexpr T&
202 return this->value();
205 [[nodiscard]]
constexpr T
const&
208 return this->value();
211 [[nodiscard]]
constexpr T*
214 return &this->value();
217 [[nodiscard]]
constexpr T
const*
220 return &this->value();
228 :
private boost::outcome_v2::result<void, E, detail::throw_policy>
230 using Base = boost::outcome_v2::result<void, E, detail::throw_policy>;
239 template <
typename U>
240 requires std::convertible_to<U, E> && (!std::is_reference_v<U>)
248 return Base::error();
254 return Base::error();
258 operator bool()
const
260 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 Unexpected(E const &e)
constexpr E const && value() const &&
constexpr E const & 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)