1*38fd1498Szrj // -*- C++ -*-
2*38fd1498Szrj
3*38fd1498Szrj // Copyright (C) 2007-2018 Free Software Foundation, Inc.
4*38fd1498Szrj //
5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free
6*38fd1498Szrj // software; you can redistribute it and/or modify it under the terms
7*38fd1498Szrj // of the GNU General Public License as published by the Free Software
8*38fd1498Szrj // Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj // version.
10*38fd1498Szrj
11*38fd1498Szrj // This library is distributed in the hope that it will be useful, but
12*38fd1498Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14*38fd1498Szrj // General Public License for more details.
15*38fd1498Szrj
16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj
20*38fd1498Szrj // You should have received a copy of the GNU General Public License and
21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23*38fd1498Szrj // <http://www.gnu.org/licenses/>.
24*38fd1498Szrj
25*38fd1498Szrj /** @file parallel/algobase.h
26*38fd1498Szrj * @brief Parallel STL function calls corresponding to the
27*38fd1498Szrj * stl_algobase.h header. The functions defined here mainly do case
28*38fd1498Szrj * switches and call the actual parallelized versions in other files.
29*38fd1498Szrj * Inlining policy: Functions that basically only contain one
30*38fd1498Szrj * function call, are declared inline.
31*38fd1498Szrj * This file is a GNU parallel extension to the Standard C++ Library.
32*38fd1498Szrj */
33*38fd1498Szrj
34*38fd1498Szrj // Written by Johannes Singler and Felix Putze.
35*38fd1498Szrj
36*38fd1498Szrj #ifndef _GLIBCXX_PARALLEL_ALGOBASE_H
37*38fd1498Szrj #define _GLIBCXX_PARALLEL_ALGOBASE_H 1
38*38fd1498Szrj
39*38fd1498Szrj #include <bits/stl_algobase.h>
40*38fd1498Szrj #include <parallel/base.h>
41*38fd1498Szrj #include <parallel/algorithmfwd.h>
42*38fd1498Szrj #include <parallel/find.h>
43*38fd1498Szrj #include <parallel/find_selectors.h>
44*38fd1498Szrj
_GLIBCXX_VISIBILITY(default)45*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
46*38fd1498Szrj {
47*38fd1498Szrj namespace __parallel
48*38fd1498Szrj {
49*38fd1498Szrj // NB: equal and lexicographical_compare require mismatch.
50*38fd1498Szrj
51*38fd1498Szrj // Sequential fallback
52*38fd1498Szrj template<typename _IIter1, typename _IIter2>
53*38fd1498Szrj inline pair<_IIter1, _IIter2>
54*38fd1498Szrj mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
55*38fd1498Szrj __gnu_parallel::sequential_tag)
56*38fd1498Szrj { return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2); }
57*38fd1498Szrj
58*38fd1498Szrj // Sequential fallback
59*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
60*38fd1498Szrj inline pair<_IIter1, _IIter2>
61*38fd1498Szrj mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
62*38fd1498Szrj _Predicate __pred, __gnu_parallel::sequential_tag)
63*38fd1498Szrj { return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
64*38fd1498Szrj
65*38fd1498Szrj // Sequential fallback for input iterator case
66*38fd1498Szrj template<typename _IIter1, typename _IIter2,
67*38fd1498Szrj typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
68*38fd1498Szrj inline pair<_IIter1, _IIter2>
69*38fd1498Szrj __mismatch_switch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
70*38fd1498Szrj _Predicate __pred, _IteratorTag1, _IteratorTag2)
71*38fd1498Szrj { return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred); }
72*38fd1498Szrj
73*38fd1498Szrj // Parallel mismatch for random access iterators
74*38fd1498Szrj template<typename _RAIter1, typename _RAIter2, typename _Predicate>
75*38fd1498Szrj pair<_RAIter1, _RAIter2>
76*38fd1498Szrj __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
77*38fd1498Szrj _RAIter2 __begin2, _Predicate __pred,
78*38fd1498Szrj random_access_iterator_tag, random_access_iterator_tag)
79*38fd1498Szrj {
80*38fd1498Szrj if (_GLIBCXX_PARALLEL_CONDITION(true))
81*38fd1498Szrj {
82*38fd1498Szrj _RAIter1 __res =
83*38fd1498Szrj __gnu_parallel::__find_template(__begin1, __end1, __begin2, __pred,
84*38fd1498Szrj __gnu_parallel::
85*38fd1498Szrj __mismatch_selector()).first;
86*38fd1498Szrj return make_pair(__res , __begin2 + (__res - __begin1));
87*38fd1498Szrj }
88*38fd1498Szrj else
89*38fd1498Szrj return _GLIBCXX_STD_A::mismatch(__begin1, __end1, __begin2, __pred);
90*38fd1498Szrj }
91*38fd1498Szrj
92*38fd1498Szrj // Public interface
93*38fd1498Szrj template<typename _IIter1, typename _IIter2>
94*38fd1498Szrj inline pair<_IIter1, _IIter2>
95*38fd1498Szrj mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
96*38fd1498Szrj {
97*38fd1498Szrj typedef __gnu_parallel::_EqualTo<
98*38fd1498Szrj typename std::iterator_traits<_IIter1>::value_type,
99*38fd1498Szrj typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
100*38fd1498Szrj
101*38fd1498Szrj return __mismatch_switch(__begin1, __end1, __begin2, _EqualTo(),
102*38fd1498Szrj std::__iterator_category(__begin1),
103*38fd1498Szrj std::__iterator_category(__begin2));
104*38fd1498Szrj }
105*38fd1498Szrj
106*38fd1498Szrj // Public interface
107*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
108*38fd1498Szrj inline pair<_IIter1, _IIter2>
109*38fd1498Szrj mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
110*38fd1498Szrj _Predicate __pred)
111*38fd1498Szrj {
112*38fd1498Szrj return __mismatch_switch(__begin1, __end1, __begin2, __pred,
113*38fd1498Szrj std::__iterator_category(__begin1),
114*38fd1498Szrj std::__iterator_category(__begin2));
115*38fd1498Szrj }
116*38fd1498Szrj
117*38fd1498Szrj #if __cplusplus > 201103L
118*38fd1498Szrj // Sequential fallback.
119*38fd1498Szrj template<typename _InputIterator1, typename _InputIterator2>
120*38fd1498Szrj inline pair<_InputIterator1, _InputIterator2>
121*38fd1498Szrj mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
122*38fd1498Szrj _InputIterator2 __first2, _InputIterator2 __last2,
123*38fd1498Szrj __gnu_parallel::sequential_tag)
124*38fd1498Szrj { return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
125*38fd1498Szrj
126*38fd1498Szrj // Sequential fallback.
127*38fd1498Szrj template<typename _InputIterator1, typename _InputIterator2,
128*38fd1498Szrj typename _BinaryPredicate>
129*38fd1498Szrj inline pair<_InputIterator1, _InputIterator2>
130*38fd1498Szrj mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
131*38fd1498Szrj _InputIterator2 __first2, _InputIterator2 __last2,
132*38fd1498Szrj _BinaryPredicate __binary_pred,
133*38fd1498Szrj __gnu_parallel::sequential_tag)
134*38fd1498Szrj {
135*38fd1498Szrj return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
136*38fd1498Szrj __binary_pred);
137*38fd1498Szrj }
138*38fd1498Szrj
139*38fd1498Szrj // Sequential fallback for input iterator case
140*38fd1498Szrj template<typename _IIter1, typename _IIter2,
141*38fd1498Szrj typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
142*38fd1498Szrj inline pair<_IIter1, _IIter2>
143*38fd1498Szrj __mismatch_switch(_IIter1 __begin1, _IIter1 __end1,
144*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
145*38fd1498Szrj _IteratorTag1, _IteratorTag2)
146*38fd1498Szrj {
147*38fd1498Szrj return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
148*38fd1498Szrj __begin2, __end2, __pred);
149*38fd1498Szrj }
150*38fd1498Szrj
151*38fd1498Szrj // Parallel mismatch for random access iterators
152*38fd1498Szrj template<typename _RAIter1, typename _RAIter2, typename _Predicate>
153*38fd1498Szrj pair<_RAIter1, _RAIter2>
154*38fd1498Szrj __mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
155*38fd1498Szrj _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
156*38fd1498Szrj random_access_iterator_tag, random_access_iterator_tag)
157*38fd1498Szrj {
158*38fd1498Szrj if (_GLIBCXX_PARALLEL_CONDITION(true))
159*38fd1498Szrj {
160*38fd1498Szrj if ((__end2 - __begin2) < (__end1 - __begin1))
161*38fd1498Szrj __end1 = __begin1 + (__end2 - __begin2);
162*38fd1498Szrj
163*38fd1498Szrj _RAIter1 __res =
164*38fd1498Szrj __gnu_parallel::__find_template(__begin1, __end1, __begin2, __pred,
165*38fd1498Szrj __gnu_parallel::
166*38fd1498Szrj __mismatch_selector()).first;
167*38fd1498Szrj return make_pair(__res , __begin2 + (__res - __begin1));
168*38fd1498Szrj }
169*38fd1498Szrj else
170*38fd1498Szrj return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
171*38fd1498Szrj __begin2, __end2, __pred);
172*38fd1498Szrj }
173*38fd1498Szrj
174*38fd1498Szrj template<typename _IIter1, typename _IIter2>
175*38fd1498Szrj inline pair<_IIter1, _IIter2>
176*38fd1498Szrj mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
177*38fd1498Szrj {
178*38fd1498Szrj typedef __gnu_parallel::_EqualTo<
179*38fd1498Szrj typename std::iterator_traits<_IIter1>::value_type,
180*38fd1498Szrj typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
181*38fd1498Szrj
182*38fd1498Szrj return __mismatch_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
183*38fd1498Szrj std::__iterator_category(__begin1),
184*38fd1498Szrj std::__iterator_category(__begin2));
185*38fd1498Szrj }
186*38fd1498Szrj
187*38fd1498Szrj template<typename _InputIterator1, typename _InputIterator2,
188*38fd1498Szrj typename _BinaryPredicate>
189*38fd1498Szrj inline pair<_InputIterator1, _InputIterator2>
190*38fd1498Szrj mismatch(_InputIterator1 __begin1, _InputIterator1 __end1,
191*38fd1498Szrj _InputIterator2 __begin2, _InputIterator2 __end2,
192*38fd1498Szrj _BinaryPredicate __binary_pred)
193*38fd1498Szrj {
194*38fd1498Szrj return __mismatch_switch(__begin1, __end1, __begin2, __end2,
195*38fd1498Szrj __binary_pred,
196*38fd1498Szrj std::__iterator_category(__begin1),
197*38fd1498Szrj std::__iterator_category(__begin2));
198*38fd1498Szrj }
199*38fd1498Szrj #endif
200*38fd1498Szrj
201*38fd1498Szrj // Sequential fallback
202*38fd1498Szrj template<typename _IIter1, typename _IIter2>
203*38fd1498Szrj inline bool
204*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
205*38fd1498Szrj __gnu_parallel::sequential_tag)
206*38fd1498Szrj { return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2); }
207*38fd1498Szrj
208*38fd1498Szrj // Sequential fallback
209*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
210*38fd1498Szrj inline bool
211*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
212*38fd1498Szrj _Predicate __pred, __gnu_parallel::sequential_tag)
213*38fd1498Szrj { return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred); }
214*38fd1498Szrj
215*38fd1498Szrj // Public interface
216*38fd1498Szrj template<typename _IIter1, typename _IIter2>
217*38fd1498Szrj inline bool
218*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
219*38fd1498Szrj {
220*38fd1498Szrj return __gnu_parallel::mismatch(__begin1, __end1, __begin2).first
221*38fd1498Szrj == __end1;
222*38fd1498Szrj }
223*38fd1498Szrj
224*38fd1498Szrj // Public interface
225*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
226*38fd1498Szrj inline bool
227*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
228*38fd1498Szrj _Predicate __pred)
229*38fd1498Szrj {
230*38fd1498Szrj return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __pred).first
231*38fd1498Szrj == __end1;
232*38fd1498Szrj }
233*38fd1498Szrj
234*38fd1498Szrj #if __cplusplus > 201103L
235*38fd1498Szrj // Sequential fallback
236*38fd1498Szrj template<typename _IIter1, typename _IIter2>
237*38fd1498Szrj inline bool
238*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2,
239*38fd1498Szrj __gnu_parallel::sequential_tag)
240*38fd1498Szrj {
241*38fd1498Szrj return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
242*38fd1498Szrj }
243*38fd1498Szrj
244*38fd1498Szrj // Sequential fallback
245*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
246*38fd1498Szrj inline bool
247*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1,
248*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred,
249*38fd1498Szrj __gnu_parallel::sequential_tag)
250*38fd1498Szrj {
251*38fd1498Szrj return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
252*38fd1498Szrj __binary_pred);
253*38fd1498Szrj }
254*38fd1498Szrj
255*38fd1498Szrj // Sequential fallback for input iterator case
256*38fd1498Szrj template<typename _IIter1, typename _IIter2,
257*38fd1498Szrj typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
258*38fd1498Szrj inline bool
259*38fd1498Szrj __equal_switch(_IIter1 __begin1, _IIter1 __end1,
260*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
261*38fd1498Szrj _IteratorTag1, _IteratorTag2)
262*38fd1498Szrj {
263*38fd1498Szrj return _GLIBCXX_STD_A::equal(__begin1, __end1,
264*38fd1498Szrj __begin2, __end2, __pred);
265*38fd1498Szrj }
266*38fd1498Szrj
267*38fd1498Szrj // Parallel equal for random access iterators
268*38fd1498Szrj template<typename _RAIter1, typename _RAIter2, typename _Predicate>
269*38fd1498Szrj inline bool
270*38fd1498Szrj __equal_switch(_RAIter1 __begin1, _RAIter1 __end1,
271*38fd1498Szrj _RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
272*38fd1498Szrj random_access_iterator_tag, random_access_iterator_tag)
273*38fd1498Szrj {
274*38fd1498Szrj if (_GLIBCXX_PARALLEL_CONDITION(true))
275*38fd1498Szrj {
276*38fd1498Szrj if (std::distance(__begin1, __end1)
277*38fd1498Szrj != std::distance(__begin2, __end2))
278*38fd1498Szrj return false;
279*38fd1498Szrj
280*38fd1498Szrj return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __end2,
281*38fd1498Szrj __pred).first == __end1;
282*38fd1498Szrj }
283*38fd1498Szrj else
284*38fd1498Szrj return _GLIBCXX_STD_A::equal(__begin1, __end1,
285*38fd1498Szrj __begin2, __end2, __pred);
286*38fd1498Szrj }
287*38fd1498Szrj
288*38fd1498Szrj template<typename _IIter1, typename _IIter2>
289*38fd1498Szrj inline bool
290*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
291*38fd1498Szrj {
292*38fd1498Szrj typedef __gnu_parallel::_EqualTo<
293*38fd1498Szrj typename std::iterator_traits<_IIter1>::value_type,
294*38fd1498Szrj typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
295*38fd1498Szrj
296*38fd1498Szrj return __equal_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
297*38fd1498Szrj std::__iterator_category(__begin1),
298*38fd1498Szrj std::__iterator_category(__begin2));
299*38fd1498Szrj }
300*38fd1498Szrj
301*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
302*38fd1498Szrj inline bool
303*38fd1498Szrj equal(_IIter1 __begin1, _IIter1 __end1,
304*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred)
305*38fd1498Szrj {
306*38fd1498Szrj return __equal_switch(__begin1, __end1, __begin2, __end2, __binary_pred,
307*38fd1498Szrj std::__iterator_category(__begin1),
308*38fd1498Szrj std::__iterator_category(__begin2));
309*38fd1498Szrj }
310*38fd1498Szrj #endif
311*38fd1498Szrj
312*38fd1498Szrj // Sequential fallback
313*38fd1498Szrj template<typename _IIter1, typename _IIter2>
314*38fd1498Szrj inline bool
315*38fd1498Szrj lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
316*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2,
317*38fd1498Szrj __gnu_parallel::sequential_tag)
318*38fd1498Szrj { return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
319*38fd1498Szrj __begin2, __end2); }
320*38fd1498Szrj
321*38fd1498Szrj // Sequential fallback
322*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
323*38fd1498Szrj inline bool
324*38fd1498Szrj lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
325*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2,
326*38fd1498Szrj _Predicate __pred, __gnu_parallel::sequential_tag)
327*38fd1498Szrj { return _GLIBCXX_STD_A::lexicographical_compare(
328*38fd1498Szrj __begin1, __end1, __begin2, __end2, __pred); }
329*38fd1498Szrj
330*38fd1498Szrj // Sequential fallback for input iterator case
331*38fd1498Szrj template<typename _IIter1, typename _IIter2,
332*38fd1498Szrj typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
333*38fd1498Szrj inline bool
334*38fd1498Szrj __lexicographical_compare_switch(_IIter1 __begin1, _IIter1 __end1,
335*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2,
336*38fd1498Szrj _Predicate __pred,
337*38fd1498Szrj _IteratorTag1, _IteratorTag2)
338*38fd1498Szrj { return _GLIBCXX_STD_A::lexicographical_compare(
339*38fd1498Szrj __begin1, __end1, __begin2, __end2, __pred); }
340*38fd1498Szrj
341*38fd1498Szrj // Parallel lexicographical_compare for random access iterators
342*38fd1498Szrj // Limitation: Both valuetypes must be the same
343*38fd1498Szrj template<typename _RAIter1, typename _RAIter2, typename _Predicate>
344*38fd1498Szrj bool
345*38fd1498Szrj __lexicographical_compare_switch(_RAIter1 __begin1, _RAIter1 __end1,
346*38fd1498Szrj _RAIter2 __begin2, _RAIter2 __end2,
347*38fd1498Szrj _Predicate __pred,
348*38fd1498Szrj random_access_iterator_tag,
349*38fd1498Szrj random_access_iterator_tag)
350*38fd1498Szrj {
351*38fd1498Szrj if (_GLIBCXX_PARALLEL_CONDITION(true))
352*38fd1498Szrj {
353*38fd1498Szrj typedef iterator_traits<_RAIter1> _TraitsType1;
354*38fd1498Szrj typedef typename _TraitsType1::value_type _ValueType1;
355*38fd1498Szrj
356*38fd1498Szrj typedef iterator_traits<_RAIter2> _TraitsType2;
357*38fd1498Szrj typedef typename _TraitsType2::value_type _ValueType2;
358*38fd1498Szrj
359*38fd1498Szrj typedef __gnu_parallel::
360*38fd1498Szrj _EqualFromLess<_ValueType1, _ValueType2, _Predicate>
361*38fd1498Szrj _EqualFromLessCompare;
362*38fd1498Szrj
363*38fd1498Szrj // Longer sequence in first place.
364*38fd1498Szrj if ((__end1 - __begin1) < (__end2 - __begin2))
365*38fd1498Szrj {
366*38fd1498Szrj typedef pair<_RAIter1, _RAIter2> _SpotType;
367*38fd1498Szrj _SpotType __mm = __mismatch_switch(__begin1, __end1, __begin2,
368*38fd1498Szrj _EqualFromLessCompare(__pred),
369*38fd1498Szrj random_access_iterator_tag(),
370*38fd1498Szrj random_access_iterator_tag());
371*38fd1498Szrj
372*38fd1498Szrj return (__mm.first == __end1)
373*38fd1498Szrj || bool(__pred(*__mm.first, *__mm.second));
374*38fd1498Szrj }
375*38fd1498Szrj else
376*38fd1498Szrj {
377*38fd1498Szrj typedef pair<_RAIter2, _RAIter1> _SpotType;
378*38fd1498Szrj _SpotType __mm = __mismatch_switch(__begin2, __end2, __begin1,
379*38fd1498Szrj _EqualFromLessCompare(__pred),
380*38fd1498Szrj random_access_iterator_tag(),
381*38fd1498Szrj random_access_iterator_tag());
382*38fd1498Szrj
383*38fd1498Szrj return (__mm.first != __end2)
384*38fd1498Szrj && bool(__pred(*__mm.second, *__mm.first));
385*38fd1498Szrj }
386*38fd1498Szrj }
387*38fd1498Szrj else
388*38fd1498Szrj return _GLIBCXX_STD_A::lexicographical_compare(
389*38fd1498Szrj __begin1, __end1, __begin2, __end2, __pred);
390*38fd1498Szrj }
391*38fd1498Szrj
392*38fd1498Szrj // Public interface
393*38fd1498Szrj template<typename _IIter1, typename _IIter2>
394*38fd1498Szrj inline bool
395*38fd1498Szrj lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
396*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2)
397*38fd1498Szrj {
398*38fd1498Szrj typedef iterator_traits<_IIter1> _TraitsType1;
399*38fd1498Szrj typedef typename _TraitsType1::value_type _ValueType1;
400*38fd1498Szrj typedef typename _TraitsType1::iterator_category _IteratorCategory1;
401*38fd1498Szrj
402*38fd1498Szrj typedef iterator_traits<_IIter2> _TraitsType2;
403*38fd1498Szrj typedef typename _TraitsType2::value_type _ValueType2;
404*38fd1498Szrj typedef typename _TraitsType2::iterator_category _IteratorCategory2;
405*38fd1498Szrj typedef __gnu_parallel::_Less<_ValueType1, _ValueType2> _LessType;
406*38fd1498Szrj
407*38fd1498Szrj return __lexicographical_compare_switch(
408*38fd1498Szrj __begin1, __end1, __begin2, __end2, _LessType(),
409*38fd1498Szrj _IteratorCategory1(), _IteratorCategory2());
410*38fd1498Szrj }
411*38fd1498Szrj
412*38fd1498Szrj // Public interface
413*38fd1498Szrj template<typename _IIter1, typename _IIter2, typename _Predicate>
414*38fd1498Szrj inline bool
415*38fd1498Szrj lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
416*38fd1498Szrj _IIter2 __begin2, _IIter2 __end2,
417*38fd1498Szrj _Predicate __pred)
418*38fd1498Szrj {
419*38fd1498Szrj typedef iterator_traits<_IIter1> _TraitsType1;
420*38fd1498Szrj typedef typename _TraitsType1::iterator_category _IteratorCategory1;
421*38fd1498Szrj
422*38fd1498Szrj typedef iterator_traits<_IIter2> _TraitsType2;
423*38fd1498Szrj typedef typename _TraitsType2::iterator_category _IteratorCategory2;
424*38fd1498Szrj
425*38fd1498Szrj return __lexicographical_compare_switch(
426*38fd1498Szrj __begin1, __end1, __begin2, __end2, __pred,
427*38fd1498Szrj _IteratorCategory1(), _IteratorCategory2());
428*38fd1498Szrj }
429*38fd1498Szrj } // end namespace
430*38fd1498Szrj } // end namespace
431*38fd1498Szrj
432*38fd1498Szrj #endif /* _GLIBCXX_PARALLEL_ALGOBASE_H */
433