namespace std::execution {
template<class Sndr, class Rcvr>
requires valid-specialization<state-type, Sndr, Rcvr> &&
valid-specialization<connect-all-result, Sndr, Rcvr>
struct basic-operation : basic-state<Sndr, Rcvr> { // exposition only
using operation_state_concept = operation_state_t;
using tag-t = tag_of_t<Sndr>; // exposition only
connect-all-result<Sndr, Rcvr> inner-ops; // exposition only
basic-operation(Sndr&& sndr, Rcvr&& rcvr) noexcept(see below) // exposition only
: basic-state<Sndr, Rcvr>(std::forward<Sndr>(sndr), std::move(rcvr)),
inner-ops(connect-all(this, std::forward<Sndr>(sndr), indices-for<Sndr>()))
{}
void start() & noexcept {
auto& [...ops] = inner-ops;
impls-for<tag-t>::start(this->state, this->rcvr, ops...);
}
};
template<class Sndr, class Rcvr>
struct basic-state { // exposition only
basic-state(Sndr&& sndr, Rcvr&& rcvr) noexcept(see below)
: rcvr(std::move(rcvr))
, state(impls-for<tag_of_t<Sndr>>::get-state(std::forward<Sndr>(sndr), rcvr)) { }
Rcvr rcvr; // exposition only
state-type<Sndr, Rcvr> state; // exposition only
};
}
概要
basic-operation
およびbasic-state
は、Senderアルゴリズム動作仕様定義で用いられる説明専用のクラステンプレートである。
basic-operation<Sndr, Rcvr>
はoperation_state
のモデルであり、SenderアルゴリズムとReceiverの接続(connect)結果型として利用される。
rcvr
: 接続先Receiverオブジェクトを保持。Senderアルゴリズム同士を連結する場合は、親Senderアルゴリズム側のReceiverが該当する。state
: Senderアルゴリズム構築時の引数リストを保持。(impls-for
でカスタマイズ可能)inner-ops
: 子SenderリストとSenderアルゴリズムとの接続結果Operation Stateリストを保持。Senderファクトリでは0個、Senderアダプタでは通常1個の子Senderと接続される。
クラス仕様
basic-operation
コンストラクタnoexcept
節の式は下記の通り。
is_nothrow_constructible_v<basic-state<Self, Rcvr>, Self, Rcvr> &&
noexcept(connect-all(this, std::forward<Sndr>(sndr), indices-for<Sndr>()))
basic-state
コンストラクタnoexcept
節の式は下記の通り。
is_nothrow_move_constructible_v<Rcvr> &&
nothrow-callable<decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&> &&
(same_as<state-type<Sndr, Rcvr>, get-state-result> ||
is_nothrow_constructible_v<state-type<Sndr, Rcvr>, get-state-result>)
ここで、説明用の型get-state-result
は下記の通り定義される。
call-result-t<decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&>.
説明専用エンティティ
template<template<class...> class T, class... Args>
concept valid-specialization = // exposition only
requires { typename T<Args...>; };
template<class Sndr, class Rcvr> // exposition only
using state-type = decay_t<call-result-t<
decltype(impls-for<tag_of_t<Sndr>>::get-state), Sndr, Rcvr&>>;
constexpr auto connect-all = see below; // exposition only
template<class Sndr, class Rcvr>
using connect-all-result = call-result-t< // exposition only
decltype(connect-all), basic-state<Sndr, Rcvr>*, Sndr, indices-for<Sndr>>;
template<class Sndr>
using indices-for = remove_reference_t<Sndr>::indices-for; // exposition only
説明専用の定数connect-all
は、下記ラムダ式と等価な関数呼び出し可能なオブジェクトとして初期化される。
- 全ての子Sender
child
とSenderアルゴリズムsndr
のReceiverを接続(connect)し、結果のOperation Stateリストをproduct-type
型にまとめて返す。
[]<class Sndr, class Rcvr, size_t... Is>(
basic-state<Sndr, Rcvr>* op, Sndr&& sndr, index_sequence<Is...>) noexcept(see below)
-> decltype(auto) {
auto& [_, data, ...child] = sndr;
return product-type{connect(
std::forward_like<Sndr>(child),
basic-receiver<Sndr, Rcvr, integral_constant<size_t, Is>>{op})...};
}
- テンプレートパラメータ制約 : ラムダ式中の
return
文の式が適格であること。 - ラムダ式中の
return
文の式が例外送出する可能性がある場合は、noexcept(false)
となる。そうでなければ、noexcept(true)
となる。
バージョン
言語
- C++26