Skip to content

Commit edecb0a

Browse files
committed
execution: P3552R3 taski::state(#1521)
1 parent c26fda2 commit edecb0a

3 files changed

Lines changed: 101 additions & 5 deletions

File tree

reference/execution/execution/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace std::execution {
3434
型エイリアス`completion_signatures`は、(未規定の順序で)次のテンプレート実引数をもつ[`execution::completion_signatures`](completion_signatures.md)の特殊化となる :
3535
3636
- `T`が`void`のとき[`set_value_t`](set_value.md)`()`、そうでなければ`set_value_t(T)`
37-
- `error_types`で表される[`execution::completion_signatures`](completion_signatures.md)の特殊化のテンプレート実引数(エラー型`Err`を持つ[`set_error_t`](set_error.md)`(Err)...`)
38-
- [`set_stopped_t`](set_stopped.md)
37+
- `error_types`で表される[`execution::completion_signatures`](completion_signatures.md)の特殊化のテンプレート実引数(エラー型`Err`を持つ[`set_error_t`](set_error.md)`(Err)`)
38+
- [`set_stopped_t`](set_stopped.md)`()`
3939
4040
4141
## メンバ関数
@@ -58,7 +58,7 @@ namespace std::execution {
5858
| `stop_source_type` | コルーチンの停止ソース型 | C++26 |
5959
| `stop_token_type` | コルーチンの停止トークン型 | C++26 |
6060
| `error_types` | コルーチンの[エラー完了](set_error.md)の結果型 | C++26 |
61-
| [`state`](task/state.md.nolink) | タスクコルーチン動作の説明専用クラステンプレート | C++26 |
61+
| [`state`](task/state.md) | タスクコルーチン動作の説明専用クラステンプレート | C++26 |
6262
| [`promise_type`](task/promise_type.md.nolink) | タスクコルーチンの[Promise型](/lang/cpp20/coroutines.md) | C++26 |
6363
6464

reference/execution/execution/task/connect.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ template<receiver Rcvr>
1010
state<Rcvr> connect(Rcvr&& recv) &&;
1111
```
1212
* receiver[link ../receiver.md]
13-
* state[italic]
13+
* state[link state.md]
1414
1515
## 概要
1616
[Receiver](../receiver.md)と接続する。
@@ -27,7 +27,7 @@ state<Rcvr> connect(Rcvr&& recv) &&;
2727
return state<Rcvr>(exchange(handle, {}), std::forward<Rcvr>(recv));
2828
```
2929
* exchange[link /reference/utility/exchange.md]
30-
* state[italic]
30+
* state[link state.md]
3131

3232

3333
## バージョン
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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

Comments
 (0)