namespace std::execution {
struct affine_t { unspecified };
inline constexpr affine_t affine{};
}
概要
affineは、ReceiverのScheduler上で完了させるSenderアダプタである。
アダプト対象Senderが正しいScheduler上で完了すると判断できるとき、アルゴリズムはスケジューリング操作を回避できる。
affineはパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。
効果
説明用の式sndrに対して、decltype((sndr))がsenderを満たさないとき、呼び出し式affine(sndr)は不適格となる。
そうでなければ、呼び出し式affine(sndr)は下記と等価。
make-sender(affine, env<>(), sndr)
Senderアルゴリズムタグ affine
型がschedulerのモデルである部分式schに対して、説明用の式UNSTOPPABLE-SCHEDULER(sch)を、その型がschedulerのモデルである式eとする。
- 式
schedule(e)はunstoppable(schedule(sch))と等価な式。 - 任意のクエリオブジェクト
qと部分式のパックargs...に対して、式e.query(q, args...)はsch.query(q, args...)と等価な式。 - 式
e == UNSTOPPABLE-SCHEDULER(other)はsch == otherと等価な式。
説明用の式sndrとevに対して、sender-for<decltype((sndr)), affine_t> == falseのとき、式affine.transform_sender(sndr, ev)は不適格となる。
そうでなければ、式affine.transform_sender(sndr, ev)は下記と等価。
auto& [_, _, child] = sndr;
if constexpr (requires { std::forward_like<Sndr>(child).affine(); }) {
return std::forward_like<Sndr>(child).affine();
} else {
return continues_on(std::forward_like<Sndr>(child),
UNSTOPPABLE-SCHEDULER(get_start_scheduler(ev)));
}
カスタマイゼーションポイント
Receiver接続時に、関連付けられた実行ドメインに対してexecution::transform_sender経由でSender変換が行われる。
デフォルト実行ドメインでは無変換。
説明用の式out_sndrをaffine(sndr)の戻り値Senderとし、型OutSndrをdecltype((out_sndr))とする。式out_rcvrを環境Envに関連付けられたReceiverとする。get_start_scheduler(get_env(out_rcvr))が不適格もしくはinfallible-scheduler<Env>を満たさないとき、式get_completion_signatures<OutSndr, Env>()の評価は例外で終了する。out_sndrとout_rcvrとの接続(connect)結果Operation Stateへの左辺値参照をopとしたとき、
- 呼び出し
start(op)は、現在の実行エージェント上で入力Sendersndrを開始し、Schedulerschに関連付けられた実行リソースに属する実行エージェント上でout_rcvrの完了操作が実行される。 - 現在の実行リソースが
schに関連付けられた実行リソースと同一のとき、start(op)の完了よりも前にout_rcvrの完了操作が呼ばれる可能性がある。
備考
affineはタスクコルーチンのScheduler Affinity実現に用いられる。
詳細仕様はtask::promise::await_transformを参照のこと。
開始されたScheduler上で再開(resume)されると分かっているSenderに対して、処理系(標準ライブラリ実装)はaffineメンバ関数を提供すべきである。そのようなSenderの例として、just, just_error, just_stopped, read_env, write_env等がある。
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??