uvco 0.1
Loading...
Searching...
No Matches
uvco::MultiPromise< T >::MultiPromiseAwaiter_ Struct Reference

#include <multipromise.h>

Collaboration diagram for uvco::MultiPromise< T >::MultiPromiseAwaiter_:

Public Member Functions

constexpr MultiPromiseAwaiter_ (PromiseCore_ *core)
 MultiPromiseAwaiter_ (MultiPromiseAwaiter_ &&)=delete
 MultiPromiseAwaiter_ (const MultiPromiseAwaiter_ &)=delete
MultiPromiseAwaiter_operator= (MultiPromiseAwaiter_ &&)=delete
MultiPromiseAwaiter_operator= (const MultiPromiseAwaiter_ &)=delete
 ~MultiPromiseAwaiter_ ()=default
bool await_ready () const
std::coroutine_handle await_suspend (std::coroutine_handle<> handle) const
std::optional< T > await_resume () const

Public Attributes

PromiseCore_core_

Detailed Description

template<typename T>
struct uvco::MultiPromise< T >::MultiPromiseAwaiter_

A MultiPromiseAwaiter_ handles suspension and resumption of coroutines receiving values from a generating (yielding) coroutine. This awaiter is used when applying the co_await operator on a MultiPromise.

Constructor & Destructor Documentation

◆ MultiPromiseAwaiter_() [1/3]

template<typename T>
uvco::MultiPromise< T >::MultiPromiseAwaiter_::MultiPromiseAwaiter_ ( PromiseCore_ * core)
inlineexplicitconstexpr
211: core_{core} {}
Definition multipromise.h:127
PromiseCore_ * core_
Definition multipromise.h:266

◆ MultiPromiseAwaiter_() [2/3]

template<typename T>
uvco::MultiPromise< T >::MultiPromiseAwaiter_::MultiPromiseAwaiter_ ( MultiPromiseAwaiter_ && )
delete

◆ MultiPromiseAwaiter_() [3/3]

template<typename T>
uvco::MultiPromise< T >::MultiPromiseAwaiter_::MultiPromiseAwaiter_ ( const MultiPromiseAwaiter_ & )
delete

◆ ~MultiPromiseAwaiter_()

template<typename T>
uvco::MultiPromise< T >::MultiPromiseAwaiter_::~MultiPromiseAwaiter_ ( )
default

Member Function Documentation

◆ await_ready()

template<typename T>
bool uvco::MultiPromise< T >::MultiPromiseAwaiter_::await_ready ( ) const
inlinenodiscard

Part of the coroutine protocol. Returns true if the MultiPromise already has a value.

220 {
221 return core_ == nullptr || core_->isTerminated() ||
222 core_->slot.has_value();
223 }

◆ await_resume()

template<typename T>
std::optional< T > uvco::MultiPromise< T >::MultiPromiseAwaiter_::await_resume ( ) const
inline

Part of the coroutine protocol. Returns a value if co_yield was called in the generating coroutine. Otherwise, returns an empty optional if the generating coroutine has co_returned.

If an exception has been thrown, repeatedly rethrows this exception upon awaiting.

243 {
244 if (core_ == nullptr) {
245 return std::nullopt;
246 }
247 if (!core_->slot) {
248 // Terminated by co_return
249 return std::nullopt;
250 }
251 switch (core_->slot->index()) {
252 [[likely]] case 0: {
254 core_->slot.reset();
255 return std::move(result);
256 }
257 case 1:
258 // Terminated by exception
259 BOOST_ASSERT(core_->isTerminated());
261 default:
262 throw UvcoException("MultiPromiseAwaiter_::await_resume: invalid slot");
263 }
264 }

◆ await_suspend()

template<typename T>
std::coroutine_handle uvco::MultiPromise< T >::MultiPromiseAwaiter_::await_suspend ( std::coroutine_handle<> handle) const
inlinenodiscard

Part of the coroutine protocol. Always returns true; stores the suspension handle in the MultiPromiseCore for later resumption.

227 {
228 if (core_ == nullptr) {
229 return Loop::getNext();
230 }
231 BOOST_ASSERT_MSG(!core_->isAwaited(),
232 "promise is already being waited on!\n");
233 core_->setHandle(handle);
234 core_->resumeGenerator();
235 return Loop::getNext();
236 }
static std::coroutine_handle getNext()
Definition loop.cc:108

◆ operator=() [1/2]

template<typename T>
MultiPromiseAwaiter_ & uvco::MultiPromise< T >::MultiPromiseAwaiter_::operator= ( const MultiPromiseAwaiter_ & )
delete

◆ operator=() [2/2]

template<typename T>
MultiPromiseAwaiter_ & uvco::MultiPromise< T >::MultiPromiseAwaiter_::operator= ( MultiPromiseAwaiter_ && )
delete

Member Data Documentation

◆ core_

template<typename T>
PromiseCore_* uvco::MultiPromise< T >::MultiPromiseAwaiter_::core_

The documentation for this struct was generated from the following file: