xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/parallel/algobase.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
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