17#ifndef LIVEKIT_RESULT_H
18#define LIVEKIT_RESULT_H
42template <
typename T,
typename E>
class [[nodiscard]]
Result {
45 template <
typename U = T,
46 typename = std::enable_if_t<std::is_constructible<T, U &&>::value>>
49 std::variant<T, E>(std::in_place_index<0>, std::forward<U>(value)));
53 template <
typename F = E,
54 typename = std::enable_if_t<std::is_constructible<E, F &&>::value>>
57 std::variant<T, E>(std::in_place_index<1>, std::forward<F>(error)));
61 bool ok() const noexcept {
return storage_.index() == 0; }
65 explicit operator bool() const noexcept {
return ok(); }
70 return std::get<0>(storage_);
74 const T &
value() const & noexcept {
76 return std::get<0>(storage_);
82 return std::get<0>(std::move(storage_));
86 const T &&
value() const && noexcept {
88 return std::get<0>(std::move(storage_));
94 return std::get<1>(storage_);
98 const E &
error() const & noexcept {
100 return std::get<1>(storage_);
106 return std::get<1>(std::move(storage_));
110 const E &&
error() const && noexcept {
112 return std::get<1>(std::move(storage_));
116 explicit Result(std::variant<T, E> storage) : storage_(std::move(storage)) {}
118 std::variant<T, E> storage_;
127template <
typename E>
class [[nodiscard]]
Result<void, E> {
133 template <
typename F = E,
134 typename = std::enable_if_t<std::is_constructible<E, F &&>::value>>
136 return Result(std::optional<E>(std::forward<F>(error)));
140 bool ok() const noexcept {
return !error_.has_value(); }
142 bool has_error() const noexcept {
return error_.has_value(); }
144 explicit operator bool() const noexcept {
return ok(); }
147 void value() const noexcept { assert(ok()); }
164 return std::move(*error_);
168 const E &&
error() const && noexcept {
170 return std::move(*error_);
174 explicit Result(std::optional<E> error) : error_(std::move(error)) {}
176 std::optional<E> error_;
E && error() &&noexcept
Move the error value out. Requires has_error() == true.
Definition result.h:162
static Result failure(F &&error)
Construct a failed result containing an error.
Definition result.h:135
bool has_error() const noexcept
True when the operation failed.
Definition result.h:142
bool ok() const noexcept
True when the operation succeeded.
Definition result.h:140
const E & error() const &noexcept
Access the error value. Requires has_error() == true.
Definition result.h:156
const E && error() const &&noexcept
Move the error value out. Requires has_error() == true.
Definition result.h:168
void value() const noexcept
Validates success in debug builds. Mirrors the value() API shape.
Definition result.h:147
static Result success()
Construct a successful result with no payload.
Definition result.h:130
E & error() &noexcept
Access the error value. Requires has_error() == true.
Definition result.h:150
T && value() &&noexcept
Move the success value out. Requires ok() == true.
Definition result.h:80
E & error() &noexcept
Access the error value. Requires has_error() == true.
Definition result.h:92
T & value() &noexcept
Access the success value. Requires ok() == true.
Definition result.h:68
const T && value() const &&noexcept
Move the success value out. Requires ok() == true.
Definition result.h:86
const E && error() const &&noexcept
Move the error value out. Requires has_error() == true.
Definition result.h:110
static Result failure(F &&error)
Construct a failed result containing an error.
Definition result.h:55
static Result success(U &&value)
Construct a successful result containing a value.
Definition result.h:47
bool ok() const noexcept
True when the result contains a success value.
Definition result.h:61
bool has_error() const noexcept
True when the result contains an error.
Definition result.h:63
E && error() &&noexcept
Move the error value out. Requires has_error() == true.
Definition result.h:104
const E & error() const &noexcept
Access the error value. Requires has_error() == true.
Definition result.h:98
const T & value() const &noexcept
Access the success value. Requires ok() == true.
Definition result.h:74