33 static_assert(!std::is_void_v<T>);
42 void setHandle(std::coroutine_handle<> handle)
override {
53 "MultiPromise must be co_awaited before next yield");
55 "MultiPromise must be co_awaited before next yield");
92 const std::coroutine_handle<> coroutine =
coroutine_;
139 static_assert(!std::is_void_v<T>);
143 other.core_ =
nullptr;
147 if (
this == &other) {
150 if (
core_ !=
nullptr) {
151 core_->destroyCoroutine();
154 other.core_ =
nullptr;
159 if (
core_ !=
nullptr) {
160 core_->cancelGenerator();
181 return core_ ==
nullptr ||
core_->slot.has_value() ||
core_->isTerminated();
199 if (
core_ ==
nullptr) {
202 core_->cancelGenerator();
221 return core_ ==
nullptr ||
core_->isTerminated() ||
222 core_->slot.has_value();
226 [[nodiscard]] std::coroutine_handle<>
228 if (
core_ ==
nullptr) {
231 BOOST_ASSERT_MSG(!
core_->isAwaited(),
232 "promise is already being waited on!\n");
233 core_->setHandle(handle);
234 core_->resumeGenerator();
244 if (
core_ ==
nullptr) {
251 switch (
core_->slot->index()) {
253 std::optional<T> result = std::move(std::get<0>(
core_->slot.value()));
255 return std::move(result);
259 BOOST_ASSERT(
core_->isTerminated());
260 std::rethrow_exception(std::get<1>(
core_->slot.value()));
262 throw UvcoException(
"MultiPromiseAwaiter_::await_resume: invalid slot");
297 core_.setTerminated();
314 core_.slot = std::current_exception();
315 core_.setTerminated();
330 BOOST_ASSERT(!
core_.slot);
331 core_.slot = std::move(value);
347 core_.suspendGenerator();
Definition multipromise.h:278
Generator(Generator< T > &&) noexcept=delete
void unhandled_exception()
Part of the coroutine protocol (see Promise).
Definition multipromise.h:313
MultiPromise< T > get_return_object()
A generator (yielding) coroutine returns a MultiPromise.
Definition multipromise.h:292
PromiseCore_ core_
Definition multipromise.h:358
std::suspend_always final_suspend() noexcept
Part of the coroutine protocol (see Promise).
Definition multipromise.h:310
void return_void()
Definition multipromise.h:296
MultiPromiseCore< T > PromiseCore_
Definition multipromise.h:280
YieldAwaiter_ yield_value(T value)
Definition multipromise.h:329
std::suspend_never initial_suspend() noexcept
Part of the coroutine protocol (see Promise).
Definition multipromise.h:304
static void cancel(std::coroutine_handle<> handle)
Definition loop.cc:104
static std::coroutine_handle getNext()
Definition loop.cc:108
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94
Definition multipromise.h:24
MultiPromiseCore(MultiPromiseCore &&)=delete
MultiPromiseCore(const MultiPromiseCore &)=delete
void setTerminated()
Definition multipromise.h:104
void suspendGenerator()
Definition multipromise.h:79
void cancelGenerator()
Definition multipromise.h:89
void setHandle(std::coroutine_handle<> handle) override
Definition multipromise.h:42
MultiPromiseCore & operator=(MultiPromiseCore &&)=delete
bool suspended_
True if the generator is suspended at a co_yield point.
Definition multipromise.h:111
bool isTerminated() const
Check if the generator has been cancelled or has returned.
Definition multipromise.h:107
~MultiPromiseCore() override=default
MultiPromiseCore()=default
bool terminated_
Definition multipromise.h:114
MultiPromiseCore & operator=(const MultiPromiseCore &)=delete
void resumeGenerator()
Definition multipromise.h:65
Definition multipromise.h:127
Promise< std::optional< T > > next()
Definition multipromise.h:167
MultiPromise(PromiseCore_ &core)
Definition multipromise.h:271
MultiPromise & operator=(const MultiPromise< T > &)=delete
MultiPromise(MultiPromise< T > &&other) noexcept
An unfulfilled MultiPromise.
Definition multipromise.h:142
MultiPromise & operator=(MultiPromise< T > &&other) noexcept
Definition multipromise.h:146
MultiPromiseCore< T > PromiseCore_
Definition multipromise.h:131
friend class Generator
Definition multipromise.h:269
~MultiPromise()
Definition multipromise.h:158
Generator< T > promise_type
Definition multipromise.h:136
MultiPromise(const MultiPromise< T > &other)=delete
void cancel()
Definition multipromise.h:198
bool ready()
Definition multipromise.h:180
PromiseCore_ * core_
Definition multipromise.h:273
std::coroutine_handle coroutine_
Definition promise_core.h:129
PromiseState state_
Definition promise_core.h:135
std::coroutine_handle waitingHandle_
Definition promise_core.h:132
@ waitedOn
Definition promise_core.h:37
@ finished
Definition promise_core.h:40
Definition async_work.cc:18
Definition multipromise.h:340
PromiseCore_ & core_
Definition multipromise.h:355
void await_resume()
Definition multipromise.h:351
bool await_suspend(std::coroutine_handle<>)
Definition multipromise.h:345
YieldAwaiter_(PromiseCore_ &core)
Definition multipromise.h:341
bool await_ready() const
Definition multipromise.h:343
Definition multipromise.h:210
MultiPromiseAwaiter_ & operator=(const MultiPromiseAwaiter_ &)=delete
MultiPromiseAwaiter_(MultiPromiseAwaiter_ &&)=delete
std::optional< T > await_resume() const
Definition multipromise.h:243
PromiseCore_ * core_
Definition multipromise.h:266
constexpr MultiPromiseAwaiter_(PromiseCore_ *core)
Definition multipromise.h:211
MultiPromiseAwaiter_ & operator=(MultiPromiseAwaiter_ &&)=delete
MultiPromiseAwaiter_(const MultiPromiseAwaiter_ &)=delete
~MultiPromiseAwaiter_()=default
bool await_ready() const
Definition multipromise.h:220
std::coroutine_handle await_suspend(std::coroutine_handle<> handle) const
Definition multipromise.h:227
Definition exception.h:19