10USERVER_NAMESPACE_BEGIN
18 using std::exception::exception;
20 explicit bad_expected_access(
const std::string& message) : message_{message} {}
22 const char* what()
const noexcept override {
return message_.c_str(); }
31 unexpected(
const E& error);
32 unexpected(E&& error);
34 template <
class... Args>
35 unexpected(Args&&... args);
37 template <
class U,
class... Args>
38 unexpected(std::initializer_list<U> il, Args&&... args);
41 const E& error()
const noexcept;
53template <
class S,
class E>
56 constexpr expected()
noexcept(std::is_void_v<S>);
57 expected(
const S& success);
58 expected(S&& success);
62 template <
class G,
typename = std::enable_if_t<std::is_convertible_v<G, E>>>
65 template <
class G,
typename = std::enable_if_t<std::is_convertible_v<G, E>>>
80 const S&
value()
const&;
88 const E&
error()
const;
95unexpected<E>::unexpected(
const E& error) : value_{error} {}
98unexpected<E>::unexpected(E&& error) : value_{std::forward<E>(error)} {}
101template <
class... Args>
102unexpected<E>::unexpected(Args&&... args) : value_(std::forward<Args>(args)...) {}
105template <
class U,
class... Args>
106unexpected<E>::unexpected(std::initializer_list<U> il, Args&&... args) : value_(il, std::forward<Args>(args)...) {}
114const E&
unexpected<E>::error()
const noexcept {
118template <
class S,
class E>
119constexpr expected<S, E>::expected()
noexcept(std::is_void_v<S>) : data_(std::in_place_index<0>) {}
121template <
class S,
class E>
122expected<S, E>::expected(
const S& success) : data_(success) {}
124template <
class S,
class E>
125expected<S, E>::expected(S&& success) : data_(std::forward<S>(success)) {}
127template <
class S,
class E>
130template <
class S,
class E>
133template <
class S,
class E>
134template <
class G,
typename>
137template <
class S,
class E>
138template <
class G,
typename>
141template <
class S,
class E>
143 return std::holds_alternative<S>(data_);
146template <
class S,
class E>
148 S* result = std::get_if<S>(&data_);
149 if (result ==
nullptr) {
155template <
class S,
class E>
157 return std::move(value());
160template <
class S,
class E>
162 const S* result = std::get_if<S>(&data_);
163 if (result ==
nullptr) {
169template <
class S,
class E>
171 auto* result = std::get_if<
unexpected<E>>(&data_);
172 if (result ==
nullptr) {
175 return result->error();
178template <
class S,
class E>
180 const auto* result = std::get_if<
unexpected<E>>(&data_);
181 if (result ==
nullptr) {
184 return result->error();