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>
    45 #if __TBB_CPP11_RVALUE_REF_PRESENT    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>
   107 #if __TBB_CPP11_RVALUE_REF_PRESENT   122     template<
typename Iterator, 
typename Body, 
typename Item>
   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);
   192 #if __TBB_TASK_GROUP_CONTEXT   211     template<
typename Iterator, 
typename Body, 
typename Item>
   245         template<
typename Iterator_, 
typename Body_, 
typename _Item> 
friend class do_task_iter;
   248     template<
typename Body, 
typename Item>
   257         aligned_space<Item, max_arg_size> 
my_arg;
   265 #if __TBB_CPP11_RVALUE_REF_PRESENT   266             typedef std::move_iterator<Item*> Item_iterator;
   268             typedef Item* Item_iterator;
   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>
   324             typedef typename std::iterator_traits<Iterator>::iterator_category iterator_tag;
   325             return run( (iterator_tag*)NULL );
   339                 new (t.my_arg.begin() + k) Item(*
my_first);
   341                 if( ++k==block_type::max_arg_size ) {
   365                 if( ++k==block_type::max_arg_size ) {
   381             if( k > block_type::max_arg_size ) {
   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>
   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   546 using interface9::parallel_do_feeder;
   551 #undef __TBB_parallel_do_H_include_area bool_constant< true > true_type
 
do_group_task_forward(Iterator first, size_t size, feeder_type &feeder)
 
void recycle_to_reexecute()
Schedule this for reexecution after current execute() returns.
 
Used to form groups of tasks.
 
void spawn_and_wait_for_all(task &child)
Similar to spawn followed by wait_for_all, but more efficient.
 
do_iteration_task(Item &&value, feeder_type &feeder)
 
parallel_do_feeder_impl()
 
void push_back(task &task)
Push task onto back of list.
 
#define __TBB_TASK_GROUP_CONTEXT
 
Base class for user-defined tasks.
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
parallel_do_feeder_impl< Body, Item > feeder_type
 
Class the user supplied algorithm body uses to add new tasks.
 
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
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
~parallel_do_feeder_impl()
 
void internal_add_move(Item &&item) __TBB_override
 
void select_parallel_do(Iterator first, Iterator last, const Body &body, void(Body::*)(Item) const, task_group_context &context)
For internal use only.
 
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 &arg2, void(Body::*)(CvItem, parallel_do_feeder< Item > &) const)
 
auto last(Container &c) -> decltype(begin(c))
 
bool_constant< false > false_type
 
do_group_task_input(feeder_type &feeder)
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
 
virtual ~parallel_do_feeder()
 
static const size_t max_arg_size
 
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &, void(Body::*)(CvItem) const)
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
internal::allocate_child_proxy & allocate_child()
Returns proxy for overloaded new that allocates a child task of *this.
 
internal::allocate_continuation_proxy & allocate_continuation()
Returns proxy for overloaded new that allocates a continuation task of *this.
 
task that does nothing. Useful for synchronization.
 
parallel_do_feeder< Item > Feeder
 
static void internal_call(const Body &obj, __TBB_FORWARDING_REF(A1) arg1, A2 &, void(Body::*)(CvItem &) const)
 
virtual void internal_add_copy(const Item &item)=0
 
void recycle_as_child_of(task &new_parent)
Change this to be a child of new_parent.
 
parallel_do_feeder_impl< Body, Item > feeder_type
 
Base class for types that should not be copied or assigned.
 
void internal_add_copy(const Item &item) __TBB_override
 
void set_ref_count(int count)
Set reference count.
 
task * run_for_forward_iterator()
 
do_iteration_task_iter(const Iterator &iter, feeder_type &feeder)
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
void internal_add_copy_impl(std::false_type, const Item &)
 
auto first(Container &c) -> decltype(begin(c))
 
parallel_do_feeder_impl< Body, Item > feeder_type
 
task * run_for_input_iterator()
 
void internal_add_copy_impl(std::true_type, const Item &item)
 
void add(const Item &item)
Add a work item to a running parallel_do.
 
void parallel_do(Iterator first, Iterator last, const Body &body)
Parallel iteration over a range, with optional addition of more work.
 
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< Body, Item > feeder_type
 
parallel_do_feeder_impl< Body, Item > feeder_type
 
#define __TBB_FORWARDING_REF(A)
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
task * run(std::forward_iterator_tag *)
 
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
 
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_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
 
do_iteration_task(const Item &value, feeder_type &feeder)
 
aligned_space< Item, max_arg_size > my_arg
 
virtual void internal_add_move(Item &&item)=0
 
void run_parallel_do(Iterator first, Iterator last, const Body &body, task_group_context &context)
For internal use only.
 
task * run_for_random_access_iterator()
 
do_task_iter(Iterator first, Iterator last, feeder_type &feeder)
 
parallel_do_feeder_impl(tbb::task_group_context &context)
 
task * run(std::random_access_iterator_tag *)
 
void move(tbb_thread &t1, tbb_thread &t2)
 
static const size_t max_arg_size