17 #ifndef __TBB_parallel_sort_H    18 #define __TBB_parallel_sort_H    20 #define __TBB_parallel_sort_H_include_area    29 #if __TBB_TASK_GROUP_CONTEXT    35 namespace interface9 {
    45 template<
typename RandomAccessIterator, 
typename Compare>
    48     inline size_t median_of_three(
const RandomAccessIterator &array, 
size_t l, 
size_t m, 
size_t r)
 const {
    49         return comp(array[l], array[m]) ? ( 
comp(array[m], array[r]) ? m : ( 
comp( array[l], array[r]) ? r : l ) )
    50                                         : ( 
comp(array[r], array[m]) ? m : ( 
comp( array[r], array[l] ) ? r : l ) );
    54         size_t offset = range.
size/8u;
    64         RandomAccessIterator array = range.
begin;
    65         RandomAccessIterator key0 = range.
begin;
    67         if (m) iter_swap ( array, array+m );
    78             } 
while( 
comp( *key0, array[j] ));
    81                 if( i==j ) 
goto partition;
    83             } 
while( 
comp( array[i],*key0 ));
    84             if( i==j ) 
goto partition;
    85             iter_swap( array+i, array+j );
    89         iter_swap( array+j, key0 );
    94         size_t new_range_size = range.
size-i;
    96         return new_range_size;
   120 #if __TBB_TASK_GROUP_CONTEXT   123 template<
typename RandomAccessIterator, 
typename Compare>
   132         RandomAccessIterator my_end = range.
end();
   135         for (RandomAccessIterator k = range.
begin(); k != my_end; ++k, ++i) {
   139             if ( 
comp( *(k), *(k-1) ) ) {
   151 template<
typename RandomAccessIterator, 
typename Compare>
   161 template<
typename RandomAccessIterator, 
typename Compare>
   163 #if __TBB_TASK_GROUP_CONTEXT   165     const int serial_cutoff = 9;
   167     __TBB_ASSERT( 
begin + serial_cutoff < 
end, 
"min_parallel_size is smaller than serial cutoff?" );
   168     RandomAccessIterator k = 
begin;
   169     for ( ; k != 
begin + serial_cutoff; ++k ) {
   170         if ( comp( *(k+1), *k ) ) {
   171             goto do_parallel_quick_sort;
   181 do_parallel_quick_sort:
   209 template<
typename RandomAccessIterator, 
typename Compare>
   211     const int min_parallel_size = 500;
   213         if (
end - 
begin < min_parallel_size) {
   223 template<
typename RandomAccessIterator>
   225     parallel_sort( 
begin, 
end, std::less< 
typename std::iterator_traits<RandomAccessIterator>::value_type >() );
   230 template<
typename Range, 
typename Compare>
   237 template<
typename Range>
   254 #undef __TBB_parallel_sort_H_include_area void operator()(const quick_sort_range< RandomAccessIterator, Compare > &range) 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 end
 
Used to form groups of tasks.
 
quick_sort_range(quick_sort_range &range, split)
 
RandomAccessIterator begin
 
size_t median_of_three(const RandomAccessIterator &array, size_t l, size_t m, size_t r) const
 
quick_sort_pretest_body(const Compare &_comp)
 
bool is_cancelled() const
Returns true if the context has received cancellation request.
 
Base class for user-defined 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 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 begin
 
bool is_divisible() const
 
void parallel_quick_sort(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)
Wrapper method to initiate the sort by calling parallel_for.
 
bool cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
 
void parallel_for(const Range &range, const Body &body)
Parallel iteration over range with default partitioner.
 
Base class for types that should not be assigned.
 
static const size_t grainsize
 
auto last(Container &c) -> decltype(begin(c))
 
size_t pseudo_median_of_nine(const RandomAccessIterator &array, const quick_sort_range &range) const
 
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
 
Body class used to test if elements in a range are presorted.
 
quick_sort_range(RandomAccessIterator begin_, size_t size_, const Compare &comp_)
 
const_iterator begin() const
Beginning of range.
 
void operator()(const blocked_range< RandomAccessIterator > &range) const
 
Dummy type that distinguishes splitting constructor from copy constructor.
 
static task &__TBB_EXPORTED_FUNC self()
The innermost task being executed or destroyed by the current thread at the moment.
 
auto first(Container &c) -> decltype(begin(c))
 
Range used in quicksort to split elements into subranges based on a value.
 
A range over which to iterate.
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
const_iterator end() const
One past last value in range.
 
Body class used to sort elements in a range that is smaller than the grainsize.
 
size_t split_range(quick_sort_range &range)
 
void parallel_sort(RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)
Sorts the data in [begin,end) using the given comparator.