8#include <boost/assert.hpp>
21template <
typename T>
class Promise;
66 other.core_ =
nullptr;
73 if (
core_ !=
nullptr) {
74 core_->destroyCoroutine();
77 other.core_ =
nullptr;
82 if (
core_ !=
nullptr) {
83 core_->destroyCoroutine();
92 [[nodiscard]]
bool ready()
const {
return core_->ready(); }
96 auto &slot =
core_->slot.value();
97 switch (slot.index()) {
99 T value = std::move(std::get<0>(slot));
104 std::rethrow_exception(std::get<1>(slot));
107 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
138 [[nodiscard]] std::coroutine_handle<>
140 BOOST_ASSERT_MSG(!
core_.isAwaited(),
141 "promise is already being waited on!");
142 core_.setHandle(handle);
150 "co_await called on previously finished promise (T)");
152 if (
core_.slot.has_value()) {
153 switch (
core_.slot->index()) {
155 T result = std::move(std::get<0>(
core_.slot.value()));
160 const auto exc = std::get<1>(
core_.slot.value());
162 std::rethrow_exception(exc);
165 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
168 throw UvcoException(
"await_resume called on unfulfilled promise (bug?)");
214 [[nodiscard]]
bool ready()
const;
237 [[nodiscard]] std::coroutine_handle<>
250 BOOST_ASSERT(
core_ !=
nullptr);
293 template <
typename... Args>
explicit Coroutine(Args &&...) {
296 (!std::is_rvalue_reference_v<Args &&> && ...),
297 "Coroutine constructor arguments must not be rvalue references");
317 if (
core_.slot.has_value() &&
core_.slot->index() == 1) {
320 BOOST_ASSERT(!
core_.slot);
321 core_.slot = std::move(value);
345 core_.except(std::current_exception());
358 template <
typename... Args>
explicit Coroutine(Args &&...) {
361 (!std::is_rvalue_reference_v<Args &&> && ...),
362 "Coroutine constructor arguments must not be rvalue references");
367 Coroutine(Coroutine<void> &&other)
noexcept =
delete;
370 Coroutine(
const Coroutine<void> &other) =
delete;
void unhandled_exception()
Definition promise.h:344
std::suspend_always final_suspend() noexcept
Definition promise.h:340
std::suspend_never initial_suspend() noexcept
Definition promise.h:334
Coroutine(const Coroutine &other)=delete
void return_value(T value)
Definition promise.h:315
Coroutine & operator=(const Coroutine &other)=delete
Promise< T > get_return_object()
Definition promise.h:311
Coroutine(Coroutine &&other)=delete
PromiseCore_ * SharedCore_
Definition promise.h:264
PromiseCore< T > core_
Definition promise.h:350
Coroutine & operator=(Coroutine &&other)=delete
Coroutine(Args &&...)
Definition promise.h:293
PromiseCore< T > PromiseCore_
PromiseCore_ handles the inner mechanics of resumption and suspension.
Definition promise.h:263
static std::coroutine_handle getNext()
Definition loop.cc:108
Definition promise_core.h:45
Promise(const Promise< void > &other)=delete
Promise & operator=(const Promise< void > &other)=delete
Promise(Promise< void > &&other) noexcept
Promise ready to be awaited or fulfilled.
Definition promise.cc:46
PromiseCore< void > * core()
Definition promise.h:249
PromiseCore< void > PromiseCore_
Definition promise.h:195
PromiseCore< void > * core_
Definition promise.h:254
Coroutine< void > promise_type
Definition promise.h:200
friend class SelectSet
Definition promise.h:247
Promise(Promise< T > &&other) noexcept
Definition promise.h:65
Promise(const Promise< T > &other)=delete
PromiseCore< T > PromiseCore_
PromiseCore_ handles the inner mechanics of resumption and suspension.
Definition promise.h:53
Promise & operator=(Promise< T > &&other) noexcept
Definition promise.h:69
friend class Coroutine
Definition promise.h:174
~Promise()
Definition promise.h:81
Promise & operator=(const Promise< T > &other)=delete
Promise(PromiseCore_ &core)
Definition promise.h:178
T unwrap()
Definition promise.h:94
bool ready() const
Returns if promise has been fulfilled.
Definition promise.h:92
friend class SelectSet
Definition promise.h:175
PromiseCore_ * core()
Definition promise.h:180
Coroutine< T > promise_type
Definition promise.h:63
PromiseCore_ * core_
Definition promise.h:182
Definition async_work.cc:18
T await_resume() const
Definition promise.h:147
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseCore_ & core_
Definition promise.h:171
~PromiseAwaiter_()=default
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseCore_ &core)
Definition promise.h:123
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
std::coroutine_handle await_suspend(std::coroutine_handle<> handle) const
Definition promise.h:139
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
bool await_ready() const
Definition promise.h:132
Handles the actual suspension and resumption.
Definition promise.h:222
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
PromiseCore< void > & core_
Definition promise.h:241
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
PromiseAwaiter_(PromiseCore< void > &core)
Definition promise.cc:14
~PromiseAwaiter_()=default
Definition exception.h:19