|
| 1 | +# task::state |
| 2 | +* execution[meta header] |
| 3 | +* class template[meta id-type] |
| 4 | +* std::execution[meta namespace] |
| 5 | +* cpp26[meta cpp] |
| 6 | + |
| 7 | +```cpp |
| 8 | +namespace std::execution { |
| 9 | + template <class T, class Environment> |
| 10 | + template <receiver R> |
| 11 | + class task<T, Environment>::state { // exposition only |
| 12 | + public: |
| 13 | + using operation_state_concept = operation_state_t; |
| 14 | + |
| 15 | + template <class Rcvr> |
| 16 | + state(coroutine_handle<promise_type> h, Rcvr&& rr); |
| 17 | + ~state(); |
| 18 | + void start() & noexcept; |
| 19 | + |
| 20 | +private: |
| 21 | + using own-env-t = see below; // exposition only |
| 22 | + coroutine_handle<promise_type> handle; // exposition only |
| 23 | + remove_cvref_t<R> rcvr; // exposition only |
| 24 | + own-env-t own-env; // exposition only |
| 25 | + Environment environment; // exposition only |
| 26 | + }; |
| 27 | +} |
| 28 | +``` |
| 29 | +* receiver[link ../receiver.md] |
| 30 | +* task[link ../task.md] |
| 31 | +* operation_state_t[link ../operation_state.md] |
| 32 | +* coroutine_handle[link /reference/coroutine/coroutine_handle.md] |
| 33 | +* promise_type[link promise_type.md.nolink] |
| 34 | +* own-env-t[italic] |
| 35 | +
|
| 36 | +## 概要 |
| 37 | +`task<T,E>::state`は、[タスクコルーチン](../task.md)動作の説明専用クラステンプレートである。 |
| 38 | +
|
| 39 | +
|
| 40 | +## クラス仕様 |
| 41 | +説明専用の`own-env-t`は、有効な型ならば`Environment::`[`template env_type`](../task.md)`<decltype(`[`get_env`](../get_env.md)`(declval<R>()))>`となる。そうでなければ[`env<>`](../env.md)となる。 |
| 42 | +
|
| 43 | +```cpp |
| 44 | +template <class Rcvr> |
| 45 | +state(coroutine_handle<promise_type> h, Rcvr&& rr); |
| 46 | +``` |
| 47 | +* coroutine_handle[link /reference/coroutine/coroutine_handle.md] |
| 48 | +* promise_type[link promise_type.md.nolink] |
| 49 | + |
| 50 | +- 効果 : |
| 51 | + - `handle`を[`std::move`](/reference/utility/move.md)`(h);`で初期化する。 |
| 52 | + - `rcvr`を[`std::forward`](/reference/utility/forward.md)`<Rcvr>(rr)`で初期化する。 |
| 53 | + - `own-env`を、式が有効ならば`own-env-t(`[`get_env`](../get_env.md)`(rcvr))`で、そうでなければ`own-env-t()`で初期化する。いずれの式も適格でなければ、プログラムは不適格となる。 |
| 54 | + - `environment`を、式が有効ならば`Environment(own-env)`で、そうではなく式が有効ならば`Environment(`[`get_env`](../get_env.md)`(rcvr))`で、そうでなければ`Environment()`で初期化する。いずれの式も適格でなければ、プログラムは不適格となる。 |
| 55 | + |
| 56 | +```cpp |
| 57 | +~state(); |
| 58 | +``` |
| 59 | + |
| 60 | +- 効果 : 以下と等価。 |
| 61 | + |
| 62 | + ```cpp |
| 63 | + if (handle) |
| 64 | + handle.destroy(); |
| 65 | + ``` |
| 66 | + * destroy()[link /reference/coroutine/coroutine_handle/destroy.md] |
| 67 | + |
| 68 | +```cpp |
| 69 | +void start() & noexcept; |
| 70 | +``` |
| 71 | + |
| 72 | +- 効果 : 説明用の`prom`を`handle.`[`promise()`](/reference/coroutine/coroutine_handle/promise.md)オブジェクトとする。`*this`と関連する`STATE(prom)`、`RCVR(prom)`、`SCHED(prom)`を下記とする。 |
| 73 | + - `STATE(prom)` : `*this` |
| 74 | + - `RCVR(prom)` : `rcvr` |
| 75 | + - `SCHED(prom)` : 式が有効ならば[`scheduler_type`](../task.md)`(`[`get_scheduler`](../get_scheduler.md)`(`[`get_env`](../get_env.md)`(rcvr)))`で初期化したオブジェクト、そうでなれば`scheduler_type()`。いずれの式も適格でなければ、プログラムは不適格となる。 |
| 76 | + |
| 77 | + 説明用の`st`を[`get_stop_token`](../../get_stop_token.md)`(`[`get_env`](../get_env.md)`(rcvr))`とする。`prom.token`と`prom.source`を下記のように初期化する。 |
| 78 | + |
| 79 | + - `prom.token.`[`stop_requested()`](/reference/stop_token/stoppable_token.md) : `st.stop_requested()`を返す。 |
| 80 | + - `prom.token.`[`stop_possible()`](/reference/stop_token/stoppable_token.md) : `st.stop_possible()`を返す。 |
| 81 | + ― 型`Fn`と型`Init`をそれぞれ[`invocalbe`](/reference/concepts/invocable.md)`<F>`と[`constructible_from`](/reference/concepts/constructible_from.md)`<Fn, Init>`のモデルとしたとき、[`stop_token::callback_type`](/reference/stop_token/stoppable_token.md)`<Fn>`は[`stoppable-callback-for`](/reference/stop_token/stoppable_token.md)`<Fn,` [`stop_token_type`](../task.md)`, Init>`のモデルである。 |
| 82 | + |
| 83 | + その後、`handle.`[`resume()`](/reference/coroutine/coroutine_handle/resume.md)を呼び出す。 |
| 84 | + |
| 85 | + |
| 86 | +## バージョン |
| 87 | +### 言語 |
| 88 | +- C++26 |
| 89 | + |
| 90 | + |
| 91 | +## 関連項目 |
| 92 | +- [`execution::task::promise_type`](promise_type.md.nolink) |
| 93 | + |
| 94 | + |
| 95 | +## 参照 |
| 96 | +- [P3552R3 Add a Coroutine Task Type](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3552r3.html) |
0 commit comments