From: Benjamin Kosnik
Date: Sat, 6 Oct 2007 15:08:58 +0000 (+0000)
Subject: re PR libstdc++/33487 (parallel v3: more functions not in right namespace)
X-Git-Tag: releases/gcc-4.3.0~2186
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f95a65aa12189f267de958ceb995f40e603131e;p=thirdparty%2Fgcc.git
re PR libstdc++/33487 (parallel v3: more functions not in right namespace)
2007-10-06 Benjamin Kosnik
PR libstdc++/33487
* include/parallel/algorithmfwd.h (for_each, generate, generate_n,
transform, replace, replace_if, max_element, min_element, count,
count_if): Consistently construct overloads.
* include/parallel/numericfwd.h (accumulate, adjacent_difference,
inner_product): Same.
* include/parallel/algobase.h: Same.
* include/parallel/algo.h: Same.
* include/parallel/numeric: Same.
* include/bits/algorithmfwd.h: Correct find_end placement.
* docs/html/parallel_mode.html: Document some of the interface
conventions.
* include/parallel/search.h (calc_borders): Only use operator ==.
* include/parallel/algorithmfwd.h: Move __gnu_sequential bits to...
* include/parallel/tags.h: ...here, and use a using directive.
* include/parallel/random_shuffle.h: Include stl_numeric. Qualify
uses of partial_num with __gnu_sequential.
* include/parallel/tree.h: Formatting.
From-SVN: r129054
---
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index b399869fa946..90289e105bec 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,30 @@
+2007-10-06 Benjamin Kosnik
+
+ PR libstdc++/33487
+ * include/parallel/algorithmfwd.h (for_each, generate, generate_n,
+ transform, replace, replace_if, max_element, min_element, count,
+ count_if): Consistently construct overloads.
+ * include/parallel/numericfwd.h (accumulate, adjacent_difference,
+ inner_product): Same.
+ * include/parallel/algobase.h: Same.
+ * include/parallel/algo.h: Same.
+ * include/parallel/numeric: Same.
+
+ * include/bits/algorithmfwd.h: Correct find_end placement.
+
+ * docs/html/parallel_mode.html: Document some of the interface
+ conventions.
+
+ * include/parallel/search.h (calc_borders): Only use operator ==.
+
+ * include/parallel/algorithmfwd.h: Move __gnu_sequential bits to...
+ * include/parallel/tags.h: ...here, and use a using directive.
+
+ * include/parallel/random_shuffle.h: Include stl_numeric. Qualify
+ uses of partial_num with __gnu_sequential.
+
+ * include/parallel/tree.h: Formatting.
+
2007-10-05 Benjamin Kosnik
Fixes for --disable-libstdcxx-pch.
diff --git a/libstdc++-v3/docs/html/parallel_mode.html b/libstdc++-v3/docs/html/parallel_mode.html
index 74db8ca3771e..5843ae8c3d10 100644
--- a/libstdc++-v3/docs/html/parallel_mode.html
+++ b/libstdc++-v3/docs/html/parallel_mode.html
@@ -388,26 +388,109 @@ computing.
Something about compile-time settings and configuration, ie using
__gnu_parallel::Settings
. XXX Up in the air.
-Interface basics and relevant namespaces
+Interface basics and general design
+
+All parallel algorithms are intended to have signatures that are
+equivalent to the ISO C++ algorithms replaced. For instance, the
+std::adjacent_find
function is declared as:
+
+
+namespace std
+{
+ template<typename _FIter>
+ _FIter
+ adjacent_find(_FIter, _FIter);
+}
+
+
+Which means that there should be something equivalent for the parallel
+version. Indeed, this is the case:
+
+
+namespace std
+{
+ namespace __parallel
+ {
+ template<typename _FIter>
+ _FIter
+ adjacent_find(_FIter, _FIter);
+
+ ...
+ }
+}
+
+
+But.... why the elipses?
+
- Two namespaces contain the parallel mode:
-std::__parallel
and __gnu_parallel
.
+
The elipses in the example above represent additional overloads
+required for the parallel version of the function. These additional
+overloads are used to dispatch calls from the ISO C++ function
+signature to the appropriate parallel function (or sequential
+function, if no parallel functions are deemed worthy), based on either
+compile-time or run-time conditions.
+
+
+ Compile-time conditions are referred to as "embarrassingly
+parallel," and are denoted with the appropriate dispatch object, ie
+one of __gnu_parallel::sequential_tag
,
+__gnu_parallel::parallel_tag
,
+__gnu_parallel::balanced_tag
,
+__gnu_parallel::unbalanced_tag
,
+__gnu_parallel::omp_loop_tag
, or
+__gnu_parallel::omp_loop_static_tag
.
+ Run-time conditions depend on the hardware being used, the number
+of threads available, etc., and are denoted by the use of the enum
+__gnu_parallel::parallelism
. Values of this enum include
+__gnu_parallel::sequential
,
+__gnu_parallel::parallel_unbalanced
,
+__gnu_parallel::parallel_balanced
,
+__gnu_parallel::parallel_omp_loop
,
+__gnu_parallel::parallel_omp_loop_static
, or
+__gnu_parallel::parallel_taskqueue
.
+
+
+ Putting all this together, the general view of overloads for the
+parallel algorithms look like this:
+
+
+ - ISO C++ signature
+ - ISO C++ signature + sequential_tag argument
+ - ISO C++ signature + parallelism argument
+
+
+ Please note that the implementation may use additional functions
+(designated with the _switch
suffix) to dispatch from the
+ISO C++ signature to the correct parallel version. Also, some of the
+algorithms do not have support for run-time conditions, so the last
+overload is therefore missing.
+
+
+
+Relevant namespaces
+
One namespace contain versions of code that are explicitly sequential:
__gnu_serial
.
- Parallel implementations of the sequential standard components are
-defined in namespace std::__parallel
. For instance,
-std::transform
from <algorithm> has a parallel
-counterpart in std::__parallel::transform
from
+
Two namespaces contain the parallel mode:
+std::__parallel
and __gnu_parallel
.
+
+
+ Parallel implementations of standard components, including
+template helpers to select parallelism, are defined in namespace
+std::__parallel
. For instance, std::transform
from
+<algorithm> has a parallel counterpart in
+std::__parallel::transform
from
<parallel/algorithm>. In addition, these parallel
implementatations are injected into namespace
-__gnu_parallel
with using declarations.
+__gnu_parallel with using declarations.
- Support and infrastructure is in namespace __gnu_parallel
.
+
Support and general infrastructure is in namespace
+__gnu_parallel
.
More information, and an organized index of types and functions
diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h
index 0b61864759c8..0e3047331213 100644
--- a/libstdc++-v3/include/bits/algorithmfwd.h
+++ b/libstdc++-v3/include/bits/algorithmfwd.h
@@ -148,7 +148,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
fill_n(_OIter, _Size, const _Tp&);
// find
- // find_end
+
+ template
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2);
+
+ template
+ _FIter1
+ find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
+
// find_first_of
// find_if
// for_each
@@ -389,14 +397,6 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P)
_IIter
find(_IIter, _IIter, const _Tp&);
- template
- _FIter1
- find_end(_FIter1, _FIter1, _FIter2, _FIter2);
-
- template
- _FIter1
- find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
-
template
_FIter1
find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
diff --git a/libstdc++-v3/include/parallel/algo.h b/libstdc++-v3/include/parallel/algo.h
index dcda79090b4f..71b7bff7395f 100644
--- a/libstdc++-v3/include/parallel/algo.h
+++ b/libstdc++-v3/include/parallel/algo.h
@@ -71,23 +71,24 @@ namespace __parallel
// Sequential fallback
template
inline Function
- for_each(InputIterator begin, InputIterator end, Function f, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::for_each(begin, end, f);
- }
+ for_each(InputIterator begin, InputIterator end, Function f,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::for_each(begin, end, f); }
// Sequential fallback for input iterator case
template
Function
- for_each_switch(InputIterator begin, InputIterator end, Function f, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
- {
- return for_each(begin, end, f, __gnu_parallel::sequential_tag());
- }
+ for_each_switch(InputIterator begin, InputIterator end, Function f,
+ IteratorTag)
+ { return for_each(begin, end, f, __gnu_parallel::sequential_tag()); }
// Parallel algorithm for random access iterators
template
Function
- for_each_switch(RandomAccessIterator begin, RandomAccessIterator end, Function f, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ for_each_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ Function f, random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::for_each_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
@@ -96,26 +97,37 @@ namespace __parallel
return __gnu_parallel::for_each_template_random_access(begin, end, f, functionality, __gnu_parallel::dummy_reduct(), true, dummy, -1, parallelism_tag);
}
else
- return for_each(begin, end, f, __gnu_parallel::sequential_tag());
+ return for_each(begin, end, f, __gnu_parallel::sequential_tag());
}
// Public interface
template
inline Function
- for_each(Iterator begin, Iterator end, Function f, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ for_each(Iterator begin, Iterator end, Function f,
+ __gnu_parallel::parallelism parallelism_tag)
{
typedef std::iterator_traits iterator_traits;
typedef typename iterator_traits::iterator_category iterator_category;
+ return for_each_switch(begin, end, f, iterator_category(),
+ parallelism_tag);
+ }
- return for_each_switch(begin, end, f, iterator_category(), parallelism_tag);
+ template
+ inline Function
+ for_each(Iterator begin, Iterator end, Function f)
+ {
+ typedef std::iterator_traits iterator_traits;
+ typedef typename iterator_traits::iterator_category iterator_category;
+ return for_each_switch(begin, end, f, iterator_category());
}
// Sequential fallback
template
inline InputIterator
- find(InputIterator begin, InputIterator end, const T& val, __gnu_parallel::sequential_tag)
- { return _GLIBCXX_STD_P::find(begin, end, val); }
+ find(InputIterator begin, InputIterator end, const T& val,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::find(begin, end, val); }
// Sequential fallback for input iterator case
template
@@ -128,7 +140,8 @@ namespace __parallel
RandomAccessIterator
find_switch(RandomAccessIterator begin, RandomAccessIterator end, const T& val, random_access_iterator_tag)
{
- typedef typename iterator_traits::value_type value_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
if (_GLIBCXX_PARALLEL_CONDITION(true))
{
@@ -152,26 +165,26 @@ namespace __parallel
// Sequential fallback
template
inline InputIterator
- find_if(InputIterator begin, InputIterator end, Predicate pred, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::find_if(begin, end, pred);
- }
+ find_if(InputIterator begin, InputIterator end, Predicate pred,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::find_if(begin, end, pred); }
// Sequential fallback for input iterator case
template
inline InputIterator
- find_if_switch(InputIterator begin, InputIterator end, Predicate pred, IteratorTag)
- {
- return _GLIBCXX_STD_P::find_if(begin, end, pred);
- }
+ find_if_switch(InputIterator begin, InputIterator end, Predicate pred,
+ IteratorTag)
+ { return _GLIBCXX_STD_P::find_if(begin, end, pred); }
// Parallel find_if for random access iterators
template
RandomAccessIterator
- find_if_switch(RandomAccessIterator begin, RandomAccessIterator end, Predicate pred, random_access_iterator_tag)
+ find_if_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ Predicate pred, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(true))
- return __gnu_parallel::find_template(begin, end, begin, pred, __gnu_parallel::find_if_selector()).first;
+ return __gnu_parallel::find_template(begin, end, begin, pred,
+ __gnu_parallel::find_if_selector()).first;
else
return _GLIBCXX_STD_P::find_if(begin, end, pred);
}
@@ -189,10 +202,10 @@ namespace __parallel
// Sequential fallback
template
inline InputIterator
- find_first_of(InputIterator begin1, InputIterator end1, ForwardIterator begin2, ForwardIterator end2, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::find_first_of(begin1, end1, begin2, end2);
- }
+ find_first_of(InputIterator begin1, InputIterator end1,
+ ForwardIterator begin2, ForwardIterator end2,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::find_first_of(begin1, end1, begin2, end2); }
// Sequential fallback
template
inline InputIterator
find_first_of_switch(InputIterator begin1, InputIterator end1,
- ForwardIterator begin2, ForwardIterator end2, IteratorTag1, IteratorTag2)
+ ForwardIterator begin2, ForwardIterator end2,
+ IteratorTag1, IteratorTag2)
{
- return find_first_of(begin1, end1, begin2, end2, __gnu_parallel::sequential_tag());
+ return find_first_of(begin1, end1, begin2, end2,
+ __gnu_parallel::sequential_tag());
}
// Parallel algorithm for random access iterators
template
inline RandomAccessIterator
find_first_of_switch(RandomAccessIterator begin1, RandomAccessIterator end1,
- ForwardIterator begin2, ForwardIterator end2, BinaryPredicate comp, random_access_iterator_tag, IteratorTag)
+ ForwardIterator begin2, ForwardIterator end2,
+ BinaryPredicate comp, random_access_iterator_tag,
+ IteratorTag)
{
return __gnu_parallel::find_template(begin1, end1, begin1, comp, __gnu_parallel::find_first_of_selector(begin2, end2)).first;
}
@@ -228,36 +243,42 @@ namespace __parallel
inline
InputIterator
find_first_of_switch(InputIterator begin1, InputIterator end1,
- ForwardIterator begin2, ForwardIterator end2, BinaryPredicate comp, IteratorTag1, IteratorTag2)
+ ForwardIterator begin2, ForwardIterator end2,
+ BinaryPredicate comp, IteratorTag1, IteratorTag2)
{
- return find_first_of(begin1, end1, begin2, end2, comp, __gnu_parallel::sequential_tag());
+ return find_first_of(begin1, end1, begin2, end2, comp,
+ __gnu_parallel::sequential_tag());
}
// Public interface
template
inline InputIterator
find_first_of(InputIterator begin1, InputIterator end1,
- ForwardIterator begin2, ForwardIterator end2, BinaryPredicate comp)
+ ForwardIterator begin2, ForwardIterator end2,
+ BinaryPredicate comp)
{
typedef std::iterator_traits iteratori_traits;
typedef std::iterator_traits iteratorf_traits;
typedef typename iteratori_traits::iterator_category iteratori_category;
typedef typename iteratorf_traits::iterator_category iteratorf_category;
- return find_first_of_switch(begin1, end1, begin2, end2, comp, iteratori_category(), iteratorf_category());
+ return find_first_of_switch(begin1, end1, begin2, end2, comp,
+ iteratori_category(), iteratorf_category());
}
// Public interface, insert default comparator
template
InputIterator
- find_first_of(InputIterator begin1, InputIterator end1, ForwardIterator begin2, ForwardIterator end2)
+ find_first_of(InputIterator begin1, InputIterator end1,
+ ForwardIterator begin2, ForwardIterator end2)
{
typedef std::iterator_traits iteratori_traits;
typedef std::iterator_traits iteratorf_traits;
typedef typename iteratori_traits::value_type valuei_type;
typedef typename iteratorf_traits::value_type valuef_type;
- return find_first_of(begin1, end1, begin2, end2, __gnu_parallel::equal_to());
+ return find_first_of(begin1, end1, begin2, end2,
+ __gnu_parallel::equal_to());
}
// Sequential fallback
@@ -265,33 +286,29 @@ namespace __parallel
inline OutputIterator
unique_copy(InputIterator begin1, InputIterator end1, OutputIterator out,
__gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::unique_copy(begin1, end1, out);
- }
+ { return _GLIBCXX_STD_P::unique_copy(begin1, end1, out); }
// Sequential fallback
template
inline OutputIterator
unique_copy(InputIterator begin1, InputIterator end1, OutputIterator out,
Predicate pred, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::unique_copy(begin1, end1, out, pred);
- }
+ { return _GLIBCXX_STD_P::unique_copy(begin1, end1, out, pred); }
// Sequential fallback for input iterator case
template
inline OutputIterator
- unique_copy_switch(InputIterator begin, InputIterator last, OutputIterator out,
- Predicate pred, IteratorTag1, IteratorTag2)
- {
- return _GLIBCXX_STD_P::unique_copy(begin, last, out, pred);
- }
+ unique_copy_switch(InputIterator begin, InputIterator last,
+ OutputIterator out, Predicate pred,
+ IteratorTag1, IteratorTag2)
+ { return _GLIBCXX_STD_P::unique_copy(begin, last, out, pred); }
// Parallel unique_copy for random access iterators
template
RandomAccessOutputIterator
- unique_copy_switch(RandomAccessIterator begin, RandomAccessIterator last, RandomAccessOutputIterator out,
- Predicate pred, random_access_iterator_tag, random_access_iterator_tag)
+ unique_copy_switch(RandomAccessIterator begin, RandomAccessIterator last,
+ RandomAccessOutputIterator out, Predicate pred,
+ random_access_iterator_tag, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(last - begin) > __gnu_parallel::Settings::unique_copy_minimal_n))
return __gnu_parallel::parallel_unique_copy(begin, last, out, pred);
@@ -325,7 +342,8 @@ namespace __parallel
typedef typename iteratori_traits::iterator_category iteratori_category;
typedef typename iteratoro_traits::iterator_category iteratoro_category;
- return unique_copy_switch(begin1, end1, out, pred, iteratori_category(), iteratoro_category());
+ return unique_copy_switch(begin1, end1, out, pred, iteratori_category(),
+ iteratoro_category());
}
// Sequential fallback
@@ -334,9 +352,7 @@ namespace __parallel
set_union(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
OutputIterator out, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::set_union(begin1, end1, begin2, end2, out);
- }
+ { return _GLIBCXX_STD_P::set_union(begin1, end1, begin2, end2, out); }
// Sequential fallback
template
@@ -344,16 +360,15 @@ namespace __parallel
set_union(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
OutputIterator out, Predicate pred, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::set_union(begin1, end1, begin2, end2, out, pred);
- }
+ { return _GLIBCXX_STD_P::set_union(begin1, end1, begin2, end2, out, pred); }
// Sequential fallback for input iterator case
template
inline OutputIterator
- set_union_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
- InputIterator2 end2, OutputIterator result, Predicate pred, IteratorTag1,
+ set_union_switch(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator result, Predicate pred, IteratorTag1,
IteratorTag2, IteratorTag3)
{
return _GLIBCXX_STD_P::set_union(begin1, end1, begin2, end2, result, pred);
@@ -363,9 +378,11 @@ namespace __parallel
template
OutputRandomAccessIterator
- set_union_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2,
- RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred,
- random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
+ set_union_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1,
+ RandomAccessIterator2 begin2, RandomAccessIterator2 end2,
+ OutputRandomAccessIterator result, Predicate pred,
+ random_access_iterator_tag, random_access_iterator_tag,
+ random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end1 - begin1) >= __gnu_parallel::Settings::set_union_minimal_n || static_cast<__gnu_parallel::sequence_index_t>(end2 - begin2) >= __gnu_parallel::Settings::set_union_minimal_n))
return __gnu_parallel::parallel_set_union(begin1, end1, begin2, end2, result, pred);
@@ -376,7 +393,8 @@ namespace __parallel
// Public interface
template
inline OutputIterator
- set_union(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out)
+ set_union(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ InputIterator2 end2, OutputIterator out)
{
typedef std::iterator_traits iteratori1_traits;
typedef std::iterator_traits iteratori2_traits;
@@ -387,8 +405,10 @@ namespace __parallel
typedef typename iteratori1_traits::value_type value1_type;
typedef typename iteratori2_traits::value_type value2_type;
- return set_union_switch(begin1, end1, begin2, end2, out, __gnu_parallel::less(),
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return set_union_switch(begin1, end1, begin2, end2, out,
+ __gnu_parallel::less(),
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Public interface
@@ -405,7 +425,8 @@ namespace __parallel
typedef typename iteratoro_traits::iterator_category iteratoro_category;
return set_union_switch(begin1, end1, begin2, end2, out, pred,
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Sequential fallback.
@@ -423,40 +444,46 @@ namespace __parallel
inline OutputIterator
set_intersection(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
- OutputIterator out, Predicate pred, __gnu_parallel::sequential_tag)
+ OutputIterator out, Predicate pred,
+ __gnu_parallel::sequential_tag)
{
- return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2, end2, out, pred);
+ return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2, end2,
+ out, pred);
}
// Sequential fallback for input iterator case
template
inline OutputIterator
- set_intersection_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
- InputIterator2 end2, OutputIterator result, Predicate pred, IteratorTag1,
- IteratorTag2, IteratorTag3)
+ set_intersection_switch(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator result, Predicate pred,
+ IteratorTag1, IteratorTag2, IteratorTag3)
{
- return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2, end2, result, pred);
+ return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2,
+ end2, result, pred);
}
// Parallel set_intersection for random access iterators
template
OutputRandomAccessIterator
- set_intersection_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2,
- RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred,
- random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
+ set_intersection_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred, random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end1 - begin1) >= __gnu_parallel::Settings::set_union_minimal_n || static_cast<__gnu_parallel::sequence_index_t>(end2 - begin2) >= __gnu_parallel::Settings::set_union_minimal_n))
- return __gnu_parallel::parallel_set_intersection(begin1, end1, begin2, end2, result, pred);
+ return __gnu_parallel::parallel_set_intersection(begin1, end1, begin2,
+ end2, result, pred);
else
- return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2, end2, result, pred);
+ return _GLIBCXX_STD_P::set_intersection(begin1, end1, begin2,
+ end2, result, pred);
}
// Public interface
template
inline OutputIterator
- set_intersection(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out)
+ set_intersection(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator out)
{
typedef std::iterator_traits iteratori1_traits;
typedef std::iterator_traits iteratori2_traits;
@@ -467,8 +494,10 @@ namespace __parallel
typedef typename iteratori1_traits::value_type value1_type;
typedef typename iteratori2_traits::value_type value2_type;
- return set_intersection_switch(begin1, end1, begin2, end2, out, __gnu_parallel::less(),
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return set_intersection_switch(begin1, end1, begin2, end2, out,
+ __gnu_parallel::less(),
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
template
@@ -484,7 +513,8 @@ namespace __parallel
typedef typename iteratoro_traits::iterator_category iteratoro_category;
return set_intersection_switch(begin1, end1, begin2, end2, out, pred,
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Sequential fallback
@@ -495,7 +525,8 @@ namespace __parallel
InputIterator2 begin2, InputIterator2 end2,
OutputIterator out, __gnu_parallel::sequential_tag)
{
- return _GLIBCXX_STD_P::set_symmetric_difference(begin1,end1, begin2, end2, out);
+ return _GLIBCXX_STD_P::set_symmetric_difference(begin1,end1, begin2,
+ end2, out);
}
// Sequential fallback
@@ -506,7 +537,8 @@ namespace __parallel
InputIterator2 begin2, InputIterator2 end2,
OutputIterator out, Predicate pred, __gnu_parallel::sequential_tag)
{
- return _GLIBCXX_STD_P::set_symmetric_difference(begin1, end1, begin2, end2, out, pred);
+ return _GLIBCXX_STD_P::set_symmetric_difference(begin1, end1, begin2,
+ end2, out, pred);
}
// Sequential fallback for input iterator case
@@ -514,17 +546,15 @@ namespace __parallel
inline OutputIterator
set_symmetric_difference_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result, Predicate pred, IteratorTag1, IteratorTag2, IteratorTag3)
{
- return _GLIBCXX_STD_P::set_symmetric_difference(begin1, end1, begin2, end2, result, pred);
+ return _GLIBCXX_STD_P::set_symmetric_difference(begin1, end1, begin2, end2,
+ result, pred);
}
// Parallel set_symmetric_difference for random access iterators
template
OutputRandomAccessIterator
- set_symmetric_difference_switch(RandomAccessIterator1 begin1,
- RandomAccessIterator1 end1, RandomAccessIterator2 begin2,
- RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred,
- random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
+ set_symmetric_difference_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred, random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end1 - begin1) >= __gnu_parallel::Settings::set_symmetric_difference_minimal_n || static_cast<__gnu_parallel::sequence_index_t>(end2 - begin2) >= __gnu_parallel::Settings::set_symmetric_difference_minimal_n))
return __gnu_parallel::parallel_set_symmetric_difference(begin1, end1, begin2, end2, result, pred);
@@ -546,15 +576,16 @@ namespace __parallel
typedef typename iteratori1_traits::value_type value1_type;
typedef typename iteratori2_traits::value_type value2_type;
- return set_symmetric_difference_switch(begin1, end1, begin2, end2, out, __gnu_parallel::less(),
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return set_symmetric_difference_switch(begin1, end1, begin2, end2, out,
+ __gnu_parallel::less(),
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Public interface.
template
inline OutputIterator
- set_symmetric_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
- InputIterator2 end2, OutputIterator out, Predicate pred)
+ set_symmetric_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out, Predicate pred)
{
typedef std::iterator_traits iteratori1_traits;
typedef std::iterator_traits iteratori2_traits;
@@ -563,22 +594,26 @@ namespace __parallel
typedef typename iteratori2_traits::iterator_category iteratori2_category;
typedef typename iteratoro_traits::iterator_category iteratoro_category;
- return set_symmetric_difference_switch(begin1, end1, begin2, end2, out, pred,
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return set_symmetric_difference_switch(begin1, end1, begin2, end2, out,
+ pred, iteratori1_category(),
+ iteratori2_category(), iteratoro_category());
}
// Sequential fallback.
template
inline OutputIterator
- set_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::set_difference(begin1,end1, begin2, end2, out);
- }
+ set_difference(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator out, __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::set_difference(begin1,end1, begin2, end2, out); }
// Sequential fallback.
template
inline OutputIterator
- set_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out, Predicate pred, __gnu_parallel::sequential_tag)
+ set_difference(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator out, Predicate pred,
+ __gnu_parallel::sequential_tag)
{
return _GLIBCXX_STD_P::set_difference(begin1, end1, begin2, end2, out, pred);
}
@@ -587,8 +622,10 @@ namespace __parallel
template
inline OutputIterator
- set_difference_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
- InputIterator2 end2, OutputIterator result, Predicate pred, IteratorTag1, IteratorTag2, IteratorTag3)
+ set_difference_switch(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator result, Predicate pred,
+ IteratorTag1, IteratorTag2, IteratorTag3)
{
return _GLIBCXX_STD_P::set_difference(begin1, end1, begin2, end2, result, pred);
}
@@ -597,9 +634,7 @@ namespace __parallel
template
OutputRandomAccessIterator
- set_difference_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2,
- RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred,
- random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
+ set_difference_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator2 end2, OutputRandomAccessIterator result, Predicate pred, random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end1 - begin1) >= __gnu_parallel::Settings::set_difference_minimal_n || static_cast<__gnu_parallel::sequence_index_t>(end2 - begin2) >= __gnu_parallel::Settings::set_difference_minimal_n))
return __gnu_parallel::parallel_set_difference(begin1, end1, begin2, end2, result, pred);
@@ -610,7 +645,9 @@ namespace __parallel
// Public interface
template
inline OutputIterator
- set_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator out)
+ set_difference(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator out)
{
typedef std::iterator_traits iteratori1_traits;
typedef std::iterator_traits iteratori2_traits;
@@ -621,15 +658,18 @@ namespace __parallel
typedef typename iteratori1_traits::value_type value1_type;
typedef typename iteratori2_traits::value_type value2_type;
- return set_difference_switch(begin1, end1, begin2, end2, out, __gnu_parallel::less(),
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return set_difference_switch(begin1, end1, begin2, end2, out,
+ __gnu_parallel::less(),
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Public interface
template
inline OutputIterator
- set_difference(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
- InputIterator2 end2, OutputIterator out, Predicate pred)
+ set_difference(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator out, Predicate pred)
{
typedef std::iterator_traits iteratori1_traits;
typedef std::iterator_traits iteratori2_traits;
@@ -639,31 +679,32 @@ namespace __parallel
typedef typename iteratoro_traits::iterator_category iteratoro_category;
return set_difference_switch(begin1, end1, begin2, end2, out, pred,
- iteratori1_category(), iteratori2_category(), iteratoro_category());
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Sequential fallback
template
inline ForwardIterator
- adjacent_find(ForwardIterator begin, ForwardIterator end, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::adjacent_find(begin, end);
- }
+ adjacent_find(ForwardIterator begin, ForwardIterator end,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::adjacent_find(begin, end); }
// Sequential fallback
template
inline ForwardIterator
- adjacent_find(ForwardIterator begin, ForwardIterator end, BinaryPredicate binary_pred, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::adjacent_find(begin, end, binary_pred);
- }
+ adjacent_find(ForwardIterator begin, ForwardIterator end,
+ BinaryPredicate binary_pred, __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::adjacent_find(begin, end, binary_pred); }
// Parallel algorithm for random access iterators
template
RandomAccessIterator
- adjacent_find_switch(RandomAccessIterator begin, RandomAccessIterator end, random_access_iterator_tag)
+ adjacent_find_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ random_access_iterator_tag)
{
- typedef typename iterator_traits::value_type value_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
if (_GLIBCXX_PARALLEL_CONDITION(true))
{
@@ -674,138 +715,173 @@ namespace __parallel
return spot;
}
else
- return adjacent_find(begin, end, __gnu_parallel::sequential_tag());
+ return adjacent_find(begin, end, __gnu_parallel::sequential_tag());
}
// Sequential fallback for input iterator case
template
inline ForwardIterator
adjacent_find_switch(ForwardIterator begin, ForwardIterator end, IteratorTag)
- {
- return adjacent_find(begin, end, __gnu_parallel::sequential_tag());
- }
+ { return adjacent_find(begin, end, __gnu_parallel::sequential_tag()); }
// Public interface
template
inline ForwardIterator
adjacent_find(ForwardIterator begin, ForwardIterator end)
{
- return adjacent_find_switch(begin, end, typename std::iterator_traits::iterator_category());
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return adjacent_find_switch(begin, end, iterator_category());
}
// Sequential fallback for input iterator case
template
inline ForwardIterator
- adjacent_find_switch(ForwardIterator begin, ForwardIterator end, BinaryPredicate binary_pred, IteratorTag)
- {
- return adjacent_find(begin, end, binary_pred, __gnu_parallel::sequential_tag());
- }
+ adjacent_find_switch(ForwardIterator begin, ForwardIterator end,
+ BinaryPredicate pred, IteratorTag)
+ { return adjacent_find(begin, end, pred, __gnu_parallel::sequential_tag()); }
// Parallel algorithm for random access iterators
template
RandomAccessIterator
- adjacent_find_switch(RandomAccessIterator begin, RandomAccessIterator end, BinaryPredicate binary_pred, random_access_iterator_tag)
+ adjacent_find_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ BinaryPredicate pred, random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION(true))
- return __gnu_parallel::find_template(begin, end, begin, binary_pred, __gnu_parallel::adjacent_find_selector()).first;
+ return __gnu_parallel::find_template(begin, end, begin, pred,
+ __gnu_parallel::adjacent_find_selector()).first;
else
- return adjacent_find(begin, end, binary_pred, __gnu_parallel::sequential_tag());
+ return adjacent_find(begin, end, pred, __gnu_parallel::sequential_tag());
}
// Public interface
template
inline ForwardIterator
- adjacent_find(ForwardIterator begin, ForwardIterator end, BinaryPredicate binary_pred)
+ adjacent_find(ForwardIterator begin, ForwardIterator end,
+ BinaryPredicate pred)
{
- return adjacent_find_switch(begin, end, binary_pred, typename std::iterator_traits::iterator_category());
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return adjacent_find_switch(begin, end, pred, iterator_category());
}
// Sequential fallback
template
inline typename iterator_traits::difference_type
- count(InputIterator begin, InputIterator end, const T& value, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::count(begin, end, value);
- }
+ count(InputIterator begin, InputIterator end, const T& value,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::count(begin, end, value); }
// Parallel code for random access iterators
template
typename iterator_traits::difference_type
- count_switch(RandomAccessIterator begin, RandomAccessIterator end, const T& value, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ count_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ const T& value, random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_unbalanced)
{
- typedef typename iterator_traits::value_type value_type;
- typedef typename iterator_traits::difference_type difference_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
+ typedef typename traits_type::difference_type difference_type;
+ typedef __gnu_parallel::sequence_index_t sequence_index_t;
- if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::count_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
+ if (_GLIBCXX_PARALLEL_CONDITION(static_cast(end - begin) >= __gnu_parallel::Settings::count_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
- difference_type res = 0;
__gnu_parallel::count_selector functionality;
- __gnu_parallel::for_each_template_random_access(begin, end, value, functionality, std::plus<__gnu_parallel::sequence_index_t>(), res, res, -1, parallelism_tag);
+ difference_type res = 0;
+ __gnu_parallel::for_each_template_random_access(begin, end, value, functionality, std::plus(), res, res, -1, parallelism_tag);
return res;
}
else
- return count(begin, end, value, __gnu_parallel::sequential_tag());
+ return count(begin, end, value, __gnu_parallel::sequential_tag());
}
// Sequential fallback for input iterator case.
template
typename iterator_traits::difference_type
- count_switch(InputIterator begin, InputIterator end, const T& value, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
+ count_switch(InputIterator begin, InputIterator end, const T& value,
+ IteratorTag)
+ { return count(begin, end, value, __gnu_parallel::sequential_tag()); }
+
+ // Public interface.
+ template
+ inline typename iterator_traits::difference_type
+ count(InputIterator begin, InputIterator end, const T& value,
+ __gnu_parallel::parallelism parallelism_tag)
{
- return count(begin, end, value, __gnu_parallel::sequential_tag());
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return count_switch(begin, end, value, iterator_category(),
+ parallelism_tag);
}
- // Public interface.
template
inline typename iterator_traits::difference_type
- count(InputIterator begin, InputIterator end, const T& value, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
+ count(InputIterator begin, InputIterator end, const T& value)
{
- return count_switch(begin, end, value, typename std::iterator_traits::iterator_category(), parallelism_tag);
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return count_switch(begin, end, value, iterator_category());
}
+
// Sequential fallback.
template
inline typename iterator_traits::difference_type
- count_if(InputIterator begin, InputIterator end, Predicate pred, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::count_if(begin, end, pred);
- }
+ count_if(InputIterator begin, InputIterator end, Predicate pred,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::count_if(begin, end, pred); }
// Parallel count_if for random access iterators
template
typename iterator_traits::difference_type
- count_if_switch(RandomAccessIterator begin, RandomAccessIterator end, Predicate pred, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ count_if_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ Predicate pred, random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_unbalanced)
{
- typedef typename iterator_traits::value_type value_type;
- typedef typename iterator_traits::difference_type difference_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
+ typedef typename traits_type::difference_type difference_type;
+ typedef __gnu_parallel::sequence_index_t sequence_index_t;
- if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::count_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
+ if (_GLIBCXX_PARALLEL_CONDITION(static_cast(end - begin) >= __gnu_parallel::Settings::count_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
difference_type res = 0;
__gnu_parallel::count_if_selector functionality;
- __gnu_parallel::for_each_template_random_access(begin, end, pred, functionality, std::plus<__gnu_parallel::sequence_index_t>(), res, res, -1, parallelism_tag);
+ __gnu_parallel::for_each_template_random_access(begin, end, pred, functionality, std::plus(), res, res, -1, parallelism_tag);
return res;
}
else
- return count_if(begin, end, pred, __gnu_parallel::sequential_tag());
+ return count_if(begin, end, pred, __gnu_parallel::sequential_tag());
}
// Sequential fallback for input iterator case.
template
typename iterator_traits::difference_type
- count_if_switch(InputIterator begin, InputIterator end, Predicate pred, IteratorTag, __gnu_parallel::parallelism)
+ count_if_switch(InputIterator begin, InputIterator end, Predicate pred,
+ IteratorTag)
+ { return count_if(begin, end, pred, __gnu_parallel::sequential_tag()); }
+
+ // Public interface.
+ template
+ inline typename iterator_traits::difference_type
+ count_if(InputIterator begin, InputIterator end, Predicate pred,
+ __gnu_parallel::parallelism parallelism_tag)
{
- return count_if(begin, end, pred, __gnu_parallel::sequential_tag());
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return count_if_switch(begin, end, pred, iterator_category(),
+ parallelism_tag);
}
- // Public interface.
template
inline typename iterator_traits::difference_type
- count_if(InputIterator begin, InputIterator end, Predicate pred, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
+ count_if(InputIterator begin, InputIterator end, Predicate pred)
{
typedef iterator_traits traits_type;
typedef typename traits_type::iterator_category iterator_category;
- return count_if_switch(begin, end, pred, iterator_category(), parallelism_tag);
+ return count_if_switch(begin, end, pred, iterator_category());
}
@@ -950,53 +1026,88 @@ namespace __parallel
return search_n_switch(begin, end, count, val, binary_pred, typename std::iterator_traits::iterator_category());
}
+
// Sequential fallback.
template
inline OutputIterator
- transform(InputIterator begin, InputIterator end, OutputIterator result, UnaryOperation unary_op, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::transform(begin, end, result, unary_op);
- }
-
- // Sequential fallback
- template
- inline OutputIterator
- transform(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, OutputIterator result, BinaryOperation binary_op, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::transform(begin1, end1, begin2, result, binary_op);
- }
+ transform(InputIterator begin, InputIterator end, OutputIterator result,
+ UnaryOperation unary_op, __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::transform(begin, end, result, unary_op); }
// Parallel unary transform for random access iterators.
- template
- RandomAccessIterator3
- transform1_switch(RandomAccessIterator1 begin, RandomAccessIterator1 end, RandomAccessIterator3 result, UnaryOperation unary_op, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ template
+ RandomAccessIterator2
+ transform1_switch(RandomAccessIterator1 begin, RandomAccessIterator1 end, RandomAccessIterator2 result, UnaryOperation unary_op, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::transform_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
bool dummy = true;
- typedef __gnu_parallel::iterator_pair ip;
+ typedef __gnu_parallel::iterator_pair ip;
ip begin_pair(begin, result), end_pair(end, result + (end - begin));
__gnu_parallel::transform1_selector functionality;
__gnu_parallel::for_each_template_random_access(begin_pair, end_pair, unary_op, functionality, __gnu_parallel::dummy_reduct(), dummy, dummy, -1, parallelism_tag);
return functionality.finish_iterator;
}
else
- return transform(begin, end, result, unary_op, __gnu_parallel::sequential_tag());
+ return transform(begin, end, result, unary_op,
+ __gnu_parallel::sequential_tag());
}
// Sequential fallback for input iterator case.
- template
- inline RandomAccessIterator3
- transform1_switch(RandomAccessIterator1 begin, RandomAccessIterator1 end, RandomAccessIterator3 result, UnaryOperation unary_op, IteratorTag1, IteratorTag2, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ template
+ inline RandomAccessIterator2
+ transform1_switch(RandomAccessIterator1 begin, RandomAccessIterator1 end, RandomAccessIterator2 result, UnaryOperation unary_op, IteratorTag1, IteratorTag2)
+ {
+ return transform(begin, end, result, unary_op,
+ __gnu_parallel::sequential_tag());
+ }
+
+ // Public interface.
+ template
+ inline OutputIterator
+ transform(InputIterator begin, InputIterator end, OutputIterator result,
+ UnaryOperation unary_op,
+ __gnu_parallel::parallelism parallelism_tag)
{
- return _GLIBCXX_STD_P::transform(begin, end, result, unary_op);
+ typedef std::iterator_traits iteratori_traits;
+ typedef std::iterator_traits iteratoro_traits;
+ typedef typename iteratori_traits::iterator_category iteratori_category;
+ typedef typename iteratoro_traits::iterator_category iteratoro_category;
+
+ return transform1_switch(begin, end, result, unary_op,
+ iteratori_category(), iteratoro_category(),
+ parallelism_tag);
+ }
+
+ template
+ inline OutputIterator
+ transform(InputIterator begin, InputIterator end, OutputIterator result,
+ UnaryOperation unary_op)
+ {
+ typedef std::iterator_traits iteratori_traits;
+ typedef std::iterator_traits iteratoro_traits;
+ typedef typename iteratori_traits::iterator_category iteratori_category;
+ typedef typename iteratoro_traits::iterator_category iteratoro_category;
+
+ return transform1_switch(begin, end, result, unary_op,
+ iteratori_category(), iteratoro_category());
}
+ // Sequential fallback
+ template
+ inline OutputIterator
+ transform(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ OutputIterator result, BinaryOperation binary_op,
+ __gnu_parallel::sequential_tag)
+ {
+ return _GLIBCXX_STD_P::transform(begin1, end1, begin2, result, binary_op);
+ }
+
// Parallel binary transform for random access iterators.
template
RandomAccessIterator3
- transform2_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator3 result, BinaryOperation binary_op, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ transform2_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator3 result, BinaryOperation binary_op, random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION((end1 - begin1) >= __gnu_parallel::Settings::transform_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
@@ -1008,36 +1119,44 @@ namespace __parallel
return functionality.finish_iterator;
}
else
- return transform(begin1, end1, begin2, result, binary_op, __gnu_parallel::sequential_tag());
+ return transform(begin1, end1, begin2, result, binary_op,
+ __gnu_parallel::sequential_tag());
}
// Sequential fallback for input iterator case.
- template
- inline RandomAccessIterator3
- transform2_switch(RandomAccessIterator1 begin1, RandomAccessIterator1 end1, RandomAccessIterator2 begin2, RandomAccessIterator3 result, BinaryOperation binary_op, tag1, tag2, tag3, __gnu_parallel::parallelism)
+ template
+ inline OutputIterator
+ transform2_switch(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, OutputIterator result,
+ BinaryOperation binary_op, tag1, tag2, tag3)
{
- return _GLIBCXX_STD_P::transform(begin1, end1, begin2, result, binary_op);
+ return transform(begin1, end1, begin2, result, binary_op,
+ __gnu_parallel::sequential_tag());
}
// Public interface.
- template
+ template
inline OutputIterator
- transform(InputIterator begin, InputIterator end, OutputIterator result,
- UnaryOperation unary_op, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ transform(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ OutputIterator result, BinaryOperation binary_op,
+ __gnu_parallel::parallelism parallelism_tag)
{
- typedef std::iterator_traits iteratori_traits;
+ typedef std::iterator_traits iteratori1_traits;
+ typedef typename iteratori1_traits::iterator_category iteratori1_category;
+ typedef std::iterator_traits iteratori2_traits;
+ typedef typename iteratori2_traits::iterator_category iteratori2_category;
typedef std::iterator_traits iteratoro_traits;
- typedef typename iteratori_traits::iterator_category iteratori_category;
typedef typename iteratoro_traits::iterator_category iteratoro_category;
- return transform1_switch(begin, end, result, unary_op,
- iteratori_category(), iteratoro_category(), parallelism_tag);
+ return transform2_switch(begin1, end1, begin2, result, binary_op,
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category(), parallelism_tag);
}
- // Public interface.
template
inline OutputIterator
- transform(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, OutputIterator result, BinaryOperation binary_op, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ transform(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ OutputIterator result, BinaryOperation binary_op)
{
typedef std::iterator_traits iteratori1_traits;
typedef typename iteratori1_traits::iterator_category iteratori1_category;
@@ -1046,54 +1165,87 @@ namespace __parallel
typedef std::iterator_traits iteratoro_traits;
typedef typename iteratoro_traits::iterator_category iteratoro_category;
-
return transform2_switch(begin1, end1, begin2, result, binary_op,
- iteratori1_category(), iteratori2_category(), iteratoro_category(), parallelism_tag);
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Sequential fallback
template
inline void
- replace(ForwardIterator begin, ForwardIterator end, const T& old_value, const T& new_value, __gnu_parallel::sequential_tag)
+ replace(ForwardIterator begin, ForwardIterator end, const T& old_value,
+ const T& new_value, __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::replace(begin, end, old_value, new_value); }
// Sequential fallback for input iterator case
template
void
- replace_switch(ForwardIterator begin, ForwardIterator end, const T& old_value, const T& new_value, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
- { replace(begin, end, old_value, new_value, __gnu_parallel::sequential_tag()); }
+ replace_switch(ForwardIterator begin, ForwardIterator end,
+ const T& old_value, const T& new_value, IteratorTag)
+ {
+ replace(begin, end, old_value, new_value,
+ __gnu_parallel::sequential_tag());
+ }
// Parallel replace for random access iterators
template
void
- replace_switch(RandomAccessIterator begin, RandomAccessIterator end, const T& old_value, const T& new_value, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
- { replace(begin, end, old_value, new_value, __gnu_parallel::sequential_tag()); }
+ replace_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ const T& old_value, const T& new_value,
+ random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
+ {
+ // XXX parallel version is where?
+ replace(begin, end, old_value, new_value,
+ __gnu_parallel::sequential_tag());
+ }
// Public interface
template
inline void
- replace(ForwardIterator begin, ForwardIterator end, const T& old_value, const T& new_value, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ replace(ForwardIterator begin, ForwardIterator end, const T& old_value,
+ const T& new_value, __gnu_parallel::parallelism parallelism_tag)
+ {
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ replace_switch(begin, end, old_value, new_value, iterator_category(),
+ parallelism_tag);
+ }
+
+ template
+ inline void
+ replace(ForwardIterator begin, ForwardIterator end, const T& old_value,
+ const T& new_value)
{
- replace_switch(begin, end, old_value, new_value, typename std::iterator_traits::iterator_category(), parallelism_tag);
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ replace_switch(begin, end, old_value, new_value, iterator_category());
}
// Sequential fallback
template
inline void
- replace_if(ForwardIterator begin, ForwardIterator end, Predicate pred, const T& new_value, __gnu_parallel::sequential_tag)
+ replace_if(ForwardIterator begin, ForwardIterator end, Predicate pred,
+ const T& new_value, __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::replace_if(begin, end, pred, new_value); }
// Sequential fallback for input iterator case
template
void
- replace_if_switch(ForwardIterator begin, ForwardIterator end, Predicate pred, const T& new_value, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
+ replace_if_switch(ForwardIterator begin, ForwardIterator end, Predicate pred,
+ const T& new_value, IteratorTag)
{ replace_if(begin, end, pred, new_value, __gnu_parallel::sequential_tag()); }
// Parallel algorithm for random access iterators.
template
void
- replace_if_switch(RandomAccessIterator begin, RandomAccessIterator end, Predicate pred, const T& new_value, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ replace_if_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ Predicate pred, const T& new_value,
+ random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::replace_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
@@ -1102,38 +1254,54 @@ namespace __parallel
__gnu_parallel::for_each_template_random_access(begin, end, pred, functionality, __gnu_parallel::dummy_reduct(), true, dummy, -1, parallelism_tag);
}
else
- replace_if(begin, end, pred, new_value, __gnu_parallel::sequential_tag());
+ replace_if(begin, end, pred, new_value,
+ __gnu_parallel::sequential_tag());
}
// Public interface.
template
inline void
replace_if(ForwardIterator begin, ForwardIterator end,
- Predicate pred, const T& new_value, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ Predicate pred, const T& new_value,
+ __gnu_parallel::parallelism parallelism_tag)
{
typedef std::iterator_traits iterator_traits;
typedef typename iterator_traits::iterator_category iterator_category;
+ replace_if_switch(begin, end, pred, new_value, iterator_category(),
+ parallelism_tag);
+ }
- replace_if_switch(begin, end, pred, new_value, iterator_category(), parallelism_tag);
+ template
+ inline void
+ replace_if(ForwardIterator begin, ForwardIterator end,
+ Predicate pred, const T& new_value)
+ {
+ typedef std::iterator_traits iterator_traits;
+ typedef typename iterator_traits::iterator_category iterator_category;
+ replace_if_switch(begin, end, pred, new_value, iterator_category());
}
// Sequential fallback
template
inline void
- generate(ForwardIterator begin, ForwardIterator end, Generator gen, __gnu_parallel::sequential_tag)
- { _GLIBCXX_STD_P::generate(begin, end, gen); }
+ generate(ForwardIterator begin, ForwardIterator end, Generator gen,
+ __gnu_parallel::sequential_tag)
+ { _GLIBCXX_STD_P::generate(begin, end, gen); }
// Sequential fallback for input iterator case.
template
void
- generate_switch(ForwardIterator begin, ForwardIterator end, Generator gen, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
+ generate_switch(ForwardIterator begin, ForwardIterator end, Generator gen,
+ IteratorTag)
{ generate(begin, end, gen, __gnu_parallel::sequential_tag()); }
// Parallel algorithm for random access iterators.
template
void
generate_switch(RandomAccessIterator begin, RandomAccessIterator end,
- Generator gen, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ Generator gen, random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::generate_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
@@ -1149,53 +1317,82 @@ namespace __parallel
template
inline void
generate(ForwardIterator begin, ForwardIterator end,
- Generator gen, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ Generator gen, __gnu_parallel::parallelism parallelism_tag)
{
typedef std::iterator_traits iterator_traits;
typedef typename iterator_traits::iterator_category iterator_category;
generate_switch(begin, end, gen, iterator_category(), parallelism_tag);
}
+ template
+ inline void
+ generate(ForwardIterator begin, ForwardIterator end, Generator gen)
+ {
+ typedef std::iterator_traits iterator_traits;
+ typedef typename iterator_traits::iterator_category iterator_category;
+ generate_switch(begin, end, gen, iterator_category());
+ }
+
// Sequential fallback.
template
inline OutputIterator
- generate_n(OutputIterator begin, Size n, Generator gen, __gnu_parallel::sequential_tag)
+ generate_n(OutputIterator begin, Size n, Generator gen,
+ __gnu_parallel::sequential_tag)
{ return _GLIBCXX_STD_P::generate_n(begin, n, gen); }
// Sequential fallback for input iterator case.
template
OutputIterator
- generate_n_switch(OutputIterator begin, Size n, Generator gen, IteratorTag, __gnu_parallel::parallelism)
+ generate_n_switch(OutputIterator begin, Size n, Generator gen, IteratorTag)
{ return generate_n(begin, n, gen, __gnu_parallel::sequential_tag()); }
// Parallel algorithm for random access iterators.
template
RandomAccessIterator
- generate_n_switch(RandomAccessIterator begin, Size n, Generator gen, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
- { return generate_n(begin, n, gen, __gnu_parallel::sequential_tag()); }
+ generate_n_switch(RandomAccessIterator begin, Size n, Generator gen,
+ random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
+ {
+ // XXX parallel version is where?
+ return generate_n(begin, n, gen, __gnu_parallel::sequential_tag());
+ }
// Public interface.
template
inline OutputIterator
- generate_n(OutputIterator begin, Size n, Generator gen, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+ generate_n(OutputIterator begin, Size n, Generator gen,
+ __gnu_parallel::parallelism parallelism_tag)
+ {
+ typedef std::iterator_traits iterator_traits;
+ typedef typename iterator_traits::iterator_category iterator_category;
+ return generate_n_switch(begin, n, gen, iterator_category(),
+ parallelism_tag);
+ }
+
+ template
+ inline OutputIterator
+ generate_n(OutputIterator begin, Size n, Generator gen)
{
typedef std::iterator_traits iterator_traits;
typedef typename iterator_traits::iterator_category iterator_category;
- return generate_n_switch(begin, n, gen, iterator_category(), parallelism_tag);
+ return generate_n_switch(begin, n, gen, iterator_category());
}
// Sequential fallback.
template
inline void
- random_shuffle(RandomAccessIterator begin, RandomAccessIterator end, __gnu_parallel::sequential_tag)
+ random_shuffle(RandomAccessIterator begin, RandomAccessIterator end,
+ __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::random_shuffle(begin, end); }
// Sequential fallback.
template
inline void
- random_shuffle(RandomAccessIterator begin, RandomAccessIterator end, RandomNumberGenerator& rand, __gnu_parallel::sequential_tag)
+ random_shuffle(RandomAccessIterator begin, RandomAccessIterator end,
+ RandomNumberGenerator& rand, __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::random_shuffle(begin, end, rand); }
@@ -1220,7 +1417,8 @@ namespace __parallel
// Parallel algorithm for random access iterators.
template
void
- random_shuffle(RandomAccessIterator begin, RandomAccessIterator end, RandomNumberGenerator& rand)
+ random_shuffle(RandomAccessIterator begin, RandomAccessIterator end,
+ RandomNumberGenerator& rand)
{
if (begin == end)
return;
@@ -1262,19 +1460,23 @@ namespace __parallel
inline ForwardIterator
partition(ForwardIterator begin, ForwardIterator end, Predicate pred)
{
- return partition_switch(begin, end, pred, typename std::iterator_traits::iterator_category());
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::iterator_category iterator_category;
+ return partition_switch(begin, end, pred, iterator_category());
}
// Sequential fallback
template
inline void
- sort(RandomAccessIterator begin, RandomAccessIterator end, __gnu_parallel::sequential_tag)
- { _GLIBCXX_STD_P::sort(begin, end); }
+ sort(RandomAccessIterator begin, RandomAccessIterator end,
+ __gnu_parallel::sequential_tag)
+ { _GLIBCXX_STD_P::sort(begin, end); }
// Sequential fallback
template
inline void
- sort(RandomAccessIterator begin, RandomAccessIterator end, Comparator comp, __gnu_parallel::sequential_tag)
+ sort(RandomAccessIterator begin, RandomAccessIterator end, Comparator comp,
+ __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::sort(begin, end, comp); }
// Public interface, insert default comparator
@@ -1299,25 +1501,23 @@ namespace __parallel
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::sort_minimal_n))
__gnu_parallel::parallel_sort(begin, end, comp, false);
else
- sort(begin, end, comp, __gnu_parallel::sequential_tag());
+ sort(begin, end, comp, __gnu_parallel::sequential_tag());
}
}
// Sequential fallback.
template
inline void
- stable_sort(RandomAccessIterator begin, RandomAccessIterator end, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::stable_sort(begin, end);
- }
+ stable_sort(RandomAccessIterator begin, RandomAccessIterator end,
+ __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::stable_sort(begin, end); }
// Sequential fallback.
template
inline void
- stable_sort(RandomAccessIterator begin, RandomAccessIterator end, Comparator comp, __gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::stable_sort(begin, end, comp);
- }
+ stable_sort(RandomAccessIterator begin, RandomAccessIterator end,
+ Comparator comp, __gnu_parallel::sequential_tag)
+ { return _GLIBCXX_STD_P::stable_sort(begin, end, comp); }
template
void
@@ -1325,65 +1525,69 @@ namespace __parallel
{
typedef iterator_traits traits_type;
typedef typename traits_type::value_type value_type;
-
stable_sort(begin, end, std::less());
}
// Parallel algorithm for random access iterators
template
void
- stable_sort(RandomAccessIterator begin, RandomAccessIterator end, Comparator comp)
+ stable_sort(RandomAccessIterator begin, RandomAccessIterator end,
+ Comparator comp)
{
if (begin != end)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::sort_minimal_n))
__gnu_parallel::parallel_sort(begin, end, comp, true);
else
- stable_sort(begin, end, comp, __gnu_parallel::sequential_tag());
+ stable_sort(begin, end, comp, __gnu_parallel::sequential_tag());
}
}
// Sequential fallback
template
inline OutputIterator
- merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result,
+ merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ InputIterator2 end2, OutputIterator result,
__gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result);
- }
+ { return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result); }
// Sequential fallback
template
inline OutputIterator
- merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result, Comparator comp,
+ merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ InputIterator2 end2, OutputIterator result, Comparator comp,
__gnu_parallel::sequential_tag)
- {
- return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result, comp);
- }
+ { return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result, comp); }
// Sequential fallback for input iterator case
template
inline OutputIterator
merge_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result, Comparator comp, IteratorTag1, IteratorTag2, IteratorTag3)
- {
- return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result, comp);
- }
+ { return _GLIBCXX_STD_P::merge(begin1, end1, begin2, end2, result, comp); }
// Parallel algorithm for random access iterators
template
OutputIterator
- merge_switch(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result, Comparator comp, random_access_iterator_tag, random_access_iterator_tag, random_access_iterator_tag)
+ merge_switch(InputIterator1 begin1, InputIterator1 end1,
+ InputIterator2 begin2, InputIterator2 end2,
+ OutputIterator result, Comparator comp,
+ random_access_iterator_tag, random_access_iterator_tag,
+ random_access_iterator_tag)
{
if (_GLIBCXX_PARALLEL_CONDITION((static_cast<__gnu_parallel::sequence_index_t>(end1 - begin1) >= __gnu_parallel::Settings::merge_minimal_n || static_cast<__gnu_parallel::sequence_index_t>(end2 - begin2) >= __gnu_parallel::Settings::merge_minimal_n)))
- return __gnu_parallel::parallel_merge_advance(begin1, end1, begin2, end2, result, (end1 - begin1) + (end2 - begin2), comp);
+ return __gnu_parallel::parallel_merge_advance(begin1, end1, begin2, end2,
+ result, (end1 - begin1) + (end2 - begin2), comp);
else
- return __gnu_parallel::merge_advance(begin1, end1, begin2, end2, result, (end1 - begin1) + (end2 - begin2), comp);
+ return __gnu_parallel::merge_advance(begin1, end1, begin2, end2, result,
+ (end1 - begin1) + (end2 - begin2),
+ comp);
}
// Public interface
template
inline OutputIterator
- merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result, Comparator comp)
+ merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ InputIterator2 end2, OutputIterator result, Comparator comp)
{
typedef typename iterator_traits::value_type value_type;
@@ -1394,39 +1598,47 @@ namespace __parallel
typedef typename iteratori2_traits::iterator_category iteratori2_category;
typedef typename iteratoro_traits::iterator_category iteratoro_category;
- return merge_switch(begin1, end1, begin2, end2, result, comp, iteratori1_category(), iteratori2_category(), iteratoro_category());
+ return merge_switch(begin1, end1, begin2, end2, result, comp,
+ iteratori1_category(), iteratori2_category(),
+ iteratoro_category());
}
// Public interface, insert default comparator
template
inline OutputIterator
- merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator result)
+ merge(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2,
+ InputIterator2 end2, OutputIterator result)
{
typedef std::iterator_traits iterator1_traits;
typedef std::iterator_traits iterator2_traits;
typedef typename iterator1_traits::value_type value1_type;
typedef typename iterator2_traits::value_type value2_type;
- return merge(begin1, end1, begin2, end2, result, __gnu_parallel::less());
+ return merge(begin1, end1, begin2, end2, result,
+ __gnu_parallel::less());
}
// Sequential fallback
template
inline void
- nth_element(RandomAccessIterator begin, RandomAccessIterator nth, RandomAccessIterator end, __gnu_parallel::sequential_tag)
+ nth_element(RandomAccessIterator begin, RandomAccessIterator nth,
+ RandomAccessIterator end, __gnu_parallel::sequential_tag)
{ return _GLIBCXX_STD_P::nth_element(begin, nth, end); }
// Sequential fallback
template
void
- nth_element(RandomAccessIterator begin, RandomAccessIterator nth, RandomAccessIterator end, Comparator comp, __gnu_parallel::sequential_tag)
+ nth_element(RandomAccessIterator begin, RandomAccessIterator nth,
+ RandomAccessIterator end, Comparator comp,
+ __gnu_parallel::sequential_tag)
{ return _GLIBCXX_STD_P::nth_element(begin, nth, end, comp); }
// Public interface
template
inline void
- nth_element(RandomAccessIterator begin, RandomAccessIterator nth, RandomAccessIterator end, Comparator comp)
+ nth_element(RandomAccessIterator begin, RandomAccessIterator nth,
+ RandomAccessIterator end, Comparator comp)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::nth_element_minimal_n))
__gnu_parallel::parallel_nth_element(begin, nth, end, comp);
@@ -1437,28 +1649,34 @@ namespace __parallel
// Public interface, insert default comparator
template
void
- nth_element(RandomAccessIterator begin, RandomAccessIterator nth, RandomAccessIterator end)
+ nth_element(RandomAccessIterator begin, RandomAccessIterator nth,
+ RandomAccessIterator end)
{
- typedef typename iterator_traits::value_type value_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
nth_element(begin, nth, end, std::less());
}
// Sequential fallback
- template
+ template
void
- partial_sort(_RandomAccessIterator begin, _RandomAccessIterator middle, _RandomAccessIterator end, _Compare comp, __gnu_parallel::sequential_tag)
+ partial_sort(RandomAccessIterator begin, RandomAccessIterator middle,
+ RandomAccessIterator end, _Compare comp,
+ __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::partial_sort(begin, middle, end, comp); }
// Sequential fallback
- template
+ template
void
- partial_sort(_RandomAccessIterator begin, _RandomAccessIterator middle, _RandomAccessIterator end, __gnu_parallel::sequential_tag)
+ partial_sort(RandomAccessIterator begin, RandomAccessIterator middle,
+ RandomAccessIterator end, __gnu_parallel::sequential_tag)
{ _GLIBCXX_STD_P::partial_sort(begin, middle, end); }
// Public interface, parallel algorithm for random access iterators
- template
+ template
void
- partial_sort(_RandomAccessIterator begin, _RandomAccessIterator middle, _RandomAccessIterator end, _Compare comp)
+ partial_sort(RandomAccessIterator begin, RandomAccessIterator middle,
+ RandomAccessIterator end, _Compare comp)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::partial_sort_minimal_n))
__gnu_parallel::parallel_partial_sort(begin, middle, end, comp);
@@ -1467,44 +1685,44 @@ namespace __parallel
}
// Public interface, insert default comparator
- template
+ template
void
- partial_sort(_RandomAccessIterator begin, _RandomAccessIterator middle, _RandomAccessIterator end)
+ partial_sort(RandomAccessIterator begin, RandomAccessIterator middle,
+ RandomAccessIterator end)
{
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
+ typedef iterator_traits traits_type;
+ typedef typename traits_type::value_type value_type;
partial_sort(begin, middle, end, std::less());
}
// Sequential fallback
template
inline ForwardIterator
- max_element(ForwardIterator begin, ForwardIterator end, __gnu_parallel::sequential_tag)
+ max_element(ForwardIterator begin, ForwardIterator end,
+ __gnu_parallel::sequential_tag)
{ return _GLIBCXX_STD_P::max_element(begin, end); }
// Sequential fallback
template
inline ForwardIterator
- max_element(ForwardIterator begin, ForwardIterator end, Comparator comp, __gnu_parallel::sequential_tag)
+ max_element(ForwardIterator begin, ForwardIterator end, Comparator comp,
+ __gnu_parallel::sequential_tag)
{ return _GLIBCXX_STD_P::max_element(begin, end, comp); }
// Sequential fallback for input iterator case
template
ForwardIterator
- max_element_switch(ForwardIterator begin, ForwardIterator end, Comparator comp, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
+ max_element_switch(ForwardIterator begin, ForwardIterator end,
+ Comparator comp, IteratorTag)
{ return max_element(begin, end, comp, __gnu_parallel::sequential_tag()); }
- // Public interface, insert default comparator
- template
- inline ForwardIterator
- max_element(ForwardIterator begin, ForwardIterator end, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
- {
- typedef typename iterator_traits::value_type value_type;
- return max_element(begin, end, std::less(), parallelism_tag);
- }
-
+ // Parallel algorithm for random access iterators
template
RandomAccessIterator
- max_element_switch(RandomAccessIterator begin, RandomAccessIterator end, Comparator comp, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+ max_element_switch(RandomAccessIterator begin, RandomAccessIterator end,
+ Comparator comp, random_access_iterator_tag,
+ __gnu_parallel::parallelism parallelism_tag
+ = __gnu_parallel::parallel_balanced)
{
if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::max_element_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
{
@@ -1514,49 +1732,78 @@ namespace __parallel
return res;
}
else
- return max_element(begin, end, __gnu_parallel::sequential_tag());
+ return max_element(begin, end, comp, __gnu_parallel::sequential_tag());
+ }
+
+ // Public interface, insert default comparator
+ template
+ inline ForwardIterator
+ max_element(ForwardIterator begin, ForwardIterator end,
+ __gnu_parallel::parallelism parallelism_tag)
+ {
+ typedef typename iterator_traits::value_type value_type;
+ return max_element(begin, end, std::less