@@ -13,40 +13,64 @@ namespace std::execution {
1313* unspecified[italic]
1414
1515## 概要
16- `affine_on`は、指定 [Scheduler](scheduler.md)上で完了させるSenderアダプタである。
16+ `affine_on`は、[Receiver](receiver.md)の [Scheduler](scheduler.md)上で完了させるSenderアダプタである。
1717アダプト対象Senderが正しいScheduler上で完了すると判断できるとき、アルゴリズムはスケジューリング操作を回避できる。
1818
1919`affine_on`は[パイプ可能Senderアダプタオブジェクト](sender_adaptor_closure.md)であり、パイプライン記法をサポートする。
2020
2121
2222## 効果
23- 説明用の式`sch`と` sndr`に対して、`decltype((sch))`が[`scheduler`](scheduler.md)を満たさない、もしくは`decltype(( sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`affine_on(sndr, sch )`は不適格となる。
23+ 説明用の式`sndr`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさないとき、呼び出し式`affine_on(sndr)`は不適格となる。
2424
25- そうでなければ、呼び出し式`affine_on(sndr, sch )`は下記と等価。
25+ そうでなければ、呼び出し式`affine_on(sndr)`は下記と等価。
2626
2727```cpp
28- make-sender(affine_on, sch , sndr)
28+ make-sender(affine_on, env<>() , sndr)
2929```
3030* make-sender[ link make-sender.md]
31+ * env<>[ link env.md]
32+
33+
34+ ### Senderアルゴリズムタグ ` affine_on `
35+ 型が[ ` scheduler ` ] ( scheduler.md ) のモデルである部分式` sch ` に対して、説明用の式` UNSTOPPABLE-SCHEDULER(sch) ` を、その型が[ ` scheduler ` ] ( scheduler.md ) のモデルである式` e ` とする。
36+
37+ - 式[ ` schedule ` ] ( schedule.md ) ` (e) ` は[ ` unstoppable ` ] ( unstoppable.md ) ` ( ` [ ` schedule ` ] ( schedule.md ) ` (sch)) ` と等価な式。
38+ - 任意の[ クエリオブジェクト] ( ../queryable.md ) ` q ` と部分式のパック` args... ` に対して、式` e.query(q, args...) ` は` sch.query(q, args...) ` と等価な式。
39+ - 式` e == UNSTOPPABLE-SCHEDULER(other) ` は` sch == other ` と等価な式。
40+
41+ 説明用の式` sndr ` と` ev ` に対して、[ ` sender-for ` ] ( sender-for.md ) ` <decltype((sndr)), affine_on_t> == false ` のとき、式` affine_on.transform_sender(sndr, ev) ` は不適格となる。
42+
43+ そうでなければ、式` affine_on.transform_sender(sndr, ev) ` は下記と等価。
44+
45+ ``` cpp
46+ auto & [_, _, child] = sndr;
47+ if constexpr (requires { std::forward_like<Sndr >(child).affine_on(); }) {
48+ return std::forward_like<Sndr >(child).affine_on();
49+ } else {
50+ return continues_on(std::forward_like<Sndr >(child),
51+ UNSTOPPABLE-SCHEDULER(get_start_scheduler(ev)));
52+ }
53+ ```
54+ * continues_on[ link continues_on.md]
55+ * get_start_scheduler[ link get_start_scheduler.md]
3156
3257
3358## カスタマイゼーションポイント
3459[ Receiver](receiver.md)接続時に、関連付けられた実行ドメインに対して[`execution::transform_sender`](transform_sender.md)経由でSender変換が行われる。
3560[デフォルト実行ドメイン](default_domain.md)では無変換。
3661
37- 説明用の式`out_sndr`を`affine_on(sndr, sch )`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype ((out_sndr))`とする。式`out_rcvr`を[`sender_in`](sender_in. md)`<OutSndr, Env> == true `となる[環境](../queryable .md)`Env`に関連付けられた[Receiver](receiver .md)とする 。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、
62+ 説明用の式`out_sndr`を`affine_on(sndr)`の戻り値[Sender](sender.md)とし、型`OutSndr`を`decltype ((out_sndr))`とする。式`out_rcvr`を[環境](../queryable. md)`Env`に関連付けられた[Receiver](receiver.md)とする。[`get_start_scheduler`](get_start_scheduler.md)`(`[`get_env`](get_env .md)`(out_rcvr))`が不適格もしくは[`infallible-scheduler](infallible-scheduler.md)`< Env>`を満たさないとき、式[`get_completion_signatures`](get_completion_signatures .md)`<OutSndr, Env>()`の評価は例外で終了する 。`out_sndr`と`out_rcvr`との[接続(connect)](connect.md)結果[Operation State](operation_state.md)への左辺値参照を`op`としたとき、
3863
3964- 呼び出し[`start`](start.md)`(op)`は、現在の実行エージェント上で入力[Sender](sender.md)`sndr`を開始し、[Scheduler](scheduler.md)`sch`に関連付けられた実行リソースに属する実行エージェント上で`out_rcvr`の完了操作が実行される。
4065- 現在の実行リソースが`sch`に関連付けられた実行リソースと同一のとき、[`start`](start.md)`(op)`の完了よりも前に`out_rcvr`の完了操作が呼ばれる可能性がある。
41- - `sch`上でのスケジューリングが失敗した場合、未規定の実行エージェント上で`out_rcvr`の[エラー完了](set_error.md)が行われるべき。
4266
4367
4468## 備考
45- `affine_on`アルゴリズムの動作は[`continues_on`](continues_on.md)と等価だが、処理系は不要なスケジューリング操作を省略(最適化)する可能性がある。
46-
4769`affine_on`は[タスクコルーチン](task.md)のScheduler Affinity実現に用いられる。
4870詳細仕様は[`task::promise::await_transform`](task/promise_type/await_transform.md)を参照のこと。
4971
72+ 開始された[Scheduler](scheduler.md)上で再開(resume)されると分かっている[Sender](sender.md)に対して、処理系(標準ライブラリ実装)は`affine_on`メンバ関数を提供すべきである。そのようなSenderの例として、[`just`](just.md), [`just_error`](just_error.md), [`just_stopped`](just_stopped.md), [`read_env`](read_env.md), [`write_env`](write_env.md)等がある。
73+
5074
5175## バージョン
5276### 言語
@@ -66,3 +90,4 @@ make-sender(affine_on, sch, sndr)
6690## 参照
6791- [P3552R3 Add a Coroutine Task Type](https:// www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3552r3.html)
6892- [P3826R5 Fix Sender Algorithm Customization](https:// www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3826r5.html)
93+ - [P3941R4 Scheduler Affinity](https:// www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3941r4.html)
0 commit comments