最終更新日時(UTC):
が更新

履歴 編集

customization point object
<execution>

std::execution::affine(C++26)

namespace std::execution {
  struct affine_t { unspecified };
  inline constexpr affine_t affine{};
}

概要

affineは、ReceiverScheduler上で完了させる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と等価な式。

説明用の式sndrevに対して、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_sndraffine(sndr)戻り値Senderとし、型OutSndrdecltype((out_sndr))とする。式out_rcvr環境Envに関連付けられたReceiverとする。get_start_scheduler(get_env(out_rcvr))不適格もしくはinfallible-scheduler<Env>を満たさないとき、式get_completion_signatures<OutSndr, Env>()の評価は例外で終了する。out_sndrout_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

処理系

関連項目

参照