30 static_assert(!std::is_void_v<T>);
39 void setHandle(std::coroutine_handle<> handle)
override {
50 "MultiPromise must be co_awaited before next yield");
52 "MultiPromise must be co_awaited before next yield");
82 "MultiPromiseCore::suspendGenerator: generatorHandle_ is "
98 generatorHandle.destroy();
146 static_assert(!std::is_void_v<T>);
155 if (
core_.use_count() == 2) {
205 :
core_{std::move(core)} {}
215 return core_->isTerminated() ||
core_->slot.has_value();
220 BOOST_ASSERT_MSG(!
core_->willResume(),
221 "promise is already being waited on!\n");
222 core_->setHandle(handle);
223 core_->resumeGenerator();
237 switch (
core_->slot->index()) {
239 std::optional<T> result = std::move(std::get<0>(
core_->slot.value()));
241 return std::move(result);
245 BOOST_ASSERT(
core_->isTerminated());
246 std::rethrow_exception(std::get<1>(
core_->slot.value()));
248 throw UvcoException(
"MultiPromiseAwaiter_::await_resume: invalid slot");
297 core_->slot = std::current_exception();
313 BOOST_ASSERT(!
core_->slot);
314 core_->slot = std::move(value);
Definition multipromise.h:264
Generator(Generator< T > &&) noexcept=delete
void unhandled_exception()
Part of the coroutine protocol (see Promise).
Definition multipromise.h:296
SharedCore_ core_
Definition multipromise.h:340
Generator()
Definition multipromise.h:271
MultiPromise< T > get_return_object()
A generator (yielding) coroutine returns a MultiPromise.
Definition multipromise.h:279
std::suspend_never final_suspend() noexcept
Part of the coroutine protocol (see Promise).
Definition multipromise.h:293
std::shared_ptr< PromiseCore_ > SharedCore_
Definition multipromise.h:267
void return_void()
Definition multipromise.h:283
YieldAwaiter_ yield_value(T value)
Definition multipromise.h:312
std::suspend_never initial_suspend() noexcept
Part of the coroutine protocol (see Promise).
Definition multipromise.h:291
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73
Definition multipromise.h:23
MultiPromiseCore(MultiPromiseCore &&)=delete
MultiPromiseCore(const MultiPromiseCore &)=delete
void terminated()
Definition multipromise.h:106
void cancelGenerator()
Definition multipromise.h:92
void resume() override
Definition multipromise.h:59
void setHandle(std::coroutine_handle<> handle) override
Definition multipromise.h:39
MultiPromiseCore & operator=(MultiPromiseCore &&)=delete
std::optional< std::coroutine_handle<> > generatorHandle_
Coroutine handle referring to the suspended generator.
Definition multipromise.h:113
bool isTerminated() const
Check if the generator has been cancelled or has returned.
Definition multipromise.h:109
void suspendGenerator(std::coroutine_handle<> handle)
Definition multipromise.h:80
~MultiPromiseCore() override=default
MultiPromiseCore()=default
bool terminated_
Definition multipromise.h:116
MultiPromiseCore & operator=(const MultiPromiseCore &)=delete
void resumeGenerator()
Definition multipromise.h:66
Definition multipromise.h:133
Promise< std::optional< T > > next()
Definition multipromise.h:167
std::shared_ptr< PromiseCore_ > SharedCore_
Definition multipromise.h:138
MultiPromise(MultiPromise< T > &&) noexcept=default
An unfulfilled MultiPromise.
MultiPromise(SharedCore_ core)
Definition multipromise.h:257
SharedCore_ core_
Definition multipromise.h:259
void cancel()
Definition multipromise.h:197
bool ready()
Definition multipromise.h:181
Definition promise_core.h:61
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
Definition async_work.cc:17
Definition multipromise.h:323
bool await_suspend(std::coroutine_handle<> handle)
Definition multipromise.h:328
PromiseCore_ & core_
Definition multipromise.h:337
void await_resume()
Definition multipromise.h:333
YieldAwaiter_(PromiseCore_ &core)
Definition multipromise.h:324
bool await_ready() const
Definition multipromise.h:326
Definition multipromise.h:203
SharedCore_ core_
Definition multipromise.h:252
MultiPromiseAwaiter_ & operator=(const MultiPromiseAwaiter_ &)=delete
MultiPromiseAwaiter_(MultiPromiseAwaiter_ &&)=delete
std::optional< T > await_resume() const
Definition multipromise.h:232
MultiPromiseAwaiter_ & operator=(MultiPromiseAwaiter_ &&)=delete
MultiPromiseAwaiter_(const MultiPromiseAwaiter_ &)=delete
~MultiPromiseAwaiter_()=default
bool await_suspend(std::coroutine_handle<> handle) const
Definition multipromise.h:219
constexpr MultiPromiseAwaiter_(SharedCore_ core)
Definition multipromise.h:204
bool await_ready() const
Definition multipromise.h:214
Definition exception.h:19