20template<
typename L,
typename R,
typename... Args>
21struct std::coroutine_traits<
LC::Util::Either<L, R>, Args...>
27 std::optional<EitherType>
Ret_ {};
28 std::exception_ptr
Exc_ {};
45 :
State_ { std::move (other.State_) }
46 , Promise_ { other.Promise_ }
61 std::rethrow_exception (
State_.Exc_);
65 return std::move (*
State_.Ret_);
72 constexpr std::suspend_never
final_suspend () const noexcept {
return {}; }
74 constexpr static bool IsVoid =
false;
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 ();
110 constexpr static auto IsOwning = !std::is_lvalue_reference_v<T>;
111 using R_t = std::decay_t<T>::R_t;
121 handle.promise ().Wrapper_->State_.Ret_.emplace (std::forward_like<T> (
Either_.GetLeft ()));
127 return std::forward_like<T> (
Either_.GetRight ());
std::conditional_t< IsOwning, R_t, const R_t & > await_resume()
void await_suspend(std::coroutine_handle< promise_type > handle)
bool await_ready() const noexcept
std::decay_t< T >::R_t R_t
static constexpr auto IsOwning
std::optional< EitherType > Ret_
Wrapper(promise_type &promise)
Wrapper(const Wrapper &)=delete
Wrapper(Wrapper &&other) noexcept
void unhandled_exception()
constexpr std::suspend_never final_suspend() const noexcept
auto await_transform(T &&either) const
Wrapper get_return_object()
static constexpr bool IsVoid
void return_value(U &&val)
constexpr std::suspend_never initial_suspend() const noexcept
void return_value(LC::Util::Left< L > &&val)
LC::Util::Either< L, R > EitherType