19#ifndef NANOVDB_UTIL_INVOKE_H_HAS_BEEN_INCLUDED 
   20#define NANOVDB_UTIL_INVOKE_H_HAS_BEEN_INCLUDED 
   25#include <tbb/parallel_invoke.h> 
   37#ifndef NANOVDB_USE_TBB 
   39template<
typename Func>
 
   40void parallel_invoke(std::vector<std::thread> &threadPool, 
const Func &taskFunc) {
 
   41    threadPool.emplace_back(taskFunc);
 
   45template<
typename Func, 
typename... Rest>
 
   46void parallel_invoke(std::vector<std::thread> &threadPool, 
const Func &taskFunc1, Rest... taskFuncN) {
 
   47    threadPool.emplace_back(taskFunc1);
 
   48    parallel_invoke(threadPool, taskFuncN...);
 
   52template<
typename Func>
 
   53void serial_invoke(
const Func &taskFunc) {taskFunc();}
 
   56template<
typename Func, 
typename... Rest>
 
   57void serial_invoke(
const Func &taskFunc1, Rest... taskFuncN) {
 
   59    serial_invoke(taskFuncN...);
 
   65template<
typename Func, 
typename... Rest>
 
   66int invoke(
const Func &taskFunc1, Rest... taskFuncN) {
 
   68    tbb::parallel_invoke(taskFunc1, taskFuncN...);
 
   71    const auto threadCount = std::thread::hardware_concurrency()>>1;
 
   72    if (1 + 
sizeof...(Rest) <= threadCount) {
 
   73        std::vector<std::thread> threadPool;
 
   74        threadPool.emplace_back(taskFunc1);
 
   75        parallel_invoke(threadPool, taskFuncN...);
 
   76        for (
auto &t : threadPool) t.join();
 
   80        serial_invoke(taskFuncN...);
 
 
   89template<
typename Func, 
typename... Rest>
 
   90[[deprecated(
"Use nanovdb::util::invoke instead")]]
 
   91int invoke(
const Func &taskFunc1, Rest... taskFuncN) {
 
   92    return util::invoke<Func, Rest...>(taskFunc1, 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:66
Definition GridHandle.h:27
int invoke(const Func &taskFunc1, Rest... taskFuncN)
Definition Invoke.h:91