Skip to content

Commit fd7bea7

Browse files
committed
execution/let_value: 効果に補足説明を追記 (#1384)
1 parent 40c3748 commit fd7bea7

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

reference/execution/execution/completion_signatures.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace ex = std::execution;
4747

4848
int main()
4949
{
50-
// 下記の完了操作をサポートする完了シグニチャ集合型
50+
// 下記の完了操作をサポートする完了シグネチャ集合型
5151
// 値完了 set_value(int), set_value(int, int)
5252
// エラー完了 set_error(std::exception_ptr)
5353
// 停止完了 set_stopped()

reference/execution/execution/let_value.md

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ namespace std::execution {
1313
* unspecified[italic]
1414
1515
## 概要
16-
`let_value`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[値完了](set_value.md)結果から子入れ子の非同期操作へと変換するSenderアダプタである
16+
`let_value`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[値完了](set_value.md)結果から入れ子の非同期操作へと変換するSenderアダプタである
1717
1818
`let_value`はパイプライン記法をサポートする。
1919
2020
2121
## 効果
22-
説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let_value(sndr, f)`は不適格となる。
22+
説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let_value(sndr, f)`は不適格となる。
2323
2424
そうでなければ、呼び出し式`let_value(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。
2525
@@ -50,6 +50,14 @@ namespace std::execution {
5050
5151
`impls-for<decayed-typeof<let_value>>::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
5252
53+
- `args_variant_t` : 入力Sender`sndr`の完了シグネチャ集合から求まる送信値リスト型情報(`variant<monostate, tuple<...>, ...>`)
54+
- `ops2_variant_t` : `f`が返すSenderに対応する非同期操作型情報(`variant<monostate, {OperationState型}, ...>`)
55+
- 戻り値`state-type`型オブジェクトを下記の通り初期化する。同オブジェクトは`complete`メンバから呼ばれる`let-bind`で利用される。
56+
- `fn` : Senderアルゴリズム構築時に指定した関数呼び出し可能オブジェクト`f`
57+
- `env` : 入力Sender`sndr`に関連付けられた[属性](../queryable.md)
58+
- `args` : `f`呼び出し時の引数リスト格納用変数(空値`monostate`で初期化)
59+
- `ops` : `f`が返すSenderに対応する非同期操作の格納用変数(空値`monostate`で初期化)
60+
5361
```cpp
5462
[]<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) requires see below {
5563
auto& [_, fn, child] = sndr;
@@ -78,7 +86,7 @@ namespace std::execution {
7886
* variant[link /reference/variant/variant.md]
7987
* monostate[link /reference/variant/monostate.md]
8088

81-
- 説明用の型`Tag`とパック`Args`に対して、説明用のエイリアステンプレート`as-sndr2<Tag(Args...)>`を`call-result-t<Fn,` [`decay_t`](/reference/type_traits/decay.md)`<Arg>&...>`と定義する。型`ops2_variant_t`は下記定義において重複削除した型となる。
89+
- 説明用の型`Tag`とパック`Args`に対して、説明用のエイリアステンプレート`as-sndr2<Tag(Args...)>`を`call-result-t<Fn,` [`decay_t`](/reference/type_traits/decay.md)`<Args>&...>`と定義する。型`ops2_variant_t`は下記定義において重複削除した型となる。
8290

8391
```cpp
8492
variant<monostate, connect_result_t<as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>
@@ -91,6 +99,9 @@ namespace std::execution {
9199

92100
`impls-for<decayed-typeof<let_value>>::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
93101

102+
- [値完了](set_value.md)の場合、`let_value`Sender構築時の引数`f`に対して`f(args...)`を呼び出し、戻り値[Sender](sender.md)から入れ子非同期操作を開始する。同Senderの完了結果を接続先[Receiver](receiver.md)へ転送する。
103+
- それ以外の完了操作の場合、接続先[Receiver](receiver.md)の同種完了関数へ転送する。
104+
94105
```cpp
95106
[]<class Tag, class... Args>
96107
(auto, auto& state, auto& rcvr, Tag, Args&&... args) noexcept -> void {
@@ -117,14 +128,20 @@ namespace std::execution {
117128
- [`MAKE-ENV`](MAKE-ENV.md.nolink)`(`[`get_domain`](get_domain.md)`,` [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr)))`
118129
- `(void(sndr),` [`env<>{}`](env.md)`)`
119130
131+
説明専用の`let-bind`テンプレート関数を下記の通り定義する。
132+
133+
- 入力Senderの完了結果から引数リスト`state.args`を構築し、Senderアルゴリズム構築時に指定した関数呼び出し可能オブジェクト`state.fn`を呼び出す。
134+
- 上記呼び出しで`state.fn`から返された[Sender](sender.md)と、完了結果をSenderアルゴリズムの接続先[Receiver](receiver.md)`Rcvr`へ転送するヘルパ`receiver2`を[接続(connect)](connect.md)する。
135+
- 接続結果[Operation State](operation_state.md)を`state.op2`上に構築し、入れ子の非同期操作を[開始(start)](start.md)する。
136+
120137
```cpp
121138
namespace std::execution {
122139
template<class State, class Rcvr, class... Args>
123140
void let-bind(State& state, Rcvr& rcvr, Args&&... args); // exposition only
124141
}
125142
```
126143

127-
説明専用の`let-bind`テンプレート関数の効果は下記と等価。
144+
`let-bind`テンプレート関数の効果は下記と等価。
128145

129146
```cpp
130147
using args_t = decayed-tuple<Args...>;
@@ -192,7 +209,6 @@ namespace std::execution {
192209
Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。
193210
[デフォルト実行ドメイン](../execution/default_domain.md)では無変換。
194211

195-
196212
説明用の式`out_sndr``let_value(sndr, f)`の戻り値[Sender](sender.md)とし、式`rcvr`を式[`connect`](connect.md)`(out_sndr, rcvr)`が適格となる[Receiver](receiver.md)とする。式[`connect`](connect.md)`(out_sndr, rcvr)`[開始(start)](start.md)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
197213

198214
- 入力[Sender](sender.md)`sndr`の完了結果で[`set_value`](set_value.md)が呼ばれるとき、`f`を呼び出すこと。
@@ -324,13 +340,13 @@ int main()
324340
try {
325341
auto result = std::this_thread::sync_wait_with_variant(sndr);
326342
// result := optional<variant<tuple<>>>型
327-
// エラー完了時は受信int値が例外として送出される
328343
if (!result) {
329344
// 停止完了時はstd::nulloptが返却される
330345
break;
331346
}
332347
// 値完了==空値のためアクセスすべきデータ無し
333348
} catch (int n) {
349+
// エラー完了時は受信int値が例外として送出される
334350
std::println("catch {}", n);
335351
}
336352
}

reference/execution/this_thread/sync_wait_with_variant.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ namespace std::this_thread {
4747
template<execution::sender_in<sync-wait-env> Sndr>
4848
using sync-wait-with-variant-result-type =
4949
optional<execution::value_types_of_t<Sndr, sync-wait-env>>;
50+
}
5051
```
5152
* execution::sender_in[link ../execution/sender_in.md]
5253
* sync-wait-env[link sync-wait-env.md]

0 commit comments

Comments
 (0)