forked from OSchip/llvm-project
[pstl] Uglify internal names of the library
llvm-svn: 357203
This commit is contained in:
parent
66b5e322fc
commit
0408a7892e
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -149,13 +149,13 @@ constexpr bool is_execution_policy_v = is_execution_policy<T>::value;
|
|||
} // namespace v1
|
||||
} // namespace execution
|
||||
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
template <class ExecPolicy, class T>
|
||||
using enable_if_execution_policy =
|
||||
using __enable_if_execution_policy =
|
||||
typename std::enable_if<__pstl::execution::is_execution_policy<typename std::decay<ExecPolicy>::type>::value,
|
||||
T>::type;
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
|
||||
} // namespace __pstl
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
using namespace __pstl::execution;
|
||||
|
@ -25,54 +25,54 @@ using namespace __pstl::execution;
|
|||
/* predicate */
|
||||
|
||||
template <typename _Tp>
|
||||
std::false_type lazy_and(_Tp, std::false_type)
|
||||
std::false_type __lazy_and(_Tp, std::false_type)
|
||||
{
|
||||
return std::false_type{};
|
||||
};
|
||||
|
||||
template <typename _Tp>
|
||||
inline _Tp
|
||||
lazy_and(_Tp __a, std::true_type)
|
||||
__lazy_and(_Tp __a, std::true_type)
|
||||
{
|
||||
return __a;
|
||||
}
|
||||
|
||||
template <typename _Tp>
|
||||
std::true_type lazy_or(_Tp, std::true_type)
|
||||
std::true_type __lazy_or(_Tp, std::true_type)
|
||||
{
|
||||
return std::true_type{};
|
||||
};
|
||||
|
||||
template <typename _Tp>
|
||||
inline _Tp
|
||||
lazy_or(_Tp __a, std::false_type)
|
||||
__lazy_or(_Tp __a, std::false_type)
|
||||
{
|
||||
return __a;
|
||||
}
|
||||
|
||||
/* iterator */
|
||||
template <typename _IteratorType, typename... _OtherIteratorTypes>
|
||||
struct is_random_access_iterator
|
||||
struct __is_random_access_iterator
|
||||
{
|
||||
static constexpr bool value =
|
||||
is_random_access_iterator<_IteratorType>::value && is_random_access_iterator<_OtherIteratorTypes...>::value;
|
||||
__is_random_access_iterator<_IteratorType>::value && __is_random_access_iterator<_OtherIteratorTypes...>::value;
|
||||
typedef std::integral_constant<bool, value> type;
|
||||
};
|
||||
|
||||
template <typename _IteratorType>
|
||||
struct is_random_access_iterator<_IteratorType>
|
||||
struct __is_random_access_iterator<_IteratorType>
|
||||
: std::is_same<typename std::iterator_traits<_IteratorType>::iterator_category, std::random_access_iterator_tag>
|
||||
{
|
||||
};
|
||||
|
||||
/* policy */
|
||||
template <typename Policy>
|
||||
struct policy_traits
|
||||
struct __policy_traits
|
||||
{
|
||||
};
|
||||
|
||||
template <>
|
||||
struct policy_traits<sequenced_policy>
|
||||
struct __policy_traits<sequenced_policy>
|
||||
{
|
||||
typedef std::false_type allow_parallel;
|
||||
typedef std::false_type allow_unsequenced;
|
||||
|
@ -80,7 +80,7 @@ struct policy_traits<sequenced_policy>
|
|||
};
|
||||
|
||||
template <>
|
||||
struct policy_traits<unsequenced_policy>
|
||||
struct __policy_traits<unsequenced_policy>
|
||||
{
|
||||
typedef std::false_type allow_parallel;
|
||||
typedef std::true_type allow_unsequenced;
|
||||
|
@ -89,7 +89,7 @@ struct policy_traits<unsequenced_policy>
|
|||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <>
|
||||
struct policy_traits<parallel_policy>
|
||||
struct __policy_traits<parallel_policy>
|
||||
{
|
||||
typedef std::true_type allow_parallel;
|
||||
typedef std::false_type allow_unsequenced;
|
||||
|
@ -97,7 +97,7 @@ struct policy_traits<parallel_policy>
|
|||
};
|
||||
|
||||
template <>
|
||||
struct policy_traits<parallel_unsequenced_policy>
|
||||
struct __policy_traits<parallel_unsequenced_policy>
|
||||
{
|
||||
typedef std::true_type allow_parallel;
|
||||
typedef std::true_type allow_unsequenced;
|
||||
|
@ -106,50 +106,50 @@ struct policy_traits<parallel_unsequenced_policy>
|
|||
#endif
|
||||
|
||||
template <typename _ExecutionPolicy>
|
||||
using collector_t = typename policy_traits<typename std::decay<_ExecutionPolicy>::type>::collector_type;
|
||||
using __collector_t = typename __policy_traits<typename std::decay<_ExecutionPolicy>::type>::__collector_type;
|
||||
|
||||
template <typename _ExecutionPolicy>
|
||||
using allow_vector = typename internal::policy_traits<typename std::decay<_ExecutionPolicy>::type>::allow_vector;
|
||||
using __allow_vector = typename __policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_vector;
|
||||
|
||||
template <typename _ExecutionPolicy>
|
||||
using allow_unsequenced =
|
||||
typename internal::policy_traits<typename std::decay<_ExecutionPolicy>::type>::allow_unsequenced;
|
||||
using __allow_unsequenced = typename __policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_unsequenced;
|
||||
|
||||
template <typename _ExecutionPolicy>
|
||||
using allow_parallel = typename internal::policy_traits<typename std::decay<_ExecutionPolicy>::type>::allow_parallel;
|
||||
using __allow_parallel = typename __policy_traits<typename std::decay<_ExecutionPolicy>::type>::__allow_parallel;
|
||||
|
||||
template <typename _ExecutionPolicy, typename... _IteratorTypes>
|
||||
auto
|
||||
is_vectorization_preferred(_ExecutionPolicy&& __exec)
|
||||
-> decltype(lazy_and(__exec.__allow_vector(), typename is_random_access_iterator<_IteratorTypes...>::type()))
|
||||
__is_vectorization_preferred(_ExecutionPolicy&& __exec)
|
||||
-> decltype(__lazy_and(__exec.__allow_vector(), typename __is_random_access_iterator<_IteratorTypes...>::type()))
|
||||
{
|
||||
return internal::lazy_and(__exec.__allow_vector(), typename is_random_access_iterator<_IteratorTypes...>::type());
|
||||
return __lazy_and(__exec.__allow_vector(), typename __is_random_access_iterator<_IteratorTypes...>::type());
|
||||
}
|
||||
|
||||
template <typename _ExecutionPolicy, typename... _IteratorTypes>
|
||||
auto
|
||||
is_parallelization_preferred(_ExecutionPolicy&& __exec)
|
||||
-> decltype(lazy_and(__exec.__allow_parallel(), typename is_random_access_iterator<_IteratorTypes...>::type()))
|
||||
__is_parallelization_preferred(_ExecutionPolicy&& __exec)
|
||||
-> decltype(__lazy_and(__exec.__allow_parallel(), typename __is_random_access_iterator<_IteratorTypes...>::type()))
|
||||
{
|
||||
return internal::lazy_and(__exec.__allow_parallel(), typename is_random_access_iterator<_IteratorTypes...>::type());
|
||||
return __lazy_and(__exec.__allow_parallel(), typename __is_random_access_iterator<_IteratorTypes...>::type());
|
||||
}
|
||||
|
||||
template <typename policy, typename... _IteratorTypes>
|
||||
struct prefer_unsequenced_tag
|
||||
struct __prefer_unsequenced_tag
|
||||
{
|
||||
static constexpr bool value =
|
||||
allow_unsequenced<policy>::value && is_random_access_iterator<_IteratorTypes...>::value;
|
||||
__allow_unsequenced<policy>::value && __is_random_access_iterator<_IteratorTypes...>::value;
|
||||
typedef std::integral_constant<bool, value> type;
|
||||
};
|
||||
|
||||
template <typename policy, typename... _IteratorTypes>
|
||||
struct prefer_parallel_tag
|
||||
struct __prefer_parallel_tag
|
||||
{
|
||||
static constexpr bool value = allow_parallel<policy>::value && is_random_access_iterator<_IteratorTypes...>::value;
|
||||
static constexpr bool value =
|
||||
__allow_parallel<policy>::value && __is_random_access_iterator<_IteratorTypes...>::value;
|
||||
typedef std::integral_constant<bool, value> type;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_execution_impl_H */
|
||||
|
|
|
@ -20,422 +20,422 @@ namespace std
|
|||
// [alg.any_of]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
any_of(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
// [alg.all_of]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
all_of(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
// [alg.none_of]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
none_of(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
// [alg.foreach]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Function>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
for_each(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Function __f);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Function>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
for_each_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n, _Function __f);
|
||||
|
||||
// [alg.find]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
find_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
find_if_not(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
|
||||
|
||||
// [alg.find.end]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
find_end(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
find_end(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last);
|
||||
|
||||
// [alg.find_first_of]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
find_first_of(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __s_first, _ForwardIterator2 __s_last, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
find_first_of(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __s_first, _ForwardIterator2 __s_last);
|
||||
|
||||
// [alg.adjacent_find]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
adjacent_find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
adjacent_find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred);
|
||||
|
||||
// [alg.count]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type>
|
||||
count(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::difference_type>
|
||||
count_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred);
|
||||
|
||||
// [alg.search]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
search(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator1>
|
||||
search(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
search_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Size __count,
|
||||
const _Tp& __value, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
search_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Size __count,
|
||||
const _Tp& __value);
|
||||
|
||||
// [alg.copy]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _Size, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
copy_n(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _Size __n, _ForwardIterator2 __result);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 result,
|
||||
_Predicate __pred);
|
||||
|
||||
// [alg.swap]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
swap_ranges(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2);
|
||||
|
||||
// [alg.transform]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
|
||||
_UnaryOperation __op);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
transform(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator __result, _BinaryOperation __op);
|
||||
|
||||
// [alg.replace]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
replace_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred,
|
||||
const _Tp& __new_value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
replace(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value,
|
||||
const _Tp& __new_value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryPredicate, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
replace_copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _UnaryPredicate __pred, const _Tp& __new_value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
replace_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
|
||||
const _Tp& __old_value, const _Tp& __new_value);
|
||||
|
||||
// [alg.fill]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __count, const _Tp& __value);
|
||||
|
||||
// [alg.generate]
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Generator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
generate(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Generator __g);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Generator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
generate_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size count, _Generator __g);
|
||||
|
||||
// [alg.remove]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
remove_copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _Predicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
remove_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
|
||||
const _Tp& __value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
remove_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
remove(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
|
||||
|
||||
// [alg.unique]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
unique(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
unique(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
unique_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
|
||||
_BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
unique_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result);
|
||||
|
||||
// [alg.reverse]
|
||||
|
||||
template <class _ExecutionPolicy, class _BidirectionalIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
reverse(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _BidirectionalIterator, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
reverse_copy(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
_ForwardIterator __d_first);
|
||||
|
||||
// [alg.rotate]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
rotate(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
rotate_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __middle, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result);
|
||||
|
||||
// [alg.partitions]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
is_partitioned(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
partition(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _BidirectionalIterator, class _UnaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _BidirectionalIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _BidirectionalIterator>
|
||||
stable_partition(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
_UnaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _ForwardIterator1, class _ForwardIterator2,
|
||||
class _UnaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
partition_copy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_ForwardIterator1 __out_true, _ForwardIterator2 __out_false, _UnaryPredicate __pred);
|
||||
|
||||
// [alg.sort]
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last);
|
||||
|
||||
// [stable.sort]
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
stable_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
stable_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last);
|
||||
|
||||
// [mismatch]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
mismatch(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
mismatch(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_BinaryPredicate __pred);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
mismatch(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator1, _ForwardIterator2>>
|
||||
mismatch(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2);
|
||||
|
||||
// [alg.equal]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_BinaryPredicate __p);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _BinaryPredicate __p);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
equal(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2);
|
||||
|
||||
// [alg.move]
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
move(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __d_first);
|
||||
|
||||
// [partial.sort]
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
partial_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __middle,
|
||||
_RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
partial_sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __middle,
|
||||
_RandomAccessIterator __last);
|
||||
|
||||
// [partial.sort.copy]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
partial_sort_copy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_RandomAccessIterator __d_first, _RandomAccessIterator __d_last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
partial_sort_copy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_RandomAccessIterator __d_first, _RandomAccessIterator __d_last);
|
||||
|
||||
// [is.sorted]
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
is_sorted_until(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
is_sorted_until(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
is_sorted(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
is_sorted(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
// [alg.nth.element]
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
nth_element(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __nth,
|
||||
_RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
nth_element(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __nth,
|
||||
_RandomAccessIterator __last);
|
||||
|
||||
// [alg.merge]
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
merge(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _ForwardIterator __d_first, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
merge(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _ForwardIterator __d_first);
|
||||
|
||||
template <class _ExecutionPolicy, class _BidirectionalIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
inplace_merge(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __middle,
|
||||
_BidirectionalIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _BidirectionalIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
inplace_merge(_ExecutionPolicy&& __exec, _BidirectionalIterator __first, _BidirectionalIterator __middle,
|
||||
_BidirectionalIterator __last);
|
||||
|
||||
// [includes]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
includes(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
includes(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2);
|
||||
|
||||
|
@ -443,12 +443,12 @@ includes(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_union(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_union(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _ForwardIterator __result);
|
||||
|
||||
|
@ -456,12 +456,12 @@ set_union(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterato
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_intersection(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_intersection(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result);
|
||||
|
||||
|
@ -469,12 +469,12 @@ set_intersection(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _Forward
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result);
|
||||
|
||||
|
@ -482,68 +482,68 @@ set_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIt
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator,
|
||||
class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_symmetric_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator result,
|
||||
_Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
set_symmetric_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _ForwardIterator __result);
|
||||
|
||||
// [is.heap]
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
is_heap_until(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _RandomAccessIterator>
|
||||
is_heap_until(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
is_heap(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
is_heap(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last);
|
||||
|
||||
// [alg.min.max]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
min_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
min_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
max_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
max_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator, _ForwardIterator>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator, _ForwardIterator>>
|
||||
minmax_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator, _ForwardIterator>>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, std::pair<_ForwardIterator, _ForwardIterator>>
|
||||
minmax_element(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
// [alg.lex.comparison]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Compare>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
lexicographical_compare(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _Compare __comp);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, bool>
|
||||
lexicographical_compare(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -18,61 +18,61 @@ namespace std
|
|||
// [uninitialized.copy]
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_copy(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIterator __last, _ForwardIterator __result);
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _Size, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_copy_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __n, _ForwardIterator __result);
|
||||
|
||||
// [uninitialized.move]
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_move(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIterator __last, _ForwardIterator __result);
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _Size, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_move_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __n, _ForwardIterator __result);
|
||||
|
||||
// [uninitialized.fill]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n, const _Tp& __value);
|
||||
|
||||
// [specialized.destroy]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
destroy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
destroy_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n);
|
||||
|
||||
// [uninitialized.construct.default]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_default_construct(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_default_construct_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n);
|
||||
|
||||
// [uninitialized.construct.value]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_value_construct(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_value_construct_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n);
|
||||
|
||||
} // namespace std
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace std
|
|||
// [uninitialized.copy]
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_copy(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIterator __last, _ForwardIterator __result)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type _ValueType1;
|
||||
|
@ -29,31 +29,32 @@ uninitialized_copy(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIter
|
|||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel =
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
const auto __is_vector =
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::integral_constant < bool, std::is_trivial<_ValueType1>::value&& std::is_trivial<_ValueType2>::value > (),
|
||||
[&]() {
|
||||
return internal::pattern_walk2_brick(
|
||||
return __internal::__pattern_walk2_brick(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[__is_vector](_InputIterator __begin, _InputIterator __end, _ForwardIterator __res) {
|
||||
return internal::brick_copy(__begin, __end, __res, __is_vector);
|
||||
return __internal::__brick_copy(__begin, __end, __res, __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk2(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(__val1);
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
return __internal::__pattern_walk2(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(__val1);
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _Size, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_copy_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __n, _ForwardIterator __result)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type _ValueType1;
|
||||
|
@ -63,33 +64,34 @@ uninitialized_copy_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __
|
|||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel =
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
const auto __is_vector =
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::integral_constant < bool, std::is_trivial<_ValueType1>::value&& std::is_trivial<_ValueType2>::value > (),
|
||||
[&]() {
|
||||
return internal::pattern_walk2_brick_n(
|
||||
return __internal::__pattern_walk2_brick_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[__is_vector](_InputIterator __begin, _Size __sz, _ForwardIterator __res) {
|
||||
return internal::brick_copy_n(__begin, __sz, __res, __is_vector);
|
||||
return __internal::__brick_copy_n(__begin, __sz, __res, __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk2_n(std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(__val1);
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
return __internal::__pattern_walk2_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(__val1);
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
// [uninitialized.move]
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_move(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIterator __last, _ForwardIterator __result)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type _ValueType1;
|
||||
|
@ -99,31 +101,32 @@ uninitialized_move(_ExecutionPolicy&& __exec, _InputIterator __first, _InputIter
|
|||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel =
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
const auto __is_vector =
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::integral_constant < bool, std::is_trivial<_ValueType1>::value&& std::is_trivial<_ValueType2>::value > (),
|
||||
[&]() {
|
||||
return internal::pattern_walk2_brick(
|
||||
return __internal::__pattern_walk2_brick(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[__is_vector](_InputIterator __begin, _InputIterator __end, _ForwardIterator __res) {
|
||||
return internal::brick_copy(__begin, __end, __res, __is_vector);
|
||||
return __internal::__brick_copy(__begin, __end, __res, __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk2(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(std::move(__val1));
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
return __internal::__pattern_walk2(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(std::move(__val1));
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _InputIterator, class _Size, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_move_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __n, _ForwardIterator __result)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::value_type _ValueType1;
|
||||
|
@ -133,53 +136,55 @@ uninitialized_move_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __
|
|||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel =
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
const auto __is_vector =
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _InputIterator, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::integral_constant < bool, std::is_trivial<_ValueType1>::value&& std::is_trivial<_ValueType2>::value > (),
|
||||
[&]() {
|
||||
return internal::pattern_walk2_brick_n(
|
||||
return __internal::__pattern_walk2_brick_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[__is_vector](_InputIterator __begin, _Size __sz, _ForwardIterator __res) {
|
||||
return internal::brick_copy_n(__begin, __sz, __res, __is_vector);
|
||||
return __internal::__brick_copy_n(__begin, __sz, __res, __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk2_n(std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(std::move(__val1));
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
return __internal::__pattern_walk2_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n, __result,
|
||||
[](_ReferenceType1 __val1, _ReferenceType2 __val2) {
|
||||
::new (std::addressof(__val2)) _ValueType2(std::move(__val1));
|
||||
},
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
// [uninitialized.fill]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
internal::invoke_if_else(
|
||||
__internal::__invoke_if_else(
|
||||
std::is_arithmetic<_ValueType>(),
|
||||
[&]() {
|
||||
internal::pattern_walk_brick(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[&__value, &__is_vector](_ForwardIterator __begin, _ForwardIterator __end) {
|
||||
internal::brick_fill(__begin, __end, _ValueType(__value), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
__internal::__pattern_walk_brick(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[&__value, &__is_vector](_ForwardIterator __begin, _ForwardIterator __end) {
|
||||
__internal::__brick_fill(__begin, __end, _ValueType(__value), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
internal::pattern_walk1(
|
||||
__internal::__pattern_walk1(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[&__value](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(__value); }, __is_vector,
|
||||
__is_parallel);
|
||||
|
@ -187,28 +192,28 @@ uninitialized_fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Forward
|
|||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n, const _Tp& __value)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::is_arithmetic<_ValueType>(),
|
||||
[&]() {
|
||||
return internal::pattern_walk_brick_n(std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[&__value, &__is_vector](_ForwardIterator __begin, _Size __count) {
|
||||
return internal::brick_fill_n(__begin, __count,
|
||||
_ValueType(__value), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
return __internal::__pattern_walk_brick_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[&__value, &__is_vector](_ForwardIterator __begin, _Size __count) {
|
||||
return __internal::__brick_fill_n(__begin, __count, _ValueType(__value), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk1_n(
|
||||
return __internal::__pattern_walk1_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[&__value](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(__value); }, __is_vector,
|
||||
__is_parallel);
|
||||
|
@ -218,136 +223,138 @@ uninitialized_fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size
|
|||
// [specialized.destroy]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
destroy(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
internal::invoke_if_not(std::is_trivially_destructible<_ValueType>(), [&]() {
|
||||
internal::pattern_walk1(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[](_ReferenceType __val) { __val.~_ValueType(); }, __is_vector, __is_parallel);
|
||||
__internal::__invoke_if_not(std::is_trivially_destructible<_ValueType>(), [&]() {
|
||||
__internal::__pattern_walk1(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, [](_ReferenceType __val) { __val.~_ValueType(); },
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
destroy_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::is_trivially_destructible<_ValueType>(), [&]() { return std::next(__first, __n); },
|
||||
[&]() {
|
||||
return internal::pattern_walk1_n(std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[](_ReferenceType __val) { __val.~_ValueType(); }, __is_vector,
|
||||
__is_parallel);
|
||||
return __internal::__pattern_walk1_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n, [](_ReferenceType __val) { __val.~_ValueType(); },
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
// [uninitialized.construct.default]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_default_construct(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
internal::invoke_if_not(std::is_trivial<_ValueType>(), [&]() {
|
||||
internal::pattern_walk1(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType; }, __is_vector,
|
||||
__is_parallel);
|
||||
__internal::__invoke_if_not(std::is_trivial<_ValueType>(), [&]() {
|
||||
__internal::__pattern_walk1(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType; }, __is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_default_construct_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(std::is_trivial<_ValueType>(), [&]() { return std::next(__first, __n); },
|
||||
[&]() {
|
||||
return internal::pattern_walk1_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType; },
|
||||
__is_vector, __is_parallel);
|
||||
});
|
||||
return __internal::__invoke_if_else(
|
||||
std::is_trivial<_ValueType>(), [&]() { return std::next(__first, __n); },
|
||||
[&]() {
|
||||
return __internal::__pattern_walk1_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType; }, __is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
// [uninitialized.construct.value]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void>
|
||||
uninitialized_value_construct(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
internal::invoke_if_else(
|
||||
__internal::__invoke_if_else(
|
||||
std::is_trivial<_ValueType>(),
|
||||
[&]() {
|
||||
internal::pattern_walk_brick(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__is_vector](_ForwardIterator __begin, _ForwardIterator __end) {
|
||||
internal::brick_fill(__begin, __end, _ValueType(), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
__internal::__pattern_walk_brick(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__is_vector](_ForwardIterator __begin, _ForwardIterator __end) {
|
||||
__internal::__brick_fill(__begin, __end, _ValueType(), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
internal::pattern_walk1(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(); },
|
||||
__is_vector, __is_parallel);
|
||||
__internal::__pattern_walk1(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(); }, __is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Size>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
|
||||
uninitialized_value_construct_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
typedef typename iterator_traits<_ForwardIterator>::reference _ReferenceType;
|
||||
using namespace __pstl;
|
||||
|
||||
const auto __is_parallel = internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_parallel = __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
const auto __is_vector = __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec);
|
||||
|
||||
return internal::invoke_if_else(
|
||||
return __internal::__invoke_if_else(
|
||||
std::is_trivial<_ValueType>(),
|
||||
[&]() {
|
||||
return internal::pattern_walk_brick_n(std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[__is_vector](_ForwardIterator __begin, _Size __count) {
|
||||
return internal::brick_fill_n(__begin, __count, _ValueType(),
|
||||
__is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
return __internal::__pattern_walk_brick_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[__is_vector](_ForwardIterator __begin, _Size __count) {
|
||||
return __internal::__brick_fill_n(__begin, __count, _ValueType(), __is_vector);
|
||||
},
|
||||
__is_parallel);
|
||||
},
|
||||
[&]() {
|
||||
return internal::pattern_walk1_n(std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(); },
|
||||
__is_vector, __is_parallel);
|
||||
return __internal::__pattern_walk1_n(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __n,
|
||||
[](_ReferenceType __val) { ::new (std::addressof(__val)) _ValueType(); }, __is_vector, __is_parallel);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -17,39 +17,40 @@ namespace std
|
|||
// [reduce]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, typename iterator_traits<_ForwardIterator>::value_type>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::value_type>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
|
||||
class _BinaryOperation2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
|
||||
_BinaryOperation2 __binary_op2);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op);
|
||||
|
||||
// [exclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _Tp __init);
|
||||
|
||||
|
@ -61,17 +62,17 @@ exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIte
|
|||
// [inclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _Tp __init);
|
||||
|
||||
|
@ -79,7 +80,7 @@ inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIte
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation,
|
||||
class _UnaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op);
|
||||
|
@ -88,26 +89,26 @@ transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _
|
|||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
|
||||
class _UnaryOperation, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op,
|
||||
_Tp __init);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation,
|
||||
class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op);
|
||||
|
||||
// [adjacent.difference]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first, _BinaryOperation op);
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first);
|
||||
|
||||
|
|
|
@ -21,81 +21,82 @@ namespace std
|
|||
// [reduce]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op)
|
||||
{
|
||||
return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op,
|
||||
__pstl::internal::no_op());
|
||||
__pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init)
|
||||
{
|
||||
return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, std::plus<_Tp>(),
|
||||
__pstl::internal::no_op());
|
||||
__pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, typename iterator_traits<_ForwardIterator>::value_type>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
|
||||
typename iterator_traits<_ForwardIterator>::value_type>
|
||||
reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
|
||||
return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, _ValueType{},
|
||||
std::plus<_ValueType>(), __pstl::internal::no_op());
|
||||
std::plus<_ValueType>(), __pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
// [transform.reduce]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
|
||||
using namespace __pstl;
|
||||
return internal::pattern_transform_reduce(
|
||||
return __internal::__pattern_transform_reduce(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, std::plus<_InputType>(),
|
||||
std::multiplies<_InputType>(),
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
|
||||
class _BinaryOperation2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
|
||||
{
|
||||
using namespace __pstl;
|
||||
return internal::pattern_transform_reduce(
|
||||
return __internal::__pattern_transform_reduce(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, __binary_op1, __binary_op2,
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
|
||||
transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op)
|
||||
{
|
||||
using namespace __pstl;
|
||||
return internal::pattern_transform_reduce(
|
||||
return __internal::__pattern_transform_reduce(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op, __unary_op,
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
|
||||
}
|
||||
|
||||
// [exclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _Tp __init)
|
||||
{
|
||||
return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
|
||||
std::plus<_Tp>(), __pstl::internal::no_op());
|
||||
std::plus<_Tp>(), __pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
|
||||
|
@ -104,76 +105,76 @@ exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIte
|
|||
_ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op)
|
||||
{
|
||||
return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
|
||||
__binary_op, __pstl::internal::no_op());
|
||||
__binary_op, __pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
// [inclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
|
||||
return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
|
||||
std::plus<_InputType>(), __pstl::internal::no_op());
|
||||
std::plus<_InputType>(), __pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op)
|
||||
{
|
||||
return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
|
||||
__pstl::internal::no_op());
|
||||
__pstl::__internal::__no_op());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _Tp __init)
|
||||
{
|
||||
return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
|
||||
__pstl::internal::no_op(), __init);
|
||||
__pstl::__internal::__no_op(), __init);
|
||||
}
|
||||
|
||||
// [transform.exclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation,
|
||||
class _UnaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op)
|
||||
{
|
||||
using namespace __pstl;
|
||||
return internal::pattern_transform_scan(
|
||||
return __internal::__pattern_transform_scan(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
|
||||
/*inclusive=*/std::false_type(),
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
}
|
||||
|
||||
// [transform.inclusive.scan]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
|
||||
class _UnaryOperation, class _Tp>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op,
|
||||
_Tp __init)
|
||||
{
|
||||
using namespace __pstl;
|
||||
return internal::pattern_transform_scan(
|
||||
return __internal::__pattern_transform_scan(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
|
||||
/*inclusive=*/std::true_type(),
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation,
|
||||
class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op)
|
||||
{
|
||||
|
@ -193,7 +194,7 @@ transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _
|
|||
// [adjacent.difference]
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first, _BinaryOperation __op)
|
||||
{
|
||||
|
@ -202,14 +203,14 @@ adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _Forwa
|
|||
return __d_first;
|
||||
|
||||
using namespace __pstl;
|
||||
return internal::pattern_adjacent_difference(
|
||||
return __internal::__pattern_adjacent_difference(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first, __op,
|
||||
internal::is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
internal::is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
__internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
|
||||
__internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
|
||||
__pstl::internal::enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
|
||||
adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first)
|
||||
{
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -25,8 +25,8 @@ namespace internal
|
|||
|
||||
template <class _ForwardIterator, class _OutputIterator>
|
||||
_OutputIterator
|
||||
brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
/*vector=*/std::false_type) noexcept
|
||||
__brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
/*vector=*/std::false_type) noexcept
|
||||
{
|
||||
typedef typename std::iterator_traits<_OutputIterator>::value_type _ValueType2;
|
||||
for (; __first != __last; ++__first, ++__result)
|
||||
|
@ -38,19 +38,19 @@ brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _Out
|
|||
|
||||
template <class _ForwardIterator, class _OutputIterator>
|
||||
_OutputIterator
|
||||
brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
/*vector=*/std::true_type) noexcept
|
||||
__brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
/*vector=*/std::true_type) noexcept
|
||||
{
|
||||
typedef typename std::iterator_traits<_OutputIterator>::value_type __ValueType2;
|
||||
typedef typename std::iterator_traits<_ForwardIterator>::reference _ReferenceType1;
|
||||
typedef typename std::iterator_traits<_OutputIterator>::reference _ReferenceType2;
|
||||
|
||||
return unseq_backend::simd_walk_2(
|
||||
return __unseq_backend::__simd_walk_2(
|
||||
__first, __last - __first, __result,
|
||||
[](_ReferenceType1 __x, _ReferenceType2 __y) { ::new (std::addressof(__y)) __ValueType2(std::move(__x)); });
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_memory_impl_H */
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -23,30 +23,29 @@ namespace internal
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2,
|
||||
/*__is_vector=*/std::true_type) noexcept;
|
||||
_Tp __brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2,
|
||||
/*__is_vector=*/std::true_type) noexcept;
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2,
|
||||
/*__is_vector=*/std::false_type) noexcept;
|
||||
_Tp __brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2,
|
||||
/*__is_vector=*/std::false_type) noexcept;
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2,
|
||||
class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp, class _BinaryOperation1,
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
|
||||
class _BinaryOperation2, class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Tp, _BinaryOperation1,
|
||||
_BinaryOperation2, _IsVector __is_vector, /*is_parallel=*/std::true_type);
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp,
|
||||
_BinaryOperation1, _BinaryOperation2, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp,
|
||||
class _BinaryOperation1, class _BinaryOperation2, class _IsVector>
|
||||
_Tp
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
|
||||
_Tp, _BinaryOperation1, _BinaryOperation2, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::true_type);
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -54,25 +53,27 @@ pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAcce
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _ForwardIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
|
||||
/*is_vector=*/std::true_type) noexcept;
|
||||
_Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
|
||||
/*is_vector=*/std::true_type) noexcept;
|
||||
|
||||
template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
|
||||
/*is_vector=*/std::false_type) noexcept;
|
||||
_Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
|
||||
/*is_vector=*/std::false_type) noexcept;
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation, class _IsVector>
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
|
||||
class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
|
||||
_UnaryOperation, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation, class _IsVector>
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
|
||||
class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation, _IsVector,
|
||||
/*is_parallel=*/std::true_type);
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
|
||||
_UnaryOperation, _IsVector,
|
||||
/*is_parallel=*/std::true_type);
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -82,37 +83,36 @@ pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator,
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
|
||||
std::pair<_OutputIterator, _Tp> brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation,
|
||||
/*Inclusive*/ std::false_type) noexcept;
|
||||
std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation,
|
||||
/*Inclusive*/ std::false_type) noexcept;
|
||||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
|
||||
std::pair<_OutputIterator, _Tp> brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation,
|
||||
/*Inclusive*/ std::true_type) noexcept;
|
||||
std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation,
|
||||
/*Inclusive*/ std::true_type) noexcept;
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation,
|
||||
class _Inclusive, class _IsVector>
|
||||
_OutputIterator pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryOperation, _Tp,
|
||||
_BinaryOperation, _Inclusive, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
_OutputIterator
|
||||
__pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryOperation, _Tp,
|
||||
_BinaryOperation, _Inclusive, _IsVector,
|
||||
/*is_parallel=*/std::false_type) noexcept;
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
|
||||
pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator,
|
||||
_OutputIterator, _UnaryOperation, _Tp, _BinaryOperation,
|
||||
_Inclusive, _IsVector, /*is_parallel=*/std::true_type);
|
||||
__pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
|
||||
#endif
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
|
||||
pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator,
|
||||
_OutputIterator, _UnaryOperation, _Tp, _BinaryOperation,
|
||||
_Inclusive, _IsVector, /*is_parallel=*/std::true_type);
|
||||
__pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
|
||||
_UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -120,23 +120,27 @@ pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessI
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
|
||||
_OutputIterator brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
/*is_vector*/ std::false_type) noexcept;
|
||||
_OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
/*is_vector*/ std::false_type) noexcept;
|
||||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
|
||||
_OutputIterator brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
/*is_vector*/ std::true_type) noexcept;
|
||||
_OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
/*is_vector*/ std::true_type) noexcept;
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation, class _IsVector>
|
||||
_OutputIterator pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
_IsVector, /*is_parallel*/ std::false_type) noexcept;
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
|
||||
class _IsVector>
|
||||
_OutputIterator
|
||||
__pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
_IsVector, /*is_parallel*/ std::false_type) noexcept;
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation, class _IsVector>
|
||||
_OutputIterator pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
_IsVector, /*is_parallel*/ std::true_type);
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
|
||||
class _IsVector>
|
||||
_OutputIterator
|
||||
__pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
|
||||
_IsVector, /*is_parallel*/ std::true_type);
|
||||
#endif
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
#endif /* __PSTL_numeric_fwd_H */
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -33,21 +33,21 @@ namespace internal
|
|||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _Tp __init,
|
||||
_BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2,
|
||||
/*is_vector=*/std::false_type) noexcept
|
||||
__brick_transform_reduce(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _Tp __init,
|
||||
_BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2,
|
||||
/*is_vector=*/std::false_type) noexcept
|
||||
{
|
||||
return std::inner_product(__first1, __last1, __first2, __init, __binary_op1, __binary_op2);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _Tp __init,
|
||||
_BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
__brick_transform_reduce(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _Tp __init,
|
||||
_BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
{
|
||||
typedef typename std::iterator_traits<_ForwardIterator1>::difference_type _DifferenceType;
|
||||
return unseq_backend::simd_transform_reduce(
|
||||
return __unseq_backend::__simd_transform_reduce(
|
||||
__last1 - __first1, __init, __binary_op1,
|
||||
[=, &__binary_op2](_DifferenceType __i) { return __binary_op2(__first1[__i], __first2[__i]); });
|
||||
}
|
||||
|
@ -55,24 +55,24 @@ brick_transform_reduce(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _F
|
|||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
|
||||
class _BinaryOperation2, class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
|
||||
_BinaryOperation2 __binary_op2, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::false_type) noexcept
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
|
||||
_BinaryOperation2 __binary_op2, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::false_type) noexcept
|
||||
{
|
||||
return brick_transform_reduce(__first1, __last1, __first2, __init, __binary_op1, __binary_op2, __is_vector);
|
||||
return __brick_transform_reduce(__first1, __last1, __first2, __init, __binary_op1, __binary_op2, __is_vector);
|
||||
}
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp,
|
||||
class _BinaryOperation1, class _BinaryOperation2, class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
|
||||
_BinaryOperation2 __binary_op2, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
__pattern_transform_reduce(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
|
||||
_BinaryOperation2 __binary_op2, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
{
|
||||
return internal::except_handler([&]() {
|
||||
return par_backend::parallel_transform_reduce(
|
||||
return __except_handler([&]() {
|
||||
return __par_backend::__parallel_transform_reduce(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first1, __last1,
|
||||
[__first1, __first2, __binary_op2](_RandomAccessIterator1 __i) mutable {
|
||||
return __binary_op2(*__i, *(__first2 + (__i - __first1)));
|
||||
|
@ -81,8 +81,8 @@ pattern_transform_reduce(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __fir
|
|||
__binary_op1, // Combine
|
||||
[__first1, __first2, __binary_op1, __binary_op2,
|
||||
__is_vector](_RandomAccessIterator1 __i, _RandomAccessIterator1 __j, _Tp __init) -> _Tp {
|
||||
return internal::brick_transform_reduce(__i, __j, __first2 + (__i - __first1), __init, __binary_op1,
|
||||
__binary_op2, __is_vector);
|
||||
return __brick_transform_reduce(__i, __j, __first2 + (__i - __first1), __init, __binary_op1,
|
||||
__binary_op2, __is_vector);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -94,8 +94,8 @@ pattern_transform_reduce(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __fir
|
|||
|
||||
template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op, /*is_vector=*/std::false_type) noexcept
|
||||
__brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op, /*is_vector=*/std::false_type) noexcept
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
{
|
||||
|
@ -106,11 +106,11 @@ brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __
|
|||
|
||||
template <class _ForwardIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
|
||||
_Tp
|
||||
brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op, /*is_vector=*/std::true_type) noexcept
|
||||
__brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __binary_op,
|
||||
_UnaryOperation __unary_op, /*is_vector=*/std::true_type) noexcept
|
||||
{
|
||||
typedef typename std::iterator_traits<_ForwardIterator>::difference_type _DifferenceType;
|
||||
return unseq_backend::simd_transform_reduce(
|
||||
return __unseq_backend::__simd_transform_reduce(
|
||||
__last - __first, __init, __binary_op,
|
||||
[=, &__unary_op](_DifferenceType __i) { return __unary_op(__first[__i]); });
|
||||
}
|
||||
|
@ -118,27 +118,27 @@ brick_transform_reduce(_ForwardIterator __first, _ForwardIterator __last, _Tp __
|
|||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
|
||||
class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::false_type) noexcept
|
||||
__pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::false_type) noexcept
|
||||
{
|
||||
return brick_transform_reduce(__first, __last, __init, __binary_op, __unary_op, __is_vector);
|
||||
return __brick_transform_reduce(__first, __last, __init, __binary_op, __unary_op, __is_vector);
|
||||
}
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
|
||||
class _IsVector>
|
||||
_Tp
|
||||
pattern_transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::true_type)
|
||||
__pattern_transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
|
||||
_BinaryOperation __binary_op, _UnaryOperation __unary_op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::true_type)
|
||||
{
|
||||
return except_handler([&]() {
|
||||
return par_backend::parallel_transform_reduce(
|
||||
return __except_handler([&]() {
|
||||
return __par_backend::__parallel_transform_reduce(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__unary_op](_ForwardIterator __i) mutable { return __unary_op(*__i); }, __init, __binary_op,
|
||||
[__unary_op, __binary_op, __is_vector](_ForwardIterator __i, _ForwardIterator __j, _Tp __init) {
|
||||
return brick_transform_reduce(__i, __j, __init, __binary_op, __unary_op, __is_vector);
|
||||
return __brick_transform_reduce(__i, __j, __init, __binary_op, __unary_op, __is_vector);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -153,9 +153,9 @@ pattern_transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _F
|
|||
// Exclusive form
|
||||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
|
||||
std::pair<_OutputIterator, _Tp>
|
||||
brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
/*Inclusive*/ std::false_type, /*is_vector=*/std::false_type) noexcept
|
||||
__brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
/*Inclusive*/ std::false_type, /*is_vector=*/std::false_type) noexcept
|
||||
{
|
||||
for (; __first != __last; ++__first, ++__result)
|
||||
{
|
||||
|
@ -169,9 +169,9 @@ brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputI
|
|||
// Inclusive form
|
||||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
|
||||
std::pair<_OutputIterator, _Tp>
|
||||
brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
/*Inclusive*/ std::true_type, /*is_vector=*/std::false_type) noexcept
|
||||
__brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
/*Inclusive*/ std::true_type, /*is_vector=*/std::false_type) noexcept
|
||||
{
|
||||
for (; __first != __last; ++__first, ++__result)
|
||||
{
|
||||
|
@ -192,39 +192,39 @@ using is_arithmetic_udop = std::integral_constant<bool, std::is_arithmetic<_Tp>:
|
|||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation,
|
||||
class _Inclusive>
|
||||
typename std::enable_if<!is_arithmetic_udop<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, _Inclusive,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
__brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, _Inclusive,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
{
|
||||
#if (__PSTL_UDS_PRESENT)
|
||||
return unseq_backend::simd_scan(__first, __last - __first, __result, __unary_op, __init, __binary_op, _Inclusive());
|
||||
return __unseq_backend::__simd_scan(__first, __last - __first, __result, __unary_op, __init, __binary_op,
|
||||
_Inclusive());
|
||||
#else
|
||||
// We need to call serial brick here to call function for inclusive and exclusive scan that depends on _Inclusive() value
|
||||
return brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(),
|
||||
/*is_vector=*/std::false_type());
|
||||
return __brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(),
|
||||
/*is_vector=*/std::false_type());
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation,
|
||||
class _Inclusive>
|
||||
typename std::enable_if<is_arithmetic_udop<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, _Inclusive,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
__brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, _Inclusive,
|
||||
/*is_vector=*/std::true_type) noexcept
|
||||
{
|
||||
return brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(),
|
||||
/*is_vector=*/std::false_type());
|
||||
return __brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(),
|
||||
/*is_vector=*/std::false_type());
|
||||
}
|
||||
|
||||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
_OutputIterator
|
||||
pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result,
|
||||
_UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, _Inclusive,
|
||||
_IsVector __is_vector, /*is_parallel=*/std::false_type) noexcept
|
||||
__pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_OutputIterator __result, _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
_Inclusive, _IsVector __is_vector, /*is_parallel=*/std::false_type) noexcept
|
||||
{
|
||||
return internal::brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(),
|
||||
__is_vector)
|
||||
return __brick_transform_scan(__first, __last, __result, __unary_op, __init, __binary_op, _Inclusive(), __is_vector)
|
||||
.first;
|
||||
}
|
||||
|
||||
|
@ -232,26 +232,26 @@ pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIte
|
|||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
|
||||
pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_OutputIterator __result, _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
_Inclusive, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
__pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_OutputIterator __result, _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
_Inclusive, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
{
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _DifferenceType;
|
||||
|
||||
return internal::except_handler([&]() {
|
||||
par_backend::parallel_transform_scan(
|
||||
return __except_handler([&]() {
|
||||
__par_backend::__parallel_transform_scan(
|
||||
std::forward<_ExecutionPolicy>(__exec), __last - __first,
|
||||
[__first, __unary_op](_DifferenceType __i) mutable { return __unary_op(__first[__i]); }, __init,
|
||||
__binary_op,
|
||||
[__first, __unary_op, __binary_op](_DifferenceType __i, _DifferenceType __j, _Tp __init) {
|
||||
// Execute serial brick_transform_reduce, due to the explicit SIMD vectorization (reduction) requires a commutative operation for the guarantee of correct scan.
|
||||
return internal::brick_transform_reduce(__first + __i, __first + __j, __init, __binary_op, __unary_op,
|
||||
/*__is_vector*/ std::false_type());
|
||||
// Execute serial __brick_transform_reduce, due to the explicit SIMD vectorization (reduction) requires a commutative operation for the guarantee of correct scan.
|
||||
return __brick_transform_reduce(__first + __i, __first + __j, __init, __binary_op, __unary_op,
|
||||
/*__is_vector*/ std::false_type());
|
||||
},
|
||||
[__first, __unary_op, __binary_op, __result, __is_vector](_DifferenceType __i, _DifferenceType __j,
|
||||
_Tp __init) {
|
||||
return internal::brick_transform_scan(__first + __i, __first + __j, __result + __i, __unary_op, __init,
|
||||
__binary_op, _Inclusive(), __is_vector)
|
||||
return __brick_transform_scan(__first + __i, __first + __j, __result + __i, __unary_op, __init,
|
||||
__binary_op, _Inclusive(), __is_vector)
|
||||
.second;
|
||||
});
|
||||
return __result + (__last - __first);
|
||||
|
@ -263,9 +263,9 @@ pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first,
|
|||
template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation, class _Inclusive, class _IsVector>
|
||||
typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
|
||||
pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_OutputIterator __result, _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
_Inclusive, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
__pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_OutputIterator __result, _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op,
|
||||
_Inclusive, _IsVector __is_vector, /*is_parallel=*/std::true_type)
|
||||
{
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _DifferenceType;
|
||||
_DifferenceType __n = __last - __first;
|
||||
|
@ -274,12 +274,12 @@ pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first,
|
|||
{
|
||||
return __result;
|
||||
}
|
||||
return except_handler([&]() {
|
||||
par_backend::parallel_strict_scan(
|
||||
return __except_handler([&]() {
|
||||
__par_backend::parallel_strict_scan(
|
||||
std::forward<_ExecutionPolicy>(__exec), __n, __init,
|
||||
[__first, __unary_op, __binary_op, __result, __is_vector](_DifferenceType __i, _DifferenceType __len) {
|
||||
return brick_transform_scan(__first + __i, __first + (__i + __len), __result + __i, __unary_op, _Tp{},
|
||||
__binary_op, _Inclusive(), __is_vector)
|
||||
return __brick_transform_scan(__first + __i, __first + (__i + __len), __result + __i, __unary_op, _Tp{},
|
||||
__binary_op, _Inclusive(), __is_vector)
|
||||
.second;
|
||||
},
|
||||
__binary_op,
|
||||
|
@ -303,16 +303,16 @@ pattern_transform_scan(_ExecutionPolicy&& __exec, _RandomAccessIterator __first,
|
|||
|
||||
template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
|
||||
_OutputIterator
|
||||
brick_adjacent_difference(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __d_first,
|
||||
_BinaryOperation __op, /*is_vector*/ std::false_type) noexcept
|
||||
__brick_adjacent_difference(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __d_first,
|
||||
_BinaryOperation __op, /*is_vector*/ std::false_type) noexcept
|
||||
{
|
||||
return std::adjacent_difference(__first, __last, __d_first, __op);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class BinaryOperation>
|
||||
_ForwardIterator2
|
||||
brick_adjacent_difference(_ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __d_first,
|
||||
BinaryOperation __op, /*is_vector=*/std::true_type) noexcept
|
||||
__brick_adjacent_difference(_ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __d_first,
|
||||
BinaryOperation __op, /*is_vector=*/std::true_type) noexcept
|
||||
{
|
||||
assert(__first != __last);
|
||||
|
||||
|
@ -321,7 +321,7 @@ brick_adjacent_difference(_ForwardIterator1 __first, _ForwardIterator1 __last, _
|
|||
|
||||
auto __n = __last - __first;
|
||||
*__d_first = *__first;
|
||||
return unseq_backend::simd_walk_3(
|
||||
return __unseq_backend::__simd_walk_3(
|
||||
__first + 1, __n - 1, __first, __d_first + 1,
|
||||
[&__op](_ReferenceType1 __x, _ReferenceType1 __y, _ReferenceType2 __z) { __z = __op(__x, __y); });
|
||||
}
|
||||
|
@ -329,40 +329,40 @@ brick_adjacent_difference(_ForwardIterator1 __first, _ForwardIterator1 __last, _
|
|||
template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
|
||||
class _IsVector>
|
||||
_OutputIterator
|
||||
pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_OutputIterator __d_first, _BinaryOperation __op, _IsVector __is_vector,
|
||||
/*is_parallel*/ std::false_type) noexcept
|
||||
__pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last,
|
||||
_OutputIterator __d_first, _BinaryOperation __op, _IsVector __is_vector,
|
||||
/*is_parallel*/ std::false_type) noexcept
|
||||
{
|
||||
return internal::brick_adjacent_difference(__first, __last, __d_first, __op, __is_vector);
|
||||
return __brick_adjacent_difference(__first, __last, __d_first, __op, __is_vector);
|
||||
}
|
||||
|
||||
#if __PSTL_USE_PAR_POLICIES
|
||||
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
|
||||
class _IsVector>
|
||||
_ForwardIterator2
|
||||
pattern_adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first, _BinaryOperation __op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::true_type)
|
||||
__pattern_adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
|
||||
_ForwardIterator2 __d_first, _BinaryOperation __op, _IsVector __is_vector,
|
||||
/*is_parallel=*/std::true_type)
|
||||
{
|
||||
assert(__first != __last);
|
||||
typedef typename std::iterator_traits<_ForwardIterator1>::reference _ReferenceType1;
|
||||
typedef typename std::iterator_traits<_ForwardIterator2>::reference _ReferenceType2;
|
||||
|
||||
*__d_first = *__first;
|
||||
par_backend::parallel_for(std::forward<_ExecutionPolicy>(__exec), __first, __last - 1,
|
||||
[&__op, __is_vector, __d_first, __first](_ForwardIterator1 __b, _ForwardIterator1 __e) {
|
||||
_ForwardIterator2 __d_b = __d_first + (__b - __first);
|
||||
brick_walk3(__b, __e, __b + 1, __d_b + 1,
|
||||
[&__op](_ReferenceType1 __x, _ReferenceType1 __y, _ReferenceType2 __z) {
|
||||
__z = __op(__y, __x);
|
||||
},
|
||||
__is_vector);
|
||||
});
|
||||
__par_backend::__parallel_for(
|
||||
std::forward<_ExecutionPolicy>(__exec), __first, __last - 1,
|
||||
[&__op, __is_vector, __d_first, __first](_ForwardIterator1 __b, _ForwardIterator1 __e) {
|
||||
_ForwardIterator2 __d_b = __d_first + (__b - __first);
|
||||
__brick_walk3(
|
||||
__b, __e, __b + 1, __d_b + 1,
|
||||
[&__op](_ReferenceType1 __x, _ReferenceType1 __y, _ReferenceType2 __z) { __z = __op(__y, __x); },
|
||||
__is_vector);
|
||||
});
|
||||
return __d_first + (__last - __first);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_numeric_impl_H */
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace par_backend
|
||||
namespace __par_backend
|
||||
{
|
||||
|
||||
//! Raw memory buffer with automatic freeing and no exceptions.
|
||||
|
@ -40,18 +40,18 @@ not an initialize array, because initialization/destruction
|
|||
would make the span be at least O(N). */
|
||||
// tbb::allocator can improve performance in some cases.
|
||||
template <typename _Tp>
|
||||
class buffer
|
||||
class __buffer
|
||||
{
|
||||
tbb::tbb_allocator<_Tp> _M_allocator;
|
||||
_Tp* _M_ptr;
|
||||
const std::size_t _M_buf_size;
|
||||
buffer(const buffer&) = delete;
|
||||
__buffer(const __buffer&) = delete;
|
||||
void
|
||||
operator=(const buffer&) = delete;
|
||||
operator=(const __buffer&) = delete;
|
||||
|
||||
public:
|
||||
//! Try to obtain buffer of given size to store objects of _Tp type
|
||||
buffer(std::size_t n) : _M_allocator(), _M_ptr(_M_allocator.allocate(n)), _M_buf_size(n) {}
|
||||
__buffer(std::size_t n) : _M_allocator(), _M_ptr(_M_allocator.allocate(n)), _M_buf_size(n) {}
|
||||
//! True if buffer was successfully obtained, zero otherwise.
|
||||
operator bool() const { return _M_ptr != NULL; }
|
||||
//! Return pointer to buffer, or NULL if buffer could not be obtained.
|
||||
|
@ -61,12 +61,12 @@ class buffer
|
|||
return _M_ptr;
|
||||
}
|
||||
//! Destroy buffer
|
||||
~buffer() { _M_allocator.deallocate(_M_ptr, _M_buf_size); }
|
||||
~__buffer() { _M_allocator.deallocate(_M_ptr, _M_buf_size); }
|
||||
};
|
||||
|
||||
// Wrapper for tbb::task
|
||||
inline void
|
||||
cancel_execution()
|
||||
__cancel_execution()
|
||||
{
|
||||
tbb::task::self().group()->cancel_group_execution();
|
||||
}
|
||||
|
@ -76,11 +76,11 @@ cancel_execution()
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _Index, class _RealBody>
|
||||
class parallel_for_body
|
||||
class __parallel_for_body
|
||||
{
|
||||
public:
|
||||
parallel_for_body(const _RealBody& __body) : _M_body(__body) {}
|
||||
parallel_for_body(const parallel_for_body& __body) : _M_body(__body._M_body) {}
|
||||
__parallel_for_body(const _RealBody& __body) : _M_body(__body) {}
|
||||
__parallel_for_body(const __parallel_for_body& __body) : _M_body(__body._M_body) {}
|
||||
void
|
||||
operator()(const tbb::blocked_range<_Index>& __range) const
|
||||
{
|
||||
|
@ -95,18 +95,19 @@ class parallel_for_body
|
|||
// wrapper over tbb::parallel_for
|
||||
template <class _ExecutionPolicy, class _Index, class _Fp>
|
||||
void
|
||||
parallel_for(_ExecutionPolicy&&, _Index __first, _Index __last, _Fp __f)
|
||||
__parallel_for(_ExecutionPolicy&&, _Index __first, _Index __last, _Fp __f)
|
||||
{
|
||||
tbb::this_task_arena::isolate(
|
||||
[=]() { tbb::parallel_for(tbb::blocked_range<_Index>(__first, __last), parallel_for_body<_Index, _Fp>(__f)); });
|
||||
tbb::this_task_arena::isolate([=]() {
|
||||
tbb::parallel_for(tbb::blocked_range<_Index>(__first, __last), __parallel_for_body<_Index, _Fp>(__f));
|
||||
});
|
||||
}
|
||||
|
||||
//! Evaluation of brick f[i,j) for each subrange [i,j) of [first,last)
|
||||
// wrapper over tbb::parallel_reduce
|
||||
template <class _ExecutionPolicy, class _Value, class _Index, typename _RealBody, typename _Reduction>
|
||||
_Value
|
||||
parallel_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, const _Value& __identity,
|
||||
const _RealBody& __real_body, const _Reduction& __reduction)
|
||||
__parallel_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, const _Value& __identity,
|
||||
const _RealBody& __real_body, const _Reduction& __reduction)
|
||||
{
|
||||
return tbb::this_task_arena::isolate([__first, __last, &__identity, &__real_body, &__reduction]() -> _Value {
|
||||
return tbb::parallel_reduce(
|
||||
|
@ -128,7 +129,7 @@ parallel_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, const _Value&
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _Index, class _Up, class _Tp, class _Cp, class _Rp>
|
||||
struct par_trans_red_body
|
||||
struct __par_trans_red_body
|
||||
{
|
||||
alignas(_Tp) char _M_sum_storage[sizeof(_Tp)]; // Holds generalized non-commutative sum when has_sum==true
|
||||
_Rp _M_brick_reduce; // Most likely to have non-empty layout
|
||||
|
@ -141,18 +142,18 @@ struct par_trans_red_body
|
|||
__TBB_ASSERT(_M_has_sum, "sum expected");
|
||||
return *(_Tp*)_M_sum_storage;
|
||||
}
|
||||
par_trans_red_body(_Up __u, _Tp __init, _Cp __c, _Rp __r)
|
||||
__par_trans_red_body(_Up __u, _Tp __init, _Cp __c, _Rp __r)
|
||||
: _M_brick_reduce(__r), _M_u(__u), _M_combine(__c), _M_has_sum(true)
|
||||
{
|
||||
new (_M_sum_storage) _Tp(__init);
|
||||
}
|
||||
|
||||
par_trans_red_body(par_trans_red_body& __left, tbb::split)
|
||||
__par_trans_red_body(__par_trans_red_body& __left, tbb::split)
|
||||
: _M_brick_reduce(__left._M_brick_reduce), _M_u(__left._M_u), _M_combine(__left._M_combine), _M_has_sum(false)
|
||||
{
|
||||
}
|
||||
|
||||
~par_trans_red_body()
|
||||
~__par_trans_red_body()
|
||||
{
|
||||
// 17.6.5.12 tells us to not worry about catching exceptions from destructors.
|
||||
if (_M_has_sum)
|
||||
|
@ -160,7 +161,7 @@ struct par_trans_red_body
|
|||
}
|
||||
|
||||
void
|
||||
join(par_trans_red_body& __rhs)
|
||||
join(__par_trans_red_body& __rhs)
|
||||
{
|
||||
sum() = _M_combine(sum(), __rhs.sum());
|
||||
}
|
||||
|
@ -186,10 +187,10 @@ struct par_trans_red_body
|
|||
|
||||
template <class _ExecutionPolicy, class _Index, class _Up, class _Tp, class _Cp, class _Rp>
|
||||
_Tp
|
||||
parallel_transform_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, _Up __u, _Tp __init, _Cp __combine,
|
||||
_Rp __brick_reduce)
|
||||
__parallel_transform_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, _Up __u, _Tp __init, _Cp __combine,
|
||||
_Rp __brick_reduce)
|
||||
{
|
||||
par_trans_red_body<_Index, _Up, _Tp, _Cp, _Rp> __body(__u, __init, __combine, __brick_reduce);
|
||||
__par_trans_red_body<_Index, _Up, _Tp, _Cp, _Rp> __body(__u, __init, __combine, __brick_reduce);
|
||||
// The grain size of 3 is used in order to provide mininum 2 elements for each body
|
||||
tbb::this_task_arena::isolate(
|
||||
[__first, __last, &__body]() { tbb::parallel_reduce(tbb::blocked_range<_Index>(__first, __last, 3), __body); });
|
||||
|
@ -201,7 +202,7 @@ parallel_transform_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, _Up
|
|||
//------------------------------------------------------------------------
|
||||
|
||||
template <class _Index, class _Up, class _Tp, class _Cp, class _Rp, class _Sp>
|
||||
class trans_scan_body
|
||||
class __trans_scan_body
|
||||
{
|
||||
alignas(_Tp) char _M_sum_storage[sizeof(_Tp)]; // Holds generalized non-commutative sum when has_sum==true
|
||||
_Rp _M_brick_reduce; // Most likely to have non-empty layout
|
||||
|
@ -210,19 +211,19 @@ class trans_scan_body
|
|||
_Sp _M_scan;
|
||||
bool _M_has_sum; // Put last to minimize size of class
|
||||
public:
|
||||
trans_scan_body(_Up __u, _Tp __init, _Cp __combine, _Rp __reduce, _Sp __scan)
|
||||
__trans_scan_body(_Up __u, _Tp __init, _Cp __combine, _Rp __reduce, _Sp __scan)
|
||||
: _M_brick_reduce(__reduce), _M_u(__u), _M_combine(__combine), _M_scan(__scan), _M_has_sum(true)
|
||||
{
|
||||
new (_M_sum_storage) _Tp(__init);
|
||||
}
|
||||
|
||||
trans_scan_body(trans_scan_body& __b, tbb::split)
|
||||
__trans_scan_body(__trans_scan_body& __b, tbb::split)
|
||||
: _M_brick_reduce(__b._M_brick_reduce), _M_u(__b._M_u), _M_combine(__b._M_combine), _M_scan(__b._M_scan),
|
||||
_M_has_sum(false)
|
||||
{
|
||||
}
|
||||
|
||||
~trans_scan_body()
|
||||
~__trans_scan_body()
|
||||
{
|
||||
// 17.6.5.12 tells us to not worry about catching exceptions from destructors.
|
||||
if (_M_has_sum)
|
||||
|
@ -259,7 +260,7 @@ class trans_scan_body
|
|||
}
|
||||
|
||||
void
|
||||
reverse_join(trans_scan_body& __a)
|
||||
reverse_join(__trans_scan_body& __a)
|
||||
{
|
||||
if (_M_has_sum)
|
||||
{
|
||||
|
@ -273,7 +274,7 @@ class trans_scan_body
|
|||
}
|
||||
|
||||
void
|
||||
assign(trans_scan_body& __b)
|
||||
assign(__trans_scan_body& __b)
|
||||
{
|
||||
sum() = __b.sum();
|
||||
}
|
||||
|
@ -281,7 +282,7 @@ class trans_scan_body
|
|||
|
||||
template <typename _Index>
|
||||
_Index
|
||||
split(_Index __m)
|
||||
__split(_Index __m)
|
||||
{
|
||||
_Index __k = 1;
|
||||
while (2 * __k < __m)
|
||||
|
@ -295,18 +296,16 @@ split(_Index __m)
|
|||
|
||||
template <typename _Index, typename _Tp, typename _Rp, typename _Cp>
|
||||
void
|
||||
upsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Rp __reduce, _Cp __combine)
|
||||
__upsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Rp __reduce, _Cp __combine)
|
||||
{
|
||||
if (__m == 1)
|
||||
__r[0] = __reduce(__i * __tilesize, __lastsize);
|
||||
else
|
||||
{
|
||||
_Index __k = split(__m);
|
||||
tbb::parallel_invoke([=] { par_backend::upsweep(__i, __k, __tilesize, __r, __tilesize, __reduce, __combine); },
|
||||
[=] {
|
||||
par_backend::upsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize, __reduce,
|
||||
__combine);
|
||||
});
|
||||
_Index __k = __split(__m);
|
||||
tbb::parallel_invoke(
|
||||
[=] { __upsweep(__i, __k, __tilesize, __r, __tilesize, __reduce, __combine); },
|
||||
[=] { __upsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize, __reduce, __combine); });
|
||||
if (__m == 2 * __k)
|
||||
__r[__m - 1] = __combine(__r[__k - 1], __r[__m - 1]);
|
||||
}
|
||||
|
@ -314,22 +313,21 @@ upsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize,
|
|||
|
||||
template <typename _Index, typename _Tp, typename _Cp, typename _Sp>
|
||||
void
|
||||
downsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Tp __initial, _Cp __combine,
|
||||
_Sp __scan)
|
||||
__downsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize, _Tp __initial, _Cp __combine,
|
||||
_Sp __scan)
|
||||
{
|
||||
if (__m == 1)
|
||||
__scan(__i * __tilesize, __lastsize, __initial);
|
||||
else
|
||||
{
|
||||
const _Index __k = par_backend::split(__m);
|
||||
tbb::parallel_invoke(
|
||||
[=] { par_backend::downsweep(__i, __k, __tilesize, __r, __tilesize, __initial, __combine, __scan); },
|
||||
// Assumes that __combine never throws.
|
||||
//TODO: Consider adding a requirement for user functors to be constant.
|
||||
[=, &__combine] {
|
||||
par_backend::downsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize,
|
||||
__combine(__initial, __r[__k - 1]), __combine, __scan);
|
||||
});
|
||||
const _Index __k = __split(__m);
|
||||
tbb::parallel_invoke([=] { __downsweep(__i, __k, __tilesize, __r, __tilesize, __initial, __combine, __scan); },
|
||||
// Assumes that __combine never throws.
|
||||
//TODO: Consider adding a requirement for user functors to be constant.
|
||||
[=, &__combine] {
|
||||
__downsweep(__i + __k, __m - __k, __tilesize, __r + __k, __lastsize,
|
||||
__combine(__initial, __r[__k - 1]), __combine, __scan);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -345,7 +343,7 @@ downsweep(_Index __i, _Index __m, _Index __tilesize, _Tp* __r, _Index __lastsize
|
|||
// Thus callers can rely upon side effects in reduce.
|
||||
// combine must not throw an exception.
|
||||
// apex is called exactly once, after all calls to reduce and before all calls to scan.
|
||||
// For example, it's useful for allocating a buffer used by scan but whose size is the sum of all reduction values.
|
||||
// For example, it's useful for allocating a __buffer used by scan but whose size is the sum of all reduction values.
|
||||
// T must have a trivial constructor and destructor.
|
||||
template <class _ExecutionPolicy, typename _Index, typename _Tp, typename _Rp, typename _Cp, typename _Sp, typename _Ap>
|
||||
void
|
||||
|
@ -358,10 +356,10 @@ parallel_strict_scan(_ExecutionPolicy&&, _Index __n, _Tp __initial, _Rp __reduce
|
|||
const _Index __slack = 4;
|
||||
_Index __tilesize = (__n - 1) / (__slack * __p) + 1;
|
||||
_Index __m = (__n - 1) / __tilesize;
|
||||
buffer<_Tp> __buf(__m + 1);
|
||||
__buffer<_Tp> __buf(__m + 1);
|
||||
_Tp* __r = __buf.get();
|
||||
par_backend::upsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __reduce,
|
||||
__combine);
|
||||
__upsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __reduce, __combine);
|
||||
|
||||
// When __apex is a no-op and __combine has no side effects, a good optimizer
|
||||
// should be able to eliminate all code between here and __apex.
|
||||
// Alternatively, provide a default value for __apex that can be
|
||||
|
@ -371,8 +369,8 @@ parallel_strict_scan(_ExecutionPolicy&&, _Index __n, _Tp __initial, _Rp __reduce
|
|||
while ((__k &= __k - 1))
|
||||
__t = __combine(__r[__k - 1], __t);
|
||||
__apex(__combine(__initial, __t));
|
||||
par_backend::downsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __initial,
|
||||
__combine, __scan);
|
||||
__downsweep(_Index(0), _Index(__m + 1), __tilesize, __r, __n - __m * __tilesize, __initial, __combine,
|
||||
__scan);
|
||||
return;
|
||||
}
|
||||
// Fewer than 2 elements in sequence, or out of memory. Handle has single block.
|
||||
|
@ -387,10 +385,10 @@ parallel_strict_scan(_ExecutionPolicy&&, _Index __n, _Tp __initial, _Rp __reduce
|
|||
|
||||
template <class _ExecutionPolicy, class _Index, class _Up, class _Tp, class _Cp, class _Rp, class _Sp>
|
||||
_Tp
|
||||
parallel_transform_scan(_ExecutionPolicy&&, _Index __n, _Up __u, _Tp __init, _Cp __combine, _Rp __brick_reduce,
|
||||
_Sp __scan)
|
||||
__parallel_transform_scan(_ExecutionPolicy&&, _Index __n, _Up __u, _Tp __init, _Cp __combine, _Rp __brick_reduce,
|
||||
_Sp __scan)
|
||||
{
|
||||
trans_scan_body<_Index, _Up, _Tp, _Cp, _Rp, _Sp> __body(__u, __init, __combine, __brick_reduce, __scan);
|
||||
__trans_scan_body<_Index, _Up, _Tp, _Cp, _Rp, _Sp> __body(__u, __init, __combine, __brick_reduce, __scan);
|
||||
auto __range = tbb::blocked_range<_Index>(0, __n);
|
||||
tbb::this_task_arena::isolate([__range, &__body]() { tbb::parallel_scan(__range, __body); });
|
||||
return __body.sum();
|
||||
|
@ -408,7 +406,7 @@ parallel_transform_scan(_ExecutionPolicy&&, _Index __n, _Up __u, _Tp __init, _Cp
|
|||
|
||||
template <typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _RandomAccessIterator3,
|
||||
typename _Compare, typename _Cleanup, typename _LeafMerge>
|
||||
class merge_task : public tbb::task
|
||||
class __merge_task : public tbb::task
|
||||
{
|
||||
/*override*/ tbb::task*
|
||||
execute();
|
||||
|
@ -420,9 +418,9 @@ class merge_task : public tbb::task
|
|||
_LeafMerge _M_leaf_merge;
|
||||
|
||||
public:
|
||||
merge_task(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _RandomAccessIterator2 __ys,
|
||||
_RandomAccessIterator2 __ye, _RandomAccessIterator3 __zs, _Compare __comp, _Cleanup __cleanup,
|
||||
_LeafMerge __leaf_merge)
|
||||
__merge_task(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _RandomAccessIterator2 __ys,
|
||||
_RandomAccessIterator2 __ye, _RandomAccessIterator3 __zs, _Compare __comp, _Cleanup __cleanup,
|
||||
_LeafMerge __leaf_merge)
|
||||
: _M_xs(__xs), _M_xe(__xe), _M_ys(__ys), _M_ye(__ye), _M_zs(__zs), _M_comp(__comp), _M_cleanup(__cleanup),
|
||||
_M_leaf_merge(__leaf_merge)
|
||||
{
|
||||
|
@ -434,8 +432,8 @@ class merge_task : public tbb::task
|
|||
template <typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _RandomAccessIterator3,
|
||||
typename __M_Compare, typename _Cleanup, typename _LeafMerge>
|
||||
tbb::task*
|
||||
merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator3, __M_Compare, _Cleanup,
|
||||
_LeafMerge>::execute()
|
||||
__merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator3, __M_Compare, _Cleanup,
|
||||
_LeafMerge>::execute()
|
||||
{
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _DifferenceType1;
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _DifferenceType2;
|
||||
|
@ -467,7 +465,7 @@ merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator
|
|||
}
|
||||
const _RandomAccessIterator3 __zm = _M_zs + ((__xm - _M_xs) + (__ym - _M_ys));
|
||||
tbb::task* __right = new (tbb::task::allocate_additional_child_of(*parent()))
|
||||
merge_task(__xm, _M_xe, __ym, _M_ye, __zm, _M_comp, _M_cleanup, _M_leaf_merge);
|
||||
__merge_task(__xm, _M_xe, __ym, _M_ye, __zm, _M_comp, _M_cleanup, _M_leaf_merge);
|
||||
tbb::task::spawn(*__right);
|
||||
tbb::task::recycle_as_continuation();
|
||||
_M_xe = __xm;
|
||||
|
@ -477,7 +475,7 @@ merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator
|
|||
}
|
||||
|
||||
template <typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _Compare, typename _LeafSort>
|
||||
class stable_sort_task : public tbb::task
|
||||
class __stable_sort_task : public tbb::task
|
||||
{
|
||||
public:
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _DifferenceType1;
|
||||
|
@ -495,8 +493,8 @@ class stable_sort_task : public tbb::task
|
|||
_SizeType _M_nsort;
|
||||
|
||||
public:
|
||||
stable_sort_task(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _RandomAccessIterator2 __zs,
|
||||
int32_t __inplace, _Compare __comp, _LeafSort __leaf_sort, _SizeType __n)
|
||||
__stable_sort_task(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _RandomAccessIterator2 __zs,
|
||||
int32_t __inplace, _Compare __comp, _LeafSort __leaf_sort, _SizeType __n)
|
||||
: _M_xs(__xs), _M_xe(__xe), _M_zs(__zs), _M_comp(__comp), _M_leaf_sort(__leaf_sort), _M_inplace(__inplace),
|
||||
_M_nsort(__n)
|
||||
{
|
||||
|
@ -504,7 +502,7 @@ class stable_sort_task : public tbb::task
|
|||
};
|
||||
|
||||
//! Binary operator that does nothing
|
||||
struct binary_no_op
|
||||
struct __binary_no_op
|
||||
{
|
||||
template <typename _T>
|
||||
void operator()(_T, _T)
|
||||
|
@ -516,7 +514,7 @@ struct binary_no_op
|
|||
|
||||
template <typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _Compare, typename _LeafSort>
|
||||
tbb::task*
|
||||
stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _LeafSort>::execute()
|
||||
__stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _LeafSort>::execute()
|
||||
{
|
||||
const _SizeType __n = _M_xe - _M_xs;
|
||||
const _SizeType __nmerge = _M_nsort > 0 ? _M_nsort : __n;
|
||||
|
@ -525,7 +523,7 @@ stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _Leaf
|
|||
{
|
||||
_M_leaf_sort(_M_xs, _M_xe, _M_comp);
|
||||
if (_M_inplace != 2)
|
||||
init_buf(_M_xs, _M_xe, _M_zs, _M_inplace == 0);
|
||||
__init_buf(_M_xs, _M_xe, _M_zs, _M_inplace == 0);
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
|
@ -539,18 +537,19 @@ stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _Leaf
|
|||
_RandomAccessIterator1 __first2) { return std::move(__first1, __last1, __first2); };
|
||||
if (_M_inplace == 2)
|
||||
__m = new (allocate_continuation())
|
||||
merge_task<_RandomAccessIterator2, _RandomAccessIterator2, _RandomAccessIterator1, _Compare,
|
||||
serial_destroy, serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_zs, __zm, __zm, __ze, _M_xs, _M_comp, serial_destroy(),
|
||||
serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
__merge_task<_RandomAccessIterator2, _RandomAccessIterator2, _RandomAccessIterator1, _Compare,
|
||||
__serial_destroy,
|
||||
__serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_zs, __zm, __zm, __ze, _M_xs, _M_comp, __serial_destroy(),
|
||||
__serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
else if (_M_inplace)
|
||||
__m = new (allocate_continuation())
|
||||
merge_task<_RandomAccessIterator2, _RandomAccessIterator2, _RandomAccessIterator1, _Compare,
|
||||
binary_no_op, serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_zs, __zm, __zm, __ze, _M_xs, _M_comp, binary_no_op(),
|
||||
serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
__merge_task<_RandomAccessIterator2, _RandomAccessIterator2, _RandomAccessIterator1, _Compare,
|
||||
__binary_no_op, __serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_zs, __zm, __zm, __ze, _M_xs, _M_comp, __binary_no_op(),
|
||||
__serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
else
|
||||
{
|
||||
auto __move_values = [](_RandomAccessIterator1 __x, _RandomAccessIterator2 __z) { *__z = std::move(*__x); };
|
||||
|
@ -559,15 +558,15 @@ stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _Leaf
|
|||
return std::move(__first1, __last1, __first2);
|
||||
};
|
||||
__m = new (allocate_continuation())
|
||||
merge_task<_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Compare,
|
||||
binary_no_op, serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_xs, __xm, __xm, _M_xe, _M_zs, _M_comp, binary_no_op(),
|
||||
serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
__merge_task<_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Compare,
|
||||
__binary_no_op, __serial_move_merge<decltype(__move_values), decltype(__move_sequences)>>(
|
||||
_M_xs, __xm, __xm, _M_xe, _M_zs, _M_comp, __binary_no_op(),
|
||||
__serial_move_merge<decltype(__move_values), decltype(__move_sequences)>(__nmerge, __move_values,
|
||||
__move_sequences));
|
||||
}
|
||||
__m->set_ref_count(2);
|
||||
task* __right = new (__m->allocate_child())
|
||||
stable_sort_task(__xm, _M_xe, __zm, !_M_inplace, _M_comp, _M_leaf_sort, __nmerge);
|
||||
__stable_sort_task(__xm, _M_xe, __zm, !_M_inplace, _M_comp, _M_leaf_sort, __nmerge);
|
||||
spawn(*__right);
|
||||
recycle_as_child_of(*__m);
|
||||
_M_xe = __xm;
|
||||
|
@ -578,8 +577,8 @@ stable_sort_task<_RandomAccessIterator1, _RandomAccessIterator2, _Compare, _Leaf
|
|||
|
||||
template <class _ExecutionPolicy, typename _RandomAccessIterator, typename _Compare, typename _LeafSort>
|
||||
void
|
||||
parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __xs, _RandomAccessIterator __xe, _Compare __comp,
|
||||
_LeafSort __leaf_sort, std::size_t __nsort = 0)
|
||||
__parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __xs, _RandomAccessIterator __xe, _Compare __comp,
|
||||
_LeafSort __leaf_sort, std::size_t __nsort = 0)
|
||||
{
|
||||
tbb::this_task_arena::isolate([=, &__nsort]() {
|
||||
//sorting based on task tree and parallel merge
|
||||
|
@ -593,10 +592,10 @@ parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __xs, _RandomAcce
|
|||
if (__n > __sort_cut_off)
|
||||
{
|
||||
assert(__nsort > 0 && __nsort <= __n);
|
||||
buffer<_ValueType> __buf(__n);
|
||||
__buffer<_ValueType> __buf(__n);
|
||||
using tbb::task;
|
||||
task::spawn_root_and_wait(*new (task::allocate_root())
|
||||
stable_sort_task<_RandomAccessIterator, _ValueType*, _Compare, _LeafSort>(
|
||||
__stable_sort_task<_RandomAccessIterator, _ValueType*, _Compare, _LeafSort>(
|
||||
__xs, __xe, (_ValueType*)__buf.get(), 2, __comp, __leaf_sort, __nsort));
|
||||
return;
|
||||
}
|
||||
|
@ -612,9 +611,9 @@ parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __xs, _RandomAcce
|
|||
template <class _ExecutionPolicy, typename _RandomAccessIterator1, typename _RandomAccessIterator2,
|
||||
typename _RandomAccessIterator3, typename _Compare, typename _LeafMerge>
|
||||
void
|
||||
parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe,
|
||||
_RandomAccessIterator2 __ys, _RandomAccessIterator2 __ye, _RandomAccessIterator3 __zs, _Compare __comp,
|
||||
_LeafMerge __leaf_merge)
|
||||
__parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe,
|
||||
_RandomAccessIterator2 __ys, _RandomAccessIterator2 __ye, _RandomAccessIterator3 __zs, _Compare __comp,
|
||||
_LeafMerge __leaf_merge)
|
||||
{
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _DifferenceType1;
|
||||
typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _DifferenceType2;
|
||||
|
@ -629,11 +628,11 @@ parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __xs, _RandomAccessIte
|
|||
else
|
||||
{
|
||||
tbb::this_task_arena::isolate([=]() {
|
||||
typedef merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator3, _Compare,
|
||||
par_backend::binary_no_op, _LeafMerge>
|
||||
typedef __merge_task<_RandomAccessIterator1, _RandomAccessIterator2, _RandomAccessIterator3, _Compare,
|
||||
__binary_no_op, _LeafMerge>
|
||||
_TaskType;
|
||||
tbb::task::spawn_root_and_wait(*new (tbb::task::allocate_root()) _TaskType(
|
||||
__xs, __xe, __ys, __ye, __zs, __comp, par_backend::binary_no_op(), __leaf_merge));
|
||||
__xs, __xe, __ys, __ye, __zs, __comp, __binary_no_op(), __leaf_merge));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -643,13 +642,13 @@ parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __xs, _RandomAccessIte
|
|||
//------------------------------------------------------------------------
|
||||
template <class _ExecutionPolicy, typename _F1, typename _F2>
|
||||
void
|
||||
parallel_invoke(_ExecutionPolicy&&, _F1&& __f1, _F2&& __f2)
|
||||
__parallel_invoke(_ExecutionPolicy&&, _F1&& __f1, _F2&& __f2)
|
||||
{
|
||||
//TODO: a version of tbb::this_task_arena::isolate with variadic arguments pack should be added in the future
|
||||
tbb::this_task_arena::isolate([&]() { tbb::parallel_invoke(std::forward<_F1>(__f1), std::forward<_F2>(__f2)); });
|
||||
}
|
||||
|
||||
} // namespace par_backend
|
||||
} // namespace __par_backend
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_parallel_backend_tbb_H */
|
||||
|
|
|
@ -17,11 +17,11 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace par_backend
|
||||
namespace __par_backend
|
||||
{
|
||||
|
||||
//! Destroy sequence [xs,xe)
|
||||
struct serial_destroy
|
||||
struct __serial_destroy
|
||||
{
|
||||
template <typename _RandomAccessIterator>
|
||||
void
|
||||
|
@ -38,13 +38,13 @@ struct serial_destroy
|
|||
|
||||
//! Merge sequences [__xs,__xe) and [__ys,__ye) to output sequence [__zs,(__xe-__xs)+(__ye-__ys)), using std::move
|
||||
template <class _MoveValues, class _MoveSequences>
|
||||
struct serial_move_merge
|
||||
struct __serial_move_merge
|
||||
{
|
||||
const std::size_t _M_nmerge;
|
||||
_MoveValues _M_move_values;
|
||||
_MoveSequences _M_move_sequences;
|
||||
|
||||
explicit serial_move_merge(std::size_t __nmerge, _MoveValues __move_values, _MoveSequences __move_sequences)
|
||||
explicit __serial_move_merge(std::size_t __nmerge, _MoveValues __move_values, _MoveSequences __move_sequences)
|
||||
: _M_nmerge(__nmerge), _M_move_values(__move_values), _M_move_sequences(__move_sequences)
|
||||
{
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ struct serial_move_merge
|
|||
|
||||
template <typename _RandomAccessIterator1, typename _OutputIterator>
|
||||
void
|
||||
init_buf(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _OutputIterator __zs, bool __bMove)
|
||||
__init_buf(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _OutputIterator __zs, bool __bMove)
|
||||
{
|
||||
const _OutputIterator __ze = __zs + (__xe - __xs);
|
||||
typedef typename std::iterator_traits<_OutputIterator>::value_type _ValueType;
|
||||
|
@ -126,8 +126,9 @@ init_buf(_RandomAccessIterator1 __xs, _RandomAccessIterator1 __xe, _OutputIterat
|
|||
}
|
||||
}
|
||||
|
||||
// TODO is this actually used anywhere?
|
||||
template <typename _Buf>
|
||||
class stack
|
||||
class __stack
|
||||
{
|
||||
typedef typename std::iterator_traits<decltype(_Buf(0).get())>::value_type _ValueType;
|
||||
typedef typename std::iterator_traits<_ValueType*>::difference_type _DifferenceType;
|
||||
|
@ -136,14 +137,14 @@ class stack
|
|||
_ValueType* _M_ptr;
|
||||
_DifferenceType _M_maxsize;
|
||||
|
||||
stack(const stack&) = delete;
|
||||
__stack(const __stack&) = delete;
|
||||
void
|
||||
operator=(const stack&) = delete;
|
||||
operator=(const __stack&) = delete;
|
||||
|
||||
public:
|
||||
stack(_DifferenceType __max_size) : _M_buf(__max_size), _M_maxsize(__max_size) { _M_ptr = _M_buf.get(); }
|
||||
__stack(_DifferenceType __max_size) : _M_buf(__max_size), _M_maxsize(__max_size) { _M_ptr = _M_buf.get(); }
|
||||
|
||||
~stack()
|
||||
~__stack()
|
||||
{
|
||||
assert(size() <= _M_maxsize);
|
||||
while (!empty())
|
||||
|
@ -189,7 +190,7 @@ class stack
|
|||
}
|
||||
};
|
||||
|
||||
} // namespace par_backend
|
||||
} // namespace __par_backend
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_parallel_backend_utils_H */
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
@ -26,32 +26,32 @@ namespace internal
|
|||
Each f[i,j) must return a value in [i,j). */
|
||||
template <class _ExecutionPolicy, class _Index, class _Brick, class _Compare>
|
||||
_Index
|
||||
parallel_find(_ExecutionPolicy&& __exec, _Index __first, _Index __last, _Brick __f, _Compare __comp, bool __b_first)
|
||||
__parallel_find(_ExecutionPolicy&& __exec, _Index __first, _Index __last, _Brick __f, _Compare __comp, bool __b_first)
|
||||
{
|
||||
typedef typename std::iterator_traits<_Index>::difference_type _DifferenceType;
|
||||
const _DifferenceType __n = __last - __first;
|
||||
_DifferenceType __initial_dist = __b_first ? __n : -1;
|
||||
std::atomic<_DifferenceType> __extremum(__initial_dist);
|
||||
// TODO: find out what is better here: parallel_for or parallel_reduce
|
||||
par_backend::parallel_for(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__comp, __f, __first, &__extremum](_Index __i, _Index __j) {
|
||||
// See "Reducing Contention Through Priority Updates", PPoPP '13, for discussion of
|
||||
// why using a shared variable scales fairly well in this situation.
|
||||
if (__comp(__i - __first, __extremum))
|
||||
{
|
||||
_Index __res = __f(__i, __j);
|
||||
// If not '__last' returned then we found what we want so put this to extremum
|
||||
if (__res != __j)
|
||||
__par_backend::__parallel_for(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__comp, __f, __first, &__extremum](_Index __i, _Index __j) {
|
||||
// See "Reducing Contention Through Priority Updates", PPoPP '13, for discussion of
|
||||
// why using a shared variable scales fairly well in this situation.
|
||||
if (__comp(__i - __first, __extremum))
|
||||
{
|
||||
const _DifferenceType __k = __res - __first;
|
||||
for (_DifferenceType __old = __extremum; __comp(__k, __old);
|
||||
__old = __extremum)
|
||||
_Index __res = __f(__i, __j);
|
||||
// If not '__last' returned then we found what we want so put this to extremum
|
||||
if (__res != __j)
|
||||
{
|
||||
__extremum.compare_exchange_weak(__old, __k);
|
||||
const _DifferenceType __k = __res - __first;
|
||||
for (_DifferenceType __old = __extremum; __comp(__k, __old);
|
||||
__old = __extremum)
|
||||
{
|
||||
__extremum.compare_exchange_weak(__old, __k);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
return __extremum != __initial_dist ? __first + __extremum : __last;
|
||||
}
|
||||
|
||||
|
@ -61,21 +61,21 @@ parallel_find(_ExecutionPolicy&& __exec, _Index __first, _Index __last, _Brick _
|
|||
//! Return true if brick f[i,j) returns true for some subrange [i,j) of [first,last)
|
||||
template <class _ExecutionPolicy, class _Index, class _Brick>
|
||||
bool
|
||||
parallel_or(_ExecutionPolicy&& __exec, _Index __first, _Index __last, _Brick __f)
|
||||
__parallel_or(_ExecutionPolicy&& __exec, _Index __first, _Index __last, _Brick __f)
|
||||
{
|
||||
std::atomic<bool> __found(false);
|
||||
par_backend::parallel_for(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__f, &__found](_Index __i, _Index __j) {
|
||||
if (!__found.load(std::memory_order_relaxed) && __f(__i, __j))
|
||||
{
|
||||
__found.store(true, std::memory_order_relaxed);
|
||||
par_backend::cancel_execution();
|
||||
}
|
||||
});
|
||||
__par_backend::__parallel_for(std::forward<_ExecutionPolicy>(__exec), __first, __last,
|
||||
[__f, &__found](_Index __i, _Index __j) {
|
||||
if (!__found.load(std::memory_order_relaxed) && __f(__i, __j))
|
||||
{
|
||||
__found.store(true, std::memory_order_relaxed);
|
||||
__par_backend::__cancel_execution();
|
||||
}
|
||||
});
|
||||
return __found;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_parallel_impl_H */
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
// to support parallel STL.
|
||||
namespace __pstl
|
||||
{
|
||||
namespace unseq_backend
|
||||
namespace __unseq_backend
|
||||
{
|
||||
|
||||
// Expect vector width up to 64 (or 512 bit)
|
||||
|
@ -26,7 +26,7 @@ const std::size_t __lane_size = 64;
|
|||
|
||||
template <class _Iterator, class _DifferenceType, class _Function>
|
||||
_Iterator
|
||||
simd_walk_1(_Iterator __first, _DifferenceType __n, _Function __f) noexcept
|
||||
__simd_walk_1(_Iterator __first, _DifferenceType __n, _Function __f) noexcept
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD
|
||||
for (_DifferenceType __i = 0; __i < __n; ++__i)
|
||||
|
@ -37,7 +37,7 @@ simd_walk_1(_Iterator __first, _DifferenceType __n, _Function __f) noexcept
|
|||
|
||||
template <class _Iterator1, class _DifferenceType, class _Iterator2, class _Function>
|
||||
_Iterator2
|
||||
simd_walk_2(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Function __f) noexcept
|
||||
__simd_walk_2(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Function __f) noexcept
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD
|
||||
for (_DifferenceType __i = 0; __i < __n; ++__i)
|
||||
|
@ -47,7 +47,8 @@ simd_walk_2(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Func
|
|||
|
||||
template <class _Iterator1, class _DifferenceType, class _Iterator2, class _Iterator3, class _Function>
|
||||
_Iterator3
|
||||
simd_walk_3(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Iterator3 __first3, _Function __f) noexcept
|
||||
__simd_walk_3(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Iterator3 __first3,
|
||||
_Function __f) noexcept
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD
|
||||
for (_DifferenceType __i = 0; __i < __n; ++__i)
|
||||
|
@ -55,10 +56,10 @@ simd_walk_3(_Iterator1 __first1, _DifferenceType __n, _Iterator2 __first2, _Iter
|
|||
return __first3 + __n;
|
||||
}
|
||||
|
||||
// TODO: check whether simd_first() can be used here
|
||||
// TODO: check whether __simd_first() can be used here
|
||||
template <class _Index, class _DifferenceType, class _Pred>
|
||||
bool
|
||||
simd_or(_Index __first, _DifferenceType __n, _Pred __pred) noexcept
|
||||
__simd_or(_Index __first, _DifferenceType __n, _Pred __pred) noexcept
|
||||
{
|
||||
#if __PSTL_EARLYEXIT_PRESENT
|
||||
_DifferenceType __i;
|
||||
|
@ -98,7 +99,7 @@ simd_or(_Index __first, _DifferenceType __n, _Pred __pred) noexcept
|
|||
|
||||
template <class _Index, class _DifferenceType, class _Compare>
|
||||
_Index
|
||||
simd_first(_Index __first, _DifferenceType __begin, _DifferenceType __end, _Compare __comp) noexcept
|
||||
__simd_first(_Index __first, _DifferenceType __begin, _DifferenceType __end, _Compare __comp) noexcept
|
||||
{
|
||||
#if __PSTL_EARLYEXIT_PRESENT
|
||||
_DifferenceType __i = __begin;
|
||||
|
@ -158,7 +159,7 @@ simd_first(_Index __first, _DifferenceType __begin, _DifferenceType __end, _Comp
|
|||
|
||||
template <class _Index1, class _DifferenceType, class _Index2, class _Pred>
|
||||
std::pair<_Index1, _Index2>
|
||||
simd_first(_Index1 __first1, _DifferenceType __n, _Index2 __first2, _Pred __pred) noexcept
|
||||
__simd_first(_Index1 __first1, _DifferenceType __n, _Index2 __first2, _Pred __pred) noexcept
|
||||
{
|
||||
#if __PSTL_EARLYEXIT_PRESENT
|
||||
_DifferenceType __i = 0;
|
||||
|
@ -212,7 +213,7 @@ simd_first(_Index1 __first1, _DifferenceType __n, _Index2 __first2, _Pred __pred
|
|||
|
||||
template <class _Index, class _DifferenceType, class _Pred>
|
||||
_DifferenceType
|
||||
simd_count(_Index __index, _DifferenceType __n, _Pred __pred) noexcept
|
||||
__simd_count(_Index __index, _DifferenceType __n, _Pred __pred) noexcept
|
||||
{
|
||||
_DifferenceType __count = 0;
|
||||
__PSTL_PRAGMA_SIMD_REDUCTION(+ : __count)
|
||||
|
@ -225,8 +226,8 @@ simd_count(_Index __index, _DifferenceType __n, _Pred __pred) noexcept
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _OutputIterator, class _BinaryPredicate>
|
||||
_OutputIterator
|
||||
simd_unique_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator __result,
|
||||
_BinaryPredicate __pred) noexcept
|
||||
__simd_unique_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator __result,
|
||||
_BinaryPredicate __pred) noexcept
|
||||
{
|
||||
if (__n == 0)
|
||||
return __result;
|
||||
|
@ -249,7 +250,7 @@ simd_unique_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator __
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _OutputIterator, class _Assigner>
|
||||
_OutputIterator
|
||||
simd_assign(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, _Assigner __assigner) noexcept
|
||||
__simd_assign(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, _Assigner __assigner) noexcept
|
||||
{
|
||||
__PSTL_USE_NONTEMPORAL_STORES_IF_ALLOWED
|
||||
__PSTL_PRAGMA_SIMD
|
||||
|
@ -260,7 +261,7 @@ simd_assign(_InputIterator __first, _DifferenceType __n, _OutputIterator __resul
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _OutputIterator, class _UnaryPredicate>
|
||||
_OutputIterator
|
||||
simd_copy_if(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, _UnaryPredicate __pred) noexcept
|
||||
__simd_copy_if(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, _UnaryPredicate __pred) noexcept
|
||||
{
|
||||
_DifferenceType __cnt = 0;
|
||||
|
||||
|
@ -279,7 +280,7 @@ simd_copy_if(_InputIterator __first, _DifferenceType __n, _OutputIterator __resu
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _BinaryPredicate>
|
||||
_DifferenceType
|
||||
simd_calc_mask_2(_InputIterator __first, _DifferenceType __n, bool* __mask, _BinaryPredicate __pred) noexcept
|
||||
__simd_calc_mask_2(_InputIterator __first, _DifferenceType __n, bool* __mask, _BinaryPredicate __pred) noexcept
|
||||
{
|
||||
_DifferenceType __count = 0;
|
||||
|
||||
|
@ -294,7 +295,7 @@ simd_calc_mask_2(_InputIterator __first, _DifferenceType __n, bool* __mask, _Bin
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _UnaryPredicate>
|
||||
_DifferenceType
|
||||
simd_calc_mask_1(_InputIterator __first, _DifferenceType __n, bool* __mask, _UnaryPredicate __pred) noexcept
|
||||
__simd_calc_mask_1(_InputIterator __first, _DifferenceType __n, bool* __mask, _UnaryPredicate __pred) noexcept
|
||||
{
|
||||
_DifferenceType __count = 0;
|
||||
|
||||
|
@ -309,8 +310,8 @@ simd_calc_mask_1(_InputIterator __first, _DifferenceType __n, bool* __mask, _Una
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _OutputIterator, class _Assigner>
|
||||
void
|
||||
simd_copy_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, bool* __mask,
|
||||
_Assigner __assigner) noexcept
|
||||
__simd_copy_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator __result, bool* __mask,
|
||||
_Assigner __assigner) noexcept
|
||||
{
|
||||
_DifferenceType __cnt = 0;
|
||||
__PSTL_PRAGMA_SIMD
|
||||
|
@ -329,8 +330,8 @@ simd_copy_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator _
|
|||
|
||||
template <class _InputIterator, class _DifferenceType, class _OutputIterator1, class _OutputIterator2>
|
||||
void
|
||||
simd_partition_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator1 __out_true,
|
||||
_OutputIterator2 __out_false, bool* __mask) noexcept
|
||||
__simd_partition_by_mask(_InputIterator __first, _DifferenceType __n, _OutputIterator1 __out_true,
|
||||
_OutputIterator2 __out_false, bool* __mask) noexcept
|
||||
{
|
||||
_DifferenceType __cnt_true = 0, __cnt_false = 0;
|
||||
__PSTL_PRAGMA_SIMD
|
||||
|
@ -352,7 +353,7 @@ simd_partition_by_mask(_InputIterator __first, _DifferenceType __n, _OutputItera
|
|||
|
||||
template <class _Index, class _DifferenceType, class _Tp>
|
||||
_Index
|
||||
simd_fill_n(_Index __first, _DifferenceType __n, const _Tp& __value) noexcept
|
||||
__simd_fill_n(_Index __first, _DifferenceType __n, const _Tp& __value) noexcept
|
||||
{
|
||||
__PSTL_USE_NONTEMPORAL_STORES_IF_ALLOWED
|
||||
__PSTL_PRAGMA_SIMD
|
||||
|
@ -363,7 +364,7 @@ simd_fill_n(_Index __first, _DifferenceType __n, const _Tp& __value) noexcept
|
|||
|
||||
template <class _Index, class _DifferenceType, class _Generator>
|
||||
_Index
|
||||
simd_generate_n(_Index __first, _DifferenceType __size, _Generator __g) noexcept
|
||||
__simd_generate_n(_Index __first, _DifferenceType __size, _Generator __g) noexcept
|
||||
{
|
||||
__PSTL_USE_NONTEMPORAL_STORES_IF_ALLOWED
|
||||
__PSTL_PRAGMA_SIMD
|
||||
|
@ -374,7 +375,7 @@ simd_generate_n(_Index __first, _DifferenceType __size, _Generator __g) noexcept
|
|||
|
||||
template <class _Index, class _BinaryPredicate>
|
||||
_Index
|
||||
simd_adjacent_find(_Index __first, _Index __last, _BinaryPredicate __pred, bool __or_semantic) noexcept
|
||||
__simd_adjacent_find(_Index __first, _Index __last, _BinaryPredicate __pred, bool __or_semantic) noexcept
|
||||
{
|
||||
if (__last - __first < 2)
|
||||
return __last;
|
||||
|
@ -443,7 +444,7 @@ using is_arithmetic_plus = std::integral_constant<bool, std::is_arithmetic<_Tp>:
|
|||
|
||||
template <typename _DifferenceType, typename _Tp, typename _BinaryOperation, typename _UnaryOperation>
|
||||
typename std::enable_if<is_arithmetic_plus<_Tp, _BinaryOperation>::value, _Tp>::type
|
||||
simd_transform_reduce(_DifferenceType __n, _Tp __init, _BinaryOperation, _UnaryOperation __f) noexcept
|
||||
__simd_transform_reduce(_DifferenceType __n, _Tp __init, _BinaryOperation, _UnaryOperation __f) noexcept
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD_REDUCTION(+ : __init)
|
||||
for (_DifferenceType __i = 0; __i < __n; ++__i)
|
||||
|
@ -453,7 +454,7 @@ simd_transform_reduce(_DifferenceType __n, _Tp __init, _BinaryOperation, _UnaryO
|
|||
|
||||
template <typename _Size, typename _Tp, typename _BinaryOperation, typename _UnaryOperation>
|
||||
typename std::enable_if<!is_arithmetic_plus<_Tp, _BinaryOperation>::value, _Tp>::type
|
||||
simd_transform_reduce(_Size __n, _Tp __init, _BinaryOperation __binary_op, _UnaryOperation __f) noexcept
|
||||
__simd_transform_reduce(_Size __n, _Tp __init, _BinaryOperation __binary_op, _UnaryOperation __f) noexcept
|
||||
{
|
||||
const _Size __block_size = __lane_size / sizeof(_Tp);
|
||||
if (__n > 2 * __block_size && __block_size > 1)
|
||||
|
@ -510,8 +511,8 @@ simd_transform_reduce(_Size __n, _Tp __init, _BinaryOperation __binary_op, _Unar
|
|||
template <class _InputIterator, class _Size, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation>
|
||||
typename std::enable_if<is_arithmetic_plus<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation, /*Inclusive*/ std::false_type)
|
||||
__simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation, /*Inclusive*/ std::false_type)
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD_SCAN(+ : __init)
|
||||
for (_Size __i = 0; __i < __n; ++__i)
|
||||
|
@ -545,8 +546,8 @@ struct _Combiner
|
|||
template <class _InputIterator, class _Size, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation>
|
||||
typename std::enable_if<!is_arithmetic_plus<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation __binary_op, /*Inclusive*/ std::false_type)
|
||||
__simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation __binary_op, /*Inclusive*/ std::false_type)
|
||||
{
|
||||
typedef _Combiner<_Tp, _BinaryOperation> _CombinerType;
|
||||
_CombinerType __init_{__init, &__binary_op};
|
||||
|
@ -568,8 +569,8 @@ simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOpe
|
|||
template <class _InputIterator, class _Size, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation>
|
||||
typename std::enable_if<is_arithmetic_plus<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation, /*Inclusive*/ std::true_type)
|
||||
__simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation, /*Inclusive*/ std::true_type)
|
||||
{
|
||||
__PSTL_PRAGMA_SIMD_SCAN(+ : __init)
|
||||
for (_Size __i = 0; __i < __n; ++__i)
|
||||
|
@ -585,8 +586,8 @@ simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOpe
|
|||
template <class _InputIterator, class _Size, class _OutputIterator, class _UnaryOperation, class _Tp,
|
||||
class _BinaryOperation>
|
||||
typename std::enable_if<!is_arithmetic_plus<_Tp, _BinaryOperation>::value, std::pair<_OutputIterator, _Tp>>::type
|
||||
simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation __binary_op, std::true_type)
|
||||
__simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOperation __unary_op, _Tp __init,
|
||||
_BinaryOperation __binary_op, std::true_type)
|
||||
{
|
||||
typedef _Combiner<_Tp, _BinaryOperation> _CombinerType;
|
||||
_CombinerType __init_{__init, &__binary_op};
|
||||
|
@ -608,7 +609,7 @@ simd_scan(_InputIterator __first, _Size __n, _OutputIterator __result, _UnaryOpe
|
|||
// complexity [violation] - We will have at most (__n-1 + number_of_lanes) comparisons instead of at most __n-1.
|
||||
template <typename _ForwardIterator, typename _Size, typename _Compare>
|
||||
_ForwardIterator
|
||||
simd_min_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexcept
|
||||
__simd_min_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexcept
|
||||
{
|
||||
if (__n == 0)
|
||||
{
|
||||
|
@ -667,7 +668,7 @@ simd_min_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexcept
|
|||
// complexity [violation] - We will have at most (2*(__n-1) + 4*number_of_lanes) comparisons instead of at most [1.5*(__n-1)].
|
||||
template <typename _ForwardIterator, typename _Size, typename _Compare>
|
||||
std::pair<_ForwardIterator, _ForwardIterator>
|
||||
simd_minmax_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexcept
|
||||
__simd_minmax_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexcept
|
||||
{
|
||||
if (__n == 0)
|
||||
{
|
||||
|
@ -751,8 +752,8 @@ simd_minmax_element(_ForwardIterator __first, _Size __n, _Compare __comp) noexce
|
|||
template <class _InputIterator, class _DifferenceType, class _OutputIterator1, class _OutputIterator2,
|
||||
class _UnaryPredicate>
|
||||
std::pair<_OutputIterator1, _OutputIterator2>
|
||||
simd_partition_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator1 __out_true,
|
||||
_OutputIterator2 __out_false, _UnaryPredicate __pred) noexcept
|
||||
__simd_partition_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator1 __out_true,
|
||||
_OutputIterator2 __out_false, _UnaryPredicate __pred) noexcept
|
||||
{
|
||||
_DifferenceType __cnt_true = 0, __cnt_false = 0;
|
||||
|
||||
|
@ -776,8 +777,8 @@ simd_partition_copy(_InputIterator __first, _DifferenceType __n, _OutputIterator
|
|||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_ForwardIterator1
|
||||
simd_find_first_of(_ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last, _BinaryPredicate __pred) noexcept
|
||||
__simd_find_first_of(_ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
|
||||
_ForwardIterator2 __s_last, _BinaryPredicate __pred) noexcept
|
||||
{
|
||||
typedef typename std::iterator_traits<_ForwardIterator1>::difference_type _DifferencType;
|
||||
|
||||
|
@ -795,8 +796,8 @@ simd_find_first_of(_ForwardIterator1 __first, _ForwardIterator1 __last, _Forward
|
|||
{
|
||||
for (; __first != __last; ++__first)
|
||||
{
|
||||
if (simd_or(__s_first, __n2,
|
||||
internal::equal_value_by_pred<decltype(*__first), _BinaryPredicate>(*__first, __pred)))
|
||||
if (__simd_or(__s_first, __n2,
|
||||
__internal::__equal_value_by_pred<decltype(*__first), _BinaryPredicate>(*__first, __pred)))
|
||||
{
|
||||
return __first;
|
||||
}
|
||||
|
@ -806,10 +807,10 @@ simd_find_first_of(_ForwardIterator1 __first, _ForwardIterator1 __last, _Forward
|
|||
{
|
||||
for (; __s_first != __s_last; ++__s_first)
|
||||
{
|
||||
const auto __result = unseq_backend::simd_first(
|
||||
__first, _DifferencType(0), __n1, [__s_first, &__pred](_ForwardIterator1 __it, _DifferencType __i) {
|
||||
return __pred(__it[__i], *__s_first);
|
||||
});
|
||||
const auto __result = __simd_first(__first, _DifferencType(0), __n1,
|
||||
[__s_first, &__pred](_ForwardIterator1 __it, _DifferencType __i) {
|
||||
return __pred(__it[__i], *__s_first);
|
||||
});
|
||||
if (__result != __last)
|
||||
{
|
||||
return __result;
|
||||
|
@ -821,12 +822,12 @@ simd_find_first_of(_ForwardIterator1 __first, _ForwardIterator1 __last, _Forward
|
|||
|
||||
template <class _RandomAccessIterator, class _DifferenceType, class _UnaryPredicate>
|
||||
_RandomAccessIterator
|
||||
simd_remove_if(_RandomAccessIterator __first, _DifferenceType __n, _UnaryPredicate __pred) noexcept
|
||||
__simd_remove_if(_RandomAccessIterator __first, _DifferenceType __n, _UnaryPredicate __pred) noexcept
|
||||
{
|
||||
// find first element we need to remove
|
||||
auto __current = unseq_backend::simd_first(
|
||||
__first, _DifferenceType(0), __n,
|
||||
[&__pred](_RandomAccessIterator __it, _DifferenceType __i) { return __pred(__it[__i]); });
|
||||
auto __current =
|
||||
__simd_first(__first, _DifferenceType(0), __n,
|
||||
[&__pred](_RandomAccessIterator __it, _DifferenceType __i) { return __pred(__it[__i]); });
|
||||
__n -= __current - __first;
|
||||
|
||||
// if we have in sequence only one element that pred(__current[1]) != false we can exit the function
|
||||
|
@ -848,7 +849,7 @@ simd_remove_if(_RandomAccessIterator __first, _DifferenceType __n, _UnaryPredica
|
|||
}
|
||||
return __current + __cnt;
|
||||
}
|
||||
} // namespace unseq_backend
|
||||
} // namespace __unseq_backend
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_unseq_backend_simd_H */
|
||||
|
|
|
@ -15,12 +15,12 @@
|
|||
|
||||
namespace __pstl
|
||||
{
|
||||
namespace internal
|
||||
namespace __internal
|
||||
{
|
||||
|
||||
template <typename _Fp>
|
||||
typename std::result_of<_Fp()>::type
|
||||
except_handler(_Fp __f)
|
||||
__except_handler(_Fp __f)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -38,46 +38,46 @@ except_handler(_Fp __f)
|
|||
|
||||
template <typename _Fp>
|
||||
void
|
||||
invoke_if(std::true_type, _Fp __f)
|
||||
__invoke_if(std::true_type, _Fp __f)
|
||||
{
|
||||
__f();
|
||||
}
|
||||
|
||||
template <typename _Fp>
|
||||
void
|
||||
invoke_if(std::false_type, _Fp __f)
|
||||
__invoke_if(std::false_type, _Fp __f)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename _Fp>
|
||||
void
|
||||
invoke_if_not(std::false_type, _Fp __f)
|
||||
__invoke_if_not(std::false_type, _Fp __f)
|
||||
{
|
||||
__f();
|
||||
}
|
||||
|
||||
template <typename _Fp>
|
||||
void
|
||||
invoke_if_not(std::true_type, _Fp __f)
|
||||
__invoke_if_not(std::true_type, _Fp __f)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename _F1, typename _F2>
|
||||
typename std::result_of<_F1()>::type
|
||||
invoke_if_else(std::true_type, _F1 __f1, _F2 __f2)
|
||||
__invoke_if_else(std::true_type, _F1 __f1, _F2 __f2)
|
||||
{
|
||||
return __f1();
|
||||
}
|
||||
|
||||
template <typename _F1, typename _F2>
|
||||
typename std::result_of<_F2()>::type
|
||||
invoke_if_else(std::false_type, _F1 __f1, _F2 __f2)
|
||||
__invoke_if_else(std::false_type, _F1 __f1, _F2 __f2)
|
||||
{
|
||||
return __f2();
|
||||
}
|
||||
|
||||
//! Unary operator that returns reference to its argument.
|
||||
struct no_op
|
||||
struct __no_op
|
||||
{
|
||||
template <typename _Tp>
|
||||
_Tp&&
|
||||
|
@ -89,12 +89,12 @@ struct no_op
|
|||
|
||||
//! Logical negation of a predicate
|
||||
template <typename _Pred>
|
||||
class not_pred
|
||||
class __not_pred
|
||||
{
|
||||
_Pred _M_pred;
|
||||
|
||||
public:
|
||||
explicit not_pred(_Pred __pred) : _M_pred(__pred) {}
|
||||
explicit __not_pred(_Pred __pred) : _M_pred(__pred) {}
|
||||
|
||||
template <typename... _Args>
|
||||
bool
|
||||
|
@ -105,12 +105,12 @@ class not_pred
|
|||
};
|
||||
|
||||
template <typename _Pred>
|
||||
class reorder_pred
|
||||
class __reorder_pred
|
||||
{
|
||||
_Pred _M_pred;
|
||||
|
||||
public:
|
||||
explicit reorder_pred(_Pred __pred) : _M_pred(__pred) {}
|
||||
explicit __reorder_pred(_Pred __pred) : _M_pred(__pred) {}
|
||||
|
||||
template <typename _FTp, typename _STp>
|
||||
bool
|
||||
|
@ -123,10 +123,10 @@ class reorder_pred
|
|||
//! "==" comparison.
|
||||
/** Not called "equal" to avoid (possibly unfounded) concerns about accidental invocation via
|
||||
argument-dependent name lookup by code expecting to find the usual std::equal. */
|
||||
class pstl_equal
|
||||
class __pstl_equal
|
||||
{
|
||||
public:
|
||||
explicit pstl_equal() {}
|
||||
explicit __pstl_equal() {}
|
||||
|
||||
template <typename _Xp, typename _Yp>
|
||||
bool
|
||||
|
@ -137,10 +137,10 @@ class pstl_equal
|
|||
};
|
||||
|
||||
//! "<" comparison.
|
||||
class pstl_less
|
||||
class __pstl_less
|
||||
{
|
||||
public:
|
||||
explicit pstl_less() {}
|
||||
explicit __pstl_less() {}
|
||||
|
||||
template <typename _Xp, typename _Yp>
|
||||
bool
|
||||
|
@ -152,13 +152,13 @@ class pstl_less
|
|||
|
||||
//! Like a polymorphic lambda for pred(...,value)
|
||||
template <typename _Tp, typename _Predicate>
|
||||
class equal_value_by_pred
|
||||
class __equal_value_by_pred
|
||||
{
|
||||
const _Tp& _M_value;
|
||||
_Predicate _M_pred;
|
||||
|
||||
public:
|
||||
equal_value_by_pred(const _Tp& __value, _Predicate __pred) : _M_value(__value), _M_pred(__pred) {}
|
||||
__equal_value_by_pred(const _Tp& __value, _Predicate __pred) : _M_value(__value), _M_pred(__pred) {}
|
||||
|
||||
template <typename _Arg>
|
||||
bool
|
||||
|
@ -170,12 +170,12 @@ class equal_value_by_pred
|
|||
|
||||
//! Like a polymorphic lambda for ==value
|
||||
template <typename _Tp>
|
||||
class equal_value
|
||||
class __equal_value
|
||||
{
|
||||
const _Tp& _M_value;
|
||||
|
||||
public:
|
||||
explicit equal_value(const _Tp& __value) : _M_value(__value) {}
|
||||
explicit __equal_value(const _Tp& __value) : _M_value(__value) {}
|
||||
|
||||
template <typename _Arg>
|
||||
bool
|
||||
|
@ -187,12 +187,12 @@ class equal_value
|
|||
|
||||
//! Logical negation of ==value
|
||||
template <typename _Tp>
|
||||
class not_equal_value
|
||||
class __not_equal_value
|
||||
{
|
||||
const _Tp& _M_value;
|
||||
|
||||
public:
|
||||
explicit not_equal_value(const _Tp& __value) : _M_value(__value) {}
|
||||
explicit __not_equal_value(const _Tp& __value) : _M_value(__value) {}
|
||||
|
||||
template <typename _Arg>
|
||||
bool
|
||||
|
@ -204,7 +204,7 @@ class not_equal_value
|
|||
|
||||
template <typename _ForwardIterator, typename _Compare>
|
||||
_ForwardIterator
|
||||
cmp_iterators_by_values(_ForwardIterator __a, _ForwardIterator __b, _Compare __comp)
|
||||
__cmp_iterators_by_values(_ForwardIterator __a, _ForwardIterator __b, _Compare __comp)
|
||||
{
|
||||
if (__a < __b)
|
||||
{ // we should return closer iterator
|
||||
|
@ -216,7 +216,7 @@ cmp_iterators_by_values(_ForwardIterator __a, _ForwardIterator __b, _Compare __c
|
|||
}
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace __internal
|
||||
} // namespace __pstl
|
||||
|
||||
#endif /* __PSTL_utils_H */
|
||||
|
|
|
@ -39,7 +39,7 @@ struct test_partition_copy
|
|||
EXPECT_TRUE(std::distance(true_first, actual_ret.first) == std::count_if(first, last, unary_op),
|
||||
"partition_copy has wrong effect from true sequence");
|
||||
EXPECT_TRUE(std::distance(false_first, actual_ret.second) ==
|
||||
std::count_if(first, last, __pstl::internal::not_pred<UnaryOp>(unary_op)),
|
||||
std::count_if(first, last, __pstl::__internal::__not_pred<UnaryOp>(unary_op)),
|
||||
"partition_copy has wrong effect from false sequence");
|
||||
}
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ struct test_non_const
|
|||
int32_t
|
||||
main()
|
||||
{
|
||||
test<int32_t, float32_t>(__pstl::internal::equal_value<int32_t>(666));
|
||||
test<int32_t, float32_t>(__pstl::__internal::__equal_value<int32_t>(666));
|
||||
test<uint16_t, uint8_t>([](const uint16_t& elem) { return elem % 3 < 2; });
|
||||
test<float64_t, int64_t>([](const float64_t& elem) { return elem * elem - 3.5 * elem > 10; });
|
||||
test<copy_int, copy_int>([](const copy_int& val) { return val.value / 5 > 2; });
|
||||
|
|
|
@ -103,7 +103,7 @@ int32_t
|
|||
main()
|
||||
{
|
||||
|
||||
test_includes<float64_t, float64_t>(__pstl::internal::pstl_less());
|
||||
test_includes<float64_t, float64_t>(__pstl::__internal::__pstl_less());
|
||||
test_includes<Num<int64_t>, Num<int32_t>>([](const Num<int64_t>& x, const Num<int32_t>& y) { return x < y; });
|
||||
std::cout << done() << std::endl;
|
||||
|
||||
|
|
|
@ -156,7 +156,7 @@ int32_t
|
|||
main()
|
||||
{
|
||||
|
||||
test_set<float64_t, float64_t>(__pstl::internal::pstl_less());
|
||||
test_set<float64_t, float64_t>(__pstl::__internal::__pstl_less());
|
||||
test_set<Num<int64_t>, Num<int32_t>>([](const Num<int64_t>& x, const Num<int32_t>& y) { return x < y; });
|
||||
|
||||
test_algo_basic_double<int32_t>(run_for_rnd_fw<test_non_const<int32_t>>());
|
||||
|
|
|
@ -1238,7 +1238,7 @@ static void
|
|||
invoke_if(Policy&& p, F f)
|
||||
{
|
||||
#if __PSTL_ICC_16_VC14_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN || __PSTL_ICC_17_VC141_TEST_SIMD_LAMBDA_DEBUG_32_BROKEN
|
||||
__pstl::internal::invoke_if_not(__pstl::internal::allow_unsequenced<Policy>(), f);
|
||||
__pstl::__internal::invoke_if_not(__pstl::__internal::allow_unsequenced<Policy>(), f);
|
||||
#else
|
||||
f();
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue