8#include <boost/assert.hpp>
21template <
typename T>
class Promise;
66 other.core_ =
nullptr;
74 if (
core_ !=
nullptr) {
75 core_->destroyCoroutine();
78 other.core_ =
nullptr;
84 if (
core_ !=
nullptr) {
85 core_->destroyCoroutine();
94 [[nodiscard]]
bool ready()
const {
return core_->ready(); }
98 auto &slot =
core_->slot.value();
99 switch (slot.index()) {
101 T value = std::move(std::get<0>(slot));
106 std::rethrow_exception(std::get<1>(slot));
109 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
140 [[nodiscard]] std::coroutine_handle<>
142 BOOST_ASSERT_MSG(!
core_.isAwaited(),
143 "promise is already being waited on!");
144 core_.setHandle(handle);
152 "co_await called on previously finished promise (T)");
154 if (
core_.slot.has_value()) {
155 switch (
core_.slot->index()) {
157 T result = std::move(std::get<0>(
core_.slot.value()));
162 const auto exc = std::get<1>(
core_.slot.value());
164 std::rethrow_exception(exc);
167 throw UvcoException(
"PromiseAwaiter_::await_resume: invalid slot");
170 throw UvcoException(
"await_resume called on unfulfilled promise (bug?)");
216 [[nodiscard]]
bool ready()
const;
239 [[nodiscard]] std::coroutine_handle<>
252 BOOST_ASSERT(
core_ !=
nullptr);
295 template <
typename... Args>
explicit Coroutine(Args &&...) {
298 (!std::is_rvalue_reference_v<Args &&> && ...),
299 "Coroutine constructor arguments must not be rvalue references");
319 if (
core_.slot.has_value() &&
core_.slot->index() == 1) {
322 BOOST_ASSERT(!
core_.slot);
323 core_.slot = std::move(value);
347 core_.except(std::current_exception());
360 template <
typename... Args>
explicit Coroutine(Args &&...) {
363 (!std::is_rvalue_reference_v<Args &&> && ...),
364 "Coroutine constructor arguments must not be rvalue references");
369 Coroutine(Coroutine<void> &&other)
noexcept =
delete;
372 Coroutine(
const Coroutine<void> &other) =
delete;
void unhandled_exception()
Definition promise.h:346
std::suspend_always final_suspend() noexcept
Definition promise.h:342
std::suspend_never initial_suspend() noexcept
Definition promise.h:336
Coroutine(const Coroutine &other)=delete
void return_value(T value)
Definition promise.h:317
Coroutine & operator=(const Coroutine &other)=delete
Promise< T > get_return_object()
Definition promise.h:313
Coroutine(Coroutine &&other)=delete
PromiseCore_ * SharedCore_
Definition promise.h:266
PromiseCore< T > core_
Definition promise.h:352
Coroutine & operator=(Coroutine &&other)=delete
Coroutine(Args &&...)
Definition promise.h:295
PromiseCore< T > PromiseCore_
PromiseCore_ handles the inner mechanics of resumption and suspension.
Definition promise.h:265
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:251
PromiseCore< void > PromiseCore_
Definition promise.h:197
PromiseCore< void > * core_
Definition promise.h:256
Coroutine< void > promise_type
Definition promise.h:202
friend class SelectSet
Definition promise.h:249
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:70
friend class Coroutine
Definition promise.h:176
~Promise()
Definition promise.h:83
Promise & operator=(const Promise< T > &other)=delete
A promise can be copied at low cost.
Promise(PromiseCore_ &core)
Definition promise.h:180
T unwrap()
Definition promise.h:96
bool ready() const
Returns if promise has been fulfilled.
Definition promise.h:94
friend class SelectSet
Definition promise.h:177
PromiseCore_ * core()
Definition promise.h:182
Coroutine< T > promise_type
Definition promise.h:63
PromiseCore_ * core_
Definition promise.h:184
Definition async_work.cc:18
T await_resume() const
Definition promise.h:149
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseCore_ & core_
Definition promise.h:173
~PromiseAwaiter_()=default
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseCore_ &core)
Definition promise.h:125
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
std::coroutine_handle await_suspend(std::coroutine_handle<> handle) const
Definition promise.h:141
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
bool await_ready() const
Definition promise.h:134
Handles the actual suspension and resumption.
Definition promise.h:224
PromiseAwaiter_ & operator=(PromiseAwaiter_ &&)=delete
PromiseAwaiter_(const PromiseAwaiter_ &)=delete
PromiseCore< void > & core_
Definition promise.h:243
PromiseAwaiter_ & operator=(const PromiseAwaiter_ &)=delete
PromiseAwaiter_(PromiseAwaiter_ &&)=delete
PromiseAwaiter_(PromiseCore< void > &core)
Definition promise.cc:14
~PromiseAwaiter_()=default
Definition exception.h:19