see below schedule();
概要
保持中SchedulerのスケジュールSenderを返す。
戻り値
その型がsenderのモデルであり、下記を満たす右辺値ts-sndr。
get_completion_scheduler<set_value_t>(get_env(ts-sndr))が*thisと等しい。get_completion_domain<set_value_t>(get_env(ts-sndr))がts-domain()と等価な式である。- Receiver
rcvrがts-sndrに接続され、結果のOpearation Stateが開始されるとき、次の値でsch_->schedule(r, s)を呼び出す。rは基底クラスparallel_scheduler_replacement::receiver_proxyを持つrcvrのプロキシであり、かつsはrに対する事前確保バックエンドストレージである。
- 任意の型
Eに対して、unstoppable_token<stop_token_of_t<E>>がtrueのとき、completion_signatures_of_t<decltype(ts-sndr)>, E>はcompletion_signatures<set_value_t()>を表す。そうでなければ、completion_signatures<set_value_t(), set_stopped_t()>を表す。
説明専用エンティティ
式WARP-RCVR
receiver_proxyから派生した型の左辺値rに対して、WARP-RCVR(r)をreceiverのモデルであり、その完了ハンドラがrの対応する完了ハンドラを呼び出すような型のオブジェクトとする。
クラステンプレートbackend-for
namespace std::execution {
template<scheduler Sch>
class task_scheduler::backend-for
: public parallel_scheduler_replacement::parallel_scheduler_backend { // exposition only
public:
explicit backend-for(Sch sch) : sched_(std::move(sch)) {}
void schedule(receiver_proxy& r, span<byte> s) noexcept override;
void schedule_bulk_chunked(size_t shape, bulk_item_receiver_proxy& r,
span<byte> s) noexcept override;
void schedule_bulk_unchunked(size_t shape, bulk_item_receiver_proxy& r,
span<byte> s) noexcept override;
private:
Sch sched_;
};
}
envを部分式のパックとしたとき、値完了シグネチャset_value_t()のみを持ち式get_completion_scheduler<set_value_t>(get_env(just-sndr-like), env...)がget_completion_scheduler<set_value_t>(sched_, env...)と等価な式であるようなSenderをjust-sndr-likeとする。
void schedule(receiver_proxy& r, span<byte> s) noexcept override;
- 効果 :
connect(schedule(sched_), WRAP-RCVR(r))でOperation Stateosを構築し、start(os)を呼び出す。
void schedule_bulk_chunked(size_t shape, bulk_item_receiver_proxy& r,
span<byte> s) noexcept override;
-
効果 : 説明用の
chunk_sizeをshape以下の整数、chunk_numを(shape + chunk_size - 1) / chunk_size、mを(i + 1) * chunk_sizeとshapeのうち小さい方として、整数iに対してfn(i)がr.execute(i * chunk_sie, m)を呼び出す関数オブジェクトfnとする。下記の式によってOperation Stateosを構築し、start(os)を呼び出す。
void schedule_bulk_unchunked(size_t shape, bulk_item_receiver_proxy& r,
span<byte> s) noexcept override;
-
効果 : 整数
iに対してfn(i)がr.execute(i, i + 1)を呼び出す関数オブジェクトfnとする。下記の式によってOperation Stateosを構築し、start(os)を呼び出す。
クラスts-domain
namespace std::execution {
class task_scheduler::ts-domain : public default_domain { // exposition only
public:
template<class BulkSndr, class Env> // exposition only
static constexpr auto transform_sender(set_value_t, BulkSndr&& bulk_sndr, const Env& env)
noexcept(see below);
};
}
template<class BulkSndr, class Env>
static constexpr auto transform_sender(BulkSndr&& bulk_sndr, const Env& env)
noexcept(is_nothrow_constructible_v<decay_t<BulkSndr>, BulkSndr>);
- テンプレートパラメータ制約 :
sender_in<BulkSndr, Env>がtrue- 式
auto(std::forward<BulkSndr>(bulk_sndr))が適格 - 下記のいずれかが
truesender-for<BulkSndr, bulk_chunked_t>sender-for<BulkSndr, bulk_unchunked_t>
-
効果 : 下記と等価
auto& [_, data, child] = bulk_sndr; auto& [_, shape, fn] = data; auto sch = call-with-default(get_completion_scheduler<set_value_t>, not-a-scheduler(), get_env(child), FWD-ENV(env)); return e;ここで、
schの型がtask_schedulerではないとき、eはnot-a-sender()とする。そうでなければ、Receiverrvcrと接続(connect)され結果のOperation Stateが開始(start)されたとき、childが未規定のReceiverRと接続されて開始するsenderのモデルである型の右辺値とする。childがエラー完了もしくは停止完了するとき、完了操作は変更されずにrcvrに転送される。そうでなければ、値完了結果からdecayコピーされたオブジェクトを指す左辺値式のパックargsとして、bulk_sndrがbulk_chunked(child, policy, shape, fn)と等価な式またはそのコピーの評価の結果であるとき、rを呼び出し可能オブジェクトfnと引数argsを持つrcvrに対するbulk chunkedプロキシ、sをrの事前確保バックエンドストレージとして、sch_->schedule_bulk_chunked(shape, r, s)が呼び出される。- そうでなければ、
rを呼び出し可能オブジェクトfnと引数argsを持つrcvrに対するbulk unchunkedプロキシ、sをrの事前確保バックエンドストレージとして、sch_->schedule_bulk_unchunked(shape, r, s)が呼び出される。
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??