17 #ifndef __TBB_parallel_do_H 18 #define __TBB_parallel_do_H 20 #define __TBB_parallel_do_H_include_area 30 namespace interface9 {
39 template<
typename Item>
44 virtual void internal_add_copy(
const Item& item ) = 0;
45 #if __TBB_CPP11_RVALUE_REF_PRESENT 46 virtual void internal_add_move( Item&& item ) = 0;
51 void add(
const Item& item ) {internal_add_copy(item);}
52 #if __TBB_CPP11_RVALUE_REF_PRESENT 64 template<
class Body,
typename Item>
68 template<
typename A1,
typename A2,
typename CvItem >
70 obj(tbb::internal::forward<A1>(arg1));
72 template<
typename A1,
typename A2,
typename CvItem >
74 obj(tbb::internal::forward<A1>(arg1), arg2);
76 template<
typename A1,
typename A2,
typename CvItem >
80 template<
typename A1,
typename A2,
typename CvItem >
85 template<
typename A1,
typename A2>
88 internal_call( obj, tbb::internal::forward<A1>(arg1), arg2, &Body::operator() );
95 template<
typename Body,
typename Item>
104 my_value(value), my_feeder(feeder)
107 #if __TBB_CPP11_RVALUE_REF_PRESENT 122 template<
typename Iterator,
typename Body,
typename Item>
131 my_iter(iter), my_feeder(feeder)
142 template<
typename Iterator_,
typename Body_,
typename Item_>
friend class do_task_iter;
148 template<
class Body,
typename Item>
151 #if __TBB_CPP11_RVALUE_REF_PRESENT 155 iteration_type& t = *
new (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *
this);
159 __TBB_ASSERT(
false,
"Overloading for r-value reference doesn't work or it's not movable and not copyable object");
163 #if __TBB_CPP11_IS_COPY_CONSTRUCTIBLE_PRESENT 172 iteration_type& t = *
new (task::allocate_additional_child_of(*my_barrier)) iteration_type(
std::move(item), *
this);
178 iteration_type& t = *
new (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *
this);
189 __TBB_ASSERT(my_barrier,
"root task allocation failed");
192 #if __TBB_TASK_GROUP_CONTEXT 196 __TBB_ASSERT(my_barrier,
"root task allocation failed");
202 my_barrier->destroy(*my_barrier);
211 template<
typename Iterator,
typename Body,
typename Item>
214 static const size_t max_arg_size = 4;
223 : my_feeder(feeder), my_first(first), my_size(size)
234 t =
new( allocate_child() ) iteration_type( my_first, my_feeder );
236 if( ++k==my_size )
break;
239 set_ref_count(
int(k+1));
241 spawn_and_wait_for_all(*t);
245 template<
typename Iterator_,
typename Body_,
typename _Item>
friend class do_task_iter;
248 template<
typename Body,
typename Item>
251 static const size_t max_arg_size = 4;
257 aligned_space<Item, max_arg_size>
my_arg;
260 : my_feeder(feeder), my_size(0)
265 #if __TBB_CPP11_RVALUE_REF_PRESENT 266 typedef std::move_iterator<Item*> Item_iterator;
268 typedef Item* Item_iterator;
276 t =
new( allocate_child() ) iteration_type( Item_iterator(my_arg.begin() + k), my_feeder );
277 if( ++k==my_size )
break;
280 set_ref_count(
int(k+1));
282 spawn_and_wait_for_all(*t);
287 for(
size_t k=0; k<my_size; ++k)
288 (my_arg.begin() + k)->~Item();
291 template<
typename Iterator_,
typename Body_,
typename Item_>
friend class do_task_iter;
297 template<
typename Iterator,
typename Body,
typename Item>
304 my_first(first), my_last(last), my_feeder(feeder)
324 typedef typename std::iterator_traits<Iterator>::iterator_category iterator_tag;
325 return run( (iterator_tag*)NULL );
330 inline task*
run(
void* ) {
return run_for_input_iterator(); }
335 block_type& t = *
new( allocate_additional_child_of(*my_feeder.
my_barrier) ) block_type(my_feeder);
337 while( !(my_first == my_last) ) {
339 new (t.my_arg.begin() + k) Item(*my_first);
341 if( ++k==block_type::max_arg_size ) {
342 if ( !(my_first == my_last) )
343 recycle_to_reexecute();
356 inline task*
run( std::forward_iterator_tag* ) {
return run_for_forward_iterator(); }
361 Iterator
first = my_first;
363 while( !(my_first==my_last) ) {
365 if( ++k==block_type::max_arg_size ) {
366 if ( !(my_first==my_last) )
367 recycle_to_reexecute();
371 return k==0 ? NULL :
new( allocate_additional_child_of(*my_feeder.
my_barrier) ) block_type(first, k, my_feeder);
374 inline task*
run( std::random_access_iterator_tag* ) {
return run_for_random_access_iterator(); }
380 size_t k =
static_cast<size_t>(my_last-my_first);
381 if( k > block_type::max_arg_size ) {
382 Iterator middle = my_first + k/2;
386 recycle_as_child_of(c);
397 t =
new( allocate_child() ) iteration_type(my_first, my_feeder);
402 set_ref_count(
int(k+1));
404 spawn_and_wait_for_all(*t);
413 template<
typename Iterator,
typename Body,
typename Item>
421 #if __TBB_TASK_GROUP_CONTEXT 428 root_iteration_task &t = *
new( feeder.
my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);
437 template<
typename Iterator,
typename Body,
typename Item>
445 #if __TBB_TASK_GROUP_CONTEXT 454 template<
typename Iterator,
typename Body,
typename Item,
typename _Item>
462 #if __TBB_TASK_GROUP_CONTEXT 496 template<
typename Iterator,
typename Body>
497 void parallel_do( Iterator first, Iterator last,
const Body& body )
501 #if __TBB_TASK_GROUP_CONTEXT 511 template<
typename Range,
typename Body>
516 template<
typename Range,
typename Body>
521 #if __TBB_TASK_GROUP_CONTEXT 524 template<
typename Iterator,
typename Body>
532 template<
typename Range,
typename Body>
537 template<
typename Range,
typename Body>
542 #endif // __TBB_TASK_GROUP_CONTEXT 551 #undef __TBB_parallel_do_H_include_area void internal_add_move(Item &&item) __TBB_override
void add(const Item &item)
Add a work item to a running parallel_do.
task * execute() __TBB_override
Should be overridden by derived classes.
void move(tbb_thread &t1, tbb_thread &t2)
bool_constant< true > true_type
do_iteration_task_iter(const Iterator &iter, feeder_type &feeder)
parallel_do_feeder< Item > Feeder
Base class for user-defined tasks.
void internal_add_copy_impl(std::false_type, const Item &)
task * run(std::random_access_iterator_tag *)
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &arg2, void(Body::*)(CvItem &, parallel_do_feeder< Item > &) const)
do_group_task_input(feeder_type &feeder)
void set_ref_count(int count)
Set reference count.
void internal_add_copy(const Item &item) __TBB_override
Class the user supplied algorithm body uses to add new tasks.
void run_parallel_do(Iterator first, Iterator last, const Body &body, task_group_context &context)
For internal use only.
parallel_do_feeder_impl< Body, Item > feeder_type
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
parallel_do_feeder_impl< Body, Item > feeder_type
#define __TBB_FORWARDING_REF(A)
task * run_for_forward_iterator()
task * run_for_input_iterator()
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &arg2, void(Body::*)(CvItem, parallel_do_feeder< Item > &) const)
~parallel_do_feeder_impl()
void select_parallel_do(Iterator first, Iterator last, const Body &body, void(Body::*)(Item) const, task_group_context &context)
For internal use only.
auto first(Container &c) -> decltype(begin(c))
void internal_add_copy_impl(std::true_type, const Item &item)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
parallel_do_feeder_impl< Body, Item > feeder_type
internal::allocate_child_proxy & allocate_child()
Returns proxy for overloaded new that allocates a child task of *this.
task * execute() __TBB_override
Should be overridden by derived classes.
auto last(Container &c) -> decltype(begin(c))
void parallel_do(Iterator first, Iterator last, const Body &body)
Parallel iteration over a range, with optional addition of more work.
task * execute() __TBB_override
Should be overridden by derived classes.
task that does nothing. Useful for synchronization.
parallel_do_feeder_impl(tbb::task_group_context &context)
Used to form groups of tasks.
do_iteration_task(const Item &value, feeder_type &feeder)
task * execute() __TBB_override
Should be overridden by derived classes.
bool_constant< false > false_type
Base class for types that should not be copied or assigned.
parallel_do_feeder_impl()
parallel_do_feeder_impl< Body, Item > feeder_type
parallel_do_feeder_impl< Body, Item > feeder_type
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &, void(Body::*)(CvItem &) const)
aligned_space< Item, max_arg_size > my_arg
#define __TBB_TASK_GROUP_CONTEXT
static void call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &arg2)
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &, void(Body::*)(CvItem) const)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
task * execute() __TBB_override
Should be overridden by derived classes.
do_iteration_task(Item &&value, feeder_type &feeder)
task * run_for_random_access_iterator()
task * run(std::forward_iterator_tag *)
virtual ~parallel_do_feeder()
void push_back(task &task)
Push task onto back of list.
do_group_task_forward(Iterator first, size_t size, feeder_type &feeder)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
do_task_iter(Iterator first, Iterator last, feeder_type &feeder)