LeviLamina
Loading...
Searching...
No Matches
CoroTaskAwaiter.h
1#pragma once
2
3#include "ll/api/coro/CoroPromise.h"
4
5namespace ll::coro {
6template <typename T>
8 using Handle = std::coroutine_handle<CoroPromise<T>>;
9
10 using ExpectedResult = typename CoroPromise<T>::ExpectedResult;
11
12 Handle handle;
13
14 CoroTaskAwaiter(CoroTaskAwaiter const& other) = delete;
15 CoroTaskAwaiter& operator=(CoroTaskAwaiter const& other) = delete;
16
17 constexpr CoroTaskAwaiter(CoroTaskAwaiter&& other) noexcept : handle(std::exchange(other.handle, nullptr)) {}
18
19 constexpr CoroTaskAwaiter& operator=(CoroTaskAwaiter&& other) noexcept {
20 std::swap(handle, other.handle);
21 return *this;
22 }
23
24 constexpr CoroTaskAwaiter(Handle h) noexcept : handle(h) {}
25
26 constexpr ~CoroTaskAwaiter() {
27 if (handle) {
28 std::exchange(handle, nullptr).destroy();
29 }
30 }
31 constexpr bool await_ready() const noexcept { return false; }
32
33 template <std::derived_from<CoroPromiseBase> P>
34 void await_suspend(std::coroutine_handle<P> h) {
35 auto& promise = handle.promise();
36 promise.handle = h;
37 promise.local = h.promise().local;
38 promise.exec->execute(handle);
39 }
40
41 constexpr ExpectedResult getResult() noexcept {
42 ExpectedResult ret = std::move(handle.promise().result());
43 std::exchange(handle, nullptr).destroy();
44 return ret;
45 }
46};
47} // namespace ll::coro
Definition CoroTaskAwaiter.h:7