17 #ifndef __TBB_parallel_scan_H    18 #define __TBB_parallel_scan_H    20 #define __TBB_parallel_scan_H_include_area    49     template<
typename Range, 
typename Body>
    67             new( 
my_range.begin() ) Range(range_);
    81     template<
typename Range, 
typename Body>
    94         sum_node( 
const Range range_, 
bool left_is_final_ ) :
   135         template<
typename Range_,
typename Body_,
typename Partitioner_>
   138         template<
typename Range_,
typename Body_>
   144     template<
typename Range, 
typename Body>
   185     template<
typename Range, 
typename Body, 
typename Partitioner=simple_partitioner>
   227         static void run( 
const Range& range_, Body& body_, 
const Partitioner& partitioner_ ) {
   228             if( !range_.empty() ) {
   237                 temp_body->
my_body.reverse_join(body_);
   245                     body_.assign(temp_body->
my_body);
   247                     temp_body->destroy(*temp_body);
   253     template<
typename Range, 
typename Body, 
typename Partitioner>
   256         finish_pass1_type* 
p = my_parent_sum ? static_cast<finish_pass1_type*>( 
parent() ) : NULL;
   260         bool treat_as_stolen = my_is_right_child && (is_stolen_task() || my_body!=
p->my_result.my_left_sum);
   261         if( treat_as_stolen ) {
   263             p->my_right_zombie = my_body = 
new( allocate_root() ) 
final_sum_type(my_body->my_body);
   266         task* next_task = NULL;
   267         if( (my_is_right_child && !treat_as_stolen) || !my_range.is_divisible() || my_partition.should_execute_range(*
this) ) {
   278                 result = 
new(allocate_additional_child_of(*my_parent_sum)) 
sum_node_type(my_range,my_is_final);
   281             finish_pass1_type& c = *
new( allocate_continuation()) finish_pass1_type(*my_return_slot,my_sum,*result);
   288             recycle_as_child_of(c);
   292             my_return_slot = &result->
my_left;
   293             my_is_right_child = 
false;
   295             my_parent_sum = result;
   301     template<
typename Range, 
typename Value, 
typename Scan, 
typename ReverseJoin>
   320         template<
typename Tag>
   362 template<
typename Range, 
typename Body>
   369 template<
typename Range, 
typename Body>
   376 template<
typename Range, 
typename Body>
   383 template<
typename Range, 
typename Value, 
typename Scan, 
typename ReverseJoin>
   384 Value 
parallel_scan( 
const Range& range, 
const Value& identity, 
const Scan& scan, 
const ReverseJoin& reverse_join ) {
   392 template<
typename Range, 
typename Value, 
typename Scan, 
typename ReverseJoin>
   401 template<
typename Range, 
typename Value, 
typename Scan, 
typename ReverseJoin>
   413 #undef __TBB_parallel_scan_H_include_area 
sum_node< Range, Body > sum_node_type
 
static bool is_final_scan()
 
Base class for user-defined tasks.
 
sum_node< Range, Body > sum_node_type
 
Used to indicate that the final scan is being performed.
 
Body * my_stuff_last
Where to put result of last subrange, or NULL if not last subrange.
 
void parallel_scan(const Range &range, Body &body)
Parallel prefix with default partitioner.
 
Base class for types that should not be assigned.
 
void operator()(const Range &r, Tag tag)
 
finish_scan(sum_node_type *&return_slot_, final_sum_type **sum_, sum_node_type &result_)
 
#define __TBB_DEFAULT_PARTITIONER
 
Split work to be done in the scan.
 
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 parent
 
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
 
void recycle_as_continuation()
Change this to be a continuation of its former self.
 
lambda_scan_body(const Value &identity, const Scan &scan, const ReverseJoin &rev_join)
 
start_scan(sum_node_type *&return_slot_, const Range &range_, final_sum_type &body_, const Partitioner &partitioner_)
 
final_sum_type * my_left_sum
 
task * create_child(const Range &range_, final_sum_type &f, sum_node *n, final_sum_type *incoming_, Body *stuff_last_)
 
Used to indicate that the initial scan is being performed.
 
void finish_construction(const Range &range_, Body *stuff_last_)
 
aligned_space< Range > my_range
 
static void spawn_root_and_wait(task &root)
Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
 
void const char const char int ITT_FORMAT __itt_group_sync p
 
void reverse_join(lambda_scan_body &a)
 
static void run(const Range &range_, Body &body_, const Partitioner &partitioner_)
 
Initial task to split the work.
 
lambda_scan_body(lambda_scan_body &b, split)
 
final_sum< Range, Body > final_sum_type
 
Performs final scan for a leaf.
 
void recycle_as_child_of(task &new_parent)
Change this to be a child of new_parent.
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
Dummy type that distinguishes splitting constructor from copy constructor.
 
sum_node_type ** my_return_slot
 
sum_node_type *& my_return_slot
 
int ref_count() const
The internal reference count.
 
sum_node_type & my_result
 
void set_ref_count(int count)
Set reference count.
 
Partitioner::partition_type my_partition
 
const Value & identity_element
 
static bool is_final_scan()
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
final_sum_type * my_incoming
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
const ReverseJoin & my_reverse_join
 
final_sum< Range, Body > final_sum_type
 
final_sum_type **const my_sum
 
sum_node(const Range range_, bool left_is_final_)
 
void poison_pointer(T *__TBB_atomic &)
 
sum_node_type * my_parent_sum
 
final_sum< Range, Body > final_sum_type
 
task * execute() __TBB_override
Should be overridden by derived classes.
 
final_sum_type * my_right_zombie
 
void assign(lambda_scan_body &b)