20 template<
typename L,
typename R,
typename... Args>
21 struct std::coroutine_traits<
LC::Util::Either<L, R>, Args...>
27 std::optional<EitherType> Ret_ {};
28 std::exception_ptr Exc_ {};
39 : Promise_ { promise }
41 promise.Wrapper_ =
this;
45 : State_ { std::move (other.State_) }
46 , Promise_ { other.Promise_ }
48 Promise_.Wrapper_ =
this;
51 Wrapper (
const Wrapper&) =
delete;
52 Wrapper& operator= (
const Wrapper&) =
delete;
53 Wrapper& operator= (Wrapper&&) =
delete;
61 std::rethrow_exception (State_.Exc_);
65 return std::move (*State_.Ret_);
74 constexpr
static bool IsVoid =
false;
76 Wrapper *Wrapper_ =
nullptr;
78 template<
typename U = R>
81 Wrapper_->State_.Ret_.emplace (std::forward<U> (val));
86 Wrapper_->State_.Ret_.emplace (std::move (val));
91 Wrapper_->State_.Exc_ = std::current_exception ();
96 return Wrapper { *
this };
102 return SimpleAwaiter<T> { std::forward<T> (either) };
110 constexpr
static auto IsOwning = !std::is_lvalue_reference_v<T>;
111 using R_t = std::decay_t<T>::R_t;
115 return Either_.IsRight ();
121 handle.promise ().Wrapper_->State_.Ret_.emplace (std::forward_like<T> (Either_.GetLeft ()));
127 return std::forward_like<T> (Either_.GetRight ());
void await_suspend(std::coroutine_handle< promise_type > handle)
Wrapper(Wrapper &&other) noexcept
Wrapper(promise_type &promise)
auto await_transform(T &&either) const
std::conditional_t< IsOwning, R_t, const R_t & > await_resume()
void return_value(U &&val)
bool await_ready() const noexcept
std::decay_t< T >::R_t R_t
void return_value(LC::Util::Left< L > &&val)
auto Tup2 &&tup2 noexcept
constexpr std::suspend_never final_suspend() const noexcept
Wrapper get_return_object()
constexpr std::suspend_never initial_suspend() const noexcept
void unhandled_exception()