00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __TBB_parallel_for_each_H
00022 #define __TBB_parallel_for_each_H
00023
00024 #include "parallel_do.h"
00025
00026 namespace tbb {
00027
00029 namespace internal {
00030
00031 template <typename Function, typename Iterator>
00032 class parallel_for_each_body : internal::no_assign {
00033 Function &my_func;
00034 public:
00035 parallel_for_each_body(Function &_func) : my_func(_func) {}
00036 parallel_for_each_body(const parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
00037
00038 void operator() ( typename std::iterator_traits<Iterator>::value_type value ) const {
00039 my_func(value);
00040 }
00041 };
00042 }
00044
00048
00049
00050 template<typename InputIterator, typename Function>
00051 Function parallel_for_each(InputIterator first, InputIterator last, Function f, task_group_context &context) {
00052 internal::parallel_for_each_body<Function, InputIterator> body(f);
00053
00054 tbb::parallel_do (first, last, body, context);
00055 return f;
00056 }
00057
00059 template<typename InputIterator, typename Function>
00060 Function parallel_for_each(InputIterator first, InputIterator last, Function f) {
00061 internal::parallel_for_each_body<Function, InputIterator> body(f);
00062
00063 tbb::parallel_do (first, last, body);
00064 return f;
00065 }
00066
00068
00069 }
00070
00071 #endif