10#include "ucxpp/detail/debug.h"
16 std::promise<T> promise_;
17 void return_value(T &&value) { promise_.set_value(std::forward<T>(value)); }
22 std::promise<void> promise_;
23 void return_void() { promise_.set_value(); }
26template <
class T,
class CoroutineHandle>
28 std::suspend_never initial_suspend() {
return {}; }
29 auto final_suspend()
noexcept {
31 std::coroutine_handle<> release_detached_;
32 bool await_ready()
noexcept {
return false; }
33 std::coroutine_handle<>
34 await_suspend(CoroutineHandle suspended)
noexcept {
35 if (suspended.promise().continuation_) {
36 return suspended.promise().continuation_;
38 if (release_detached_) {
39 release_detached_.destroy();
41 return std::noop_coroutine();
44 void await_resume()
noexcept {}
46 return awaiter{release_detached_};
49 std::coroutine_handle<> continuation_;
50 std::coroutine_handle<> release_detached_;
53template <
class T>
struct task {
55 :
public promise_base<T, std::coroutine_handle<promise_type>> {
57 return std::coroutine_handle<promise_type>::from_promise(*
this);
59 void unhandled_exception() {
60 this->promise_.set_exception(std::current_exception());
63 std::future<T> &get_future() {
return future_; }
64 void set_detached_task(std::coroutine_handle<promise_type> h) {
65 this->release_detached_ = h;
67 std::future<T> future_;
71 std::coroutine_handle<promise_type> h_;
72 task_awaiter(std::coroutine_handle<promise_type> h) : h_(h) {}
73 bool await_ready() {
return h_.done(); }
74 auto await_suspend(std::coroutine_handle<> suspended) {
75 h_.promise().continuation_ = suspended;
77 auto await_resume() {
return h_.promise().future_.get(); }
80 using coroutine_handle_type = std::coroutine_handle<promise_type>;
82 auto operator co_await()
const {
return task_awaiter(h_); }
87 h_.promise().set_detached_task(h_);
95 : h_(std::exchange(other.h_, nullptr)),
96 detached_(std::exchange(other.detached_, true)) {}
97 task(coroutine_handle_type h) : h_(h), detached_(false) {}
98 coroutine_handle_type h_;
100 operator coroutine_handle_type()
const {
return h_; }
101 std::future<T> &get_future()
const {
return h_.promise().get_future(); }
104 h_.promise().set_detached_task(h_);