Skip to content

Commit d6addf6

Browse files
committed
execution: sender_adaptor_closure (#1384)
1 parent f27450b commit d6addf6

File tree

9 files changed

+84
-11
lines changed

9 files changed

+84
-11
lines changed

reference/execution/execution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ namespace std::execution {
110110
111111
| 名前 | 説明 | 対応バージョン |
112112
|------|------|----------------|
113-
| [`execution::sender_adaptor_closure`](execution/sender_adaptor_closure.md.nolink) | Senderアダプタ実装用クロージャ型(class template) | C++26 |
113+
| [`execution::sender_adaptor_closure`](execution/sender_adaptor_closure.md) | パイプライン記法をサポートするSenderアダプタ実装補助 (class template) | C++26 |
114114
| [`execution::starts_on`](execution/starts_on.md) | 指定Scheduler上で開始する (customization point object) | C++26 |
115115
| [`execution::continues_on`](execution/continues_on.md) | 指定Scheduler上で継続する (customization point object) | C++26 |
116116
| [`execution::on`](execution/on.md) | 指定Senderのみ別Scheduler上で実行する (customization point object) | C++26 |

reference/execution/execution/bulk.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`bulk`は、インデクス空間の各インデクスに対してタスクを反復実行するSenderアダプタである。
1717
18-
`bulk`はパイプライン記法をサポートする
18+
`bulk`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

reference/execution/execution/continues_on.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`continues_on`は、指定[Scheduler](scheduler.md)上で完了させるSenderアダプタである。
1717
18-
`continues_on`はパイプライン記法をサポートする
18+
`continues_on`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

reference/execution/execution/into_variant.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`into_variant`は、複数の[値完了シグネチャ](set_value.md)を持つ入力[Sender](sender.md)から複数[`tuple`](/reference/tuple/tuple.md)型からなる[`variant`](/reference/variant/variant.md)型の[値完了シグネチャへと変換](value_types_of_t.md)するSenderアダプタである。
1717
18-
`into_variant`はパイプライン記法をサポートする
18+
`into_variant`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

reference/execution/execution/let_value.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`let_value`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[値完了](set_value.md)結果から入れ子の非同期操作へと変換するSenderアダプタである。
1717
18-
`let_value`はパイプライン記法をサポートする
18+
`let_value`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

reference/execution/execution/on.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ namespace std::execution {
1818
- `on(sch, sndr)` : [Sender](sender.md)`sndr`を[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェント上で開始し、完了後に`on`Senderが開始された実行リソースへと実行制御を戻す。
1919
- `on(sndr, sch, closure)` : [Sender](sender.md)`sndr`の完了後に、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェントへ実行を移し、`sndr`の完了結果をもってSenderアダプタクロージャ`closure`を実行し、Sender`sndr`が完了された実行リソースへと実行制御を戻す。
2020
21-
`on`はパイプライン記法をサポートする
21+
`on`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
2222
2323
2424
## 効果
2525
### 呼び出し式 `on(sch, sndr)`
2626
説明用の式`sch`と`sndr`に対して、下記いずれかが`true`となるとき呼び出し式`on(sch, sndr)`は不適格となる。
2727
2828
- `decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは
29-
- `decltype((sndr))`が[`sender`](sender.md)を満たさず、かつパイプライン可能Senderアダプタクロージャオブジェクトではない、もしくは
30-
- `decltype((sndr))`が[`sender`](sender.md)を満たし、かつパイプライン可能Senderアダプタクロージャオブジェクトである
29+
- `decltype((sndr))`が[`sender`](sender.md)を満たさず、かつ[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)ではない、もしくは
30+
- `decltype((sndr))`が[`sender`](sender.md)を満たし、かつ[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)である
3131
3232
そうでなければ、呼び出し式`on(sch, sndr)`は`sch`が1回だけ評価されることを除いて、下記と等価。
3333
@@ -48,7 +48,7 @@ transform_sender(
4848

4949
- `decltype((sch))`[`scheduler`](scheduler.md)を満たさない、もしくは
5050
- `decltype((sndr))`[`sender`](sender.md)を満たさない、もしくは
51-
- `closure`がパイプライン可能Senderアダプタクロージャオブジェクトではない
51+
- `closure`[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)ではない
5252

5353
そうでなければ、呼び出し式`on(sndr, sch, closure)``sndr`が1回だけ評価されることを除いて、下記と等価。
5454

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# sender_adaptor_closure
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-type D>
10+
struct sender_adaptor_closure { };
11+
}
12+
```
13+
14+
## 概要
15+
`sender_adaptor_closure`は、ユーザ定義のパイプ可能Senderアダプタクロージャオブジェクトの実装を補助するクラステンプレートである。
16+
17+
`sender_adaptor_closure<T>`を基底クラスとして持つクラス型`T`のオブジェクトは、パイプ可能Senderアダプタクロージャオブジェクトとなる。
18+
19+
`sender_adaptor_closure`のテンプレートパラメータ`D`は不完全型でもよい。
20+
`|`演算子のオペランドにcv修飾された型`D`の式が登場するまでに、`D`は完全型かつ[`derived_from`](/reference/concepts/derived_from.md)`<sender_adaptor_closure<D>>`のモデルとなるべき。
21+
22+
23+
### パイプ可能Senderアダプタクロージャオブジェクト
24+
パイプ可能Senderアダプタクロージャオブジェクト(pipeable sender adaptor closure object)とは、1つ以上の[`sender`](sender.md)を引数にとり、戻り値として[`sender`](sender.md)を返す関数オブジェクトである。
25+
26+
パイプ可能Senderアダプタクロージャオブジェクト`c`と型`decltype((sndr))`が[`sender`](sender.md)のモデルである式`sndr`に対して、下記の2つの式は等価であり、いずれも[`sender`](sender.md)を生成する。
27+
28+
```cpp
29+
c(sndr)
30+
sndr | c
31+
```
32+
33+
さらにパイプ可能Senderアダプタクロージャオブジェクト`d`が与えられたとき、式 `c | d` は別のパイプ可能Senderアダプタクロージャオブジェクト`e`となる。
34+
このとき、`e`は下記の特性を持つ完全転送呼び出しラッパー(perfect forwarding call wrapper)である。
35+
36+
- 対象オブジェクトは、`d`で直接非リスト初期化された型`decltype(auto(d))`のオブジェクト`d2`である。
37+
- `c`で直接非リスト初期化された型`decltype(auto(c))`のオブジェクト`c2`を、1個の束縛引数エンティティとして持つ。
38+
- 説明用の`arg``e`に対する関数呼び出し式の引数としたとき、呼び出しパターン`d2(c2(arg))`に対応する。
39+
40+
`c | d` は、`e`の全て状態エンティティ(state entities)の初期化が適格な場合に限って適格となる。
41+
42+
43+
### パイプ可能Senderアダプタオブジェクト
44+
パイプ可能Senderアダプタオブジェクト(pipeable sender adaptor object)とは、第1引数に[`sender`](sender.md)をとり、戻り値として[`sender`](sender.md)を返すカスタマイゼーションポイントオブジェクトである。
45+
パイプ可能Senderアダプタオブジェクトが1個の引数しかとらないとき、パイプ可能Senderアダプタクロージャオブジェクトとなる。
46+
47+
パイプ可能Senderアダプタオブジェクト`adaptor`が1個より多い引数をとるとき、型`decltype((sndr))`[`sender`](sender.md)のモデルである式`sndr``args...`を式`adaptor(sndr, args...)`が適格となる引数リスト、型パック`BoundsArgs``decltype(auto(args))...`とする。
48+
`adaptor(args...)`は、下記の特性をもつ完全転送呼び出しラッパーであるパイプ可能Senderアダプタクロージャオブジェクト`f`を生成する。
49+
50+
- 対象オブジェクトは`adaptor`のコピー。
51+
- 束縛引数エンティティ`bound_args`は、それぞれ[`std::forward`](/reference/utility/forward.md)`<decltype((args))>(args)...`で直接非リスト初期化された型`BoundArgs...`のオブジェクトから構成される。
52+
- 説明用の`rcvr``f`に対する関数呼び出し式の引数としたとき、呼び出しパターン`adaptor(rcvr, bound_args...)`に対応する。
53+
54+
`adaptor(args...)`は、前述の通り結果の束縛引数エンティティの初期化が適格な場合に限って適格となる。
55+
56+
57+
## バージョン
58+
### 言語
59+
- C++26
60+
61+
### 処理系
62+
- [Clang](/implementation.md#clang): ??
63+
- [GCC](/implementation.md#gcc): ??
64+
- [ICC](/implementation.md#icc): ??
65+
- [Visual C++](/implementation.md#visual_cpp): ??
66+
67+
68+
## 関連項目
69+
- [`execution::sender`](sender.md)
70+
71+
72+
## 参照
73+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/split.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`split`は、任意の入力[Sender](sender.md)を複数回[接続(connect)](connect.md)可能とするSenderアダプタである。
1717
18-
`split`はパイプライン記法をサポートする
18+
`split`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

reference/execution/execution/then.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace std::execution {
1515
## 概要
1616
`then`は、入力[Sender](sender.md)の[値完了操作](set_value.md)の継続として関数呼び出しをアタッチするSenderアダプタである。
1717
18-
`then`はパイプライン記法をサポートする
18+
`then`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする
1919
2020
2121
## 効果

0 commit comments

Comments
 (0)