namespace std::execution {
struct bulk_t { unspecified };
inline constexpr bulk_t bulk{};
}
概要
bulk
は、インデクス空間の各インデクスに対してタスクを反復実行するSenderアダプタである。
bulk
はパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。
効果
説明用の式sndr
, shape
, f
に対して、型Shape
をdecltype(auto(shape))
とする。下記いずれかの条件をみたすとき、呼び出し式bulk(sndr, shape, f)
は不適格となる。
decltype((sndr))
がsender
を満たさない、もしくはShape
がintegral
を満たさない、もしくはdecltype((f))
がmovable-value
を満たさないとき。
そうでなければ、呼び出し式bulk(sndr, shape, f)
はsndr
が1回だけ評価されることを除いて、下記と等価。
transform_sender(get-domain-early(sndr), make-sender(bulk, product-type{shape, f}, sndr))
Senderアルゴリズムタグ bulk
Senderアルゴリズム動作説明用のクラステンプレートimpls-for
に対して、下記の特殊化が定義される。
namespace std::execution {
template<>
struct impls-for<bulk_t> : default-impls {
static constexpr auto complete = see below;
};
}
impls-for<bulk_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(sndr, shape, f)
の戻り値Senderとし、式rcvr
を式connect(out_sndr, rcvr)
が適格となるReceiverとする。式connect(out_sndr, rcvr)
は開始(start)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
- 値完了操作において、パック
args
を入力Senderの値完了結果データを参照する左辺値式としたとき、型Shape
の半開区間[0, Shape)
における全てのi
に対してf(i, args...)
を呼び出すこと。 sndr
により送信された全ての完了操作を伝搬すること。
備考
非同期実行フレームワークで定義されるデフォルト実行ドメインでは、bulk
に指定したタスクf
は単一スレッド上で逐次実行される。
例
#include <print>
#include <execution>
namespace ex = std::execution;
int main()
{
ex::sender auto sndr =
ex::just()
| ex::bulk(3, [](int i) {
std::println("{}", i);
});
std::this_thread::sync_wait(sndr);
}
出力例
0
1
2
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??