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.

125: core_{core} {}
Definition promise.h:49
PromiseCore_ & core_
Definition promise.h:173

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

134 {
135 return core_.ready() && !core_.stale();
136 }

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

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

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

141 {
142 BOOST_ASSERT_MSG(!core_.isAwaited(),
143 "promise is already being waited on!");
144 core_.setHandle(handle);
145 return Loop::getNext();
146 }
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: