summaryrefslogtreecommitdiff
path: root/pstl/include/pstl/internal/glue_algorithm_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'pstl/include/pstl/internal/glue_algorithm_impl.h')
-rw-r--r--pstl/include/pstl/internal/glue_algorithm_impl.h545
1 files changed, 243 insertions, 302 deletions
diff --git a/pstl/include/pstl/internal/glue_algorithm_impl.h b/pstl/include/pstl/internal/glue_algorithm_impl.h
index 9b4c56c6f755..fb0c19d77665 100644
--- a/pstl/include/pstl/internal/glue_algorithm_impl.h
+++ b/pstl/include/pstl/internal/glue_algorithm_impl.h
@@ -32,10 +32,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
any_of(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
{
- return __pstl::__internal::__pattern_any_of(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_any_of(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __pred);
}
// [alg.all_of]
@@ -62,20 +62,19 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Function>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
for_each(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Function __f)
{
- __pstl::__internal::__pattern_walk1(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __f,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_walk1(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last, __f);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Function>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
for_each_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n, _Function __f)
{
- return __pstl::__internal::__pattern_walk1_n(
- std::forward<_ExecutionPolicy>(__exec), __first, __n, __f,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_walk1_n(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __n,
+ __f);
}
// [alg.find]
@@ -84,10 +83,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
find_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
{
- return __pstl::__internal::__pattern_find_if(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_find_if(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
@@ -111,12 +110,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
find_end(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
_ForwardIterator2 __s_last, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_find_end(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __s_first, __s_last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __s_first);
+
+ return __pstl::__internal::__pattern_find_end(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __s_first, __s_last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -134,12 +131,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
find_first_of(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
_ForwardIterator2 __s_first, _ForwardIterator2 __s_last, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_find_first_of(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __s_first, __s_last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __s_first);
+
+ return __pstl::__internal::__pattern_find_first_of(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __s_first, __s_last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -156,23 +151,20 @@ template <class _ExecutionPolicy, class _ForwardIterator>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
adjacent_find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
{
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
- return __pstl::__internal::__pattern_adjacent_find(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, std::equal_to<_ValueType>(),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- /*first_semantic*/ false);
+ return __pstl::__internal::__pattern_adjacent_find(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, std::equal_to<_ValueType>(), /*first_semantic*/ false);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
adjacent_find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_adjacent_find(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- /*first_semantic*/ false);
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_adjacent_find(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pred, /*first_semantic*/ false);
}
// [alg.count]
@@ -185,12 +177,11 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
typename iterator_traits<_ForwardIterator>::difference_type>
count(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
{
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
- return __pstl::__internal::__pattern_count(
- std::forward<_ExecutionPolicy>(__exec), __first, __last,
- [&__value](const _ValueType& __x) { return __value == __x; },
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ return __pstl::__internal::__pattern_count(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ [&__value](const _ValueType& __x) { return __value == __x; });
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
@@ -198,10 +189,9 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
typename iterator_traits<_ForwardIterator>::difference_type>
count_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
{
- return __pstl::__internal::__pattern_count(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_count(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __pred);
}
// [alg.search]
@@ -211,12 +201,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
search(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
_ForwardIterator2 __s_last, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_search(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __s_first, __s_last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __s_first);
+
+ return __pstl::__internal::__pattern_search(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __s_first, __s_last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -232,10 +220,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
search_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Size __count,
const _Tp& __value, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_search_n(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __count, __value, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_search_n(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __count, __value, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
@@ -253,34 +241,28 @@ template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterato
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result)
{
- const auto __is_vector =
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec);
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ using __is_vector = typename decltype(__dispatch_tag)::__is_vector;
return __pstl::__internal::__pattern_walk2_brick(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
- [__is_vector](_ForwardIterator1 __begin, _ForwardIterator1 __end, _ForwardIterator2 __res) {
- return __pstl::__internal::__brick_copy(__begin, __end, __res, __is_vector);
- },
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
+ [](_ForwardIterator1 __begin, _ForwardIterator1 __end, _ForwardIterator2 __res)
+ { return __pstl::__internal::__brick_copy(__begin, __end, __res, __is_vector{}); });
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
copy_n(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result)
{
- const auto __is_vector =
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec);
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ using __is_vector = typename decltype(__dispatch_tag)::__is_vector;
return __pstl::__internal::__pattern_walk2_brick_n(
- std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
- [__is_vector](_ForwardIterator1 __begin, _Size __sz, _ForwardIterator2 __res) {
- return __pstl::__internal::__brick_copy_n(__begin, __sz, __res, __is_vector);
- },
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
+ [](_ForwardIterator1 __begin, _Size __sz, _ForwardIterator2 __res)
+ { return __pstl::__internal::__brick_copy_n(__begin, __sz, __res, __is_vector{}); });
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
@@ -288,12 +270,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
_Predicate __pred)
{
- return __pstl::__internal::__pattern_copy_if(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ return __pstl::__internal::__pattern_copy_if(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __result, __pred);
}
// [alg.swap]
@@ -305,16 +285,16 @@ swap_ranges(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardItera
{
typedef typename iterator_traits<_ForwardIterator1>::reference _ReferenceType1;
typedef typename iterator_traits<_ForwardIterator2>::reference _ReferenceType2;
- return __pstl::__internal::__pattern_walk2(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2,
- [](_ReferenceType1 __x, _ReferenceType2 __y) {
- using std::swap;
- swap(__x, __y);
- },
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_walk2(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2,
+ [](_ReferenceType1 __x, _ReferenceType2 __y)
+ {
+ using std::swap;
+ swap(__x, __y);
+ });
}
// [alg.transform]
@@ -326,13 +306,12 @@ transform(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator
{
typedef typename iterator_traits<_ForwardIterator1>::reference _InputType;
typedef typename iterator_traits<_ForwardIterator2>::reference _OutputType;
- return __pstl::__internal::__pattern_walk2(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
- [__op](_InputType __x, _OutputType __y) mutable { __y = __op(__x); },
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ return __pstl::__internal::__pattern_walk2(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __result,
+ [__op](_InputType __x, _OutputType __y) mutable { __y = __op(__x); });
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
@@ -344,13 +323,12 @@ transform(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterato
typedef typename iterator_traits<_ForwardIterator1>::reference _Input1Type;
typedef typename iterator_traits<_ForwardIterator2>::reference _Input2Type;
typedef typename iterator_traits<_ForwardIterator>::reference _OutputType;
+
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __result);
+
return __pstl::__internal::__pattern_walk3(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __result,
- [__op](_Input1Type x, _Input2Type y, _OutputType z) mutable { z = __op(x, y); },
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __result,
+ [__op](_Input1Type x, _Input2Type y, _OutputType z) mutable { z = __op(x, y); });
}
// [alg.replace]
@@ -361,16 +339,17 @@ replace_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator
const _Tp& __new_value)
{
typedef typename iterator_traits<_ForwardIterator>::reference _ElementType;
- __pstl::__internal::__pattern_walk1(
- std::forward<_ExecutionPolicy>(__exec), __first, __last,
- [&__pred, &__new_value](_ElementType __elem) {
- if (__pred(__elem))
- {
- __elem = __new_value;
- }
- },
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_walk1(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ [&__pred, &__new_value](_ElementType __elem)
+ {
+ if (__pred(__elem))
+ {
+ __elem = __new_value;
+ }
+ });
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
@@ -389,13 +368,12 @@ replace_copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIt
{
typedef typename iterator_traits<_ForwardIterator1>::reference _InputType;
typedef typename iterator_traits<_ForwardIterator2>::reference _OutputType;
+
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
return __pstl::__internal::__pattern_walk2(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
- [__pred, &__new_value](_InputType __x, _OutputType __y) mutable { __y = __pred(__x) ? __new_value : __x; },
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
+ [__pred, &__new_value](_InputType __x, _OutputType __y) mutable { __y = __pred(__x) ? __new_value : __x; });
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
@@ -413,10 +391,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
{
- __pstl::__internal::__pattern_fill(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __value,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_fill(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __value);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
@@ -426,10 +404,10 @@ fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __count, const
if (__count <= 0)
return __first;
- return __pstl::__internal::__pattern_fill_n(
- std::forward<_ExecutionPolicy>(__exec), __first, __count, __value,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_fill_n(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __count, __value);
}
// [alg.generate]
@@ -437,10 +415,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Generator>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
generate(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Generator __g)
{
- __pstl::__internal::__pattern_generate(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __g,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_generate(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __g);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Generator>
@@ -450,10 +428,10 @@ generate_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __count, _
if (__count <= 0)
return __first;
- return __pstl::__internal::__pattern_generate_n(
- std::forward<_ExecutionPolicy>(__exec), __first, __count, __g,
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_generate_n(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __count, __g);
}
// [alg.remove]
@@ -479,10 +457,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
remove_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred)
{
- return __pstl::__internal::__pattern_remove_if(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_remove_if(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
@@ -499,10 +477,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
unique(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_unique(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_unique(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator>
@@ -517,12 +495,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
unique_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
_BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_unique_copy(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ return __pstl::__internal::__pattern_unique_copy(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __result, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -538,10 +514,9 @@ template <class _ExecutionPolicy, class _BidirectionalIterator>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
reverse(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last)
{
- __pstl::__internal::__pattern_reverse(
- std::forward<_ExecutionPolicy>(__exec), __first, __last,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_reverse(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last);
}
template <class _ExecutionPolicy, class _BidirectionalIterator, class _ForwardIterator>
@@ -549,12 +524,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
reverse_copy(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last,
_ForwardIterator __d_first)
{
- return __pstl::__internal::__pattern_reverse_copy(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _BidirectionalIterator, _ForwardIterator>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _BidirectionalIterator, _ForwardIterator>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __d_first);
+
+ return __pstl::__internal::__pattern_reverse_copy(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __d_first);
}
// [alg.rotate]
@@ -563,10 +536,10 @@ template <class _ExecutionPolicy, class _ForwardIterator>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
rotate(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
{
- return __pstl::__internal::__pattern_rotate(
- std::forward<_ExecutionPolicy>(__exec), __first, __middle, __last,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_rotate(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __middle, __last);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -574,12 +547,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
rotate_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __middle, _ForwardIterator1 __last,
_ForwardIterator2 __result)
{
- return __pstl::__internal::__pattern_rotate_copy(
- std::forward<_ExecutionPolicy>(__exec), __first, __middle, __last, __result,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __result);
+
+ return __pstl::__internal::__pattern_rotate_copy(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __middle, __last, __result);
}
// [alg.partitions]
@@ -588,20 +559,19 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
is_partitioned(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred)
{
- return __pstl::__internal::__pattern_is_partitioned(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_is_partitioned(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
partition(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred)
{
- return __pstl::__internal::__pattern_partition(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_partition(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pred);
}
template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate>
@@ -609,10 +579,9 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Bidirectiona
stable_partition(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last,
_UnaryPredicate __pred)
{
- return __pstl::__internal::__pattern_stable_partition(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_stable_partition(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
+ __first, __last, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _ForwardIterator1, class _ForwardIterator2,
@@ -621,12 +590,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_Fo
partition_copy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
_ForwardIterator1 __out_true, _ForwardIterator2 __out_false, _UnaryPredicate __pred)
{
- return __pstl::__internal::__pattern_partition_copy(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __out_true, __out_false, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator, _ForwardIterator1,
- _ForwardIterator2>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator, _ForwardIterator1,
- _ForwardIterator2>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __out_true, __out_false);
+
+ return __pstl::__internal::__pattern_partition_copy(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __out_true, __out_false, __pred);
}
// [alg.sort]
@@ -635,12 +602,11 @@ template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
{
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
typedef typename iterator_traits<_RandomAccessIterator>::value_type _InputType;
- return __pstl::__internal::__pattern_sort(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- typename std::is_move_constructible<_InputType>::type());
+ return __pstl::__internal::__pattern_sort(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
+ __comp, typename std::is_move_constructible<_InputType>::type());
}
template <class _ExecutionPolicy, class _RandomAccessIterator>
@@ -657,10 +623,10 @@ template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
stable_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
{
- return __pstl::__internal::__pattern_stable_sort(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_stable_sort(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __comp);
}
template <class _ExecutionPolicy, class _RandomAccessIterator>
@@ -678,12 +644,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_Fo
mismatch(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2, _BinaryPredicate __pred)
{
- return __pstl::__internal::__pattern_mismatch(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __pred,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_mismatch(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __last2, __pred);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
@@ -720,10 +684,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_BinaryPredicate __p)
{
- return __pstl::__internal::__pattern_equal(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __p,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_equal(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __p);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -738,10 +702,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2, _BinaryPredicate __p)
{
- return __pstl::__internal::__pattern_equal(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __p,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_equal(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __last2, __p);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -757,17 +721,14 @@ template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterato
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
move(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __d_first)
{
- const auto __is_vector =
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec);
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __d_first);
+
+ using __is_vector = typename decltype(__dispatch_tag)::__is_vector;
return __pstl::__internal::__pattern_walk2_brick(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first,
- [__is_vector](_ForwardIterator1 __begin, _ForwardIterator1 __end, _ForwardIterator2 __res) {
- return __pstl::__internal::__brick_move(__begin, __end, __res, __is_vector);
- },
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first,
+ [](_ForwardIterator1 __begin, _ForwardIterator1 __end, _ForwardIterator2 __res)
+ { return __pstl::__internal::__brick_move(__begin, __end, __res, __is_vector{}); });
}
// [partial.sort]
@@ -777,10 +738,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
partial_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __middle,
_RandomAccessIterator __last, _Compare __comp)
{
- __pstl::__internal::__pattern_partial_sort(
- std::forward<_ExecutionPolicy>(__exec), __first, __middle, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_partial_sort(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __middle, __last, __comp);
}
template <class _ExecutionPolicy, class _RandomAccessIterator>
@@ -799,12 +760,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccess
partial_sort_copy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
_RandomAccessIterator __d_first, _RandomAccessIterator __d_last, _Compare __comp)
{
- return __pstl::__internal::__pattern_partial_sort_copy(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first, __d_last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator, _RandomAccessIterator>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator, _RandomAccessIterator>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first, __d_first);
+
+ return __pstl::__internal::__pattern_partial_sort_copy(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
+ __first, __last, __d_first, __d_last, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator>
@@ -821,11 +780,11 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
is_sorted_until(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
{
- const _ForwardIterator __res = __pstl::__internal::__pattern_adjacent_find(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __pstl::__internal::__reorder_pred<_Compare>(__comp),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- /*first_semantic*/ false);
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ const _ForwardIterator __res =
+ __pstl::__internal::__pattern_adjacent_find(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pstl::__internal::__reorder_pred<_Compare>(__comp),
+ /*first_semantic*/ false);
return __res == __last ? __last : std::next(__res);
}
@@ -841,12 +800,10 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
is_sorted(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
{
- return __pstl::__internal::__pattern_adjacent_find(
- std::forward<_ExecutionPolicy>(__exec), __first, __last,
- __pstl::__internal::__reorder_pred<_Compare>(__comp),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- /*or_semantic*/ true) == __last;
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_adjacent_find(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __pstl::__internal::__reorder_pred<_Compare>(__comp),
+ /*or_semantic*/ true) == __last;
}
template <class _ExecutionPolicy, class _ForwardIterator>
@@ -864,12 +821,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
merge(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2, _ForwardIterator __d_first, _Compare __comp)
{
- return __pstl::__internal::__pattern_merge(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __d_first, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __d_first);
+
+ return __pstl::__internal::__pattern_merge(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __last2, __d_first, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
@@ -886,10 +841,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
inplace_merge(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __middle,
_BidirectionalIterator __last, _Compare __comp)
{
- __pstl::__internal::__pattern_inplace_merge(
- std::forward<_ExecutionPolicy>(__exec), __first, __middle, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _BidirectionalIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_inplace_merge(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __middle, __last, __comp);
}
template <class _ExecutionPolicy, class _BidirectionalIterator>
@@ -908,12 +863,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
includes(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2, _Compare __comp)
{
- return __pstl::__internal::__pattern_includes(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_includes(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __last2, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
@@ -932,12 +885,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
set_union(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
_ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp)
{
- return __pstl::__internal::__pattern_set_union(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __result, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __result);
+
+ return __pstl::__internal::__pattern_set_union(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1,
+ __last1, __first2, __last2, __result, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
@@ -957,12 +908,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
set_intersection(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp)
{
- return __pstl::__internal::__pattern_set_intersection(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __result, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __result);
+
+ return __pstl::__internal::__pattern_set_intersection(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
+ __first1, __last1, __first2, __last2, __result, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
@@ -982,12 +931,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardItera
set_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp)
{
- return __pstl::__internal::__pattern_set_difference(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __result, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __result);
+
+ return __pstl::__internal::__pattern_set_difference(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
+ __first1, __last1, __first2, __last2, __result, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
@@ -1008,12 +955,10 @@ set_symmetric_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1,
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result,
_Compare __comp)
{
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2, __result);
+
return __pstl::__internal::__pattern_set_symmetric_difference(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __result, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2,
- _ForwardIterator>(__exec));
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __result, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
@@ -1030,10 +975,10 @@ template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
is_heap_until(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
{
- return __pstl::__internal::__pattern_is_heap_until(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ return __pstl::__internal::__pattern_is_heap_until(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __comp);
}
template <class _ExecutionPolicy, class _RandomAccessIterator>
@@ -1065,10 +1010,9 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
min_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
{
- return __pstl::__internal::__pattern_min_element(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_min_element(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator>
@@ -1100,10 +1044,9 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator, _ForwardIterator>>
minmax_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
{
- return __pstl::__internal::__pattern_minmax_element(
- std::forward<_ExecutionPolicy>(__exec), __first, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+ return __pstl::__internal::__pattern_minmax_element(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first,
+ __last, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator>
@@ -1121,10 +1064,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
nth_element(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __nth,
_RandomAccessIterator __last, _Compare __comp)
{
- __pstl::__internal::__pattern_nth_element(
- std::forward<_ExecutionPolicy>(__exec), __first, __nth, __last, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _RandomAccessIterator>(__exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first);
+
+ __pstl::__internal::__pattern_nth_element(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), __first, __nth,
+ __last, __comp);
}
template <class _ExecutionPolicy, class _RandomAccessIterator>
@@ -1143,12 +1086,10 @@ __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
lexicographical_compare(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _Compare __comp)
{
- return __pstl::__internal::__pattern_lexicographical_compare(
- std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __last2, __comp,
- __pstl::__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec),
- __pstl::__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(
- __exec));
+ auto __dispatch_tag = __pstl::__internal::__select_backend(__exec, __first1, __first2);
+
+ return __pstl::__internal::__pattern_lexicographical_compare(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
+ __first1, __last1, __first2, __last2, __comp);
}
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>