17 #ifndef __TBB_parallel_invoke_H
18 #define __TBB_parallel_invoke_H
20 #define __TBB_parallel_invoke_H_include_area
26 #if __TBB_VARIADIC_PARALLEL_INVOKE
32 #if !__TBB_TASK_GROUP_CONTEXT
34 struct task_group_context {
42 template<
typename function>
56 template <
size_t N,
typename function1,
typename function2,
typename function3>
68 __TBB_ASSERT(N==2 || N==3,
"Number of arguments passed to spawner is wrong");
104 #if __TBB_VARIADIC_PARALLEL_INVOKE
108 template <
typename function>
111 internal::function_invoker<function>* invoker =
new (
allocate_child()) internal::function_invoker<function>(std::forward<function>(_func));
116 template<
typename function>
123 template <
typename function1,
typename function2,
typename...
function>
124 void add_children(function1&& _func1, function2&& _func2,
function&&... _func)
127 parallel_invoke_noop noop;
128 typedef internal::spawner<2, function1, function2, parallel_invoke_noop> spawner_type;
129 spawner_type & sub_root = *
new(
allocate_child()) spawner_type(std::forward<function1>(_func1), std::forward<function2>(_func2), noop);
135 template <
typename function>
145 template <
typename function1,
typename function2>
154 template <
typename function1,
typename function2,
typename function3>
155 void add_children (
const function1& _func1,
const function2& _func2,
const function3& _func3)
160 #endif // __TBB_VARIADIC_PARALLEL_INVOKE
163 template <
typename F0>
174 #if __TBB_TASK_GROUP_CONTEXT
189 #if __TBB_VARIADIC_PARALLEL_INVOKE
191 template<
typename... T>
struct impl_selector;
193 template<
typename T1,
typename... T>
struct impl_selector<T1, T...> {
194 typedef typename impl_selector<T...>
::type type;
197 template<
typename T>
struct impl_selector<T> {
200 template<>
struct impl_selector<task_group_context&> {
205 inline task_group_context& get_context( task_group_context& tgc ) {
return tgc; }
207 template<
typename T1,
typename... T>
208 task_group_context& get_context( T1&& , T&&... t )
209 {
return get_context( std::forward<T>(t)... ); }
212 template<
typename F0,
typename F1,
typename... F>
213 void parallel_invoke_impl(
true_type, F0&& f0, F1&& f1, F&&... f) {
216 const size_t number_of_children = 2 +
sizeof...(F)/2;
217 parallel_invoke_cleaner cleaner(number_of_children, get_context(std::forward<F>(f)...));
218 parallel_invoke_helper& root = cleaner.root;
220 root.add_children(std::forward<F>(f)...);
221 root.add_children(std::forward<F1>(f1));
222 root.run_and_finish(std::forward<F0>(f0));
226 template<
typename F0,
typename F1,
typename... F>
227 void parallel_invoke_impl(
false_type, F0&& f0, F1&& f1, F&&... f) {
230 parallel_invoke_impl(
true_type(), std::forward<F0>(f0), std::forward<F1>(f1), std::forward<F>(f)..., context);
242 #if __TBB_VARIADIC_PARALLEL_INVOKE
246 template<
typename F0,
typename F1,
typename... F>
249 internal::parallel_invoke_impl(selector_type(), std::forward<F0>(f0), std::forward<F1>(f1), std::forward<F>(f)...);
256 template<
typename F0,
typename F1 >
267 template<
typename F0,
typename F1,
typename F2 >
279 template<
typename F0,
typename F1,
typename F2,
typename F3>
294 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4 >
295 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
308 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
typename F5>
309 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
const F5& f5,
322 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
typename F5,
typename F6>
323 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
324 const F5& f5,
const F6& f6,
337 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
338 typename F5,
typename F6,
typename F7>
339 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
340 const F5& f5,
const F6& f6,
const F7& f7,
354 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
355 typename F5,
typename F6,
typename F7,
typename F8>
356 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
357 const F5& f5,
const F6& f6,
const F7& f7,
const F8& f8,
371 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
372 typename F5,
typename F6,
typename F7,
typename F8,
typename F9>
373 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
374 const F5& f5,
const F6& f6,
const F7& f7,
const F8& f8,
const F9& f9,
388 template<
typename F0,
typename F1>
391 parallel_invoke<F0, F1>(f0, f1, context);
394 template<
typename F0,
typename F1,
typename F2>
397 parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
400 template<
typename F0,
typename F1,
typename F2,
typename F3 >
403 parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
406 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4>
407 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4) {
409 parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
412 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
typename F5>
413 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
const F5& f5) {
415 parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
418 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
typename F5,
typename F6>
419 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
420 const F5& f5,
const F6& f6)
423 parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
426 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
427 typename F5,
typename F6,
typename F7>
428 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
429 const F5& f5,
const F6& f6,
const F7& f7)
432 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
435 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
436 typename F5,
typename F6,
typename F7,
typename F8>
437 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
438 const F5& f5,
const F6& f6,
const F7& f7,
const F8& f8)
441 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
444 template<
typename F0,
typename F1,
typename F2,
typename F3,
typename F4,
445 typename F5,
typename F6,
typename F7,
typename F8,
typename F9>
446 void parallel_invoke(
const F0& f0,
const F1& f1,
const F2& f2,
const F3& f3,
const F4& f4,
447 const F5& f5,
const F6& f6,
const F7& f7,
const F8& f8,
const F9& f9)
450 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
452 #endif // __TBB_VARIADIC_PARALLEL_INVOKE
458 #undef __TBB_parallel_invoke_H_include_area