namespace std::execution {
struct bulk_unchunked_t { unspecified };
inline constexpr bulk_unchunked_t bulk_unchunked{};
}
概要
bulk_unchunkedは、インデクス空間の各インデクスに対してタスクを一括実行するSenderアダプタである。
bulk_unchunkedはパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。
実行制御ライブラリのデフォルト動作では、下記のように振る舞う。
- 並列Scheduler上では、各インデクスに対する処理は個別の実行エージェント上で並列実行される。
- 明示的にカスタマイズされていなければ、各インデクスに対する処理は逐次実行される。
効果
説明用の式sndr, policy, shape, fに対して、型Policyをremove_cvref_t<decltype(policy)>、型Shapeをdecltype(auto(shape))、型Funcをdecay_t<decltype((f))>とする。下記いずれかの条件をみたすとき、呼び出し式bulk_unchunked(sndr, policy, shape, f)は不適格となる。
decltype((sndr))がsenderを満たさない、もしくはis_execution_policy_v<Policy> == false、もしくはShapeがintegralを満たさない、もしくはFuncがcopy_constructibleのモデルでないとき。
そうでなければ、呼び出し式bulk_unchunked(sndr, policy, shape, f)はsndrが1回だけ評価されることを除いて、下記と等価。
transform_sender(
get-domain-early(sndr),
make-sender(bulk_unchunked, product-type<see below, Shape, Func>{policy, shape, f}, sndr))
product-typeの第1テンプレート引数は、Policyがcopy_constructibleのモデルであるときPolicyとなる。そうでなければ、const Policy&となる。
Senderアルゴリズムタグ bulk_unchunked
Senderアルゴリズム動作説明用のクラステンプレートimpls-forに対して、下記の特殊化が定義される。
namespace std::execution {
template<>
struct impls-for<bulk_unchunked_t> : default-impls {
static constexpr auto complete = see below;
};
}
impls-for<bulk_unchunked_t>::completeメンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
[]<class Index, class State, class Rcvr, class Tag, class... Args>
(Index, State& state, Rcvr& rcvr, Tag, Args&&... args) noexcept
-> void requires see below {
if constexpr (same_as<Tag, set_value_t>) {
auto& [shape, f] = state;
constexpr bool nothrow = noexcept(f(auto(shape), args...));
TRY-EVAL(rcvr, [&]() noexcept(nothrow) {
for (decltype(auto(shape)) i = 0; i < shape; ++i) {
f(auto(i), args...);
}
Tag()(std::move(rcvr), std::forward<Args>(args)...);
}());
} else {
Tag()(std::move(rcvr), std::forward<Args>(args)...);
}
}
型Tagがset_value_t以外の型であるとき、もしくは式f(auto(shape), args...)が適格なときに限って、上記ラムダ式のrequires節が満たされる。
カスタマイゼーションポイント
Senderアルゴリズム構築時およびReceiver接続時に、関連付けられた実行ドメインに対してexecution::transform_sender経由でSender変換が行われる。
デフォルト実行ドメインでは無変換。
説明用の式out_sndrをbulk_unchunked(sndr, policy, shape, f)の戻り値Senderとし、式rcvrを式connect(out_sndr, rcvr)が適格となるReceiverとする。式connect(out_sndr, rcvr)は開始(start)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
- 説明用の
argsをsndrの値完了結果を参照する左辺値式のパック、またはcopy_constructibleのモデルであるならばそれらの値のdecayコピーのパックとする。sndrが値完了したとき、out_sndrもまた値完了するとき、0からshapeまでの型Shapeの全てのiに対してf(i, args...)を呼び出す。- Scheduler実装者は、各イテレーションを独立した実行エージェント上で実行することが推奨される。
out_sndrがset_error(rcvr, eptr)で完了するとき、エラー完了ハンドラが呼び出される前に非同期操作はf呼び出しのサブセットを呼び出す可能性があり、eptrは下記いずれかを指すexception_ptrとなる。f呼び出しから送出された例外、または- 処理系が要求リソースの確保に失敗したときは
bad_alloc例外、または runtime_errorから派生された例外。
out_sndrがset_stopped(rcvr)で完了するとき、停止完了ハンドラが呼び出される前に非同期操作はf呼び出しのサブセットを呼び出す可能性がある。
sndrがset_valueで完了しないとき、その完了操作はrecvに転送される。- パラメータ
policyは、アルゴリズムに対応した非同期操作の実行を並列化する方法、およびfに適用する方法を規程する。並列アルゴリズム要素アクセス関数に対する権限と要件はfに適用される。
例
#include <print>
#include <execution>
namespace ex = std::execution;
int main()
{
ex::sender auto sndr =
ex::just()
| ex::bulk_unchunked(3, ex::seq, [](int i) {
std::println("{}", i);
});
std::this_thread::sync_wait(sndr);
}
出力
0
1
2
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??