uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | List of all members
uvco::MultiPromiseCore< T > Class Template Reference

#include <multipromise.h>

Inheritance diagram for uvco::MultiPromiseCore< T >:
Inheritance graph
[legend]
Collaboration diagram for uvco::MultiPromiseCore< T >:
Collaboration graph
[legend]

Public Member Functions

 MultiPromiseCore ()=default
 
 MultiPromiseCore (const MultiPromiseCore &)=delete
 
 MultiPromiseCore (MultiPromiseCore &&)=delete
 
MultiPromiseCoreoperator= (const MultiPromiseCore &)=delete
 
MultiPromiseCoreoperator= (MultiPromiseCore &&)=delete
 
 ~MultiPromiseCore () override=default
 
void setHandle (std::coroutine_handle<> handle) override
 
void resume () override
 
void resumeGenerator ()
 
void suspendGenerator (std::coroutine_handle<> handle)
 
void cancelGenerator ()
 
void terminated ()
 
bool isTerminated () const
 Check if the generator has been cancelled or has returned.
 
- Public Member Functions inherited from uvco::PromiseCore< T >
 PromiseCore ()=default
 
 PromiseCore (const PromiseCore &)=delete
 
 PromiseCore (PromiseCore &&)=delete
 
PromiseCoreoperator= (const PromiseCore &)=delete
 
PromiseCoreoperator= (PromiseCore &&)=delete
 
 PromiseCore (T &&value)
 
void resetHandle ()
 
void cancel ()
 
bool willResume ()
 Checks if a coroutine is waiting on a promise belonging to this core.
 
bool ready () const
 Checks if a value is present in the slot.
 
bool stale () const
 
virtual ~PromiseCore ()
 
void except (const std::exception_ptr &exc)
 
- Public Member Functions inherited from uvco::RefCounted< PromiseCore< T > >
 RefCounted (const RefCounted &other)=default
 
 RefCounted (RefCounted &&other) noexcept
 
RefCountedoperator= (const RefCounted &other)=default
 
RefCountedoperator= (RefCounted &&other) noexcept
 
virtual ~RefCounted ()=default
 
virtual T * addRef ()
 
virtual void delRef ()
 

Private Attributes

std::optional< std::coroutine_handle<> > generatorHandle_
 Coroutine handle referring to the suspended generator.
 
bool terminated_ = false
 

Additional Inherited Members

- Public Attributes inherited from uvco::PromiseCore< T >
std::optional< std::variant< T, std::exception_ptr > > slot
 The slot contains the result once obtained.
 
- Protected Member Functions inherited from uvco::RefCounted< PromiseCore< T > >
 RefCounted ()=default
 
- Protected Attributes inherited from uvco::PromiseCore< T >
std::optional< std::coroutine_handle<> > handle_
 
PromiseState state_ = PromiseState::init
 

Detailed Description

template<typename T>
class uvco::MultiPromiseCore< T >

A MultiPromiseCore works like a PromiseCore, but with an adapted state machine: it can transition from finished back to waitedOn, and therefore yield more than one value. It is used by MultiPromise, a generator-like type.

Constructor & Destructor Documentation

◆ MultiPromiseCore() [1/3]

template<typename T >
uvco::MultiPromiseCore< T >::MultiPromiseCore ( )
default

◆ MultiPromiseCore() [2/3]

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

◆ MultiPromiseCore() [3/3]

template<typename T >
uvco::MultiPromiseCore< T >::MultiPromiseCore ( MultiPromiseCore< T > &&  )
delete

◆ ~MultiPromiseCore()

template<typename T >
uvco::MultiPromiseCore< T >::~MultiPromiseCore ( )
overridedefault

Member Function Documentation

◆ cancelGenerator()

template<typename T >
void uvco::MultiPromiseCore< T >::cancelGenerator ( )
inline

Cancel the generator coroutine. This will drop all stack variables inside the generator (and run their destructors), and ensure that the generatorHandle_ will never resume from the currently yielded value.

Called by tje MultiPromise destructor and MultiPromise::cancel().

