File Coverage

/usr/include/c++/5/bits/stl_algo.h
Criterion Covered Total %
statement 7 7 100.0
branch 2 2 100.0
condition n/a
subroutine n/a
pod n/a
total 9 9 100.0


line stmt bran cond sub pod time code
1             // Algorithm implementation -*- C++ -*-
2              
3             // Copyright (C) 2001-2015 Free Software Foundation, Inc.
4             //
5             // This file is part of the GNU ISO C++ Library. This library is free
6             // software; you can redistribute it and/or modify it under the
7             // terms of the GNU General Public License as published by the
8             // Free Software Foundation; either version 3, or (at your option)
9             // any later version.
10              
11             // This library is distributed in the hope that it will be useful,
12             // but WITHOUT ANY WARRANTY; without even the implied warranty of
13             // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14             // GNU General Public License for more details.
15              
16             // Under Section 7 of GPL version 3, you are granted additional
17             // permissions described in the GCC Runtime Library Exception, version
18             // 3.1, as published by the Free Software Foundation.
19              
20             // You should have received a copy of the GNU General Public License and
21             // a copy of the GCC Runtime Library Exception along with this program;
22             // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23             // <http://www.gnu.org/licenses/>.
24              
25             /*
26             *
27             * Copyright (c) 1994
28             * Hewlett-Packard Company
29             *
30             * Permission to use, copy, modify, distribute and sell this software
31             * and its documentation for any purpose is hereby granted without fee,
32             * provided that the above copyright notice appear in all copies and
33             * that both that copyright notice and this permission notice appear
34             * in supporting documentation. Hewlett-Packard Company makes no
35             * representations about the suitability of this software for any
36             * purpose. It is provided "as is" without express or implied warranty.
37             *
38             *
39             * Copyright (c) 1996
40             * Silicon Graphics Computer Systems, Inc.
41             *
42             * Permission to use, copy, modify, distribute and sell this software
43             * and its documentation for any purpose is hereby granted without fee,
44             * provided that the above copyright notice appear in all copies and
45             * that both that copyright notice and this permission notice appear
46             * in supporting documentation. Silicon Graphics makes no
47             * representations about the suitability of this software for any
48             * purpose. It is provided "as is" without express or implied warranty.
49             */
50              
51             /** @file bits/stl_algo.h
52             * This is an internal header file, included by other library headers.
53             * Do not attempt to use it directly. @headername{algorithm}
54             */
55              
56             #ifndef _STL_ALGO_H
57             #define _STL_ALGO_H 1
58              
59             #include <cstdlib> // for rand
60             #include <bits/algorithmfwd.h>
61             #include <bits/stl_heap.h>
62             #include <bits/stl_tempbuf.h> // for _Temporary_buffer
63             #include <bits/predefined_ops.h>
64              
65             #if __cplusplus >= 201103L
66             #include <random> // for std::uniform_int_distribution
67             #endif
68              
69             // See concept_check.h for the __glibcxx_*_requires macros.
70              
71             namespace std _GLIBCXX_VISIBILITY(default)
72             {
73             _GLIBCXX_BEGIN_NAMESPACE_VERSION
74              
75             /// Swaps the median value of *__a, *__b and *__c under __comp to *__result
76             template<typename _Iterator, typename _Compare>
77             void
78             __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
79             _Iterator __c, _Compare __comp)
80             {
81             if (__comp(__a, __b))
82             {
83             if (__comp(__b, __c))
84             std::iter_swap(__result, __b);
85             else if (__comp(__a, __c))
86             std::iter_swap(__result, __c);
87             else
88             std::iter_swap(__result, __a);
89             }
90             else if (__comp(__a, __c))
91             std::iter_swap(__result, __a);
92             else if (__comp(__b, __c))
93             std::iter_swap(__result, __c);
94             else
95             std::iter_swap(__result, __b);
96             }
97              
98             /// This is an overload used by find algos for the Input Iterator case.
99             template<typename _InputIterator, typename _Predicate>
100             inline _InputIterator
101             __find_if(_InputIterator __first, _InputIterator __last,
102             _Predicate __pred, input_iterator_tag)
103             {
104             while (__first != __last && !__pred(__first))
105             ++__first;
106             return __first;
107             }
108              
109             /// This is an overload used by find algos for the RAI case.
110             template<typename _RandomAccessIterator, typename _Predicate>
111             _RandomAccessIterator
112             __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
113             _Predicate __pred, random_access_iterator_tag)
114             {
115             typename iterator_traits<_RandomAccessIterator>::difference_type
116             __trip_count = (__last - __first) >> 2;
117              
118             for (; __trip_count > 0; --__trip_count)
119             {
120             if (__pred(__first))
121             return __first;
122             ++__first;
123              
124             if (__pred(__first))
125             return __first;
126             ++__first;
127              
128             if (__pred(__first))
129             return __first;
130             ++__first;
131              
132             if (__pred(__first))
133             return __first;
134             ++__first;
135             }
136              
137             switch (__last - __first)
138             {
139             case 3:
140             if (__pred(__first))
141             return __first;
142             ++__first;
143             case 2:
144             if (__pred(__first))
145             return __first;
146             ++__first;
147             case 1:
148             if (__pred(__first))
149             return __first;
150             ++__first;
151             case 0:
152             default:
153             return __last;
154             }
155             }
156              
157             template<typename _Iterator, typename _Predicate>
158             inline _Iterator
159             __find_if(_Iterator __first, _Iterator __last, _Predicate __pred)
160             {
161             return __find_if(__first, __last, __pred,
162             std::__iterator_category(__first));
163             }
164              
165             /// Provided for stable_partition to use.
166             template<typename _InputIterator, typename _Predicate>
167             inline _InputIterator
168             __find_if_not(_InputIterator __first, _InputIterator __last,
169             _Predicate __pred)
170             {
171             return std::__find_if(__first, __last,
172             __gnu_cxx::__ops::__negate(__pred),
173             std::__iterator_category(__first));
174             }
175              
176             /// Like find_if_not(), but uses and updates a count of the
177             /// remaining range length instead of comparing against an end
178             /// iterator.
179             template<typename _InputIterator, typename _Predicate, typename _Distance>
180             _InputIterator
181             __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)
182             {
183             for (; __len; --__len, ++__first)
184             if (!__pred(__first))
185             break;
186             return __first;
187             }
188              
189             // set_difference
190             // set_intersection
191             // set_symmetric_difference
192             // set_union
193             // for_each
194             // find
195             // find_if
196             // find_first_of
197             // adjacent_find
198             // count
199             // count_if
200             // search
201              
202             template<typename _ForwardIterator1, typename _ForwardIterator2,
203             typename _BinaryPredicate>
204             _ForwardIterator1
205             __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
206             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
207             _BinaryPredicate __predicate)
208             {
209             // Test for empty ranges
210             if (__first1 == __last1 || __first2 == __last2)
211             return __first1;
212              
213             // Test for a pattern of length 1.
214             _ForwardIterator2 __p1(__first2);
215             if (++__p1 == __last2)
216             return std::__find_if(__first1, __last1,
217             __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
218              
219             // General case.
220             _ForwardIterator2 __p;
221             _ForwardIterator1 __current = __first1;
222              
223             for (;;)
224             {
225             __first1 =
226             std::__find_if(__first1, __last1,
227             __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
228              
229             if (__first1 == __last1)
230             return __last1;
231              
232             __p = __p1;
233             __current = __first1;
234             if (++__current == __last1)
235             return __last1;
236              
237             while (__predicate(__current, __p))
238             {
239             if (++__p == __last2)
240             return __first1;
241             if (++__current == __last1)
242             return __last1;
243             }
244             ++__first1;
245             }
246             return __first1;
247             }
248              
249             // search_n
250              
251             /**
252             * This is an helper function for search_n overloaded for forward iterators.
253             */
254             template<typename _ForwardIterator, typename _Integer,
255             typename _UnaryPredicate>
256             _ForwardIterator
257             __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
258             _Integer __count, _UnaryPredicate __unary_pred,
259             std::forward_iterator_tag)
260             {
261             __first = std::__find_if(__first, __last, __unary_pred);
262             while (__first != __last)
263             {
264             typename iterator_traits<_ForwardIterator>::difference_type
265             __n = __count;
266             _ForwardIterator __i = __first;
267             ++__i;
268             while (__i != __last && __n != 1 && __unary_pred(__i))
269             {
270             ++__i;
271             --__n;
272             }
273             if (__n == 1)
274             return __first;
275             if (__i == __last)
276             return __last;
277             __first = std::__find_if(++__i, __last, __unary_pred);
278             }
279             return __last;
280             }
281              
282             /**
283             * This is an helper function for search_n overloaded for random access
284             * iterators.
285             */
286             template<typename _RandomAccessIter, typename _Integer,
287             typename _UnaryPredicate>
288             _RandomAccessIter
289             __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
290             _Integer __count, _UnaryPredicate __unary_pred,
291             std::random_access_iterator_tag)
292             {
293             typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
294             _DistanceType;
295              
296             _DistanceType __tailSize = __last - __first;
297             _DistanceType __remainder = __count;
298              
299             while (__remainder <= __tailSize) // the main loop...
300             {
301             __first += __remainder;
302             __tailSize -= __remainder;
303             // __first here is always pointing to one past the last element of
304             // next possible match.
305             _RandomAccessIter __backTrack = __first;
306             while (__unary_pred(--__backTrack))
307             {
308             if (--__remainder == 0)
309             return (__first - __count); // Success
310             }
311             __remainder = __count + 1 - (__first - __backTrack);
312             }
313             return __last; // Failure
314             }
315              
316             template<typename _ForwardIterator, typename _Integer,
317             typename _UnaryPredicate>
318             _ForwardIterator
319             __search_n(_ForwardIterator __first, _ForwardIterator __last,
320             _Integer __count,
321             _UnaryPredicate __unary_pred)
322             {
323             if (__count <= 0)
324             return __first;
325              
326             if (__count == 1)
327             return std::__find_if(__first, __last, __unary_pred);
328              
329             return std::__search_n_aux(__first, __last, __count, __unary_pred,
330             std::__iterator_category(__first));
331             }
332              
333             // find_end for forward iterators.
334             template<typename _ForwardIterator1, typename _ForwardIterator2,
335             typename _BinaryPredicate>
336             _ForwardIterator1
337             __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
338             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
339             forward_iterator_tag, forward_iterator_tag,
340             _BinaryPredicate __comp)
341             {
342             if (__first2 == __last2)
343             return __last1;
344              
345             _ForwardIterator1 __result = __last1;
346             while (1)
347             {
348             _ForwardIterator1 __new_result
349             = std::__search(__first1, __last1, __first2, __last2, __comp);
350             if (__new_result == __last1)
351             return __result;
352             else
353             {
354             __result = __new_result;
355             __first1 = __new_result;
356             ++__first1;
357             }
358             }
359             }
360              
361             // find_end for bidirectional iterators (much faster).
362             template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
363             typename _BinaryPredicate>
364             _BidirectionalIterator1
365             __find_end(_BidirectionalIterator1 __first1,
366             _BidirectionalIterator1 __last1,
367             _BidirectionalIterator2 __first2,
368             _BidirectionalIterator2 __last2,
369             bidirectional_iterator_tag, bidirectional_iterator_tag,
370             _BinaryPredicate __comp)
371             {
372             // concept requirements
373             __glibcxx_function_requires(_BidirectionalIteratorConcept<
374             _BidirectionalIterator1>)
375             __glibcxx_function_requires(_BidirectionalIteratorConcept<
376             _BidirectionalIterator2>)
377              
378             typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
379             typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
380              
381             _RevIterator1 __rlast1(__first1);
382             _RevIterator2 __rlast2(__first2);
383             _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
384             _RevIterator2(__last2), __rlast2,
385             __comp);
386              
387             if (__rresult == __rlast1)
388             return __last1;
389             else
390             {
391             _BidirectionalIterator1 __result = __rresult.base();
392             std::advance(__result, -std::distance(__first2, __last2));
393             return __result;
394             }
395             }
396              
397             /**
398             * @brief Find last matching subsequence in a sequence.
399             * @ingroup non_mutating_algorithms
400             * @param __first1 Start of range to search.
401             * @param __last1 End of range to search.
402             * @param __first2 Start of sequence to match.
403             * @param __last2 End of sequence to match.
404             * @return The last iterator @c i in the range
405             * @p [__first1,__last1-(__last2-__first2)) such that @c *(i+N) ==
406             * @p *(__first2+N) for each @c N in the range @p
407             * [0,__last2-__first2), or @p __last1 if no such iterator exists.
408             *
409             * Searches the range @p [__first1,__last1) for a sub-sequence that
410             * compares equal value-by-value with the sequence given by @p
411             * [__first2,__last2) and returns an iterator to the __first
412             * element of the sub-sequence, or @p __last1 if the sub-sequence
413             * is not found. The sub-sequence will be the last such
414             * subsequence contained in [__first1,__last1).
415             *
416             * Because the sub-sequence must lie completely within the range @p
417             * [__first1,__last1) it must start at a position less than @p
418             * __last1-(__last2-__first2) where @p __last2-__first2 is the
419             * length of the sub-sequence. This means that the returned
420             * iterator @c i will be in the range @p
421             * [__first1,__last1-(__last2-__first2))
422             */
423             template<typename _ForwardIterator1, typename _ForwardIterator2>
424             inline _ForwardIterator1
425             find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
426             _ForwardIterator2 __first2, _ForwardIterator2 __last2)
427             {
428             // concept requirements
429             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
430             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
431             __glibcxx_function_requires(_EqualOpConcept<
432             typename iterator_traits<_ForwardIterator1>::value_type,
433             typename iterator_traits<_ForwardIterator2>::value_type>)
434             __glibcxx_requires_valid_range(__first1, __last1);
435             __glibcxx_requires_valid_range(__first2, __last2);
436              
437             return std::__find_end(__first1, __last1, __first2, __last2,
438             std::__iterator_category(__first1),
439             std::__iterator_category(__first2),
440             __gnu_cxx::__ops::__iter_equal_to_iter());
441             }
442              
443             /**
444             * @brief Find last matching subsequence in a sequence using a predicate.
445             * @ingroup non_mutating_algorithms
446             * @param __first1 Start of range to search.
447             * @param __last1 End of range to search.
448             * @param __first2 Start of sequence to match.
449             * @param __last2 End of sequence to match.
450             * @param __comp The predicate to use.
451             * @return The last iterator @c i in the range @p
452             * [__first1,__last1-(__last2-__first2)) such that @c
453             * predicate(*(i+N), @p (__first2+N)) is true for each @c N in the
454             * range @p [0,__last2-__first2), or @p __last1 if no such iterator
455             * exists.
456             *
457             * Searches the range @p [__first1,__last1) for a sub-sequence that
458             * compares equal value-by-value with the sequence given by @p
459             * [__first2,__last2) using comp as a predicate and returns an
460             * iterator to the first element of the sub-sequence, or @p __last1
461             * if the sub-sequence is not found. The sub-sequence will be the
462             * last such subsequence contained in [__first,__last1).
463             *
464             * Because the sub-sequence must lie completely within the range @p
465             * [__first1,__last1) it must start at a position less than @p
466             * __last1-(__last2-__first2) where @p __last2-__first2 is the
467             * length of the sub-sequence. This means that the returned
468             * iterator @c i will be in the range @p
469             * [__first1,__last1-(__last2-__first2))
470             */
471             template<typename _ForwardIterator1, typename _ForwardIterator2,
472             typename _BinaryPredicate>
473             inline _ForwardIterator1
474             find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
475             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
476             _BinaryPredicate __comp)
477             {
478             // concept requirements
479             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
480             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
481             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
482             typename iterator_traits<_ForwardIterator1>::value_type,
483             typename iterator_traits<_ForwardIterator2>::value_type>)
484             __glibcxx_requires_valid_range(__first1, __last1);
485             __glibcxx_requires_valid_range(__first2, __last2);
486              
487             return std::__find_end(__first1, __last1, __first2, __last2,
488             std::__iterator_category(__first1),
489             std::__iterator_category(__first2),
490             __gnu_cxx::__ops::__iter_comp_iter(__comp));
491             }
492              
493             #if __cplusplus >= 201103L
494             /**
495             * @brief Checks that a predicate is true for all the elements
496             * of a sequence.
497             * @ingroup non_mutating_algorithms
498             * @param __first An input iterator.
499             * @param __last An input iterator.
500             * @param __pred A predicate.
501             * @return True if the check is true, false otherwise.
502             *
503             * Returns true if @p __pred is true for each element in the range
504             * @p [__first,__last), and false otherwise.
505             */
506             template<typename _InputIterator, typename _Predicate>
507             inline bool
508             all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
509             { return __last == std::find_if_not(__first, __last, __pred); }
510              
511             /**
512             * @brief Checks that a predicate is false for all the elements
513             * of a sequence.
514             * @ingroup non_mutating_algorithms
515             * @param __first An input iterator.
516             * @param __last An input iterator.
517             * @param __pred A predicate.
518             * @return True if the check is true, false otherwise.
519             *
520             * Returns true if @p __pred is false for each element in the range
521             * @p [__first,__last), and false otherwise.
522             */
523             template<typename _InputIterator, typename _Predicate>
524             inline bool
525             none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
526             { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
527              
528             /**
529             * @brief Checks that a predicate is false for at least an element
530             * of a sequence.
531             * @ingroup non_mutating_algorithms
532             * @param __first An input iterator.
533             * @param __last An input iterator.
534             * @param __pred A predicate.
535             * @return True if the check is true, false otherwise.
536             *
537             * Returns true if an element exists in the range @p
538             * [__first,__last) such that @p __pred is true, and false
539             * otherwise.
540             */
541             template<typename _InputIterator, typename _Predicate>
542             inline bool
543             any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
544             { return !std::none_of(__first, __last, __pred); }
545              
546             /**
547             * @brief Find the first element in a sequence for which a
548             * predicate is false.
549             * @ingroup non_mutating_algorithms
550             * @param __first An input iterator.
551             * @param __last An input iterator.
552             * @param __pred A predicate.
553             * @return The first iterator @c i in the range @p [__first,__last)
554             * such that @p __pred(*i) is false, or @p __last if no such iterator exists.
555             */
556             template<typename _InputIterator, typename _Predicate>
557             inline _InputIterator
558             find_if_not(_InputIterator __first, _InputIterator __last,
559             _Predicate __pred)
560             {
561             // concept requirements
562             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
563             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
564             typename iterator_traits<_InputIterator>::value_type>)
565             __glibcxx_requires_valid_range(__first, __last);
566             return std::__find_if_not(__first, __last,
567             __gnu_cxx::__ops::__pred_iter(__pred));
568             }
569              
570             /**
571             * @brief Checks whether the sequence is partitioned.
572             * @ingroup mutating_algorithms
573             * @param __first An input iterator.
574             * @param __last An input iterator.
575             * @param __pred A predicate.
576             * @return True if the range @p [__first,__last) is partioned by @p __pred,
577             * i.e. if all elements that satisfy @p __pred appear before those that
578             * do not.
579             */
580             template<typename _InputIterator, typename _Predicate>
581             inline bool
582             is_partitioned(_InputIterator __first, _InputIterator __last,
583             _Predicate __pred)
584             {
585             __first = std::find_if_not(__first, __last, __pred);
586             return std::none_of(__first, __last, __pred);
587             }
588              
589             /**
590             * @brief Find the partition point of a partitioned range.
591             * @ingroup mutating_algorithms
592             * @param __first An iterator.
593             * @param __last Another iterator.
594             * @param __pred A predicate.
595             * @return An iterator @p mid such that @p all_of(__first, mid, __pred)
596             * and @p none_of(mid, __last, __pred) are both true.
597             */
598             template<typename _ForwardIterator, typename _Predicate>
599             _ForwardIterator
600             partition_point(_ForwardIterator __first, _ForwardIterator __last,
601             _Predicate __pred)
602             {
603             // concept requirements
604             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
605             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
606             typename iterator_traits<_ForwardIterator>::value_type>)
607              
608             // A specific debug-mode test will be necessary...
609             __glibcxx_requires_valid_range(__first, __last);
610              
611             typedef typename iterator_traits<_ForwardIterator>::difference_type
612             _DistanceType;
613              
614             _DistanceType __len = std::distance(__first, __last);
615             _DistanceType __half;
616             _ForwardIterator __middle;
617              
618             while (__len > 0)
619             {
620             __half = __len >> 1;
621             __middle = __first;
622             std::advance(__middle, __half);
623             if (__pred(*__middle))
624             {
625             __first = __middle;
626             ++__first;
627             __len = __len - __half - 1;
628             }
629             else
630             __len = __half;
631             }
632             return __first;
633             }
634             #endif
635              
636             template<typename _InputIterator, typename _OutputIterator,
637             typename _Predicate>
638             _OutputIterator
639             __remove_copy_if(_InputIterator __first, _InputIterator __last,
640             _OutputIterator __result, _Predicate __pred)
641             {
642             for (; __first != __last; ++__first)
643             if (!__pred(__first))
644             {
645             *__result = *__first;
646             ++__result;
647             }
648             return __result;
649             }
650              
651             /**
652             * @brief Copy a sequence, removing elements of a given value.
653             * @ingroup mutating_algorithms
654             * @param __first An input iterator.
655             * @param __last An input iterator.
656             * @param __result An output iterator.
657             * @param __value The value to be removed.
658             * @return An iterator designating the end of the resulting sequence.
659             *
660             * Copies each element in the range @p [__first,__last) not equal
661             * to @p __value to the range beginning at @p __result.
662             * remove_copy() is stable, so the relative order of elements that
663             * are copied is unchanged.
664             */
665             template<typename _InputIterator, typename _OutputIterator, typename _Tp>
666             inline _OutputIterator
667             remove_copy(_InputIterator __first, _InputIterator __last,
668             _OutputIterator __result, const _Tp& __value)
669             {
670             // concept requirements
671             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
672             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
673             typename iterator_traits<_InputIterator>::value_type>)
674             __glibcxx_function_requires(_EqualOpConcept<
675             typename iterator_traits<_InputIterator>::value_type, _Tp>)
676             __glibcxx_requires_valid_range(__first, __last);
677              
678             return std::__remove_copy_if(__first, __last, __result,
679             __gnu_cxx::__ops::__iter_equals_val(__value));
680             }
681              
682             /**
683             * @brief Copy a sequence, removing elements for which a predicate is true.
684             * @ingroup mutating_algorithms
685             * @param __first An input iterator.
686             * @param __last An input iterator.
687             * @param __result An output iterator.
688             * @param __pred A predicate.
689             * @return An iterator designating the end of the resulting sequence.
690             *
691             * Copies each element in the range @p [__first,__last) for which
692             * @p __pred returns false to the range beginning at @p __result.
693             *
694             * remove_copy_if() is stable, so the relative order of elements that are
695             * copied is unchanged.
696             */
697             template<typename _InputIterator, typename _OutputIterator,
698             typename _Predicate>
699             inline _OutputIterator
700             remove_copy_if(_InputIterator __first, _InputIterator __last,
701             _OutputIterator __result, _Predicate __pred)
702             {
703             // concept requirements
704             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
705             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
706             typename iterator_traits<_InputIterator>::value_type>)
707             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
708             typename iterator_traits<_InputIterator>::value_type>)
709             __glibcxx_requires_valid_range(__first, __last);
710              
711             return std::__remove_copy_if(__first, __last, __result,
712             __gnu_cxx::__ops::__pred_iter(__pred));
713             }
714              
715             #if __cplusplus >= 201103L
716             /**
717             * @brief Copy the elements of a sequence for which a predicate is true.
718             * @ingroup mutating_algorithms
719             * @param __first An input iterator.
720             * @param __last An input iterator.
721             * @param __result An output iterator.
722             * @param __pred A predicate.
723             * @return An iterator designating the end of the resulting sequence.
724             *
725             * Copies each element in the range @p [__first,__last) for which
726             * @p __pred returns true to the range beginning at @p __result.
727             *
728             * copy_if() is stable, so the relative order of elements that are
729             * copied is unchanged.
730             */
731             template<typename _InputIterator, typename _OutputIterator,
732             typename _Predicate>
733             _OutputIterator
734             copy_if(_InputIterator __first, _InputIterator __last,
735             _OutputIterator __result, _Predicate __pred)
736             {
737             // concept requirements
738             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
739             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
740             typename iterator_traits<_InputIterator>::value_type>)
741             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
742             typename iterator_traits<_InputIterator>::value_type>)
743             __glibcxx_requires_valid_range(__first, __last);
744              
745             for (; __first != __last; ++__first)
746             if (__pred(*__first))
747             {
748             *__result = *__first;
749             ++__result;
750             }
751             return __result;
752             }
753              
754             template<typename _InputIterator, typename _Size, typename _OutputIterator>
755             _OutputIterator
756             __copy_n(_InputIterator __first, _Size __n,
757             _OutputIterator __result, input_iterator_tag)
758             {
759             if (__n > 0)
760             {
761             while (true)
762             {
763             *__result = *__first;
764             ++__result;
765             if (--__n > 0)
766             ++__first;
767             else
768             break;
769             }
770             }
771             return __result;
772             }
773              
774             template<typename _RandomAccessIterator, typename _Size,
775             typename _OutputIterator>
776             inline _OutputIterator
777             __copy_n(_RandomAccessIterator __first, _Size __n,
778             _OutputIterator __result, random_access_iterator_tag)
779             { return std::copy(__first, __first + __n, __result); }
780              
781             /**
782             * @brief Copies the range [first,first+n) into [result,result+n).
783             * @ingroup mutating_algorithms
784             * @param __first An input iterator.
785             * @param __n The number of elements to copy.
786             * @param __result An output iterator.
787             * @return result+n.
788             *
789             * This inline function will boil down to a call to @c memmove whenever
790             * possible. Failing that, if random access iterators are passed, then the
791             * loop count will be known (and therefore a candidate for compiler
792             * optimizations such as unrolling).
793             */
794             template<typename _InputIterator, typename _Size, typename _OutputIterator>
795             inline _OutputIterator
796             copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
797             {
798             // concept requirements
799             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
800             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
801             typename iterator_traits<_InputIterator>::value_type>)
802              
803             return std::__copy_n(__first, __n, __result,
804             std::__iterator_category(__first));
805             }
806              
807             /**
808             * @brief Copy the elements of a sequence to separate output sequences
809             * depending on the truth value of a predicate.
810             * @ingroup mutating_algorithms
811             * @param __first An input iterator.
812             * @param __last An input iterator.
813             * @param __out_true An output iterator.
814             * @param __out_false An output iterator.
815             * @param __pred A predicate.
816             * @return A pair designating the ends of the resulting sequences.
817             *
818             * Copies each element in the range @p [__first,__last) for which
819             * @p __pred returns true to the range beginning at @p out_true
820             * and each element for which @p __pred returns false to @p __out_false.
821             */
822             template<typename _InputIterator, typename _OutputIterator1,
823             typename _OutputIterator2, typename _Predicate>
824             pair<_OutputIterator1, _OutputIterator2>
825             partition_copy(_InputIterator __first, _InputIterator __last,
826             _OutputIterator1 __out_true, _OutputIterator2 __out_false,
827             _Predicate __pred)
828             {
829             // concept requirements
830             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
831             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
832             typename iterator_traits<_InputIterator>::value_type>)
833             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
834             typename iterator_traits<_InputIterator>::value_type>)
835             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
836             typename iterator_traits<_InputIterator>::value_type>)
837             __glibcxx_requires_valid_range(__first, __last);
838            
839             for (; __first != __last; ++__first)
840             if (__pred(*__first))
841             {
842             *__out_true = *__first;
843             ++__out_true;
844             }
845             else
846             {
847             *__out_false = *__first;
848             ++__out_false;
849             }
850              
851             return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
852             }
853             #endif
854              
855             template<typename _ForwardIterator, typename _Predicate>
856             _ForwardIterator
857             __remove_if(_ForwardIterator __first, _ForwardIterator __last,
858             _Predicate __pred)
859             {
860             __first = std::__find_if(__first, __last, __pred);
861             if (__first == __last)
862             return __first;
863             _ForwardIterator __result = __first;
864             ++__first;
865             for (; __first != __last; ++__first)
866             if (!__pred(__first))
867             {
868             *__result = _GLIBCXX_MOVE(*__first);
869             ++__result;
870             }
871             return __result;
872             }
873              
874             /**
875             * @brief Remove elements from a sequence.
876             * @ingroup mutating_algorithms
877             * @param __first An input iterator.
878             * @param __last An input iterator.
879             * @param __value The value to be removed.
880             * @return An iterator designating the end of the resulting sequence.
881             *
882             * All elements equal to @p __value are removed from the range
883             * @p [__first,__last).
884             *
885             * remove() is stable, so the relative order of elements that are
886             * not removed is unchanged.
887             *
888             * Elements between the end of the resulting sequence and @p __last
889             * are still present, but their value is unspecified.
890             */
891             template<typename _ForwardIterator, typename _Tp>
892             inline _ForwardIterator
893             remove(_ForwardIterator __first, _ForwardIterator __last,
894             const _Tp& __value)
895             {
896             // concept requirements
897             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
898             _ForwardIterator>)
899             __glibcxx_function_requires(_EqualOpConcept<
900             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
901             __glibcxx_requires_valid_range(__first, __last);
902              
903             return std::__remove_if(__first, __last,
904             __gnu_cxx::__ops::__iter_equals_val(__value));
905             }
906              
907             /**
908             * @brief Remove elements from a sequence using a predicate.
909             * @ingroup mutating_algorithms
910             * @param __first A forward iterator.
911             * @param __last A forward iterator.
912             * @param __pred A predicate.
913             * @return An iterator designating the end of the resulting sequence.
914             *
915             * All elements for which @p __pred returns true are removed from the range
916             * @p [__first,__last).
917             *
918             * remove_if() is stable, so the relative order of elements that are
919             * not removed is unchanged.
920             *
921             * Elements between the end of the resulting sequence and @p __last
922             * are still present, but their value is unspecified.
923             */
924             template<typename _ForwardIterator, typename _Predicate>
925             inline _ForwardIterator
926             remove_if(_ForwardIterator __first, _ForwardIterator __last,
927             _Predicate __pred)
928             {
929             // concept requirements
930             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
931             _ForwardIterator>)
932             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
933             typename iterator_traits<_ForwardIterator>::value_type>)
934             __glibcxx_requires_valid_range(__first, __last);
935              
936             return std::__remove_if(__first, __last,
937             __gnu_cxx::__ops::__pred_iter(__pred));
938             }
939              
940             template<typename _ForwardIterator, typename _BinaryPredicate>
941             _ForwardIterator
942             __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
943             _BinaryPredicate __binary_pred)
944             {
945             if (__first == __last)
946             return __last;
947             _ForwardIterator __next = __first;
948             while (++__next != __last)
949             {
950             if (__binary_pred(__first, __next))
951             return __first;
952             __first = __next;
953             }
954             return __last;
955             }
956              
957             template<typename _ForwardIterator, typename _BinaryPredicate>
958             _ForwardIterator
959             __unique(_ForwardIterator __first, _ForwardIterator __last,
960             _BinaryPredicate __binary_pred)
961             {
962             // Skip the beginning, if already unique.
963             __first = std::__adjacent_find(__first, __last, __binary_pred);
964             if (__first == __last)
965             return __last;
966              
967             // Do the real copy work.
968             _ForwardIterator __dest = __first;
969             ++__first;
970             while (++__first != __last)
971             if (!__binary_pred(__dest, __first))
972             *++__dest = _GLIBCXX_MOVE(*__first);
973             return ++__dest;
974             }
975              
976             /**
977             * @brief Remove consecutive duplicate values from a sequence.
978             * @ingroup mutating_algorithms
979             * @param __first A forward iterator.
980             * @param __last A forward iterator.
981             * @return An iterator designating the end of the resulting sequence.
982             *
983             * Removes all but the first element from each group of consecutive
984             * values that compare equal.
985             * unique() is stable, so the relative order of elements that are
986             * not removed is unchanged.
987             * Elements between the end of the resulting sequence and @p __last
988             * are still present, but their value is unspecified.
989             */
990             template<typename _ForwardIterator>
991             inline _ForwardIterator
992             unique(_ForwardIterator __first, _ForwardIterator __last)
993             {
994             // concept requirements
995             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
996             _ForwardIterator>)
997             __glibcxx_function_requires(_EqualityComparableConcept<
998             typename iterator_traits<_ForwardIterator>::value_type>)
999             __glibcxx_requires_valid_range(__first, __last);
1000              
1001             return std::__unique(__first, __last,
1002             __gnu_cxx::__ops::__iter_equal_to_iter());
1003             }
1004              
1005             /**
1006             * @brief Remove consecutive values from a sequence using a predicate.
1007             * @ingroup mutating_algorithms
1008             * @param __first A forward iterator.
1009             * @param __last A forward iterator.
1010             * @param __binary_pred A binary predicate.
1011             * @return An iterator designating the end of the resulting sequence.
1012             *
1013             * Removes all but the first element from each group of consecutive
1014             * values for which @p __binary_pred returns true.
1015             * unique() is stable, so the relative order of elements that are
1016             * not removed is unchanged.
1017             * Elements between the end of the resulting sequence and @p __last
1018             * are still present, but their value is unspecified.
1019             */
1020             template<typename _ForwardIterator, typename _BinaryPredicate>
1021             inline _ForwardIterator
1022             unique(_ForwardIterator __first, _ForwardIterator __last,
1023             _BinaryPredicate __binary_pred)
1024             {
1025             // concept requirements
1026             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1027             _ForwardIterator>)
1028             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1029             typename iterator_traits<_ForwardIterator>::value_type,
1030             typename iterator_traits<_ForwardIterator>::value_type>)
1031             __glibcxx_requires_valid_range(__first, __last);
1032              
1033             return std::__unique(__first, __last,
1034             __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
1035             }
1036              
1037             /**
1038             * This is an uglified
1039             * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1040             * _BinaryPredicate)
1041             * overloaded for forward iterators and output iterator as result.
1042             */
1043             template<typename _ForwardIterator, typename _OutputIterator,
1044             typename _BinaryPredicate>
1045             _OutputIterator
1046             __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1047             _OutputIterator __result, _BinaryPredicate __binary_pred,
1048             forward_iterator_tag, output_iterator_tag)
1049             {
1050             // concept requirements -- iterators already checked
1051             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1052             typename iterator_traits<_ForwardIterator>::value_type,
1053             typename iterator_traits<_ForwardIterator>::value_type>)
1054              
1055             _ForwardIterator __next = __first;
1056             *__result = *__first;
1057             while (++__next != __last)
1058             if (!__binary_pred(__first, __next))
1059             {
1060             __first = __next;
1061             *++__result = *__first;
1062             }
1063             return ++__result;
1064             }
1065              
1066             /**
1067             * This is an uglified
1068             * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1069             * _BinaryPredicate)
1070             * overloaded for input iterators and output iterator as result.
1071             */
1072             template<typename _InputIterator, typename _OutputIterator,
1073             typename _BinaryPredicate>
1074             _OutputIterator
1075             __unique_copy(_InputIterator __first, _InputIterator __last,
1076             _OutputIterator __result, _BinaryPredicate __binary_pred,
1077             input_iterator_tag, output_iterator_tag)
1078             {
1079             // concept requirements -- iterators already checked
1080             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1081             typename iterator_traits<_InputIterator>::value_type,
1082             typename iterator_traits<_InputIterator>::value_type>)
1083              
1084             typename iterator_traits<_InputIterator>::value_type __value = *__first;
1085             __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred))
1086             __rebound_pred
1087             = __gnu_cxx::__ops::__iter_comp_val(__binary_pred);
1088             *__result = __value;
1089             while (++__first != __last)
1090             if (!__rebound_pred(__first, __value))
1091             {
1092             __value = *__first;
1093             *++__result = __value;
1094             }
1095             return ++__result;
1096             }
1097              
1098             /**
1099             * This is an uglified
1100             * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1101             * _BinaryPredicate)
1102             * overloaded for input iterators and forward iterator as result.
1103             */
1104             template<typename _InputIterator, typename _ForwardIterator,
1105             typename _BinaryPredicate>
1106             _ForwardIterator
1107             __unique_copy(_InputIterator __first, _InputIterator __last,
1108             _ForwardIterator __result, _BinaryPredicate __binary_pred,
1109             input_iterator_tag, forward_iterator_tag)
1110             {
1111             // concept requirements -- iterators already checked
1112             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1113             typename iterator_traits<_ForwardIterator>::value_type,
1114             typename iterator_traits<_InputIterator>::value_type>)
1115             *__result = *__first;
1116             while (++__first != __last)
1117             if (!__binary_pred(__result, __first))
1118             *++__result = *__first;
1119             return ++__result;
1120             }
1121              
1122             /**
1123             * This is an uglified reverse(_BidirectionalIterator,
1124             * _BidirectionalIterator)
1125             * overloaded for bidirectional iterators.
1126             */
1127             template<typename _BidirectionalIterator>
1128             void
1129             __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1130             bidirectional_iterator_tag)
1131             {
1132             while (true)
1133             if (__first == __last || __first == --__last)
1134             return;
1135             else
1136             {
1137             std::iter_swap(__first, __last);
1138             ++__first;
1139             }
1140             }
1141              
1142             /**
1143             * This is an uglified reverse(_BidirectionalIterator,
1144             * _BidirectionalIterator)
1145             * overloaded for random access iterators.
1146             */
1147             template<typename _RandomAccessIterator>
1148             void
1149             __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1150             random_access_iterator_tag)
1151             {
1152             if (__first == __last)
1153             return;
1154             --__last;
1155             while (__first < __last)
1156             {
1157             std::iter_swap(__first, __last);
1158             ++__first;
1159             --__last;
1160             }
1161             }
1162              
1163             /**
1164             * @brief Reverse a sequence.
1165             * @ingroup mutating_algorithms
1166             * @param __first A bidirectional iterator.
1167             * @param __last A bidirectional iterator.
1168             * @return reverse() returns no value.
1169             *
1170             * Reverses the order of the elements in the range @p [__first,__last),
1171             * so that the first element becomes the last etc.
1172             * For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse()
1173             * swaps @p *(__first+i) and @p *(__last-(i+1))
1174             */
1175             template<typename _BidirectionalIterator>
1176             inline void
1177             reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1178             {
1179             // concept requirements
1180             __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1181             _BidirectionalIterator>)
1182             __glibcxx_requires_valid_range(__first, __last);
1183             std::__reverse(__first, __last, std::__iterator_category(__first));
1184             }
1185              
1186             /**
1187             * @brief Copy a sequence, reversing its elements.
1188             * @ingroup mutating_algorithms
1189             * @param __first A bidirectional iterator.
1190             * @param __last A bidirectional iterator.
1191             * @param __result An output iterator.
1192             * @return An iterator designating the end of the resulting sequence.
1193             *
1194             * Copies the elements in the range @p [__first,__last) to the
1195             * range @p [__result,__result+(__last-__first)) such that the
1196             * order of the elements is reversed. For every @c i such that @p
1197             * 0<=i<=(__last-__first), @p reverse_copy() performs the
1198             * assignment @p *(__result+(__last-__first)-1-i) = *(__first+i).
1199             * The ranges @p [__first,__last) and @p
1200             * [__result,__result+(__last-__first)) must not overlap.
1201             */
1202             template<typename _BidirectionalIterator, typename _OutputIterator>
1203             _OutputIterator
1204             reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1205             _OutputIterator __result)
1206             {
1207             // concept requirements
1208             __glibcxx_function_requires(_BidirectionalIteratorConcept<
1209             _BidirectionalIterator>)
1210             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1211             typename iterator_traits<_BidirectionalIterator>::value_type>)
1212             __glibcxx_requires_valid_range(__first, __last);
1213              
1214             while (__first != __last)
1215             {
1216             --__last;
1217             *__result = *__last;
1218             ++__result;
1219             }
1220             return __result;
1221             }
1222              
1223             /**
1224             * This is a helper function for the rotate algorithm specialized on RAIs.
1225             * It returns the greatest common divisor of two integer values.
1226             */
1227             template<typename _EuclideanRingElement>
1228             _EuclideanRingElement
1229             __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1230             {
1231             while (__n != 0)
1232             {
1233             _EuclideanRingElement __t = __m % __n;
1234             __m = __n;
1235             __n = __t;
1236             }
1237             return __m;
1238             }
1239              
1240             inline namespace _V2
1241             {
1242              
1243             /// This is a helper function for the rotate algorithm.
1244             template<typename _ForwardIterator>
1245             _ForwardIterator
1246             __rotate(_ForwardIterator __first,
1247             _ForwardIterator __middle,
1248             _ForwardIterator __last,
1249             forward_iterator_tag)
1250             {
1251             if (__first == __middle)
1252             return __last;
1253             else if (__last == __middle)
1254             return __first;
1255              
1256             _ForwardIterator __first2 = __middle;
1257             do
1258             {
1259             std::iter_swap(__first, __first2);
1260             ++__first;
1261             ++__first2;
1262             if (__first == __middle)
1263             __middle = __first2;
1264             }
1265             while (__first2 != __last);
1266              
1267             _ForwardIterator __ret = __first;
1268              
1269             __first2 = __middle;
1270              
1271             while (__first2 != __last)
1272             {
1273             std::iter_swap(__first, __first2);
1274             ++__first;
1275             ++__first2;
1276             if (__first == __middle)
1277             __middle = __first2;
1278             else if (__first2 == __last)
1279             __first2 = __middle;
1280             }
1281             return __ret;
1282             }
1283              
1284             /// This is a helper function for the rotate algorithm.
1285             template<typename _BidirectionalIterator>
1286             _BidirectionalIterator
1287             __rotate(_BidirectionalIterator __first,
1288             _BidirectionalIterator __middle,
1289             _BidirectionalIterator __last,
1290             bidirectional_iterator_tag)
1291             {
1292             // concept requirements
1293             __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1294             _BidirectionalIterator>)
1295              
1296             if (__first == __middle)
1297             return __last;
1298             else if (__last == __middle)
1299             return __first;
1300              
1301             std::__reverse(__first, __middle, bidirectional_iterator_tag());
1302             std::__reverse(__middle, __last, bidirectional_iterator_tag());
1303              
1304             while (__first != __middle && __middle != __last)
1305             {
1306             std::iter_swap(__first, --__last);
1307             ++__first;
1308             }
1309              
1310             if (__first == __middle)
1311             {
1312             std::__reverse(__middle, __last, bidirectional_iterator_tag());
1313             return __last;
1314             }
1315             else
1316             {
1317             std::__reverse(__first, __middle, bidirectional_iterator_tag());
1318             return __first;
1319             }
1320             }
1321              
1322             /// This is a helper function for the rotate algorithm.
1323             template<typename _RandomAccessIterator>
1324             _RandomAccessIterator
1325             __rotate(_RandomAccessIterator __first,
1326             _RandomAccessIterator __middle,
1327             _RandomAccessIterator __last,
1328             random_access_iterator_tag)
1329             {
1330             // concept requirements
1331             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1332             _RandomAccessIterator>)
1333              
1334             if (__first == __middle)
1335             return __last;
1336             else if (__last == __middle)
1337             return __first;
1338              
1339             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1340             _Distance;
1341             typedef typename iterator_traits<_RandomAccessIterator>::value_type
1342             _ValueType;
1343              
1344             _Distance __n = __last - __first;
1345             _Distance __k = __middle - __first;
1346              
1347             if (__k == __n - __k)
1348             {
1349             std::swap_ranges(__first, __middle, __middle);
1350             return __middle;
1351             }
1352              
1353             _RandomAccessIterator __p = __first;
1354             _RandomAccessIterator __ret = __first + (__last - __middle);
1355              
1356             for (;;)
1357             {
1358             if (__k < __n - __k)
1359             {
1360             if (__is_pod(_ValueType) && __k == 1)
1361             {
1362             _ValueType __t = _GLIBCXX_MOVE(*__p);
1363             _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1364             *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1365             return __ret;
1366             }
1367             _RandomAccessIterator __q = __p + __k;
1368             for (_Distance __i = 0; __i < __n - __k; ++ __i)
1369             {
1370             std::iter_swap(__p, __q);
1371             ++__p;
1372             ++__q;
1373             }
1374             __n %= __k;
1375             if (__n == 0)
1376             return __ret;
1377             std::swap(__n, __k);
1378             __k = __n - __k;
1379             }
1380             else
1381             {
1382             __k = __n - __k;
1383             if (__is_pod(_ValueType) && __k == 1)
1384             {
1385             _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1386             _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1387             *__p = _GLIBCXX_MOVE(__t);
1388             return __ret;
1389             }
1390             _RandomAccessIterator __q = __p + __n;
1391             __p = __q - __k;
1392             for (_Distance __i = 0; __i < __n - __k; ++ __i)
1393             {
1394             --__p;
1395             --__q;
1396             std::iter_swap(__p, __q);
1397             }
1398             __n %= __k;
1399             if (__n == 0)
1400             return __ret;
1401             std::swap(__n, __k);
1402             }
1403             }
1404             }
1405              
1406             // _GLIBCXX_RESOLVE_LIB_DEFECTS
1407             // DR 488. rotate throws away useful information
1408             /**
1409             * @brief Rotate the elements of a sequence.
1410             * @ingroup mutating_algorithms
1411             * @param __first A forward iterator.
1412             * @param __middle A forward iterator.
1413             * @param __last A forward iterator.
1414             * @return first + (last - middle).
1415             *
1416             * Rotates the elements of the range @p [__first,__last) by
1417             * @p (__middle - __first) positions so that the element at @p __middle
1418             * is moved to @p __first, the element at @p __middle+1 is moved to
1419             * @p __first+1 and so on for each element in the range
1420             * @p [__first,__last).
1421             *
1422             * This effectively swaps the ranges @p [__first,__middle) and
1423             * @p [__middle,__last).
1424             *
1425             * Performs
1426             * @p *(__first+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1427             * for each @p n in the range @p [0,__last-__first).
1428             */
1429             template<typename _ForwardIterator>
1430             inline _ForwardIterator
1431             rotate(_ForwardIterator __first, _ForwardIterator __middle,
1432             _ForwardIterator __last)
1433             {
1434             // concept requirements
1435             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1436             _ForwardIterator>)
1437             __glibcxx_requires_valid_range(__first, __middle);
1438             __glibcxx_requires_valid_range(__middle, __last);
1439              
1440             return std::__rotate(__first, __middle, __last,
1441             std::__iterator_category(__first));
1442             }
1443              
1444             } // namespace _V2
1445              
1446             /**
1447             * @brief Copy a sequence, rotating its elements.
1448             * @ingroup mutating_algorithms
1449             * @param __first A forward iterator.
1450             * @param __middle A forward iterator.
1451             * @param __last A forward iterator.
1452             * @param __result An output iterator.
1453             * @return An iterator designating the end of the resulting sequence.
1454             *
1455             * Copies the elements of the range @p [__first,__last) to the
1456             * range beginning at @result, rotating the copied elements by
1457             * @p (__middle-__first) positions so that the element at @p __middle
1458             * is moved to @p __result, the element at @p __middle+1 is moved
1459             * to @p __result+1 and so on for each element in the range @p
1460             * [__first,__last).
1461             *
1462             * Performs
1463             * @p *(__result+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1464             * for each @p n in the range @p [0,__last-__first).
1465             */
1466             template<typename _ForwardIterator, typename _OutputIterator>
1467             inline _OutputIterator
1468             rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1469             _ForwardIterator __last, _OutputIterator __result)
1470             {
1471             // concept requirements
1472             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1473             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1474             typename iterator_traits<_ForwardIterator>::value_type>)
1475             __glibcxx_requires_valid_range(__first, __middle);
1476             __glibcxx_requires_valid_range(__middle, __last);
1477              
1478             return std::copy(__first, __middle,
1479             std::copy(__middle, __last, __result));
1480             }
1481              
1482             /// This is a helper function...
1483             template<typename _ForwardIterator, typename _Predicate>
1484             _ForwardIterator
1485             __partition(_ForwardIterator __first, _ForwardIterator __last,
1486             _Predicate __pred, forward_iterator_tag)
1487             {
1488             if (__first == __last)
1489             return __first;
1490              
1491             while (__pred(*__first))
1492             if (++__first == __last)
1493             return __first;
1494              
1495             _ForwardIterator __next = __first;
1496              
1497             while (++__next != __last)
1498             if (__pred(*__next))
1499             {
1500             std::iter_swap(__first, __next);
1501             ++__first;
1502             }
1503              
1504             return __first;
1505             }
1506              
1507             /// This is a helper function...
1508             template<typename _BidirectionalIterator, typename _Predicate>
1509             _BidirectionalIterator
1510             __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1511             _Predicate __pred, bidirectional_iterator_tag)
1512             {
1513             while (true)
1514             {
1515             while (true)
1516             if (__first == __last)
1517             return __first;
1518             else if (__pred(*__first))
1519             ++__first;
1520             else
1521             break;
1522             --__last;
1523             while (true)
1524             if (__first == __last)
1525             return __first;
1526             else if (!bool(__pred(*__last)))
1527             --__last;
1528             else
1529             break;
1530             std::iter_swap(__first, __last);
1531             ++__first;
1532             }
1533             }
1534              
1535             // partition
1536              
1537             /// This is a helper function...
1538             /// Requires __first != __last and !__pred(__first)
1539             /// and __len == distance(__first, __last).
1540             ///
1541             /// !__pred(__first) allows us to guarantee that we don't
1542             /// move-assign an element onto itself.
1543             template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
1544             typename _Distance>
1545             _ForwardIterator
1546             __stable_partition_adaptive(_ForwardIterator __first,
1547             _ForwardIterator __last,
1548             _Predicate __pred, _Distance __len,
1549             _Pointer __buffer,
1550             _Distance __buffer_size)
1551             {
1552             if (__len == 1)
1553             return __first;
1554              
1555             if (__len <= __buffer_size)
1556             {
1557             _ForwardIterator __result1 = __first;
1558             _Pointer __result2 = __buffer;
1559              
1560             // The precondition guarantees that !__pred(__first), so
1561             // move that element to the buffer before starting the loop.
1562             // This ensures that we only call __pred once per element.
1563             *__result2 = _GLIBCXX_MOVE(*__first);
1564             ++__result2;
1565             ++__first;
1566             for (; __first != __last; ++__first)
1567             if (__pred(__first))
1568             {
1569             *__result1 = _GLIBCXX_MOVE(*__first);
1570             ++__result1;
1571             }
1572             else
1573             {
1574             *__result2 = _GLIBCXX_MOVE(*__first);
1575             ++__result2;
1576             }
1577              
1578             _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1579             return __result1;
1580             }
1581              
1582             _ForwardIterator __middle = __first;
1583             std::advance(__middle, __len / 2);
1584             _ForwardIterator __left_split =
1585             std::__stable_partition_adaptive(__first, __middle, __pred,
1586             __len / 2, __buffer,
1587             __buffer_size);
1588              
1589             // Advance past true-predicate values to satisfy this
1590             // function's preconditions.
1591             _Distance __right_len = __len - __len / 2;
1592             _ForwardIterator __right_split =
1593             std::__find_if_not_n(__middle, __right_len, __pred);
1594              
1595             if (__right_len)
1596             __right_split =
1597             std::__stable_partition_adaptive(__right_split, __last, __pred,
1598             __right_len,
1599             __buffer, __buffer_size);
1600              
1601             std::rotate(__left_split, __middle, __right_split);
1602             std::advance(__left_split, std::distance(__middle, __right_split));
1603             return __left_split;
1604             }
1605              
1606             template<typename _ForwardIterator, typename _Predicate>
1607             _ForwardIterator
1608             __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1609             _Predicate __pred)
1610             {
1611             __first = std::__find_if_not(__first, __last, __pred);
1612              
1613             if (__first == __last)
1614             return __first;
1615              
1616             typedef typename iterator_traits<_ForwardIterator>::value_type
1617             _ValueType;
1618             typedef typename iterator_traits<_ForwardIterator>::difference_type
1619             _DistanceType;
1620              
1621             _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first, __last);
1622             return
1623             std::__stable_partition_adaptive(__first, __last, __pred,
1624             _DistanceType(__buf.requested_size()),
1625             __buf.begin(),
1626             _DistanceType(__buf.size()));
1627             }
1628              
1629             /**
1630             * @brief Move elements for which a predicate is true to the beginning
1631             * of a sequence, preserving relative ordering.
1632             * @ingroup mutating_algorithms
1633             * @param __first A forward iterator.
1634             * @param __last A forward iterator.
1635             * @param __pred A predicate functor.
1636             * @return An iterator @p middle such that @p __pred(i) is true for each
1637             * iterator @p i in the range @p [first,middle) and false for each @p i
1638             * in the range @p [middle,last).
1639             *
1640             * Performs the same function as @p partition() with the additional
1641             * guarantee that the relative ordering of elements in each group is
1642             * preserved, so any two elements @p x and @p y in the range
1643             * @p [__first,__last) such that @p __pred(x)==__pred(y) will have the same
1644             * relative ordering after calling @p stable_partition().
1645             */
1646             template<typename _ForwardIterator, typename _Predicate>
1647             inline _ForwardIterator
1648             stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1649             _Predicate __pred)
1650             {
1651             // concept requirements
1652             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1653             _ForwardIterator>)
1654             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1655             typename iterator_traits<_ForwardIterator>::value_type>)
1656             __glibcxx_requires_valid_range(__first, __last);
1657              
1658             return std::__stable_partition(__first, __last,
1659             __gnu_cxx::__ops::__pred_iter(__pred));
1660             }
1661              
1662             /// This is a helper function for the sort routines.
1663             template<typename _RandomAccessIterator, typename _Compare>
1664             void
1665             __heap_select(_RandomAccessIterator __first,
1666             _RandomAccessIterator __middle,
1667             _RandomAccessIterator __last, _Compare __comp)
1668             {
1669             std::__make_heap(__first, __middle, __comp);
1670             for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1671             if (__comp(__i, __first))
1672             std::__pop_heap(__first, __middle, __i, __comp);
1673             }
1674              
1675             // partial_sort
1676              
1677             template<typename _InputIterator, typename _RandomAccessIterator,
1678             typename _Compare>
1679             _RandomAccessIterator
1680             __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1681             _RandomAccessIterator __result_first,
1682             _RandomAccessIterator __result_last,
1683             _Compare __comp)
1684             {
1685             typedef typename iterator_traits<_InputIterator>::value_type
1686             _InputValueType;
1687             typedef iterator_traits<_RandomAccessIterator> _RItTraits;
1688             typedef typename _RItTraits::difference_type _DistanceType;
1689              
1690             if (__result_first == __result_last)
1691             return __result_last;
1692             _RandomAccessIterator __result_real_last = __result_first;
1693             while (__first != __last && __result_real_last != __result_last)
1694             {
1695             *__result_real_last = *__first;
1696             ++__result_real_last;
1697             ++__first;
1698             }
1699            
1700             std::__make_heap(__result_first, __result_real_last, __comp);
1701             while (__first != __last)
1702             {
1703             if (__comp(__first, __result_first))
1704             std::__adjust_heap(__result_first, _DistanceType(0),
1705             _DistanceType(__result_real_last
1706             - __result_first),
1707             _InputValueType(*__first), __comp);
1708             ++__first;
1709             }
1710             std::__sort_heap(__result_first, __result_real_last, __comp);
1711             return __result_real_last;
1712             }
1713              
1714             /**
1715             * @brief Copy the smallest elements of a sequence.
1716             * @ingroup sorting_algorithms
1717             * @param __first An iterator.
1718             * @param __last Another iterator.
1719             * @param __result_first A random-access iterator.
1720             * @param __result_last Another random-access iterator.
1721             * @return An iterator indicating the end of the resulting sequence.
1722             *
1723             * Copies and sorts the smallest N values from the range @p [__first,__last)
1724             * to the range beginning at @p __result_first, where the number of
1725             * elements to be copied, @p N, is the smaller of @p (__last-__first) and
1726             * @p (__result_last-__result_first).
1727             * After the sort if @e i and @e j are iterators in the range
1728             * @p [__result_first,__result_first+N) such that i precedes j then
1729             * *j<*i is false.
1730             * The value returned is @p __result_first+N.
1731             */
1732             template<typename _InputIterator, typename _RandomAccessIterator>
1733             inline _RandomAccessIterator
1734             partial_sort_copy(_InputIterator __first, _InputIterator __last,
1735             _RandomAccessIterator __result_first,
1736             _RandomAccessIterator __result_last)
1737             {
1738             typedef typename iterator_traits<_InputIterator>::value_type
1739             _InputValueType;
1740             typedef typename iterator_traits<_RandomAccessIterator>::value_type
1741             _OutputValueType;
1742             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1743             _DistanceType;
1744              
1745             // concept requirements
1746             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1747             __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1748             _OutputValueType>)
1749             __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1750             _OutputValueType>)
1751             __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1752             __glibcxx_requires_valid_range(__first, __last);
1753             __glibcxx_requires_valid_range(__result_first, __result_last);
1754              
1755             return std::__partial_sort_copy(__first, __last,
1756             __result_first, __result_last,
1757             __gnu_cxx::__ops::__iter_less_iter());
1758             }
1759              
1760             /**
1761             * @brief Copy the smallest elements of a sequence using a predicate for
1762             * comparison.
1763             * @ingroup sorting_algorithms
1764             * @param __first An input iterator.
1765             * @param __last Another input iterator.
1766             * @param __result_first A random-access iterator.
1767             * @param __result_last Another random-access iterator.
1768             * @param __comp A comparison functor.
1769             * @return An iterator indicating the end of the resulting sequence.
1770             *
1771             * Copies and sorts the smallest N values from the range @p [__first,__last)
1772             * to the range beginning at @p result_first, where the number of
1773             * elements to be copied, @p N, is the smaller of @p (__last-__first) and
1774             * @p (__result_last-__result_first).
1775             * After the sort if @e i and @e j are iterators in the range
1776             * @p [__result_first,__result_first+N) such that i precedes j then
1777             * @p __comp(*j,*i) is false.
1778             * The value returned is @p __result_first+N.
1779             */
1780             template<typename _InputIterator, typename _RandomAccessIterator,
1781             typename _Compare>
1782             inline _RandomAccessIterator
1783             partial_sort_copy(_InputIterator __first, _InputIterator __last,
1784             _RandomAccessIterator __result_first,
1785             _RandomAccessIterator __result_last,
1786             _Compare __comp)
1787             {
1788             typedef typename iterator_traits<_InputIterator>::value_type
1789             _InputValueType;
1790             typedef typename iterator_traits<_RandomAccessIterator>::value_type
1791             _OutputValueType;
1792             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1793             _DistanceType;
1794              
1795             // concept requirements
1796             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1797             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1798             _RandomAccessIterator>)
1799             __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1800             _OutputValueType>)
1801             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1802             _InputValueType, _OutputValueType>)
1803             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1804             _OutputValueType, _OutputValueType>)
1805             __glibcxx_requires_valid_range(__first, __last);
1806             __glibcxx_requires_valid_range(__result_first, __result_last);
1807              
1808             return std::__partial_sort_copy(__first, __last,
1809             __result_first, __result_last,
1810             __gnu_cxx::__ops::__iter_comp_iter(__comp));
1811             }
1812              
1813             /// This is a helper function for the sort routine.
1814             template<typename _RandomAccessIterator, typename _Compare>
1815             void
1816             __unguarded_linear_insert(_RandomAccessIterator __last,
1817             _Compare __comp)
1818             {
1819             typename iterator_traits<_RandomAccessIterator>::value_type
1820             __val = _GLIBCXX_MOVE(*__last);
1821             _RandomAccessIterator __next = __last;
1822             --__next;
1823             while (__comp(__val, __next))
1824             {
1825             *__last = _GLIBCXX_MOVE(*__next);
1826             __last = __next;
1827             --__next;
1828             }
1829             *__last = _GLIBCXX_MOVE(__val);
1830             }
1831              
1832             /// This is a helper function for the sort routine.
1833             template<typename _RandomAccessIterator, typename _Compare>
1834             void
1835             __insertion_sort(_RandomAccessIterator __first,
1836             _RandomAccessIterator __last, _Compare __comp)
1837             {
1838             if (__first == __last) return;
1839              
1840             for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
1841             {
1842             if (__comp(__i, __first))
1843             {
1844             typename iterator_traits<_RandomAccessIterator>::value_type
1845             __val = _GLIBCXX_MOVE(*__i);
1846             _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
1847             *__first = _GLIBCXX_MOVE(__val);
1848             }
1849             else
1850             std::__unguarded_linear_insert(__i,
1851             __gnu_cxx::__ops::__val_comp_iter(__comp));
1852             }
1853             }
1854              
1855             /// This is a helper function for the sort routine.
1856             template<typename _RandomAccessIterator, typename _Compare>
1857             inline void
1858             __unguarded_insertion_sort(_RandomAccessIterator __first,
1859             _RandomAccessIterator __last, _Compare __comp)
1860             {
1861             for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1862             std::__unguarded_linear_insert(__i,
1863             __gnu_cxx::__ops::__val_comp_iter(__comp));
1864             }
1865              
1866             /**
1867             * @doctodo
1868             * This controls some aspect of the sort routines.
1869             */
1870             enum { _S_threshold = 16 };
1871              
1872             /// This is a helper function for the sort routine.
1873             template<typename _RandomAccessIterator, typename _Compare>
1874             void
1875             __final_insertion_sort(_RandomAccessIterator __first,
1876             _RandomAccessIterator __last, _Compare __comp)
1877             {
1878             if (__last - __first > int(_S_threshold))
1879             {
1880             std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
1881             std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
1882             __comp);
1883             }
1884             else
1885             std::__insertion_sort(__first, __last, __comp);
1886             }
1887              
1888             /// This is a helper function...
1889             template<typename _RandomAccessIterator, typename _Compare>
1890             _RandomAccessIterator
1891             __unguarded_partition(_RandomAccessIterator __first,
1892             _RandomAccessIterator __last,
1893             _RandomAccessIterator __pivot, _Compare __comp)
1894             {
1895             while (true)
1896             {
1897             while (__comp(__first, __pivot))
1898             ++__first;
1899             --__last;
1900             while (__comp(__pivot, __last))
1901             --__last;
1902             if (!(__first < __last))
1903             return __first;
1904             std::iter_swap(__first, __last);
1905             ++__first;
1906             }
1907             }
1908              
1909             /// This is a helper function...
1910             template<typename _RandomAccessIterator, typename _Compare>
1911             inline _RandomAccessIterator
1912             __unguarded_partition_pivot(_RandomAccessIterator __first,
1913             _RandomAccessIterator __last, _Compare __comp)
1914             {
1915             _RandomAccessIterator __mid = __first + (__last - __first) / 2;
1916             std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
1917             __comp);
1918             return std::__unguarded_partition(__first + 1, __last, __first, __comp);
1919             }
1920              
1921             template<typename _RandomAccessIterator, typename _Compare>
1922             inline void
1923             __partial_sort(_RandomAccessIterator __first,
1924             _RandomAccessIterator __middle,
1925             _RandomAccessIterator __last,
1926             _Compare __comp)
1927             {
1928             std::__heap_select(__first, __middle, __last, __comp);
1929             std::__sort_heap(__first, __middle, __comp);
1930             }
1931              
1932             /// This is a helper function for the sort routine.
1933             template<typename _RandomAccessIterator, typename _Size, typename _Compare>
1934             void
1935             __introsort_loop(_RandomAccessIterator __first,
1936             _RandomAccessIterator __last,
1937             _Size __depth_limit, _Compare __comp)
1938             {
1939             while (__last - __first > int(_S_threshold))
1940             {
1941             if (__depth_limit == 0)
1942             {
1943             std::__partial_sort(__first, __last, __last, __comp);
1944             return;
1945             }
1946             --__depth_limit;
1947             _RandomAccessIterator __cut =
1948             std::__unguarded_partition_pivot(__first, __last, __comp);
1949             std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1950             __last = __cut;
1951             }
1952             }
1953              
1954             // sort
1955              
1956             template<typename _RandomAccessIterator, typename _Compare>
1957             inline void
1958             __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1959             _Compare __comp)
1960             {
1961             if (__first != __last)
1962             {
1963             std::__introsort_loop(__first, __last,
1964             std::__lg(__last - __first) * 2,
1965             __comp);
1966             std::__final_insertion_sort(__first, __last, __comp);
1967             }
1968             }
1969              
1970             template<typename _RandomAccessIterator, typename _Size, typename _Compare>
1971             void
1972             __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1973             _RandomAccessIterator __last, _Size __depth_limit,
1974             _Compare __comp)
1975             {
1976             while (__last - __first > 3)
1977             {
1978             if (__depth_limit == 0)
1979             {
1980             std::__heap_select(__first, __nth + 1, __last, __comp);
1981             // Place the nth largest element in its final position.
1982             std::iter_swap(__first, __nth);
1983             return;
1984             }
1985             --__depth_limit;
1986             _RandomAccessIterator __cut =
1987             std::__unguarded_partition_pivot(__first, __last, __comp);
1988             if (__cut <= __nth)
1989             __first = __cut;
1990             else
1991             __last = __cut;
1992             }
1993             std::__insertion_sort(__first, __last, __comp);
1994             }
1995              
1996             // nth_element
1997              
1998             // lower_bound moved to stl_algobase.h
1999              
2000             /**
2001             * @brief Finds the first position in which @p __val could be inserted
2002             * without changing the ordering.
2003             * @ingroup binary_search_algorithms
2004             * @param __first An iterator.
2005             * @param __last Another iterator.
2006             * @param __val The search term.
2007             * @param __comp A functor to use for comparisons.
2008             * @return An iterator pointing to the first element <em>not less
2009             * than</em> @p __val, or end() if every element is less
2010             * than @p __val.
2011             * @ingroup binary_search_algorithms
2012             *
2013             * The comparison function should have the same effects on ordering as
2014             * the function used for the initial sort.
2015             */
2016             template<typename _ForwardIterator, typename _Tp, typename _Compare>
2017             inline _ForwardIterator
2018 17378852           lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2019             const _Tp& __val, _Compare __comp)
2020             {
2021             typedef typename iterator_traits<_ForwardIterator>::value_type
2022             _ValueType;
2023              
2024             // concept requirements
2025             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2026             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2027             _ValueType, _Tp>)
2028             __glibcxx_requires_partitioned_lower_pred(__first, __last,
2029             __val, __comp);
2030              
2031 17378852           return std::__lower_bound(__first, __last, __val,
2032 17378852           __gnu_cxx::__ops::__iter_comp_val(__comp));
2033             }
2034              
2035             template<typename _ForwardIterator, typename _Tp, typename _Compare>
2036             _ForwardIterator
2037             __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2038             const _Tp& __val, _Compare __comp)
2039             {
2040             typedef typename iterator_traits<_ForwardIterator>::difference_type
2041             _DistanceType;
2042              
2043             _DistanceType __len = std::distance(__first, __last);
2044              
2045             while (__len > 0)
2046             {
2047             _DistanceType __half = __len >> 1;
2048             _ForwardIterator __middle = __first;
2049             std::advance(__middle, __half);
2050             if (__comp(__val, __middle))
2051             __len = __half;
2052             else
2053             {
2054             __first = __middle;
2055             ++__first;
2056             __len = __len - __half - 1;
2057             }
2058             }
2059             return __first;
2060             }
2061              
2062             /**
2063             * @brief Finds the last position in which @p __val could be inserted
2064             * without changing the ordering.
2065             * @ingroup binary_search_algorithms
2066             * @param __first An iterator.
2067             * @param __last Another iterator.
2068             * @param __val The search term.
2069             * @return An iterator pointing to the first element greater than @p __val,
2070             * or end() if no elements are greater than @p __val.
2071             * @ingroup binary_search_algorithms
2072             */
2073             template<typename _ForwardIterator, typename _Tp>
2074             inline _ForwardIterator
2075             upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2076             const _Tp& __val)
2077             {
2078             typedef typename iterator_traits<_ForwardIterator>::value_type
2079             _ValueType;
2080              
2081             // concept requirements
2082             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2083             __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2084             __glibcxx_requires_partitioned_upper(__first, __last, __val);
2085              
2086             return std::__upper_bound(__first, __last, __val,
2087             __gnu_cxx::__ops::__val_less_iter());
2088             }
2089              
2090             /**
2091             * @brief Finds the last position in which @p __val could be inserted
2092             * without changing the ordering.
2093             * @ingroup binary_search_algorithms
2094             * @param __first An iterator.
2095             * @param __last Another iterator.
2096             * @param __val The search term.
2097             * @param __comp A functor to use for comparisons.
2098             * @return An iterator pointing to the first element greater than @p __val,
2099             * or end() if no elements are greater than @p __val.
2100             * @ingroup binary_search_algorithms
2101             *
2102             * The comparison function should have the same effects on ordering as
2103             * the function used for the initial sort.
2104             */
2105             template<typename _ForwardIterator, typename _Tp, typename _Compare>
2106             inline _ForwardIterator
2107             upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2108             const _Tp& __val, _Compare __comp)
2109             {
2110             typedef typename iterator_traits<_ForwardIterator>::value_type
2111             _ValueType;
2112              
2113             // concept requirements
2114             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2115             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2116             _Tp, _ValueType>)
2117             __glibcxx_requires_partitioned_upper_pred(__first, __last,
2118             __val, __comp);
2119              
2120             return std::__upper_bound(__first, __last, __val,
2121             __gnu_cxx::__ops::__val_comp_iter(__comp));
2122             }
2123              
2124             template<typename _ForwardIterator, typename _Tp,
2125             typename _CompareItTp, typename _CompareTpIt>
2126             pair<_ForwardIterator, _ForwardIterator>
2127             __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2128             const _Tp& __val,
2129             _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)
2130             {
2131             typedef typename iterator_traits<_ForwardIterator>::difference_type
2132             _DistanceType;
2133              
2134             _DistanceType __len = std::distance(__first, __last);
2135              
2136             while (__len > 0)
2137             {
2138             _DistanceType __half = __len >> 1;
2139             _ForwardIterator __middle = __first;
2140             std::advance(__middle, __half);
2141             if (__comp_it_val(__middle, __val))
2142             {
2143             __first = __middle;
2144             ++__first;
2145             __len = __len - __half - 1;
2146             }
2147             else if (__comp_val_it(__val, __middle))
2148             __len = __half;
2149             else
2150             {
2151             _ForwardIterator __left
2152             = std::__lower_bound(__first, __middle, __val, __comp_it_val);
2153             std::advance(__first, __len);
2154             _ForwardIterator __right
2155             = std::__upper_bound(++__middle, __first, __val, __comp_val_it);
2156             return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2157             }
2158             }
2159             return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2160             }
2161              
2162             /**
2163             * @brief Finds the largest subrange in which @p __val could be inserted
2164             * at any place in it without changing the ordering.
2165             * @ingroup binary_search_algorithms
2166             * @param __first An iterator.
2167             * @param __last Another iterator.
2168             * @param __val The search term.
2169             * @return An pair of iterators defining the subrange.
2170             * @ingroup binary_search_algorithms
2171             *
2172             * This is equivalent to
2173             * @code
2174             * std::make_pair(lower_bound(__first, __last, __val),
2175             * upper_bound(__first, __last, __val))
2176             * @endcode
2177             * but does not actually call those functions.
2178             */
2179             template<typename _ForwardIterator, typename _Tp>
2180             inline pair<_ForwardIterator, _ForwardIterator>
2181             equal_range(_ForwardIterator __first, _ForwardIterator __last,
2182             const _Tp& __val)
2183             {
2184             typedef typename iterator_traits<_ForwardIterator>::value_type
2185             _ValueType;
2186              
2187             // concept requirements
2188             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2189             __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2190             __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2191             __glibcxx_requires_partitioned_lower(__first, __last, __val);
2192             __glibcxx_requires_partitioned_upper(__first, __last, __val);
2193              
2194             return std::__equal_range(__first, __last, __val,
2195             __gnu_cxx::__ops::__iter_less_val(),
2196             __gnu_cxx::__ops::__val_less_iter());
2197             }
2198              
2199             /**
2200             * @brief Finds the largest subrange in which @p __val could be inserted
2201             * at any place in it without changing the ordering.
2202             * @param __first An iterator.
2203             * @param __last Another iterator.
2204             * @param __val The search term.
2205             * @param __comp A functor to use for comparisons.
2206             * @return An pair of iterators defining the subrange.
2207             * @ingroup binary_search_algorithms
2208             *
2209             * This is equivalent to
2210             * @code
2211             * std::make_pair(lower_bound(__first, __last, __val, __comp),
2212             * upper_bound(__first, __last, __val, __comp))
2213             * @endcode
2214             * but does not actually call those functions.
2215             */
2216             template<typename _ForwardIterator, typename _Tp, typename _Compare>
2217             inline pair<_ForwardIterator, _ForwardIterator>
2218             equal_range(_ForwardIterator __first, _ForwardIterator __last,
2219             const _Tp& __val, _Compare __comp)
2220             {
2221             typedef typename iterator_traits<_ForwardIterator>::value_type
2222             _ValueType;
2223              
2224             // concept requirements
2225             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2226             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2227             _ValueType, _Tp>)
2228             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2229             _Tp, _ValueType>)
2230             __glibcxx_requires_partitioned_lower_pred(__first, __last,
2231             __val, __comp);
2232             __glibcxx_requires_partitioned_upper_pred(__first, __last,
2233             __val, __comp);
2234              
2235             return std::__equal_range(__first, __last, __val,
2236             __gnu_cxx::__ops::__iter_comp_val(__comp),
2237             __gnu_cxx::__ops::__val_comp_iter(__comp));
2238             }
2239              
2240             /**
2241             * @brief Determines whether an element exists in a range.
2242             * @ingroup binary_search_algorithms
2243             * @param __first An iterator.
2244             * @param __last Another iterator.
2245             * @param __val The search term.
2246             * @return True if @p __val (or its equivalent) is in [@p
2247             * __first,@p __last ].
2248             *
2249             * Note that this does not actually return an iterator to @p __val. For
2250             * that, use std::find or a container's specialized find member functions.
2251             */
2252             template<typename _ForwardIterator, typename _Tp>
2253             bool
2254             binary_search(_ForwardIterator __first, _ForwardIterator __last,
2255             const _Tp& __val)
2256             {
2257             typedef typename iterator_traits<_ForwardIterator>::value_type
2258             _ValueType;
2259              
2260             // concept requirements
2261             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2262             __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2263             __glibcxx_requires_partitioned_lower(__first, __last, __val);
2264             __glibcxx_requires_partitioned_upper(__first, __last, __val);
2265              
2266             _ForwardIterator __i
2267             = std::__lower_bound(__first, __last, __val,
2268             __gnu_cxx::__ops::__iter_less_val());
2269             return __i != __last && !(__val < *__i);
2270             }
2271              
2272             /**
2273             * @brief Determines whether an element exists in a range.
2274             * @ingroup binary_search_algorithms
2275             * @param __first An iterator.
2276             * @param __last Another iterator.
2277             * @param __val The search term.
2278             * @param __comp A functor to use for comparisons.
2279             * @return True if @p __val (or its equivalent) is in @p [__first,__last].
2280             *
2281             * Note that this does not actually return an iterator to @p __val. For
2282             * that, use std::find or a container's specialized find member functions.
2283             *
2284             * The comparison function should have the same effects on ordering as
2285             * the function used for the initial sort.
2286             */
2287             template<typename _ForwardIterator, typename _Tp, typename _Compare>
2288             bool
2289             binary_search(_ForwardIterator __first, _ForwardIterator __last,
2290             const _Tp& __val, _Compare __comp)
2291             {
2292             typedef typename iterator_traits<_ForwardIterator>::value_type
2293             _ValueType;
2294              
2295             // concept requirements
2296             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2297             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2298             _Tp, _ValueType>)
2299             __glibcxx_requires_partitioned_lower_pred(__first, __last,
2300             __val, __comp);
2301             __glibcxx_requires_partitioned_upper_pred(__first, __last,
2302             __val, __comp);
2303              
2304             _ForwardIterator __i
2305             = std::__lower_bound(__first, __last, __val,
2306             __gnu_cxx::__ops::__iter_comp_val(__comp));
2307             return __i != __last && !bool(__comp(__val, *__i));
2308             }
2309              
2310             // merge
2311              
2312             /// This is a helper function for the __merge_adaptive routines.
2313             template<typename _InputIterator1, typename _InputIterator2,
2314             typename _OutputIterator, typename _Compare>
2315             void
2316             __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2317             _InputIterator2 __first2, _InputIterator2 __last2,
2318             _OutputIterator __result, _Compare __comp)
2319             {
2320             while (__first1 != __last1 && __first2 != __last2)
2321             {
2322             if (__comp(__first2, __first1))
2323             {
2324             *__result = _GLIBCXX_MOVE(*__first2);
2325             ++__first2;
2326             }
2327             else
2328             {
2329             *__result = _GLIBCXX_MOVE(*__first1);
2330             ++__first1;
2331             }
2332             ++__result;
2333             }
2334             if (__first1 != __last1)
2335             _GLIBCXX_MOVE3(__first1, __last1, __result);
2336             }
2337              
2338             /// This is a helper function for the __merge_adaptive routines.
2339             template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2340             typename _BidirectionalIterator3, typename _Compare>
2341             void
2342             __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2343             _BidirectionalIterator1 __last1,
2344             _BidirectionalIterator2 __first2,
2345             _BidirectionalIterator2 __last2,
2346             _BidirectionalIterator3 __result,
2347             _Compare __comp)
2348             {
2349             if (__first1 == __last1)
2350             {
2351             _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2352             return;
2353             }
2354             else if (__first2 == __last2)
2355             return;
2356              
2357             --__last1;
2358             --__last2;
2359             while (true)
2360             {
2361             if (__comp(__last2, __last1))
2362             {
2363             *--__result = _GLIBCXX_MOVE(*__last1);
2364             if (__first1 == __last1)
2365             {
2366             _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2367             return;
2368             }
2369             --__last1;
2370             }
2371             else
2372             {
2373             *--__result = _GLIBCXX_MOVE(*__last2);
2374             if (__first2 == __last2)
2375             return;
2376             --__last2;
2377             }
2378             }
2379             }
2380              
2381             /// This is a helper function for the merge routines.
2382             template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2383             typename _Distance>
2384             _BidirectionalIterator1
2385             __rotate_adaptive(_BidirectionalIterator1 __first,
2386             _BidirectionalIterator1 __middle,
2387             _BidirectionalIterator1 __last,
2388             _Distance __len1, _Distance __len2,
2389             _BidirectionalIterator2 __buffer,
2390             _Distance __buffer_size)
2391             {
2392             _BidirectionalIterator2 __buffer_end;
2393             if (__len1 > __len2 && __len2 <= __buffer_size)
2394             {
2395             if (__len2)
2396             {
2397             __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2398             _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2399             return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2400             }
2401             else
2402             return __first;
2403             }
2404             else if (__len1 <= __buffer_size)
2405             {
2406             if (__len1)
2407             {
2408             __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2409             _GLIBCXX_MOVE3(__middle, __last, __first);
2410             return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2411             }
2412             else
2413             return __last;
2414             }
2415             else
2416             {
2417             std::rotate(__first, __middle, __last);
2418             std::advance(__first, std::distance(__middle, __last));
2419             return __first;
2420             }
2421             }
2422              
2423             /// This is a helper function for the merge routines.
2424             template<typename _BidirectionalIterator, typename _Distance,
2425             typename _Pointer, typename _Compare>
2426             void
2427             __merge_adaptive(_BidirectionalIterator __first,
2428             _BidirectionalIterator __middle,
2429             _BidirectionalIterator __last,
2430             _Distance __len1, _Distance __len2,
2431             _Pointer __buffer, _Distance __buffer_size,
2432             _Compare __comp)
2433             {
2434             if (__len1 <= __len2 && __len1 <= __buffer_size)
2435             {
2436             _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2437             std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2438             __first, __comp);
2439             }
2440             else if (__len2 <= __buffer_size)
2441             {
2442             _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2443             std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2444             __buffer_end, __last, __comp);
2445             }
2446             else
2447             {
2448             _BidirectionalIterator __first_cut = __first;
2449             _BidirectionalIterator __second_cut = __middle;
2450             _Distance __len11 = 0;
2451             _Distance __len22 = 0;
2452             if (__len1 > __len2)
2453             {
2454             __len11 = __len1 / 2;
2455             std::advance(__first_cut, __len11);
2456             __second_cut
2457             = std::__lower_bound(__middle, __last, *__first_cut,
2458             __gnu_cxx::__ops::__iter_comp_val(__comp));
2459             __len22 = std::distance(__middle, __second_cut);
2460             }
2461             else
2462             {
2463             __len22 = __len2 / 2;
2464             std::advance(__second_cut, __len22);
2465             __first_cut
2466             = std::__upper_bound(__first, __middle, *__second_cut,
2467             __gnu_cxx::__ops::__val_comp_iter(__comp));
2468             __len11 = std::distance(__first, __first_cut);
2469             }
2470              
2471             _BidirectionalIterator __new_middle
2472             = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2473             __len1 - __len11, __len22, __buffer,
2474             __buffer_size);
2475             std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2476             __len22, __buffer, __buffer_size, __comp);
2477             std::__merge_adaptive(__new_middle, __second_cut, __last,
2478             __len1 - __len11,
2479             __len2 - __len22, __buffer,
2480             __buffer_size, __comp);
2481             }
2482             }
2483              
2484             /// This is a helper function for the merge routines.
2485             template<typename _BidirectionalIterator, typename _Distance,
2486             typename _Compare>
2487             void
2488             __merge_without_buffer(_BidirectionalIterator __first,
2489             _BidirectionalIterator __middle,
2490             _BidirectionalIterator __last,
2491             _Distance __len1, _Distance __len2,
2492             _Compare __comp)
2493             {
2494             if (__len1 == 0 || __len2 == 0)
2495             return;
2496              
2497             if (__len1 + __len2 == 2)
2498             {
2499             if (__comp(__middle, __first))
2500             std::iter_swap(__first, __middle);
2501             return;
2502             }
2503              
2504             _BidirectionalIterator __first_cut = __first;
2505             _BidirectionalIterator __second_cut = __middle;
2506             _Distance __len11 = 0;
2507             _Distance __len22 = 0;
2508             if (__len1 > __len2)
2509             {
2510             __len11 = __len1 / 2;
2511             std::advance(__first_cut, __len11);
2512             __second_cut
2513             = std::__lower_bound(__middle, __last, *__first_cut,
2514             __gnu_cxx::__ops::__iter_comp_val(__comp));
2515             __len22 = std::distance(__middle, __second_cut);
2516             }
2517             else
2518             {
2519             __len22 = __len2 / 2;
2520             std::advance(__second_cut, __len22);
2521             __first_cut
2522             = std::__upper_bound(__first, __middle, *__second_cut,
2523             __gnu_cxx::__ops::__val_comp_iter(__comp));
2524             __len11 = std::distance(__first, __first_cut);
2525             }
2526              
2527             std::rotate(__first_cut, __middle, __second_cut);
2528             _BidirectionalIterator __new_middle = __first_cut;
2529             std::advance(__new_middle, std::distance(__middle, __second_cut));
2530             std::__merge_without_buffer(__first, __first_cut, __new_middle,
2531             __len11, __len22, __comp);
2532             std::__merge_without_buffer(__new_middle, __second_cut, __last,
2533             __len1 - __len11, __len2 - __len22, __comp);
2534             }
2535              
2536             template<typename _BidirectionalIterator, typename _Compare>
2537             void
2538             __inplace_merge(_BidirectionalIterator __first,
2539             _BidirectionalIterator __middle,
2540             _BidirectionalIterator __last,
2541             _Compare __comp)
2542             {
2543             typedef typename iterator_traits<_BidirectionalIterator>::value_type
2544             _ValueType;
2545             typedef typename iterator_traits<_BidirectionalIterator>::difference_type
2546             _DistanceType;
2547              
2548             if (__first == __middle || __middle == __last)
2549             return;
2550              
2551             const _DistanceType __len1 = std::distance(__first, __middle);
2552             const _DistanceType __len2 = std::distance(__middle, __last);
2553              
2554             typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
2555             _TmpBuf __buf(__first, __last);
2556              
2557             if (__buf.begin() == 0)
2558             std::__merge_without_buffer
2559             (__first, __middle, __last, __len1, __len2, __comp);
2560             else
2561             std::__merge_adaptive
2562             (__first, __middle, __last, __len1, __len2, __buf.begin(),
2563             _DistanceType(__buf.size()), __comp);
2564             }
2565              
2566             /**
2567             * @brief Merges two sorted ranges in place.
2568             * @ingroup sorting_algorithms
2569             * @param __first An iterator.
2570             * @param __middle Another iterator.
2571             * @param __last Another iterator.
2572             * @return Nothing.
2573             *
2574             * Merges two sorted and consecutive ranges, [__first,__middle) and
2575             * [__middle,__last), and puts the result in [__first,__last). The
2576             * output will be sorted. The sort is @e stable, that is, for
2577             * equivalent elements in the two ranges, elements from the first
2578             * range will always come before elements from the second.
2579             *
2580             * If enough additional memory is available, this takes (__last-__first)-1
2581             * comparisons. Otherwise an NlogN algorithm is used, where N is
2582             * distance(__first,__last).
2583             */
2584             template<typename _BidirectionalIterator>
2585             inline void
2586             inplace_merge(_BidirectionalIterator __first,
2587             _BidirectionalIterator __middle,
2588             _BidirectionalIterator __last)
2589             {
2590             // concept requirements
2591             __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2592             _BidirectionalIterator>)
2593             __glibcxx_function_requires(_LessThanComparableConcept<
2594             typename iterator_traits<_BidirectionalIterator>::value_type>)
2595             __glibcxx_requires_sorted(__first, __middle);
2596             __glibcxx_requires_sorted(__middle, __last);
2597              
2598             std::__inplace_merge(__first, __middle, __last,
2599             __gnu_cxx::__ops::__iter_less_iter());
2600             }
2601              
2602             /**
2603             * @brief Merges two sorted ranges in place.
2604             * @ingroup sorting_algorithms
2605             * @param __first An iterator.
2606             * @param __middle Another iterator.
2607             * @param __last Another iterator.
2608             * @param __comp A functor to use for comparisons.
2609             * @return Nothing.
2610             *
2611             * Merges two sorted and consecutive ranges, [__first,__middle) and
2612             * [middle,last), and puts the result in [__first,__last). The output will
2613             * be sorted. The sort is @e stable, that is, for equivalent
2614             * elements in the two ranges, elements from the first range will always
2615             * come before elements from the second.
2616             *
2617             * If enough additional memory is available, this takes (__last-__first)-1
2618             * comparisons. Otherwise an NlogN algorithm is used, where N is
2619             * distance(__first,__last).
2620             *
2621             * The comparison function should have the same effects on ordering as
2622             * the function used for the initial sort.
2623             */
2624             template<typename _BidirectionalIterator, typename _Compare>
2625             inline void
2626             inplace_merge(_BidirectionalIterator __first,
2627             _BidirectionalIterator __middle,
2628             _BidirectionalIterator __last,
2629             _Compare __comp)
2630             {
2631             // concept requirements
2632             __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2633             _BidirectionalIterator>)
2634             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2635             typename iterator_traits<_BidirectionalIterator>::value_type,
2636             typename iterator_traits<_BidirectionalIterator>::value_type>)
2637             __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2638             __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2639              
2640             std::__inplace_merge(__first, __middle, __last,
2641             __gnu_cxx::__ops::__iter_comp_iter(__comp));
2642             }
2643              
2644              
2645             /// This is a helper function for the __merge_sort_loop routines.
2646             template<typename _InputIterator, typename _OutputIterator,
2647             typename _Compare>
2648             _OutputIterator
2649             __move_merge(_InputIterator __first1, _InputIterator __last1,
2650             _InputIterator __first2, _InputIterator __last2,
2651             _OutputIterator __result, _Compare __comp)
2652             {
2653             while (__first1 != __last1 && __first2 != __last2)
2654             {
2655             if (__comp(__first2, __first1))
2656             {
2657             *__result = _GLIBCXX_MOVE(*__first2);
2658             ++__first2;
2659             }
2660             else
2661             {
2662             *__result = _GLIBCXX_MOVE(*__first1);
2663             ++__first1;
2664             }
2665             ++__result;
2666             }
2667             return _GLIBCXX_MOVE3(__first2, __last2,
2668             _GLIBCXX_MOVE3(__first1, __last1,
2669             __result));
2670             }
2671              
2672             template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
2673             typename _Distance, typename _Compare>
2674             void
2675             __merge_sort_loop(_RandomAccessIterator1 __first,
2676             _RandomAccessIterator1 __last,
2677             _RandomAccessIterator2 __result, _Distance __step_size,
2678             _Compare __comp)
2679             {
2680             const _Distance __two_step = 2 * __step_size;
2681              
2682             while (__last - __first >= __two_step)
2683             {
2684             __result = std::__move_merge(__first, __first + __step_size,
2685             __first + __step_size,
2686             __first + __two_step,
2687             __result, __comp);
2688             __first += __two_step;
2689             }
2690             __step_size = std::min(_Distance(__last - __first), __step_size);
2691              
2692             std::__move_merge(__first, __first + __step_size,
2693             __first + __step_size, __last, __result, __comp);
2694             }
2695              
2696             template<typename _RandomAccessIterator, typename _Distance,
2697             typename _Compare>
2698             void
2699             __chunk_insertion_sort(_RandomAccessIterator __first,
2700             _RandomAccessIterator __last,
2701             _Distance __chunk_size, _Compare __comp)
2702             {
2703             while (__last - __first >= __chunk_size)
2704             {
2705             std::__insertion_sort(__first, __first + __chunk_size, __comp);
2706             __first += __chunk_size;
2707             }
2708             std::__insertion_sort(__first, __last, __comp);
2709             }
2710              
2711             enum { _S_chunk_size = 7 };
2712              
2713             template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
2714             void
2715             __merge_sort_with_buffer(_RandomAccessIterator __first,
2716             _RandomAccessIterator __last,
2717             _Pointer __buffer, _Compare __comp)
2718             {
2719             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2720             _Distance;
2721              
2722             const _Distance __len = __last - __first;
2723             const _Pointer __buffer_last = __buffer + __len;
2724              
2725             _Distance __step_size = _S_chunk_size;
2726             std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2727              
2728             while (__step_size < __len)
2729             {
2730             std::__merge_sort_loop(__first, __last, __buffer,
2731             __step_size, __comp);
2732             __step_size *= 2;
2733             std::__merge_sort_loop(__buffer, __buffer_last, __first,
2734             __step_size, __comp);
2735             __step_size *= 2;
2736             }
2737             }
2738              
2739             template<typename _RandomAccessIterator, typename _Pointer,
2740             typename _Distance, typename _Compare>
2741             void
2742             __stable_sort_adaptive(_RandomAccessIterator __first,
2743             _RandomAccessIterator __last,
2744             _Pointer __buffer, _Distance __buffer_size,
2745             _Compare __comp)
2746             {
2747             const _Distance __len = (__last - __first + 1) / 2;
2748             const _RandomAccessIterator __middle = __first + __len;
2749             if (__len > __buffer_size)
2750             {
2751             std::__stable_sort_adaptive(__first, __middle, __buffer,
2752             __buffer_size, __comp);
2753             std::__stable_sort_adaptive(__middle, __last, __buffer,
2754             __buffer_size, __comp);
2755             }
2756             else
2757             {
2758             std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2759             std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2760             }
2761             std::__merge_adaptive(__first, __middle, __last,
2762             _Distance(__middle - __first),
2763             _Distance(__last - __middle),
2764             __buffer, __buffer_size,
2765             __comp);
2766             }
2767              
2768             /// This is a helper function for the stable sorting routines.
2769             template<typename _RandomAccessIterator, typename _Compare>
2770             void
2771             __inplace_stable_sort(_RandomAccessIterator __first,
2772             _RandomAccessIterator __last, _Compare __comp)
2773             {
2774             if (__last - __first < 15)
2775             {
2776             std::__insertion_sort(__first, __last, __comp);
2777             return;
2778             }
2779             _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2780             std::__inplace_stable_sort(__first, __middle, __comp);
2781             std::__inplace_stable_sort(__middle, __last, __comp);
2782             std::__merge_without_buffer(__first, __middle, __last,
2783             __middle - __first,
2784             __last - __middle,
2785             __comp);
2786             }
2787              
2788             // stable_sort
2789              
2790             // Set algorithms: includes, set_union, set_intersection, set_difference,
2791             // set_symmetric_difference. All of these algorithms have the precondition
2792             // that their input ranges are sorted and the postcondition that their output
2793             // ranges are sorted.
2794              
2795             template<typename _InputIterator1, typename _InputIterator2,
2796             typename _Compare>
2797             bool
2798             __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2799             _InputIterator2 __first2, _InputIterator2 __last2,
2800             _Compare __comp)
2801             {
2802             while (__first1 != __last1 && __first2 != __last2)
2803             if (__comp(__first2, __first1))
2804             return false;
2805             else if (__comp(__first1, __first2))
2806             ++__first1;
2807             else
2808             ++__first1, ++__first2;
2809              
2810             return __first2 == __last2;
2811             }
2812              
2813             /**
2814             * @brief Determines whether all elements of a sequence exists in a range.
2815             * @param __first1 Start of search range.
2816             * @param __last1 End of search range.
2817             * @param __first2 Start of sequence
2818             * @param __last2 End of sequence.
2819             * @return True if each element in [__first2,__last2) is contained in order
2820             * within [__first1,__last1). False otherwise.
2821             * @ingroup set_algorithms
2822             *
2823             * This operation expects both [__first1,__last1) and
2824             * [__first2,__last2) to be sorted. Searches for the presence of
2825             * each element in [__first2,__last2) within [__first1,__last1).
2826             * The iterators over each range only move forward, so this is a
2827             * linear algorithm. If an element in [__first2,__last2) is not
2828             * found before the search iterator reaches @p __last2, false is
2829             * returned.
2830             */
2831             template<typename _InputIterator1, typename _InputIterator2>
2832             inline bool
2833             includes(_InputIterator1 __first1, _InputIterator1 __last1,
2834             _InputIterator2 __first2, _InputIterator2 __last2)
2835             {
2836             // concept requirements
2837             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2838             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2839             __glibcxx_function_requires(_LessThanOpConcept<
2840             typename iterator_traits<_InputIterator1>::value_type,
2841             typename iterator_traits<_InputIterator2>::value_type>)
2842             __glibcxx_function_requires(_LessThanOpConcept<
2843             typename iterator_traits<_InputIterator2>::value_type,
2844             typename iterator_traits<_InputIterator1>::value_type>)
2845             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2846             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2847              
2848             return std::__includes(__first1, __last1, __first2, __last2,
2849             __gnu_cxx::__ops::__iter_less_iter());
2850             }
2851              
2852             /**
2853             * @brief Determines whether all elements of a sequence exists in a range
2854             * using comparison.
2855             * @ingroup set_algorithms
2856             * @param __first1 Start of search range.
2857             * @param __last1 End of search range.
2858             * @param __first2 Start of sequence
2859             * @param __last2 End of sequence.
2860             * @param __comp Comparison function to use.
2861             * @return True if each element in [__first2,__last2) is contained
2862             * in order within [__first1,__last1) according to comp. False
2863             * otherwise. @ingroup set_algorithms
2864             *
2865             * This operation expects both [__first1,__last1) and
2866             * [__first2,__last2) to be sorted. Searches for the presence of
2867             * each element in [__first2,__last2) within [__first1,__last1),
2868             * using comp to decide. The iterators over each range only move
2869             * forward, so this is a linear algorithm. If an element in
2870             * [__first2,__last2) is not found before the search iterator
2871             * reaches @p __last2, false is returned.
2872             */
2873             template<typename _InputIterator1, typename _InputIterator2,
2874             typename _Compare>
2875             inline bool
2876             includes(_InputIterator1 __first1, _InputIterator1 __last1,
2877             _InputIterator2 __first2, _InputIterator2 __last2,
2878             _Compare __comp)
2879             {
2880             // concept requirements
2881             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2882             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2883             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2884             typename iterator_traits<_InputIterator1>::value_type,
2885             typename iterator_traits<_InputIterator2>::value_type>)
2886             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2887             typename iterator_traits<_InputIterator2>::value_type,
2888             typename iterator_traits<_InputIterator1>::value_type>)
2889             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2890             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2891              
2892             return std::__includes(__first1, __last1, __first2, __last2,
2893             __gnu_cxx::__ops::__iter_comp_iter(__comp));
2894             }
2895              
2896             // nth_element
2897             // merge
2898             // set_difference
2899             // set_intersection
2900             // set_union
2901             // stable_sort
2902             // set_symmetric_difference
2903             // min_element
2904             // max_element
2905              
2906             template<typename _BidirectionalIterator, typename _Compare>
2907             bool
2908             __next_permutation(_BidirectionalIterator __first,
2909             _BidirectionalIterator __last, _Compare __comp)
2910             {
2911             if (__first == __last)
2912             return false;
2913             _BidirectionalIterator __i = __first;
2914             ++__i;
2915             if (__i == __last)
2916             return false;
2917             __i = __last;
2918             --__i;
2919              
2920             for(;;)
2921             {
2922             _BidirectionalIterator __ii = __i;
2923             --__i;
2924             if (__comp(__i, __ii))
2925             {
2926             _BidirectionalIterator __j = __last;
2927             while (!__comp(__i, --__j))
2928             {}
2929             std::iter_swap(__i, __j);
2930             std::__reverse(__ii, __last,
2931             std::__iterator_category(__first));
2932             return true;
2933             }
2934             if (__i == __first)
2935             {
2936             std::__reverse(__first, __last,
2937             std::__iterator_category(__first));
2938             return false;
2939             }
2940             }
2941             }
2942              
2943             /**
2944             * @brief Permute range into the next @e dictionary ordering.
2945             * @ingroup sorting_algorithms
2946             * @param __first Start of range.
2947             * @param __last End of range.
2948             * @return False if wrapped to first permutation, true otherwise.
2949             *
2950             * Treats all permutations of the range as a set of @e dictionary sorted
2951             * sequences. Permutes the current sequence into the next one of this set.
2952             * Returns true if there are more sequences to generate. If the sequence
2953             * is the largest of the set, the smallest is generated and false returned.
2954             */
2955             template<typename _BidirectionalIterator>
2956             inline bool
2957             next_permutation(_BidirectionalIterator __first,
2958             _BidirectionalIterator __last)
2959             {
2960             // concept requirements
2961             __glibcxx_function_requires(_BidirectionalIteratorConcept<
2962             _BidirectionalIterator>)
2963             __glibcxx_function_requires(_LessThanComparableConcept<
2964             typename iterator_traits<_BidirectionalIterator>::value_type>)
2965             __glibcxx_requires_valid_range(__first, __last);
2966              
2967             return std::__next_permutation
2968             (__first, __last, __gnu_cxx::__ops::__iter_less_iter());
2969             }
2970              
2971             /**
2972             * @brief Permute range into the next @e dictionary ordering using
2973             * comparison functor.
2974             * @ingroup sorting_algorithms
2975             * @param __first Start of range.
2976             * @param __last End of range.
2977             * @param __comp A comparison functor.
2978             * @return False if wrapped to first permutation, true otherwise.
2979             *
2980             * Treats all permutations of the range [__first,__last) as a set of
2981             * @e dictionary sorted sequences ordered by @p __comp. Permutes the current
2982             * sequence into the next one of this set. Returns true if there are more
2983             * sequences to generate. If the sequence is the largest of the set, the
2984             * smallest is generated and false returned.
2985             */
2986             template<typename _BidirectionalIterator, typename _Compare>
2987             inline bool
2988             next_permutation(_BidirectionalIterator __first,
2989             _BidirectionalIterator __last, _Compare __comp)
2990             {
2991             // concept requirements
2992             __glibcxx_function_requires(_BidirectionalIteratorConcept<
2993             _BidirectionalIterator>)
2994             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2995             typename iterator_traits<_BidirectionalIterator>::value_type,
2996             typename iterator_traits<_BidirectionalIterator>::value_type>)
2997             __glibcxx_requires_valid_range(__first, __last);
2998              
2999             return std::__next_permutation
3000             (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
3001             }
3002              
3003             template<typename _BidirectionalIterator, typename _Compare>
3004             bool
3005             __prev_permutation(_BidirectionalIterator __first,
3006             _BidirectionalIterator __last, _Compare __comp)
3007             {
3008             if (__first == __last)
3009             return false;
3010             _BidirectionalIterator __i = __first;
3011             ++__i;
3012             if (__i == __last)
3013             return false;
3014             __i = __last;
3015             --__i;
3016              
3017             for(;;)
3018             {
3019             _BidirectionalIterator __ii = __i;
3020             --__i;
3021             if (__comp(__ii, __i))
3022             {
3023             _BidirectionalIterator __j = __last;
3024             while (!__comp(--__j, __i))
3025             {}
3026             std::iter_swap(__i, __j);
3027             std::__reverse(__ii, __last,
3028             std::__iterator_category(__first));
3029             return true;
3030             }
3031             if (__i == __first)
3032             {
3033             std::__reverse(__first, __last,
3034             std::__iterator_category(__first));
3035             return false;
3036             }
3037             }
3038             }
3039              
3040             /**
3041             * @brief Permute range into the previous @e dictionary ordering.
3042             * @ingroup sorting_algorithms
3043             * @param __first Start of range.
3044             * @param __last End of range.
3045             * @return False if wrapped to last permutation, true otherwise.
3046             *
3047             * Treats all permutations of the range as a set of @e dictionary sorted
3048             * sequences. Permutes the current sequence into the previous one of this
3049             * set. Returns true if there are more sequences to generate. If the
3050             * sequence is the smallest of the set, the largest is generated and false
3051             * returned.
3052             */
3053             template<typename _BidirectionalIterator>
3054             inline bool
3055             prev_permutation(_BidirectionalIterator __first,
3056             _BidirectionalIterator __last)
3057             {
3058             // concept requirements
3059             __glibcxx_function_requires(_BidirectionalIteratorConcept<
3060             _BidirectionalIterator>)
3061             __glibcxx_function_requires(_LessThanComparableConcept<
3062             typename iterator_traits<_BidirectionalIterator>::value_type>)
3063             __glibcxx_requires_valid_range(__first, __last);
3064              
3065             return std::__prev_permutation(__first, __last,
3066             __gnu_cxx::__ops::__iter_less_iter());
3067             }
3068              
3069             /**
3070             * @brief Permute range into the previous @e dictionary ordering using
3071             * comparison functor.
3072             * @ingroup sorting_algorithms
3073             * @param __first Start of range.
3074             * @param __last End of range.
3075             * @param __comp A comparison functor.
3076             * @return False if wrapped to last permutation, true otherwise.
3077             *
3078             * Treats all permutations of the range [__first,__last) as a set of
3079             * @e dictionary sorted sequences ordered by @p __comp. Permutes the current
3080             * sequence into the previous one of this set. Returns true if there are
3081             * more sequences to generate. If the sequence is the smallest of the set,
3082             * the largest is generated and false returned.
3083             */
3084             template<typename _BidirectionalIterator, typename _Compare>
3085             inline bool
3086             prev_permutation(_BidirectionalIterator __first,
3087             _BidirectionalIterator __last, _Compare __comp)
3088             {
3089             // concept requirements
3090             __glibcxx_function_requires(_BidirectionalIteratorConcept<
3091             _BidirectionalIterator>)
3092             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3093             typename iterator_traits<_BidirectionalIterator>::value_type,
3094             typename iterator_traits<_BidirectionalIterator>::value_type>)
3095             __glibcxx_requires_valid_range(__first, __last);
3096              
3097             return std::__prev_permutation(__first, __last,
3098             __gnu_cxx::__ops::__iter_comp_iter(__comp));
3099             }
3100              
3101             // replace
3102             // replace_if
3103              
3104             template<typename _InputIterator, typename _OutputIterator,
3105             typename _Predicate, typename _Tp>
3106             _OutputIterator
3107             __replace_copy_if(_InputIterator __first, _InputIterator __last,
3108             _OutputIterator __result,
3109             _Predicate __pred, const _Tp& __new_value)
3110             {
3111             for (; __first != __last; ++__first, ++__result)
3112             if (__pred(__first))
3113             *__result = __new_value;
3114             else
3115             *__result = *__first;
3116             return __result;
3117             }
3118              
3119             /**
3120             * @brief Copy a sequence, replacing each element of one value with another
3121             * value.
3122             * @param __first An input iterator.
3123             * @param __last An input iterator.
3124             * @param __result An output iterator.
3125             * @param __old_value The value to be replaced.
3126             * @param __new_value The replacement value.
3127             * @return The end of the output sequence, @p result+(last-first).
3128             *
3129             * Copies each element in the input range @p [__first,__last) to the
3130             * output range @p [__result,__result+(__last-__first)) replacing elements
3131             * equal to @p __old_value with @p __new_value.
3132             */
3133             template<typename _InputIterator, typename _OutputIterator, typename _Tp>
3134             inline _OutputIterator
3135             replace_copy(_InputIterator __first, _InputIterator __last,
3136             _OutputIterator __result,
3137             const _Tp& __old_value, const _Tp& __new_value)
3138             {
3139             // concept requirements
3140             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3141             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3142             typename iterator_traits<_InputIterator>::value_type>)
3143             __glibcxx_function_requires(_EqualOpConcept<
3144             typename iterator_traits<_InputIterator>::value_type, _Tp>)
3145             __glibcxx_requires_valid_range(__first, __last);
3146              
3147             return std::__replace_copy_if(__first, __last, __result,
3148             __gnu_cxx::__ops::__iter_equals_val(__old_value),
3149             __new_value);
3150             }
3151              
3152             /**
3153             * @brief Copy a sequence, replacing each value for which a predicate
3154             * returns true with another value.
3155             * @ingroup mutating_algorithms
3156             * @param __first An input iterator.
3157             * @param __last An input iterator.
3158             * @param __result An output iterator.
3159             * @param __pred A predicate.
3160             * @param __new_value The replacement value.
3161             * @return The end of the output sequence, @p __result+(__last-__first).
3162             *
3163             * Copies each element in the range @p [__first,__last) to the range
3164             * @p [__result,__result+(__last-__first)) replacing elements for which
3165             * @p __pred returns true with @p __new_value.
3166             */
3167             template<typename _InputIterator, typename _OutputIterator,
3168             typename _Predicate, typename _Tp>
3169             inline _OutputIterator
3170             replace_copy_if(_InputIterator __first, _InputIterator __last,
3171             _OutputIterator __result,
3172             _Predicate __pred, const _Tp& __new_value)
3173             {
3174             // concept requirements
3175             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3176             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3177             typename iterator_traits<_InputIterator>::value_type>)
3178             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3179             typename iterator_traits<_InputIterator>::value_type>)
3180             __glibcxx_requires_valid_range(__first, __last);
3181              
3182             return std::__replace_copy_if(__first, __last, __result,
3183             __gnu_cxx::__ops::__pred_iter(__pred),
3184             __new_value);
3185             }
3186              
3187             template<typename _InputIterator, typename _Predicate>
3188             typename iterator_traits<_InputIterator>::difference_type
3189             __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3190             {
3191             typename iterator_traits<_InputIterator>::difference_type __n = 0;
3192             for (; __first != __last; ++__first)
3193             if (__pred(__first))
3194             ++__n;
3195             return __n;
3196             }
3197              
3198             #if __cplusplus >= 201103L
3199             /**
3200             * @brief Determines whether the elements of a sequence are sorted.
3201             * @ingroup sorting_algorithms
3202             * @param __first An iterator.
3203             * @param __last Another iterator.
3204             * @return True if the elements are sorted, false otherwise.
3205             */
3206             template<typename _ForwardIterator>
3207             inline bool
3208             is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3209             { return std::is_sorted_until(__first, __last) == __last; }
3210              
3211             /**
3212             * @brief Determines whether the elements of a sequence are sorted
3213             * according to a comparison functor.
3214             * @ingroup sorting_algorithms
3215             * @param __first An iterator.
3216             * @param __last Another iterator.
3217             * @param __comp A comparison functor.
3218             * @return True if the elements are sorted, false otherwise.
3219             */
3220             template<typename _ForwardIterator, typename _Compare>
3221             inline bool
3222             is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3223             _Compare __comp)
3224             { return std::is_sorted_until(__first, __last, __comp) == __last; }
3225              
3226             template<typename _ForwardIterator, typename _Compare>
3227             _ForwardIterator
3228             __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3229             _Compare __comp)
3230             {
3231             if (__first == __last)
3232             return __last;
3233              
3234             _ForwardIterator __next = __first;
3235             for (++__next; __next != __last; __first = __next, ++__next)
3236             if (__comp(__next, __first))
3237             return __next;
3238             return __next;
3239             }
3240              
3241             /**
3242             * @brief Determines the end of a sorted sequence.
3243             * @ingroup sorting_algorithms
3244             * @param __first An iterator.
3245             * @param __last Another iterator.
3246             * @return An iterator pointing to the last iterator i in [__first, __last)
3247             * for which the range [__first, i) is sorted.
3248             */
3249             template<typename _ForwardIterator>
3250             inline _ForwardIterator
3251             is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3252             {
3253             // concept requirements
3254             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3255             __glibcxx_function_requires(_LessThanComparableConcept<
3256             typename iterator_traits<_ForwardIterator>::value_type>)
3257             __glibcxx_requires_valid_range(__first, __last);
3258              
3259             return std::__is_sorted_until(__first, __last,
3260             __gnu_cxx::__ops::__iter_less_iter());
3261             }
3262              
3263             /**
3264             * @brief Determines the end of a sorted sequence using comparison functor.
3265             * @ingroup sorting_algorithms
3266             * @param __first An iterator.
3267             * @param __last Another iterator.
3268             * @param __comp A comparison functor.
3269             * @return An iterator pointing to the last iterator i in [__first, __last)
3270             * for which the range [__first, i) is sorted.
3271             */
3272             template<typename _ForwardIterator, typename _Compare>
3273             inline _ForwardIterator
3274             is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3275             _Compare __comp)
3276             {
3277             // concept requirements
3278             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3279             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3280             typename iterator_traits<_ForwardIterator>::value_type,
3281             typename iterator_traits<_ForwardIterator>::value_type>)
3282             __glibcxx_requires_valid_range(__first, __last);
3283              
3284             return std::__is_sorted_until(__first, __last,
3285             __gnu_cxx::__ops::__iter_comp_iter(__comp));
3286             }
3287              
3288             /**
3289             * @brief Determines min and max at once as an ordered pair.
3290             * @ingroup sorting_algorithms
3291             * @param __a A thing of arbitrary type.
3292             * @param __b Another thing of arbitrary type.
3293             * @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
3294             * __b) otherwise.
3295             */
3296             template<typename _Tp>
3297             _GLIBCXX14_CONSTEXPR
3298             inline pair<const _Tp&, const _Tp&>
3299             minmax(const _Tp& __a, const _Tp& __b)
3300             {
3301             // concept requirements
3302             __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3303              
3304             return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3305             : pair<const _Tp&, const _Tp&>(__a, __b);
3306             }
3307              
3308             /**
3309             * @brief Determines min and max at once as an ordered pair.
3310             * @ingroup sorting_algorithms
3311             * @param __a A thing of arbitrary type.
3312             * @param __b Another thing of arbitrary type.
3313             * @param __comp A @link comparison_functors comparison functor @endlink.
3314             * @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
3315             * __b) otherwise.
3316             */
3317             template<typename _Tp, typename _Compare>
3318             _GLIBCXX14_CONSTEXPR
3319             inline pair<const _Tp&, const _Tp&>
3320             minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
3321             {
3322             return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a)
3323             : pair<const _Tp&, const _Tp&>(__a, __b);
3324             }
3325              
3326             template<typename _ForwardIterator, typename _Compare>
3327             _GLIBCXX14_CONSTEXPR
3328             pair<_ForwardIterator, _ForwardIterator>
3329             __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3330             _Compare __comp)
3331             {
3332             _ForwardIterator __next = __first;
3333             if (__first == __last
3334             || ++__next == __last)
3335             return std::make_pair(__first, __first);
3336              
3337             _ForwardIterator __min{}, __max{};
3338             if (__comp(__next, __first))
3339             {
3340             __min = __next;
3341             __max = __first;
3342             }
3343             else
3344             {
3345             __min = __first;
3346             __max = __next;
3347             }
3348              
3349             __first = __next;
3350             ++__first;
3351              
3352             while (__first != __last)
3353             {
3354             __next = __first;
3355             if (++__next == __last)
3356             {
3357             if (__comp(__first, __min))
3358             __min = __first;
3359             else if (!__comp(__first, __max))
3360             __max = __first;
3361             break;
3362             }
3363              
3364             if (__comp(__next, __first))
3365             {
3366             if (__comp(__next, __min))
3367             __min = __next;
3368             if (!__comp(__first, __max))
3369             __max = __first;
3370             }
3371             else
3372             {
3373             if (__comp(__first, __min))
3374             __min = __first;
3375             if (!__comp(__next, __max))
3376             __max = __next;
3377             }
3378              
3379             __first = __next;
3380             ++__first;
3381             }
3382              
3383             return std::make_pair(__min, __max);
3384             }
3385              
3386             /**
3387             * @brief Return a pair of iterators pointing to the minimum and maximum
3388             * elements in a range.
3389             * @ingroup sorting_algorithms
3390             * @param __first Start of range.
3391             * @param __last End of range.
3392             * @return make_pair(m, M), where m is the first iterator i in
3393             * [__first, __last) such that no other element in the range is
3394             * smaller, and where M is the last iterator i in [__first, __last)
3395             * such that no other element in the range is larger.
3396             */
3397             template<typename _ForwardIterator>
3398             _GLIBCXX14_CONSTEXPR
3399             inline pair<_ForwardIterator, _ForwardIterator>
3400             minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3401             {
3402             // concept requirements
3403             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3404             __glibcxx_function_requires(_LessThanComparableConcept<
3405             typename iterator_traits<_ForwardIterator>::value_type>)
3406             __glibcxx_requires_valid_range(__first, __last);
3407              
3408             return std::__minmax_element(__first, __last,
3409             __gnu_cxx::__ops::__iter_less_iter());
3410             }
3411              
3412             /**
3413             * @brief Return a pair of iterators pointing to the minimum and maximum
3414             * elements in a range.
3415             * @ingroup sorting_algorithms
3416             * @param __first Start of range.
3417             * @param __last End of range.
3418             * @param __comp Comparison functor.
3419             * @return make_pair(m, M), where m is the first iterator i in
3420             * [__first, __last) such that no other element in the range is
3421             * smaller, and where M is the last iterator i in [__first, __last)
3422             * such that no other element in the range is larger.
3423             */
3424             template<typename _ForwardIterator, typename _Compare>
3425             _GLIBCXX14_CONSTEXPR
3426             inline pair<_ForwardIterator, _ForwardIterator>
3427             minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3428             _Compare __comp)
3429             {
3430             // concept requirements
3431             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3432             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3433             typename iterator_traits<_ForwardIterator>::value_type,
3434             typename iterator_traits<_ForwardIterator>::value_type>)
3435             __glibcxx_requires_valid_range(__first, __last);
3436              
3437             return std::__minmax_element(__first, __last,
3438             __gnu_cxx::__ops::__iter_comp_iter(__comp));
3439             }
3440              
3441             // N2722 + DR 915.
3442             template<typename _Tp>
3443             _GLIBCXX14_CONSTEXPR
3444             inline _Tp
3445             min(initializer_list<_Tp> __l)
3446             { return *std::min_element(__l.begin(), __l.end()); }
3447              
3448             template<typename _Tp, typename _Compare>
3449             _GLIBCXX14_CONSTEXPR
3450             inline _Tp
3451             min(initializer_list<_Tp> __l, _Compare __comp)
3452             { return *std::min_element(__l.begin(), __l.end(), __comp); }
3453              
3454             template<typename _Tp>
3455             _GLIBCXX14_CONSTEXPR
3456             inline _Tp
3457             max(initializer_list<_Tp> __l)
3458             { return *std::max_element(__l.begin(), __l.end()); }
3459              
3460             template<typename _Tp, typename _Compare>
3461             _GLIBCXX14_CONSTEXPR
3462             inline _Tp
3463             max(initializer_list<_Tp> __l, _Compare __comp)
3464             { return *std::max_element(__l.begin(), __l.end(), __comp); }
3465              
3466             template<typename _Tp>
3467             _GLIBCXX14_CONSTEXPR
3468             inline pair<_Tp, _Tp>
3469             minmax(initializer_list<_Tp> __l)
3470             {
3471             pair<const _Tp*, const _Tp*> __p =
3472             std::minmax_element(__l.begin(), __l.end());
3473             return std::make_pair(*__p.first, *__p.second);
3474             }
3475              
3476             template<typename _Tp, typename _Compare>
3477             _GLIBCXX14_CONSTEXPR
3478             inline pair<_Tp, _Tp>
3479             minmax(initializer_list<_Tp> __l, _Compare __comp)
3480             {
3481             pair<const _Tp*, const _Tp*> __p =
3482             std::minmax_element(__l.begin(), __l.end(), __comp);
3483             return std::make_pair(*__p.first, *__p.second);
3484             }
3485              
3486             template<typename _ForwardIterator1, typename _ForwardIterator2,
3487             typename _BinaryPredicate>
3488             bool
3489             __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3490             _ForwardIterator2 __first2, _BinaryPredicate __pred)
3491             {
3492             // Efficiently compare identical prefixes: O(N) if sequences
3493             // have the same elements in the same order.
3494             for (; __first1 != __last1; ++__first1, ++__first2)
3495             if (!__pred(__first1, __first2))
3496             break;
3497              
3498             if (__first1 == __last1)
3499             return true;
3500              
3501             // Establish __last2 assuming equal ranges by iterating over the
3502             // rest of the list.
3503             _ForwardIterator2 __last2 = __first2;
3504             std::advance(__last2, std::distance(__first1, __last1));
3505             for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3506             {
3507             if (__scan != std::__find_if(__first1, __scan,
3508             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
3509             continue; // We've seen this one before.
3510            
3511             auto __matches
3512             = std::__count_if(__first2, __last2,
3513             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
3514             if (0 == __matches ||
3515             std::__count_if(__scan, __last1,
3516             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
3517             != __matches)
3518             return false;
3519             }
3520             return true;
3521             }
3522              
3523             /**
3524             * @brief Checks whether a permutation of the second sequence is equal
3525             * to the first sequence.
3526             * @ingroup non_mutating_algorithms
3527             * @param __first1 Start of first range.
3528             * @param __last1 End of first range.
3529             * @param __first2 Start of second range.
3530             * @return true if there exists a permutation of the elements in the range
3531             * [__first2, __first2 + (__last1 - __first1)), beginning with
3532             * ForwardIterator2 begin, such that equal(__first1, __last1, begin)
3533             * returns true; otherwise, returns false.
3534             */
3535             template<typename _ForwardIterator1, typename _ForwardIterator2>
3536             inline bool
3537             is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3538             _ForwardIterator2 __first2)
3539             {
3540             // concept requirements
3541             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3542             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3543             __glibcxx_function_requires(_EqualOpConcept<
3544             typename iterator_traits<_ForwardIterator1>::value_type,
3545             typename iterator_traits<_ForwardIterator2>::value_type>)
3546             __glibcxx_requires_valid_range(__first1, __last1);
3547              
3548             return std::__is_permutation(__first1, __last1, __first2,
3549             __gnu_cxx::__ops::__iter_equal_to_iter());
3550             }
3551              
3552             /**
3553             * @brief Checks whether a permutation of the second sequence is equal
3554             * to the first sequence.
3555             * @ingroup non_mutating_algorithms
3556             * @param __first1 Start of first range.
3557             * @param __last1 End of first range.
3558             * @param __first2 Start of second range.
3559             * @param __pred A binary predicate.
3560             * @return true if there exists a permutation of the elements in
3561             * the range [__first2, __first2 + (__last1 - __first1)),
3562             * beginning with ForwardIterator2 begin, such that
3563             * equal(__first1, __last1, __begin, __pred) returns true;
3564             * otherwise, returns false.
3565             */
3566             template<typename _ForwardIterator1, typename _ForwardIterator2,
3567             typename _BinaryPredicate>
3568             inline bool
3569             is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3570             _ForwardIterator2 __first2, _BinaryPredicate __pred)
3571             {
3572             // concept requirements
3573             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3574             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3575             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3576             typename iterator_traits<_ForwardIterator1>::value_type,
3577             typename iterator_traits<_ForwardIterator2>::value_type>)
3578             __glibcxx_requires_valid_range(__first1, __last1);
3579              
3580             return std::__is_permutation(__first1, __last1, __first2,
3581             __gnu_cxx::__ops::__iter_comp_iter(__pred));
3582             }
3583              
3584             #if __cplusplus > 201103L
3585             template<typename _ForwardIterator1, typename _ForwardIterator2,
3586             typename _BinaryPredicate>
3587             bool
3588             __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3589             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3590             _BinaryPredicate __pred)
3591             {
3592             using _Cat1
3593             = typename iterator_traits<_ForwardIterator1>::iterator_category;
3594             using _Cat2
3595             = typename iterator_traits<_ForwardIterator2>::iterator_category;
3596             using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3597             using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3598             constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
3599             if (__ra_iters)
3600             {
3601             auto __d1 = std::distance(__first1, __last1);
3602             auto __d2 = std::distance(__first2, __last2);
3603             if (__d1 != __d2)
3604             return false;
3605             }
3606              
3607             // Efficiently compare identical prefixes: O(N) if sequences
3608             // have the same elements in the same order.
3609             for (; __first1 != __last1 && __first2 != __last2;
3610             ++__first1, ++__first2)
3611             if (!__pred(__first1, __first2))
3612             break;
3613              
3614             if (__ra_iters)
3615             {
3616             if (__first1 == __last1)
3617             return true;
3618             }
3619             else
3620             {
3621             auto __d1 = std::distance(__first1, __last1);
3622             auto __d2 = std::distance(__first2, __last2);
3623             if (__d1 == 0 && __d2 == 0)
3624             return true;
3625             if (__d1 != __d2)
3626             return false;
3627             }
3628              
3629             for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3630             {
3631             if (__scan != std::__find_if(__first1, __scan,
3632             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
3633             continue; // We've seen this one before.
3634              
3635             auto __matches = std::__count_if(__first2, __last2,
3636             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
3637             if (0 == __matches
3638             || std::__count_if(__scan, __last1,
3639             __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
3640             != __matches)
3641             return false;
3642             }
3643             return true;
3644             }
3645              
3646             /**
3647             * @brief Checks whether a permutaion of the second sequence is equal
3648             * to the first sequence.
3649             * @ingroup non_mutating_algorithms
3650             * @param __first1 Start of first range.
3651             * @param __last1 End of first range.
3652             * @param __first2 Start of second range.
3653             * @param __last2 End of first range.
3654             * @return true if there exists a permutation of the elements in the range
3655             * [__first2, __last2), beginning with ForwardIterator2 begin,
3656             * such that equal(__first1, __last1, begin) returns true;
3657             * otherwise, returns false.
3658             */
3659             template<typename _ForwardIterator1, typename _ForwardIterator2>
3660             inline bool
3661             is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3662             _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3663             {
3664             __glibcxx_requires_valid_range(__first1, __last1);
3665             __glibcxx_requires_valid_range(__first2, __last2);
3666              
3667             return
3668             std::__is_permutation(__first1, __last1, __first2, __last2,
3669             __gnu_cxx::__ops::__iter_equal_to_iter());
3670             }
3671              
3672             /**
3673             * @brief Checks whether a permutation of the second sequence is equal
3674             * to the first sequence.
3675             * @ingroup non_mutating_algorithms
3676             * @param __first1 Start of first range.
3677             * @param __last1 End of first range.
3678             * @param __first2 Start of second range.
3679             * @param __last2 End of first range.
3680             * @param __pred A binary predicate.
3681             * @return true if there exists a permutation of the elements in the range
3682             * [__first2, __last2), beginning with ForwardIterator2 begin,
3683             * such that equal(__first1, __last1, __begin, __pred) returns true;
3684             * otherwise, returns false.
3685             */
3686             template<typename _ForwardIterator1, typename _ForwardIterator2,
3687             typename _BinaryPredicate>
3688             inline bool
3689             is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3690             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3691             _BinaryPredicate __pred)
3692             {
3693             __glibcxx_requires_valid_range(__first1, __last1);
3694             __glibcxx_requires_valid_range(__first2, __last2);
3695              
3696             return std::__is_permutation(__first1, __last1, __first2, __last2,
3697             __gnu_cxx::__ops::__iter_comp_iter(__pred));
3698             }
3699             #endif
3700              
3701             #ifdef _GLIBCXX_USE_C99_STDINT_TR1
3702             /**
3703             * @brief Shuffle the elements of a sequence using a uniform random
3704             * number generator.
3705             * @ingroup mutating_algorithms
3706             * @param __first A forward iterator.
3707             * @param __last A forward iterator.
3708             * @param __g A UniformRandomNumberGenerator (26.5.1.3).
3709             * @return Nothing.
3710             *
3711             * Reorders the elements in the range @p [__first,__last) using @p __g to
3712             * provide random numbers.
3713             */
3714             template<typename _RandomAccessIterator,
3715             typename _UniformRandomNumberGenerator>
3716             void
3717             shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3718             _UniformRandomNumberGenerator&& __g)
3719             {
3720             // concept requirements
3721             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3722             _RandomAccessIterator>)
3723             __glibcxx_requires_valid_range(__first, __last);
3724              
3725             if (__first == __last)
3726             return;
3727              
3728             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3729             _DistanceType;
3730              
3731             typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3732             typedef typename std::uniform_int_distribution<__ud_type> __distr_type;
3733             typedef typename __distr_type::param_type __p_type;
3734             __distr_type __d;
3735              
3736             for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3737             std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3738             }
3739             #endif
3740              
3741             #endif // C++11
3742              
3743             _GLIBCXX_END_NAMESPACE_VERSION
3744              
3745             _GLIBCXX_BEGIN_NAMESPACE_ALGO
3746              
3747             /**
3748             * @brief Apply a function to every element of a sequence.
3749             * @ingroup non_mutating_algorithms
3750             * @param __first An input iterator.
3751             * @param __last An input iterator.
3752             * @param __f A unary function object.
3753             * @return @p __f (std::move(@p __f) in C++0x).
3754             *
3755             * Applies the function object @p __f to each element in the range
3756             * @p [first,last). @p __f must not modify the order of the sequence.
3757             * If @p __f has a return value it is ignored.
3758             */
3759             template<typename _InputIterator, typename _Function>
3760             _Function
3761 5           for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3762             {
3763             // concept requirements
3764             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3765             __glibcxx_requires_valid_range(__first, __last);
3766 3221 100         for (; __first != __last; ++__first)
3767 3216           __f(*__first);
3768 5           return _GLIBCXX_MOVE(__f);
3769             }
3770              
3771             /**
3772             * @brief Find the first occurrence of a value in a sequence.
3773             * @ingroup non_mutating_algorithms
3774             * @param __first An input iterator.
3775             * @param __last An input iterator.
3776             * @param __val The value to find.
3777             * @return The first iterator @c i in the range @p [__first,__last)
3778             * such that @c *i == @p __val, or @p __last if no such iterator exists.
3779             */
3780             template<typename _InputIterator, typename _Tp>
3781             inline _InputIterator
3782             find(_InputIterator __first, _InputIterator __last,
3783             const _Tp& __val)
3784             {
3785             // concept requirements
3786             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3787             __glibcxx_function_requires(_EqualOpConcept<
3788             typename iterator_traits<_InputIterator>::value_type, _Tp>)
3789             __glibcxx_requires_valid_range(__first, __last);
3790             return std::__find_if(__first, __last,
3791             __gnu_cxx::__ops::__iter_equals_val(__val));
3792             }
3793              
3794             /**
3795             * @brief Find the first element in a sequence for which a
3796             * predicate is true.
3797             * @ingroup non_mutating_algorithms
3798             * @param __first An input iterator.
3799             * @param __last An input iterator.
3800             * @param __pred A predicate.
3801             * @return The first iterator @c i in the range @p [__first,__last)
3802             * such that @p __pred(*i) is true, or @p __last if no such iterator exists.
3803             */
3804             template<typename _InputIterator, typename _Predicate>
3805             inline _InputIterator
3806             find_if(_InputIterator __first, _InputIterator __last,
3807             _Predicate __pred)
3808             {
3809             // concept requirements
3810             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3811             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3812             typename iterator_traits<_InputIterator>::value_type>)
3813             __glibcxx_requires_valid_range(__first, __last);
3814              
3815             return std::__find_if(__first, __last,
3816             __gnu_cxx::__ops::__pred_iter(__pred));
3817             }
3818              
3819             /**
3820             * @brief Find element from a set in a sequence.
3821             * @ingroup non_mutating_algorithms
3822             * @param __first1 Start of range to search.
3823             * @param __last1 End of range to search.
3824             * @param __first2 Start of match candidates.
3825             * @param __last2 End of match candidates.
3826             * @return The first iterator @c i in the range
3827             * @p [__first1,__last1) such that @c *i == @p *(i2) such that i2 is an
3828             * iterator in [__first2,__last2), or @p __last1 if no such iterator exists.
3829             *
3830             * Searches the range @p [__first1,__last1) for an element that is
3831             * equal to some element in the range [__first2,__last2). If
3832             * found, returns an iterator in the range [__first1,__last1),
3833             * otherwise returns @p __last1.
3834             */
3835             template<typename _InputIterator, typename _ForwardIterator>
3836             _InputIterator
3837             find_first_of(_InputIterator __first1, _InputIterator __last1,
3838             _ForwardIterator __first2, _ForwardIterator __last2)
3839             {
3840             // concept requirements
3841             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3842             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3843             __glibcxx_function_requires(_EqualOpConcept<
3844             typename iterator_traits<_InputIterator>::value_type,
3845             typename iterator_traits<_ForwardIterator>::value_type>)
3846             __glibcxx_requires_valid_range(__first1, __last1);
3847             __glibcxx_requires_valid_range(__first2, __last2);
3848              
3849             for (; __first1 != __last1; ++__first1)
3850             for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3851             if (*__first1 == *__iter)
3852             return __first1;
3853             return __last1;
3854             }
3855              
3856             /**
3857             * @brief Find element from a set in a sequence using a predicate.
3858             * @ingroup non_mutating_algorithms
3859             * @param __first1 Start of range to search.
3860             * @param __last1 End of range to search.
3861             * @param __first2 Start of match candidates.
3862             * @param __last2 End of match candidates.
3863             * @param __comp Predicate to use.
3864             * @return The first iterator @c i in the range
3865             * @p [__first1,__last1) such that @c comp(*i, @p *(i2)) is true
3866             * and i2 is an iterator in [__first2,__last2), or @p __last1 if no
3867             * such iterator exists.
3868             *
3869              
3870             * Searches the range @p [__first1,__last1) for an element that is
3871             * equal to some element in the range [__first2,__last2). If
3872             * found, returns an iterator in the range [__first1,__last1),
3873             * otherwise returns @p __last1.
3874             */
3875             template<typename _InputIterator, typename _ForwardIterator,
3876             typename _BinaryPredicate>
3877             _InputIterator
3878             find_first_of(_InputIterator __first1, _InputIterator __last1,
3879             _ForwardIterator __first2, _ForwardIterator __last2,
3880             _BinaryPredicate __comp)
3881             {
3882             // concept requirements
3883             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3884             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3885             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3886             typename iterator_traits<_InputIterator>::value_type,
3887             typename iterator_traits<_ForwardIterator>::value_type>)
3888             __glibcxx_requires_valid_range(__first1, __last1);
3889             __glibcxx_requires_valid_range(__first2, __last2);
3890              
3891             for (; __first1 != __last1; ++__first1)
3892             for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3893             if (__comp(*__first1, *__iter))
3894             return __first1;
3895             return __last1;
3896             }
3897              
3898             /**
3899             * @brief Find two adjacent values in a sequence that are equal.
3900             * @ingroup non_mutating_algorithms
3901             * @param __first A forward iterator.
3902             * @param __last A forward iterator.
3903             * @return The first iterator @c i such that @c i and @c i+1 are both
3904             * valid iterators in @p [__first,__last) and such that @c *i == @c *(i+1),
3905             * or @p __last if no such iterator exists.
3906             */
3907             template<typename _ForwardIterator>
3908             inline _ForwardIterator
3909             adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
3910             {
3911             // concept requirements
3912             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3913             __glibcxx_function_requires(_EqualityComparableConcept<
3914             typename iterator_traits<_ForwardIterator>::value_type>)
3915             __glibcxx_requires_valid_range(__first, __last);
3916              
3917             return std::__adjacent_find(__first, __last,
3918             __gnu_cxx::__ops::__iter_equal_to_iter());
3919             }
3920              
3921             /**
3922             * @brief Find two adjacent values in a sequence using a predicate.
3923             * @ingroup non_mutating_algorithms
3924             * @param __first A forward iterator.
3925             * @param __last A forward iterator.
3926             * @param __binary_pred A binary predicate.
3927             * @return The first iterator @c i such that @c i and @c i+1 are both
3928             * valid iterators in @p [__first,__last) and such that
3929             * @p __binary_pred(*i,*(i+1)) is true, or @p __last if no such iterator
3930             * exists.
3931             */
3932             template<typename _ForwardIterator, typename _BinaryPredicate>
3933             inline _ForwardIterator
3934             adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
3935             _BinaryPredicate __binary_pred)
3936             {
3937             // concept requirements
3938             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3939             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3940             typename iterator_traits<_ForwardIterator>::value_type,
3941             typename iterator_traits<_ForwardIterator>::value_type>)
3942             __glibcxx_requires_valid_range(__first, __last);
3943              
3944             return std::__adjacent_find(__first, __last,
3945             __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
3946             }
3947              
3948             /**
3949             * @brief Count the number of copies of a value in a sequence.
3950             * @ingroup non_mutating_algorithms
3951             * @param __first An input iterator.
3952             * @param __last An input iterator.
3953             * @param __value The value to be counted.
3954             * @return The number of iterators @c i in the range @p [__first,__last)
3955             * for which @c *i == @p __value
3956             */
3957             template<typename _InputIterator, typename _Tp>
3958             inline typename iterator_traits<_InputIterator>::difference_type
3959             count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
3960             {
3961             // concept requirements
3962             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3963             __glibcxx_function_requires(_EqualOpConcept<
3964             typename iterator_traits<_InputIterator>::value_type, _Tp>)
3965             __glibcxx_requires_valid_range(__first, __last);
3966              
3967             return std::__count_if(__first, __last,
3968             __gnu_cxx::__ops::__iter_equals_val(__value));
3969             }
3970              
3971             /**
3972             * @brief Count the elements of a sequence for which a predicate is true.
3973             * @ingroup non_mutating_algorithms
3974             * @param __first An input iterator.
3975             * @param __last An input iterator.
3976             * @param __pred A predicate.
3977             * @return The number of iterators @c i in the range @p [__first,__last)
3978             * for which @p __pred(*i) is true.
3979             */
3980             template<typename _InputIterator, typename _Predicate>
3981             inline typename iterator_traits<_InputIterator>::difference_type
3982             count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
3983             {
3984             // concept requirements
3985             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3986             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3987             typename iterator_traits<_InputIterator>::value_type>)
3988             __glibcxx_requires_valid_range(__first, __last);
3989              
3990             return std::__count_if(__first, __last,
3991             __gnu_cxx::__ops::__pred_iter(__pred));
3992             }
3993              
3994             /**
3995             * @brief Search a sequence for a matching sub-sequence.
3996             * @ingroup non_mutating_algorithms
3997             * @param __first1 A forward iterator.
3998             * @param __last1 A forward iterator.
3999             * @param __first2 A forward iterator.
4000             * @param __last2 A forward iterator.
4001             * @return The first iterator @c i in the range @p
4002             * [__first1,__last1-(__last2-__first2)) such that @c *(i+N) == @p
4003             * *(__first2+N) for each @c N in the range @p
4004             * [0,__last2-__first2), or @p __last1 if no such iterator exists.
4005             *
4006             * Searches the range @p [__first1,__last1) for a sub-sequence that
4007             * compares equal value-by-value with the sequence given by @p
4008             * [__first2,__last2) and returns an iterator to the first element
4009             * of the sub-sequence, or @p __last1 if the sub-sequence is not
4010             * found.
4011             *
4012             * Because the sub-sequence must lie completely within the range @p
4013             * [__first1,__last1) it must start at a position less than @p
4014             * __last1-(__last2-__first2) where @p __last2-__first2 is the
4015             * length of the sub-sequence.
4016             *
4017             * This means that the returned iterator @c i will be in the range
4018             * @p [__first1,__last1-(__last2-__first2))
4019             */
4020             template<typename _ForwardIterator1, typename _ForwardIterator2>
4021             inline _ForwardIterator1
4022             search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4023             _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4024             {
4025             // concept requirements
4026             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4027             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4028             __glibcxx_function_requires(_EqualOpConcept<
4029             typename iterator_traits<_ForwardIterator1>::value_type,
4030             typename iterator_traits<_ForwardIterator2>::value_type>)
4031             __glibcxx_requires_valid_range(__first1, __last1);
4032             __glibcxx_requires_valid_range(__first2, __last2);
4033              
4034             return std::__search(__first1, __last1, __first2, __last2,
4035             __gnu_cxx::__ops::__iter_equal_to_iter());
4036             }
4037              
4038             /**
4039             * @brief Search a sequence for a matching sub-sequence using a predicate.
4040             * @ingroup non_mutating_algorithms
4041             * @param __first1 A forward iterator.
4042             * @param __last1 A forward iterator.
4043             * @param __first2 A forward iterator.
4044             * @param __last2 A forward iterator.
4045             * @param __predicate A binary predicate.
4046             * @return The first iterator @c i in the range
4047             * @p [__first1,__last1-(__last2-__first2)) such that
4048             * @p __predicate(*(i+N),*(__first2+N)) is true for each @c N in the range
4049             * @p [0,__last2-__first2), or @p __last1 if no such iterator exists.
4050             *
4051             * Searches the range @p [__first1,__last1) for a sub-sequence that
4052             * compares equal value-by-value with the sequence given by @p
4053             * [__first2,__last2), using @p __predicate to determine equality,
4054             * and returns an iterator to the first element of the
4055             * sub-sequence, or @p __last1 if no such iterator exists.
4056             *
4057             * @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2)
4058             */
4059             template<typename _ForwardIterator1, typename _ForwardIterator2,
4060             typename _BinaryPredicate>
4061             inline _ForwardIterator1
4062             search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4063             _ForwardIterator2 __first2, _ForwardIterator2 __last2,
4064             _BinaryPredicate __predicate)
4065             {
4066             // concept requirements
4067             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4068             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4069             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4070             typename iterator_traits<_ForwardIterator1>::value_type,
4071             typename iterator_traits<_ForwardIterator2>::value_type>)
4072             __glibcxx_requires_valid_range(__first1, __last1);
4073             __glibcxx_requires_valid_range(__first2, __last2);
4074              
4075             return std::__search(__first1, __last1, __first2, __last2,
4076             __gnu_cxx::__ops::__iter_comp_iter(__predicate));
4077             }
4078              
4079             /**
4080             * @brief Search a sequence for a number of consecutive values.
4081             * @ingroup non_mutating_algorithms
4082             * @param __first A forward iterator.
4083             * @param __last A forward iterator.
4084             * @param __count The number of consecutive values.
4085             * @param __val The value to find.
4086             * @return The first iterator @c i in the range @p
4087             * [__first,__last-__count) such that @c *(i+N) == @p __val for
4088             * each @c N in the range @p [0,__count), or @p __last if no such
4089             * iterator exists.
4090             *
4091             * Searches the range @p [__first,__last) for @p count consecutive elements
4092             * equal to @p __val.
4093             */
4094             template<typename _ForwardIterator, typename _Integer, typename _Tp>
4095             inline _ForwardIterator
4096             search_n(_ForwardIterator __first, _ForwardIterator __last,
4097             _Integer __count, const _Tp& __val)
4098             {
4099             // concept requirements
4100             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4101             __glibcxx_function_requires(_EqualOpConcept<
4102             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4103             __glibcxx_requires_valid_range(__first, __last);
4104              
4105             return std::__search_n(__first, __last, __count,
4106             __gnu_cxx::__ops::__iter_equals_val(__val));
4107             }
4108              
4109              
4110             /**
4111             * @brief Search a sequence for a number of consecutive values using a
4112             * predicate.
4113             * @ingroup non_mutating_algorithms
4114             * @param __first A forward iterator.
4115             * @param __last A forward iterator.
4116             * @param __count The number of consecutive values.
4117             * @param __val The value to find.
4118             * @param __binary_pred A binary predicate.
4119             * @return The first iterator @c i in the range @p
4120             * [__first,__last-__count) such that @p
4121             * __binary_pred(*(i+N),__val) is true for each @c N in the range
4122             * @p [0,__count), or @p __last if no such iterator exists.
4123             *
4124             * Searches the range @p [__first,__last) for @p __count
4125             * consecutive elements for which the predicate returns true.
4126             */
4127             template<typename _ForwardIterator, typename _Integer, typename _Tp,
4128             typename _BinaryPredicate>
4129             inline _ForwardIterator
4130             search_n(_ForwardIterator __first, _ForwardIterator __last,
4131             _Integer __count, const _Tp& __val,
4132             _BinaryPredicate __binary_pred)
4133             {
4134             // concept requirements
4135             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4136             __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4137             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4138             __glibcxx_requires_valid_range(__first, __last);
4139              
4140             return std::__search_n(__first, __last, __count,
4141             __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));
4142             }
4143              
4144              
4145             /**
4146             * @brief Perform an operation on a sequence.
4147             * @ingroup mutating_algorithms
4148             * @param __first An input iterator.
4149             * @param __last An input iterator.
4150             * @param __result An output iterator.
4151             * @param __unary_op A unary operator.
4152             * @return An output iterator equal to @p __result+(__last-__first).
4153             *
4154             * Applies the operator to each element in the input range and assigns
4155             * the results to successive elements of the output sequence.
4156             * Evaluates @p *(__result+N)=unary_op(*(__first+N)) for each @c N in the
4157             * range @p [0,__last-__first).
4158             *
4159             * @p unary_op must not alter its argument.
4160             */
4161             template<typename _InputIterator, typename _OutputIterator,
4162             typename _UnaryOperation>
4163             _OutputIterator
4164             transform(_InputIterator __first, _InputIterator __last,
4165             _OutputIterator __result, _UnaryOperation __unary_op)
4166             {
4167             // concept requirements
4168             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4169             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4170             // "the type returned by a _UnaryOperation"
4171             __typeof__(__unary_op(*__first))>)
4172             __glibcxx_requires_valid_range(__first, __last);
4173              
4174             for (; __first != __last; ++__first, ++__result)
4175             *__result = __unary_op(*__first);
4176             return __result;
4177             }
4178              
4179             /**
4180             * @brief Perform an operation on corresponding elements of two sequences.
4181             * @ingroup mutating_algorithms
4182             * @param __first1 An input iterator.
4183             * @param __last1 An input iterator.
4184             * @param __first2 An input iterator.
4185             * @param __result An output iterator.
4186             * @param __binary_op A binary operator.
4187             * @return An output iterator equal to @p result+(last-first).
4188             *
4189             * Applies the operator to the corresponding elements in the two
4190             * input ranges and assigns the results to successive elements of the
4191             * output sequence.
4192             * Evaluates @p
4193             * *(__result+N)=__binary_op(*(__first1+N),*(__first2+N)) for each
4194             * @c N in the range @p [0,__last1-__first1).
4195             *
4196             * @p binary_op must not alter either of its arguments.
4197             */
4198             template<typename _InputIterator1, typename _InputIterator2,
4199             typename _OutputIterator, typename _BinaryOperation>
4200             _OutputIterator
4201             transform(_InputIterator1 __first1, _InputIterator1 __last1,
4202             _InputIterator2 __first2, _OutputIterator __result,
4203             _BinaryOperation __binary_op)
4204             {
4205             // concept requirements
4206             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4207             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4208             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4209             // "the type returned by a _BinaryOperation"
4210             __typeof__(__binary_op(*__first1,*__first2))>)
4211             __glibcxx_requires_valid_range(__first1, __last1);
4212              
4213             for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
4214             *__result = __binary_op(*__first1, *__first2);
4215             return __result;
4216             }
4217              
4218             /**
4219             * @brief Replace each occurrence of one value in a sequence with another
4220             * value.
4221             * @ingroup mutating_algorithms
4222             * @param __first A forward iterator.
4223             * @param __last A forward iterator.
4224             * @param __old_value The value to be replaced.
4225             * @param __new_value The replacement value.
4226             * @return replace() returns no value.
4227             *
4228             * For each iterator @c i in the range @p [__first,__last) if @c *i ==
4229             * @p __old_value then the assignment @c *i = @p __new_value is performed.
4230             */
4231             template<typename _ForwardIterator, typename _Tp>
4232             void
4233             replace(_ForwardIterator __first, _ForwardIterator __last,
4234             const _Tp& __old_value, const _Tp& __new_value)
4235             {
4236             // concept requirements
4237             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4238             _ForwardIterator>)
4239             __glibcxx_function_requires(_EqualOpConcept<
4240             typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4241             __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4242             typename iterator_traits<_ForwardIterator>::value_type>)
4243             __glibcxx_requires_valid_range(__first, __last);
4244              
4245             for (; __first != __last; ++__first)
4246             if (*__first == __old_value)
4247             *__first = __new_value;
4248             }
4249              
4250             /**
4251             * @brief Replace each value in a sequence for which a predicate returns
4252             * true with another value.
4253             * @ingroup mutating_algorithms
4254             * @param __first A forward iterator.
4255             * @param __last A forward iterator.
4256             * @param __pred A predicate.
4257             * @param __new_value The replacement value.
4258             * @return replace_if() returns no value.
4259             *
4260             * For each iterator @c i in the range @p [__first,__last) if @p __pred(*i)
4261             * is true then the assignment @c *i = @p __new_value is performed.
4262             */
4263             template<typename _ForwardIterator, typename _Predicate, typename _Tp>
4264             void
4265             replace_if(_ForwardIterator __first, _ForwardIterator __last,
4266             _Predicate __pred, const _Tp& __new_value)
4267             {
4268             // concept requirements
4269             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4270             _ForwardIterator>)
4271             __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4272             typename iterator_traits<_ForwardIterator>::value_type>)
4273             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4274             typename iterator_traits<_ForwardIterator>::value_type>)
4275             __glibcxx_requires_valid_range(__first, __last);
4276              
4277             for (; __first != __last; ++__first)
4278             if (__pred(*__first))
4279             *__first = __new_value;
4280             }
4281              
4282             /**
4283             * @brief Assign the result of a function object to each value in a
4284             * sequence.
4285             * @ingroup mutating_algorithms
4286             * @param __first A forward iterator.
4287             * @param __last A forward iterator.
4288             * @param __gen A function object taking no arguments and returning
4289             * std::iterator_traits<_ForwardIterator>::value_type
4290             * @return generate() returns no value.
4291             *
4292             * Performs the assignment @c *i = @p __gen() for each @c i in the range
4293             * @p [__first,__last).
4294             */
4295             template<typename _ForwardIterator, typename _Generator>
4296             void
4297             generate(_ForwardIterator __first, _ForwardIterator __last,
4298             _Generator __gen)
4299             {
4300             // concept requirements
4301             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4302             __glibcxx_function_requires(_GeneratorConcept<_Generator,
4303             typename iterator_traits<_ForwardIterator>::value_type>)
4304             __glibcxx_requires_valid_range(__first, __last);
4305              
4306             for (; __first != __last; ++__first)
4307             *__first = __gen();
4308             }
4309              
4310             /**
4311             * @brief Assign the result of a function object to each value in a
4312             * sequence.
4313             * @ingroup mutating_algorithms
4314             * @param __first A forward iterator.
4315             * @param __n The length of the sequence.
4316             * @param __gen A function object taking no arguments and returning
4317             * std::iterator_traits<_ForwardIterator>::value_type
4318             * @return The end of the sequence, @p __first+__n
4319             *
4320             * Performs the assignment @c *i = @p __gen() for each @c i in the range
4321             * @p [__first,__first+__n).
4322             *
4323             * _GLIBCXX_RESOLVE_LIB_DEFECTS
4324             * DR 865. More algorithms that throw away information
4325             */
4326             template<typename _OutputIterator, typename _Size, typename _Generator>
4327             _OutputIterator
4328             generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4329             {
4330             // concept requirements
4331             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4332             // "the type returned by a _Generator"
4333             __typeof__(__gen())>)
4334              
4335             for (__decltype(__n + 0) __niter = __n;
4336             __niter > 0; --__niter, ++__first)
4337             *__first = __gen();
4338             return __first;
4339             }
4340              
4341             /**
4342             * @brief Copy a sequence, removing consecutive duplicate values.
4343             * @ingroup mutating_algorithms
4344             * @param __first An input iterator.
4345             * @param __last An input iterator.
4346             * @param __result An output iterator.
4347             * @return An iterator designating the end of the resulting sequence.
4348             *
4349             * Copies each element in the range @p [__first,__last) to the range
4350             * beginning at @p __result, except that only the first element is copied
4351             * from groups of consecutive elements that compare equal.
4352             * unique_copy() is stable, so the relative order of elements that are
4353             * copied is unchanged.
4354             *
4355             * _GLIBCXX_RESOLVE_LIB_DEFECTS
4356             * DR 241. Does unique_copy() require CopyConstructible and Assignable?
4357             *
4358             * _GLIBCXX_RESOLVE_LIB_DEFECTS
4359             * DR 538. 241 again: Does unique_copy() require CopyConstructible and
4360             * Assignable?
4361             */
4362             template<typename _InputIterator, typename _OutputIterator>
4363             inline _OutputIterator
4364             unique_copy(_InputIterator __first, _InputIterator __last,
4365             _OutputIterator __result)
4366             {
4367             // concept requirements
4368             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4369             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4370             typename iterator_traits<_InputIterator>::value_type>)
4371             __glibcxx_function_requires(_EqualityComparableConcept<
4372             typename iterator_traits<_InputIterator>::value_type>)
4373             __glibcxx_requires_valid_range(__first, __last);
4374              
4375             if (__first == __last)
4376             return __result;
4377             return std::__unique_copy(__first, __last, __result,
4378             __gnu_cxx::__ops::__iter_equal_to_iter(),
4379             std::__iterator_category(__first),
4380             std::__iterator_category(__result));
4381             }
4382              
4383             /**
4384             * @brief Copy a sequence, removing consecutive values using a predicate.
4385             * @ingroup mutating_algorithms
4386             * @param __first An input iterator.
4387             * @param __last An input iterator.
4388             * @param __result An output iterator.
4389             * @param __binary_pred A binary predicate.
4390             * @return An iterator designating the end of the resulting sequence.
4391             *
4392             * Copies each element in the range @p [__first,__last) to the range
4393             * beginning at @p __result, except that only the first element is copied
4394             * from groups of consecutive elements for which @p __binary_pred returns
4395             * true.
4396             * unique_copy() is stable, so the relative order of elements that are
4397             * copied is unchanged.
4398             *
4399             * _GLIBCXX_RESOLVE_LIB_DEFECTS
4400             * DR 241. Does unique_copy() require CopyConstructible and Assignable?
4401             */
4402             template<typename _InputIterator, typename _OutputIterator,
4403             typename _BinaryPredicate>
4404             inline _OutputIterator
4405             unique_copy(_InputIterator __first, _InputIterator __last,
4406             _OutputIterator __result,
4407             _BinaryPredicate __binary_pred)
4408             {
4409             // concept requirements -- predicates checked later
4410             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4411             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4412             typename iterator_traits<_InputIterator>::value_type>)
4413             __glibcxx_requires_valid_range(__first, __last);
4414              
4415             if (__first == __last)
4416             return __result;
4417             return std::__unique_copy(__first, __last, __result,
4418             __gnu_cxx::__ops::__iter_comp_iter(__binary_pred),
4419             std::__iterator_category(__first),
4420             std::__iterator_category(__result));
4421             }
4422              
4423             /**
4424             * @brief Randomly shuffle the elements of a sequence.
4425             * @ingroup mutating_algorithms
4426             * @param __first A forward iterator.
4427             * @param __last A forward iterator.
4428             * @return Nothing.
4429             *
4430             * Reorder the elements in the range @p [__first,__last) using a random
4431             * distribution, so that every possible ordering of the sequence is
4432             * equally likely.
4433             */
4434             template<typename _RandomAccessIterator>
4435             inline void
4436             random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4437             {
4438             // concept requirements
4439             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4440             _RandomAccessIterator>)
4441             __glibcxx_requires_valid_range(__first, __last);
4442              
4443             if (__first != __last)
4444             for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4445             {
4446             // XXX rand() % N is not uniformly distributed
4447             _RandomAccessIterator __j = __first
4448             + std::rand() % ((__i - __first) + 1);
4449             if (__i != __j)
4450             std::iter_swap(__i, __j);
4451             }
4452             }
4453              
4454             /**
4455             * @brief Shuffle the elements of a sequence using a random number
4456             * generator.
4457             * @ingroup mutating_algorithms
4458             * @param __first A forward iterator.
4459             * @param __last A forward iterator.
4460             * @param __rand The RNG functor or function.
4461             * @return Nothing.
4462             *
4463             * Reorders the elements in the range @p [__first,__last) using @p __rand to
4464             * provide a random distribution. Calling @p __rand(N) for a positive
4465             * integer @p N should return a randomly chosen integer from the
4466             * range [0,N).
4467             */
4468             template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
4469             void
4470             random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4471             #if __cplusplus >= 201103L
4472             _RandomNumberGenerator&& __rand)
4473             #else
4474             _RandomNumberGenerator& __rand)
4475             #endif
4476             {
4477             // concept requirements
4478             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4479             _RandomAccessIterator>)
4480             __glibcxx_requires_valid_range(__first, __last);
4481              
4482             if (__first == __last)
4483             return;
4484             for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4485             {
4486             _RandomAccessIterator __j = __first + __rand((__i - __first) + 1);
4487             if (__i != __j)
4488             std::iter_swap(__i, __j);
4489             }
4490             }
4491              
4492              
4493             /**
4494             * @brief Move elements for which a predicate is true to the beginning
4495             * of a sequence.
4496             * @ingroup mutating_algorithms
4497             * @param __first A forward iterator.
4498             * @param __last A forward iterator.
4499             * @param __pred A predicate functor.
4500             * @return An iterator @p middle such that @p __pred(i) is true for each
4501             * iterator @p i in the range @p [__first,middle) and false for each @p i
4502             * in the range @p [middle,__last).
4503             *
4504             * @p __pred must not modify its operand. @p partition() does not preserve
4505             * the relative ordering of elements in each group, use
4506             * @p stable_partition() if this is needed.
4507             */
4508             template<typename _ForwardIterator, typename _Predicate>
4509             inline _ForwardIterator
4510             partition(_ForwardIterator __first, _ForwardIterator __last,
4511             _Predicate __pred)
4512             {
4513             // concept requirements
4514             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4515             _ForwardIterator>)
4516             __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4517             typename iterator_traits<_ForwardIterator>::value_type>)
4518             __glibcxx_requires_valid_range(__first, __last);
4519              
4520             return std::__partition(__first, __last, __pred,
4521             std::__iterator_category(__first));
4522             }
4523              
4524              
4525             /**
4526             * @brief Sort the smallest elements of a sequence.
4527             * @ingroup sorting_algorithms
4528             * @param __first An iterator.
4529             * @param __middle Another iterator.
4530             * @param __last Another iterator.
4531             * @return Nothing.
4532             *
4533             * Sorts the smallest @p (__middle-__first) elements in the range
4534             * @p [first,last) and moves them to the range @p [__first,__middle). The
4535             * order of the remaining elements in the range @p [__middle,__last) is
4536             * undefined.
4537             * After the sort if @e i and @e j are iterators in the range
4538             * @p [__first,__middle) such that i precedes j and @e k is an iterator in
4539             * the range @p [__middle,__last) then *j<*i and *k<*i are both false.
4540             */
4541             template<typename _RandomAccessIterator>
4542             inline void
4543             partial_sort(_RandomAccessIterator __first,
4544             _RandomAccessIterator __middle,
4545             _RandomAccessIterator __last)
4546             {
4547             // concept requirements
4548             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4549             _RandomAccessIterator>)
4550             __glibcxx_function_requires(_LessThanComparableConcept<
4551             typename iterator_traits<_RandomAccessIterator>::value_type>)
4552             __glibcxx_requires_valid_range(__first, __middle);
4553             __glibcxx_requires_valid_range(__middle, __last);
4554              
4555             std::__partial_sort(__first, __middle, __last,
4556             __gnu_cxx::__ops::__iter_less_iter());
4557             }
4558              
4559             /**
4560             * @brief Sort the smallest elements of a sequence using a predicate
4561             * for comparison.
4562             * @ingroup sorting_algorithms
4563             * @param __first An iterator.
4564             * @param __middle Another iterator.
4565             * @param __last Another iterator.
4566             * @param __comp A comparison functor.
4567             * @return Nothing.
4568             *
4569             * Sorts the smallest @p (__middle-__first) elements in the range
4570             * @p [__first,__last) and moves them to the range @p [__first,__middle). The
4571             * order of the remaining elements in the range @p [__middle,__last) is
4572             * undefined.
4573             * After the sort if @e i and @e j are iterators in the range
4574             * @p [__first,__middle) such that i precedes j and @e k is an iterator in
4575             * the range @p [__middle,__last) then @p *__comp(j,*i) and @p __comp(*k,*i)
4576             * are both false.
4577             */
4578             template<typename _RandomAccessIterator, typename _Compare>
4579             inline void
4580             partial_sort(_RandomAccessIterator __first,
4581             _RandomAccessIterator __middle,
4582             _RandomAccessIterator __last,
4583             _Compare __comp)
4584             {
4585             // concept requirements
4586             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4587             _RandomAccessIterator>)
4588             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4589             typename iterator_traits<_RandomAccessIterator>::value_type,
4590             typename iterator_traits<_RandomAccessIterator>::value_type>)
4591             __glibcxx_requires_valid_range(__first, __middle);
4592             __glibcxx_requires_valid_range(__middle, __last);
4593              
4594             std::__partial_sort(__first, __middle, __last,
4595             __gnu_cxx::__ops::__iter_comp_iter(__comp));
4596             }
4597              
4598             /**
4599             * @brief Sort a sequence just enough to find a particular position.
4600             * @ingroup sorting_algorithms
4601             * @param __first An iterator.
4602             * @param __nth Another iterator.
4603             * @param __last Another iterator.
4604             * @return Nothing.
4605             *
4606             * Rearranges the elements in the range @p [__first,__last) so that @p *__nth
4607             * is the same element that would have been in that position had the
4608             * whole sequence been sorted. The elements either side of @p *__nth are
4609             * not completely sorted, but for any iterator @e i in the range
4610             * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
4611             * holds that *j < *i is false.
4612             */
4613             template<typename _RandomAccessIterator>
4614             inline void
4615             nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4616             _RandomAccessIterator __last)
4617             {
4618             // concept requirements
4619             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4620             _RandomAccessIterator>)
4621             __glibcxx_function_requires(_LessThanComparableConcept<
4622             typename iterator_traits<_RandomAccessIterator>::value_type>)
4623             __glibcxx_requires_valid_range(__first, __nth);
4624             __glibcxx_requires_valid_range(__nth, __last);
4625              
4626             if (__first == __last || __nth == __last)
4627             return;
4628              
4629             std::__introselect(__first, __nth, __last,
4630             std::__lg(__last - __first) * 2,
4631             __gnu_cxx::__ops::__iter_less_iter());
4632             }
4633              
4634             /**
4635             * @brief Sort a sequence just enough to find a particular position
4636             * using a predicate for comparison.
4637             * @ingroup sorting_algorithms
4638             * @param __first An iterator.
4639             * @param __nth Another iterator.
4640             * @param __last Another iterator.
4641             * @param __comp A comparison functor.
4642             * @return Nothing.
4643             *
4644             * Rearranges the elements in the range @p [__first,__last) so that @p *__nth
4645             * is the same element that would have been in that position had the
4646             * whole sequence been sorted. The elements either side of @p *__nth are
4647             * not completely sorted, but for any iterator @e i in the range
4648             * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
4649             * holds that @p __comp(*j,*i) is false.
4650             */
4651             template<typename _RandomAccessIterator, typename _Compare>
4652             inline void
4653             nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4654             _RandomAccessIterator __last, _Compare __comp)
4655             {
4656             // concept requirements
4657             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4658             _RandomAccessIterator>)
4659             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4660             typename iterator_traits<_RandomAccessIterator>::value_type,
4661             typename iterator_traits<_RandomAccessIterator>::value_type>)
4662             __glibcxx_requires_valid_range(__first, __nth);
4663             __glibcxx_requires_valid_range(__nth, __last);
4664              
4665             if (__first == __last || __nth == __last)
4666             return;
4667              
4668             std::__introselect(__first, __nth, __last,
4669             std::__lg(__last - __first) * 2,
4670             __gnu_cxx::__ops::__iter_comp_iter(__comp));
4671             }
4672              
4673             /**
4674             * @brief Sort the elements of a sequence.
4675             * @ingroup sorting_algorithms
4676             * @param __first An iterator.
4677             * @param __last Another iterator.
4678             * @return Nothing.
4679             *
4680             * Sorts the elements in the range @p [__first,__last) in ascending order,
4681             * such that for each iterator @e i in the range @p [__first,__last-1),
4682             * *(i+1)<*i is false.
4683             *
4684             * The relative ordering of equivalent elements is not preserved, use
4685             * @p stable_sort() if this is needed.
4686             */
4687             template<typename _RandomAccessIterator>
4688             inline void
4689             sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4690             {
4691             // concept requirements
4692             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4693             _RandomAccessIterator>)
4694             __glibcxx_function_requires(_LessThanComparableConcept<
4695             typename iterator_traits<_RandomAccessIterator>::value_type>)
4696             __glibcxx_requires_valid_range(__first, __last);
4697              
4698             std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
4699             }
4700              
4701             /**
4702             * @brief Sort the elements of a sequence using a predicate for comparison.
4703             * @ingroup sorting_algorithms
4704             * @param __first An iterator.
4705             * @param __last Another iterator.
4706             * @param __comp A comparison functor.
4707             * @return Nothing.
4708             *
4709             * Sorts the elements in the range @p [__first,__last) in ascending order,
4710             * such that @p __comp(*(i+1),*i) is false for every iterator @e i in the
4711             * range @p [__first,__last-1).
4712             *
4713             * The relative ordering of equivalent elements is not preserved, use
4714             * @p stable_sort() if this is needed.
4715             */
4716             template<typename _RandomAccessIterator, typename _Compare>
4717             inline void
4718             sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4719             _Compare __comp)
4720             {
4721             // concept requirements
4722             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4723             _RandomAccessIterator>)
4724             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4725             typename iterator_traits<_RandomAccessIterator>::value_type,
4726             typename iterator_traits<_RandomAccessIterator>::value_type>)
4727             __glibcxx_requires_valid_range(__first, __last);
4728              
4729             std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
4730             }
4731              
4732             template<typename _InputIterator1, typename _InputIterator2,
4733             typename _OutputIterator, typename _Compare>
4734             _OutputIterator
4735             __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4736             _InputIterator2 __first2, _InputIterator2 __last2,
4737             _OutputIterator __result, _Compare __comp)
4738             {
4739             while (__first1 != __last1 && __first2 != __last2)
4740             {
4741             if (__comp(__first2, __first1))
4742             {
4743             *__result = *__first2;
4744             ++__first2;
4745             }
4746             else
4747             {
4748             *__result = *__first1;
4749             ++__first1;
4750             }
4751             ++__result;
4752             }
4753             return std::copy(__first2, __last2,
4754             std::copy(__first1, __last1, __result));
4755             }
4756              
4757             /**
4758             * @brief Merges two sorted ranges.
4759             * @ingroup sorting_algorithms
4760             * @param __first1 An iterator.
4761             * @param __first2 Another iterator.
4762             * @param __last1 Another iterator.
4763             * @param __last2 Another iterator.
4764             * @param __result An iterator pointing to the end of the merged range.
4765             * @return An iterator pointing to the first element <em>not less
4766             * than</em> @e val.
4767             *
4768             * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
4769             * the sorted range @p [__result, __result + (__last1-__first1) +
4770             * (__last2-__first2)). Both input ranges must be sorted, and the
4771             * output range must not overlap with either of the input ranges.
4772             * The sort is @e stable, that is, for equivalent elements in the
4773             * two ranges, elements from the first range will always come
4774             * before elements from the second.
4775             */
4776             template<typename _InputIterator1, typename _InputIterator2,
4777             typename _OutputIterator>
4778             inline _OutputIterator
4779             merge(_InputIterator1 __first1, _InputIterator1 __last1,
4780             _InputIterator2 __first2, _InputIterator2 __last2,
4781             _OutputIterator __result)
4782             {
4783             // concept requirements
4784             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4785             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4786             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4787             typename iterator_traits<_InputIterator1>::value_type>)
4788             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4789             typename iterator_traits<_InputIterator2>::value_type>)
4790             __glibcxx_function_requires(_LessThanOpConcept<
4791             typename iterator_traits<_InputIterator2>::value_type,
4792             typename iterator_traits<_InputIterator1>::value_type>)
4793             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4794             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4795              
4796             return _GLIBCXX_STD_A::__merge(__first1, __last1,
4797             __first2, __last2, __result,
4798             __gnu_cxx::__ops::__iter_less_iter());
4799             }
4800              
4801             /**
4802             * @brief Merges two sorted ranges.
4803             * @ingroup sorting_algorithms
4804             * @param __first1 An iterator.
4805             * @param __first2 Another iterator.
4806             * @param __last1 Another iterator.
4807             * @param __last2 Another iterator.
4808             * @param __result An iterator pointing to the end of the merged range.
4809             * @param __comp A functor to use for comparisons.
4810             * @return An iterator pointing to the first element "not less
4811             * than" @e val.
4812             *
4813             * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
4814             * the sorted range @p [__result, __result + (__last1-__first1) +
4815             * (__last2-__first2)). Both input ranges must be sorted, and the
4816             * output range must not overlap with either of the input ranges.
4817             * The sort is @e stable, that is, for equivalent elements in the
4818             * two ranges, elements from the first range will always come
4819             * before elements from the second.
4820             *
4821             * The comparison function should have the same effects on ordering as
4822             * the function used for the initial sort.
4823             */
4824             template<typename _InputIterator1, typename _InputIterator2,
4825             typename _OutputIterator, typename _Compare>
4826             inline _OutputIterator
4827             merge(_InputIterator1 __first1, _InputIterator1 __last1,
4828             _InputIterator2 __first2, _InputIterator2 __last2,
4829             _OutputIterator __result, _Compare __comp)
4830             {
4831             // concept requirements
4832             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4833             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4834             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4835             typename iterator_traits<_InputIterator1>::value_type>)
4836             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4837             typename iterator_traits<_InputIterator2>::value_type>)
4838             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4839             typename iterator_traits<_InputIterator2>::value_type,
4840             typename iterator_traits<_InputIterator1>::value_type>)
4841             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
4842             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
4843              
4844             return _GLIBCXX_STD_A::__merge(__first1, __last1,
4845             __first2, __last2, __result,
4846             __gnu_cxx::__ops::__iter_comp_iter(__comp));
4847             }
4848              
4849             template<typename _RandomAccessIterator, typename _Compare>
4850             inline void
4851             __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4852             _Compare __comp)
4853             {
4854             typedef typename iterator_traits<_RandomAccessIterator>::value_type
4855             _ValueType;
4856             typedef typename iterator_traits<_RandomAccessIterator>::difference_type
4857             _DistanceType;
4858              
4859             typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
4860             _TmpBuf __buf(__first, __last);
4861              
4862             if (__buf.begin() == 0)
4863             std::__inplace_stable_sort(__first, __last, __comp);
4864             else
4865             std::__stable_sort_adaptive(__first, __last, __buf.begin(),
4866             _DistanceType(__buf.size()), __comp);
4867             }
4868              
4869             /**
4870             * @brief Sort the elements of a sequence, preserving the relative order
4871             * of equivalent elements.
4872             * @ingroup sorting_algorithms
4873             * @param __first An iterator.
4874             * @param __last Another iterator.
4875             * @return Nothing.
4876             *
4877             * Sorts the elements in the range @p [__first,__last) in ascending order,
4878             * such that for each iterator @p i in the range @p [__first,__last-1),
4879             * @p *(i+1)<*i is false.
4880             *
4881             * The relative ordering of equivalent elements is preserved, so any two
4882             * elements @p x and @p y in the range @p [__first,__last) such that
4883             * @p x<y is false and @p y<x is false will have the same relative
4884             * ordering after calling @p stable_sort().
4885             */
4886             template<typename _RandomAccessIterator>
4887             inline void
4888             stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4889             {
4890             // concept requirements
4891             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4892             _RandomAccessIterator>)
4893             __glibcxx_function_requires(_LessThanComparableConcept<
4894             typename iterator_traits<_RandomAccessIterator>::value_type>)
4895             __glibcxx_requires_valid_range(__first, __last);
4896              
4897             _GLIBCXX_STD_A::__stable_sort(__first, __last,
4898             __gnu_cxx::__ops::__iter_less_iter());
4899             }
4900              
4901             /**
4902             * @brief Sort the elements of a sequence using a predicate for comparison,
4903             * preserving the relative order of equivalent elements.
4904             * @ingroup sorting_algorithms
4905             * @param __first An iterator.
4906             * @param __last Another iterator.
4907             * @param __comp A comparison functor.
4908             * @return Nothing.
4909             *
4910             * Sorts the elements in the range @p [__first,__last) in ascending order,
4911             * such that for each iterator @p i in the range @p [__first,__last-1),
4912             * @p __comp(*(i+1),*i) is false.
4913             *
4914             * The relative ordering of equivalent elements is preserved, so any two
4915             * elements @p x and @p y in the range @p [__first,__last) such that
4916             * @p __comp(x,y) is false and @p __comp(y,x) is false will have the same
4917             * relative ordering after calling @p stable_sort().
4918             */
4919             template<typename _RandomAccessIterator, typename _Compare>
4920             inline void
4921             stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4922             _Compare __comp)
4923             {
4924             // concept requirements
4925             __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4926             _RandomAccessIterator>)
4927             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4928             typename iterator_traits<_RandomAccessIterator>::value_type,
4929             typename iterator_traits<_RandomAccessIterator>::value_type>)
4930             __glibcxx_requires_valid_range(__first, __last);
4931              
4932             _GLIBCXX_STD_A::__stable_sort(__first, __last,
4933             __gnu_cxx::__ops::__iter_comp_iter(__comp));
4934             }
4935              
4936             template<typename _InputIterator1, typename _InputIterator2,
4937             typename _OutputIterator,
4938             typename _Compare>
4939             _OutputIterator
4940             __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4941             _InputIterator2 __first2, _InputIterator2 __last2,
4942             _OutputIterator __result, _Compare __comp)
4943             {
4944             while (__first1 != __last1 && __first2 != __last2)
4945             {
4946             if (__comp(__first1, __first2))
4947             {
4948             *__result = *__first1;
4949             ++__first1;
4950             }
4951             else if (__comp(__first2, __first1))
4952             {
4953             *__result = *__first2;
4954             ++__first2;
4955             }
4956             else
4957             {
4958             *__result = *__first1;
4959             ++__first1;
4960             ++__first2;
4961             }
4962             ++__result;
4963             }
4964             return std::copy(__first2, __last2,
4965             std::copy(__first1, __last1, __result));
4966             }
4967              
4968             /**
4969             * @brief Return the union of two sorted ranges.
4970             * @ingroup set_algorithms
4971             * @param __first1 Start of first range.
4972             * @param __last1 End of first range.
4973             * @param __first2 Start of second range.
4974             * @param __last2 End of second range.
4975             * @return End of the output range.
4976             * @ingroup set_algorithms
4977             *
4978             * This operation iterates over both ranges, copying elements present in
4979             * each range in order to the output range. Iterators increment for each
4980             * range. When the current element of one range is less than the other,
4981             * that element is copied and the iterator advanced. If an element is
4982             * contained in both ranges, the element from the first range is copied and
4983             * both ranges advance. The output range may not overlap either input
4984             * range.
4985             */
4986             template<typename _InputIterator1, typename _InputIterator2,
4987             typename _OutputIterator>
4988             inline _OutputIterator
4989             set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4990             _InputIterator2 __first2, _InputIterator2 __last2,
4991             _OutputIterator __result)
4992             {
4993             // concept requirements
4994             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4995             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4996             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4997             typename iterator_traits<_InputIterator1>::value_type>)
4998             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4999             typename iterator_traits<_InputIterator2>::value_type>)
5000             __glibcxx_function_requires(_LessThanOpConcept<
5001             typename iterator_traits<_InputIterator1>::value_type,
5002             typename iterator_traits<_InputIterator2>::value_type>)
5003             __glibcxx_function_requires(_LessThanOpConcept<
5004             typename iterator_traits<_InputIterator2>::value_type,
5005             typename iterator_traits<_InputIterator1>::value_type>)
5006             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5007             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5008              
5009             return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5010             __first2, __last2, __result,
5011             __gnu_cxx::__ops::__iter_less_iter());
5012             }
5013              
5014             /**
5015             * @brief Return the union of two sorted ranges using a comparison functor.
5016             * @ingroup set_algorithms
5017             * @param __first1 Start of first range.
5018             * @param __last1 End of first range.
5019             * @param __first2 Start of second range.
5020             * @param __last2 End of second range.
5021             * @param __comp The comparison functor.
5022             * @return End of the output range.
5023             * @ingroup set_algorithms
5024             *
5025             * This operation iterates over both ranges, copying elements present in
5026             * each range in order to the output range. Iterators increment for each
5027             * range. When the current element of one range is less than the other
5028             * according to @p __comp, that element is copied and the iterator advanced.
5029             * If an equivalent element according to @p __comp is contained in both
5030             * ranges, the element from the first range is copied and both ranges
5031             * advance. The output range may not overlap either input range.
5032             */
5033             template<typename _InputIterator1, typename _InputIterator2,
5034             typename _OutputIterator, typename _Compare>
5035             inline _OutputIterator
5036             set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5037             _InputIterator2 __first2, _InputIterator2 __last2,
5038             _OutputIterator __result, _Compare __comp)
5039             {
5040             // concept requirements
5041             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5042             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5043             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5044             typename iterator_traits<_InputIterator1>::value_type>)
5045             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5046             typename iterator_traits<_InputIterator2>::value_type>)
5047             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5048             typename iterator_traits<_InputIterator1>::value_type,
5049             typename iterator_traits<_InputIterator2>::value_type>)
5050             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5051             typename iterator_traits<_InputIterator2>::value_type,
5052             typename iterator_traits<_InputIterator1>::value_type>)
5053             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5054             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5055              
5056             return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5057             __first2, __last2, __result,
5058             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5059             }
5060              
5061             template<typename _InputIterator1, typename _InputIterator2,
5062             typename _OutputIterator,
5063             typename _Compare>
5064             _OutputIterator
5065             __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5066             _InputIterator2 __first2, _InputIterator2 __last2,
5067             _OutputIterator __result, _Compare __comp)
5068             {
5069             while (__first1 != __last1 && __first2 != __last2)
5070             if (__comp(__first1, __first2))
5071             ++__first1;
5072             else if (__comp(__first2, __first1))
5073             ++__first2;
5074             else
5075             {
5076             *__result = *__first1;
5077             ++__first1;
5078             ++__first2;
5079             ++__result;
5080             }
5081             return __result;
5082             }
5083              
5084             /**
5085             * @brief Return the intersection of two sorted ranges.
5086             * @ingroup set_algorithms
5087             * @param __first1 Start of first range.
5088             * @param __last1 End of first range.
5089             * @param __first2 Start of second range.
5090             * @param __last2 End of second range.
5091             * @return End of the output range.
5092             * @ingroup set_algorithms
5093             *
5094             * This operation iterates over both ranges, copying elements present in
5095             * both ranges in order to the output range. Iterators increment for each
5096             * range. When the current element of one range is less than the other,
5097             * that iterator advances. If an element is contained in both ranges, the
5098             * element from the first range is copied and both ranges advance. The
5099             * output range may not overlap either input range.
5100             */
5101             template<typename _InputIterator1, typename _InputIterator2,
5102             typename _OutputIterator>
5103             inline _OutputIterator
5104             set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5105             _InputIterator2 __first2, _InputIterator2 __last2,
5106             _OutputIterator __result)
5107             {
5108             // concept requirements
5109             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5110             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5111             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5112             typename iterator_traits<_InputIterator1>::value_type>)
5113             __glibcxx_function_requires(_LessThanOpConcept<
5114             typename iterator_traits<_InputIterator1>::value_type,
5115             typename iterator_traits<_InputIterator2>::value_type>)
5116             __glibcxx_function_requires(_LessThanOpConcept<
5117             typename iterator_traits<_InputIterator2>::value_type,
5118             typename iterator_traits<_InputIterator1>::value_type>)
5119             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5120             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5121              
5122             return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5123             __first2, __last2, __result,
5124             __gnu_cxx::__ops::__iter_less_iter());
5125             }
5126              
5127             /**
5128             * @brief Return the intersection of two sorted ranges using comparison
5129             * functor.
5130             * @ingroup set_algorithms
5131             * @param __first1 Start of first range.
5132             * @param __last1 End of first range.
5133             * @param __first2 Start of second range.
5134             * @param __last2 End of second range.
5135             * @param __comp The comparison functor.
5136             * @return End of the output range.
5137             * @ingroup set_algorithms
5138             *
5139             * This operation iterates over both ranges, copying elements present in
5140             * both ranges in order to the output range. Iterators increment for each
5141             * range. When the current element of one range is less than the other
5142             * according to @p __comp, that iterator advances. If an element is
5143             * contained in both ranges according to @p __comp, the element from the
5144             * first range is copied and both ranges advance. The output range may not
5145             * overlap either input range.
5146             */
5147             template<typename _InputIterator1, typename _InputIterator2,
5148             typename _OutputIterator, typename _Compare>
5149             inline _OutputIterator
5150             set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5151             _InputIterator2 __first2, _InputIterator2 __last2,
5152             _OutputIterator __result, _Compare __comp)
5153             {
5154             // concept requirements
5155             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5156             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5157             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5158             typename iterator_traits<_InputIterator1>::value_type>)
5159             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5160             typename iterator_traits<_InputIterator1>::value_type,
5161             typename iterator_traits<_InputIterator2>::value_type>)
5162             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5163             typename iterator_traits<_InputIterator2>::value_type,
5164             typename iterator_traits<_InputIterator1>::value_type>)
5165             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5166             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5167              
5168             return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5169             __first2, __last2, __result,
5170             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5171             }
5172              
5173             template<typename _InputIterator1, typename _InputIterator2,
5174             typename _OutputIterator,
5175             typename _Compare>
5176             _OutputIterator
5177             __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5178             _InputIterator2 __first2, _InputIterator2 __last2,
5179             _OutputIterator __result, _Compare __comp)
5180             {
5181             while (__first1 != __last1 && __first2 != __last2)
5182             if (__comp(__first1, __first2))
5183             {
5184             *__result = *__first1;
5185             ++__first1;
5186             ++__result;
5187             }
5188             else if (__comp(__first2, __first1))
5189             ++__first2;
5190             else
5191             {
5192             ++__first1;
5193             ++__first2;
5194             }
5195             return std::copy(__first1, __last1, __result);
5196             }
5197              
5198             /**
5199             * @brief Return the difference of two sorted ranges.
5200             * @ingroup set_algorithms
5201             * @param __first1 Start of first range.
5202             * @param __last1 End of first range.
5203             * @param __first2 Start of second range.
5204             * @param __last2 End of second range.
5205             * @return End of the output range.
5206             * @ingroup set_algorithms
5207             *
5208             * This operation iterates over both ranges, copying elements present in
5209             * the first range but not the second in order to the output range.
5210             * Iterators increment for each range. When the current element of the
5211             * first range is less than the second, that element is copied and the
5212             * iterator advances. If the current element of the second range is less,
5213             * the iterator advances, but no element is copied. If an element is
5214             * contained in both ranges, no elements are copied and both ranges
5215             * advance. The output range may not overlap either input range.
5216             */
5217             template<typename _InputIterator1, typename _InputIterator2,
5218             typename _OutputIterator>
5219             inline _OutputIterator
5220             set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5221             _InputIterator2 __first2, _InputIterator2 __last2,
5222             _OutputIterator __result)
5223             {
5224             // concept requirements
5225             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5226             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5227             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5228             typename iterator_traits<_InputIterator1>::value_type>)
5229             __glibcxx_function_requires(_LessThanOpConcept<
5230             typename iterator_traits<_InputIterator1>::value_type,
5231             typename iterator_traits<_InputIterator2>::value_type>)
5232             __glibcxx_function_requires(_LessThanOpConcept<
5233             typename iterator_traits<_InputIterator2>::value_type,
5234             typename iterator_traits<_InputIterator1>::value_type>)
5235             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5236             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5237              
5238             return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5239             __first2, __last2, __result,
5240             __gnu_cxx::__ops::__iter_less_iter());
5241             }
5242              
5243             /**
5244             * @brief Return the difference of two sorted ranges using comparison
5245             * functor.
5246             * @ingroup set_algorithms
5247             * @param __first1 Start of first range.
5248             * @param __last1 End of first range.
5249             * @param __first2 Start of second range.
5250             * @param __last2 End of second range.
5251             * @param __comp The comparison functor.
5252             * @return End of the output range.
5253             * @ingroup set_algorithms
5254             *
5255             * This operation iterates over both ranges, copying elements present in
5256             * the first range but not the second in order to the output range.
5257             * Iterators increment for each range. When the current element of the
5258             * first range is less than the second according to @p __comp, that element
5259             * is copied and the iterator advances. If the current element of the
5260             * second range is less, no element is copied and the iterator advances.
5261             * If an element is contained in both ranges according to @p __comp, no
5262             * elements are copied and both ranges advance. The output range may not
5263             * overlap either input range.
5264             */
5265             template<typename _InputIterator1, typename _InputIterator2,
5266             typename _OutputIterator, typename _Compare>
5267             inline _OutputIterator
5268             set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5269             _InputIterator2 __first2, _InputIterator2 __last2,
5270             _OutputIterator __result, _Compare __comp)
5271             {
5272             // concept requirements
5273             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5274             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5275             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5276             typename iterator_traits<_InputIterator1>::value_type>)
5277             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5278             typename iterator_traits<_InputIterator1>::value_type,
5279             typename iterator_traits<_InputIterator2>::value_type>)
5280             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5281             typename iterator_traits<_InputIterator2>::value_type,
5282             typename iterator_traits<_InputIterator1>::value_type>)
5283             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5284             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5285              
5286             return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5287             __first2, __last2, __result,
5288             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5289             }
5290              
5291             template<typename _InputIterator1, typename _InputIterator2,
5292             typename _OutputIterator,
5293             typename _Compare>
5294             _OutputIterator
5295             __set_symmetric_difference(_InputIterator1 __first1,
5296             _InputIterator1 __last1,
5297             _InputIterator2 __first2,
5298             _InputIterator2 __last2,
5299             _OutputIterator __result,
5300             _Compare __comp)
5301             {
5302             while (__first1 != __last1 && __first2 != __last2)
5303             if (__comp(__first1, __first2))
5304             {
5305             *__result = *__first1;
5306             ++__first1;
5307             ++__result;
5308             }
5309             else if (__comp(__first2, __first1))
5310             {
5311             *__result = *__first2;
5312             ++__first2;
5313             ++__result;
5314             }
5315             else
5316             {
5317             ++__first1;
5318             ++__first2;
5319             }
5320             return std::copy(__first2, __last2,
5321             std::copy(__first1, __last1, __result));
5322             }
5323              
5324             /**
5325             * @brief Return the symmetric difference of two sorted ranges.
5326             * @ingroup set_algorithms
5327             * @param __first1 Start of first range.
5328             * @param __last1 End of first range.
5329             * @param __first2 Start of second range.
5330             * @param __last2 End of second range.
5331             * @return End of the output range.
5332             * @ingroup set_algorithms
5333             *
5334             * This operation iterates over both ranges, copying elements present in
5335             * one range but not the other in order to the output range. Iterators
5336             * increment for each range. When the current element of one range is less
5337             * than the other, that element is copied and the iterator advances. If an
5338             * element is contained in both ranges, no elements are copied and both
5339             * ranges advance. The output range may not overlap either input range.
5340             */
5341             template<typename _InputIterator1, typename _InputIterator2,
5342             typename _OutputIterator>
5343             inline _OutputIterator
5344             set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5345             _InputIterator2 __first2, _InputIterator2 __last2,
5346             _OutputIterator __result)
5347             {
5348             // concept requirements
5349             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5350             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5351             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5352             typename iterator_traits<_InputIterator1>::value_type>)
5353             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5354             typename iterator_traits<_InputIterator2>::value_type>)
5355             __glibcxx_function_requires(_LessThanOpConcept<
5356             typename iterator_traits<_InputIterator1>::value_type,
5357             typename iterator_traits<_InputIterator2>::value_type>)
5358             __glibcxx_function_requires(_LessThanOpConcept<
5359             typename iterator_traits<_InputIterator2>::value_type,
5360             typename iterator_traits<_InputIterator1>::value_type>)
5361             __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5362             __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5363              
5364             return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5365             __first2, __last2, __result,
5366             __gnu_cxx::__ops::__iter_less_iter());
5367             }
5368              
5369             /**
5370             * @brief Return the symmetric difference of two sorted ranges using
5371             * comparison functor.
5372             * @ingroup set_algorithms
5373             * @param __first1 Start of first range.
5374             * @param __last1 End of first range.
5375             * @param __first2 Start of second range.
5376             * @param __last2 End of second range.
5377             * @param __comp The comparison functor.
5378             * @return End of the output range.
5379             * @ingroup set_algorithms
5380             *
5381             * This operation iterates over both ranges, copying elements present in
5382             * one range but not the other in order to the output range. Iterators
5383             * increment for each range. When the current element of one range is less
5384             * than the other according to @p comp, that element is copied and the
5385             * iterator advances. If an element is contained in both ranges according
5386             * to @p __comp, no elements are copied and both ranges advance. The output
5387             * range may not overlap either input range.
5388             */
5389             template<typename _InputIterator1, typename _InputIterator2,
5390             typename _OutputIterator, typename _Compare>
5391             inline _OutputIterator
5392             set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5393             _InputIterator2 __first2, _InputIterator2 __last2,
5394             _OutputIterator __result,
5395             _Compare __comp)
5396             {
5397             // concept requirements
5398             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5399             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5400             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5401             typename iterator_traits<_InputIterator1>::value_type>)
5402             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5403             typename iterator_traits<_InputIterator2>::value_type>)
5404             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5405             typename iterator_traits<_InputIterator1>::value_type,
5406             typename iterator_traits<_InputIterator2>::value_type>)
5407             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5408             typename iterator_traits<_InputIterator2>::value_type,
5409             typename iterator_traits<_InputIterator1>::value_type>)
5410             __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5411             __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5412              
5413             return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5414             __first2, __last2, __result,
5415             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5416             }
5417              
5418             template<typename _ForwardIterator, typename _Compare>
5419             _GLIBCXX14_CONSTEXPR
5420             _ForwardIterator
5421             __min_element(_ForwardIterator __first, _ForwardIterator __last,
5422             _Compare __comp)
5423             {
5424             if (__first == __last)
5425             return __first;
5426             _ForwardIterator __result = __first;
5427             while (++__first != __last)
5428             if (__comp(__first, __result))
5429             __result = __first;
5430             return __result;
5431             }
5432              
5433             /**
5434             * @brief Return the minimum element in a range.
5435             * @ingroup sorting_algorithms
5436             * @param __first Start of range.
5437             * @param __last End of range.
5438             * @return Iterator referencing the first instance of the smallest value.
5439             */
5440             template<typename _ForwardIterator>
5441             _GLIBCXX14_CONSTEXPR
5442             _ForwardIterator
5443             inline min_element(_ForwardIterator __first, _ForwardIterator __last)
5444             {
5445             // concept requirements
5446             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5447             __glibcxx_function_requires(_LessThanComparableConcept<
5448             typename iterator_traits<_ForwardIterator>::value_type>)
5449             __glibcxx_requires_valid_range(__first, __last);
5450              
5451             return _GLIBCXX_STD_A::__min_element(__first, __last,
5452             __gnu_cxx::__ops::__iter_less_iter());
5453             }
5454              
5455             /**
5456             * @brief Return the minimum element in a range using comparison functor.
5457             * @ingroup sorting_algorithms
5458             * @param __first Start of range.
5459             * @param __last End of range.
5460             * @param __comp Comparison functor.
5461             * @return Iterator referencing the first instance of the smallest value
5462             * according to __comp.
5463             */
5464             template<typename _ForwardIterator, typename _Compare>
5465             _GLIBCXX14_CONSTEXPR
5466             inline _ForwardIterator
5467             min_element(_ForwardIterator __first, _ForwardIterator __last,
5468             _Compare __comp)
5469             {
5470             // concept requirements
5471             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5472             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5473             typename iterator_traits<_ForwardIterator>::value_type,
5474             typename iterator_traits<_ForwardIterator>::value_type>)
5475             __glibcxx_requires_valid_range(__first, __last);
5476              
5477             return _GLIBCXX_STD_A::__min_element(__first, __last,
5478             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5479             }
5480              
5481             template<typename _ForwardIterator, typename _Compare>
5482             _GLIBCXX14_CONSTEXPR
5483             _ForwardIterator
5484             __max_element(_ForwardIterator __first, _ForwardIterator __last,
5485             _Compare __comp)
5486             {
5487             if (__first == __last) return __first;
5488             _ForwardIterator __result = __first;
5489             while (++__first != __last)
5490             if (__comp(__result, __first))
5491             __result = __first;
5492             return __result;
5493             }
5494              
5495             /**
5496             * @brief Return the maximum element in a range.
5497             * @ingroup sorting_algorithms
5498             * @param __first Start of range.
5499             * @param __last End of range.
5500             * @return Iterator referencing the first instance of the largest value.
5501             */
5502             template<typename _ForwardIterator>
5503             _GLIBCXX14_CONSTEXPR
5504             inline _ForwardIterator
5505             max_element(_ForwardIterator __first, _ForwardIterator __last)
5506             {
5507             // concept requirements
5508             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5509             __glibcxx_function_requires(_LessThanComparableConcept<
5510             typename iterator_traits<_ForwardIterator>::value_type>)
5511             __glibcxx_requires_valid_range(__first, __last);
5512              
5513             return _GLIBCXX_STD_A::__max_element(__first, __last,
5514             __gnu_cxx::__ops::__iter_less_iter());
5515             }
5516              
5517             /**
5518             * @brief Return the maximum element in a range using comparison functor.
5519             * @ingroup sorting_algorithms
5520             * @param __first Start of range.
5521             * @param __last End of range.
5522             * @param __comp Comparison functor.
5523             * @return Iterator referencing the first instance of the largest value
5524             * according to __comp.
5525             */
5526             template<typename _ForwardIterator, typename _Compare>
5527             _GLIBCXX14_CONSTEXPR
5528             inline _ForwardIterator
5529             max_element(_ForwardIterator __first, _ForwardIterator __last,
5530             _Compare __comp)
5531             {
5532             // concept requirements
5533             __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5534             __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5535             typename iterator_traits<_ForwardIterator>::value_type,
5536             typename iterator_traits<_ForwardIterator>::value_type>)
5537             __glibcxx_requires_valid_range(__first, __last);
5538              
5539             return _GLIBCXX_STD_A::__max_element(__first, __last,
5540             __gnu_cxx::__ops::__iter_comp_iter(__comp));
5541             }
5542              
5543             _GLIBCXX_END_NAMESPACE_ALGO
5544             } // namespace std
5545              
5546             #endif /* _STL_ALGO_H */