70 using result_type = std::conditional_t<std::is_void_v<T>, std::monostate, T>;
71 std::variant<result_type, std::exception_ptr> result;
72 std::atomic<AwaitableState> status{AwaitableState::NotReady};
73#ifdef __cpp_lib_coroutine
76 std::coroutine_handle<> handle;
79 void resumeCoroutine()
81#ifdef __cpp_lib_coroutine
111#ifdef __cpp_lib_coroutine
114 [[nodiscard]]
bool await_ready()
const noexcept
116 return data_->status.load(std::memory_order_acquire) == AwaitableState::Completed;
121 bool await_suspend(std::coroutine_handle<> handle)
noexcept
123 data_->handle = handle;
127 return data_->status.compare_exchange_strong(expected, AwaitableState::Waiting, std::memory_order_acq_rel);
131 [[nodiscard]] T await_resume()
const
133 if (
auto* exception = std::get_if<std::exception_ptr>(&data_->result); exception !=
nullptr)
134 std::rethrow_exception(*exception);
136 if constexpr (std::is_void_v<T>)
139 return std::get<T>(std::move(data_->result));
144 friend internal::Proxy;
145 friend AsyncMethodInvoker;
148 : data_(std::move(data))
150 assert(data_ !=
nullptr);
153 std::shared_ptr<AwaitableData<T>> data_;