37 using HandleT = std::coroutine_handle<PromiseT>;
39 TaskT get_return_object()
noexcept {
41 handle = HandleT::from_promise(*
this);
46 auto initial_suspend()
noexcept {
47 if constexpr (eager)
return std::suspend_never{};
48 if constexpr (!eager)
return std::suspend_always{};
51 auto final_suspend()
noexcept {
54 return std::suspend_always{};
57 void unhandled_exception() {
64 void register_owning_ptr(
PromiseT** ptr) { owning_ptr = ptr; }
66 if (owning_ptr) *owning_ptr =
nullptr;
69 void destroy() { handle.destroy(); }
70 bool done() {
return coro_done; }
75 if (await_mode == AwaitMode::Blocking) subtask->wait();
76 else subtask->resume();
77 if (subtask->done()) subtask.reset();
79 if (!subtask) handle.resume();
82 await_mode = AwaitMode::Blocking;
83 while (!done()) resume();
86 template <Subtaskable U>
88 if constexpr (std::is_base_of_v<SubtaskBase, U>) {
89 subtask = std::make_shared<U>(std::forward<U>(u));
91 subtask = std::make_shared<Subtask<U>>(std::forward<U>(u));
101 auto await_transform(
const std::suspend_always& s) {
103 return std::suspend_always{};
107 bool coro_done =
false;
108 AwaitMode await_mode = AwaitMode::NonBlocking;
109 std::shared_ptr<SubtaskBase> subtask;