namespace std::execution {
template <class T, class Environment>
template <receiver R>
class task<T, Environment>::state { // exposition only
public:
using operation_state_concept = operation_state_tag;
template <class Rcvr>
state(coroutine_handle<promise_type> h, Rcvr&& rr);
~state();
void start() & noexcept;
stop_token_type get-stop-token(); // exposition only
private:
using own-env-t = see below; // exposition only
coroutine_handle<promise_type> handle; // exposition only
remove_cvref_t<R> rcvr; // exposition only
own-env-t own-env; // exposition only
optional<stop_source_type> source; // exposition only
Environment environment; // exposition only
optional<T> result; // exposition only; is_void_v<T>がfalseのときのみ有効
exception_ptr error; // exposition only
};
}
概要
task<T,E>::stateは、タスクコルーチン動作の説明専用クラステンプレートである。
クラス仕様
説明専用のown-env-tは、有効な型ならばEnvironment::template env_type<decltype(get_env(declval<R>()))>となる。そうでなければenv<>となる。
template <class Rcvr>
state(coroutine_handle<promise_type> h, Rcvr&& rr);
- 効果 :
~state();
-
効果 : 以下と等価。
if (handle) handle.destroy();
void start() & noexcept;
-
効果 : 説明用の
promをhandle.promise()オブジェクトとする。*thisと関連するSTATE(prom)、RCVR(prom)、SCHED(prom)を下記とする。STATE(prom):*thisRCVR(prom):rcvrSCHED(prom): 式が有効ならばstart_scheduler_type(get_start_scheduler(get_env(rcvr)))で初期化したオブジェクト、そうでなればstart_scheduler_type()。いずれの式も適格でなければ、プログラムは不適格となる。
その後、
handle.resume()を呼び出す。
stop_token_type get-stop-token();
-
効果 :
same_as<decltype(declval<stop_source_type>().get_token()), decltype(get_stop_token(get_env(rcvr)))>がtrueのとき、get_stop_token(get_env(rcvr))を返す。そうではなく、source.has_value()がfalseのとき、下記の値でsourceを初期化する。source->stop_requested()はget_stop_token(get_env(rcvr))->stop_requested()を返し、かつsource->stop_possible()はget_stop_token(get_env(rcvr))->stop_possible()を返す。
最後に、
source->get_token()を返す。
バージョン
言語
- C++26