From 85e77d15a44e3f590ece86ee8ef567993c6d4d35 Mon Sep 17 00:00:00 2001 From: yoh Date: Sun, 17 May 2026 00:17:02 +0900 Subject: [PATCH 1/2] =?UTF-8?q?execution:=20P3826R5=E5=AF=BE=E5=BF=9C(#164?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 追加: get_completion_domain CPO - 削除: transform_env関数 - transform_sender関数 仕様変更 - schedulerコンセプト 仕様変更 - ほか関連変更 --- reference/execution/execution.md | 4 +- .../execution/execution/default_domain.md | 7 +- .../execution/default_domain/transform_env.md | 56 -------------- .../default_domain/transform_sender.md | 11 ++- reference/execution/execution/env/query.md | 21 +++--- .../execution/get_completion_domain.md | 73 +++++++++++++++++++ .../execution/get_completion_signatures.md | 5 +- reference/execution/execution/get_domain.md | 8 +- .../execution/execution/get_scheduler.md | 9 ++- reference/execution/execution/schedule.md | 3 +- reference/execution/execution/scheduler.md | 20 ++--- .../execution/execution/transform_env.md | 56 -------------- .../execution/execution/transform_sender.md | 29 ++++---- reference/execution/queryable.md | 7 +- 14 files changed, 139 insertions(+), 170 deletions(-) delete mode 100644 reference/execution/execution/default_domain/transform_env.md create mode 100644 reference/execution/execution/get_completion_domain.md delete mode 100644 reference/execution/execution/transform_env.md diff --git a/reference/execution/execution.md b/reference/execution/execution.md index a34a82807e..fde04f03a5 100644 --- a/reference/execution/execution.md +++ b/reference/execution/execution.md @@ -45,6 +45,7 @@ namespace std::execution { | [`execution::forward_progress_guarantee`](execution/forward_progress_guarantee.md) | 前方進行保証 (enum) | C++26 | | [`execution::get_forward_progress_guarantee`](execution/get_forward_progress_guarantee.md) | 前方進行保証取得のクエリオブジェクト (customization point object) | C++26 | | [`execution::get_completion_scheduler`](execution/get_completion_scheduler.md) | 完了Scheduler取得のクエリオブジェクト (customization point object) | C++26 | +| [`execution::get_completion_domain`](execution/get_completion_domain.md) | 完了ドメイン取得のクエリオブジェクト (customization point object) | C++26 | | [`execution::get_await_completion_adaptor`](execution/get_await_completion_adaptor.md) | Awaitable完了アダプタ取得のクエリオブジェクト (customization point object) | C++26 | | [`execution::get_env`](execution/get_env.md) | 環境取得のクエリオブジェクト (customization point object) | C++26 | | [`execution::env_of_t`](execution/env_of_t.md) | 指定型から環境型を取得 (alias template) | C++26 | @@ -81,6 +82,7 @@ namespace std::execution { | 名前 | 説明 | 対応バージョン | |------|------|----------------| +| [`execution::indeterminate_domain`](execution/indeterminate_domain.md.nolink) | 未確定実行ドメイン (class template) | C++26 | | [`execution::default_domain`](execution/default_domain.md) | デフォルト実行ドメイン (class) | C++26 | | [`execution::sender`](execution/sender.md) | Sender型 (concept) | C++26 | | [`execution::sender_in`](execution/sender_in.md) | 指定環境で有効なSender (concept) | C++26 | @@ -91,7 +93,6 @@ namespace std::execution { | [`execution::sends_stopped`](execution/sends_stopped.md) | Senderが停止完了を送信しうるか否か (variable template) | C++26 | | [`execution::tag_of_t`](execution/tag_of_t.md) | Senderアルゴリズムタグ型を取得 (alias template) | C++26 | | [`execution::transform_sender`](execution/transform_sender.md) | Senderを変換 (function template) | C++26 | -| [`execution::transform_env`](execution/transform_env.md) | 環境を変換 (function template) | C++26 | | [`execution::apply_sender`](execution/apply_sender.md) | Senderアルゴリズムを適用 (function template) | C++26 | | [`execution::connect`](execution/connect.md) | SenderとReceiverを接続 (customization point object) | C++26 | | [`execution::connect_result_t`](execution/connect_result_t.md) | [`connect`](execution/connect.md)結果型を取得 (alias template) | C++26 | @@ -204,3 +205,4 @@ Senderコンシューマは名前空間 `std::this_thread` および名前空間 - [P3682R0 Remove `std::execution::split`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3682r0.pdf) - [P3815R1 Add `scope_association` concept to P3149](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3815r1.html) - [P3986R1 A Wording Strategy for Inlinable Receivers](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3986r1.pdf) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/default_domain.md b/reference/execution/execution/default_domain.md index 1d154a7cfd..59cd9a162b 100644 --- a/reference/execution/execution/default_domain.md +++ b/reference/execution/execution/default_domain.md @@ -14,12 +14,11 @@ namespace std::execution { 実行制御ライブラリのデフォルト実行ドメイン。 ### 実行ドメイン -実行ドメイン(domain)は、[Sender](sender.md)や[環境](../queryable.md)の変換動作、Senderアルゴリズム適用動作をカスタマイズするためのタグ型である。 +実行ドメイン(domain)は、[Sender](sender.md)変換やSenderアルゴリズム適用動作をカスタマイズするためのタグ型である。 実行ドメインは下記関数に対するカスタマイゼーションポイントとして機能する。 - [`execution::transform_sender`](transform_sender.md) : Senderの変換 -- [`execution::transform_env`](transform_env.md) : 環境の変換 - [`execution::apply_sender`](apply_sender.md) : Senderアルゴリズム適用 @@ -30,7 +29,6 @@ namespace std::execution { | `(constructor)` | コンストラクタ | C++26 | | `(destructor)` | デストラクタ | C++26 | | [`transform_sender`](default_domain/transform_sender.md) | Sender変換のデフォルト動作 | C++26 | -| [`transform_env`](default_domain/transform_env.md) | 環境変換のデフォルト動作 | C++26 | | [`apply_sender`](default_domain/apply_sender.md) | Senderアルゴリズム適用のデフォルト動作 | C++26 | @@ -47,10 +45,9 @@ namespace std::execution { ## 関連項目 - [`execution::transform_sender`](transform_sender.md) -- [`execution::transform_env`](transform_env.md) - [`execution::apply_sender`](apply_sender.md) ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/default_domain/transform_env.md b/reference/execution/execution/default_domain/transform_env.md deleted file mode 100644 index ebab7fb39b..0000000000 --- a/reference/execution/execution/default_domain/transform_env.md +++ /dev/null @@ -1,56 +0,0 @@ -# transform_env -* execution[meta header] -* function template[meta id-type] -* std::execution[meta namespace] -* default_domain[meta class] -* cpp26[meta cpp] - -```cpp -template - constexpr queryable decltype(auto) transform_env(Sndr&& sndr, Env&& env) noexcept; -``` -* sender[link ../sender.md] -* queryable[link ../../queryable.md] - -## 概要 -環境変換のデフォルト動作。 -[`execution::transform_env`](../transform_env.md)に対するスタマイゼーションポイントとして機能する。 - -- 定義されていれば、[Senderアルゴリズムタグ型](../tag_of_t.md)の`transform_env`メンバ関数に変換動作を委譲する。 -- そうでなければ、無変換。 - - -## 適格要件 -後述する式`e`に対して、`noexcept(e) == true` - - -## 効果 -説明用の式`e`を次の通りとしたとき、`e`を返す。 - -- 適格であるならば、式[`tag_of_t`](../tag_of_t.md)`().transform_env(`[`std::forward`](/reference/utility/forward.md)`(sndr),` [`std::forward`](/reference/utility/forward.md)`(env))` -- そうでなければ、[`FWD-ENV`](../../forwarding_query.md)`(`[`std::forward`](/reference/utility/forward.md)`(env))` - - -## 例外 -投げない - - -## バージョン -### 言語 -- C++26 - -### 処理系 -- [Clang](/implementation.md#clang): ?? -- [GCC](/implementation.md#gcc): ?? -- [ICC](/implementation.md#icc): ?? -- [Visual C++](/implementation.md#visual_cpp): ?? - - -## 関連項目 -- [`execution::transform_env`](../transform_env.md) - - -## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) -- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) -- [LWG 4209. `default_domain::transform_env` should be returning `FWD-ENV(env)`](https://cplusplus.github.io/LWG/issue4209) diff --git a/reference/execution/execution/default_domain/transform_sender.md b/reference/execution/execution/default_domain/transform_sender.md index c808d3683c..40505978fb 100644 --- a/reference/execution/execution/default_domain/transform_sender.md +++ b/reference/execution/execution/default_domain/transform_sender.md @@ -6,9 +6,8 @@ * cpp26[meta cpp] ```cpp -template - requires (sizeof...(Env) <= 1) -constexpr sender decltype(auto) transform_sender(Sndr&& sndr, const Env&... env) +template +constexpr decltype(auto) transform_sender(Tag, Sndr&& sndr, const Env& env) noexcept(see below); ``` * sender[link ../sender.md] @@ -25,8 +24,8 @@ Sender変換のデフォルト動作。 ## 効果 説明用の式`e`を次の通りとしたとき、`e`を返す。 -- 適格であるならば、式[`tag_of_t`](../tag_of_t.md)`().transform_sender(`[`std::forward`](/reference/utility/forward.md)`(sndr), env...)` -- そうでなければ、[`std::forward`](/reference/utility/forward.md)`(sndr)` +- 適格であるならば、式[`tag_of_t`](../tag_of_t.md)`().transform_sender(Tag(),` [`std::forward`](/reference/utility/forward.md)`(sndr), env)` +- そうでなければ、`static_cast(`[`std::forward`](/reference/utility/forward.md)`(sndr))` ## 例外 @@ -50,5 +49,5 @@ Sender変換のデフォルト動作。 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/env/query.md b/reference/execution/execution/env/query.md index 80e2800127..6315de3568 100644 --- a/reference/execution/execution/env/query.md +++ b/reference/execution/execution/env/query.md @@ -6,8 +6,8 @@ * cpp26[meta cpp] ```cpp -template -constexpr decltype(auto) query(QueryTag q) const noexcept(see below); +template +constexpr decltype(auto) query(QueryTag q, Args&&... args) const noexcept(see below); ``` ## 概要 @@ -15,28 +15,28 @@ constexpr decltype(auto) query(QueryTag q) const noexcept(see below); ## テンプレートパラメータ制約 -説明専用のコンセプト`has-query`を次のように定義したとき、`(has-query || ...)`が`true`であること。 +説明専用のコンセプト`has-query`を次のように定義したとき、`(has-query || ...)`が`true`であること。 ```cpp -template +template concept has-query = - requires (const Env& env) { - env.query(QueryTag()); + requires (const Env& env, Args&&... args) { + env.query(QueryTag(), std::forward(args)...); }; ``` ## 効果 -説明用の`fe`を、`env`クラステンプレートの説明専用メンバ変数`envs0_`, ..., `envsN_`のうち最初に式`fe.query(q)`が適格となる要素としたとき、下記と等価。 +説明用の`fe`を、`env`クラステンプレートの説明専用メンバ変数`envs0_`, ..., `envsN_`のうち最初に式`fe.query(q, std::forward(args)...)`が適格となる要素としたとき、下記と等価。 ```cpp -return fe.query(q); +return fe.query(q, std::forward(args)...); ``` ## 例外 -式`noexcept(fe.query(q))`が`true`のとき、例外送出しない。 -それ以外の場合、式`fe.query(q)`から送出される例外。 +式`noexcept(fe.query(q, std::forward(args)...))`が`true`のとき、例外送出しない。 +それ以外の場合、式`fe.query(q, std::forward(args)...)`から送出される例外。 ## 例 @@ -91,3 +91,4 @@ int main() ## 参照 - [P3325R5 A Utility for Creating Execution Environments](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3325r5.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get_completion_domain.md b/reference/execution/execution/get_completion_domain.md new file mode 100644 index 0000000000..84c77a7170 --- /dev/null +++ b/reference/execution/execution/get_completion_domain.md @@ -0,0 +1,73 @@ +# get_completion_domain +* execution[meta header] +* cpo[meta id-type] +* std::execution[meta namespace] +* cpp26[meta cpp] + +```cpp +namespace std::execution { + template + struct get_completion_domain_t { unspecified }; + + template + inline constexpr get_completion_domain_t get_completion_domain{}; +} +``` +* unspecified[italic] + +## 概要 +`get_completion_domain`は、[Sender](sender.md)の[属性](get_env.md)から指定完了タグに関連付けられた完了ドメインを取得する[クエリオブジェクト](../queryable.md)である。 + +コア定数式[`forwarding_query`](../forwarding_query.md)`(get_completion_domain)`は`true`値を返す。 + + +## 効果 +式`attrs`とパック`envs`に対して、完了タグ`completion-tag`が[`set_value_t`](set_value.md)/[`set_error_t`](set_error.md)/ [`set_stopped_t`](set_stopped.md)のいずれでもなければ、呼び出し式`get_completion_domain(attrs, envs...)`は不適格となる。 +そうでなければ、型`D`を下記の通りとして、呼び出し式は`MANDATE-NOTHROW(D())`と等価である。 + +- 式が適格ならば`TRY-QUERY(attrs, get_completion_domain, envs...)`の型。 +- そうではなく、`completion-tag`が`void`のとき、式`get_completion_domain(attrs, envs...)`の型。 +- そうではなく、下記の式が適格ならばその型。 + + ```cpp + TRY-QUERY(get_completion_scheduler(attrs, envs...), + get_completion_domain, envs...) + ``` + * get_completion_scheduler[link get_completion_scheduler.md] + * set_value_t[link set_value.md] + +- そうではなく、[`scheduler`](scheduler.md)``が`true`かつ`envs`が空のパックではないとき、[`default_domain`](default_domain.md) +- そうでなければ、呼び出し式`get_completion_domain(attrs, envs...)`は不適格となる。 + + +## 例外 +投げない + + +## カスタマイゼーションポイント +[クエリ可能オブジェクト](../queryable.md)`q`を`attrs`としたとき、式`AS-CONST(q).query(get_completion_domain, envs...)`が適格ならば呼び出される。 +そうでなければ、`q`を[`get_completion_scheduler`](get_completion_scheduler.md)で取得される[完了Scheduler](scheduler.md)として、同様に式が適格ならば呼び出す。 + +型`Tag`、式`sndr`、パック`envs`に対して、`CS`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`decay_t`](/reference/type_traits/decay.md)`, decltype((envs))...>`とする。`get_completion_domain(`[`get_env`](get_env.md)`(sndr), envs...)`と`CS`が両者とも適格、かつ`CS().`[`count-of`](completion_signatures.md)`(Tag()) == 0`が`true`のとき、プログラムは不適格となる。 + +`completion-fn`を完了関数、`completion-tag`を完了関数に関連付けられた完了タグ、`args`と`envs`を部分式のパック、式`sndr`を[`sender`](sender.md)``が`true`かつ`get_completion_domain(`[`get_env`](get_env.md)`(sndr), envs...)`となる式、`D`をドメインタグとする。`sndr`とReceiver`rcvr`を接続して作成された非同期操作が完了関数`completion-fn(rcvr, args...)`を評価するとき、その評価が実行ドメインタグ`D`に関連付けられた実行リソースの実行エージェント上で行われない場合、動作は未定義となる。 + + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [ICC](/implementation.md#icc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + + +## 関連項目 +- [`execution::default_domain`](default_domain.md) +- [`execution::get_domain`](get_domain.md) + + +## 参照 +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get_completion_signatures.md b/reference/execution/execution/get_completion_signatures.md index 9f68387ecf..1fd24d177a 100644 --- a/reference/execution/execution/get_completion_signatures.md +++ b/reference/execution/execution/get_completion_signatures.md @@ -39,12 +39,10 @@ namespace std::execution { ```cpp transform_sender( - get-domain-late(declval(), declval()...), declval(), declval()...) ``` * transform_sender[link transform_sender.md] -* get-domain-late[link get-domain-late.md] 下記の通り定義される式`e`を用いて、`return e;`と等価。 @@ -70,6 +68,8 @@ transform_sender( - 型`dependent-sender-error`は、[`dependent_sender_error`](dependent_sender_error.md)もしくは`dependent_sender_error`から曖昧さなく公開派生された未規定の型とする。 - そうでなければ、`(throw except,` [`completion_signatures()`](completion_signatures.md)`)` +型`Env`に対して、[`completion_signatures_of_t`](completion_signatures_of_t.md)``と[`completion_signatures_of_t`](completion_signatures_of_t.md)``ともに適格ならば、エラー完了ないし停止完了操作に関して、前者は後者のスーパーセットであること。 + 説明用の式`rcvr`を[`receiver`](receiver.md)のモデルである型`Rcvr`の右辺値、型`Sndr`を[`sender_in`](sender_in.md)`> == true`となる型とする。 `Sigs...`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`>`による[`completion_signatures`](completion_signatures.md)特殊化のテンプレートパラメータと定義する。 `CSO`を完了関数とする。 @@ -132,3 +132,4 @@ int main() ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get_domain.md b/reference/execution/execution/get_domain.md index 62aeb6164e..7cbf7dfe43 100644 --- a/reference/execution/execution/get_domain.md +++ b/reference/execution/execution/get_domain.md @@ -19,9 +19,11 @@ namespace std::execution { ## 効果 -呼び出し式`get_domain(env)`は下記と等価。 +部分式`env`に対して、型`D`を下記のうち最初に適格な式の型としたとき、呼び出し式`get_domain(env)`は`MANDATE-NOTHROW(D())`と等価。 -- 引数`env`がconst修飾された`cenv`を用いて、式`cenv.query(get_domain)` +- `auto(AS-CONST(env).query(get_domain))` +- `get_completion_domain<`[`set_value_t`](set_value.md)`>(`[`get_scheduler`](get_scheduler.md)`(env), HIDE-SCHED(env))` +- `env`が評価されることを除いて、[`default_domain()`](default_domain.md) ## 例外 @@ -46,7 +48,9 @@ const修飾[クエリ可能オブジェクト](../queryable.md)`cenv`に対し ## 関連項目 - [`execution::default_domain`](default_domain.md) +- [`execution::get_completion_domain`](get_completion_domain.md) ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get_scheduler.md b/reference/execution/execution/get_scheduler.md index 80079c60ec..f166a1ee54 100644 --- a/reference/execution/execution/get_scheduler.md +++ b/reference/execution/execution/get_scheduler.md @@ -13,7 +13,7 @@ namespace std::execution { * unspecified[italic] ## 概要 -`get_scheduler`は、[クエリ可能オブジェクト](../queryable.md)から[Scheduler](scheduler.md)を取得する[クエリオブジェクト](../queryable.md)である。 +`get_scheduler`は、[クエリ可能オブジェクト](../queryable.md)から関連する[Scheduler](scheduler.md)を取得する[クエリオブジェクト](../queryable.md)である。 コア定数式[`forwarding_query`](../forwarding_query.md)`(get_scheduler)`は`true`値を返す。 @@ -21,7 +21,11 @@ namespace std::execution { ## 効果 呼び出し式`get_scheduler(env)`は下記と等価であり、適格であれば[`scheduler`](scheduler.md)を満たす型の値となる。 -- 引数`env`がconst修飾された`cenv`を用いて、式`cenv.query(get_scheduler)` +```cpp +get_completion_scheduler(MANDATE-NOTHROW(AS-CONST(env).query(get_scheduler)), HIDE-SCHED(env)) +``` +* get_completion_scheduler[link get_completion_scheduler.md]] +* set_value_t[link set_value.md] ## 例外 @@ -50,3 +54,4 @@ const修飾[クエリ可能オブジェクト](../queryable.md)`cenv`に対し ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/schedule.md b/reference/execution/execution/schedule.md index ed254fc64b..471da51ad2 100644 --- a/reference/execution/execution/schedule.md +++ b/reference/execution/execution/schedule.md @@ -25,8 +25,6 @@ namespace std::execution { ## 効果 呼び出し式`schedule(sch)`は式`sch.schedule()`と等価であり、式の型は[`sender`](sender.md)を満たすこと。 -式[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(sch.schedule())) == sch`が不適格もしくは`false`となる場合、呼び出し式`schedule(sch)`の動作は未定義となる。 - ## カスタマイゼーションポイント [Scheduler](scheduler.md)`sch`に対して、式`sch.schedule()`が呼び出される。 @@ -103,3 +101,4 @@ val=42 ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/scheduler.md b/reference/execution/execution/scheduler.md index 67dfbbc0fc..2b5af0ea54 100644 --- a/reference/execution/execution/scheduler.md +++ b/reference/execution/execution/scheduler.md @@ -13,9 +13,6 @@ namespace std::execution { requires(Sch&& sch) { { schedule(std::forward(sch)) } -> sender; { get_forward_progress_guarantee(sch) } -> same_as; - { auto(get_completion_scheduler( - get_env(schedule(std::forward(sch))))) } - -> same_as>; } && equality_comparable> && copyable>; @@ -29,9 +26,6 @@ namespace std::execution { * schedule[link schedule.md] * get_forward_progress_guarantee[link get_forward_progress_guarantee.md] * forward_progress_guarantee[link forward_progress_guarantee.md] -* get_completion_scheduler[link get_completion_scheduler.md] -* set_value_t[link set_value.md] -* get_env[link get_env.md] * copyable[link /reference/concepts/copyable.md] ## 概要 @@ -44,7 +38,6 @@ namespace std::execution { - `Sch`型の値`sch`に対して下記を満たすこと - [`execution::schedule`](schedule.md)`(sch)`が[Sender](sender.md)を返す - [`execution::get_forward_progress_guarantee`](get_forward_progress_guarantee.md)`(sch)`が[`forward_progress_guarantee`](forward_progress_guarantee.md)列挙値を返す - - 上記Senderの[値完了関数](set_value.md)の[完了Scheduler](get_completion_scheduler.md)が`Sch`に等しいこと - コピー可能かつ同値比較可能 @@ -56,9 +49,17 @@ namespace std::execution { あるScheduler型`Sch`の2つの値`sch1`と`sch2`に対して、`sch1`と`sch2`が同じ実行リソースを共有する場合に限って、`sch1 == sch2`は`true`となる。 -あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`が`sch`と等しいこと。 +あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`が適格なとき、`sch`と等しいこと。 -あるScheduler`sch`に対して式[`get_domain`](get_domain.md)`(sch)`が適格であるとき、式[`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`も適格であり、かつ同じ型を持つ。 +あるScheduler`sch`、型`T`、部分式のパック`envs`に対して、下記の式がいずれも不適格となる、もしくはともに適格かつ同じ型を持つこと。 + +- [`get_completion_domain`](get_completion_domain.md)`(sch, envs...)` +- [`get_completion_domain`](get_completion_domain.md)`(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)), envs...)` + +同様に、下記の式がいずれも不適格となる、もしくはともに適格かつ同じ型と値を持つこと。 + +- [`get_completion_scheduler`](get_completion_scheduler.md)`(sch, envs...)` +- [`get_completion_scheduler`](get_completion_scheduler.md)`(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)), envs...)` Scheduler型のデストラクタは、[`schedule`](schedule.md)が返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。 @@ -118,3 +119,4 @@ int main() - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3396R1 std::execution wording fixes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3396r1.html) - [LWG4354. Reconsider `weakly_parallel` as the default `forward_progress_guarantee`](https://cplusplus.github.io/LWG/issue4354) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/transform_env.md b/reference/execution/execution/transform_env.md deleted file mode 100644 index 9d9d0c963b..0000000000 --- a/reference/execution/execution/transform_env.md +++ /dev/null @@ -1,56 +0,0 @@ -# transform_env -* execution[meta header] -* function template[meta id-type] -* std::execution[meta namespace] -* cpp26[meta cpp] - -```cpp -namespace std::execution { - template - constexpr queryable decltype(auto) transform_env(Domain dom, Sndr&& sndr, Env&& env) noexcept; -} -``` -* sender[link sender.md] -* queryable[link ../queryable.md] - -## 概要 -[実行ドメイン](default_domain.md)に応じて[環境](../queryable.md)を変換する。 -ユーザ定義実行ドメインにおいて、再帰的Sender変換における補助的なカスタマイゼーションポイントとして機能する。 - -- 定義されていれば、`dom.transform_env`メンバ関数に変換動作を委譲する。 -- そうでなければ、デフォルト実行ドメイン[`transform_env`](default_domain/transform_env.md)に変換動作を委譲する。 - - -## 適格要件 -後述する式`e`に対して、`noexcept(e) == true` - - -## 戻り値 -説明用の式`e`を次の通りとし、`e`を返す。 - -- 適格であるならば、式`dom.transform_env(`[`std::forward`](/reference/utility/forward.md)`(sndr),` [`std::forward`](/reference/utility/forward.md)`(env))` -- そうでなければ、[`default_domain()`](default_domain.md)`.`[`transform_env`](default_domain/transform_env.md)`(`[`std::forward`](/reference/utility/forward.md)`(sndr),` [`std::forward`](/reference/utility/forward.md)`(env))` - - -## 例外 -投げない。 - - -## バージョン -### 言語 -- C++26 - -### 処理系 -- [Clang](/implementation.md#clang): ?? -- [GCC](/implementation.md#gcc): ?? -- [ICC](/implementation.md#icc): ?? -- [Visual C++](/implementation.md#visual_cpp): ?? - - -## 関連項目 -- [`default_domain::transform_env`](default_domain/transform_env.md) - - -## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) -- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/transform_sender.md b/reference/execution/execution/transform_sender.md index 245b8e47e5..4c7d721258 100644 --- a/reference/execution/execution/transform_sender.md +++ b/reference/execution/execution/transform_sender.md @@ -6,9 +6,8 @@ ```cpp namespace std::execution { - template - requires (sizeof...(Env) <= 1) - constexpr sender decltype(auto) transform_sender(Domain dom, Sndr&& sndr, const Env&... env) + template + constexpr decltype(auto) transform_sender(Sndr&& sndr, const Env& env) noexcept(see below); } ``` @@ -17,24 +16,22 @@ namespace std::execution { ## 概要 [実行ドメイン](default_domain.md)に応じて[Sender](sender.md)を変換する。 -Senderオブジェクトの構築時、Senderと[Receiver](receiver.md)間[接続(connect)](connect.md)時のカスタマイゼーションポイントとして機能する。 - -型変換ではSender型の変換が行われなくなる(恒等変換となる)まで、下記のカスタマイゼーションポイントを再帰的に呼び出す。 - -- 定義されていれば、`dom.transform_sender`メンバ関数に変換動作を委譲する。 -- そうでなければ、デフォルト実行ドメイン[`transform_sender`](default_domain/transform_sender.md)に変換動作を委譲する。 +Senderと[Receiver](receiver.md)間[接続(connect)](connect.md)時のカスタマイゼーションポイントとして機能する。 ## 戻り値 -説明用の式`transformed-sndr`を次の通りとする。 +説明用の式`transformed-sndr(dom, tag, s)`を次の通りとする。 + +- 適格であるならば、式`dom.transform_sender(tag, s, env)` +- そうでなければ、[`default_domain()`](default_domain.md)`.`[`transform_sender`](default_domain/transform_sender.md)`(tag, s, env)` -- 適格であるならば、式`dom.transform_sender(`[`std::forward`](/reference/utility/forward.md)`(sndr), env...)` -- そうでなければ、[`default_domain()`](default_domain.md)`.`[`transform_sender`](default_domain/transform_sender.md)`(`[`std::forward`](/reference/utility/forward.md)`(sndr), env...)` +説明用の式`transform-recurse(dom, tag, s)`を次の通りとする。 -説明用の式`final-sndr`を次の通りとする。 +- `transformed-sndr(dom, tag, s)`と`s`の型がCV修飾を無視して同一ならば、式`transformed-recurse(dom, tag, s)` +- そうではなく`tag`が[`start`](start.md)のとき、`s2`を`transformed-sndr(dom, tag, s)`、`dom2`を`start-domain`として式`transform-recurse(dom2, tag, s2)` +- そうでなければ、式`completion-domain(s2)` -- `sndr`と`transformed-sndr`の型がCV修飾を無視して同一ならば、`transformed-sndr` -- そうでなければ、式`transform_sender(dom, transformed-sndr, env...)`(再帰適用) +説明用の式`tmp-sndr`を`transform-recurse(completion-domain(sndr),` [`set_value`](set_value.md)`, sndr)`、式`final-sndr`を`transform-recurse(start-domain,` [`start`](start.md)`, tmp-sndr)`とする。 `final-sndr`を返す。 @@ -60,5 +57,5 @@ Senderオブジェクトの構築時、Senderと[Receiver](receiver.md)間[接 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/queryable.md b/reference/execution/queryable.md index a2bc7a73ea..abcf2b6ecf 100644 --- a/reference/execution/queryable.md +++ b/reference/execution/queryable.md @@ -47,10 +47,10 @@ concept queryable = destructible; ## 説明専用エンティティ ### 式`MAKE-ENV` -説明用のクエリオブジェクト`q`と式`v`に対して、式`MAKE-ENV(q, v)`は`queryable`を満たす型の式`env`となり、下記を満たす。 +説明用のクエリオブジェクト`q`、部分式`v`、部分式のパック`args`に対して、式`MAKE-ENV(q, v)`は`queryable`を満たす型の式`env`となり、下記を満たす。 -- `env.query(q)`の結果が`v`と等しい。 -- 明に規定されない限り、`env`が有効の間は`env.query(q)`のオブジェクトも有効である。 +- `env.query(q, args...)`の結果が`v`と等しい。 +- 明に規定されない限り、`env`が有効の間は`env.query(q, args...)`のオブジェクトも有効である。 ### 式`JOIN-ENV` 説明用のクエリ可能オブジェクト`env1`, `env2`、クエリオブジェクト`q`、パック式`as`に対して、式`JOIN-ENV(env1, env2)`は`queryable`を満たす型の式`env3`となり、式`env3.query(q, as...)`は下記と等価である。 @@ -77,3 +77,4 @@ concept queryable = destructible; ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) From 788cb2fdb442c7991a3785a8089884cd80e8d0c0 Mon Sep 17 00:00:00 2001 From: yoh Date: Tue, 19 May 2026 20:17:51 +0900 Subject: [PATCH 2/2] =?UTF-8?q?execution:=20P3826R5=E5=AF=BE=E5=BF=9C(#164?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - get_completion_scheduler 修正 - connect 修正 - 各Senderアルゴリズム 修正 --- reference/execution/execution/affine_on.md | 31 +-- reference/execution/execution/associate.md | 11 +- reference/execution/execution/bulk.md | 17 +- reference/execution/execution/bulk_chunked.md | 12 +- .../execution/execution/bulk_unchunked.md | 12 +- .../execution/execution/completion-domain.md | 42 ---- reference/execution/execution/connect.md | 4 +- reference/execution/execution/continues_on.md | 219 +++++++++++------- .../execution/execution/get-domain-early.md | 57 ----- .../execution/execution/get-domain-late.md | 70 ------ .../execution/get_completion_domain.md | 2 +- .../execution/get_completion_scheduler.md | 26 ++- reference/execution/execution/get_domain.md | 2 +- reference/execution/execution/into_variant.md | 10 +- reference/execution/execution/just.md | 4 +- reference/execution/execution/just_error.md | 4 +- reference/execution/execution/just_stopped.md | 4 +- reference/execution/execution/let_value.md | 35 +-- reference/execution/execution/on.md | 133 ++++------- reference/execution/execution/prop.md | 3 +- .../execution/run_loop/run-loop-scheduler.md | 3 +- .../execution/execution/schedule_from.md | 198 +--------------- reference/execution/execution/scheduler.md | 12 +- reference/execution/execution/starts_on.md | 62 ++--- .../execution/execution/stopped_as_error.md | 19 +- .../execution/stopped_as_optional.md | 21 +- reference/execution/execution/then.md | 10 +- .../execution/execution/transform_sender.md | 7 +- reference/execution/execution/upon_error.md | 1 - reference/execution/execution/upon_stopped.md | 1 - reference/execution/execution/when_all.md | 28 +-- .../execution/when_all_with_variant.md | 18 +- reference/execution/this_thread/sync_wait.md | 8 +- .../this_thread/sync_wait_with_variant.md | 8 +- 34 files changed, 320 insertions(+), 774 deletions(-) delete mode 100644 reference/execution/execution/completion-domain.md delete mode 100644 reference/execution/execution/get-domain-early.md delete mode 100644 reference/execution/execution/get-domain-late.md diff --git a/reference/execution/execution/affine_on.md b/reference/execution/execution/affine_on.md index fb44e610d8..c418213a1e 100644 --- a/reference/execution/execution/affine_on.md +++ b/reference/execution/execution/affine_on.md @@ -22,40 +22,16 @@ namespace std::execution { ## 効果 説明用の式`sch`と`sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`affine_on(sndr, sch)`は不適格となる。 -そうでなければ、呼び出し式`affine_on(sndr, sch)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`affine_on(sndr, sch)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(affine_on, sch, sndr)) +make-sender(affine_on, sch, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] -### Senderアルゴリズムタグ `affine_on` -Senderアルゴリズム動作説明用のクラステンプレート[`impls-for`](impls-for.md)に対して、下記の特殊化が定義される。 - -```cpp -namespace std::execution { - template<> - struct impls-for : default-impls { - static constexpr auto get-attrs = - [](const auto& data, const auto& child) noexcept -> decltype(auto) { - return JOIN-ENV(SCHED-ATTRS(data), FWD-ENV(get_env(child))); - }; - }; -} -``` -* impls-for[link impls-for.md] -* default-impls[link impls-for.md] -* JOIN-ENV[link ../queryable.md] -* SCHED-ATTRS[link scheduler.md] -* FWD-ENV[link ../forwarding_query.md] -* get_env[link get_env.md] - - ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 説明用の式`out_sndr`を`affine_on(sndr, sch)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、 @@ -89,3 +65,4 @@ Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、 ## 参照 - [P3552R3 Add a Coroutine Task Type](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3552r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/associate.md b/reference/execution/execution/associate.md index 4a57dfec76..0681a410df 100644 --- a/reference/execution/execution/associate.md +++ b/reference/execution/execution/associate.md @@ -40,14 +40,11 @@ associated状態の関連Senderに対する[接続(connect)](connect.md)操作 ## 効果 説明用の式`sndr`と`token`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは[`remove_cvref_t`](/reference/type_traits/remove_cvref.md)``が[`scope_token`](scope_token.md)を満たさないとき、呼び出し式`associate(sndr, token)`は不適格となる。 -そうでなければ、呼び出し式`associate(sndr, token)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`associate(sndr, token)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), - make-sender(associate, associate-data(token, sndr))) +make-sender(associate, associate-data(token, sndr)) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] * associate-data[italic] @@ -248,7 +245,7 @@ pair release() && noexcept; ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -309,7 +306,7 @@ value=42 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3149R11 `async_scope` - Creating scopes for non-sequential concurrency](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3149r11.html) - [P3815R1 Add `scope_association` concept to P3149](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3815r1.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/bulk.md b/reference/execution/execution/bulk.md index 1088bd6de7..fb8c338a46 100644 --- a/reference/execution/execution/bulk.md +++ b/reference/execution/execution/bulk.md @@ -31,15 +31,11 @@ namespace std::execution { - `Shape`が[`integral`](/reference/concepts/integral.md)を満たさない、もしくは - `Func`が[`copy_constructible`](/reference/concepts/copy_constructible.md)のモデルでないとき。 -そうでなければ、呼び出し式`bulk(sndr, policy, shape, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`bulk(sndr, policy, shape, f)`は下記と等価。 ```cpp -transform_sender( - get-domain-early(sndr), - make-sender(bulk, product-type{policy, shape, f}, sndr)) +make-sender(bulk, product-type{policy, shape, f}, sndr)) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] * product-type[link product-type.md] @@ -65,11 +61,8 @@ return bulk_chunked(std::move(child), policy, shape, std::move(new_f)); ## カスタマイゼーションポイント -Senderアルゴリズム構築時に、[Sender](sender.md)`sndr`に[関連付けられた実行ドメイン](get-domain-early.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 - -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`bulk.transform_sender(out_sndr, env)`が呼ばれ、[`bulk_chunked`](bulk_chunked.md)Senderへと変換される。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`bulk.transform_sender(set_value, out_sndr, env)`が呼ばれ、[`bulk_chunked`](bulk_chunked.md)Senderへと変換される。 説明用の式`out_sndr`を`bulk(sndr, policy, shape, f)`の戻り値[Sender](sender.md)とし、式`rcvr`を式[`connect`](connect.md)`(out_sndr, rcvr)`が適格となる[Receiver](receiver.md)とする。式[`connect`](connect.md)`(out_sndr, rcvr)`は[開始(start)](start.md)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。 @@ -135,6 +128,6 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3481R5 `std::execution::bulk()` issues](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3481r5.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/bulk_chunked.md b/reference/execution/execution/bulk_chunked.md index 50c47ff400..0b125aab07 100644 --- a/reference/execution/execution/bulk_chunked.md +++ b/reference/execution/execution/bulk_chunked.md @@ -31,15 +31,11 @@ namespace std::execution { - `Shape`が[`integral`](/reference/concepts/integral.md)を満たさない、もしくは - `Func`が[`copy_constructible`](/reference/concepts/copy_constructible.md)のモデルでないとき。 -そうでなければ、呼び出し式`bulk_chunked(sndr, policy, shape, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`bulk_chunked(sndr, policy, shape, f)`は下記と等価。 ```cpp -transform_sender( - get-domain-early(sndr), - make-sender(bulk_chunked, product-type{policy, shape, f}, sndr)) +make-sender(bulk_chunked, product-type{policy, shape, f}, sndr)) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] * product-type[link product-type.md] @@ -108,7 +104,7 @@ cs.for-each(overload-set{fn, [](auto){}}); ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 説明用の式`out_sndr`を`bulk_chunked(sndr, policy, shape, f)`の戻り値[Sender](sender.md)とし、式`rcvr`を式[`connect`](connect.md)`(out_sndr, rcvr)`が適格となる[Receiver](receiver.md)とする。式[`connect`](connect.md)`(out_sndr, rcvr)`は[開始(start)](start.md)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。 @@ -176,8 +172,8 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html) - [P3481R5 `std::execution::bulk()` issues](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3481r5.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/bulk_unchunked.md b/reference/execution/execution/bulk_unchunked.md index 60a68cd6d0..e69ae5dca0 100644 --- a/reference/execution/execution/bulk_unchunked.md +++ b/reference/execution/execution/bulk_unchunked.md @@ -31,15 +31,11 @@ namespace std::execution { - `Shape`が[`integral`](/reference/concepts/integral.md)を満たさない、もしくは - `Func`が[`copy_constructible`](/reference/concepts/copy_constructible.md)のモデルでないとき。 -そうでなければ、呼び出し式`bulk_unchunked(sndr, policy, shape, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`bulk_unchunked(sndr, policy, shape, f)`は下記と等価。 ```cpp -transform_sender( - get-domain-early(sndr), - make-sender(bulk_unchunked, product-type{policy, shape, f}, sndr)) +make-sender(bulk_unchunked, product-type{policy, shape, f}, sndr)) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] * product-type[link product-type.md] @@ -117,7 +113,7 @@ static consteval void check-types(); ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 説明用の式`out_sndr`を`bulk_unchunked(sndr, policy, shape, f)`の戻り値[Sender](sender.md)とし、式`rcvr`を式[`connect`](connect.md)`(out_sndr, rcvr)`が適格となる[Receiver](receiver.md)とする。式[`connect`](connect.md)`(out_sndr, rcvr)`は[開始(start)](start.md)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。 @@ -182,8 +178,8 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html) - [P3481R5 `std::execution::bulk()` issues](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3481r5.html) - [P3923R0 Additional NB comment resolutions for Kona 2025](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3923r0.html), US 221-339 +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/completion-domain.md b/reference/execution/execution/completion-domain.md deleted file mode 100644 index d0882c24eb..0000000000 --- a/reference/execution/execution/completion-domain.md +++ /dev/null @@ -1,42 +0,0 @@ -# completion-domain -* [meta exposition-only] -* execution[meta header] -* function template[meta id-type] -* std::execution[meta namespace] -* cpp26[meta cpp] - -```cpp -template -constexpr auto completion-domain(const Sndr& sndr) noexcept; -``` -* default_domain[link default_domain.md] - -## 概要 -[Sender](sender.md)`sndr`の[完了Scheduler](get_completion_scheduler.md)から[実行ドメイン](default_domain.md)を取得する説明専用の関数テンプレート。 - - -## 効果 -説明用の型`COMPL-DOMAIN(T)`を式[`get_domain`](get_domain.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`(`[`get_env`](get_env.md)`(sndr)))`の型とする。 - -- 型`COMPL-DOMAIN(`[`set_value_t`](set_value.md)`)`、`COMPL-DOMAIN(`[`set_error_t`](set_error.md)`)`、`COMPL-DOMAIN(`[`set_stopped_t`](set_stopped.md)`)`の全てが不適格の場合、`completion-domain`は`Default`型のデフォルト構築されたprvalueとなる。 -- そうではなく、上記のうち不適格となる型を除いた型が[共通型](/reference/type_traits/common_type.md)を共有するならば、`completion-domain`はその共通型のデフォルト構築されたprvalueとなる。 -- そうでなければ、`completion-domain`は不適格となる。 - - -## 例外 -投げない - - -## バージョン -### 言語 -- C++26 - - -## 関連項目 -- [`get-domain-early`](get-domain-early.md) -- [`get-domain-late`](get-domain-late.md) - - -## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) -- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/connect.md b/reference/execution/execution/connect.md index 605110611a..d4ae846012 100644 --- a/reference/execution/execution/connect.md +++ b/reference/execution/execution/connect.md @@ -25,10 +25,9 @@ namespace std::execution { 説明用の型`Sndr`を`decltype((sndr))`、型`Rcvr`を`decltype((rcvr))`とし、式`new_sndr`を次の通りとする。 ```cpp -transform_sender(decltype(get-domain-late(sndr, get_env(rcvr))){}, sndr, get_env(rcvr)) +transform_sender(sndr, get_env(rcvr)) ``` * transform_sender[link transform_sender.md] -* get-domain-late[link get-domain-late.md] * get_env[link get_env.md] 式`connect(sndr, rcvr)`は`rcvr`が1回だけ評価されることを除いて、下記と等価。式の型は[`operation_state`](operation_state.md)を満たす。 @@ -255,3 +254,4 @@ int main() - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) - [P3388R3 When Do You Know connect Doesn't Throw?](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3388r3.pdf) - [LWG 4208. Wording needs to ensure that in `connect(sndr, rcvr)` that `rcvr` expression is only evaluated once](https://cplusplus.github.io/LWG/issue4208) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/continues_on.md b/reference/execution/execution/continues_on.md index 917fdd8977..eaa9ab6740 100644 --- a/reference/execution/execution/continues_on.md +++ b/reference/execution/execution/continues_on.md @@ -13,21 +13,17 @@ namespace std::execution { * unspecified[italic] ## 概要 -`continues_on`は、指定[Scheduler](scheduler.md)上で完了させるSenderアダプタである。 - -`continues_on`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする。 +`continues_on`は、[Sender](sender.md)の完了に依存する作業を[Scheduler](scheduler.md)に関連付けられた実行リソースにスケジュールするSenderアダプタである。 ## 効果 -説明用の式`sch`と`sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`continues_on(sndr, sch)`は不適格となる。 +説明用の式`sch`と`sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`continues_on(sch, sndr)`は不適格となる。 -そうでなければ、呼び出し式`continues_on(sndr, sch)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`continues_on(sch, sndr)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(continues_on, sch, sndr)) +make-sender(continues_on, sch, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] @@ -38,108 +34,156 @@ Senderアルゴリズム動作説明用のクラステンプレート[`impls-for namespace std::execution { template<> struct impls-for : default-impls { - static constexpr auto get-attrs = - [](const auto& data, const auto& child) noexcept -> decltype(auto) { - return JOIN-ENV(SCHED-ATTRS(data), FWD-ENV(get_env(child))); - }; + static constexpr auto get-state = see below; + static constexpr auto complete = see below; + + template + static consteval void check-types(); }; } ``` * impls-for[link impls-for.md] * default-impls[link impls-for.md] -* JOIN-ENV[link ../queryable.md] -* SCHED-ATTRS[link scheduler.md] -* FWD-ENV[link ../forwarding_query.md] -* get_env[link get_env.md] - -説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`continues_on.transform_sender(sndr, env)`は不適格となる。 -そうでなければ、式`continues_on.transform_sender(sndr, env)`は下記と等価。 +`impls-for::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 ```cpp -auto [_, data, child] = sndr; -return schedule_from(std::move(data), std::move(child)); -``` -* schedule_from[link schedule_from.md] -* std::move[link /reference/utility/move.md] +[](Sndr&& sndr, Rcvr& rcvr) noexcept(see below) + requires sender_in, FWD-ENV-T(env_of_t)> { + auto& [_, sch, child] = sndr; -## カスタマイゼーションポイント -Senderアルゴリズム構築時に、[Sender](sender.md)`sndr`に[関連付けられた実行ドメイン](get-domain-early.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 + using sched_t = decltype(auto(sch)); + using variant_t = see below; + using receiver_t = see below; + using operation_t = connect_result_t, receiver_t>; + constexpr bool nothrow = noexcept(connect(schedule(sch), receiver_t{nullptr})); -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[Scheduler](scheduler.md)`sch`に[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`continues_on.transform_sender(out_sndr, env)`が呼ばれ、[`schedule_from`](schedule_from.md)Senderへと変換される。 + struct state-type { + Rcvr& rcvr; // exposition only + variant_t async-result; // exposition only + operation_t op-state; // exposition only -説明用の式`out_sndr`を`continues_on(sndr, sch)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、 + explicit state-type(sched_t sch, Rcvr& rcvr) noexcept(nothrow) + : rcvr(rcvr), op-state(connect(schedule(sch), receiver_t{this})) {} + }; -- 呼び出し[`start`](start.md)`(op)`は、現在の実行エージェント上で入力[Sender](sender.md)`sndr`を開始し、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェント上で`out_rcvr`の完了操作を実行すべき。 -- `sch`上でのスケジューリングが失敗した場合、未規定の実行エージェント上で`out_rcvr`の[エラー完了](set_error.md)が行われるべき。 + return state-type{sch, rcvr}; +} +``` +* sender_in[link sender_in.md] +* child-type[link child-type.md] +* FWD-ENV-T[link ../forwarding_query.md] +* env_of_t[link env_of_t.md] +* connect_result_t[link connect_result_t.md] +* schedule_result_t[link schedule_result_t.md] +* connect[link connect.md] +* schedule[link schedule.md] +- ローカルクラス`state-type`のオブジェクトは[構造化束縛](/lang/cpp17/structured_bindings.md)における初期化子として利用できる。 +- 説明用のパック`Sigs`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`child-type`](child-type.md)`,` [`FWD-ENV-T`](../forwarding_query.md)`(`[`env_of_t`](env_of_t.md)`)>`による[`completion_signatures`](completion_signatures.md)特殊化のテンプレートパラメータと定義する。説明用のエイリアステンプレート`as-tuple`を[`decayed-tuple`](decayed-tuple.md)``と定義し、説明用の変数テンプレート`is-nothrow-decay-copy-sig`を型`Args...`が全て例外送出せずdecayコピー可能ならば値`true`、そうでなければ`false`となる`bool const`型のコア定数式と定義する。説明用のパック`error-completion`を、`(is-nothrow-decay-copy-sig &&...)`が`false`ならば[`set_error_t`](set_error.md)`(`[`exception_ptr`](/reference/exception/exception_ptr.md)`)`、そうでなければ空のパックと定義する。型`variant_t`は下記定義において重複削除した型となる。 -## 備考 -`continues_on`Senderアルゴリズムの動作は、[Receiver](receiver.md)[接続(connect)](connect.md)時の[`schedule_from`](schedule_from.md)Senderアルゴリズムへの変換、および説明専用の[`get-domain-late`](get-domain-late.md)関数テンプレートでの特別扱いによって実現される。 + ```cpp + variant..., error-completion...> + ``` + * variant[link /reference/variant/variant.md] + * monostate[link /reference/variant/monostate.md] +- `receiver_t`は説明専用クラス`receiver-type`のエイリアスとする。 -## 例 -```cpp example -#include -#include -#include -namespace ex = std::execution; +`impls-for::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 +```cpp +[](auto, auto& state, auto& rcvr, Tag, Args&&... args) noexcept + -> void { + using result_t = decayed-tuple; + constexpr bool nothrow = (is_nothrow_constructible_v, Args> && ...); + + try { + state.async-result.template emplace(Tag(), std::forward(args)...); + } catch (...) { + if constexpr (!nothrow) + state.async-result.template emplace>(set_error, current_exception()); + } + start(state.op-state); +}; +``` +* decayed-tuple[link decayed-tuple.md] +* set_error[link set_error.md] +* start[link start.md] +* is_nothrow_constructible_v[link /reference/type_traits/is_nothrow_constructible.md] +* template emplace[link /reference/variant/variant/emplace.md] +* set_error_t[link set_error.md] +* exception_ptr[link /reference/exception/exception_ptr.md] +* current_exception()[link /reference/exception/current_exception.md] -int main() -{ - std::println("main#{}", std::this_thread::get_id()); +メンバ関数`impls-for::check-types`の効果は下記の通り。 - ex::run_loop loop; - std::jthread worker{[&]{ - std::println("start worker#{}", std::this_thread::get_id()); - loop.run(); - }}; +```cpp +get_completion_signatures>, FWD-ENV-T(Env)...>(); +auto cs = get_completion_signatures, FWD-ENV-T(Env)...>(); +decay-copyable-result-datums(cs); +``` +* get_completion_signatures[link get_completion_signatures.md] +* schedule_result_t[link schedule_result_t.md] +* data-type[link data-type.md] +* FWD-ENV-T[link ../forwarding_query.md] +* decay-copyable-result-datums[link decay-copyable-result-datums.md] - ex::scheduler auto sch = loop.get_scheduler(); - ex::sender auto sndr = - ex::just(2) - | ex::then([](int n) { - std::println("on main#{}", std::this_thread::get_id()); - return n * 3; - }) - | ex::continues_on(sch) - | ex::then([](int n) { - std::println("on worker#{}", std::this_thread::get_id()); - return n * 7; - }); - auto [val] = std::this_thread::sync_wait(std::move(sndr)).value(); - std::println("val={}", val); +## 説明専用エンティティ +説明専用のクラス`receiver-type`を下記の通り定義する。 - loop.finish(); +```cpp +namespace std::execution { + struct receiver-type { + using receiver_concept = receiver_t; + state-type* state; // exposition only + + void set_value() && noexcept { + visit( + [this](Tuple& result) noexcept -> void { + if constexpr (!same_as) { + auto& [tag, ...args] = result; + tag(std::move(state->rcvr), std::move(args)...); + } + }, + state->async-result); + } + + template + void set_error(Error&& err) && noexcept { + execution::set_error(std::move(state->rcvr), std::forward(err)); + } + + void set_stopped() && noexcept { + execution::set_stopped(std::move(state->rcvr)); + } + + decltype(auto) get_env() const noexcept { + return FWD-ENV(execution::get_env(state->rcvr)); + } + }; } ``` -* ex::continues_on[color ff0000] -* ex::run_loop[link run_loop.md] -* ex::sender[link sender.md] -* ex::scheduler[link scheduler.md] -* ex::just[link just.md] -* ex::then[link then.md] -* get_scheduler()[link run_loop/get_scheduler.md] -* run()[link run_loop/run.md] -* finish()[link run_loop/finish.md] -* std::this_thread::sync_wait[link ../this_thread/sync_wait.md] -* value()[link /reference/optional/optional/value.md] +* receiver_t[link receiver.md] +* execution::set_error[link set_error.md] +* execution::set_stopped[link set_stopped.md] +* execution::get_env[link get_env.md] +* FWD-ENV[link ../forwarding_query.md] +* visit[link /reference/variant/visit.md] +* monostate[link /reference/variant/monostate.md] * std::move[link /reference/utility/move.md] -* std::this_thread::get_id()[link /reference/thread/this_thread/get_id.md] -### 出力例 -``` -main#137071308048192 -on main#137071308048192 -start worker#137071301756480 -on worker#137071301756480 -val=42 -``` + +## カスタマイゼーションポイント +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](../execution/default_domain.md)では無変換。 + +説明用の式`out_sndr`を`continues_on(sndr, sch)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、 + +- 呼び出し[`start`](start.md)`(op)`は、現在の実行エージェント上で入力[Sender](sender.md)`sndr`を開始し、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェント上で`out_rcvr`の完了操作を実行すべき。 +- `sch`上でのスケジューリングが失敗した場合、未規定の実行エージェント上で`out_rcvr`の[エラー完了](set_error.md)が行われるべき。 ## バージョン @@ -155,10 +199,13 @@ val=42 ## 関連項目 - [`execution::schedule`](schedule.md) -- [`execution::starts_on`](starts_on.md) -- [`execution::on`](on.md) +- [`execution::continues_on`](continues_on.md) ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3396R1 std::execution wording fixes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3396r1.html) +- [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [LWG 4198. `continues_on` isn't starting the schedule sender if decay-copying results throws](https://cplusplus.github.io/LWG/issue4198) +- [LWG 4203. Constraints on `get-state` functions are incorrect](https://cplusplus.github.io/LWG/issue4203) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get-domain-early.md b/reference/execution/execution/get-domain-early.md deleted file mode 100644 index 257327af61..0000000000 --- a/reference/execution/execution/get-domain-early.md +++ /dev/null @@ -1,57 +0,0 @@ -# get-domain-early -* [meta exposition-only] -* execution[meta header] -* function template[meta id-type] -* std::execution[meta namespace] -* cpp26[meta cpp] - -```cpp -template -constexpr auto get-domain-early(const Sndr& sndr) noexcept; -``` - -## 概要 -[Sender](sender.md)アルゴリズム構築時のカスタマイゼーションポイントとして、[実行ドメイン](default_domain.md)を取得する説明専用の関数テンプレート。 - -下記の優先順で実行ドメインを検索し、最初に適格となる型を採用する。 - -- Senderの[属性](../queryable.md)の実行ドメイン -- Senderの[完了Scheduler](get_completion_scheduler.md)の実行ドメイン -- [デフォルト実行ドメイン](default_domain.md) - - -## 効果 -説明用の型`Domain`を下記リストのうち最初に適格となる式の型と定義したとき、`return Domain();`と等価。 - -- [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr))` -- [`completion-domain`](completion-domain.md)`(sndr)` -- [`default_domain()`](default_domain.md) - - -## 例外 -投げない - - -## バージョン -### 言語 -- C++26 - - -## 関連項目 -- [`execution::continues_on`](continues_on.md) -- [`execution::then`](then.md) -- [`execution::let_value`](let_value.md) -- [`execution::bulk`](bulk.md) -- [`execution::when_all`](when_all.md) -- [`execution::into_variant`](into_variant.md) -- [`execution::stopped_as_optional`](stopped_as_optional.md) -- [`execution::stopped_as_error`](stopped_as_error.md) -- [`execution::associate`](associate.md) -- [`execution::affine_on`](affine_on.md) -- [`this_thread::sync_wait`](../this_thread/sync_wait.md) -- [`this_thread::sync_wait_with_variant`](../this_thread/sync_wait_with_variant.md) - - -## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) -- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/get-domain-late.md b/reference/execution/execution/get-domain-late.md deleted file mode 100644 index 5b54623859..0000000000 --- a/reference/execution/execution/get-domain-late.md +++ /dev/null @@ -1,70 +0,0 @@ -# get-domain-late -* [meta exposition-only] -* execution[meta header] -* function template[meta id-type] -* std::execution[meta namespace] -* cpp26[meta cpp] - -```cpp -template -constexpr auto get-domain-late(const Sndr& sndr, const Env& env) noexcept; -``` - -## 概要 -[Sender](sender.md)と[Receiver](receiver.md)間[接続(connect)](connect.md)時のカスタマイゼーションポイントとして、[実行ドメイン](default_domain.md)を取得する説明専用の関数テンプレート。 - -下記の優先順で実行ドメインを検索し、最初に適格となる型を採用する。 -(Senderアルゴリズム[`continues_on`](continues_on.md)のみ引数に指定した[Scheduler](scheduler.md)から取得。) - -- Senderの[属性](../queryable.md)の実行ドメイン -- Senderの[完了Scheduler](get_completion_scheduler.md)の実行ドメイン -- Receiverの[環境](../queryable.md)の実行ドメイン -- Receiver環境の[Scheduler](scheduler.md)の実行ドメイン -- [デフォルト実行ドメイン](default_domain.md) - - -## 効果 -説明用の型`Domain`を下記の通り定義したとき、`return Domain();`と等価。 - -- [`sender-for`](sender-for.md)` == true`のとき、次のラムダ式呼び出し結果の型とする。 - - ```cpp - [] { - auto [_, sch, _] = sndr; - return query-with-default(get_domain, sch, default_domain()); - }(); - ``` - * query-with-default[link query-with-default.md] - * get_domain[link get_domain.md] - * default_domain()[link default_domain.md] - -- それ以外のとき、下記リストのうち最初に適格となる式の型、かつ`void`ではない型とする。 - - [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr))` - - [`completion-domain`](completion-domain.md)`(sndr)` - - [`get_domain`](get_domain.md)`(env)` - - [`get_domain`](get_domain.md)`(`[`get_scheduler`](get_scheduler.md)`(env))` - - [`default_domain()`](default_domain.md) - - -## 例外 -投げない - - -## 備考 -Senderアダプタ[`continues_on`](continues_on.md)は[`schedule_from`](schedule_from.md)と連携して、実行コンテキスト遷移制御のカスタマイゼーションポイントをSchedulerに提供する。 - - -## バージョン -### 言語 -- C++26 - - -## 関連項目 -- [`execution::connect`](connect.md) -- [`execution::continues_on`](continues_on.md) -- [`execution::get_completion_signatures`](get_completion_signatures.md) - - -## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) -- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/get_completion_domain.md b/reference/execution/execution/get_completion_domain.md index 84c77a7170..2f0839d182 100644 --- a/reference/execution/execution/get_completion_domain.md +++ b/reference/execution/execution/get_completion_domain.md @@ -50,7 +50,7 @@ namespace std::execution { 型`Tag`、式`sndr`、パック`envs`に対して、`CS`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`decay_t`](/reference/type_traits/decay.md)`, decltype((envs))...>`とする。`get_completion_domain(`[`get_env`](get_env.md)`(sndr), envs...)`と`CS`が両者とも適格、かつ`CS().`[`count-of`](completion_signatures.md)`(Tag()) == 0`が`true`のとき、プログラムは不適格となる。 -`completion-fn`を完了関数、`completion-tag`を完了関数に関連付けられた完了タグ、`args`と`envs`を部分式のパック、式`sndr`を[`sender`](sender.md)``が`true`かつ`get_completion_domain(`[`get_env`](get_env.md)`(sndr), envs...)`となる式、`D`をドメインタグとする。`sndr`とReceiver`rcvr`を接続して作成された非同期操作が完了関数`completion-fn(rcvr, args...)`を評価するとき、その評価が実行ドメインタグ`D`に関連付けられた実行リソースの実行エージェント上で行われない場合、動作は未定義となる。 +`completion-fn`を完了関数、`completion-tag`を完了関数に関連付けられた完了タグ、`args`と`envs`を部分式のパック、式`sndr`を[`sender`](sender.md)``が`true`かつ`get_completion_domain(`[`get_env`](get_env.md)`(sndr), envs...)`となる式、`D`をドメインタグとする。`sndr`と[Receiver](receiver.md)`rcvr`を接続して作成された非同期操作が完了関数`completion-fn(rcvr, args...)`を評価するとき、その評価が実行ドメインタグ`D`に関連付けられた実行リソースの実行エージェント上で行われない場合、動作は未定義となる。 ## バージョン diff --git a/reference/execution/execution/get_completion_scheduler.md b/reference/execution/execution/get_completion_scheduler.md index b23fff224e..d56fcc45fc 100644 --- a/reference/execution/execution/get_completion_scheduler.md +++ b/reference/execution/execution/get_completion_scheduler.md @@ -17,7 +17,6 @@ namespace std::execution { ## 概要 `get_completion_scheduler`は、[Sender](sender.md)の[属性](get_env.md)から指定完了タグに関連付けられた完了Schedulerを取得する[クエリオブジェクト](../queryable.md)である。 -完了タグ`completion-tag`には、[`set_value_t`](set_value.md), [`set_error_t`](set_error.md), [`set_stopped_t`](set_stopped.md)のいずれかを指定する。 コア定数式[`forwarding_query`](../forwarding_query.md)`(get_completion_scheduler)`は`true`値を返す。 @@ -33,10 +32,24 @@ namespace std::execution { ## 効果 -呼び出し式`get_completion_scheduler(q)`は下記と等価であり、式が適格ならば[`scheduler`](scheduler.md)を満たす型の値となる。 +`completion-fn`を完了関数、`completion-tag`を完了関数に関連付けられた完了タグ、`args`と`envs`を部分式のパック、式`sndr`を[`sender`](sender.md)``が`true`かつ`get_completion_scheduler(`[`get_env`](get_env.md)`(sndr), envs...)`となる式、`sch`を[Scheduler](scheduler.md)とする。 -- 引数`q`がconst修飾された`cq`を用いて、式`cq.query(get_completion_scheduler)`が適格であればその値。 -- そうでなければ、呼び出し式は不適格となる。 +式`sch1`とパック`envs`に対して、式`sch2`を`TRY-QUERY(sch, get_completion_scheduler, envs...)`とする。`sch2`が不適格もしくは`sch1`と`sch2`が同一型かつ等しいとき、式`RECURSE-QUERY(sch1, envs...)`を`sch1`と等価な式とする。そうでなければ、式`RECURSE-QUERY(sch2, envs...)`と透過な式とする。 + +式`q`とパック`envs`に対して、完了タグ`completion-tag`が[`set_value_t`](set_value.md)/[`set_error_t`](set_error.md)/ [`set_stopped_t`](set_stopped.md)のいずれでもなければ、呼び出し式`get_completion_scheduler(q, envs...)`は不適格となる。 +そうでなければ、呼び出し式は下記と等価である。 + +- `envs...`が1回だけ評価されることを除いて、適格ならば下記の式 + + ```cpp + MANDATE-NOTHROW(RECURSE-QUERY( + TRY-QUERY(q, get_completion_scheduler, envs...), envs...)) + ``` + +- そうではなく、`envs...`が1回だけ評価されることを除いて、型`q`が[`schedeuler`](scheduler.md)を満たしかつ`envs`が空のパックでないとき、`auto(q)` +- そうでなければ、呼び出し式`get_completion_scheduler(q, envs...)`は不適格となる。 + +`get_completion_scheduler(q, envs...)`が適格ならば、その型は[Scheduler](scheduler.md)を満たすべき。 ## 例外 @@ -47,6 +60,10 @@ namespace std::execution { const修飾[クエリ可能オブジェクト](../queryable.md)`cq`に対して式`cq.query(get_completion_scheduler)`が呼び出される。 このとき、`noexcept(cq.query(get_completion_scheduler)) == true`であること。 +型`Tag`、式`sndr`、パック`envs`に対して、`CS`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`decay_t`](/reference/type_traits/decay.md)`, decltype((envs))...>`とする。`get_completion_scheduler(`[`get_env`](get_env.md)`(sndr), envs...)`と`CS`が両者とも適格、かつ`CS().`[`count-of`](completion_signatures.md)`(Tag()) == 0`が`true`のとき、プログラムは不適格となる。 + +`sndr`と[Receiver](receiver.md)`rcvr`を接続して作成された非同期操作が完了関数`completion-fn(rcvr, args...)`を評価するとき、その評価が`sch`と関連付けられた実行リソースの実行エージェント上で行われない場合、動作は未定義となる。 + ## 例 ```cpp @@ -110,3 +127,4 @@ int main() ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/get_domain.md b/reference/execution/execution/get_domain.md index 7cbf7dfe43..1006d63191 100644 --- a/reference/execution/execution/get_domain.md +++ b/reference/execution/execution/get_domain.md @@ -22,7 +22,7 @@ namespace std::execution { 部分式`env`に対して、型`D`を下記のうち最初に適格な式の型としたとき、呼び出し式`get_domain(env)`は`MANDATE-NOTHROW(D())`と等価。 - `auto(AS-CONST(env).query(get_domain))` -- `get_completion_domain<`[`set_value_t`](set_value.md)`>(`[`get_scheduler`](get_scheduler.md)`(env), HIDE-SCHED(env))` +- [`get_completion_domain`](get_completion_domain.md)`<`[`set_value_t`](set_value.md)`>(`[`get_scheduler`](get_scheduler.md)`(env), HIDE-SCHED(env))` - `env`が評価されることを除いて、[`default_domain()`](default_domain.md) diff --git a/reference/execution/execution/into_variant.md b/reference/execution/execution/into_variant.md index 57c78e6c23..5d91de06b8 100644 --- a/reference/execution/execution/into_variant.md +++ b/reference/execution/execution/into_variant.md @@ -21,13 +21,11 @@ namespace std::execution { ## 効果 説明用の式`sndr`に対して`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`into_variant(sndr)`は不適格となる。 -そうでなければ、呼び出し式`into_variant(sndr)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`into_variant(sndr)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(into_variant, {}, sndr)) +make-sender(into_variant, {}, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] @@ -96,7 +94,7 @@ namespace std::execution { ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -219,7 +217,7 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) - [LWG 4203. Constraints on `get-state` functions are incorrect](https://cplusplus.github.io/LWG/issue4203) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/just.md b/reference/execution/execution/just.md index 171b2162e4..e3406e4ed5 100644 --- a/reference/execution/execution/just.md +++ b/reference/execution/execution/just.md @@ -53,7 +53,7 @@ namespace std::execution { ## カスタマイゼーションポイント -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -113,5 +113,5 @@ result2=(123, 'X') ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/just_error.md b/reference/execution/execution/just_error.md index 6a8b42b087..c7a43e84e7 100644 --- a/reference/execution/execution/just_error.md +++ b/reference/execution/execution/just_error.md @@ -54,7 +54,7 @@ namespace std::execution { ## カスタマイゼーションポイント -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -94,5 +94,5 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/just_stopped.md b/reference/execution/execution/just_stopped.md index f3b343d7ea..4effbeced5 100644 --- a/reference/execution/execution/just_stopped.md +++ b/reference/execution/execution/just_stopped.md @@ -49,7 +49,7 @@ namespace std::execution { ## カスタマイゼーションポイント -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -89,5 +89,5 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/let_value.md b/reference/execution/execution/let_value.md index b87527df4c..abca0cfc07 100644 --- a/reference/execution/execution/let_value.md +++ b/reference/execution/execution/let_value.md @@ -29,13 +29,11 @@ namespace std::execution { ## 効果 説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let-cpo(sndr, f)`は不適格となる。 -そうでなければ、呼び出し式`let-cpo(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`let-cpo(sndr, f)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(let-cpo, f, sndr)) +make-sender(let-cpo, f, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] 説明用のクラステンプレート`let-data`を下記の通り定義する。 @@ -143,24 +141,13 @@ cs.for-each(overload-set(fn, [](auto){})); * overload-set[link overload-set.md] * set-cpo[italic] -説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`とする。[`sender-for`](sender-for.md)`> == false`のとき、式`let-cpo.transform_env(sndr, env)`は不適格となる。 - -そうでなければ、式`let-cpo.transform_env(sndr, env)`は下記と等価。 - -```cpp -auto& [_, _, child] = sndr; -return JOIN-ENV(let-env(child), FWD-ENV(env)); -``` -* JOIN-ENV[link ../queryable.md] -* FWD-ENV[link ../forwarding_query.md] - ## 説明専用エンティティ ### 式`let-env` -説明用の式`sndr`を用いて、`let-env(sndr)`を下記リストのうち最初に適格となる式と定義する。 +説明用の式`sndr`と`env`を用いて、`let-env(sndr, env)`を下記リストのうち最初に適格となる式と定義する。 -- [`SCHED-ENV`](schedule.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`decayed-typeof`](/reference/functional/decayed-typeof.md)`>(`[`get_env`](get_env.md)`(sndr)))` -- [`MAKE-ENV`](../queryable.md)`(`[`get_domain`](get_domain.md)`,` [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr)))` +- [`SCHED-ENV`](schedule.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`decayed-typeof`](/reference/functional/decayed-typeof.md)`>(`[`get_env`](get_env.md)`(sndr),` [`FWD-ENV`](../forwarding_query.md)`(env)))` +- [`MAKE-ENV`](../queryable.md)`(`[`get_domain`](get_domain.md)`,` [`get_completion_domain`](get_completion_domain.md)`>(`[`get_env`](get_env.md)`(sndr),` [`FWD-ENV`](../forwarding_query.md)`(env)))` - `(void(sndr),` [`env<>{}`](env.md)`)` ### 変数`is-valid-let-sender` @@ -169,14 +156,14 @@ return JOIN-ENV(let-env(child), FWD-ENV(env)); - `(`[`constructible_from`](/reference/concepts/constructible_from.md)`, Ts> &&...)` - [`invocable`](/reference/concepts/invocable.md)`&...>` - [`sender`](sender.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`&...>>` -- パック`env-t`を`decltype(let-cpo.transform_env(declval(), declval()))`としたとき、`sizeof...(Env) == 0 ||` [`sender_in`](sender_in.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`&...>, env-t...>` +- パック`env-t`を`decltype(`[`JOIN-ENV`](../queryable.md)`(let-env>(), declval(),` [`FWD-ENV`](../forwarding_query.md)`(declval())))`としたとき、`sizeof...(Env) == 0 ||` [`sender_in`](sender_in.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`&...>, env-t...>` ### クラステンプレート`let-state` ```cpp template struct let-state { - using env_t = decltype(let-env(declval())); // exposition only + using env_t = decltype(let-env(declval(), get_env(declval()))); // exposition only Fn fn; // exposition only env_t env; // exposition only ArgsVariant args; // exposition only @@ -243,7 +230,7 @@ struct let-state { using op_t = connect_result_t; // exposition only constexpr let-state(Sndr&& sndr, Fn fn, Rcvr& rcvr) // exposition only - : fn(std::move(fn)), env(let-env(sndr)), + : fn(std::move(fn)), env(let-env(sndr, get_env(rcvr))), ops(in_place_type, std::forward(sndr), receiver{*this, rcvr}) {} @@ -303,11 +290,11 @@ namespace std::execution { メンバ関数`receiver2::get_env`の呼び出しは、下記を満たすオブジェクト`e`を返す。 - 型`decltype(e)`が[`queryable`](../queryable.md)のモデルであり、かつ -- 与えられた[クエリオブジェクト](../queryable.md)`q`に対して、式`e.query(q)`は式`env.query(q)`が有効ならばその式と等価。そうではなく、`q`の型が[`forwarding-query`](../forwarding-query.md)を満たすならば式`e.query(q)`は[`get_env`](get_env.md)`(rcvr).query(q)`と等価。そうでなければ、式`e.query(q)`は不適格となる。 +- 与えられた[クエリオブジェクト](../queryable.md)`q`と部分式のパック`args`に対して、式`e.query(q, args...)`は式`env.query(q, args...)`が有効ならばその式と等価。そうではなく、`q`の型が[`forwarding-query`](../forwarding-query.md)を満たすならば式`e.query(q, args...)`は[`get_env`](get_env.md)`(rcvr).query(q, args...)`と等価。そうでなければ、式`e.query(q, args...)`は不適格となる。 ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 説明用の式`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)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。 @@ -492,7 +479,6 @@ catch 0 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3396R1 std::execution wording fixes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3396r1.html) - [P3433R1 Allocator Support for Operation States](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3433r1.pdf) @@ -501,3 +487,4 @@ catch 0 - [LWG 4204. specification of `as-sndr2(Sig)` in [exec.let] is incomplete](https://cplusplus.github.io/LWG/issue4204) - [LWG 4205. `let_[*].transform_env` is specified in terms of the `let_*` sender itself instead of its child](https://cplusplus.github.io/LWG/issue4205) - [P3373R4 Of Operation States and Their Lifetimes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3373r4.pdf) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/on.md b/reference/execution/execution/on.md index a9bcbed9c5..253bf89d2e 100644 --- a/reference/execution/execution/on.md +++ b/reference/execution/execution/on.md @@ -29,17 +29,11 @@ namespace std::execution { - `decltype((sndr))`が[`sender`](sender.md)を満たさず、かつ[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)ではない、もしくは - `decltype((sndr))`が[`sender`](sender.md)を満たし、かつ[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)である。 -そうでなければ、呼び出し式`on(sch, sndr)`は`sch`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`on(sch, sndr)`は下記と等価。 ```cpp -transform_sender( - query-with-default(get_domain, sch, default_domain()), - make-sender(on, sch, sndr)) +make-sender(on, sch, sndr) ``` -* transform_sender[link transform_sender.md] -* query-with-default[link query-with-default.md] -* get_domain[link get_domain.md] -* default_domain()[link default_domain.md] * make-sender[link make-sender.md] @@ -50,100 +44,53 @@ transform_sender( - `decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは - `closure`が[パイプ可能Senderアダプタクロージャオブジェクト](sender_adaptor_closure.md)ではない。 -そうでなければ、呼び出し式`on(sndr, sch, closure)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`on(sndr, sch, closure)`は下記と等価。 ```cpp -transform_sender( - get-domain-early(sndr), - make-sender(on, product-type{sch, closure}, sndr)) +make-sender(on, product-type{sch, closure}, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] * product-type[link product-type.md] ### Senderアルゴリズムタグ `on` -説明用の式`out_sndr`と`env`に対して、型`OutSndr`を`decltype((out_sndr))`とし、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`on.transform_env(out_sndr, env)`および式`on.transform_sender(out_sndr, env)`はいずれも不適格となる。 - -そうでなければ、下記の通り。 - -- 式`on.transform_env(out_sndr, env)`は下記と等価。 - - ```cpp - auto&& [_, data, _] = out_sndr; - if constexpr (scheduler) { - return JOIN-ENV(SCHED-ENV(std::forward_like(data)), FWD-ENV(std::forward(env))); - } else { - return std::forward(env); - } - ``` - * scheduler[link scheduler.md] - * JOIN-ENV[link ../queryable.md] - * SCHED-ENV[link scheduler.md] - * FWD-ENV[link ../forwarding_query.md] - -- 式`on.transform_sender(out_sndr, env)`は下記と等価。 - - ```cpp - auto&& [_, data, child] = out_sndr; - if constexpr (scheduler) { - auto orig_sch = - query-with-default(get_scheduler, env, not-a-scheduler()); - - if constexpr (same_as) { - return not-a-sender{}; - } else { - return continues_on( - starts_on(std::forward_like(data), std::forward_like(child)), - std::move(orig_sch)); - } - } else { - auto& [sch, closure] = data; - auto orig_sch = query-with-default( - get_completion_scheduler, - get_env(child), - query-with-default(get_scheduler, env, not-a-scheduler())); - - if constexpr (same_as) { - return not-a-sender{}; - } else { - return write_env( - continues_on( - std::forward_like(closure)( - continues_on( - write_env(std::forward_like(child), SCHED-ENV(orig_sch)), - sch)), - orig_sch), - SCHED-ENV(sch)); - } - } - ``` - * scheduler[link scheduler.md] - * get_scheduler[link get_scheduler.md] - * continues_on[link continues_on.md] - * starts_on[link starts_on.md] - * get_completion_scheduler[link get_completion_scheduler.md] - * set_value_t[link set_value.md] - * get_env[link get_env.md] - * query-with-default[link query-with-default.md] - * not-a-sender[link not-a-sender.md] - * write_env[link write_env.md] - * SCHED-ENV[link scheduler.md] - * std::move[link /reference/utility/move.md] - -説明専用のクラス`not-a-scheduler`を未規定な空のクラス型とする。 +説明用の式`out_sndr`と`env`に対して、型`OutSndr`を`decltype((out_sndr))`とし、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`on.transform_sender(set_value, out_sndr, env)`は不適格となる。 +そうでなければ、式`on.transform_sender(set_value, out_sndr, env)`は下記と等価。 -## カスタマイゼーションポイント -Senderアルゴリズム構築時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 +```cpp +auto&& [_, data, child] = out_sndr; +if constexpr (scheduler) { + auto orig_sch = + call-with-default(get_scheduler, not-a-scheduler(), env); + + return continues_on( + starts_on(std::forward_like(data), std::forward_like(child)), + std::move(orig_sch)); +} else { + auto& [sch, closure] = data; + auto orig_sch = call-with-default( + get_completion_scheduler, not-a-scheduler(), get_env(child), env); + return continues_on( + std::forward_like(closure)(continues_on(std::forward_like(child), SCHED-ENV(orig_sch)), + orig_sch); +} +``` +* scheduler[link scheduler.md] +* get_scheduler[link get_scheduler.md] +* continues_on[link continues_on.md] +* starts_on[link starts_on.md] +* get_completion_scheduler[link get_completion_scheduler.md] +* set_value_t[link set_value.md] +* get_env[link get_env.md] +* call-with-default[link call-with-default.md.nolink] +* SCHED-ENV[link scheduler.md] +* std::move[link /reference/utility/move.md] -- 呼び出し式`on(sch, sndr)` : [Scheduler](scheduler.md)`sch`に[関連付けられた実行ドメイン](query-with-default.md) -- 呼び出し式`on(sndr, sch, closure)` : [Sender](sender.md)`sndr`に[関連付けられた実行ドメイン](get-domain-early.md) -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`on.transform_sender(out_sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 +## カスタマイゼーションポイント +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`on.transform_sender(set_value, out_sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 ### 呼び出し式 `on(sch, sndr)` @@ -160,9 +107,7 @@ Senderアルゴリズム構築時に、関連付けられた実行ドメイン ### 呼び出し式 `on(sndr, sch, closure)` 説明用の式`out_sndr`を`on(sndr, sch, closure)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、[`start`](start.md)`(op)`呼び出しは下記を満たすべき。 -- 下記のうち最初に適格となるものを、現在のSchedulerとして記憶する。 - - [`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(rcvr))` - - [`get_scheduler`](get_scheduler.md)`(`[`get_env`](get_env.md)`(rcvr))` +- 現在のSchedulerとして、[`get_completion_scheduler`](get_completion_scheduler.md)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(rcvr))`を記憶する。 - `sndr`を現在の実行エージェント上で開始する。 - `sndr`の完了後に、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースの実行エージェントに実行制御を移す。 - `sndr`の非同期操作の結果を、Sender`closure(S)`と接続して開始するかのように転送する。ここで`S`は`sndr`の非同期操作の結果と同期的に完了するSenderとする。 @@ -313,6 +258,6 @@ val=42 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/prop.md b/reference/execution/execution/prop.md index d58f8f3840..d95aebaeda 100644 --- a/reference/execution/execution/prop.md +++ b/reference/execution/execution/prop.md @@ -11,7 +11,7 @@ namespace std::execution { QueryTag query_; // exposition only ValueType value_; // exposition only - constexpr const ValueType& query(QueryTag) const noexcept { + constexpr const ValueType& query(QueryTag, auto&&...) const noexcept { return value_; } }; @@ -74,3 +74,4 @@ int main() ## 参照 - [P3325R5 A Utility for Creating Execution Environments](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3325r5.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/run_loop/run-loop-scheduler.md b/reference/execution/execution/run_loop/run-loop-scheduler.md index 25bbbf0169..5716c12552 100644 --- a/reference/execution/execution/run_loop/run-loop-scheduler.md +++ b/reference/execution/execution/run_loop/run-loop-scheduler.md @@ -19,7 +19,7 @@ class run-loop-scheduler; // exposition only - `run-loop-scheduler`インスタンスは、同インスタンスを取得した[`run_loop`](../run_loop.md)インスタンスの生存期間(lifetime)終了まで有効。 - 2個の`run-loop-scheduler`インスタンスは、同一[`run_loop`](../run_loop.md)インスタンスから取得された場合に限って等しい。 - 説明用の式`sch`の型が`run-loop-scheduler`であるとき、式[`schedule`](../schedule.md)`(sch)`は型[`run-loop-sender`](run-loop-sender.md)となり、式`sch`が潜在的に例外送出しない(not potentially-throwing)ならばそれに従う。 - +- [`set_error_t`](../set_error.md)ではない型`set-tag`に対して、式[`get_completion_scheduler`](../get_completion_scheduler.md)`(`[`get_env`](../get_env.md)`(`[`schedule`](../schedule.md)`(sch))) == sch`は`true`である。 ## バージョン ### 言語 @@ -33,3 +33,4 @@ class run-loop-scheduler; // exposition only ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/schedule_from.md b/reference/execution/execution/schedule_from.md index b76689c3f9..0ff51e6c29 100644 --- a/reference/execution/execution/schedule_from.md +++ b/reference/execution/execution/schedule_from.md @@ -6,205 +6,30 @@ ```cpp namespace std::execution { - struct schedule_from_t { unspecified }; - inline constexpr schedule_from_t schedule_from{}; + struct on_t { unspecified }; + inline constexpr on_t on{}; } ``` * unspecified[italic] ## 概要 -`schedule_from`は、[Sender](sender.md)の完了に依存する作業を[Scheduler](scheduler.md)に関連付けられた実行リソースにスケジュールするSenderアダプタである。 - -`schedule_from`はユーザコードで利用されるものではなく、[`continues_on`](continues_on.md)Senderアルゴリズムの実装において利用される。 +`schedule_from`は、実行コンテキストからの遷移制御で[Scheduler](scheduler.md)から利用されるSenderアダプタである。 ## 効果 -説明用の式`sch`と`sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`schedule_from(sch, sndr)`は不適格となる。 +説明用の式`sndr`に対して`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`schedule_from(sndr)`は不適格となる。 -そうでなければ、呼び出し式`schedule_from(sch, sndr)`は`sch`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`schedule_from(sndr)`は下記と等価。 ```cpp -transform_sender( - query-with-default(get_domain, sch, default_domain()), - make-sender(schedule_from, sch, sndr)) +make-sender(schedule_from, {}, sndr) ``` -* transform_sender[link transform_sender.md] -* query-with-default[link query-with-default.md] -* get_domain[link get_domain.md] -* default_domain()[link default_domain.md] * make-sender[link make-sender.md] -### Senderアルゴリズムタグ `schedule_from` -Senderアルゴリズム動作説明用のクラステンプレート[`impls-for`](impls-for.md)に対して、下記の特殊化が定義される。 - -```cpp -namespace std::execution { - template<> - struct impls-for : default-impls { - static constexpr auto get-attrs = see below; - static constexpr auto get-state = see below; - static constexpr auto complete = see below; - - template - static consteval void check-types(); - }; -} -``` -* impls-for[link impls-for.md] -* default-impls[link impls-for.md] - -`impls-for::get-attrs`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 - -```cpp -[](const auto& data, const auto& child) noexcept -> decltype(auto) { - return JOIN-ENV(SCHED-ATTRS(data), FWD-ENV(get_env(child))); -} -``` -* JOIN-ENV[link ../queryable.md] -* SCHED-ATTRS[link scheduler.md] -* FWD-ENV[link ../forwarding_query.md] -* get_env[link get_env.md] - -`impls-for::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 - -```cpp -[](Sndr&& sndr, Rcvr& rcvr) noexcept(see below) - requires sender_in, FWD-ENV-T(env_of_t)> { - - auto& [_, sch, child] = sndr; - - using sched_t = decltype(auto(sch)); - using variant_t = see below; - using receiver_t = see below; - using operation_t = connect_result_t, receiver_t>; - constexpr bool nothrow = noexcept(connect(schedule(sch), receiver_t{nullptr})); - - struct state-type { - Rcvr& rcvr; // exposition only - variant_t async-result; // exposition only - operation_t op-state; // exposition only - - explicit state-type(sched_t sch, Rcvr& rcvr) noexcept(nothrow) - : rcvr(rcvr), op-state(connect(schedule(sch), receiver_t{this})) {} - }; - - return state-type{sch, rcvr}; -} -``` -* sender_in[link sender_in.md] -* child-type[link child-type.md] -* FWD-ENV-T[link ../forwarding_query.md] -* env_of_t[link env_of_t.md] -* connect_result_t[link connect_result_t.md] -* schedule_result_t[link schedule_result_t.md] -* connect[link connect.md] -* schedule[link schedule.md] - -- ローカルクラス`state-type`のオブジェクトは[構造化束縛](/lang/cpp17/structured_bindings.md)における初期化子として利用できる。 -- 説明用のパック`Sigs`を[`completion_signatures_of_t`](completion_signatures_of_t.md)`<`[`child-type`](child-type.md)`,` [`FWD-ENV-T`](../forwarding_query.md)`(`[`env_of_t`](env_of_t.md)`)>`による[`completion_signatures`](completion_signatures.md)特殊化のテンプレートパラメータと定義する。説明用のエイリアステンプレート`as-tuple`を[`decayed-tuple`](decayed-tuple.md)``と定義し、説明用の変数テンプレート`is-nothrow-decay-copy-sig`を型`Args...`が全て例外送出せずdecayコピー可能ならば値`true`、そうでなければ`false`となる`bool const`型のコア定数式と定義する。説明用のパック`error-completion`を、`(is-nothrow-decay-copy-sig &&...)`が`false`ならば[`set_error_t`](set_error.md)`(`[`exception_ptr`](/reference/exception/exception_ptr.md)`)`、そうでなければ空のパックと定義する。型`variant_t`は下記定義において重複削除した型となる。 - - ```cpp - variant..., error-completion...> - ``` - * variant[link /reference/variant/variant.md] - * monostate[link /reference/variant/monostate.md] - -- `receiver_t`は説明専用クラス`receiver-type`のエイリアスとする。 - -`impls-for::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 - -```cpp -[](auto, auto& state, auto& rcvr, Tag, Args&&... args) noexcept - -> void { - using result_t = decayed-tuple; - constexpr bool nothrow = (is_nothrow_constructible_v, Args> && ...); - - try { - state.async-result.template emplace(Tag(), std::forward(args)...); - } catch (...) { - if constexpr (!nothrow) - state.async-result.template emplace>(set_error, current_exception()); - } - start(state.op-state); -}; -``` -* decayed-tuple[link decayed-tuple.md] -* set_error[link set_error.md] -* start[link start.md] -* is_nothrow_constructible_v[link /reference/type_traits/is_nothrow_constructible.md] -* template emplace[link /reference/variant/variant/emplace.md] -* set_error_t[link set_error.md] -* exception_ptr[link /reference/exception/exception_ptr.md] -* current_exception()[link /reference/exception/current_exception.md] - -メンバ関数`impls-for::check-types`の効果は下記の通り。 - -```cpp -get_completion_signatures>, FWD-ENV-T(Env)...>(); -auto cs = get_completion_signatures, FWD-ENV-T(Env)...>(); -decay-copyable-result-datums(cs); -``` -* get_completion_signatures[link get_completion_signatures.md] -* schedule_result_t[link schedule_result_t.md] -* data-type[link data-type.md] -* FWD-ENV-T[link ../forwarding_query.md] -* decay-copyable-result-datums[link decay-copyable-result-datums.md] - - -## 説明専用エンティティ -説明専用のクラス`receiver-type`を下記の通り定義する。 - -```cpp -namespace std::execution { - struct receiver-type { - using receiver_concept = receiver_t; - state-type* state; // exposition only - - void set_value() && noexcept { - visit( - [this](Tuple& result) noexcept -> void { - if constexpr (!same_as) { - auto& [tag, ...args] = result; - tag(std::move(state->rcvr), std::move(args)...); - } - }, - state->async-result); - } - - template - void set_error(Error&& err) && noexcept { - execution::set_error(std::move(state->rcvr), std::forward(err)); - } - - void set_stopped() && noexcept { - execution::set_stopped(std::move(state->rcvr)); - } - - decltype(auto) get_env() const noexcept { - return FWD-ENV(execution::get_env(state->rcvr)); - } - }; -} -``` -* receiver_t[link receiver.md] -* execution::set_error[link set_error.md] -* execution::set_stopped[link set_stopped.md] -* execution::get_env[link get_env.md] -* FWD-ENV[link ../forwarding_query.md] -* visit[link /reference/variant/visit.md] -* monostate[link /reference/variant/monostate.md] -* std::move[link /reference/utility/move.md] - - ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](../execution/default_domain.md)では無変換。 - -説明用の式`out_sndr`を`schedule_from(sndr, sch)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、 - -- 呼び出し[`start`](start.md)`(op)`は、現在の実行エージェント上で入力[Sender](sender.md)`sndr`を開始し、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェント上で`out_rcvr`の完了操作を実行すべき。 -- `sch`上でのスケジューリングが失敗した場合、未規定の実行エージェント上で`out_rcvr`の[エラー完了](set_error.md)が行われるべき。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では無変換。 ## バージョン @@ -219,14 +44,9 @@ Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、 ## 関連項目 -- [`execution::schedule`](schedule.md) - [`execution::continues_on`](continues_on.md) ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) -- [P3396R1 std::execution wording fixes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3396r1.html) -- [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) -- [LWG 4198. `schedule_from` isn't starting the schedule sender if decay-copying results throws](https://cplusplus.github.io/LWG/issue4198) -- [LWG 4203. Constraints on `get-state` functions are incorrect](https://cplusplus.github.io/LWG/issue4203) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/scheduler.md b/reference/execution/execution/scheduler.md index 2b5af0ea54..d49dd96576 100644 --- a/reference/execution/execution/scheduler.md +++ b/reference/execution/execution/scheduler.md @@ -65,17 +65,11 @@ Scheduler型のデストラクタは、[`schedule`](schedule.md)が返すSender ## 説明専用エンティティ -### 式`SCHED-ATTRS` -説明用のScheduler`sch`に対して、式`SCHED-ATTRS(sch)`は[`queryable`](../queryable.md)を満たす型の式`o1`となり、下記を満たす。 - -- 型`Tag`が[`set_value_t`](set_value.md)もしくは[`set_stopped_t`](set_stopped.md)のとき、式`o1.query(`[`get_completion_scheduler`](get_completion_scheduler.md)`)`の型および値が`sch`と等しい。 -- 式`o1.query(`[`get_domain`](get_domain.md)`)`は`sch.query(`[`get_domain`](get_domain.md)`)`と等価。 - ### 式`SCHED-ENV` -説明用のScheduler`sch`に対して、式`SCHED-ENV(sch)`は[`queryable`](../queryable.md)を満たす型の式`o2`となり、下記を満たす。 +説明用のScheduler`sch`に対して、式`SCHED-ENV(sch)`は[`queryable`](../queryable.md)を満たす型の式`o`となり、下記を満たす。 -- 式`o2.query(`[`get_scheduler`](get_scheduler.md)`)`は、型および値が`sch`と等しい右辺値。 -- 式`o2.query(`[`get_domain`](get_domain.md)`)`は`sch.query(`[`get_domain`](get_domain.md)`)`と等価。 +- 式`o.query(`[`get_scheduler`](get_scheduler.md)`)`は、型および値が`sch`と等しい右辺値。 +- 式`o.query(`[`get_domain`](get_domain.md)`)`は`sch.query(`[`get_domain`](get_domain.md)`)`と等価。 ## 例 diff --git a/reference/execution/execution/starts_on.md b/reference/execution/execution/starts_on.md index 7f6a2899c1..5b72930759 100644 --- a/reference/execution/execution/starts_on.md +++ b/reference/execution/execution/starts_on.md @@ -19,58 +19,38 @@ namespace std::execution { ## 効果 説明用の式`sch`と`sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`starts_on(sch, sndr)`は不適格となる。 -そうでなければ、呼び出し式`starts_on(sch, sndr)`は`sch`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、下記と等価。 ```cpp -transform_sender( - query-with-default(get_domain, sch, default_domain()), - make-sender(starts_on, sch, sndr)) +make-sender(starts_on, sch, sndr) ``` -* transform_sender[link transform_sender.md] -* query-with-default[link query-with-default.md] -* get_domain[link get_domain.md] -* default_domain()[link default_domain.md] * make-sender[link make-sender.md] ### Senderアルゴリズムタグ `starts_on` -説明用の式`out_sndr`と`env`に対して、型`OutSndr`を`decltype((out_sndr))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`starts_on.transform_env(out_sndr, env)`および式`starts_on.transform_sender(out_sndr, env)`はいずれも不適格となる。 +説明用の式`out_sndr`と`env`に対して、型`OutSndr`を`decltype((out_sndr))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`starts_on.transform_sender(set_value, out_sndr, env)`は不適格となる。 -そうでなければ、下記の通り。 +そうでなければ、式`starts_on.transform_sender(set_value, out_sndr, env)`は下記と等価。 -- 式`starts_on.transform_env(out_sndr, env)`は下記と等価。 - - ```cpp - auto&& [_, sch, _] = out_sndr; - return JOIN-ENV(SCHED-ENV(sch), FWD-ENV(env)); - ``` - * JOIN-ENV[link ../queryable.md] - * SCHED-ENV[link scheduler.md] - * FWD-ENV[link ../forwarding_query.md] - -- 式`starts_on.transform_sender(out_sndr, env)`は下記と等価。 - - ```cpp - auto&& [_, sch, sndr] = out_sndr; - return let_value( - schedule(sch), - [sndr = std::forward_like(sndr)]() mutable - noexcept(is_nothrow_move_constructible_v>) { - return std::move(sndr); - }); - ``` - * let_value[link let_value.md] - * schedule[link schedule.md] - * is_nothrow_move_constructible_v[link /reference/type_traits/is_nothrow_move_constructible.md] - * std::move[link /reference/utility/move.md] +```cpp +auto&& [_, sch, sndr] = out_sndr; +return let_value( + continues_on(just(), sch), + [sndr = std::forward_like(sndr)]() mutable + noexcept(is_nothrow_move_constructible_v>) { + return std::move(sndr); + }); +``` +* let_value[link let_value.md] +* continues_on[link continues_on.md] +* just()[link just.md] +* is_nothrow_move_constructible_v[link /reference/type_traits/is_nothrow_move_constructible.md] +* std::move[link /reference/utility/move.md] ## カスタマイゼーションポイント -Senderアルゴリズム構築時に、[Scheduler](scheduler.md)`sch`に[関連付けられた実行ドメイン](query-with-default.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 - -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`starts_on.transform_sender(out_sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`starts_on.transform_sender(set_value, out_sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 説明用の式`out_sndr`を`starts_on(sch, sndr)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in.md)` == true`となる[環境](../queryable.md)`Env`に関連付けられた[Receiver](receiver.md)とする。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、 @@ -151,5 +131,5 @@ val=42 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/stopped_as_error.md b/reference/execution/execution/stopped_as_error.md index 908ae52ab2..fa1dec56c2 100644 --- a/reference/execution/execution/stopped_as_error.md +++ b/reference/execution/execution/stopped_as_error.md @@ -21,20 +21,18 @@ namespace std::execution { ## 効果 説明用の式`sndr`と`err`に対して、型`Sndr`を`decltype((sndr))`、型`Err`を`decltype((err))`とする。`Sndr`が[`sender`](sender.md)を満たさない、もしくは`Err`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`stopped_as_error(sndr, err)`は不適格となる。 -そうでなければ、呼び出し式`stopped_as_error(sndr, err)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`stopped_as_error(sndr, err)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(stopped_as_error, err, sndr)) +make-sender(stopped_as_error, err, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] ### Senderアルゴリズムタグ `stopped_as_error` -説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`stopped_as_error.transform_sender(sndr, env)`は不適格となる。 +説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`stopped_as_error.transform_sender(set_value, sndr, env)`は不適格となる。 -そうでなければ、式`stopped_as_error.transform_sender(sndr, env)`は下記と等価。 +そうでなければ、式`stopped_as_error.transform_sender(set_value, sndr, env)`は下記と等価。 ```cpp auto&& [_, err, child] = sndr; @@ -52,11 +50,8 @@ return let_stopped( ## カスタマイゼーションポイント -Senderアルゴリズム構築時に、[Sender](sender.md)`sndr`に[関連付けられた実行ドメイン](get-domain-early.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 - -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`stopped_as_error.transform_sender(sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`stopped_as_error.transform_sender(set_value, sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 ## 例 @@ -169,5 +164,5 @@ stopped ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/stopped_as_optional.md b/reference/execution/execution/stopped_as_optional.md index c834809fba..e2544b5e14 100644 --- a/reference/execution/execution/stopped_as_optional.md +++ b/reference/execution/execution/stopped_as_optional.md @@ -19,13 +19,11 @@ namespace std::execution { ## 効果 -説明用の式`sndr`に対して、型`Sndr`を`decltype((sndr))`とする。呼び出し式`stopped_as_optional(sndr)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +説明用の式`sndr`に対して、型`Sndr`を`decltype((sndr))`とする。呼び出し式`stopped_as_optional(sndr)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(stopped_as_optional, {}, sndr)) +make-sender(stopped_as_optional, {}, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] @@ -53,11 +51,11 @@ namespace std::execution { * FWD-ENV-T[link ../forwarding_query.md] * unspecified-exception[link unspecified-exception.md] -説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`stopped_as_optional.transform_sender(sndr, env)`は不適格となる。 +説明用の式`sndr`と`env`に対して、型`Sndr`を`decltype((sndr))`、型`Env`を`decltype((env))`とする。[`sender-for`](sender-for.md)` == false`のとき、式`stopped_as_optional.transform_sender(set_value, sndr, env)`は不適格となる。 -そうではなく、[`sender_in`](sender_in.md)`<`[`child-type`](child-type.md)`,` [`FWD-ENV-T`](../forwarding_query.md)`(Env)> == false`のとき、式`stopped_as_optional.transform_sender(sndr, env)`は[`not-a-sender()`](not-a-sender.md)と等価。 +そうではなく、[`sender_in`](sender_in.md)`<`[`child-type`](child-type.md)`,` [`FWD-ENV-T`](../forwarding_query.md)`(Env)> == false`のとき、式`stopped_as_optional.transform_sender(set_value, sndr, env)`は[`not-a-sender()`](not-a-sender.md)と等価。 -そうでなければ、式`stopped_as_optional.transform_sender(sndr, env)`は下記と等価。 +そうでなければ、式`stopped_as_optional.transform_sender(set_value, sndr, env)`は下記と等価。 ```cpp auto&& [_, _, child] = sndr; @@ -80,11 +78,8 @@ return let_stopped( ## カスタマイゼーションポイント -Senderアルゴリズム構築時に、[Sender](sender.md)`sndr`に[関連付けられた実行ドメイン](get-domain-early.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 - -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`stopped_as_optional.transform_sender(sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`stopped_as_optional.transform_sender(set_value, sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 ## 例 @@ -195,7 +190,7 @@ stopped ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) - [LWG 4203. Constraints on `get-state` functions are incorrect](https://cplusplus.github.io/LWG/issue4203) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/then.md b/reference/execution/execution/then.md index 15240a0fbb..265aca1982 100644 --- a/reference/execution/execution/then.md +++ b/reference/execution/execution/then.md @@ -29,13 +29,11 @@ namespace std::execution { ## 効果 説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`then-cpo(sndr, f)`は不適格となる。 -そうでなければ、呼び出し式`then-cpo(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +そうでなければ、呼び出し式`then-cpo(sndr, f)`は下記と等価。 ```cpp -transform_sender(get-domain-early(sndr), make-sender(then-cpo, f, sndr)) +make-sender(then-cpo, f, sndr) ``` -* transform_sender[link transform_sender.md] -* get-domain-early[link get-domain-early.md] * make-sender[link make-sender.md] @@ -92,7 +90,7 @@ cs.for-each(overload-set{fn, [](auto){}}); ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 戻り値の[Sender](sender.md)`out_sndr`が下記を満たさない場合、呼び出し式`then-cpo(sndr, f)`の動作は未定義となる。 @@ -159,7 +157,7 @@ C++ ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) - [LWG4369 `check-types` function for `upon_error` and `upon_stopped` is wrong](https://cplusplus.github.io/LWG/issue4369) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/transform_sender.md b/reference/execution/execution/transform_sender.md index 4c7d721258..dfc416f6ba 100644 --- a/reference/execution/execution/transform_sender.md +++ b/reference/execution/execution/transform_sender.md @@ -20,6 +20,10 @@ Senderと[Receiver](receiver.md)間[接続(connect)](connect.md)時のカスタ ## 戻り値 +式`s`に対して、`start-domain`を`D()`とする。ここで`D`を適格であるならば式[`get_domain`](get_domain.md)`(env)`のdecay型、そうでなければ[`default_domain`](default_domain.md)とする。 + +また`completion-domain(s)`を`D()`とする。ここで`D`を適格であるならば式[`get_completion_domain<>`](get_completion_domain.md)`(`[`get_env`](get_env.md)`(s), env)`のdecay型、そうでなければ[`default_domain`](default_domain.md)とする。 + 説明用の式`transformed-sndr(dom, tag, s)`を次の通りとする。 - 適格であるならば、式`dom.transform_sender(tag, s, env)` @@ -37,8 +41,7 @@ Senderと[Receiver](receiver.md)間[接続(connect)](connect.md)時のカスタ ## 例外 -`noexcept(final-sndr) == true`ならば、例外を投げない。 -そうでなければ、Sender変換過程で送出される例外。 +例外指定は`noexcept(final-sndr)`に等しい。 ## バージョン diff --git a/reference/execution/execution/upon_error.md b/reference/execution/execution/upon_error.md index 0bf0b74df7..1e0880f26d 100644 --- a/reference/execution/execution/upon_error.md +++ b/reference/execution/execution/upon_error.md @@ -78,5 +78,4 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/upon_stopped.md b/reference/execution/execution/upon_stopped.md index be0deec450..98ad74d898 100644 --- a/reference/execution/execution/upon_stopped.md +++ b/reference/execution/execution/upon_stopped.md @@ -77,5 +77,4 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) diff --git a/reference/execution/execution/when_all.md b/reference/execution/execution/when_all.md index 3af9660188..26e182bd3d 100644 --- a/reference/execution/execution/when_all.md +++ b/reference/execution/execution/when_all.md @@ -24,7 +24,7 @@ namespace std::execution { ## 効果 -説明用のパック`sndrs`に対してパック`Sndrs`を`decltype((sndrs))...`としたとき、型`CD`を[`common_type_t`](/reference/type_traits/common_type.md)``とする。型`CD`が適格ならば型`CD2`を`CD`とし、そうでなければ[`default_domain`](default_domain.md)とする。 +説明用のパック`sndrs`に対してパック`Sndrs`を`decltype((sndrs))...`とする。 下記いずれかが`true`となるとき、呼び出し式`when_all(sndrs...)`は不適格となる。 @@ -34,9 +34,8 @@ namespace std::execution { そうでなければ、呼び出し式`when_all(sndrs...)`は下記と等価。 ```cpp -transform_sender(CD2(), make-sender(when_all, {}, sndrs...)) +make-sender(when_all, {}, sndrs...) ``` -* transform_sender[link transform_sender.md] * make-sender[link make-sender.md] @@ -47,7 +46,6 @@ Senderアルゴリズム動作説明用のクラステンプレート[`impls-for namespace std::execution { template<> struct impls-for : default-impls { - static constexpr auto get-attrs = see below; static constexpr auto get-env = see below; static constexpr auto get-state = see below; static constexpr auto start = see below; @@ -61,22 +59,6 @@ namespace std::execution { * impls-for[link impls-for.md] * default-impls[link impls-for.md] -`impls-for::get-attrs`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 - -```cpp -[](auto&&, auto&&... child) noexcept { - if constexpr (same_as) { - return env<>(); - } else { - return MAKE-ENV(get_domain, CD()); - } -} -``` -* default_domain[link default_domain.md] -* env<>[link env.md] -* MAKE-ENV[link ../queryable.md] -* get_domain[link get_domain.md] - `impls-for::get-env`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。 ```cpp @@ -198,8 +180,6 @@ auto fn = []() { * decay-copyable-result-datums[link decay-copyable-result-datums.md] * child-type[link child-type.md] -型`CD`が不適格な場合、[`unspecified-exception`](unspecified-exception.md)型の例外を送出する。 - ## 説明専用エンティティ ### 関数テンプレート`make-when-all-env` @@ -339,7 +319,7 @@ variant ## カスタマイゼーションポイント -Senderアルゴリズム構築時および[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 [デフォルト実行ドメイン](default_domain.md)では無変換。 @@ -501,7 +481,6 @@ error=-2 ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3396R1 std::execution wording fixes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3396r1.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) @@ -509,3 +488,4 @@ error=-2 - [LWG 4203. Constraints on `get-state` functions are incorrect](https://cplusplus.github.io/LWG/issue4203) - [LWG 4227. Missing `noexcept` operator in [exec.when.all]](https://cplusplus.github.io/LWG/issue4227) - [LWG 4438. Bad expression in [exec.when.all]](https://cplusplus.github.io/LWG/issue4438) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/execution/when_all_with_variant.md b/reference/execution/execution/when_all_with_variant.md index 92c0516f72..44a0e8a4b6 100644 --- a/reference/execution/execution/when_all_with_variant.md +++ b/reference/execution/execution/when_all_with_variant.md @@ -24,7 +24,7 @@ namespace std::execution { ## 効果 -説明用のパック`sndrs`に対してパック`Sndrs`を`decltype((sndrs))...`としたとき、型`CD`を[`common_type_t`](/reference/type_traits/common_type.md)``とする。型`CD`が適格ならば型`CD2`を`CD`とし、そうでなければ[`default_domain`](default_domain.md)とする。 +説明用のパック`sndrs`に対してパック`Sndrs`を`decltype((sndrs))...`とする。 下記いずれかが`true`となるとき、呼び出し式`when_all_with_variant(sndrs...)`は不適格となる。 @@ -34,16 +34,15 @@ namespace std::execution { そうでなければ、呼び出し式`when_all_with_variant(sndrs...)`は下記と等価。 ```cpp -transform_sender(CD2(), make-sender(when_all_with_variant, {}, sndrs...)) +make-sender(when_all_with_variant, {}, sndrs...) ``` -* transform_sender[link transform_sender.md] * make-sender[link make-sender.md] ### Senderアルゴリズムタグ `when_all_with_variant` -説明用の式`sndr`と`env`に対して、[`sender-for`](sender-for.md)` == false`のとき、式`when_all_with_variant.transform_sender(sndr, env)`は不適格となる。 +説明用の式`sndr`と`env`に対して、[`sender-for`](sender-for.md)` == false`のとき、式`when_all_with_variant.transform_sender(set_value, sndr, env)`は不適格となる。 -そうでなければ、式`when_all_with_variant.transform_sender(sndr, env)`は下記と等価。 +そうでなければ、式`when_all_with_variant.transform_sender(set_value, sndr, env)`は下記と等価。 ```cpp auto&& [_, _, ...child] = sndr; @@ -54,11 +53,8 @@ return when_all(into_variant(std::forward_like(child))...); ## カスタマイゼーションポイント -Senderアルゴリズム構築時に、全入力Senderに関連付けられた共通の実行ドメイン`CD`に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では無変換。 - -[Receiver](receiver.md)との[接続(connect)](connect.md)時に、[関連付けられた実行ドメイン](get-domain-late.md)に対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 -[デフォルト実行ドメイン](default_domain.md)では`when_all_with_variant.transform_sender(sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 +[Receiver](receiver.md)との[接続(connect)](connect.md)時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。 +[デフォルト実行ドメイン](default_domain.md)では`when_all_with_variant.transform_sender(set_value, sndr, env)`が呼ばれ、前述仕様通りのSenderへと変換される。 ## 例 @@ -187,6 +183,6 @@ int main() ## 参照 -- [P2999R3 Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2999r3.html) - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/this_thread/sync_wait.md b/reference/execution/this_thread/sync_wait.md index 06a2b6cd39..e2d010f8cf 100644 --- a/reference/execution/this_thread/sync_wait.md +++ b/reference/execution/this_thread/sync_wait.md @@ -24,13 +24,12 @@ namespace std::this_thread { ## 効果 説明用の`sndr`を`decltype((sndr))`が`Sndr`型となる式とする。 -呼び出し式`this_thread::sync_wait(sndr)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +型`Domain`を[`get_completion_domain`](../execution/get_completion_domain.md)`<`[`set_value_t`](../execution/set_value.md)`>(`[`get_env`](../execution/get_env.md)`(sndr),` [`sync-wait-env{}`](sync-wait-env.md)`)`として、呼び出し式`this_thread::sync_wait(sndr)`は下記と等価。 ```cpp -apply_sender(get-domain-early(sndr), sync_wait, sndr) +apply_sender(Domain(), sync_wait, sndr) ``` * apply_sender[link ../execution/apply_sender.md] -* get-domain-early[link ../execution/get-domain-early.md] - [`sender_in`](../execution/sender_in.md)` == true`であること。 - 型`sync-wait-result-type`が適格であること。 @@ -84,7 +83,7 @@ return std::move(state.result); ## カスタマイゼーションポイント -入力[Sender](../execution/sender.md)`sndr`に[関連付けられた実行ドメイン](../execution/get-domain-early.md)`dom`に対して、 +入力[Sender](../execution/sender.md)`sndr`の[完了ドメイン](../execution/get_completion_domain.md)`dom`に対して、 [`execution::apply_sender`](../execution/apply_sender.md)経由で`dom.apply_sender(sync_wait, sndr)`が呼ばれる。 [デフォルト実行ドメイン](../execution/default_domain.md)では、`sync_wait.apply_sender(sndr)`が呼ばれる。 @@ -145,3 +144,4 @@ result=(100, X) ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html) diff --git a/reference/execution/this_thread/sync_wait_with_variant.md b/reference/execution/this_thread/sync_wait_with_variant.md index d67ec43217..f29bc409a3 100644 --- a/reference/execution/this_thread/sync_wait_with_variant.md +++ b/reference/execution/this_thread/sync_wait_with_variant.md @@ -25,13 +25,12 @@ namespace std::this_thread { ## 効果 説明用の`sndr`を`decltype(`[`into_variant`](../execution/into_variant.md)`(sndr))`が`Sndr`型となる式とする。 -呼び出し式`this_thread::sync_wait_with_variant(sndr)`は`sndr`が1回だけ評価されることを除いて、下記と等価。 +型`Domain`を[`get_completion_domain`](../execution/get_completion_domain.md)`<`[`set_value_t`](../execution/set_value.md)`>(`[`get_env`](../execution/get_env.md)`(sndr),` [`sync-wait-env{}`](sync-wait-env.md)`)`として、呼び出し式`this_thread::sync_wait_with_variant(sndr)`は下記と等価。 ```cpp -apply_sender(get-domain-early(sndr), sync_wait_with_variant, sndr) +apply_sender(Domain(), sync_wait_with_variant, sndr) ``` * apply_sender[link ../execution/apply_sender.md] -* get-domain-early[link ../execution/get-domain-early.md] - [`sender_in`](../execution/sender_in.md)` == true`であること。 - 型`sync-wait-with-variant-result-type`が適格であること。 @@ -74,7 +73,7 @@ return result_type(nullopt); ## カスタマイゼーションポイント -入力[Sender](../execution/sender.md)`sndr`に[関連付けられた実行ドメイン](../execution/get-domain-early.md)`dom`に対して、 +入力[Sender](../execution/sender.md)`sndr`の[完了ドメイン](../execution/get_completion_domain.md)`dom`に対して、 [`execution::apply_sender`](../execution/apply_sender.md)経由で`dom.apply_sender(sync_wait_with_variant, sndr)`が呼ばれる。 [デフォルト実行ドメイン](../execution/default_domain.md)では、`sync_wait_with_variant.apply_sender(sndr)`が呼ばれる。 @@ -136,3 +135,4 @@ result=(100, 'X') ## 参照 - [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html) - [P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3557r3.html) +- [P3826R5 Fix Sender Algorithm Customization](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html)