7struct CoroTaskAwaiter {
8 using Handle = std::coroutine_handle<CoroPromise<T>>;
10 using ExpectedResult =
typename CoroPromise<T>::ExpectedResult;
14 CoroTaskAwaiter(CoroTaskAwaiter
const& other) =
delete;
15 CoroTaskAwaiter& operator=(CoroTaskAwaiter
const& other) =
delete;
17 constexpr CoroTaskAwaiter(CoroTaskAwaiter&& other) noexcept : handle(std::exchange(other.handle,
nullptr)) {}
19 constexpr CoroTaskAwaiter& operator=(CoroTaskAwaiter&& other)
noexcept {
20 std::swap(handle, other.handle);
24 constexpr CoroTaskAwaiter(Handle h) noexcept : handle(h) {}
26 constexpr ~CoroTaskAwaiter() {
28 std::exchange(handle,
nullptr).destroy();
31 constexpr bool await_ready()
const noexcept {
return false; }
33 template <std::derived_from<CoroPromiseBase> P>
34 void await_suspend(std::coroutine_handle<P> h) {
35 auto& promise = handle.promise();
37 promise.local = h.promise().local;
38 promise.exec->execute(handle);
41 constexpr ExpectedResult getResult()
noexcept {
42 ExpectedResult ret = std::move(handle.promise().result());
43 std::exchange(handle,
nullptr).destroy();