2 //===-- glue_algorithm_impl.h ---------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef __PSTL_glue_algorithm_impl_H
11 #define __PSTL_glue_algorithm_impl_H
15 #include "execution_defs.h"
17 #include "algorithm_fwd.h"
18 #include "numeric_fwd.h" /* count and count_if use __pattern_transform_reduce */
25 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Predicate
>
26 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
27 any_of(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Predicate __pred
)
29 using namespace __pstl
;
30 return __internal::__pattern_any_of(
31 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
32 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
33 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
38 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Pred
>
39 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
40 all_of(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Pred __pred
)
42 return !std::any_of(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
43 __pstl::__internal::__not_pred
<_Pred
>(__pred
));
48 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Predicate
>
49 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
50 none_of(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Predicate __pred
)
52 return !std::any_of(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
);
57 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Function
>
58 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
59 for_each(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Function __f
)
61 using namespace __pstl
;
62 __internal::__pattern_walk1(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __f
,
63 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
64 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
67 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Size
, class _Function
>
68 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
69 for_each_n(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _Size __n
, _Function __f
)
71 using namespace __pstl
;
72 return __internal::__pattern_walk1_n(
73 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __n
, __f
,
74 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
75 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
80 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Predicate
>
81 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
82 find_if(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Predicate __pred
)
84 using namespace __pstl
;
85 return __internal::__pattern_find_if(
86 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
87 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
88 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
91 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Predicate
>
92 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
93 find_if_not(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Predicate __pred
)
95 return std::find_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
96 __pstl::__internal::__not_pred
<_Predicate
>(__pred
));
99 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Tp
>
100 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
101 find(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, const _Tp
& __value
)
103 return std::find_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
104 __pstl::__internal::__equal_value
<_Tp
>(__value
));
108 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
109 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
110 find_end(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __s_first
,
111 _ForwardIterator2 __s_last
, _BinaryPredicate __pred
)
113 using namespace __pstl
;
114 return __internal::__pattern_find_end(
115 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
, __pred
,
116 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
117 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
120 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
121 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
122 find_end(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __s_first
,
123 _ForwardIterator2 __s_last
)
125 return std::find_end(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
,
126 __pstl::__internal::__pstl_equal());
129 // [alg.find_first_of]
130 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
131 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
132 find_first_of(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
,
133 _ForwardIterator2 __s_first
, _ForwardIterator2 __s_last
, _BinaryPredicate __pred
)
135 using namespace __pstl
;
136 return __internal::__pattern_find_first_of(
137 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
, __pred
,
138 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
139 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
142 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
143 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
144 find_first_of(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
,
145 _ForwardIterator2 __s_first
, _ForwardIterator2 __s_last
)
147 return std::find_first_of(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
,
148 __pstl::__internal::__pstl_equal());
151 // [alg.adjacent_find]
152 template <class _ExecutionPolicy
, class _ForwardIterator
>
153 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
154 adjacent_find(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
156 typedef typename iterator_traits
<_ForwardIterator
>::value_type _ValueType
;
157 using namespace __pstl
;
158 return __internal::__pattern_adjacent_find(
159 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::equal_to
<_ValueType
>(),
160 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
161 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
), /*first_semantic*/ false);
164 template <class _ExecutionPolicy
, class _ForwardIterator
, class _BinaryPredicate
>
165 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
166 adjacent_find(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _BinaryPredicate __pred
)
168 using namespace __pstl
;
169 return __internal::__pattern_adjacent_find(
170 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
171 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
172 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
), /*first_semantic*/ false);
177 // Implementation note: count and count_if call the pattern directly instead of calling std::transform_reduce
178 // so that we do not have to include <numeric>.
180 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Tp
>
181 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
,
182 typename iterator_traits
<_ForwardIterator
>::difference_type
>
183 count(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, const _Tp
& __value
)
185 typedef typename iterator_traits
<_ForwardIterator
>::value_type _ValueType
;
186 using namespace __pstl
;
187 return __internal::__pattern_count(
188 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
189 [&__value
](const _ValueType
& __x
) { return __value
== __x
; },
190 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
191 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
194 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Predicate
>
195 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
,
196 typename iterator_traits
<_ForwardIterator
>::difference_type
>
197 count_if(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Predicate __pred
)
199 using namespace __pstl
;
200 return __internal::__pattern_count(
201 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
202 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
203 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
208 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
209 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
210 search(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __s_first
,
211 _ForwardIterator2 __s_last
, _BinaryPredicate __pred
)
213 using namespace __pstl
;
214 return __internal::__pattern_search(
215 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
, __pred
,
216 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
217 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
220 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
221 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator1
>
222 search(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __s_first
,
223 _ForwardIterator2 __s_last
)
225 return std::search(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __s_first
, __s_last
,
226 __pstl::__internal::__pstl_equal());
229 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Size
, class _Tp
, class _BinaryPredicate
>
230 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
231 search_n(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Size __count
,
232 const _Tp
& __value
, _BinaryPredicate __pred
)
234 using namespace __pstl
;
235 return __internal::__pattern_search_n(
236 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __count
, __value
, __pred
,
237 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
238 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
241 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Size
, class _Tp
>
242 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
243 search_n(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Size __count
,
246 return std::search_n(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __count
, __value
,
247 std::equal_to
<typename iterator_traits
<_ForwardIterator
>::value_type
>());
252 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
253 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
254 copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
)
256 using namespace __pstl
;
257 const auto __is_vector
=
258 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
);
260 return __internal::__pattern_walk2_brick(
261 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
262 [__is_vector
](_ForwardIterator1 __begin
, _ForwardIterator1 __end
, _ForwardIterator2 __res
) {
263 return __internal::__brick_copy(__begin
, __end
, __res
, __is_vector
);
265 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
268 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _Size
, class _ForwardIterator2
>
269 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
270 copy_n(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _Size __n
, _ForwardIterator2 __result
)
272 using namespace __pstl
;
273 const auto __is_vector
=
274 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
);
276 return __internal::__pattern_walk2_brick_n(
277 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __n
, __result
,
278 [__is_vector
](_ForwardIterator1 __begin
, _Size __sz
, _ForwardIterator2 __res
) {
279 return __internal::__brick_copy_n(__begin
, __sz
, __res
, __is_vector
);
281 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
284 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Predicate
>
285 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
286 copy_if(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
,
289 using namespace __pstl
;
290 return __internal::__pattern_copy_if(
291 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
, __pred
,
292 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
293 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
298 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
299 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
300 swap_ranges(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
301 _ForwardIterator2 __first2
)
303 using namespace __pstl
;
304 typedef typename iterator_traits
<_ForwardIterator1
>::reference _ReferenceType1
;
305 typedef typename iterator_traits
<_ForwardIterator2
>::reference _ReferenceType2
;
306 return __internal::__pattern_walk2(
307 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
,
308 [](_ReferenceType1 __x
, _ReferenceType2 __y
) {
312 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
313 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
318 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _UnaryOperation
>
319 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
320 transform(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
,
321 _UnaryOperation __op
)
323 typedef typename iterator_traits
<_ForwardIterator1
>::reference _InputType
;
324 typedef typename iterator_traits
<_ForwardIterator2
>::reference _OutputType
;
325 using namespace __pstl
;
326 return __internal::__pattern_walk2(
327 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
328 [__op
](_InputType __x
, _OutputType __y
) mutable { __y
= __op(__x
); },
329 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
330 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
333 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
334 class _BinaryOperation
>
335 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
336 transform(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
337 _ForwardIterator __result
, _BinaryOperation __op
)
339 typedef typename iterator_traits
<_ForwardIterator1
>::reference _Input1Type
;
340 typedef typename iterator_traits
<_ForwardIterator2
>::reference _Input2Type
;
341 typedef typename iterator_traits
<_ForwardIterator
>::reference _OutputType
;
342 using namespace __pstl
;
343 return __internal::__pattern_walk3(
344 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __result
,
345 [__op
](_Input1Type x
, _Input2Type y
, _OutputType z
) mutable { z
= __op(x
, y
); },
346 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
347 _ForwardIterator
>(__exec
),
348 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
349 _ForwardIterator
>(__exec
));
354 template <class _ExecutionPolicy
, class _ForwardIterator
, class _UnaryPredicate
, class _Tp
>
355 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
356 replace_if(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _UnaryPredicate __pred
,
357 const _Tp
& __new_value
)
359 using namespace __pstl
;
360 typedef typename iterator_traits
<_ForwardIterator
>::reference _ElementType
;
361 __internal::__pattern_walk1(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
362 [&__pred
, &__new_value
](_ElementType __elem
) {
365 __elem
= __new_value
;
368 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
369 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
372 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Tp
>
373 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
374 replace(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, const _Tp
& __old_value
,
375 const _Tp
& __new_value
)
377 std::replace_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
378 __pstl::__internal::__equal_value
<_Tp
>(__old_value
), __new_value
);
381 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _UnaryPredicate
, class _Tp
>
382 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
383 replace_copy_if(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
,
384 _ForwardIterator2 __result
, _UnaryPredicate __pred
, const _Tp
& __new_value
)
386 typedef typename iterator_traits
<_ForwardIterator1
>::reference _InputType
;
387 typedef typename iterator_traits
<_ForwardIterator2
>::reference _OutputType
;
388 using namespace __pstl
;
389 return __internal::__pattern_walk2(
390 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
391 [__pred
, &__new_value
](_InputType __x
, _OutputType __y
) mutable { __y
= __pred(__x
) ? __new_value
: __x
; },
392 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
393 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
396 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Tp
>
397 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
398 replace_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
,
399 const _Tp
& __old_value
, const _Tp
& __new_value
)
401 return std::replace_copy_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
402 __pstl::__internal::__equal_value
<_Tp
>(__old_value
), __new_value
);
407 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Tp
>
408 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
409 fill(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, const _Tp
& __value
)
411 using namespace __pstl
;
412 __internal::__pattern_fill(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __value
,
413 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
414 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
417 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Size
, class _Tp
>
418 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
419 fill_n(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _Size __count
, const _Tp
& __value
)
424 using namespace __pstl
;
425 return __internal::__pattern_fill_n(
426 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __count
, __value
,
427 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
428 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
432 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Generator
>
433 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
434 generate(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Generator __g
)
436 using namespace __pstl
;
437 __internal::__pattern_generate(
438 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __g
,
439 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
440 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
443 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Size
, class _Generator
>
444 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
445 generate_n(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _Size __count
, _Generator __g
)
450 using namespace __pstl
;
451 return __internal::__pattern_generate_n(
452 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __count
, __g
,
453 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
454 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
459 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Predicate
>
460 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
461 remove_copy_if(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
,
462 _ForwardIterator2 __result
, _Predicate __pred
)
464 return std::copy_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
465 __pstl::__internal::__not_pred
<_Predicate
>(__pred
));
468 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Tp
>
469 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
470 remove_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
,
473 return std::copy_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
,
474 __pstl::__internal::__not_equal_value
<_Tp
>(__value
));
477 template <class _ExecutionPolicy
, class _ForwardIterator
, class _UnaryPredicate
>
478 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
479 remove_if(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _UnaryPredicate __pred
)
481 using namespace __pstl
;
482 return __internal::__pattern_remove_if(
483 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
484 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
485 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
488 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Tp
>
489 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
490 remove(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, const _Tp
& __value
)
492 return std::remove_if(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
493 __pstl::__internal::__equal_value
<_Tp
>(__value
));
498 template <class _ExecutionPolicy
, class _ForwardIterator
, class _BinaryPredicate
>
499 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
500 unique(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _BinaryPredicate __pred
)
502 using namespace __pstl
;
503 return __internal::__pattern_unique(
504 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
505 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
506 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
509 template <class _ExecutionPolicy
, class _ForwardIterator
>
510 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
511 unique(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
513 return std::unique(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pstl::__internal::__pstl_equal());
516 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
517 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
518 unique_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
,
519 _BinaryPredicate __pred
)
521 using namespace __pstl
;
522 return __internal::__pattern_unique_copy(
523 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __result
, __pred
,
524 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
525 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
528 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
529 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
530 unique_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __result
)
532 return std::unique_copy(__exec
, __first
, __last
, __result
, __pstl::__internal::__pstl_equal());
537 template <class _ExecutionPolicy
, class _BidirectionalIterator
>
538 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
539 reverse(_ExecutionPolicy
&& __exec
, _BidirectionalIterator __first
, _BidirectionalIterator __last
)
541 using namespace __pstl
;
542 __internal::__pattern_reverse(
543 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
544 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
),
545 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
));
548 template <class _ExecutionPolicy
, class _BidirectionalIterator
, class _ForwardIterator
>
549 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
550 reverse_copy(_ExecutionPolicy
&& __exec
, _BidirectionalIterator __first
, _BidirectionalIterator __last
,
551 _ForwardIterator __d_first
)
553 using namespace __pstl
;
554 return __internal::__pattern_reverse_copy(
555 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __d_first
,
556 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
, _ForwardIterator
>(__exec
),
557 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
, _ForwardIterator
>(__exec
));
562 template <class _ExecutionPolicy
, class _ForwardIterator
>
563 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
564 rotate(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __middle
, _ForwardIterator __last
)
566 using namespace __pstl
;
567 return __internal::__pattern_rotate(
568 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
,
569 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
570 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
573 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
574 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
575 rotate_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __middle
, _ForwardIterator1 __last
,
576 _ForwardIterator2 __result
)
578 using namespace __pstl
;
579 return __internal::__pattern_rotate_copy(
580 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
, __result
,
581 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
582 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
587 template <class _ExecutionPolicy
, class _ForwardIterator
, class _UnaryPredicate
>
588 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
589 is_partitioned(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _UnaryPredicate __pred
)
591 using namespace __pstl
;
592 return __internal::__pattern_is_partitioned(
593 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
594 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
595 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
598 template <class _ExecutionPolicy
, class _ForwardIterator
, class _UnaryPredicate
>
599 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
600 partition(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _UnaryPredicate __pred
)
602 using namespace __pstl
;
603 return __internal::__pattern_partition(
604 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
605 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
606 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
609 template <class _ExecutionPolicy
, class _BidirectionalIterator
, class _UnaryPredicate
>
610 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _BidirectionalIterator
>
611 stable_partition(_ExecutionPolicy
&& __exec
, _BidirectionalIterator __first
, _BidirectionalIterator __last
,
612 _UnaryPredicate __pred
)
614 using namespace __pstl
;
615 return __internal::__pattern_stable_partition(
616 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pred
,
617 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
),
618 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
));
621 template <class _ExecutionPolicy
, class _ForwardIterator
, class _ForwardIterator1
, class _ForwardIterator2
,
622 class _UnaryPredicate
>
623 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator1
, _ForwardIterator2
>>
624 partition_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
,
625 _ForwardIterator1 __out_true
, _ForwardIterator2 __out_false
, _UnaryPredicate __pred
)
627 using namespace __pstl
;
628 return __internal::__pattern_partition_copy(
629 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __out_true
, __out_false
, __pred
,
630 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
, _ForwardIterator1
,
631 _ForwardIterator2
>(__exec
),
632 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
, _ForwardIterator1
,
633 _ForwardIterator2
>(__exec
));
638 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
639 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
640 sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
, _Compare __comp
)
642 typedef typename iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
643 using namespace __pstl
;
644 return __internal::__pattern_sort(
645 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
,
646 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
647 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
648 typename
std::is_move_constructible
<_InputType
>::type());
651 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
652 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
653 sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
)
655 typedef typename
std::iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
656 std::sort(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
661 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
662 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
663 stable_sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
, _Compare __comp
)
665 using namespace __pstl
;
666 return __internal::__pattern_stable_sort(
667 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
,
668 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
669 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
));
672 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
673 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
674 stable_sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
)
676 typedef typename
std::iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
677 std::stable_sort(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
682 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
683 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator1
, _ForwardIterator2
>>
684 mismatch(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
685 _ForwardIterator2 __last2
, _BinaryPredicate __pred
)
687 using namespace __pstl
;
688 return __internal::__pattern_mismatch(
689 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __pred
,
690 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
691 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
694 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
695 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator1
, _ForwardIterator2
>>
696 mismatch(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
697 _BinaryPredicate __pred
)
699 return std::mismatch(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
,
700 std::next(__first2
, std::distance(__first1
, __last1
)), __pred
);
703 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
704 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator1
, _ForwardIterator2
>>
705 mismatch(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
706 _ForwardIterator2 __last2
)
708 return std::mismatch(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
,
709 __pstl::__internal::__pstl_equal());
712 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
713 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator1
, _ForwardIterator2
>>
714 mismatch(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
)
716 //TODO: to get rid of "distance"
717 return std::mismatch(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
,
718 std::next(__first2
, std::distance(__first1
, __last1
)));
723 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
724 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
725 equal(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
726 _BinaryPredicate __p
)
728 using namespace __pstl
;
729 return __internal::__pattern_equal(
730 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __p
,
731 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
>(__exec
),
732 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
>(__exec
));
735 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
736 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
737 equal(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
)
739 return std::equal(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
,
740 __pstl::__internal::__pstl_equal());
743 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _BinaryPredicate
>
744 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
745 equal(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
746 _ForwardIterator2 __last2
, _BinaryPredicate __p
)
748 //TODO: to get rid of "distance"
749 if (std::distance(__first1
, __last1
) == std::distance(__first2
, __last2
))
750 return std::equal(__first1
, __last1
, __first2
, __p
);
755 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
756 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
757 equal(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
758 _ForwardIterator2 __last2
)
760 return std::equal(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
,
761 __pstl::__internal::__pstl_equal());
765 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
766 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator2
>
767 move(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first
, _ForwardIterator1 __last
, _ForwardIterator2 __d_first
)
769 using namespace __pstl
;
770 const auto __is_vector
=
771 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
);
773 return __internal::__pattern_walk2_brick(
774 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __d_first
,
775 [__is_vector
](_ForwardIterator1 __begin
, _ForwardIterator1 __end
, _ForwardIterator2 __res
) {
776 return __internal::__brick_move(__begin
, __end
, __res
, __is_vector
);
778 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
783 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
784 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
785 partial_sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __middle
,
786 _RandomAccessIterator __last
, _Compare __comp
)
788 using namespace __pstl
;
789 __internal::__pattern_partial_sort(
790 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
, __comp
,
791 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
792 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
));
795 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
796 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
797 partial_sort(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __middle
,
798 _RandomAccessIterator __last
)
800 typedef typename iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
801 std::partial_sort(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
, std::less
<_InputType
>());
804 // [partial.sort.copy]
806 template <class _ExecutionPolicy
, class _ForwardIterator
, class _RandomAccessIterator
, class _Compare
>
807 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _RandomAccessIterator
>
808 partial_sort_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
,
809 _RandomAccessIterator __d_first
, _RandomAccessIterator __d_last
, _Compare __comp
)
811 using namespace __pstl
;
812 return __internal::__pattern_partial_sort_copy(
813 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __d_first
, __d_last
, __comp
,
814 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
, _RandomAccessIterator
>(__exec
),
815 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
, _RandomAccessIterator
>(__exec
));
818 template <class _ExecutionPolicy
, class _ForwardIterator
, class _RandomAccessIterator
>
819 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _RandomAccessIterator
>
820 partial_sort_copy(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
,
821 _RandomAccessIterator __d_first
, _RandomAccessIterator __d_last
)
823 return std::partial_sort_copy(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __d_first
, __d_last
,
824 __pstl::__internal::__pstl_less());
828 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Compare
>
829 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
830 is_sorted_until(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Compare __comp
)
832 using namespace __pstl
;
833 const _ForwardIterator __res
= __internal::__pattern_adjacent_find(
834 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __pstl::__internal::__reorder_pred
<_Compare
>(__comp
),
835 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
836 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
), /*first_semantic*/ false);
837 return __res
== __last
? __last
: std::next(__res
);
840 template <class _ExecutionPolicy
, class _ForwardIterator
>
841 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
842 is_sorted_until(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
844 typedef typename
std::iterator_traits
<_ForwardIterator
>::value_type _InputType
;
845 return is_sorted_until(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
848 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Compare
>
849 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
850 is_sorted(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Compare __comp
)
852 using namespace __pstl
;
853 return __internal::__pattern_adjacent_find(
854 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __internal::__reorder_pred
<_Compare
>(__comp
),
855 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
856 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
857 /*or_semantic*/ true) == __last
;
860 template <class _ExecutionPolicy
, class _ForwardIterator
>
861 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
862 is_sorted(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
864 typedef typename
std::iterator_traits
<_ForwardIterator
>::value_type _InputType
;
865 return std::is_sorted(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
869 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
871 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
872 merge(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
873 _ForwardIterator2 __last2
, _ForwardIterator __d_first
, _Compare __comp
)
875 using namespace __pstl
;
876 return __internal::__pattern_merge(
877 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __d_first
, __comp
,
878 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
879 _ForwardIterator
>(__exec
),
880 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
881 _ForwardIterator
>(__exec
));
884 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
>
885 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
886 merge(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
887 _ForwardIterator2 __last2
, _ForwardIterator __d_first
)
889 return std::merge(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __d_first
,
890 __pstl::__internal::__pstl_less());
893 template <class _ExecutionPolicy
, class _BidirectionalIterator
, class _Compare
>
894 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
895 inplace_merge(_ExecutionPolicy
&& __exec
, _BidirectionalIterator __first
, _BidirectionalIterator __middle
,
896 _BidirectionalIterator __last
, _Compare __comp
)
898 using namespace __pstl
;
899 __internal::__pattern_inplace_merge(
900 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
, __comp
,
901 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
),
902 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _BidirectionalIterator
>(__exec
));
905 template <class _ExecutionPolicy
, class _BidirectionalIterator
>
906 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
907 inplace_merge(_ExecutionPolicy
&& __exec
, _BidirectionalIterator __first
, _BidirectionalIterator __middle
,
908 _BidirectionalIterator __last
)
910 typedef typename
std::iterator_traits
<_BidirectionalIterator
>::value_type _InputType
;
911 std::inplace_merge(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __middle
, __last
, std::less
<_InputType
>());
916 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Compare
>
917 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
918 includes(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
919 _ForwardIterator2 __last2
, _Compare __comp
)
921 using namespace __pstl
;
922 return __internal::__pattern_includes(
923 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __comp
,
924 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
925 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
928 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
929 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
930 includes(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
931 _ForwardIterator2 __last2
)
933 return std::includes(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
,
934 __pstl::__internal::__pstl_less());
939 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
941 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
942 set_union(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
943 _ForwardIterator2 __last2
, _ForwardIterator __result
, _Compare __comp
)
945 using namespace __pstl
;
946 return __internal::__pattern_set_union(
947 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
, __comp
,
948 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
949 _ForwardIterator
>(__exec
),
950 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
951 _ForwardIterator
>(__exec
));
954 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
>
955 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
956 set_union(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
, _ForwardIterator2 __first2
,
957 _ForwardIterator2 __last2
, _ForwardIterator __result
)
959 return std::set_union(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
,
960 __pstl::__internal::__pstl_less());
963 // [set.intersection]
965 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
967 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
968 set_intersection(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
969 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
, _Compare __comp
)
971 using namespace __pstl
;
972 return __internal::__pattern_set_intersection(
973 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
, __comp
,
974 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
975 _ForwardIterator
>(__exec
),
976 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
977 _ForwardIterator
>(__exec
));
980 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
>
981 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
982 set_intersection(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
983 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
)
985 return std::set_intersection(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
,
986 __pstl::__internal::__pstl_less());
991 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
993 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
994 set_difference(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
995 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
, _Compare __comp
)
997 using namespace __pstl
;
998 return __internal::__pattern_set_difference(
999 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
, __comp
,
1000 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
1001 _ForwardIterator
>(__exec
),
1002 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
1003 _ForwardIterator
>(__exec
));
1006 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
>
1007 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1008 set_difference(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
1009 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
)
1011 return std::set_difference(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
,
1012 __pstl::__internal::__pstl_less());
1015 // [set.symmetric.difference]
1017 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
,
1019 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1020 set_symmetric_difference(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
1021 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
,
1024 using namespace __pstl
;
1025 return __internal::__pattern_set_symmetric_difference(
1026 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __result
, __comp
,
1027 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
1028 _ForwardIterator
>(__exec
),
1029 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
,
1030 _ForwardIterator
>(__exec
));
1033 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _ForwardIterator
>
1034 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1035 set_symmetric_difference(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
1036 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _ForwardIterator __result
)
1038 return std::set_symmetric_difference(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
,
1039 __result
, __pstl::__internal::__pstl_less());
1043 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
1044 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _RandomAccessIterator
>
1045 is_heap_until(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
, _Compare __comp
)
1047 using namespace __pstl
;
1048 return __internal::__pattern_is_heap_until(
1049 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
,
1050 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
1051 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
));
1054 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
1055 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _RandomAccessIterator
>
1056 is_heap_until(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
)
1058 typedef typename
std::iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
1059 return std::is_heap_until(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
1062 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
1063 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
1064 is_heap(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
, _Compare __comp
)
1066 return std::is_heap_until(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
) == __last
;
1069 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
1070 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
1071 is_heap(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __last
)
1073 typedef typename
std::iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
1074 return std::is_heap(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
1079 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Compare
>
1080 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1081 min_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Compare __comp
)
1083 using namespace __pstl
;
1084 return __internal::__pattern_min_element(
1085 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
,
1086 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
1087 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
1090 template <class _ExecutionPolicy
, class _ForwardIterator
>
1091 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1092 min_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
1094 typedef typename
std::iterator_traits
<_ForwardIterator
>::value_type _InputType
;
1095 return std::min_element(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_InputType
>());
1098 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Compare
>
1099 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1100 max_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Compare __comp
)
1102 return min_element(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
1103 __pstl::__internal::__reorder_pred
<_Compare
>(__comp
));
1106 template <class _ExecutionPolicy
, class _ForwardIterator
>
1107 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, _ForwardIterator
>
1108 max_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
1110 typedef typename
std::iterator_traits
<_ForwardIterator
>::value_type _InputType
;
1111 return std::min_element(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
,
1112 __pstl::__internal::__reorder_pred
<std::less
<_InputType
>>(std::less
<_InputType
>()));
1115 template <class _ExecutionPolicy
, class _ForwardIterator
, class _Compare
>
1116 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator
, _ForwardIterator
>>
1117 minmax_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
, _Compare __comp
)
1119 using namespace __pstl
;
1120 return __internal::__pattern_minmax_element(
1121 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, __comp
,
1122 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
),
1123 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator
>(__exec
));
1126 template <class _ExecutionPolicy
, class _ForwardIterator
>
1127 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, std::pair
<_ForwardIterator
, _ForwardIterator
>>
1128 minmax_element(_ExecutionPolicy
&& __exec
, _ForwardIterator __first
, _ForwardIterator __last
)
1130 typedef typename iterator_traits
<_ForwardIterator
>::value_type _ValueType
;
1131 return std::minmax_element(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __last
, std::less
<_ValueType
>());
1134 // [alg.nth.element]
1136 template <class _ExecutionPolicy
, class _RandomAccessIterator
, class _Compare
>
1137 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
1138 nth_element(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __nth
,
1139 _RandomAccessIterator __last
, _Compare __comp
)
1141 using namespace __pstl
;
1142 __internal::__pattern_nth_element(
1143 std::forward
<_ExecutionPolicy
>(__exec
), __first
, __nth
, __last
, __comp
,
1144 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
),
1145 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _RandomAccessIterator
>(__exec
));
1148 template <class _ExecutionPolicy
, class _RandomAccessIterator
>
1149 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, void>
1150 nth_element(_ExecutionPolicy
&& __exec
, _RandomAccessIterator __first
, _RandomAccessIterator __nth
,
1151 _RandomAccessIterator __last
)
1153 typedef typename iterator_traits
<_RandomAccessIterator
>::value_type _InputType
;
1154 std::nth_element(std::forward
<_ExecutionPolicy
>(__exec
), __first
, __nth
, __last
, std::less
<_InputType
>());
1157 // [alg.lex.comparison]
1159 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
, class _Compare
>
1160 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
1161 lexicographical_compare(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
1162 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
, _Compare __comp
)
1164 using namespace __pstl
;
1165 return __internal::__pattern_lexicographical_compare(
1166 std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
, __comp
,
1167 __internal::__is_vectorization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
),
1168 __internal::__is_parallelization_preferred
<_ExecutionPolicy
, _ForwardIterator1
, _ForwardIterator2
>(__exec
));
1171 template <class _ExecutionPolicy
, class _ForwardIterator1
, class _ForwardIterator2
>
1172 __pstl::__internal::__enable_if_execution_policy
<_ExecutionPolicy
, bool>
1173 lexicographical_compare(_ExecutionPolicy
&& __exec
, _ForwardIterator1 __first1
, _ForwardIterator1 __last1
,
1174 _ForwardIterator2 __first2
, _ForwardIterator2 __last2
)
1176 return std::lexicographical_compare(std::forward
<_ExecutionPolicy
>(__exec
), __first1
, __last1
, __first2
, __last2
,
1177 __pstl::__internal::__pstl_less());
1182 #endif /* __PSTL_glue_algorithm_impl_H */