commit 83d715acb180f4fd7189cc8de00a8889a36abe6d
parent 9f14c4c1b95ad1cabd4d8c40fb85690740d44e90
Author: Henry Wilson <henry@henryandlizzy.uk>
Date: Thu, 15 Jan 2026 01:48:16 +0000
coro: Tidy up
Diffstat:
| M | coro.cpp | | | 43 | +++++++++++++++++++++---------------------- |
1 file changed, 21 insertions(+), 22 deletions(-)
diff --git a/coro.cpp b/coro.cpp
@@ -1,11 +1,5 @@
#include "linux.hpp"
-struct coroutine_frame
-{
- void(*resume)(coroutine_frame*) noexcept;
- void(*destroy)(coroutine_frame*) noexcept;
-};
-
namespace std
{
@@ -23,32 +17,39 @@ struct coroutine_handle {
}
static coroutine_handle from_promise(T& promise) noexcept
{
- return coroutine_handle{((char*)&promise) - sizeof(coroutine_frame)};
+ return from_address(reinterpret_cast<char*>(&promise) - sizeof(frame));
}
void resume() const noexcept {
- assert(frame);
- assert(frame->resume);
- frame->resume(frame);
+ assert(fp);
+ assert(fp->resume);
+ fp->resume(fp);
}
void destroy() const noexcept {
- assert(frame);
- assert(frame->destroy);
- frame->destroy(frame);
+ assert(fp);
+ assert(fp->destroy);
+ fp->destroy(fp);
}
bool done() const noexcept
{
- assert(frame);
- return not frame->resume;
+ assert(fp);
+ return not fp->resume;
}
+
private:
- coroutine_handle(void* ptr) noexcept : frame{reinterpret_cast<coroutine_frame*>(ptr)} {}
- coroutine_frame* frame = nullptr;
+ struct frame
+ {
+ void(*resume)(frame*) noexcept;
+ void(*destroy)(frame*) noexcept;
+ };
+
+ coroutine_handle(void* ptr) noexcept : fp{reinterpret_cast<frame*>(ptr)} {}
+ frame* fp = nullptr;
};
struct suspend_always
{
bool await_ready() noexcept { return false; }
- template <typename T> // easier to do this that provide a <void> specialisation for now
+ template <typename T> // easier to make this a template method than provide a <void> specialisation to coroutine_handle for now
void await_suspend(coroutine_handle<T>) noexcept {}
void await_resume() noexcept {}
};
@@ -68,9 +69,7 @@ struct task
struct promise_type {
std::suspend_never initial_suspend() noexcept { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
- task get_return_object() noexcept {
- return {std::coroutine_handle<promise_type>::from_promise(*this)};
- }
+ task get_return_object() noexcept { return {*this}; }
void unhandled_exception() noexcept {}
void return_void() noexcept {}
void* operator new(size_t s, span<char> storage) noexcept {
@@ -85,7 +84,7 @@ struct task
void resume() const noexcept { h.resume(); }
private:
friend struct promise_type;
- task(std::coroutine_handle<promise_type> ch) : h{ch} {}
+ task(promise_type& p) : h{decltype(h)::from_promise(p)} {}
std::coroutine_handle<promise_type> h;
};