106 lines
4.0 KiB
Markdown
106 lines
4.0 KiB
Markdown
[task.state]
|
||
|
||
# 33 Execution control library [[exec]](./#exec)
|
||
|
||
## 33.13 Coroutine utilities [[exec.coro.util]](exec.coro.util#task.state)
|
||
|
||
### 33.13.6 execution::task [[exec.task]](exec.task#task.state)
|
||
|
||
#### 33.13.6.4 Class template task::*state* [task.state]
|
||
|
||
namespace std::execution {template<class T, class Environment>template<[receiver](exec.recv.concepts#concept:receiver "33.7.1 Receiver concepts [exec.recv.concepts]") Rcvr>class task<T, Environment>::*state* { // *exposition only*public:using operation_state_concept = operation_state_t; template<class R>*state*(coroutine_handle<promise_type> h, R&& rr); ~*state*(); void start() & noexcept; private:using *own-env-t* = *see below*; // *exposition only* coroutine_handle<promise_type> *handle*; // *exposition only* remove_cvref_t<Rcvr> *rcvr*; // *exposition only**own-env-t* *own-env*; // *exposition only* Environment *environment*; // *exposition only*};}
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L7336)
|
||
|
||
The type *own-env-t* is Environment::template env_type<decltype(get_env(declval<Rcvr>()))> if that[*qualified-id*](expr.prim.id.qual#nt:qualified-id "7.5.5.3 Qualified names [expr.prim.id.qual]") is valid and denotes a type, env<> otherwise[.](#1.sentence-1)
|
||
|
||
[ð](#lib:task::state,constructor)
|
||
|
||
`template<class R>
|
||
state(coroutine_handle<promise_type> h, R&& rr);
|
||
`
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L7347)
|
||
|
||
*Effects*: Initializes
|
||
|
||
- [(2.1)](#2.1)
|
||
|
||
*handle* with std::move(h);
|
||
|
||
- [(2.2)](#2.2)
|
||
|
||
*rcvr* with std::forward<R>(rr);
|
||
|
||
- [(2.3)](#2.3)
|
||
|
||
*own-env* with *own-env-t*(get_env(*rcvr*)) if that expression
|
||
is valid and *own-env-t*() otherwise[.](#2.3.sentence-1)
|
||
If neither of these expressions is valid, the program is ill-formed[.](#2.3.sentence-2)
|
||
|
||
- [(2.4)](#2.4)
|
||
|
||
*environment* withEnvironment(*own-env*) if that expression is
|
||
valid, otherwise Environment(get_env(*rcvr*)) if this expression is valid, otherwise Environment()[.](#2.4.sentence-1)
|
||
If neither of these expressions is valid, the program is ill-formed[.](#2.4.sentence-2)
|
||
|
||
[ð](#lib:task::state,destructor)
|
||
|
||
`~state();
|
||
`
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L7370)
|
||
|
||
*Effects*: Equivalent to:if (*handle*)*handle*.destroy();
|
||
|
||
[ð](#lib:start,task::state)
|
||
|
||
`void start() & noexcept;
|
||
`
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L7384)
|
||
|
||
*Effects*: Let *prom* be the object *handle*.promise()[.](#4.sentence-1)
|
||
|
||
Associates *STATE*(*prom*), *RCVR*(*prom*), and *SCHED*(*prom*) with *this as follows:
|
||
|
||
- [(4.1)](#4.1)
|
||
|
||
*STATE*(*prom*) is *this[.](#4.1.sentence-1)
|
||
|
||
- [(4.2)](#4.2)
|
||
|
||
*RCVR*(*prom*) is *rcvr*[.](#4.2.sentence-1)
|
||
|
||
- [(4.3)](#4.3)
|
||
|
||
*SCHED*(*prom*) is the object initialized
|
||
with scheduler_type(get_scheduler(get_env(*rcvr*))) if that expression is valid and scheduler_type() otherwise[.](#4.3.sentence-1)
|
||
If neither of these expressions is valid, the program is ill-formed[.](#4.3.sentence-2)
|
||
|
||
Let *st* be get_stop_token(get_env(*rcvr*))[.](#4.sentence-3)
|
||
|
||
Initializes *prom*.*token* and*prom*.*source* such that
|
||
|
||
- [(4.4)](#4.4)
|
||
|
||
*prom*.*token*.stop_requested() returns*st*.stop_requested();
|
||
|
||
- [(4.5)](#4.5)
|
||
|
||
*prom*.*token*.stop_possible() returns*st*.stop_possible(); and
|
||
|
||
- [(4.6)](#4.6)
|
||
|
||
for types Fn and Init such that both[invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<Fn> and[constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_from [concept.constructible]")<Fn, Init> are modeled,stop_token_type::callback_type<Fn> models[*stoppable-callback-for*](stoptoken.concepts#concept:stoppable-callback-for "32.3.3 Stop token concepts [stoptoken.concepts]")<Fn, stop_token_type, Init>[.](#4.sentence-4)
|
||
|
||
After that invokes *handle*.resume()[.](#4.sentence-5)
|