92 {
93 terminated();
94 if (generatorHandle_) {
95 const std::coroutine_handle<> generatorHandle = generatorHandle_.value();
96 generatorHandle_.reset();
97 // Careful: within this function, this class' dtor is called!
98 generatorHandle.destroy();
99 }
100 }
void terminated()
Definition multipromise.h:106
std::optional< std::coroutine_handle<> > generatorHandle_
Coroutine handle referring to the suspended generator.
Definition multipromise.h:113

◆ isTerminated()

template<typename T >
bool uvco::MultiPromiseCore< T >::isTerminated ( ) const
inline

Check if the generator has been cancelled or has returned.

109{ return terminated_; }
bool terminated_
Definition multipromise.h:116

◆ operator=() [1/2]

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

◆ operator=() [2/2]

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

◆ resume()

template<typename T >
void uvco::MultiPromiseCore< T >::resume ( )
inlineoverridevirtual

See Promise::resume. Implemented here to provide a distinction in stack traces.

Reimplemented from uvco::PromiseCore< T >.

virtual void resume()
Definition promise_core.h:126

◆ resumeGenerator()

template<typename T >
void uvco::MultiPromiseCore< T >::resumeGenerator ( )
inline

Resume the generator from its last co_yield point, so it can yield the next value.

Called by a MultiPromiseAwaiter_ when the MultiPromise is co_awaited, after a value has been successfully awaited.

66 {
68 if (generatorHandle_) {
69 const auto generatorHandle = generatorHandle_.value();
70 generatorHandle_.reset();
71 Loop::enqueue(generatorHandle);
72 }
73 }
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73
PromiseState state_
Definition promise_core.h:188

◆ setHandle()

template<typename T >
void uvco::MultiPromiseCore< T >::setHandle ( std::coroutine_handle<>  handle)
inlineoverridevirtual

See PromiseCore::setHandle. Called by a MultiPromise when it is co_awaited.

In contrast to a PromiseCore, a finished multipromise core can be reset to the waiting state, in order to yield the next value, when the MultiPromise is co_awaited again.

Reimplemented from uvco::PromiseCore< T >.

39 {
40 // Once an external scheduler works, Promises will not be nested anymore
41 // (resume called by resume down in the stack)
42 //
43 // BOOST_ASSERT(PromiseCore<T>::state_
44 // == PromiseState::init || PromiseCore<T>::state_ ==
45 // PromiseState::finished);
46 //
47 // state is init or running (latter can occur if setHandle is called from a
48 // stack originating at resume()).
50 "MultiPromise must be co_awaited before next yield");
51 BOOST_ASSERT_MSG(!PromiseCore<T>::handle_,
52 "MultiPromise must be co_awaited before next yield");
55 }
std::optional< std::coroutine_handle<> > handle_
Definition promise_core.h:187

◆ suspendGenerator()

template<typename T >
void uvco::MultiPromiseCore< T >::suspendGenerator ( std::coroutine_handle<>  handle)
inline

Suspend the generator coroutine at the current co_yield point by storing the handle for a later resumption.

Called by the MultiPromise<...>::yield_value method when co_yield is invoked inside the generator.

80 {
81 BOOST_ASSERT_MSG(!generatorHandle_,
82 "MultiPromiseCore::suspendGenerator: generatorHandle_ is "
83 "already set");
84 generatorHandle_ = handle;
85 }

◆ terminated()

template<typename T >
void uvco::MultiPromiseCore< T >::terminated ( )
inline

Mark generator as finished, yielding no more values. Called from within the MultiPromise upon return_value and unhandled_exception. From hereon awaiting the generator will either rethrow the thrown exception, or yield nullopt.

106{ terminated_ = true; }

Member Data Documentation

◆ generatorHandle_

template<typename T >
std::optional<std::coroutine_handle<> > uvco::MultiPromiseCore< T >::generatorHandle_
private

Coroutine handle referring to the suspended generator.

◆ terminated_

template<typename T >
bool uvco::MultiPromiseCore< T >::terminated_ = false
private

Set to true once the generator coroutine has returned or has been cancelled.


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