36#ifndef _GLIBCXX_PARALLEL_ALGOBASE_H
37#define _GLIBCXX_PARALLEL_ALGOBASE_H 1
46namespace std _GLIBCXX_VISIBILITY(default)
53 template<
typename _IIter1,
typename _IIter2>
54 inline pair<_IIter1, _IIter2>
55 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
57 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2); }
60 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
61 inline pair<_IIter1, _IIter2>
62 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
64 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
67 template<
typename _IIter1,
typename _IIter2,
68 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
69 inline pair<_IIter1, _IIter2>
70 __mismatch_switch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
71 _Predicate __pred, _IteratorTag1, _IteratorTag2)
72 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
75 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
76 pair<_RAIter1, _RAIter2>
77 __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
78 _RAIter2 __begin2, _Predicate __pred,
79 random_access_iterator_tag, random_access_iterator_tag)
86 __mismatch_selector()).first;
87 return make_pair(__res , __begin2 + (__res - __begin1));
90 return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred);
94 template<
typename _IIter1,
typename _IIter2>
95 inline pair<_IIter1, _IIter2>
96 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
102 return __mismatch_switch(__begin1, __end1, __begin2, _EqualTo(),
108 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
109 inline pair<_IIter1, _IIter2>
110 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
113 return __mismatch_switch(__begin1, __end1, __begin2, __pred,
118#if __cplusplus > 201103L
120 template<
typename _InputIterator1,
typename _InputIterator2>
121 inline pair<_InputIterator1, _InputIterator2>
122 mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
123 _InputIterator2 __first2, _InputIterator2 __last2,
125 {
return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
128 template<
typename _InputIterator1,
typename _InputIterator2,
129 typename _BinaryPredicate>
130 inline pair<_InputIterator1, _InputIterator2>
131 mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
132 _InputIterator2 __first2, _InputIterator2 __last2,
133 _BinaryPredicate __binary_pred,
136 return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
141 template<
typename _IIter1,
typename _IIter2,
142 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
143 inline pair<_IIter1, _IIter2>
144 __mismatch_switch(_IIter1 __begin1, _IIter1 __end1,
145 _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
146 _IteratorTag1, _IteratorTag2)
148 return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
149 __begin2, __end2, __pred);
153 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
154 pair<_RAIter1, _RAIter2>
155 __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
156 _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
157 random_access_iterator_tag, random_access_iterator_tag)
161 if ((__end2 - __begin2) < (__end1 - __begin1))
162 __end1 = __begin1 + (__end2 - __begin2);
167 __mismatch_selector()).first;
168 return make_pair(__res , __begin2 + (__res - __begin1));
171 return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
172 __begin2, __end2, __pred);
175 template<
typename _IIter1,
typename _IIter2>
176 inline pair<_IIter1, _IIter2>
177 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
183 return __mismatch_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
188 template<
typename _InputIterator1,
typename _InputIterator2,
189 typename _BinaryPredicate>
190 inline pair<_InputIterator1, _InputIterator2>
191 mismatch(_InputIterator1 __begin1, _InputIterator1 __end1,
192 _InputIterator2 __begin2, _InputIterator2 __end2,
193 _BinaryPredicate __binary_pred)
195 return __mismatch_switch(__begin1, __end1, __begin2, __end2,
203 template<
typename _IIter1,
typename _IIter2>
205 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
207 {
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2); }
210 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
212 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
214 {
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred); }
217 template<
typename _IIter1,
typename _IIter2>
220 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
222#if __cplusplus > 201703L
223 if (std::is_constant_evaluated())
224 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2);
227 return __gnu_parallel::mismatch(__begin1, __end1, __begin2).first
232 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
235 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
238#if __cplusplus > 201703L
239 if (std::is_constant_evaluated())
240 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred);
243 return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __pred).first
247#if __cplusplus > 201103L
249 template<
typename _IIter1,
typename _IIter2>
251 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2,
254 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
258 template<
typename _IIter1,
typename _IIter2,
typename _BinaryPredicate>
260 equal(_IIter1 __begin1, _IIter1 __end1,
261 _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred,
264 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
269 template<
typename _IIter1,
typename _IIter2,
270 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
272 __equal_switch(_IIter1 __begin1, _IIter1 __end1,
273 _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
274 _IteratorTag1, _IteratorTag2)
276 return _GLIBCXX_STD_A::equal(__begin1, __end1,
277 __begin2, __end2, __pred);
281 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
283 __equal_switch(_RAIter1 __begin1, _RAIter1 __end1,
284 _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
285 random_access_iterator_tag, random_access_iterator_tag)
293 return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __end2,
294 __pred).first == __end1;
297 return _GLIBCXX_STD_A::equal(__begin1, __end1,
298 __begin2, __end2, __pred);
301 template<
typename _IIter1,
typename _IIter2>
304 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
306#if __cplusplus > 201703L
307 if (std::is_constant_evaluated())
308 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
315 return __equal_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
320 template<
typename _IIter1,
typename _IIter2,
typename _BinaryPredicate>
323 equal(_IIter1 __begin1, _IIter1 __end1,
324 _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred)
326#if __cplusplus > 201703L
327 if (std::is_constant_evaluated())
328 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
332 return __equal_switch(__begin1, __end1, __begin2, __end2, __binary_pred,
339 template<
typename _IIter1,
typename _IIter2>
341 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
342 _IIter2 __begin2, _IIter2 __end2,
344 {
return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
348 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
350 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
351 _IIter2 __begin2, _IIter2 __end2,
353 {
return _GLIBCXX_STD_A::lexicographical_compare(
354 __begin1, __end1, __begin2, __end2, __pred); }
357 template<
typename _IIter1,
typename _IIter2,
358 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
360 __lexicographical_compare_switch(_IIter1 __begin1, _IIter1 __end1,
361 _IIter2 __begin2, _IIter2 __end2,
363 _IteratorTag1, _IteratorTag2)
364 {
return _GLIBCXX_STD_A::lexicographical_compare(
365 __begin1, __end1, __begin2, __end2, __pred); }
369 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
371 __lexicographical_compare_switch(_RAIter1 __begin1, _RAIter1 __end1,
372 _RAIter2 __begin2, _RAIter2 __end2,
374 random_access_iterator_tag,
375 random_access_iterator_tag)
379 typedef iterator_traits<_RAIter1> _TraitsType1;
380 typedef typename _TraitsType1::value_type _ValueType1;
382 typedef iterator_traits<_RAIter2> _TraitsType2;
383 typedef typename _TraitsType2::value_type _ValueType2;
385 typedef __gnu_parallel::
386 _EqualFromLess<_ValueType1, _ValueType2, _Predicate>
387 _EqualFromLessCompare;
390 if ((__end1 - __begin1) < (__end2 - __begin2))
392 typedef pair<_RAIter1, _RAIter2> _SpotType;
393 _SpotType __mm = __mismatch_switch(__begin1, __end1, __begin2,
394 _EqualFromLessCompare(__pred),
395 random_access_iterator_tag(),
396 random_access_iterator_tag());
398 return (__mm.first == __end1)
399 || bool(__pred(*__mm.first, *__mm.second));
403 typedef pair<_RAIter2, _RAIter1> _SpotType;
404 _SpotType __mm = __mismatch_switch(__begin2, __end2, __begin1,
405 _EqualFromLessCompare(__pred),
406 random_access_iterator_tag(),
407 random_access_iterator_tag());
409 return (__mm.first != __end2)
410 && bool(__pred(*__mm.second, *__mm.first));
414 return _GLIBCXX_STD_A::lexicographical_compare(
415 __begin1, __end1, __begin2, __end2, __pred);
419 template<
typename _IIter1,
typename _IIter2>
422 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
423 _IIter2 __begin2, _IIter2 __end2)
425#if __cplusplus > 201703L
426 if (std::is_constant_evaluated())
427 return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
431 typedef iterator_traits<_IIter1> _TraitsType1;
432 typedef typename _TraitsType1::value_type _ValueType1;
433 typedef typename _TraitsType1::iterator_category _IteratorCategory1;
435 typedef iterator_traits<_IIter2> _TraitsType2;
436 typedef typename _TraitsType2::value_type _ValueType2;
437 typedef typename _TraitsType2::iterator_category _IteratorCategory2;
440 return __lexicographical_compare_switch(
441 __begin1, __end1, __begin2, __end2, _LessType(),
442 _IteratorCategory1(), _IteratorCategory2());
446 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
449 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
450 _IIter2 __begin2, _IIter2 __end2,
453#if __cplusplus > 201703L
454 if (std::is_constant_evaluated())
455 return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
460 typedef iterator_traits<_IIter1> _TraitsType1;
461 typedef typename _TraitsType1::iterator_category _IteratorCategory1;
463 typedef iterator_traits<_IIter2> _TraitsType2;
464 typedef typename _TraitsType2::iterator_category _IteratorCategory2;
466 return __lexicographical_compare_switch(
467 __begin1, __end1, __begin2, __end2, __pred,
468 _IteratorCategory1(), _IteratorCategory2());
471#if __cpp_lib_three_way_comparison
472 using _GLIBCXX_STD_A::lexicographical_compare_three_way;
476 template<
typename _FIterator1,
typename _FIterator2,
477 typename _BinaryPredicate>
479 search(_FIterator1 __begin1, _FIterator1 __end1,
480 _FIterator2 __begin2, _FIterator2 __end2,
482 {
return _GLIBCXX_STD_A::search(
483 __begin1, __end1, __begin2, __end2, __pred); }
486 template<
typename _RAIter1,
typename _RAIter2,
487 typename _BinaryPredicate>
489 __search_switch(_RAIter1 __begin1, _RAIter1 __end1,
490 _RAIter2 __begin2, _RAIter2 __end2,
491 _BinaryPredicate __pred,
492 random_access_iterator_tag, random_access_iterator_tag)
498 __begin2, __end2, __pred);
500 return search(__begin1, __end1, __begin2, __end2, __pred,
505 template<
typename _FIterator1,
typename _FIterator2,
506 typename _BinaryPredicate,
typename _IteratorTag1,
507 typename _IteratorTag2>
509 __search_switch(_FIterator1 __begin1, _FIterator1 __end1,
510 _FIterator2 __begin2, _FIterator2 __end2,
511 _BinaryPredicate __pred, _IteratorTag1, _IteratorTag2)
512 {
return search(__begin1, __end1, __begin2, __end2, __pred,
516 template<
typename _FIterator1,
typename _FIterator2,
517 typename _BinaryPredicate>
519 search(_FIterator1 __begin1, _FIterator1 __end1,
520 _FIterator2 __begin2, _FIterator2 __end2,
521 _BinaryPredicate __pred)
523 return __search_switch(__begin1, __end1, __begin2, __end2, __pred,
Sequential helper functions. This file is a GNU parallel extension to the Standard C++ Library.
Parallel implementation base for std::find(), std::equal() and related functions. This file is a GNU ...
_Function objects representing different tasks to be plugged into the parallel find algorithm....
Parallel implementation base for std::search() and std::search_n(). This file is a GNU parallel exten...
#define _GLIBCXX_PARALLEL_CONDITION(__c)
Determine at compile(?)-time if the parallel variant of an algorithm should be called.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
GNU parallel code for public use.
uint64_t _SequenceIndex
Unsigned integer to index __elements. The total number of elements for each algorithm must fit into t...
__RAIter1 __search_template(__RAIter1 __begin1, __RAIter1 __end1, __RAIter2 __begin2, __RAIter2 __end2, _Pred __pred)
Parallel std::search.
std::pair< _RAIter1, _RAIter2 > __find_template(_RAIter1 __begin1, _RAIter1 __end1, _RAIter2 __begin2, _Pred __pred, _Selector __selector)
Parallel std::find, switch for different algorithms.
Traits class for iterators.
Similar to std::equal_to, but allows two different types.
Similar to std::less, but allows two different types.
static const _Settings & get()
Get the global settings.
Forces sequential execution at compile time.