19#ifndef NANOVDB_INVOKE_H_HAS_BEEN_INCLUDED
20#define NANOVDB_INVOKE_H_HAS_BEEN_INCLUDED
25#include <tbb/parallel_invoke.h>
35#ifndef NANOVDB_USE_TBB
37template<
typename Func>
38void parallel_invoke(std::vector<std::thread> &threadPool,
const Func &taskFunc) {
39 threadPool.emplace_back(taskFunc);
43template<
typename Func,
typename... Rest>
44void parallel_invoke(std::vector<std::thread> &threadPool,
const Func &taskFunc1, Rest... taskFuncN) {
45 threadPool.emplace_back(taskFunc1);
46 parallel_invoke(threadPool, taskFuncN...);
50template<
typename Func>
51void serial_invoke(
const Func &taskFunc) {taskFunc();}
54template<
typename Func,
typename... Rest>
55void serial_invoke(
const Func &taskFunc1, Rest... taskFuncN) {
57 serial_invoke(taskFuncN...);
63template<
typename Func,
typename... Rest>
64int invoke(
const Func &taskFunc1, Rest... taskFuncN) {
66 tbb::parallel_invoke(taskFunc1, taskFuncN...);
69 const auto threadCount = std::thread::hardware_concurrency()>>1;
70 if (1 +
sizeof...(Rest) <= threadCount) {
71 std::vector<std::thread> threadPool;
72 threadPool.emplace_back(taskFunc1);
73 parallel_invoke(threadPool, taskFuncN...);
74 for (
auto &t : threadPool) t.join();
78 serial_invoke(taskFuncN...);
Implements a light-weight self-contained VDB data-structure in a single file! In other words,...
int invoke(const Func &taskFunc1, Rest... taskFuncN)
Definition Invoke.h:64