36#ifndef _GLIBCXX_PARALLEL_ALGOBASE_H
37#define _GLIBCXX_PARALLEL_ALGOBASE_H 1
45namespace std _GLIBCXX_VISIBILITY(default)
52 template<
typename _IIter1,
typename _IIter2>
54 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
55 __gnu_parallel::sequential_tag)
56 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2); }
59 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
61 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
62 _Predicate __pred, __gnu_parallel::sequential_tag)
63 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
66 template<
typename _IIter1,
typename _IIter2,
67 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
69 __mismatch_switch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
70 _Predicate __pred, _IteratorTag1, _IteratorTag2)
71 {
return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
74 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
76 __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
77 _RAIter2 __begin2, _Predicate __pred,
78 random_access_iterator_tag, random_access_iterator_tag)
85 __mismatch_selector()).first;
86 return make_pair(__res , __begin2 + (__res - __begin1));
89 return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred);
93 template<
typename _IIter1,
typename _IIter2>
95 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
97 typedef __gnu_parallel::_EqualTo<
98 typename std::iterator_traits<_IIter1>::value_type,
99 typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
101 return __mismatch_switch(__begin1, __end1, __begin2, _EqualTo(),
107 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
109 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
112 return __mismatch_switch(__begin1, __end1, __begin2, __pred,
117#if __cplusplus > 201103L
119 template<
typename _InputIterator1,
typename _InputIterator2>
121 mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
122 _InputIterator2 __first2, _InputIterator2 __last2,
123 __gnu_parallel::sequential_tag)
124 {
return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
127 template<
typename _InputIterator1,
typename _InputIterator2,
128 typename _BinaryPredicate>
130 mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
131 _InputIterator2 __first2, _InputIterator2 __last2,
132 _BinaryPredicate __binary_pred,
133 __gnu_parallel::sequential_tag)
135 return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
140 template<
typename _IIter1,
typename _IIter2,
141 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
143 __mismatch_switch(_IIter1 __begin1, _IIter1 __end1,
144 _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
145 _IteratorTag1, _IteratorTag2)
147 return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
148 __begin2, __end2, __pred);
152 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
154 __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
155 _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
156 random_access_iterator_tag, random_access_iterator_tag)
160 if ((__end2 - __begin2) < (__end1 - __begin1))
161 __end1 = __begin1 + (__end2 - __begin2);
166 __mismatch_selector()).first;
167 return make_pair(__res , __begin2 + (__res - __begin1));
170 return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
171 __begin2, __end2, __pred);
174 template<
typename _IIter1,
typename _IIter2>
176 mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
178 typedef __gnu_parallel::_EqualTo<
179 typename std::iterator_traits<_IIter1>::value_type,
180 typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
182 return __mismatch_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
187 template<
typename _InputIterator1,
typename _InputIterator2,
188 typename _BinaryPredicate>
190 mismatch(_InputIterator1 __begin1, _InputIterator1 __end1,
191 _InputIterator2 __begin2, _InputIterator2 __end2,
192 _BinaryPredicate __binary_pred)
194 return __mismatch_switch(__begin1, __end1, __begin2, __end2,
202 template<
typename _IIter1,
typename _IIter2>
204 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
205 __gnu_parallel::sequential_tag)
206 {
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2); }
209 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
211 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
212 _Predicate __pred, __gnu_parallel::sequential_tag)
213 {
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred); }
216 template<
typename _IIter1,
typename _IIter2>
219 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
221#if __cplusplus > 201703L
223 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2);
226 return __gnu_parallel::mismatch(__begin1, __end1, __begin2).first
231 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
234 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
237#if __cplusplus > 201703L
239 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred);
242 return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __pred).first
246#if __cplusplus > 201103L
248 template<
typename _IIter1,
typename _IIter2>
250 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2,
251 __gnu_parallel::sequential_tag)
253 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
257 template<
typename _IIter1,
typename _IIter2,
typename _BinaryPredicate>
259 equal(_IIter1 __begin1, _IIter1 __end1,
260 _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred,
261 __gnu_parallel::sequential_tag)
263 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
268 template<
typename _IIter1,
typename _IIter2,
269 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
271 __equal_switch(_IIter1 __begin1, _IIter1 __end1,
272 _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
273 _IteratorTag1, _IteratorTag2)
275 return _GLIBCXX_STD_A::equal(__begin1, __end1,
276 __begin2, __end2, __pred);
280 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
282 __equal_switch(_RAIter1 __begin1, _RAIter1 __end1,
283 _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
284 random_access_iterator_tag, random_access_iterator_tag)
292 return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __end2,
293 __pred).first == __end1;
296 return _GLIBCXX_STD_A::equal(__begin1, __end1,
297 __begin2, __end2, __pred);
300 template<
typename _IIter1,
typename _IIter2>
303 equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
305#if __cplusplus > 201703L
307 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
310 typedef __gnu_parallel::_EqualTo<
311 typename std::iterator_traits<_IIter1>::value_type,
312 typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
314 return __equal_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
319 template<
typename _IIter1,
typename _IIter2,
typename _BinaryPredicate>
322 equal(_IIter1 __begin1, _IIter1 __end1,
323 _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred)
325#if __cplusplus > 201703L
327 return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
331 return __equal_switch(__begin1, __end1, __begin2, __end2, __binary_pred,
338 template<
typename _IIter1,
typename _IIter2>
340 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
341 _IIter2 __begin2, _IIter2 __end2,
342 __gnu_parallel::sequential_tag)
343 {
return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
347 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
349 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
350 _IIter2 __begin2, _IIter2 __end2,
351 _Predicate __pred, __gnu_parallel::sequential_tag)
352 {
return _GLIBCXX_STD_A::lexicographical_compare(
353 __begin1, __end1, __begin2, __end2, __pred); }
356 template<
typename _IIter1,
typename _IIter2,
357 typename _Predicate,
typename _IteratorTag1,
typename _IteratorTag2>
359 __lexicographical_compare_switch(_IIter1 __begin1, _IIter1 __end1,
360 _IIter2 __begin2, _IIter2 __end2,
362 _IteratorTag1, _IteratorTag2)
363 {
return _GLIBCXX_STD_A::lexicographical_compare(
364 __begin1, __end1, __begin2, __end2, __pred); }
368 template<
typename _RAIter1,
typename _RAIter2,
typename _Predicate>
370 __lexicographical_compare_switch(_RAIter1 __begin1, _RAIter1 __end1,
371 _RAIter2 __begin2, _RAIter2 __end2,
373 random_access_iterator_tag,
374 random_access_iterator_tag)
378 typedef iterator_traits<_RAIter1> _TraitsType1;
379 typedef typename _TraitsType1::value_type _ValueType1;
381 typedef iterator_traits<_RAIter2> _TraitsType2;
382 typedef typename _TraitsType2::value_type _ValueType2;
384 typedef __gnu_parallel::
385 _EqualFromLess<_ValueType1, _ValueType2, _Predicate>
386 _EqualFromLessCompare;
389 if ((__end1 - __begin1) < (__end2 - __begin2))
392 _SpotType __mm = __mismatch_switch(__begin1, __end1, __begin2,
393 _EqualFromLessCompare(__pred),
394 random_access_iterator_tag(),
395 random_access_iterator_tag());
397 return (__mm.first == __end1)
398 || bool(__pred(*__mm.first, *__mm.second));
403 _SpotType __mm = __mismatch_switch(__begin2, __end2, __begin1,
404 _EqualFromLessCompare(__pred),
405 random_access_iterator_tag(),
406 random_access_iterator_tag());
408 return (__mm.first != __end2)
409 && bool(__pred(*__mm.second, *__mm.first));
413 return _GLIBCXX_STD_A::lexicographical_compare(
414 __begin1, __end1, __begin2, __end2, __pred);
418 template<
typename _IIter1,
typename _IIter2>
421 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
422 _IIter2 __begin2, _IIter2 __end2)
424#if __cplusplus > 201703L
426 return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
430 typedef iterator_traits<_IIter1> _TraitsType1;
431 typedef typename _TraitsType1::value_type _ValueType1;
432 typedef typename _TraitsType1::iterator_category _IteratorCategory1;
434 typedef iterator_traits<_IIter2> _TraitsType2;
435 typedef typename _TraitsType2::value_type _ValueType2;
436 typedef typename _TraitsType2::iterator_category _IteratorCategory2;
437 typedef __gnu_parallel::_Less<_ValueType1, _ValueType2> _LessType;
439 return __lexicographical_compare_switch(
440 __begin1, __end1, __begin2, __end2, _LessType(),
441 _IteratorCategory1(), _IteratorCategory2());
445 template<
typename _IIter1,
typename _IIter2,
typename _Predicate>
448 lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
449 _IIter2 __begin2, _IIter2 __end2,
452#if __cplusplus > 201703L
454 return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
459 typedef iterator_traits<_IIter1> _TraitsType1;
460 typedef typename _TraitsType1::iterator_category _IteratorCategory1;
462 typedef iterator_traits<_IIter2> _TraitsType2;
463 typedef typename _TraitsType2::iterator_category _IteratorCategory2;
465 return __lexicographical_compare_switch(
466 __begin1, __end1, __begin2, __end2, __pred,
467 _IteratorCategory1(), _IteratorCategory2());
470#if __cpp_lib_three_way_comparison
471 using _GLIBCXX_STD_A::lexicographical_compare_three_way;
#define _GLIBCXX_PARALLEL_CONDITION(__c)
Determine at compile(?)-time if the parallel variant of an algorithm should be called.
_Function objects representing different tasks to be plugged into the parallel find algorithm....
Parallel implementation base for std::find(), std::equal() and related functions. This file is a GNU ...
Sequential helper functions. This file is a GNU parallel extension to the Standard C++ Library.
constexpr bool is_constant_evaluated() noexcept
Returns true only when called during constant evaluation.
pair(_T1, _T2) -> pair< _T1, _T2 >
Two pairs of the same type are equal iff their members are equal.
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.
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, replaces standard behavior with parallel behavior.
std::pair< _RAIter1, _RAIter2 > __find_template(_RAIter1 __begin1, _RAIter1 __end1, _RAIter2 __begin2, _Pred __pred, _Selector __selector)
Parallel std::find, switch for different algorithms.