Skip to content

Commit a4d3b95

Browse files
committed
execution: P2079R10 Replaceability API (#1511)
- receiver_proxyクラス - bulk_item_receiver_proxyクラス
1 parent a516717 commit a4d3b95

File tree

9 files changed

+177
-29
lines changed

9 files changed

+177
-29
lines changed

reference/execution/execution/parallel_scheduler.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace std::execution {
3434
3535
説明用の`sch2`を`parallel_scheduler`型のオブジェクトとしたとき、`BACKEND-OF(sch)`と`BACKEND-OF(sch2)`が同一オブジェクトを指す場合に限って、2つのオブジェクト`sch`と`sch2`は等しい。
3636
37-
`rcvr`を[Receiver](receiver.md)としたとき、基底`B`を持つ`rcvr`のプロキシ(proxy for `rcvr` with base `B`)は下記を満たす`B`型の左辺値`r`となる。
37+
`rcvr`を[Receiver](receiver.md)としたとき、基底`B`を持つ`rcvr`のプロキシは下記を満たす`B`型の左辺値`r`となる。
3838
3939
- `r.set_value()`は、[`set_value`](set_value.md)`(std::move(rcvr))`と同じ効果。
4040
- `r.set_error(e)`は、`e`を[`exception_ptr`](/reference/exception/exception_ptr.md)として、[`set_error`](set_error.md)`(std::move(rcvr), std::move(e))`と同じ効果。
@@ -43,22 +43,22 @@ namespace std::execution {
4343
プロキシ`r`に対する事前確保バックエンドストレージ(preallocated backend storage)は、[`span`](/reference/span/span.md)`<`[`byte`](/reference/cstddef/byte.md)`>`型のオブジェクト`s`であり、`r`に対して[`set_value`](set_value.md)/[`set_error`](set_error.md)/[`set_stopped`](set_stopped.md)いずれかが呼び出されるまで範囲`s`は有効かつ上書き可能である。
4444
4545
呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルクチャンク化プロキシ(bulk chunked proxy)は、基底
46-
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md.nolink)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`, `j`に対する`r.execute(i, j)`は`f(i, j, args...)`と同じ効果を持つ。
46+
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`, `j`に対する`r.execute(i, j)`は`f(i, j, args...)`と同じ効果を持つ。
4747
4848
呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルク非チャンク化プロキシ(bulk unchunked proxy)は、基底
49-
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md.nolink)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`に対する`r.execute(i, i + 1)`は`f(i, args...)`と同じ効果を持つ。
49+
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`に対する`r.execute(i, i + 1)`は`f(i, args...)`と同じ効果を持つ。
5050
5151
52-
### `schedule` ファクトリ
52+
### `schedule`アルゴリズム
5353
説明用の`b`を`BACKEND-OF(sch)`、`sndr`を[`schedule`](schedule.md)`(sch)`が返すオブジェクト、`rcvr`を[Receiver](receiver.md)とする。`rcvr`が`sndr`に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
5454
5555
- `sndr`が値完了するならば、[`b.schedule`](system_context_replaceability/parallel_scheduler_backend/schedule.md)`(r, s)`が呼ばれる。このとき、
56-
- `r`は基底[`system_context_replaceability::receiver_proxy`](system_context_replaceability/receiver_proxy.md.nolink)を持つ`rcvr`のプロキシであり、かつ
56+
- `r`は基底[`system_context_replaceability::receiver_proxy`](system_context_replaceability/receiver_proxy.md)を持つ`rcvr`のプロキシであり、かつ
5757
- `s`は`r`に対する事前確保バックエンドストレージである。
5858
- 他の全ての完了操作は、変更なしに転送される。
5959
6060
61-
### `bulk_chunked` アダプタ
61+
### `bulk_chunked`アルゴリズム
6262
`parallel_scheduler`は[`bulk_chunked`](bulk_chunked.md)アルゴリズムのカスタマイズ実装を提供する。[Receiver](receiver.md)`rcvr`が`bulk_chunked(sndr, pol, shape, f)`が返す[Sender](sender.md)に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
6363
6464
- `sndr`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_chunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_chunked.md)`(shape, r, s)`が呼ばれる。このとき、
@@ -67,7 +67,7 @@ namespace std::execution {
6767
- 他の全ての完了操作は、変更なしに転送される。
6868
6969
70-
### `bulk_unchunked` アダプタ
70+
### `bulk_unchunked`アルゴリズム
7171
`parallel_scheduler`は[`bulk_unchunked`](bulk_unchunked.md)アルゴリズムのカスタマイズ実装を提供する。[Receiver](receiver.md)`rcvr`が`bulk_unchunked(sndr, pol, shape, f)`が返す[Sender](sender.md)に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
7272
7373
- `sndr`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_unchunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(shape, r, s)`が呼ばれる。このとき、

reference/execution/execution/system_context_replaceability.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ namespace std::execution::system_context_replaceability {
1414
1515
| 名前 | 説明 | 対応バージョン |
1616
|------|------|----------------|
17-
| [`receiver_proxy`](system_context_replaceability/receiver_proxy.md.nolink) | バックエンド実装用のReceiverプロキシ (class) | C++26 |
18-
| [`bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md.nolink) | バックエンド実装用のバルク処理Receiverプロキシ (class) | C++26 |
17+
| [`receiver_proxy`](system_context_replaceability/receiver_proxy.md) | バックエンド実装用のReceiverプロキシ (class) | C++26 |
18+
| [`bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md) | バックエンド実装用のバルク処理Receiverプロキシ (class) | C++26 |
1919
| [`parallel_scheduler_backend`](system_context_replaceability/parallel_scheduler_backend.md) | 並列Schedulerバックエンド (class) | C++26 |
2020
| [`query_parallel_scheduler_backend`](system_context_replaceability/query_parallel_scheduler_backend.md) | 並列Schedulerバックエンドを問い合わせ (function) | C++26 |
2121
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# bulk_item_receiver_proxy
2+
* execution[meta header]
3+
* class[meta id-type]
4+
* std::execution::system_context_replaceability[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution::system_context_replaceability {
9+
struct bulk_item_receiver_proxy : receiver_proxy { see below };
10+
}
11+
```
12+
* receiver_proxy[link receiver_proxy.md]
13+
14+
## 概要
15+
`bulk_item_receiver_proxy`は、[`receiver_proxy`](receiver_proxy.md)から派生したクラス。
16+
[`bulk_chunked`](../bulk_chunked.md)および[`bulk_unchunked`](../bulk_unchunked.md)のカスタマイズで用いられ、異なる反復に対応する[`parallel_scheduler_backend`](parallel_scheduler_backend.md)実装から通知も受信する。
17+
18+
19+
## メンバ関数
20+
21+
| 名前 | 説明 | 対応バージョン |
22+
|------|------|----------------|
23+
| `virtual void execute(size_t, size_t) noexcept = 0;` | 要素範囲の作業ハンドラ | C++26 |
24+
25+
26+
## バージョン
27+
### 言語
28+
- C++26
29+
30+
### 処理系
31+
- [Clang](/implementation.md#clang): ??
32+
- [GCC](/implementation.md#gcc): ??
33+
- [ICC](/implementation.md#icc): ??
34+
- [Visual C++](/implementation.md#visual_cpp): ??
35+
36+
37+
## 関連項目
38+
- [`execution::parallel_scheduler`](../parallel_scheduler.md)
39+
40+
41+
## 参照
42+
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)

reference/execution/execution/system_context_replaceability/parallel_scheduler_backend.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace std::execution::system_context_replaceability {
1111
```
1212
1313
## 概要
14-
[並列Scheduler](../parallel_scheduler.md)バックエンドのインタフェース(純粋仮想関数)を定義するクラス
14+
`parallel_scheduler_backend`は、[並列Scheduler](../parallel_scheduler.md)バックエンド実装者向けのインタフェースを定義する
1515
1616
1717
## メンバ関数

reference/execution/execution/system_context_replaceability/parallel_scheduler_backend/schedule.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
```cpp
99
virtual void schedule(receiver_proxy& r, span<byte> s) noexcept = 0;
1010
```
11-
* receiver_proxy[link ../receiver_proxy.md.nolink]
11+
* receiver_proxy[link ../receiver_proxy.md]
12+
* span[link /reference/span/span.md]
1213
* byte[link /reference/cstddef/byte.md]
1314
1415
## 概要
@@ -23,9 +24,9 @@ virtual void schedule(receiver_proxy& r, span<byte> s) noexcept = 0;
2324
派生クラスでは、この関数を下記のように実装すべきである。
2425
2526
- 下記いずれかの式が評価される
26-
- エラーが発生せず作業が成功したとき、`r.set_value()`
27-
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、`r.set_error(eptr)`
28-
- 作業がキャンセルされたとき、`r.set_stopped()`
27+
- エラーが発生せず作業が成功したとき、[`r.set_value()`](../receiver_proxy.md)
28+
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、[`r.set_error`](../receiver_proxy.md)`(eptr)`
29+
- 作業がキャンセルされたとき、[`r.set_stopped()`](../receiver_proxy.md)
2930
- 任意の`r.set_value()`呼び出しは、`*this`で表される実行コンテキストの実行エージェント上で発生する。
3031
3132

reference/execution/execution/system_context_replaceability/parallel_scheduler_backend/schedule_bulk_chunked.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
* cpp26[meta cpp]
77

88
```cpp
9-
virtual void schedule_bulk_chunked(size_t n, bulk_item_receiver_proxy& r,
9+
virtual void schedule_bulk_chunked(size_t n,
10+
bulk_item_receiver_proxy& r,
1011
span<byte> s) noexcept = 0;
1112
```
12-
* bulk_item_receiver_proxy[link ../bulk_item_receiver_proxy.md.nolink]
13+
* bulk_item_receiver_proxy[link ../bulk_item_receiver_proxy.md]
14+
* span[link /reference/span/span.md]
1315
* byte[link /reference/cstddef/byte.md]
1416
1517
## 概要
@@ -24,12 +26,12 @@ virtual void schedule_bulk_chunked(size_t n, bulk_item_receiver_proxy& r,
2426
派生クラスでは、この関数を下記のように実装すべきである。
2527
2628
- 下記いずれかの式が評価される
27-
- エラーが発生せず作業が成功したとき、`r.set_value()`
28-
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、`r.set_error(eptr)`
29-
- 作業がキャンセルされたとき、`r.set_stopped()`
30-
- `r.execute(b, e)`が呼ばれたとき、`b`と`e`は範囲`[0, n)`内かつ`b < e`である
31-
- 範囲`[0, n)`の各`i`について、`i`が`[b, e)`の範囲内にある`r.execute(b, e)`の呼び出しが最大で1つだけ存在する。
32-
- `r.set_value()`が呼び出されたとき、`[0, n)`の各`i`に対して、`i`が`[b, e)`の範囲内となる`r.execute(b, e)`の呼び出しが正確に1つだけ存在する。
29+
- エラーが発生せず作業が成功したとき、[`r.set_value()`](../receiver_proxy.md)
30+
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、[`r.set_error`](../receiver_proxy.md)`(eptr)`
31+
- 作業がキャンセルされたとき、[`r.set_stopped()`](../receiver_proxy.md)
32+
- [`r.execute`](../bulk_item_receiver_proxy.md)`(b, e)`が呼ばれたとき、`b`と`e`は範囲`[0, n)`内かつ`b < e`である
33+
- 範囲`[0, n)`の各`i`について、`i`が`[b, e)`の範囲内にある[`r.execute`](../bulk_item_receiver_proxy.md)`(b, e)`の呼び出しが最大で1つだけ存在する。
34+
- `r.set_value()`が呼び出されたとき、`[0, n)`の各`i`に対して、`i`が`[b, e)`の範囲内となる[`r.execute`](../bulk_item_receiver_proxy.md)`(b, e)`の呼び出しが正確に1つだけ存在する。
3335
- `r`上での全ての`execute`呼び出しは、`r`上での`set_value`/`set_error`/`set_stopped`いずれかの呼び出しよりも前に発生する。
3436
- `r`上での全ての`execute`および`set_value`呼び出しは、`*this`で表される実行コンテキストの実行エージェント上で行われる。
3537

reference/execution/execution/system_context_replaceability/parallel_scheduler_backend/schedule_bulk_unchunked.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
* cpp26[meta cpp]
77

88
```cpp
9-
virtual void schedule_bulk_unchunked(size_t n, bulk_item_receiver_proxy& r,
9+
virtual void schedule_bulk_unchunked(size_t n,
10+
bulk_item_receiver_proxy& r,
1011
span<byte> s) noexcept = 0;
1112
```
12-
* bulk_item_receiver_proxy[link ../bulk_item_receiver_proxy.md.nolink]
13+
* bulk_item_receiver_proxy[link ../bulk_item_receiver_proxy.md]
14+
* span[link /reference/span/span.md]
1315
* byte[link /reference/cstddef/byte.md]
1416
1517
## 概要
@@ -24,11 +26,11 @@ virtual void schedule_bulk_unchunked(size_t n, bulk_item_receiver_proxy& r,
2426
派生クラスでは、この関数を下記のように実装すべきである。
2527
2628
- 下記いずれかの式が評価される
27-
- エラーが発生せず作業が成功したとき、`r.set_value()`
28-
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、`r.set_error(eptr)`
29-
- 作業がキャンセルされたとき、`r.set_stopped()`
30-
- `r.execute(b, e)`が呼ばれたとき、`b`は範囲`[0, n)`内かつ`e`は`b + 1`に等しい。`[0, n)`の各`i`について、`r.execute(i, i + 1)`の呼び出しが最大で1つだけ存在する。
31-
- `r.set_value()`が呼び出されたとき、`[0, n)`の各`i`に対して、`r.execute(i, i + 1)`の呼び出しが正確に1つだけ存在する。
29+
- エラーが発生せず作業が成功したとき、[`r.set_value()`](../receiver_proxy.md)
30+
- エラーが発生したとき、`eptr`を[`exception_ptr`](/reference/exception/exception_ptr.md)型のオブジェクトとして、[`r.set_error`](../receiver_proxy.md)`(eptr)`
31+
- 作業がキャンセルされたとき、[`r.set_stopped()`](../receiver_proxy.md)
32+
- [`r.execute`](../bulk_item_receiver_proxy.md)`(b, e)`が呼ばれたとき、`b`は範囲`[0, n)`内かつ`e`は`b + 1`に等しい。`[0, n)`の各`i`について、[`r.execute`](../bulk_item_receiver_proxy.md)`(i, i + 1)`の呼び出しが最大で1つだけ存在する。
33+
- `r.set_value()`が呼び出されたとき、`[0, n)`の各`i`に対して、[`r.execute`](../bulk_item_receiver_proxy.md)`(i, i + 1)`の呼び出しが正確に1つだけ存在する。
3234
- `r`上での全ての`execute`呼び出しは、`r`上での`set_value`/`set_error`/`set_stopped`いずれかの呼び出しよりも前に発生する。
3335
- `r`上での全ての`execute`および`set_value`呼び出しは、`*this`で表される実行コンテキストの実行エージェント上で行われる。
3436
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# receiver_proxy
2+
* execution[meta header]
3+
* class[meta id-type]
4+
* std::execution::system_context_replaceability[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution::system_context_replaceability {
9+
struct receiver_proxy;
10+
}
11+
```
12+
13+
## 概要
14+
`receiver_proxy`は、[`parallel_scheduler_backend`](parallel_scheduler_backend.md)実装から完了操作のトリガー通知を受け取る[`Receiver`](../receiver.md)を表現する。
15+
16+
17+
## メンバ関数
18+
19+
| 名前 | 説明 | 対応バージョン |
20+
|------|------|----------------|
21+
| `virtual ~receiver_proxy() = default;` | デストラクタ | C++26 |
22+
| `virtual void set_value() noexcept = 0;` | 値完了ハンドラ | C++26 |
23+
| `virtual void set_error(exception_ptr) noexcept = 0;` | エラー完了ハンドラ | C++26 |
24+
| `virtual void set_stopped() noexcept = 0;` | 停止完了ハンドラ | C++26 |
25+
| [`try_query`](receiver_proxy/try_query.md) | クエリオブジェクト問い合わせ | C++26 |
26+
27+
28+
## バージョン
29+
### 言語
30+
- C++26
31+
32+
### 処理系
33+
- [Clang](/implementation.md#clang): ??
34+
- [GCC](/implementation.md#gcc): ??
35+
- [ICC](/implementation.md#icc): ??
36+
- [Visual C++](/implementation.md#visual_cpp): ??
37+
38+
39+
## 関連項目
40+
- [`execution::parallel_scheduler`](../parallel_scheduler.md)
41+
42+
43+
## 参照
44+
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# try_query
2+
* execution[meta header]
3+
* std::execution::system_context_replaceability[meta namespace]
4+
* receiver_proxy[meta class]
5+
* function template[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
template<class P, class-type Query>
10+
optional<P> try_query(Query q) noexcept;
11+
```
12+
* class-type[link ../../../class-type.md]
13+
* optional[link /reference/optional/optional.md]
14+
15+
## 概要
16+
[`parallel_scheduler`](../../parallel_scheduler.md)バックエンド実装側から[Receiver](../../receiver.md)環境にアクセスするための補助関数。
17+
18+
19+
## 適格要件
20+
`P`はcv修飾された非配列オブジェクト型。
21+
22+
23+
## 戻り値
24+
説明用の`env`を`*this`が表現する[Receiver](../../receiver.md)の環境とする。
25+
下記を満たす場合は[`nullopt`](/reference/optional/nullopt_t.md)を返す。そうでなければ、`q(env)`を返す。
26+
27+
- `Query`が実装定義のサポートされたクエリ集合のメンバではない、または
28+
- `P`が実装定義のサポートされた`Query`の結果型集合のメンバではない、または
29+
- 式`q(env)`が適格でないか、cv修飾された`P`型を持たない。
30+
31+
32+
## 例外
33+
投げない
34+
35+
36+
## 備考
37+
[`get_stop_token_t`](../../../get_stop_token.md)は実装定義のサポートされたクエリ集合に含まれ、[`inplace_stop_token`](/reference/stop_token/inplace_stop_token.md)は`get_stop_token_t`の実装定義のサポートされた結果型集合のメンバである。
38+
39+
40+
## バージョン
41+
### 言語
42+
- C++26
43+
44+
### 処理系
45+
- [Clang](/implementation.md#clang): ??
46+
- [GCC](/implementation.md#gcc): ??
47+
- [ICC](/implementation.md#icc): ??
48+
- [Visual C++](/implementation.md#visual_cpp): ??
49+
50+
51+
## 関連項目
52+
- [`execution::parallel_scheduler`](../../parallel_scheduler.md)
53+
- [`execution::parallel_scheduler_backend::parallel_scheduler_backend`](../parallel_scheduler_backend.md)
54+
55+
56+
## 参照
57+
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)

0 commit comments

Comments
 (0)