in benchmarks/pipeline_benchmark.cpp [175:202]
void runTBB(std::vector<std::unique_ptr<uint8_t[]>>& results) {
results.resize(kNumImages);
size_t counter = 0;
tbb::parallel_pipeline(
/*max_number_of_live_token=*/std::thread::hardware_concurrency(),
tbb::make_filter<void, Work*>(
tbb::filter::serial,
[&counter](tbb::flow_control& fc) -> Work* {
if (counter < kNumImages) {
return new Work(fillImage(Work(counter++)));
}
fc.stop();
return nullptr;
}) &
tbb::make_filter<Work*, Work*>(
tbb::filter::serial,
[](Work* workIn) {
Work& work = *workIn;
work = computeGeometricMean(std::move(work));
return workIn;
}) &
tbb::make_filter<Work*, void>(tbb::filter::serial, [&results](Work* workIn) {
size_t index = workIn->index;
results[index] = tonemap(std::move(*workIn));
delete workIn;
}));
}