17 std::coroutine_handle<> handle;
24 constexpr bool await_ready()
const noexcept {
return false; }
25 template <std::derived_from<CoroPromiseBase> P>
26 constexpr auto await_suspend(std::coroutine_handle<P> h)
noexcept {
27 return h.promise().handle;
29 constexpr void await_resume()
noexcept {}
31 constexpr std::suspend_always initial_suspend() noexcept {
return {}; }
32 constexpr FinalAwaiter final_suspend() noexcept {
return {}; }
34 template <concepts::Awaitable T>
35 constexpr decltype(
auto) await_transform(T&& awaitable) {
36 if constexpr (
requires(T a, ExecutorRef e) { a.setExecutor(e); }) {
37 std::forward<T>(awaitable).setExecutor(exec);
39 return std::forward<T>(awaitable);
42 constexpr ForwardAwaiter<NonNullExecutorRef> await_transform(CurrentExecutor) {
return {exec.value()}; }
44 constexpr YieldAwaiter await_transform(Yield
const&) {
return {exec}; }
46 template <
class R,
class P>
47 constexpr SleepAwaiter await_transform(std::chrono::duration<R, P>
const& dur) {
50 template <
class C,
class D>
51 constexpr SleepAwaiter await_transform(std::chrono::time_point<C, D>
const& time) {
57 using ExpectedResult = std::conditional_t<concepts::IsLeviExpected<T>, T, Expected<T>>;
59 std::optional<ExpectedResult> res{};
64 void return_value(V&& value)
noexcept(std::is_nothrow_constructible_v<T, V>)
65 requires(std::is_constructible_v<T, V>)
67 res.emplace(std::forward<V>(value));
69 void unhandled_exception()
noexcept { res.emplace(makeExceptionError()); }
73 constexpr ExpectedResult& result()
noexcept {
return *res; }
75 constexpr ExpectedResult
const& result()
const noexcept {
return *res; }