35 using HandleT = std::coroutine_handle<PromiseT>;
37 TaskT get_return_object()
noexcept {
39 handle = HandleT::from_promise(*
this);
44 auto initial_suspend()
noexcept {
45 if constexpr (eager)
return std::suspend_never{};
46 if constexpr (!eager)
return std::suspend_always{};
49 auto final_suspend()
noexcept {
52 return std::suspend_always{};
55 void unhandled_exception() {
62 void register_owning_ptr(
PromiseT** ptr) { owning_ptr = ptr; }
64 if (owning_ptr) *owning_ptr =
nullptr;
67 void destroy() { handle.destroy(); }
68 bool done() {
return coro_done; }
73 if (await_mode == AwaitMode::Blocking) subtask->wait();
74 else subtask->resume();
75 if (subtask->done()) subtask.reset();
77 if (!subtask) handle.resume();
80 await_mode = AwaitMode::Blocking;
81 while (!done()) resume();
84 template <Subtaskable U>
86 if constexpr (std::is_base_of_v<SubtaskBase, U>) {
87 subtask = std::make_shared<U>(std::forward<U>(u));
89 subtask = std::make_shared<Subtask<U>>(std::forward<U>(u));
94 return await_transform(
Request(r));
97 return await_transform(
Request(&r));
99 auto await_transform(
const std::suspend_always& s) {
101 return std::suspend_always{};
105 bool coro_done =
false;
106 AwaitMode await_mode = AwaitMode::NonBlocking;
107 std::shared_ptr<SubtaskBase> subtask;