1 // Algorithm implimentation -*- C++ -*-
3 // Copyright (C) 2001 Free Software Foundation, Inc.
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 2, or (at your option)
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.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
33 * Hewlett-Packard Company
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation. Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose. It is provided "as is" without express or implied warranty.
45 * Silicon Graphics Computer Systems, Inc.
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation. Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose. It is provided "as is" without express or implied warranty.
57 * This is an internal header file, included by other library headers.
58 * You should not attempt to use it directly.
61 #ifndef __GLIBCPP_INTERNAL_ALGO_H
62 #define __GLIBCPP_INTERNAL_ALGO_H
64 #include <bits/stl_heap.h>
66 // See concept_check.h for the __glibcpp_*_requires macros.
71 // __median (an extension, not present in the C++ standard).
73 template<typename _Tp>
75 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
77 // concept requirements
78 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
94 template<typename _Tp, typename _Compare>
96 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
98 // concept requirements
99 __glibcpp_function_requires(_BinaryFunctionConcept<_Compare, bool, _Tp, _Tp>)
100 if (__comp(__a, __b))
101 if (__comp(__b, __c))
103 else if (__comp(__a, __c))
107 else if (__comp(__a, __c))
109 else if (__comp(__b, __c))
115 // for_each. Apply a function to every element of a range.
116 template<typename _InputIter, typename _Function>
118 for_each(_InputIter __first, _InputIter __last, _Function __f)
120 // concept requirements
121 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
122 for ( ; __first != __last; ++__first)
129 template<typename _InputIter, typename _Tp>
131 find(_InputIter __first, _InputIter __last,
135 while (__first != __last && !(*__first == __val))
140 template<typename _InputIter, typename _Predicate>
142 find_if(_InputIter __first, _InputIter __last,
146 while (__first != __last && !__pred(*__first))
151 template<typename _RandomAccessIter, typename _Tp>
153 find(_RandomAccessIter __first, _RandomAccessIter __last,
155 random_access_iterator_tag)
157 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
158 = (__last - __first) >> 2;
160 for ( ; __trip_count > 0 ; --__trip_count) {
161 if (*__first == __val) return __first;
164 if (*__first == __val) return __first;
167 if (*__first == __val) return __first;
170 if (*__first == __val) return __first;
174 switch(__last - __first) {
176 if (*__first == __val) return __first;
179 if (*__first == __val) return __first;
182 if (*__first == __val) return __first;
190 template<typename _RandomAccessIter, typename _Predicate>
192 find_if(_RandomAccessIter __first, _RandomAccessIter __last,
194 random_access_iterator_tag)
196 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
197 = (__last - __first) >> 2;
199 for ( ; __trip_count > 0 ; --__trip_count) {
200 if (__pred(*__first)) return __first;
203 if (__pred(*__first)) return __first;
206 if (__pred(*__first)) return __first;
209 if (__pred(*__first)) return __first;
213 switch(__last - __first) {
215 if (__pred(*__first)) return __first;
218 if (__pred(*__first)) return __first;
221 if (__pred(*__first)) return __first;
229 template<typename _InputIter, typename _Tp>
231 find(_InputIter __first, _InputIter __last,
234 // concept requirements
235 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
236 __glibcpp_function_requires(_EqualOpConcept<
237 typename iterator_traits<_InputIter>::value_type, _Tp>)
238 return find(__first, __last, __val, __iterator_category(__first));
241 template<typename _InputIter, typename _Predicate>
243 find_if(_InputIter __first, _InputIter __last,
246 // concept requirements
247 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
248 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
249 typename iterator_traits<_InputIter>::value_type>)
250 return find_if(__first, __last, __pred, __iterator_category(__first));
255 template<typename _ForwardIter>
257 adjacent_find(_ForwardIter __first, _ForwardIter __last)
259 // concept requirements
260 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
261 __glibcpp_function_requires(_EqualityComparableConcept<
262 typename iterator_traits<_ForwardIter>::value_type>)
263 if (__first == __last)
265 _ForwardIter __next = __first;
266 while(++__next != __last) {
267 if (*__first == *__next)
274 template<typename _ForwardIter, typename _BinaryPredicate>
276 adjacent_find(_ForwardIter __first, _ForwardIter __last,
277 _BinaryPredicate __binary_pred)
279 // concept requirements
280 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
281 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
282 typename iterator_traits<_ForwardIter>::value_type,
283 typename iterator_traits<_ForwardIter>::value_type>)
284 if (__first == __last)
286 _ForwardIter __next = __first;
287 while(++__next != __last) {
288 if (__binary_pred(*__first, *__next))
295 // count and count_if.
297 template<typename _InputIter, typename _Tp>
298 typename iterator_traits<_InputIter>::difference_type
299 count(_InputIter __first, _InputIter __last, const _Tp& __value)
301 // concept requirements
302 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
303 __glibcpp_function_requires(_EqualityComparableConcept<
304 typename iterator_traits<_InputIter>::value_type >)
305 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
306 typename iterator_traits<_InputIter>::difference_type __n = 0;
307 for ( ; __first != __last; ++__first)
308 if (*__first == __value)
313 template<typename _InputIter, typename _Predicate>
314 typename iterator_traits<_InputIter>::difference_type
315 count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
317 // concept requirements
318 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
319 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
320 typename iterator_traits<_InputIter>::value_type>)
321 typename iterator_traits<_InputIter>::difference_type __n = 0;
322 for ( ; __first != __last; ++__first)
323 if (__pred(*__first))
331 template<typename _ForwardIter1, typename _ForwardIter2>
333 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
334 _ForwardIter2 __first2, _ForwardIter2 __last2)
336 // concept requirements
337 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
338 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
339 __glibcpp_function_requires(_EqualOpConcept<
340 typename iterator_traits<_ForwardIter1>::value_type,
341 typename iterator_traits<_ForwardIter2>::value_type>)
343 // Test for empty ranges
344 if (__first1 == __last1 || __first2 == __last2)
347 // Test for a pattern of length 1.
348 _ForwardIter2 __tmp(__first2);
350 if (__tmp == __last2)
351 return find(__first1, __last1, *__first2);
355 _ForwardIter2 __p1, __p;
357 __p1 = __first2; ++__p1;
359 _ForwardIter1 __current = __first1;
361 while (__first1 != __last1) {
362 __first1 = find(__first1, __last1, *__first2);
363 if (__first1 == __last1)
367 __current = __first1;
368 if (++__current == __last1)
371 while (*__current == *__p) {
372 if (++__p == __last2)
374 if (++__current == __last1)
383 template<typename _ForwardIter1, typename _ForwardIter2, typename _BinaryPred>
385 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
386 _ForwardIter2 __first2, _ForwardIter2 __last2,
387 _BinaryPred __predicate)
389 // concept requirements
390 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
391 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
392 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
393 typename iterator_traits<_ForwardIter1>::value_type,
394 typename iterator_traits<_ForwardIter2>::value_type>)
396 // Test for empty ranges
397 if (__first1 == __last1 || __first2 == __last2)
400 // Test for a pattern of length 1.
401 _ForwardIter2 __tmp(__first2);
403 if (__tmp == __last2) {
404 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
411 _ForwardIter2 __p1, __p;
413 __p1 = __first2; ++__p1;
415 _ForwardIter1 __current = __first1;
417 while (__first1 != __last1) {
418 while (__first1 != __last1) {
419 if (__predicate(*__first1, *__first2))
423 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
425 if (__first1 == __last1)
429 __current = __first1;
430 if (++__current == __last1) return __last1;
432 while (__predicate(*__current, *__p)) {
433 if (++__p == __last2)
435 if (++__current == __last1)
444 // search_n. Search for __count consecutive copies of __val.
446 template<typename _ForwardIter, typename _Integer, typename _Tp>
448 search_n(_ForwardIter __first, _ForwardIter __last,
449 _Integer __count, const _Tp& __val)
451 // concept requirements
452 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
453 __glibcpp_function_requires(_EqualityComparableConcept<
454 typename iterator_traits<_ForwardIter>::value_type>)
455 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
460 __first = find(__first, __last, __val);
461 while (__first != __last) {
462 _Integer __n = __count - 1;
463 _ForwardIter __i = __first;
465 while (__i != __last && __n != 0 && *__i == __val) {
472 __first = find(__i, __last, __val);
478 template<typename _ForwardIter, typename _Integer, typename _Tp,
479 typename _BinaryPred>
481 search_n(_ForwardIter __first, _ForwardIter __last,
482 _Integer __count, const _Tp& __val,
483 _BinaryPred __binary_pred)
485 // concept requirements
486 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
487 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
488 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
493 while (__first != __last) {
494 if (__binary_pred(*__first, __val))
498 while (__first != __last) {
499 _Integer __n = __count - 1;
500 _ForwardIter __i = __first;
502 while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
509 while (__i != __last) {
510 if (__binary_pred(*__i, __val))
523 template<typename _ForwardIter1, typename _ForwardIter2>
525 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
526 _ForwardIter2 __first2)
528 // concept requirements
529 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter1>)
530 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter2>)
531 __glibcpp_function_requires(_ConvertibleConcept<
532 typename iterator_traits<_ForwardIter1>::value_type,
533 typename iterator_traits<_ForwardIter2>::value_type>)
534 __glibcpp_function_requires(_ConvertibleConcept<
535 typename iterator_traits<_ForwardIter2>::value_type,
536 typename iterator_traits<_ForwardIter1>::value_type>)
538 for ( ; __first1 != __last1; ++__first1, ++__first2)
539 iter_swap(__first1, __first2);
545 template<typename _InputIter, typename _OutputIter, typename _UnaryOperation>
547 transform(_InputIter __first, _InputIter __last,
548 _OutputIter __result, _UnaryOperation __unary_op)
550 // concept requirements
551 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
553 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
554 // should be "the type returned by _UnaryOperation"
555 typename iterator_traits<_InputIter>::value_type>)
558 for ( ; __first != __last; ++__first, ++__result)
559 *__result = __unary_op(*__first);
563 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
564 typename _BinaryOperation>
566 transform(_InputIter1 __first1, _InputIter1 __last1,
567 _InputIter2 __first2, _OutputIter __result,
568 _BinaryOperation __binary_op)
570 // concept requirements
571 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
572 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
574 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
575 // should be "the type returned by _BinaryOperation"
576 typename iterator_traits<_InputIter1>::value_type>)
579 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
580 *__result = __binary_op(*__first1, *__first2);
584 // replace, replace_if, replace_copy, replace_copy_if
586 template<typename _ForwardIter, typename _Tp>
588 replace(_ForwardIter __first, _ForwardIter __last,
589 const _Tp& __old_value, const _Tp& __new_value)
591 // concept requirements
592 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
593 __glibcpp_function_requires(_EqualOpConcept<
594 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
595 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
596 typename iterator_traits<_ForwardIter>::value_type>)
598 for ( ; __first != __last; ++__first)
599 if (*__first == __old_value)
600 *__first = __new_value;
603 template<typename _ForwardIter, typename _Predicate, typename _Tp>
605 replace_if(_ForwardIter __first, _ForwardIter __last,
606 _Predicate __pred, const _Tp& __new_value)
608 // concept requirements
609 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
610 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
611 typename iterator_traits<_ForwardIter>::value_type>)
612 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
613 typename iterator_traits<_ForwardIter>::value_type>)
615 for ( ; __first != __last; ++__first)
616 if (__pred(*__first))
617 *__first = __new_value;
620 template<typename _InputIter, typename _OutputIter, typename _Tp>
622 replace_copy(_InputIter __first, _InputIter __last,
623 _OutputIter __result,
624 const _Tp& __old_value, const _Tp& __new_value)
626 // concept requirements
627 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
628 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
629 typename iterator_traits<_InputIter>::value_type>)
630 __glibcpp_function_requires(_EqualOpConcept<
631 typename iterator_traits<_InputIter>::value_type, _Tp>)
633 for ( ; __first != __last; ++__first, ++__result)
634 *__result = *__first == __old_value ? __new_value : *__first;
638 template<typename _InputIter, typename _OutputIter, typename _Predicate,
641 replace_copy_if(_InputIter __first, _InputIter __last,
642 _OutputIter __result,
643 _Predicate __pred, const _Tp& __new_value)
645 // concept requirements
646 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
647 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
648 typename iterator_traits<_InputIter>::value_type>)
649 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
650 typename iterator_traits<_InputIter>::value_type>)
652 for ( ; __first != __last; ++__first, ++__result)
653 *__result = __pred(*__first) ? __new_value : *__first;
657 // generate and generate_n
659 template<typename _ForwardIter, typename _Generator>
661 generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
663 // concept requirements
664 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
665 __glibcpp_function_requires(_GeneratorConcept<_Generator,
666 typename iterator_traits<_ForwardIter>::value_type>)
668 for ( ; __first != __last; ++__first)
672 template<typename _OutputIter, typename _Size, typename _Generator>
674 generate_n(_OutputIter __first, _Size __n, _Generator __gen)
677 // XXX concept requirements
678 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
679 "the return type of _Generator" ?? >)
682 for ( ; __n > 0; --__n, ++__first)
687 // remove, remove_if, remove_copy, remove_copy_if
689 template<typename _InputIter, typename _OutputIter, typename _Tp>
691 remove_copy(_InputIter __first, _InputIter __last,
692 _OutputIter __result, const _Tp& __value)
694 // concept requirements
695 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
696 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
697 typename iterator_traits<_InputIter>::value_type>)
698 __glibcpp_function_requires(_EqualOpConcept<
699 typename iterator_traits<_InputIter>::value_type, _Tp>)
701 for ( ; __first != __last; ++__first)
702 if (!(*__first == __value)) {
703 *__result = *__first;
709 template<typename _InputIter, typename _OutputIter, typename _Predicate>
711 remove_copy_if(_InputIter __first, _InputIter __last,
712 _OutputIter __result, _Predicate __pred)
714 // concept requirements
715 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
716 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
717 typename iterator_traits<_InputIter>::value_type>)
718 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
719 typename iterator_traits<_InputIter>::value_type>)
721 for ( ; __first != __last; ++__first)
722 if (!__pred(*__first)) {
723 *__result = *__first;
729 template<typename _ForwardIter, typename _Tp>
731 remove(_ForwardIter __first, _ForwardIter __last,
734 // concept requirements
735 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
736 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
737 typename iterator_traits<_ForwardIter>::value_type>)
738 __glibcpp_function_requires(_EqualOpConcept<
739 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
741 __first = find(__first, __last, __value);
742 _ForwardIter __i = __first;
743 return __first == __last ? __first
744 : remove_copy(++__i, __last, __first, __value);
747 template<typename _ForwardIter, typename _Predicate>
749 remove_if(_ForwardIter __first, _ForwardIter __last,
752 // concept requirements
753 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
754 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
755 typename iterator_traits<_ForwardIter>::value_type>)
757 __first = find_if(__first, __last, __pred);
758 _ForwardIter __i = __first;
759 return __first == __last ? __first
760 : remove_copy_if(++__i, __last, __first, __pred);
763 template<typename _InputIter, typename _OutputIter>
765 __unique_copy(_InputIter __first, _InputIter __last,
766 _OutputIter __result,
769 // concept requirements -- taken care of in dispatching function
770 typename iterator_traits<_InputIter>::value_type __value = *__first;
772 while (++__first != __last)
773 if (!(__value == *__first)) {
775 *++__result = __value;
780 template<typename _InputIter, typename _ForwardIter>
782 __unique_copy(_InputIter __first, _InputIter __last,
783 _ForwardIter __result,
784 forward_iterator_tag)
786 // concept requirements -- taken care of in dispatching function
787 *__result = *__first;
788 while (++__first != __last)
789 if (!(*__result == *__first))
790 *++__result = *__first;
794 template<typename _InputIter, typename _OutputIter>
796 unique_copy(_InputIter __first, _InputIter __last,
797 _OutputIter __result)
799 // concept requirements
800 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
801 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
802 typename iterator_traits<_InputIter>::value_type>)
803 __glibcpp_function_requires(_EqualityComparableConcept<
804 typename iterator_traits<_InputIter>::value_type>)
806 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
808 if (__first == __last) return __result;
809 return __unique_copy(__first, __last, __result, _IterType());
812 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
814 __unique_copy(_InputIter __first, _InputIter __last,
815 _OutputIter __result,
816 _BinaryPredicate __binary_pred,
819 // concept requirements -- iterators already checked
820 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
821 typename iterator_traits<_InputIter>::value_type,
822 typename iterator_traits<_InputIter>::value_type>)
824 typename iterator_traits<_InputIter>::value_type __value = *__first;
826 while (++__first != __last)
827 if (!__binary_pred(__value, *__first)) {
829 *++__result = __value;
834 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
836 __unique_copy(_InputIter __first, _InputIter __last,
837 _ForwardIter __result,
838 _BinaryPredicate __binary_pred,
839 forward_iterator_tag)
841 // concept requirements -- iterators already checked
842 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
843 typename iterator_traits<_ForwardIter>::value_type,
844 typename iterator_traits<_InputIter>::value_type>)
846 *__result = *__first;
847 while (++__first != __last)
848 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
852 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
854 unique_copy(_InputIter __first, _InputIter __last,
855 _OutputIter __result,
856 _BinaryPredicate __binary_pred)
858 // concept requirements -- predicates checked later
859 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
860 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
861 typename iterator_traits<_InputIter>::value_type>)
863 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
865 if (__first == __last) return __result;
866 return __unique_copy(__first, __last,
867 __result, __binary_pred, _IterType());
870 template<typename _ForwardIter>
872 unique(_ForwardIter __first, _ForwardIter __last)
874 // concept requirements
875 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
876 __glibcpp_function_requires(_EqualityComparableConcept<
877 typename iterator_traits<_ForwardIter>::value_type>)
879 __first = adjacent_find(__first, __last);
880 return unique_copy(__first, __last, __first);
883 template<typename _ForwardIter, typename _BinaryPredicate>
885 unique(_ForwardIter __first, _ForwardIter __last,
886 _BinaryPredicate __binary_pred)
888 // concept requirements
889 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
890 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
891 typename iterator_traits<_ForwardIter>::value_type,
892 typename iterator_traits<_ForwardIter>::value_type>)
894 __first = adjacent_find(__first, __last, __binary_pred);
895 return unique_copy(__first, __last, __first, __binary_pred);
898 template<typename _BidirectionalIter>
900 __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
901 bidirectional_iterator_tag)
904 if (__first == __last || __first == --__last)
907 iter_swap(__first++, __last);
910 template<typename _RandomAccessIter>
912 __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
913 random_access_iterator_tag)
915 while (__first < __last)
916 iter_swap(__first++, --__last);
919 template<typename _BidirectionalIter>
921 reverse(_BidirectionalIter __first, _BidirectionalIter __last)
923 // concept requirements
924 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
926 __reverse(__first, __last, __iterator_category(__first));
929 template<typename _BidirectionalIter, typename _OutputIter>
931 reverse_copy(_BidirectionalIter __first, _BidirectionalIter __last,
932 _OutputIter __result)
934 // concept requirements
935 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
936 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
937 typename iterator_traits<_BidirectionalIter>::value_type>)
939 while (__first != __last) {
947 /// This is a helper function for the rotate algorithm specialized on RAIs.
949 template<typename _EuclideanRingElement>
950 _EuclideanRingElement
951 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
954 _EuclideanRingElement __t = __m % __n;
961 template<typename _ForwardIter>
963 __rotate(_ForwardIter __first,
964 _ForwardIter __middle,
966 forward_iterator_tag)
968 if ((__first == __middle) || (__last == __middle))
971 _ForwardIter __first2 = __middle;
973 swap(*__first++, *__first2++);
974 if (__first == __middle)
976 } while (__first2 != __last);
980 while (__first2 != __last) {
981 swap(*__first++, *__first2++);
982 if (__first == __middle)
984 else if (__first2 == __last)
989 template<typename _BidirectionalIter>
991 __rotate(_BidirectionalIter __first,
992 _BidirectionalIter __middle,
993 _BidirectionalIter __last,
994 bidirectional_iterator_tag)
996 // concept requirements
997 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
1000 if ((__first == __middle) || (__last == __middle))
1003 __reverse(__first, __middle, bidirectional_iterator_tag());
1004 __reverse(__middle, __last, bidirectional_iterator_tag());
1006 while (__first != __middle && __middle != __last)
1007 swap (*__first++, *--__last);
1009 if (__first == __middle) {
1010 __reverse(__middle, __last, bidirectional_iterator_tag());
1013 __reverse(__first, __middle, bidirectional_iterator_tag());
1017 template<typename _RandomAccessIter>
1019 __rotate(_RandomAccessIter __first,
1020 _RandomAccessIter __middle,
1021 _RandomAccessIter __last,
1022 random_access_iterator_tag)
1024 // concept requirements
1025 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1028 if ((__first == __middle) || (__last == __middle))
1031 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1032 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1034 _Distance __n = __last - __first;
1035 _Distance __k = __middle - __first;
1036 _Distance __l = __n - __k;
1039 swap_ranges(__first, __middle, __middle);
1043 _Distance __d = __gcd(__n, __k);
1045 for (_Distance __i = 0; __i < __d; __i++) {
1046 _ValueType __tmp = *__first;
1047 _RandomAccessIter __p = __first;
1050 for (_Distance __j = 0; __j < __l/__d; __j++) {
1051 if (__p > __first + __l) {
1052 *__p = *(__p - __l);
1056 *__p = *(__p + __k);
1062 for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
1063 if (__p < __last - __k) {
1064 *__p = *(__p + __k);
1068 *__p = * (__p - __l);
1078 template<typename _ForwardIter>
1080 rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last)
1082 // concept requirements
1083 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1085 typedef typename iterator_traits<_ForwardIter>::iterator_category _IterType;
1086 __rotate(__first, __middle, __last, _IterType());
1089 template<typename _ForwardIter, typename _OutputIter>
1091 rotate_copy(_ForwardIter __first, _ForwardIter __middle,
1092 _ForwardIter __last, _OutputIter __result)
1094 // concept requirements
1095 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1096 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1097 typename iterator_traits<_ForwardIter>::value_type>)
1099 return copy(__first, __middle, copy(__middle, __last, __result));
1102 // Return a random number in the range [0, __n). This function encapsulates
1103 // whether we're using rand (part of the standard C library) or lrand48
1104 // (not standard, but a much better choice whenever it's available).
1105 template<typename _Distance>
1107 __random_number(_Distance __n)
1109 #ifdef _GLIBCPP_HAVE_DRAND48
1110 return lrand48() % __n;
1112 return rand() % __n;
1116 /// 25.2.11 random_shuffle().
1118 template<typename _RandomAccessIter>
1120 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last)
1122 // concept requirements
1123 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1126 if (__first == __last) return;
1127 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1128 iter_swap(__i, __first + __random_number((__i - __first) + 1));
1131 template<typename _RandomAccessIter, typename _RandomNumberGenerator>
1133 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
1134 _RandomNumberGenerator& __rand)
1136 // concept requirements
1137 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1140 if (__first == __last) return;
1141 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1142 iter_swap(__i, __first + __rand((__i - __first) + 1));
1145 // partition, stable_partition, and their auxiliary functions
1147 template<typename _ForwardIter, typename _Predicate>
1149 __partition(_ForwardIter __first, _ForwardIter __last,
1151 forward_iterator_tag)
1153 if (__first == __last) return __first;
1155 while (__pred(*__first))
1156 if (++__first == __last) return __first;
1158 _ForwardIter __next = __first;
1160 while (++__next != __last)
1161 if (__pred(*__next)) {
1162 swap(*__first, *__next);
1169 template<typename _BidirectionalIter, typename _Predicate>
1171 __partition(_BidirectionalIter __first, _BidirectionalIter __last,
1173 bidirectional_iterator_tag)
1177 if (__first == __last)
1179 else if (__pred(*__first))
1185 if (__first == __last)
1187 else if (!__pred(*__last))
1191 iter_swap(__first, __last);
1196 template<typename _ForwardIter, typename _Predicate>
1198 partition(_ForwardIter __first, _ForwardIter __last,
1201 // concept requirements
1202 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1203 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1204 typename iterator_traits<_ForwardIter>::value_type>)
1206 return __partition(__first, __last, __pred, __iterator_category(__first));
1210 template<typename _ForwardIter, typename _Predicate, typename _Distance>
1212 __inplace_stable_partition(_ForwardIter __first, _ForwardIter __last,
1213 _Predicate __pred, _Distance __len)
1216 return __pred(*__first) ? __last : __first;
1217 _ForwardIter __middle = __first;
1218 advance(__middle, __len / 2);
1219 _ForwardIter __begin = __inplace_stable_partition(__first, __middle,
1222 _ForwardIter __end = __inplace_stable_partition(__middle, __last,
1225 rotate(__begin, __middle, __end);
1226 advance(__begin, distance(__middle, __end));
1230 template<typename _ForwardIter, typename _Pointer, typename _Predicate,
1233 __stable_partition_adaptive(_ForwardIter __first, _ForwardIter __last,
1234 _Predicate __pred, _Distance __len,
1236 _Distance __buffer_size)
1238 if (__len <= __buffer_size) {
1239 _ForwardIter __result1 = __first;
1240 _Pointer __result2 = __buffer;
1241 for ( ; __first != __last ; ++__first)
1242 if (__pred(*__first)) {
1243 *__result1 = *__first;
1247 *__result2 = *__first;
1250 copy(__buffer, __result2, __result1);
1254 _ForwardIter __middle = __first;
1255 advance(__middle, __len / 2);
1256 _ForwardIter __begin = __stable_partition_adaptive(__first, __middle,
1259 __buffer, __buffer_size);
1260 _ForwardIter __end = __stable_partition_adaptive( __middle, __last,
1263 __buffer, __buffer_size);
1264 rotate(__begin, __middle, __end);
1265 advance(__begin, distance(__middle, __end));
1270 template<typename _ForwardIter, typename _Predicate>
1272 stable_partition(_ForwardIter __first, _ForwardIter __last,
1275 // concept requirements
1276 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1277 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1278 typename iterator_traits<_ForwardIter>::value_type>)
1280 if (__first == __last)
1284 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1285 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1287 _Temporary_buffer<_ForwardIter, _ValueType> __buf(__first, __last);
1288 if (__buf.size() > 0)
1289 return __stable_partition_adaptive(__first, __last, __pred,
1290 _DistanceType(__buf.requested_size()),
1291 __buf.begin(), __buf.size());
1293 return __inplace_stable_partition(__first, __last, __pred,
1294 _DistanceType(__buf.requested_size()));
1298 template<typename _RandomAccessIter, typename _Tp>
1300 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1304 while (*__first < __pivot)
1307 while (__pivot < *__last)
1309 if (!(__first < __last))
1311 iter_swap(__first, __last);
1316 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1318 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1319 _Tp __pivot, _Compare __comp)
1322 while (__comp(*__first, __pivot))
1325 while (__comp(__pivot, *__last))
1327 if (!(__first < __last))
1329 iter_swap(__first, __last);
1334 const int __stl_threshold = 16;
1336 // sort() and its auxiliary functions.
1338 template<typename _RandomAccessIter, typename _Tp>
1340 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
1342 _RandomAccessIter __next = __last;
1344 while (__val < *__next) {
1352 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1354 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, _Compare __comp)
1356 _RandomAccessIter __next = __last;
1358 while (__comp(__val, *__next)) {
1366 template<typename _RandomAccessIter>
1368 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1370 if (__first == __last) return;
1372 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1374 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1375 if (__val < *__first) {
1376 copy_backward(__first, __i, __i + 1);
1380 __unguarded_linear_insert(__i, __val);
1384 template<typename _RandomAccessIter, typename _Compare>
1386 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1389 if (__first == __last) return;
1391 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1393 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1394 if (__comp(__val, *__first)) {
1395 copy_backward(__first, __i, __i + 1);
1399 __unguarded_linear_insert(__i, __val, __comp);
1403 template<typename _RandomAccessIter>
1405 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1407 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1409 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1410 __unguarded_linear_insert(__i, _ValueType(*__i));
1413 template<typename _RandomAccessIter, typename _Compare>
1415 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1418 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1420 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1421 __unguarded_linear_insert(__i, _ValueType(*__i), __comp);
1424 template<typename _RandomAccessIter>
1426 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1428 if (__last - __first > __stl_threshold) {
1429 __insertion_sort(__first, __first + __stl_threshold);
1430 __unguarded_insertion_sort(__first + __stl_threshold, __last);
1433 __insertion_sort(__first, __last);
1436 template<typename _RandomAccessIter, typename _Compare>
1438 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1441 if (__last - __first > __stl_threshold) {
1442 __insertion_sort(__first, __first + __stl_threshold, __comp);
1443 __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
1446 __insertion_sort(__first, __last, __comp);
1449 template<typename _Size>
1454 for (__k = 0; __n != 1; __n >>= 1) ++__k;
1458 template<typename _RandomAccessIter, typename _Size>
1460 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1461 _Size __depth_limit)
1463 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1465 while (__last - __first > __stl_threshold) {
1466 if (__depth_limit == 0) {
1467 partial_sort(__first, __last, __last);
1471 _RandomAccessIter __cut =
1472 __unguarded_partition(__first, __last,
1473 _ValueType(__median(*__first,
1474 *(__first + (__last - __first)/2),
1476 __introsort_loop(__cut, __last, __depth_limit);
1481 template<typename _RandomAccessIter, typename _Size, typename _Compare>
1483 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1484 _Size __depth_limit, _Compare __comp)
1486 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1488 while (__last - __first > __stl_threshold) {
1489 if (__depth_limit == 0) {
1490 partial_sort(__first, __last, __last, __comp);
1494 _RandomAccessIter __cut =
1495 __unguarded_partition(__first, __last,
1496 _ValueType(__median(*__first,
1497 *(__first + (__last - __first)/2),
1498 *(__last - 1), __comp)),
1500 __introsort_loop(__cut, __last, __depth_limit, __comp);
1505 template<typename _RandomAccessIter>
1507 sort(_RandomAccessIter __first, _RandomAccessIter __last)
1509 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1511 // concept requirements
1512 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1514 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1516 if (__first != __last) {
1517 __introsort_loop(__first, __last, __lg(__last - __first) * 2);
1518 __final_insertion_sort(__first, __last);
1522 template<typename _RandomAccessIter, typename _Compare>
1524 sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1526 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1528 // concept requirements
1529 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1531 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _ValueType>)
1533 if (__first != __last) {
1534 __introsort_loop(__first, __last, __lg(__last - __first) * 2, __comp);
1535 __final_insertion_sort(__first, __last, __comp);
1539 // stable_sort() and its auxiliary functions.
1541 template<typename _RandomAccessIter>
1543 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1545 if (__last - __first < 15) {
1546 __insertion_sort(__first, __last);
1549 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1550 __inplace_stable_sort(__first, __middle);
1551 __inplace_stable_sort(__middle, __last);
1552 __merge_without_buffer(__first, __middle, __last,
1557 template<typename _RandomAccessIter, typename _Compare>
1559 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1562 if (__last - __first < 15) {
1563 __insertion_sort(__first, __last, __comp);
1566 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1567 __inplace_stable_sort(__first, __middle, __comp);
1568 __inplace_stable_sort(__middle, __last, __comp);
1569 __merge_without_buffer(__first, __middle, __last,
1575 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1578 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1579 _RandomAccessIter2 __result, _Distance __step_size)
1581 _Distance __two_step = 2 * __step_size;
1583 while (__last - __first >= __two_step) {
1584 __result = merge(__first, __first + __step_size,
1585 __first + __step_size, __first + __two_step,
1587 __first += __two_step;
1590 __step_size = min(_Distance(__last - __first), __step_size);
1591 merge(__first, __first + __step_size, __first + __step_size, __last,
1595 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1596 typename _Distance, typename _Compare>
1598 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1599 _RandomAccessIter2 __result, _Distance __step_size,
1602 _Distance __two_step = 2 * __step_size;
1604 while (__last - __first >= __two_step) {
1605 __result = merge(__first, __first + __step_size,
1606 __first + __step_size, __first + __two_step,
1609 __first += __two_step;
1611 __step_size = min(_Distance(__last - __first), __step_size);
1613 merge(__first, __first + __step_size,
1614 __first + __step_size, __last,
1619 const int __stl_chunk_size = 7;
1621 template<typename _RandomAccessIter, typename _Distance>
1623 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1624 _Distance __chunk_size)
1626 while (__last - __first >= __chunk_size) {
1627 __insertion_sort(__first, __first + __chunk_size);
1628 __first += __chunk_size;
1630 __insertion_sort(__first, __last);
1633 template<typename _RandomAccessIter, typename _Distance, typename _Compare>
1635 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1636 _Distance __chunk_size, _Compare __comp)
1638 while (__last - __first >= __chunk_size) {
1639 __insertion_sort(__first, __first + __chunk_size, __comp);
1640 __first += __chunk_size;
1642 __insertion_sort(__first, __last, __comp);
1645 template<typename _RandomAccessIter, typename _Pointer>
1647 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1650 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1652 _Distance __len = __last - __first;
1653 _Pointer __buffer_last = __buffer + __len;
1655 _Distance __step_size = __stl_chunk_size;
1656 __chunk_insertion_sort(__first, __last, __step_size);
1658 while (__step_size < __len) {
1659 __merge_sort_loop(__first, __last, __buffer, __step_size);
1661 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
1666 template<typename _RandomAccessIter, typename _Pointer, typename _Compare>
1668 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1669 _Pointer __buffer, _Compare __comp)
1671 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1673 _Distance __len = __last - __first;
1674 _Pointer __buffer_last = __buffer + __len;
1676 _Distance __step_size = __stl_chunk_size;
1677 __chunk_insertion_sort(__first, __last, __step_size, __comp);
1679 while (__step_size < __len) {
1680 __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
1682 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
1687 template<typename _RandomAccessIter, typename _Pointer, typename _Distance>
1689 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1690 _Pointer __buffer, _Distance __buffer_size)
1692 _Distance __len = (__last - __first + 1) / 2;
1693 _RandomAccessIter __middle = __first + __len;
1694 if (__len > __buffer_size) {
1695 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
1696 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
1699 __merge_sort_with_buffer(__first, __middle, __buffer);
1700 __merge_sort_with_buffer(__middle, __last, __buffer);
1702 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1703 _Distance(__last - __middle), __buffer, __buffer_size);
1706 template<typename _RandomAccessIter, typename _Pointer, typename _Distance,
1709 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1710 _Pointer __buffer, _Distance __buffer_size,
1713 _Distance __len = (__last - __first + 1) / 2;
1714 _RandomAccessIter __middle = __first + __len;
1715 if (__len > __buffer_size) {
1716 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
1718 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
1722 __merge_sort_with_buffer(__first, __middle, __buffer, __comp);
1723 __merge_sort_with_buffer(__middle, __last, __buffer, __comp);
1725 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1726 _Distance(__last - __middle), __buffer, __buffer_size,
1730 template<typename _RandomAccessIter>
1732 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1734 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1735 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1737 // concept requirements
1738 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1740 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1742 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1743 if (buf.begin() == 0)
1744 __inplace_stable_sort(__first, __last);
1746 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()));
1749 template<typename _RandomAccessIter, typename _Compare>
1751 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1753 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1754 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1756 // concept requirements
1757 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1759 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1760 _ValueType, _ValueType>)
1762 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1763 if (buf.begin() == 0)
1764 __inplace_stable_sort(__first, __last, __comp);
1766 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()),
1770 template<typename _RandomAccessIter>
1772 partial_sort(_RandomAccessIter __first,
1773 _RandomAccessIter __middle,
1774 _RandomAccessIter __last)
1776 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1778 // concept requirements
1779 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1781 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1783 make_heap(__first, __middle);
1784 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1785 if (*__i < *__first)
1786 __pop_heap(__first, __middle, __i, _ValueType(*__i));
1787 sort_heap(__first, __middle);
1790 template<typename _RandomAccessIter, typename _Compare>
1792 partial_sort(_RandomAccessIter __first,
1793 _RandomAccessIter __middle,
1794 _RandomAccessIter __last,
1797 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1799 // concept requirements
1800 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1802 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1803 _ValueType, _ValueType>)
1805 make_heap(__first, __middle, __comp);
1806 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1807 if (__comp(*__i, *__first))
1808 __pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
1809 sort_heap(__first, __middle, __comp);
1812 template<typename _InputIter, typename _RandomAccessIter>
1814 partial_sort_copy(_InputIter __first, _InputIter __last,
1815 _RandomAccessIter __result_first,
1816 _RandomAccessIter __result_last)
1818 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
1819 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
1820 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1822 // concept requirements
1823 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1824 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
1825 __glibcpp_function_requires(_LessThanComparableConcept<_OutputValueType>)
1826 __glibcpp_function_requires(_LessThanComparableConcept<_InputValueType>)
1828 if (__result_first == __result_last) return __result_last;
1829 _RandomAccessIter __result_real_last = __result_first;
1830 while(__first != __last && __result_real_last != __result_last) {
1831 *__result_real_last = *__first;
1832 ++__result_real_last;
1835 make_heap(__result_first, __result_real_last);
1836 while (__first != __last) {
1837 if (*__first < *__result_first)
1838 __adjust_heap(__result_first, _DistanceType(0),
1839 _DistanceType(__result_real_last - __result_first),
1840 _InputValueType(*__first));
1843 sort_heap(__result_first, __result_real_last);
1844 return __result_real_last;
1847 template<typename _InputIter, typename _RandomAccessIter, typename _Compare>
1849 partial_sort_copy(_InputIter __first, _InputIter __last,
1850 _RandomAccessIter __result_first,
1851 _RandomAccessIter __result_last,
1854 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
1855 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
1856 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1858 // concept requirements
1859 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1860 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1861 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
1862 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1863 _OutputValueType, _OutputValueType>)
1865 if (__result_first == __result_last) return __result_last;
1866 _RandomAccessIter __result_real_last = __result_first;
1867 while(__first != __last && __result_real_last != __result_last) {
1868 *__result_real_last = *__first;
1869 ++__result_real_last;
1872 make_heap(__result_first, __result_real_last, __comp);
1873 while (__first != __last) {
1874 if (__comp(*__first, *__result_first))
1875 __adjust_heap(__result_first, _DistanceType(0),
1876 _DistanceType(__result_real_last - __result_first),
1877 _InputValueType(*__first),
1881 sort_heap(__result_first, __result_real_last, __comp);
1882 return __result_real_last;
1885 template<typename _RandomAccessIter>
1887 nth_element(_RandomAccessIter __first,
1888 _RandomAccessIter __nth,
1889 _RandomAccessIter __last)
1891 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1893 // concept requirements
1894 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1895 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1897 while (__last - __first > 3) {
1898 _RandomAccessIter __cut =
1899 __unguarded_partition(__first, __last,
1900 _ValueType(__median(*__first,
1901 *(__first + (__last - __first)/2),
1908 __insertion_sort(__first, __last);
1911 template<typename _RandomAccessIter, typename _Compare>
1913 nth_element(_RandomAccessIter __first,
1914 _RandomAccessIter __nth,
1915 _RandomAccessIter __last,
1918 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1920 // concept requirements
1921 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1922 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1923 _ValueType, _ValueType>)
1925 while (__last - __first > 3) {
1926 _RandomAccessIter __cut =
1927 __unguarded_partition(__first, __last,
1928 _ValueType(__median(*__first,
1929 *(__first + (__last - __first)/2),
1938 __insertion_sort(__first, __last, __comp);
1942 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
1944 template<typename _ForwardIter, typename _Tp>
1946 lower_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
1948 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1949 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1951 // concept requirements
1952 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1953 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
1954 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
1956 _DistanceType __len = distance(__first, __last);
1957 _DistanceType __half;
1958 _ForwardIter __middle;
1961 __half = __len >> 1;
1963 advance(__middle, __half);
1964 if (*__middle < __val) {
1967 __len = __len - __half - 1;
1975 template<typename _ForwardIter, typename _Tp, typename _Compare>
1977 lower_bound(_ForwardIter __first, _ForwardIter __last,
1978 const _Tp& __val, _Compare __comp)
1980 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1981 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1983 // concept requirements
1984 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1985 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
1986 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
1988 _DistanceType __len = distance(__first, __last);
1989 _DistanceType __half;
1990 _ForwardIter __middle;
1993 __half = __len >> 1;
1995 advance(__middle, __half);
1996 if (__comp(*__middle, __val)) {
1999 __len = __len - __half - 1;
2007 template<typename _ForwardIter, typename _Tp>
2009 upper_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2011 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2012 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2014 // concept requirements
2015 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2016 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2017 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2019 _DistanceType __len = distance(__first, __last);
2020 _DistanceType __half;
2021 _ForwardIter __middle;
2024 __half = __len >> 1;
2026 advance(__middle, __half);
2027 if (__val < *__middle)
2032 __len = __len - __half - 1;
2038 template<typename _ForwardIter, typename _Tp, typename _Compare>
2040 upper_bound(_ForwardIter __first, _ForwardIter __last,
2041 const _Tp& __val, _Compare __comp)
2043 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2044 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2046 // concept requirements
2047 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2048 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2049 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2051 _DistanceType __len = distance(__first, __last);
2052 _DistanceType __half;
2053 _ForwardIter __middle;
2056 __half = __len >> 1;
2058 advance(__middle, __half);
2059 if (__comp(__val, *__middle))
2064 __len = __len - __half - 1;
2070 template<typename _ForwardIter, typename _Tp>
2071 pair<_ForwardIter, _ForwardIter>
2072 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2074 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2075 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2077 // concept requirements
2078 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2079 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2080 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2082 _DistanceType __len = distance(__first, __last);
2083 _DistanceType __half;
2084 _ForwardIter __middle, __left, __right;
2087 __half = __len >> 1;
2089 advance(__middle, __half);
2090 if (*__middle < __val) {
2093 __len = __len - __half - 1;
2095 else if (__val < *__middle)
2098 __left = lower_bound(__first, __middle, __val);
2099 advance(__first, __len);
2100 __right = upper_bound(++__middle, __first, __val);
2101 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2104 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2107 template<typename _ForwardIter, typename _Tp, typename _Compare>
2108 pair<_ForwardIter, _ForwardIter>
2109 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2112 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2113 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2115 // concept requirements
2116 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2117 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2118 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2120 _DistanceType __len = distance(__first, __last);
2121 _DistanceType __half;
2122 _ForwardIter __middle, __left, __right;
2125 __half = __len >> 1;
2127 advance(__middle, __half);
2128 if (__comp(*__middle, __val)) {
2131 __len = __len - __half - 1;
2133 else if (__comp(__val, *__middle))
2136 __left = lower_bound(__first, __middle, __val, __comp);
2137 advance(__first, __len);
2138 __right = upper_bound(++__middle, __first, __val, __comp);
2139 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2142 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2145 template<typename _ForwardIter, typename _Tp>
2147 binary_search(_ForwardIter __first, _ForwardIter __last,
2150 // concept requirements
2151 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2152 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2153 typename iterator_traits<_ForwardIter>::value_type>)
2154 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2156 _ForwardIter __i = lower_bound(__first, __last, __val);
2157 return __i != __last && !(__val < *__i);
2160 template<typename _ForwardIter, typename _Tp, typename _Compare>
2162 binary_search(_ForwardIter __first, _ForwardIter __last,
2163 const _Tp& __val, _Compare __comp)
2165 // concept requirements
2166 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2167 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2168 typename iterator_traits<_ForwardIter>::value_type>)
2169 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2171 _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
2172 return __i != __last && !__comp(__val, *__i);
2175 // merge, with and without an explicitly supplied comparison function.
2177 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2179 merge(_InputIter1 __first1, _InputIter1 __last1,
2180 _InputIter2 __first2, _InputIter2 __last2,
2181 _OutputIter __result)
2183 // concept requirements
2184 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2185 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2186 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2187 typename iterator_traits<_InputIter1>::value_type>)
2188 __glibcpp_function_requires(_SameTypeConcept<
2189 typename iterator_traits<_InputIter1>::value_type,
2190 typename iterator_traits<_InputIter2>::value_type>)
2191 __glibcpp_function_requires(_LessThanComparableConcept<
2192 typename iterator_traits<_InputIter1>::value_type>)
2194 while (__first1 != __last1 && __first2 != __last2) {
2195 if (*__first2 < *__first1) {
2196 *__result = *__first2;
2200 *__result = *__first1;
2205 return copy(__first2, __last2, copy(__first1, __last1, __result));
2208 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2211 merge(_InputIter1 __first1, _InputIter1 __last1,
2212 _InputIter2 __first2, _InputIter2 __last2,
2213 _OutputIter __result, _Compare __comp)
2215 // concept requirements
2216 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2217 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2218 __glibcpp_function_requires(_SameTypeConcept<
2219 typename iterator_traits<_InputIter1>::value_type,
2220 typename iterator_traits<_InputIter2>::value_type>)
2221 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2222 typename iterator_traits<_InputIter1>::value_type>)
2223 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2224 typename iterator_traits<_InputIter1>::value_type,
2225 typename iterator_traits<_InputIter2>::value_type>)
2227 while (__first1 != __last1 && __first2 != __last2) {
2228 if (__comp(*__first2, *__first1)) {
2229 *__result = *__first2;
2233 *__result = *__first1;
2238 return copy(__first2, __last2, copy(__first1, __last1, __result));
2241 // inplace_merge and its auxiliary functions.
2243 template<typename _BidirectionalIter, typename _Distance>
2245 __merge_without_buffer(_BidirectionalIter __first,
2246 _BidirectionalIter __middle,
2247 _BidirectionalIter __last,
2248 _Distance __len1, _Distance __len2)
2250 if (__len1 == 0 || __len2 == 0)
2252 if (__len1 + __len2 == 2) {
2253 if (*__middle < *__first)
2254 iter_swap(__first, __middle);
2257 _BidirectionalIter __first_cut = __first;
2258 _BidirectionalIter __second_cut = __middle;
2259 _Distance __len11 = 0;
2260 _Distance __len22 = 0;
2261 if (__len1 > __len2) {
2262 __len11 = __len1 / 2;
2263 advance(__first_cut, __len11);
2264 __second_cut = lower_bound(__middle, __last, *__first_cut);
2265 __len22 = distance(__middle, __second_cut);
2268 __len22 = __len2 / 2;
2269 advance(__second_cut, __len22);
2270 __first_cut = upper_bound(__first, __middle, *__second_cut);
2271 __len11 = distance(__first, __first_cut);
2273 rotate(__first_cut, __middle, __second_cut);
2274 _BidirectionalIter __new_middle = __first_cut;
2275 advance(__new_middle, distance(__middle, __second_cut));
2276 __merge_without_buffer(__first, __first_cut, __new_middle,
2278 __merge_without_buffer(__new_middle, __second_cut, __last,
2279 __len1 - __len11, __len2 - __len22);
2282 template<typename _BidirectionalIter, typename _Distance, typename _Compare>
2284 __merge_without_buffer(_BidirectionalIter __first,
2285 _BidirectionalIter __middle,
2286 _BidirectionalIter __last,
2287 _Distance __len1, _Distance __len2,
2290 if (__len1 == 0 || __len2 == 0)
2292 if (__len1 + __len2 == 2) {
2293 if (__comp(*__middle, *__first))
2294 iter_swap(__first, __middle);
2297 _BidirectionalIter __first_cut = __first;
2298 _BidirectionalIter __second_cut = __middle;
2299 _Distance __len11 = 0;
2300 _Distance __len22 = 0;
2301 if (__len1 > __len2) {
2302 __len11 = __len1 / 2;
2303 advance(__first_cut, __len11);
2304 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2305 __len22 = distance(__middle, __second_cut);
2308 __len22 = __len2 / 2;
2309 advance(__second_cut, __len22);
2310 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2311 __len11 = distance(__first, __first_cut);
2313 rotate(__first_cut, __middle, __second_cut);
2314 _BidirectionalIter __new_middle = __first_cut;
2315 advance(__new_middle, distance(__middle, __second_cut));
2316 __merge_without_buffer(__first, __first_cut, __new_middle,
2317 __len11, __len22, __comp);
2318 __merge_without_buffer(__new_middle, __second_cut, __last,
2319 __len1 - __len11, __len2 - __len22, __comp);
2322 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2325 __rotate_adaptive(_BidirectionalIter1 __first,
2326 _BidirectionalIter1 __middle,
2327 _BidirectionalIter1 __last,
2328 _Distance __len1, _Distance __len2,
2329 _BidirectionalIter2 __buffer,
2330 _Distance __buffer_size)
2332 _BidirectionalIter2 __buffer_end;
2333 if (__len1 > __len2 && __len2 <= __buffer_size) {
2334 __buffer_end = copy(__middle, __last, __buffer);
2335 copy_backward(__first, __middle, __last);
2336 return copy(__buffer, __buffer_end, __first);
2338 else if (__len1 <= __buffer_size) {
2339 __buffer_end = copy(__first, __middle, __buffer);
2340 copy(__middle, __last, __first);
2341 return copy_backward(__buffer, __buffer_end, __last);
2344 rotate(__first, __middle, __last);
2345 advance(__first, distance(__middle, __last));
2350 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2351 typename _BidirectionalIter3>
2353 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2354 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2355 _BidirectionalIter3 __result)
2357 if (__first1 == __last1)
2358 return copy_backward(__first2, __last2, __result);
2359 if (__first2 == __last2)
2360 return copy_backward(__first1, __last1, __result);
2364 if (*__last2 < *__last1) {
2365 *--__result = *__last1;
2366 if (__first1 == __last1)
2367 return copy_backward(__first2, ++__last2, __result);
2371 *--__result = *__last2;
2372 if (__first2 == __last2)
2373 return copy_backward(__first1, ++__last1, __result);
2379 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2380 typename _BidirectionalIter3, typename _Compare>
2382 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2383 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2384 _BidirectionalIter3 __result,
2387 if (__first1 == __last1)
2388 return copy_backward(__first2, __last2, __result);
2389 if (__first2 == __last2)
2390 return copy_backward(__first1, __last1, __result);
2394 if (__comp(*__last2, *__last1)) {
2395 *--__result = *__last1;
2396 if (__first1 == __last1)
2397 return copy_backward(__first2, ++__last2, __result);
2401 *--__result = *__last2;
2402 if (__first2 == __last2)
2403 return copy_backward(__first1, ++__last1, __result);
2409 template<typename _BidirectionalIter, typename _Distance, typename _Pointer>
2411 __merge_adaptive(_BidirectionalIter __first,
2412 _BidirectionalIter __middle,
2413 _BidirectionalIter __last,
2414 _Distance __len1, _Distance __len2,
2415 _Pointer __buffer, _Distance __buffer_size)
2417 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2418 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2419 merge(__buffer, __buffer_end, __middle, __last, __first);
2421 else if (__len2 <= __buffer_size) {
2422 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2423 __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
2426 _BidirectionalIter __first_cut = __first;
2427 _BidirectionalIter __second_cut = __middle;
2428 _Distance __len11 = 0;
2429 _Distance __len22 = 0;
2430 if (__len1 > __len2) {
2431 __len11 = __len1 / 2;
2432 advance(__first_cut, __len11);
2433 __second_cut = lower_bound(__middle, __last, *__first_cut);
2434 __len22 = distance(__middle, __second_cut);
2437 __len22 = __len2 / 2;
2438 advance(__second_cut, __len22);
2439 __first_cut = upper_bound(__first, __middle, *__second_cut);
2440 __len11 = distance(__first, __first_cut);
2442 _BidirectionalIter __new_middle =
2443 __rotate_adaptive(__first_cut, __middle, __second_cut,
2444 __len1 - __len11, __len22, __buffer,
2446 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2447 __len22, __buffer, __buffer_size);
2448 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2449 __len2 - __len22, __buffer, __buffer_size);
2453 template<typename _BidirectionalIter, typename _Distance, typename _Pointer,
2456 __merge_adaptive(_BidirectionalIter __first,
2457 _BidirectionalIter __middle,
2458 _BidirectionalIter __last,
2459 _Distance __len1, _Distance __len2,
2460 _Pointer __buffer, _Distance __buffer_size,
2463 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2464 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2465 merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
2467 else if (__len2 <= __buffer_size) {
2468 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2469 __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
2473 _BidirectionalIter __first_cut = __first;
2474 _BidirectionalIter __second_cut = __middle;
2475 _Distance __len11 = 0;
2476 _Distance __len22 = 0;
2477 if (__len1 > __len2) {
2478 __len11 = __len1 / 2;
2479 advance(__first_cut, __len11);
2480 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2481 __len22 = distance(__middle, __second_cut);
2484 __len22 = __len2 / 2;
2485 advance(__second_cut, __len22);
2486 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2487 __len11 = distance(__first, __first_cut);
2489 _BidirectionalIter __new_middle =
2490 __rotate_adaptive(__first_cut, __middle, __second_cut,
2491 __len1 - __len11, __len22, __buffer,
2493 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2494 __len22, __buffer, __buffer_size, __comp);
2495 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2496 __len2 - __len22, __buffer, __buffer_size, __comp);
2500 template<typename _BidirectionalIter>
2502 inplace_merge(_BidirectionalIter __first,
2503 _BidirectionalIter __middle,
2504 _BidirectionalIter __last)
2506 typedef typename iterator_traits<_BidirectionalIter>::value_type
2508 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2511 // concept requirements
2512 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2513 _BidirectionalIter>)
2514 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
2516 if (__first == __middle || __middle == __last)
2519 _DistanceType __len1 = distance(__first, __middle);
2520 _DistanceType __len2 = distance(__middle, __last);
2522 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2523 if (__buf.begin() == 0)
2524 __merge_without_buffer(__first, __middle, __last, __len1, __len2);
2526 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2527 __buf.begin(), _DistanceType(__buf.size()));
2530 template<typename _BidirectionalIter, typename _Compare>
2532 inplace_merge(_BidirectionalIter __first,
2533 _BidirectionalIter __middle,
2534 _BidirectionalIter __last,
2537 typedef typename iterator_traits<_BidirectionalIter>::value_type
2539 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2542 // concept requirements
2543 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2544 _BidirectionalIter>)
2545 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2546 _ValueType, _ValueType>)
2548 if (__first == __middle || __middle == __last)
2551 _DistanceType __len1 = distance(__first, __middle);
2552 _DistanceType __len2 = distance(__middle, __last);
2554 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2555 if (__buf.begin() == 0)
2556 __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
2558 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2559 __buf.begin(), _DistanceType(__buf.size()),
2563 // Set algorithms: includes, set_union, set_intersection, set_difference,
2564 // set_symmetric_difference. All of these algorithms have the precondition
2565 // that their input ranges are sorted and the postcondition that their output
2566 // ranges are sorted.
2568 template<typename _InputIter1, typename _InputIter2>
2570 includes(_InputIter1 __first1, _InputIter1 __last1,
2571 _InputIter2 __first2, _InputIter2 __last2)
2573 // concept requirements
2574 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2575 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2576 __glibcpp_function_requires(_SameTypeConcept<
2577 typename iterator_traits<_InputIter1>::value_type,
2578 typename iterator_traits<_InputIter2>::value_type>)
2579 __glibcpp_function_requires(_LessThanComparableConcept<
2580 typename iterator_traits<_InputIter1>::value_type>)
2582 while (__first1 != __last1 && __first2 != __last2)
2583 if (*__first2 < *__first1)
2585 else if(*__first1 < *__first2)
2588 ++__first1, ++__first2;
2590 return __first2 == __last2;
2593 template<typename _InputIter1, typename _InputIter2, typename _Compare>
2595 includes(_InputIter1 __first1, _InputIter1 __last1,
2596 _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
2598 // concept requirements
2599 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2600 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2601 __glibcpp_function_requires(_SameTypeConcept<
2602 typename iterator_traits<_InputIter1>::value_type,
2603 typename iterator_traits<_InputIter2>::value_type>)
2604 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2605 typename iterator_traits<_InputIter1>::value_type,
2606 typename iterator_traits<_InputIter2>::value_type>)
2608 while (__first1 != __last1 && __first2 != __last2)
2609 if (__comp(*__first2, *__first1))
2611 else if(__comp(*__first1, *__first2))
2614 ++__first1, ++__first2;
2616 return __first2 == __last2;
2619 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2621 set_union(_InputIter1 __first1, _InputIter1 __last1,
2622 _InputIter2 __first2, _InputIter2 __last2,
2623 _OutputIter __result)
2625 // concept requirements
2626 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2627 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2628 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2629 typename iterator_traits<_InputIter1>::value_type>)
2630 __glibcpp_function_requires(_SameTypeConcept<
2631 typename iterator_traits<_InputIter1>::value_type,
2632 typename iterator_traits<_InputIter2>::value_type>)
2633 __glibcpp_function_requires(_LessThanComparableConcept<
2634 typename iterator_traits<_InputIter1>::value_type>)
2636 while (__first1 != __last1 && __first2 != __last2) {
2637 if (*__first1 < *__first2) {
2638 *__result = *__first1;
2641 else if (*__first2 < *__first1) {
2642 *__result = *__first2;
2646 *__result = *__first1;
2652 return copy(__first2, __last2, copy(__first1, __last1, __result));
2655 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2658 set_union(_InputIter1 __first1, _InputIter1 __last1,
2659 _InputIter2 __first2, _InputIter2 __last2,
2660 _OutputIter __result, _Compare __comp)
2662 // concept requirements
2663 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2664 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2665 __glibcpp_function_requires(_SameTypeConcept<
2666 typename iterator_traits<_InputIter1>::value_type,
2667 typename iterator_traits<_InputIter2>::value_type>)
2668 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2669 typename iterator_traits<_InputIter1>::value_type>)
2670 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2671 typename iterator_traits<_InputIter1>::value_type,
2672 typename iterator_traits<_InputIter2>::value_type>)
2674 while (__first1 != __last1 && __first2 != __last2) {
2675 if (__comp(*__first1, *__first2)) {
2676 *__result = *__first1;
2679 else if (__comp(*__first2, *__first1)) {
2680 *__result = *__first2;
2684 *__result = *__first1;
2690 return copy(__first2, __last2, copy(__first1, __last1, __result));
2693 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2695 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2696 _InputIter2 __first2, _InputIter2 __last2,
2697 _OutputIter __result)
2699 // concept requirements
2700 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2701 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2702 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2703 typename iterator_traits<_InputIter1>::value_type>)
2704 __glibcpp_function_requires(_SameTypeConcept<
2705 typename iterator_traits<_InputIter1>::value_type,
2706 typename iterator_traits<_InputIter2>::value_type>)
2707 __glibcpp_function_requires(_LessThanComparableConcept<
2708 typename iterator_traits<_InputIter1>::value_type>)
2710 while (__first1 != __last1 && __first2 != __last2)
2711 if (*__first1 < *__first2)
2713 else if (*__first2 < *__first1)
2716 *__result = *__first1;
2724 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2727 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2728 _InputIter2 __first2, _InputIter2 __last2,
2729 _OutputIter __result, _Compare __comp)
2731 // concept requirements
2732 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2733 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2734 __glibcpp_function_requires(_SameTypeConcept<
2735 typename iterator_traits<_InputIter1>::value_type,
2736 typename iterator_traits<_InputIter2>::value_type>)
2737 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2738 typename iterator_traits<_InputIter1>::value_type>)
2739 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2740 typename iterator_traits<_InputIter1>::value_type,
2741 typename iterator_traits<_InputIter2>::value_type>)
2743 while (__first1 != __last1 && __first2 != __last2)
2744 if (__comp(*__first1, *__first2))
2746 else if (__comp(*__first2, *__first1))
2749 *__result = *__first1;
2757 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2759 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2760 _InputIter2 __first2, _InputIter2 __last2,
2761 _OutputIter __result)
2763 // concept requirements
2764 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2765 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2766 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2767 typename iterator_traits<_InputIter1>::value_type>)
2768 __glibcpp_function_requires(_SameTypeConcept<
2769 typename iterator_traits<_InputIter1>::value_type,
2770 typename iterator_traits<_InputIter2>::value_type>)
2771 __glibcpp_function_requires(_LessThanComparableConcept<
2772 typename iterator_traits<_InputIter1>::value_type>)
2774 while (__first1 != __last1 && __first2 != __last2)
2775 if (*__first1 < *__first2) {
2776 *__result = *__first1;
2780 else if (*__first2 < *__first1)
2786 return copy(__first1, __last1, __result);
2789 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2792 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2793 _InputIter2 __first2, _InputIter2 __last2,
2794 _OutputIter __result, _Compare __comp)
2796 // concept requirements
2797 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2798 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2799 __glibcpp_function_requires(_SameTypeConcept<
2800 typename iterator_traits<_InputIter1>::value_type,
2801 typename iterator_traits<_InputIter2>::value_type>)
2802 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2803 typename iterator_traits<_InputIter1>::value_type>)
2804 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2805 typename iterator_traits<_InputIter1>::value_type,
2806 typename iterator_traits<_InputIter2>::value_type>)
2808 while (__first1 != __last1 && __first2 != __last2)
2809 if (__comp(*__first1, *__first2)) {
2810 *__result = *__first1;
2814 else if (__comp(*__first2, *__first1))
2820 return copy(__first1, __last1, __result);
2823 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2825 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
2826 _InputIter2 __first2, _InputIter2 __last2,
2827 _OutputIter __result)
2829 // concept requirements
2830 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2831 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2832 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2833 typename iterator_traits<_InputIter1>::value_type>)
2834 __glibcpp_function_requires(_SameTypeConcept<
2835 typename iterator_traits<_InputIter1>::value_type,
2836 typename iterator_traits<_InputIter2>::value_type>)
2837 __glibcpp_function_requires(_LessThanComparableConcept<
2838 typename iterator_traits<_InputIter1>::value_type>)
2840 while (__first1 != __last1 && __first2 != __last2)
2841 if (*__first1 < *__first2) {
2842 *__result = *__first1;
2846 else if (*__first2 < *__first1) {
2847 *__result = *__first2;
2855 return copy(__first2, __last2, copy(__first1, __last1, __result));
2858 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2861 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
2862 _InputIter2 __first2, _InputIter2 __last2,
2863 _OutputIter __result,
2866 // concept requirements
2867 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2868 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2869 __glibcpp_function_requires(_SameTypeConcept<
2870 typename iterator_traits<_InputIter1>::value_type,
2871 typename iterator_traits<_InputIter2>::value_type>)
2872 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2873 typename iterator_traits<_InputIter1>::value_type>)
2874 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2875 typename iterator_traits<_InputIter1>::value_type,
2876 typename iterator_traits<_InputIter2>::value_type>)
2878 while (__first1 != __last1 && __first2 != __last2)
2879 if (__comp(*__first1, *__first2)) {
2880 *__result = *__first1;
2884 else if (__comp(*__first2, *__first1)) {
2885 *__result = *__first2;
2893 return copy(__first2, __last2, copy(__first1, __last1, __result));
2896 // min_element and max_element, with and without an explicitly supplied
2897 // comparison function.
2899 template<typename _ForwardIter>
2901 max_element(_ForwardIter __first, _ForwardIter __last)
2903 // concept requirements
2904 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2905 __glibcpp_function_requires(_LessThanComparableConcept<
2906 typename iterator_traits<_ForwardIter>::value_type>)
2908 if (__first == __last) return __first;
2909 _ForwardIter __result = __first;
2910 while (++__first != __last)
2911 if (*__result < *__first)
2916 template<typename _ForwardIter, typename _Compare>
2918 max_element(_ForwardIter __first, _ForwardIter __last,
2921 // concept requirements
2922 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2923 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2924 typename iterator_traits<_ForwardIter>::value_type,
2925 typename iterator_traits<_ForwardIter>::value_type>)
2927 if (__first == __last) return __first;
2928 _ForwardIter __result = __first;
2929 while (++__first != __last)
2930 if (__comp(*__result, *__first)) __result = __first;
2934 template<typename _ForwardIter>
2936 min_element(_ForwardIter __first, _ForwardIter __last)
2938 // concept requirements
2939 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2940 __glibcpp_function_requires(_LessThanComparableConcept<
2941 typename iterator_traits<_ForwardIter>::value_type>)
2943 if (__first == __last) return __first;
2944 _ForwardIter __result = __first;
2945 while (++__first != __last)
2946 if (*__first < *__result)
2951 template<typename _ForwardIter, typename _Compare>
2953 min_element(_ForwardIter __first, _ForwardIter __last,
2956 // concept requirements
2957 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2958 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2959 typename iterator_traits<_ForwardIter>::value_type,
2960 typename iterator_traits<_ForwardIter>::value_type>)
2962 if (__first == __last) return __first;
2963 _ForwardIter __result = __first;
2964 while (++__first != __last)
2965 if (__comp(*__first, *__result))
2970 // next_permutation and prev_permutation, with and without an explicitly
2971 // supplied comparison function.
2973 template<typename _BidirectionalIter>
2975 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
2977 // concept requirements
2978 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
2979 __glibcpp_function_requires(_LessThanComparableConcept<
2980 typename iterator_traits<_BidirectionalIter>::value_type>)
2982 if (__first == __last)
2984 _BidirectionalIter __i = __first;
2992 _BidirectionalIter __ii = __i;
2995 _BidirectionalIter __j = __last;
2996 while (!(*__i < *--__j))
2998 iter_swap(__i, __j);
2999 reverse(__ii, __last);
3002 if (__i == __first) {
3003 reverse(__first, __last);
3009 template<typename _BidirectionalIter, typename _Compare>
3011 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3014 // concept requirements
3015 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3016 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3017 typename iterator_traits<_BidirectionalIter>::value_type,
3018 typename iterator_traits<_BidirectionalIter>::value_type>)
3020 if (__first == __last)
3022 _BidirectionalIter __i = __first;
3030 _BidirectionalIter __ii = __i;
3032 if (__comp(*__i, *__ii)) {
3033 _BidirectionalIter __j = __last;
3034 while (!__comp(*__i, *--__j))
3036 iter_swap(__i, __j);
3037 reverse(__ii, __last);
3040 if (__i == __first) {
3041 reverse(__first, __last);
3047 template<typename _BidirectionalIter>
3049 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3051 // concept requirements
3052 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3053 __glibcpp_function_requires(_LessThanComparableConcept<
3054 typename iterator_traits<_BidirectionalIter>::value_type>)
3056 if (__first == __last)
3058 _BidirectionalIter __i = __first;
3066 _BidirectionalIter __ii = __i;
3069 _BidirectionalIter __j = __last;
3070 while (!(*--__j < *__i))
3072 iter_swap(__i, __j);
3073 reverse(__ii, __last);
3076 if (__i == __first) {
3077 reverse(__first, __last);
3083 template<typename _BidirectionalIter, typename _Compare>
3085 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3088 // concept requirements
3089 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3090 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3091 typename iterator_traits<_BidirectionalIter>::value_type,
3092 typename iterator_traits<_BidirectionalIter>::value_type>)
3094 if (__first == __last)
3096 _BidirectionalIter __i = __first;
3104 _BidirectionalIter __ii = __i;
3106 if (__comp(*__ii, *__i)) {
3107 _BidirectionalIter __j = __last;
3108 while (!__comp(*--__j, *__i))
3110 iter_swap(__i, __j);
3111 reverse(__ii, __last);
3114 if (__i == __first) {
3115 reverse(__first, __last);
3121 // find_first_of, with and without an explicitly supplied comparison function.
3123 template<typename _InputIter, typename _ForwardIter>
3125 find_first_of(_InputIter __first1, _InputIter __last1,
3126 _ForwardIter __first2, _ForwardIter __last2)
3128 // concept requirements
3129 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3130 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3131 __glibcpp_function_requires(_EqualOpConcept<
3132 typename iterator_traits<_InputIter>::value_type,
3133 typename iterator_traits<_ForwardIter>::value_type>)
3135 for ( ; __first1 != __last1; ++__first1)
3136 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3137 if (*__first1 == *__iter)
3142 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
3144 find_first_of(_InputIter __first1, _InputIter __last1,
3145 _ForwardIter __first2, _ForwardIter __last2,
3146 _BinaryPredicate __comp)
3148 // concept requirements
3149 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3150 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3151 __glibcpp_function_requires(_EqualOpConcept<
3152 typename iterator_traits<_InputIter>::value_type,
3153 typename iterator_traits<_ForwardIter>::value_type>)
3154 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3155 typename iterator_traits<_InputIter>::value_type,
3156 typename iterator_traits<_ForwardIter>::value_type>)
3158 for ( ; __first1 != __last1; ++__first1)
3159 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3160 if (__comp(*__first1, *__iter))
3166 // find_end, with and without an explicitly supplied comparison function.
3167 // Search [first2, last2) as a subsequence in [first1, last1), and return
3168 // the *last* possible match. Note that find_end for bidirectional iterators
3169 // is much faster than for forward iterators.
3171 // find_end for forward iterators.
3172 template<typename _ForwardIter1, typename _ForwardIter2>
3174 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3175 _ForwardIter2 __first2, _ForwardIter2 __last2,
3176 forward_iterator_tag, forward_iterator_tag)
3178 if (__first2 == __last2)
3181 _ForwardIter1 __result = __last1;
3183 _ForwardIter1 __new_result
3184 = search(__first1, __last1, __first2, __last2);
3185 if (__new_result == __last1)
3188 __result = __new_result;
3189 __first1 = __new_result;
3196 template<typename _ForwardIter1, typename _ForwardIter2,
3197 typename _BinaryPredicate>
3199 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3200 _ForwardIter2 __first2, _ForwardIter2 __last2,
3201 forward_iterator_tag, forward_iterator_tag,
3202 _BinaryPredicate __comp)
3204 if (__first2 == __last2)
3207 _ForwardIter1 __result = __last1;
3209 _ForwardIter1 __new_result
3210 = search(__first1, __last1, __first2, __last2, __comp);
3211 if (__new_result == __last1)
3214 __result = __new_result;
3215 __first1 = __new_result;
3222 // find_end for bidirectional iterators. Requires partial specialization.
3223 template<typename _BidirectionalIter1, typename _BidirectionalIter2>
3225 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3226 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3227 bidirectional_iterator_tag, bidirectional_iterator_tag)
3229 // concept requirements
3230 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3231 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3233 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3234 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3236 _RevIter1 __rlast1(__first1);
3237 _RevIter2 __rlast2(__first2);
3238 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3239 _RevIter2(__last2), __rlast2);
3241 if (__rresult == __rlast1)
3244 _BidirectionalIter1 __result = __rresult.base();
3245 advance(__result, -distance(__first2, __last2));
3250 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
3251 typename _BinaryPredicate>
3253 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3254 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3255 bidirectional_iterator_tag, bidirectional_iterator_tag,
3256 _BinaryPredicate __comp)
3258 // concept requirements
3259 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3260 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3262 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3263 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3265 _RevIter1 __rlast1(__first1);
3266 _RevIter2 __rlast2(__first2);
3267 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3268 _RevIter2(__last2), __rlast2,
3271 if (__rresult == __rlast1)
3274 _BidirectionalIter1 __result = __rresult.base();
3275 advance(__result, -distance(__first2, __last2));
3280 // Dispatching functions for find_end.
3282 template<typename _ForwardIter1, typename _ForwardIter2>
3283 inline _ForwardIter1
3284 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3285 _ForwardIter2 __first2, _ForwardIter2 __last2)
3287 // concept requirements
3288 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3289 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3290 __glibcpp_function_requires(_EqualOpConcept<
3291 typename iterator_traits<_ForwardIter1>::value_type,
3292 typename iterator_traits<_ForwardIter2>::value_type>)
3294 return __find_end(__first1, __last1, __first2, __last2,
3295 __iterator_category(__first1),
3296 __iterator_category(__first2));
3299 template<typename _ForwardIter1, typename _ForwardIter2,
3300 typename _BinaryPredicate>
3301 inline _ForwardIter1
3302 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3303 _ForwardIter2 __first2, _ForwardIter2 __last2,
3304 _BinaryPredicate __comp)
3306 // concept requirements
3307 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3308 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3309 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3310 typename iterator_traits<_ForwardIter1>::value_type,
3311 typename iterator_traits<_ForwardIter2>::value_type>)
3313 return __find_end(__first1, __last1, __first2, __last2,
3314 __iterator_category(__first1),
3315 __iterator_category(__first2),
3321 #endif /* __GLIBCPP_INTERNAL_ALGO_H */