9#include <boost/assert.hpp>
10#include <fmt/format.h>
21template <
typename T>
class Coroutine;
22template <
typename T>
class Promise;
36 if (
core_ !=
nullptr) {
44 if (
core_ !=
nullptr) {
100 other.core_ =
nullptr;
104 if (
this == &other) {
111 if (
this == &other) {
114 if (
core_ !=
nullptr) {
118 other.core_ =
nullptr;
124 if (
core_ !=
nullptr) {
142 switch (slot.index()) {
144 T value = std::move(std::get<0>(slot));
146 return std::move(value);
149 std::rethrow_exception(std::get<1>(slot));
152 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
182 "promise is already being waited on!");
191 "co_await called on previously finished promise (T)");
196 T result = std::move(std::get<0>(
core_.
slot.value()));
198 return std::move(result);
201 std::rethrow_exception(std::get<1>(
core_.
slot.value()));
203 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
206 throw UvcoException(
"await_resume called on unfulfilled promise (bug?)");
225 struct PromiseAwaiter_;
245 PromiseAwaiter_
operator co_await()
const;
248 [[nodiscard]]
bool ready()
const;
256 struct PromiseAwaiter_ {
302 if (
core_ !=
nullptr) {
360 if (
core_ !=
nullptr) {
Coroutine & operator=(Coroutine< void > &&other)=delete
Promise< void > get_return_object()
Part of the coroutine protocol.
Definition promise.h:366
~Coroutine()
Definition promise.h:359
Coroutine(Coroutine< void > &&other) noexcept=delete
Coroutine & operator=(const Coroutine< void > &other)=delete
SharedCore_ core_
Definition promise.h:382
Coroutine(const Coroutine< void > &other)=delete
Coroutine()
Definition promise.h:353
std::suspend_never final_suspend() noexcept
Definition promise.h:372
std::suspend_never initial_suspend() noexcept
Definition promise.h:369
A coroutine object used internally by C++20 coroutines ("promise object").
Definition promise.h:287
SharedCore_ core_
Definition promise.h:345
void unhandled_exception()
Definition promise.h:339
std::suspend_never initial_suspend() noexcept
Definition promise.h:332
std::suspend_never final_suspend() noexcept
Definition promise.h:335
~Coroutine()
Definition promise.h:301
Coroutine(const Coroutine &other)=delete
Coroutine()
Definition promise.h:295
void return_value(T value)
Definition promise.h:313
Coroutine & operator=(const Coroutine &other)=delete
Promise< T > get_return_object()
Definition promise.h:309
Coroutine(Coroutine &&other)=delete
Coroutine & operator=(Coroutine &&other)=delete
Definition promise_core.h:194
Definition promise_core.h:61
bool ready() const
Checks if a value is present in the slot.
Definition promise_core.h:115
bool stale() const
Definition promise_core.h:118
void except(const std::exception_ptr &exc)
Definition promise_core.h:181
bool willResume()
Checks if a coroutine is waiting on a promise belonging to this core.
Definition promise_core.h:113
virtual void setHandle(std::coroutine_handle<> handle)
Set the coroutine to be resumed once a result is ready.
Definition promise_core.h:74
std::optional< std::variant< T, std::exception_ptr > > slot
The slot contains the result once obtained.
Definition promise_core.h:184
virtual void resume()
Definition promise_core.h:126
PromiseCore< T > * core_
Definition promise.h:53
PromiseHandle(PromiseHandle &&)=delete
PromiseHandle & operator=(PromiseHandle &&)=delete
~PromiseHandle()
Definition promise.h:35
PromiseHandle & operator=(const PromiseHandle &)=delete
void cancel()
Definition promise.h:43
PromiseHandle(const PromiseHandle &)=delete
SharedCore_ & core()
Definition promise.h:281
SharedCore_ core_
Definition promise.h:283
Promise(T &&result)
Fulfilled promise; resolves immediately.
Definition promise.h:96
Promise(Promise< T > &&other) noexcept
Definition promise.h:99
SharedCore_ & core()
Definition promise.h:216
Promise & operator=(Promise< T > &&other) noexcept
Definition promise.h:110
Promise(const Promise< T > &other)
Definition promise.h:122
~Promise()
Definition promise.h:123
Promise & operator=(const Promise< T > &other)
A promise can be copied at low cost.
Definition promise.h:103
T unwrap()
Definition promise.h:139
Promise(SharedCore_ core)
Definition promise.h:215
Promise()
Unfulfilled, empty promise.
Definition promise.h:94
SharedCore_ core_
Definition promise.h:218
PromiseHandle< T > handle()
Return a handle that can be used to cancel the coroutine.
Definition promise.h:130
bool ready() const
Returns if promise has been fulfilled.
Definition promise.h:137
virtual T * addRef()
Definition internal_utils.h:109
virtual void delRef()
Definition internal_utils.h:117
T * makeRefCounted(Args... args)
Create a new refcounted value. T must derive from RefCounted<T>.
Definition internal_utils.h:133
Definition async_work.cc:17
T await_resume() const
Definition promise.h:188
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseCore_ & core_
Definition promise.h:209
~PromiseAwaiter_()=default
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
bool await_suspend(std::coroutine_handle<> handle) const
Definition promise.h:180
PromiseAwaiter_(PromiseCore_ &core)
Definition promise.h:168
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
bool await_ready() const
Definition promise.h:177
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
PromiseCore< void > & core_
Definition promise.h:273
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
Definition exception.h:19