Key components:
- Return type
- Promise type
- Awaitable type
- std::coroutine_handle<>
Concept:
`co_yield value` is a syntax sugar for `co_await awaitable`.
thus value is stored in promise_type instance directly instead of having to go through
`Awaitable{value}` and store the value into promise_type instance through `Awaitable::await_suspend(handler)`
Caller could retrieve the value through
`ReturnType::handler_::promise.value_;`
std::suspend_always {
// always suspend.
bool await_ready() { return false;}
// noop
void await_suspend()
// noop, the value is stored in promise_type.value_.
void await_resume()
} // https://en.cppreference.com/w/cpp/coroutine/suspend_always.html
std::suspend_never {
// never suspend.
bool await_ready() { return true;}
// noop
void await_suspend()
// noop, the value is stored in promise_type.value_.
void await_resume()
}; // https://en.cppreference.com/w/cpp/coroutine/suspend_never.html
strict Awaitable {
T value_;
bool await_ready() { return false;}
void await_suspend(std::coroutine_handle<promise_type> handler) {
// could store the result into handler.promise().RESULT.
// or store the value_ into handler.promise().RESULT.
// Handler can be passed into new thread.
// When handler calls .resume(), it starts execute from where previous
// suspended.
}
// handler.resume() from Awaitable suspend comes here.
// can return value to the caller inside the coroutine.
// the value can be obtained from handler.promise().RESULT.
void await_resume();
T await_resume() {return T{}; };
Awaitable(T value) : value_(value) {}
};
struct ReturnType {
struct promise_type {
T value_;
promise_type(T...); // optional
ReturnType get_return_object() {
return {};
// or
return {coroutine::from_promise(*this)};
};
std::suspend_always initial_suspend() {}
template<std::convertible_to<T> From> // C++20 concept
std::suspend_always yield_value(From&& from) {
value_ = std::forward<From>(from); // caching the result in promise
return {};
}
// above start; below shutdown
void return_value(T/T&&/const T&); // store value T inside the ReturnType, caller retrieve the value from ReturnType.
void return_void();
void unhandled_exception();
std::suspend_always final_suspend() noexcept;
};
ReturnType(std::coroutine_handle<promise_type> handler) : handler_(handler) {}
ReturnType() = default;
};
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.