uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
uvco::MultiPromise< T >::MultiPromiseAwaiter_ Struct Reference

#include <multipromise.h>

Public Member Functions

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

Public Attributes

SharedCore_ 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 >
constexpr uvco::MultiPromise< T >::MultiPromiseAwaiter_::MultiPromiseAwaiter_ ( SharedCore_  core)
inlineexplicitconstexpr
205 : core_{std::move(core)} {}
SharedCore_ core_
Definition multipromise.h:252

◆ 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
inline

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

214 {
215 return core_->isTerminated() || core_->slot.has_value();
216 }

◆ 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.

232 {
233 if (!core_->slot) {
234 // Terminated by co_return
235 return std::nullopt;
236 }
237 switch (core_->slot->index()) {
238 [[likely]] case 0: {
239 std::optional<T> result = std::move(std::get<0>(core_->slot.value()));
240 core_->slot.reset();
241 return std::move(result);
242 }
243 case 1:
244 // Terminated by exception
245 BOOST_ASSERT(core_->isTerminated());
246 std::rethrow_exception(std::get<1>(core_->slot.value()));
247 default:
248 throw UvcoException("MultiPromiseAwaiter_::await_resume: invalid slot");
249 }
250 }

◆ await_suspend()

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

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

219 {
220 BOOST_ASSERT_MSG(!core_->willResume(),
221 "promise is already being waited on!\n");
222 core_->setHandle(handle);
223 core_->resumeGenerator();
224 return true;
225 }

◆ 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 >
SharedCore_ uvco::MultiPromise< T >::MultiPromiseAwaiter_::core_

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