Skip to content

Commit 0141068

Browse files
committed
execution: let_error,let_stopped (#1384)
let_valueページにて包括的な仕様説明を記述
1 parent aa4f065 commit 0141068

File tree

6 files changed

+200
-23
lines changed

6 files changed

+200
-23
lines changed

reference/execution/execution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ namespace std::execution {
119119
| [`execution::upon_error`](execution/upon_error.md) | エラー完了時の継続処理をアタッチ (customization point object) | C++26 |
120120
| [`execution::upon_stopped`](execution/upon_stopped.md) | 停止完了時の継続処理をアタッチ (customization point object) | C++26 |
121121
| [`execution::let_value`](execution/let_value.md) | 値完了結果から入れ子の非同期操作へ変換 (customization point object) | C++26 |
122-
| [`execution::let_error`](execution/let_error.md.nolink) | エラー完了結果から入れ子の非同期操作へ変換 (customization point object) | C++26 |
123-
| [`execution::let_stopped`](execution/let_stopped.md.nolink) | 停止完了を入れ子の非同期操作へ変換 (customization point object) | C++26 |
122+
| [`execution::let_error`](execution/let_error.md) | エラー完了結果から入れ子の非同期操作へ変換 (customization point object) | C++26 |
123+
| [`execution::let_stopped`](execution/let_stopped.md) | 停止完了を入れ子の非同期操作へ変換 (customization point object) | C++26 |
124124
| [`execution::bulk`](execution/bulk.md) | インデクス空間上で指定関数を反復実行 (customization point object) | C++26 |
125125
| [`execution::split`](execution/split.md) | 入力Senderの値を複製回送信可能とする (customization point object) | C++26 |
126126
| [`execution::when_all`](execution/when_all.md) | 全ての入力Sender完了を待機 (customization point object) | C++26 |
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# let_error
2+
* execution[meta header]
3+
* cpo[meta id-type]
4+
* std::execution[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution {
9+
struct let_error_t { unspecified };
10+
inline constexpr let_error_t let_error{};
11+
}
12+
```
13+
* unspecified[italic]
14+
15+
## 概要
16+
`let_error`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[エラー完了](set_error.md)結果から入れ子の非同期操作へと変換するSenderアダプタである。
17+
18+
`let_error`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする。
19+
20+
Senderアルゴリズム`let_error`の仕様は、[`let_value`](let_value.md)ページを参照のこと。
21+
22+
23+
## 例
24+
```cpp example
25+
#include <print>
26+
#include <execution>
27+
namespace ex = std::execution;
28+
29+
int main()
30+
{
31+
{ // 関数呼び出し
32+
ex::sender auto snd0 = ex::just_error(21);
33+
ex::sender auto snd1 = ex::let_error(
34+
snd0,
35+
[](int n) -> ex::sender auto {
36+
return ex::just(n * 2);
37+
});
38+
auto [val] = std::this_thread::sync_wait(snd1).value();
39+
std::println("{}", val);
40+
}
41+
42+
{ // パイプライン記法
43+
ex::sender auto sndr = ex::just_error(21)
44+
| ex::let_error(
45+
[](int n) -> ex::sender auto {
46+
return ex::just(n * 2);
47+
});
48+
auto [val] = std::this_thread::sync_wait(sndr).value();
49+
std::println("{}", val);
50+
}
51+
}
52+
```
53+
* ex::let_error[color ff0000]
54+
* ex::sender[link sender.md]
55+
* ex::just[link just.md]
56+
* ex::just_error[link just_error.md]
57+
* std::this_thread::sync_wait[link ../this_thread/sync_wait.md]
58+
* value()[link /reference/optional/optional/value.md]
59+
60+
### 出力
61+
```
62+
42
63+
42
64+
```
65+
66+
67+
## バージョン
68+
### 言語
69+
- C++26
70+
71+
### 処理系
72+
- [Clang](/implementation.md#clang): ??
73+
- [GCC](/implementation.md#gcc): ??
74+
- [ICC](/implementation.md#icc): ??
75+
- [Visual C++](/implementation.md#visual_cpp): ??
76+
77+
78+
## 関連項目
79+
- [`execution::let_value`](let_value.md)
80+
- [`execution::let_stopped`](let_stopped.md)
81+
82+
83+
## 参照
84+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# let_stopped
2+
* execution[meta header]
3+
* cpo[meta id-type]
4+
* std::execution[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution {
9+
struct let_stopped_t { unspecified };
10+
inline constexpr let_stopped_t let_stopped{};
11+
}
12+
```
13+
* unspecified[italic]
14+
15+
## 概要
16+
`let_stopped`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[停止完了](set_stopped.md)結果から入れ子の非同期操作へと変換するSenderアダプタである。
17+
18+
`let_stopped`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする。
19+
20+
Senderアルゴリズム`let_stopped`の仕様は、[`let_value`](let_value.md)ページを参照のこと。
21+
22+
23+
## 例
24+
```cpp example
25+
#include <print>
26+
#include <execution>
27+
namespace ex = std::execution;
28+
29+
int main()
30+
{
31+
{ // 関数呼び出し
32+
ex::sender auto snd0 = ex::just_stopped();
33+
ex::sender auto snd1 = ex::let_stopped(
34+
snd0,
35+
[]() -> ex::sender auto {
36+
return ex::just(42);
37+
});
38+
auto [val] = std::this_thread::sync_wait(snd1).value();
39+
std::println("{}", val);
40+
}
41+
42+
{ // パイプライン記法
43+
ex::sender auto sndr = ex::just_stopped()
44+
| ex::let_stopped(
45+
[]() -> ex::sender auto {
46+
return ex::just(42);
47+
});
48+
auto [val] = std::this_thread::sync_wait(sndr).value();
49+
std::println("{}", val);
50+
}
51+
}
52+
```
53+
* ex::let_stopped[color ff0000]
54+
* ex::sender[link sender.md]
55+
* ex::just[link just.md]
56+
* ex::just_stopped[link just_stopped.md]
57+
* std::this_thread::sync_wait[link ../this_thread/sync_wait.md]
58+
* value()[link /reference/optional/optional/value.md]
59+
60+
### 出力
61+
```
62+
42
63+
42
64+
```
65+
66+
67+
## バージョン
68+
### 言語
69+
- C++26
70+
71+
### 処理系
72+
- [Clang](/implementation.md#clang): ??
73+
- [GCC](/implementation.md#gcc): ??
74+
- [ICC](/implementation.md#icc): ??
75+
- [Visual C++](/implementation.md#visual_cpp): ??
76+
77+
78+
## 関連項目
79+
- [`execution::let_value`](let_value.md)
80+
- [`execution::let_error`](let_error.md)
81+
82+
83+
## 参照
84+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/let_value.md

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,35 @@ namespace std::execution {
1717
1818
`let_value`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする。
1919
20+
本ページにてSenderアルゴリズム`let_value`/[`let_error`](let_error.md)/[`let_stopped`](let_stopped.md)の動作仕様を包括的に説明するため、以降のセクションにおいては、`let-cpo`, `set-cpo`をそれぞれ下記の通りとする。
21+
22+
| `let-cpo` | `set-cpo` |
23+
|----|----|
24+
| `let_value` | [`set_value`](set_value.md) |
25+
| [`let_error`](let_error.md) | [`set_error`](set_error.md) |
26+
| [`let_stopped`](let_stopped.md) | [`set_stopped`](set_stopped.md) |
27+
2028
2129
## 効果
22-
説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let_value(sndr, f)`は不適格となる。
30+
説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let-cpo(sndr, f)`は不適格となる。
2331
24-
そうでなければ、呼び出し式`let_value(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。
32+
そうでなければ、呼び出し式`let-cpo(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。
2533
2634
```cpp
27-
transform_sender(get-domain-early(sndr), make-sender(let_value, f, sndr))
35+
transform_sender(get-domain-early(sndr), make-sender(let-cpo, f, sndr))
2836
```
2937
* transform_sender[link transform_sender.md]
3038
* get-domain-early[link get-domain-early.md]
3139
* make-sender[link make-sender.md]
3240

3341

34-
### Senderアルゴリズムタグ `let_value`
42+
### Senderアルゴリズムタグ `let-cpo`
3543
Senderアルゴリズム動作説明用のクラステンプレート[`impls-for`](impls-for.md)に対して、下記の特殊化が定義される。
3644

3745
```cpp
3846
namespace std::execution {
3947
template<>
40-
struct impls-for<decayed-typeof<let_value>> : default-impls {
48+
struct impls-for<decayed-typeof<let-cpo>> : default-impls {
4149
static constexpr auto get-state = see below;
4250
static constexpr auto complete = see below;
4351
};
@@ -46,9 +54,10 @@ namespace std::execution {
4654
* impls-for[link impls-for.md]
4755
* default-impls[link impls-for.md]
4856
* decayed-typeof[link /reference/functional/decayed-typeof.md]
57+
* let-cpo[italic]
4958
* see below[italic]
5059
51-
`impls-for<decayed-typeof<let_value>>::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
60+
`impls-for<decayed-typeof<let-cpo>>::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
5261
5362
- `args_variant_t` : 入力Sender`sndr`の完了シグネチャ集合から求まる送信値リスト型情報(`variant<monostate, tuple<...>, ...>`)
5463
- `ops2_variant_t` : `f`が返すSenderに対応する非同期操作型情報(`variant<monostate, {OperationState型}, ...>`)
@@ -78,7 +87,7 @@ namespace std::execution {
7887
* decay_t[link /reference/type_traits/decay.md]
7988
* see below[italic]
8089

81-
- 説明用のパック`Sigs`[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`child-type`](child-type.md)`<Sndr>,` [`env_of_t`](env_of_t.md)`<Rcvr>>`による[`completion_signatures`](completion_signatures.md)特殊化のテンプレートパラメータとし、パック`LetSigs``Sigs`に含まれる型のうち戻り値型が[`decayed-typeof`](/reference/functional/decayed-typeof.md)`<`[`set_value`](set_value.md)`>`に等しいものと定義する。説明用のエイリアステンプレート`as-tuple<Tag(Args...)>`[`decayed-tuple`](decayed-tuple.md)`<Args...>`と定義する。型`args_variant_t`は下記定義において重複削除した型となる。
90+
- 説明用のパック`Sigs`[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`child-type`](child-type.md)`<Sndr>,` [`env_of_t`](env_of_t.md)`<Rcvr>>`による[`completion_signatures`](completion_signatures.md)特殊化のテンプレートパラメータとし、パック`LetSigs``Sigs`に含まれる型のうち戻り値型が[`decayed-typeof`](/reference/functional/decayed-typeof.md)`<set-cpo>`に等しいものと定義する。説明用のエイリアステンプレート`as-tuple<Tag(Args...)>`[`decayed-tuple`](decayed-tuple.md)`<Args...>`と定義する。型`args_variant_t`は下記定義において重複削除した型となる。
8291

8392
```cpp
8493
variant<monostate, as-tuple<LetSigs>...>
@@ -97,35 +106,35 @@ namespace std::execution {
97106

98107
- 型`args_variant_t`および`ops2_variant_t`が適格なときに限って、上記ラムダ式のrequires節が満たされる。
99108

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

102-
- [値完了](set_value.md)の場合、`let_value`Sender構築時の引数`f`に対して`f(args...)`を呼び出し、戻り値[Sender](sender.md)から入れ子非同期操作を開始する。同Senderの完了結果を接続先[Receiver](receiver.md)へ転送する。
111+
- 完了関数`set-cpo`の場合、Sender構築時の引数`f`に対して`f(args...)`を呼び出し、戻り値[Sender](sender.md)から入れ子非同期操作を開始する。同Senderの完了結果を接続先[Receiver](receiver.md)へ転送する。
103112
- それ以外の完了操作の場合、接続先[Receiver](receiver.md)の同種完了関数へ転送する。
104113

105114
```cpp
106115
[]<class Tag, class... Args>
107116
(auto, auto& state, auto& rcvr, Tag, Args&&... args) noexcept -> void {
108-
if constexpr (same_as<Tag, decayed-typeof<set_value>>) {
117+
if constexpr (same_as<Tag, decayed-typeof<set-cpo>>) {
109118
TRY-EVAL(rcvr, let-bind(state, rcvr, std::forward<Args>(args)...));
110119
} else {
111120
Tag()(std::move(rcvr), std::forward<Args>(args)...);
112121
}
113122
}
114123
```
115-
* set_value[link set_value.md]
116124
* decayed-typeof[link /reference/functional/decayed-typeof.md]
117125
* TRY-EVAL[link set_value.md]
118126
* std::move[link /reference/utility/move.md]
127+
* set-cpo[italic]
119128
120-
説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`とする。[`sender-for`](sender-for.md)`<Sndr,` [`decayed-typeof`](/reference/functional/decayed-typeof.md)`<let_value>> == false`のとき、式`let_value.transform_env(sndr, env)`は不適格となる。
129+
説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`とする。[`sender-for`](sender-for.md)`<Sndr,` [`decayed-typeof`](/reference/functional/decayed-typeof.md)`<let-cpo>> == false`のとき、式`let-cpo.transform_env(sndr, env)`は不適格となる。
121130
122-
そうでなければ、式`let_value.transform_env(sndr, env)`は[`JOIN-ENV`](../queryable.md)`(let-env(sndr),` [`FWD-ENV`](../forwarding_query.md)`(env))`と等価。
131+
そうでなければ、式`let-cpo.transform_env(sndr, env)`は[`JOIN-ENV`](../queryable.md)`(let-env(sndr),` [`FWD-ENV`](../forwarding_query.md)`(env))`と等価。
123132
124133
125134
## 説明専用エンティティ
126135
説明用の式`sndr`を用いて、`let-env(sndr)`を下記リストのうち最初に適格となる式と定義する。
127136
128-
- [`SCHED-ENV`](schedule.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`decayed-typeof`](/reference/functional/decayed-typeof.md)`<`[`set_value`](set_value.md)`>>(`[`get_env`](get_env.md)`(sndr)))`
137+
- [`SCHED-ENV`](schedule.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`decayed-typeof`](/reference/functional/decayed-typeof.md)`<set-cpo>>(`[`get_env`](get_env.md)`(sndr)))`
129138
- [`MAKE-ENV`](../queryable.md)`(`[`get_domain`](get_domain.md)`,` [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr)))`
130139
- `(void(sndr),` [`env<>{}`](env.md)`)`
131140
@@ -210,11 +219,11 @@ namespace std::execution {
210219
Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。
211220
[デフォルト実行ドメイン](default_domain.md)では無変換。
212221

213-
説明用の式`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)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
222+
説明用の式`out_sndr``let-cpo(sndr, f)`の戻り値[Sender](sender.md)とし、式`rcvr`を式[`connect`](connect.md)`(out_sndr, rcvr)`が適格となる[Receiver](receiver.md)とする。式[`connect`](connect.md)`(out_sndr, rcvr)`[開始(start)](start.md)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
214223

215-
- 入力[Sender](sender.md)`sndr`の完了結果で[`set_value`](set_value.md)が呼ばれるとき、`f`を呼び出すこと。
224+
- 入力[Sender](sender.md)`sndr`の完了結果で`set-cpo`が呼ばれるとき、`f`を呼び出すこと。
216225
- 非同期操作の完了は、`f`が返すSenderの完了に依存すること。
217-
- `sndr`により送信された他完了操作を伝搬すること
226+
- `sndr`により送信された他の完了操作を伝搬すること
218227

219228

220229
##
@@ -387,8 +396,8 @@ catch 0
387396
388397
389398
## 関連項目
390-
- [`execution::let_error`](let_error.md.nolink)
391-
- [`execution::let_stopped`](let_stopped.md.nolink)
399+
- [`execution::let_error`](let_error.md)
400+
- [`execution::let_stopped`](let_stopped.md)
392401
393402
394403
## 参照

reference/execution/execution/stopped_as_error.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ return let_stopped(
4545
return just_error(std::move(err));
4646
});
4747
```
48-
* let_stopped[link let_stopped.md.nolink]
48+
* let_stopped[link let_stopped.md]
4949
* just_error[link just_error.md]
5050
* is_nothrow_move_constructible_v[link /reference/type_traits/is_nothrow_move_constructible.md]
5151
* std::move[link /reference/utility/move.md]

reference/execution/execution/stopped_as_optional.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ return let_stopped(
4545
[]() noexcept { return just(optional<V>()); });
4646
```
4747
* single-sender-value-type[link single-sender-value-type.md]
48-
* let_stopped[link let_stopped.md.nolink]
48+
* let_stopped[link let_stopped.md]
4949
* then[link then.md]
5050
* just[link just.md]
5151
* is_nothrow_constructible_v[link /reference/type_traits/is_nothrow_constructible.md]

0 commit comments

Comments
 (0)