uvco 0.1
Loading...
Searching...
No Matches
uvco::Promise< T >::PromiseAwaiter_ Struct Reference

#include <promise.h>

Collaboration diagram for uvco::Promise< T >::PromiseAwaiter_:

Public Member Functions

 PromiseAwaiter_ (PromiseCore_ &core)
 PromiseAwaiter_ (PromiseAwaiter_ &&)=delete
 PromiseAwaiter_ (const PromiseAwaiter_ &)=delete
PromiseAwaiter_operator= (PromiseAwaiter_ &&)=delete
PromiseAwaiter_operator= (const PromiseAwaiter_ &)=delete
 ~PromiseAwaiter_ ()=default
bool await_ready () const
std::coroutine_handle await_suspend (std::coroutine_handle<> handle) const
await_resume () const

Public Attributes

PromiseCore_core_

Detailed Description

template<typename T>
struct uvco::Promise< T >::PromiseAwaiter_

Returned as awaiter object when co_awaiting a promise.

Handles suspension of current coroutine and resumption upon fulfillment of the awaited promise.

Constructor & Destructor Documentation

◆ PromiseAwaiter_() [1/3]

template<typename T>
uvco::Promise< T >::PromiseAwaiter_::PromiseAwaiter_ ( PromiseCore_ & core)
inlineexplicit

The core is shared with the promise and contains the resumption handle, and ultimately the returned value. Because the awaiter object is only used while a coroutine is waiting on a co_await suspension point, we can use a reference to the PromiseCore_ object.

123: core_{core} {}
Definition promise.h:49
PromiseCore_ & core_
Definition promise.h:171

◆ PromiseAwaiter_() [2/3]

template<typename T>
uvco::Promise< T >::PromiseAwaiter_::PromiseAwaiter_ ( PromiseAwaiter_ && )
delete

◆ PromiseAwaiter_() [3/3]

template<typename T>
uvco::Promise< T >::PromiseAwaiter_::PromiseAwaiter_ ( const PromiseAwaiter_ & )
delete

◆ ~PromiseAwaiter_()

template<typename T>
uvco::Promise< T >::PromiseAwaiter_::~PromiseAwaiter_ ( )
default

Member Function Documentation

◆ await_ready()

template<typename T>
bool uvco::Promise< T >::PromiseAwaiter_::await_ready ( ) const
inlinenodiscard

Part of the coroutine protocol: returns true if the promise is already fulfilled.

132 {
133 return core_.ready() && !core_.stale();
134 }

◆ await_resume()

template<typename T>
T uvco::Promise< T >::PromiseAwaiter_::await_resume ( ) const
inline

Part of the coroutine protocol: extracts the resulting value from the promise core and returns it.

147 {
148 if (core_.stale()) {
149 throw UvcoException(
150 "co_await called on previously finished promise (T)");
151 }
152 if (core_.slot.has_value()) {
153 switch (core_.slot->index()) {
154 case 0: {
155 T result = std::move(std::get<0>(core_.slot.value()));
156 core_.slot.reset();
157 return result;
158 }
159 case 1: {
160 const auto exc = std::get<1>(core_.slot.value());
161 core_.slot.reset();
163 }
164 default:
165 throw UvcoException("PromiseAwaiter_::await_resume: invalid slot");
166 }
167 }
168 throw UvcoException("await_resume called on unfulfilled promise (bug?)");
169 }

◆ await_suspend()

template<typename T>
std::coroutine_handle uvco::Promise< T >::PromiseAwaiter_::await_suspend ( std::coroutine_handle<> handle) const
inlinenodiscard

Part of the coroutine protocol: returns if suspension is desired (always true), and stores the awaiting coroutine state in the PromiseCore.

139 {
140 BOOST_ASSERT_MSG(!core_.isAwaited(),
141 "promise is already being waited on!");
142 core_.setHandle(handle);
143 return Loop::getNext();
144 }
static std::coroutine_handle getNext()
Definition loop.cc:108

◆ operator=() [1/2]

template<typename T>
PromiseAwaiter_ & uvco::Promise< T >::PromiseAwaiter_::operator= ( const PromiseAwaiter_ & )
delete

◆ operator=() [2/2]

template<typename T>
PromiseAwaiter_ & uvco::Promise< T >::PromiseAwaiter_::operator= ( PromiseAwaiter_ && )
delete

Member Data Documentation

◆ core_

template<typename T>
PromiseCore_& uvco::Promise< T >::PromiseAwaiter_::core_

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