48template <
typename T =
void>
51 typedef typename std::conditional<std::is_void<T>::value,
Empty, T>::type
SafeT;
73 bool ret = m_coroutine->m_earlyResume;
74 m_coroutine->m_earlyResume =
false;
77 constexpr void await_suspend(std::coroutine_handle<> h) { m_coroutine->m_suspended =
true; }
104 if (!m_handle)
return;
106 m_earlyResume =
true;
123 if (!m_handle)
return true;
124 bool isDone = m_handle.done();
126 if constexpr (!std::is_void<T>::value) {
127 m_value = eastl::move(m_handle.promise().m_value);
151 return Coroutine<>{eastl::move(std::coroutine_handle<Promise>::from_promise(*
this))};
153 std::suspend_always initial_suspend() {
return {}; }
154 std::suspend_always final_suspend() noexcept {
return {}; }
155 void unhandled_exception() {}
157 auto awaitingCoroutine = m_awaitingCoroutine;
158 if (awaitingCoroutine) {
161 __builtin_coro_resume(awaitingCoroutine);
164 [[no_unique_address]] Empty m_value;
165 void *m_awaitingCoroutine =
nullptr;
167 struct PromiseValue {
168 Coroutine<T> get_return_object() {
169 return Coroutine{eastl::move(std::coroutine_handle<Promise>::from_promise(*
this))};
171 std::suspend_always initial_suspend() {
return {}; }
172 std::suspend_always final_suspend() noexcept {
return {}; }
173 void unhandled_exception() {}
174 void return_value(T &&
value) {
175 m_value = eastl::move(
value);
176 auto awaitingCoroutine = m_awaitingCoroutine;
177 if (awaitingCoroutine) {
180 __builtin_coro_resume(awaitingCoroutine);
184 void *m_awaitingCoroutine =
nullptr;
186 typedef typename std::conditional<std::is_void<T>::value, PromiseVoid, PromiseValue>::type Promise;
187 Coroutine(std::coroutine_handle<Promise> &&handle) : m_handle(eastl::
move(handle)) {}
188 std::coroutine_handle<Promise> m_handle;
189 [[no_unique_address]]
SafeT m_value;
190 void *m_awaitingCoroutine =
nullptr;
191 bool m_suspended =
true;
192 bool m_earlyResume =
false;
198 template <
typename U>
200 auto &promise = m_handle.promise();
201 promise.m_awaitingCoroutine = h.address();
205 SafeT value = eastl::move(m_handle.promise().m_value);
constexpr uint32_t move(Reg tgt, Reg src)
Definition encoder.hh:243
Definition cdrom-loader.hh:39
The awaiter type.
Definition coroutine.hh:67
Awaiter(Awaiter &&other)=default
Awaiter(Awaiter const &)=default
constexpr void await_suspend(std::coroutine_handle<> h)
Definition coroutine.hh:77
Awaiter & operator=(Awaiter const &)=default
constexpr void await_resume() const noexcept
Definition coroutine.hh:78
constexpr bool await_ready() const noexcept
Definition coroutine.hh:72
Awaiter & operator=(Awaiter &&other)=default
Definition coroutine.hh:50
A suitable type to hold and return a C++20 coroutine.
Definition coroutine.hh:49
Coroutine(Coroutine const &)=delete
Awaiter awaiter()
Creates an Awaiter object.
Definition coroutine.hh:92
Coroutine & operator=(Coroutine const &)=delete
Coroutine & operator=(Coroutine &&other)=default
constexpr bool await_ready()
Definition coroutine.hh:197
Promise promise_type
Definition coroutine.hh:195
const SafeT & value() const
Returns the value returned by the coroutine.
Definition coroutine.hh:146
std::conditional< std::is_void< T >::value, Empty, T >::type SafeT
Definition coroutine.hh:51
void resume()
Resumes the coroutine.
Definition coroutine.hh:103
bool done()
Returns the status of the coroutine.
Definition coroutine.hh:122
constexpr void await_suspend(std::coroutine_handle< U > h)
Definition coroutine.hh:199
constexpr SafeT await_resume()
Definition coroutine.hh:204
Coroutine(Coroutine &&other)=default
static int ret
Definition syscalls.h:72