1 // Algorithm implimentation -*- C++ -*-
3 // Copyright (C) 2001, 2002 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>
65 #include <bits/stl_tempbuf.h> // for _Temporary_buffer
67 // See concept_check.h for the __glibcpp_*_requires macros.
72 // __median (an extension, not present in the C++ standard).
74 template<typename _Tp>
76 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
78 // concept requirements
79 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
95 template<typename _Tp, typename _Compare>
97 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
99 // concept requirements
100 __glibcpp_function_requires(_BinaryFunctionConcept<_Compare, bool, _Tp, _Tp>)
101 if (__comp(__a, __b))
102 if (__comp(__b, __c))
104 else if (__comp(__a, __c))
108 else if (__comp(__a, __c))
110 else if (__comp(__b, __c))
116 // for_each. Apply a function to every element of a range.
117 template<typename _InputIter, typename _Function>
119 for_each(_InputIter __first, _InputIter __last, _Function __f)
121 // concept requirements
122 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
123 for ( ; __first != __last; ++__first)
130 template<typename _InputIter, typename _Tp>
132 find(_InputIter __first, _InputIter __last,
136 while (__first != __last && !(*__first == __val))
141 template<typename _InputIter, typename _Predicate>
143 find_if(_InputIter __first, _InputIter __last,
147 while (__first != __last && !__pred(*__first))
152 template<typename _RandomAccessIter, typename _Tp>
154 find(_RandomAccessIter __first, _RandomAccessIter __last,
156 random_access_iterator_tag)
158 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
159 = (__last - __first) >> 2;
161 for ( ; __trip_count > 0 ; --__trip_count) {
162 if (*__first == __val) return __first;
165 if (*__first == __val) return __first;
168 if (*__first == __val) return __first;
171 if (*__first == __val) return __first;
175 switch(__last - __first) {
177 if (*__first == __val) return __first;
180 if (*__first == __val) return __first;
183 if (*__first == __val) return __first;
191 template<typename _RandomAccessIter, typename _Predicate>
193 find_if(_RandomAccessIter __first, _RandomAccessIter __last,
195 random_access_iterator_tag)
197 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
198 = (__last - __first) >> 2;
200 for ( ; __trip_count > 0 ; --__trip_count) {
201 if (__pred(*__first)) return __first;
204 if (__pred(*__first)) return __first;
207 if (__pred(*__first)) return __first;
210 if (__pred(*__first)) return __first;
214 switch(__last - __first) {
216 if (__pred(*__first)) return __first;
219 if (__pred(*__first)) return __first;
222 if (__pred(*__first)) return __first;
230 template<typename _InputIter, typename _Tp>
232 find(_InputIter __first, _InputIter __last,
235 // concept requirements
236 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
237 __glibcpp_function_requires(_EqualOpConcept<
238 typename iterator_traits<_InputIter>::value_type, _Tp>)
239 return find(__first, __last, __val, __iterator_category(__first));
242 template<typename _InputIter, typename _Predicate>
244 find_if(_InputIter __first, _InputIter __last,
247 // concept requirements
248 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
249 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
250 typename iterator_traits<_InputIter>::value_type>)
251 return find_if(__first, __last, __pred, __iterator_category(__first));
256 template<typename _ForwardIter>
258 adjacent_find(_ForwardIter __first, _ForwardIter __last)
260 // concept requirements
261 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
262 __glibcpp_function_requires(_EqualityComparableConcept<
263 typename iterator_traits<_ForwardIter>::value_type>)
264 if (__first == __last)
266 _ForwardIter __next = __first;
267 while(++__next != __last) {
268 if (*__first == *__next)
275 template<typename _ForwardIter, typename _BinaryPredicate>
277 adjacent_find(_ForwardIter __first, _ForwardIter __last,
278 _BinaryPredicate __binary_pred)
280 // concept requirements
281 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
282 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
283 typename iterator_traits<_ForwardIter>::value_type,
284 typename iterator_traits<_ForwardIter>::value_type>)
285 if (__first == __last)
287 _ForwardIter __next = __first;
288 while(++__next != __last) {
289 if (__binary_pred(*__first, *__next))
296 // count and count_if.
298 template<typename _InputIter, typename _Tp>
299 typename iterator_traits<_InputIter>::difference_type
300 count(_InputIter __first, _InputIter __last, const _Tp& __value)
302 // concept requirements
303 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
304 __glibcpp_function_requires(_EqualityComparableConcept<
305 typename iterator_traits<_InputIter>::value_type >)
306 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
307 typename iterator_traits<_InputIter>::difference_type __n = 0;
308 for ( ; __first != __last; ++__first)
309 if (*__first == __value)
314 template<typename _InputIter, typename _Predicate>
315 typename iterator_traits<_InputIter>::difference_type
316 count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
318 // concept requirements
319 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
320 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
321 typename iterator_traits<_InputIter>::value_type>)
322 typename iterator_traits<_InputIter>::difference_type __n = 0;
323 for ( ; __first != __last; ++__first)
324 if (__pred(*__first))
332 template<typename _ForwardIter1, typename _ForwardIter2>
334 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
335 _ForwardIter2 __first2, _ForwardIter2 __last2)
337 // concept requirements
338 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
339 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
340 __glibcpp_function_requires(_EqualOpConcept<
341 typename iterator_traits<_ForwardIter1>::value_type,
342 typename iterator_traits<_ForwardIter2>::value_type>)
344 // Test for empty ranges
345 if (__first1 == __last1 || __first2 == __last2)
348 // Test for a pattern of length 1.
349 _ForwardIter2 __tmp(__first2);
351 if (__tmp == __last2)
352 return find(__first1, __last1, *__first2);
356 _ForwardIter2 __p1, __p;
358 __p1 = __first2; ++__p1;
360 _ForwardIter1 __current = __first1;
362 while (__first1 != __last1) {
363 __first1 = find(__first1, __last1, *__first2);
364 if (__first1 == __last1)
368 __current = __first1;
369 if (++__current == __last1)
372 while (*__current == *__p) {
373 if (++__p == __last2)
375 if (++__current == __last1)
384 template<typename _ForwardIter1, typename _ForwardIter2, typename _BinaryPred>
386 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
387 _ForwardIter2 __first2, _ForwardIter2 __last2,
388 _BinaryPred __predicate)
390 // concept requirements
391 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
392 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
393 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
394 typename iterator_traits<_ForwardIter1>::value_type,
395 typename iterator_traits<_ForwardIter2>::value_type>)
397 // Test for empty ranges
398 if (__first1 == __last1 || __first2 == __last2)
401 // Test for a pattern of length 1.
402 _ForwardIter2 __tmp(__first2);
404 if (__tmp == __last2) {
405 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
412 _ForwardIter2 __p1, __p;
414 __p1 = __first2; ++__p1;
416 _ForwardIter1 __current = __first1;
418 while (__first1 != __last1) {
419 while (__first1 != __last1) {
420 if (__predicate(*__first1, *__first2))
424 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
426 if (__first1 == __last1)
430 __current = __first1;
431 if (++__current == __last1) return __last1;
433 while (__predicate(*__current, *__p)) {
434 if (++__p == __last2)
436 if (++__current == __last1)
445 // search_n. Search for __count consecutive copies of __val.
447 template<typename _ForwardIter, typename _Integer, typename _Tp>
449 search_n(_ForwardIter __first, _ForwardIter __last,
450 _Integer __count, const _Tp& __val)
452 // concept requirements
453 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
454 __glibcpp_function_requires(_EqualityComparableConcept<
455 typename iterator_traits<_ForwardIter>::value_type>)
456 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
461 __first = find(__first, __last, __val);
462 while (__first != __last) {
463 _Integer __n = __count - 1;
464 _ForwardIter __i = __first;
466 while (__i != __last && __n != 0 && *__i == __val) {
473 __first = find(__i, __last, __val);
479 template<typename _ForwardIter, typename _Integer, typename _Tp,
480 typename _BinaryPred>
482 search_n(_ForwardIter __first, _ForwardIter __last,
483 _Integer __count, const _Tp& __val,
484 _BinaryPred __binary_pred)
486 // concept requirements
487 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
488 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
489 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
494 while (__first != __last) {
495 if (__binary_pred(*__first, __val))
499 while (__first != __last) {
500 _Integer __n = __count - 1;
501 _ForwardIter __i = __first;
503 while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
510 while (__i != __last) {
511 if (__binary_pred(*__i, __val))
524 template<typename _ForwardIter1, typename _ForwardIter2>
526 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
527 _ForwardIter2 __first2)
529 // concept requirements
530 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter1>)
531 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter2>)
532 __glibcpp_function_requires(_ConvertibleConcept<
533 typename iterator_traits<_ForwardIter1>::value_type,
534 typename iterator_traits<_ForwardIter2>::value_type>)
535 __glibcpp_function_requires(_ConvertibleConcept<
536 typename iterator_traits<_ForwardIter2>::value_type,
537 typename iterator_traits<_ForwardIter1>::value_type>)
539 for ( ; __first1 != __last1; ++__first1, ++__first2)
540 iter_swap(__first1, __first2);
546 template<typename _InputIter, typename _OutputIter, typename _UnaryOperation>
548 transform(_InputIter __first, _InputIter __last,
549 _OutputIter __result, _UnaryOperation __unary_op)
551 // concept requirements
552 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
554 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
555 // should be "the type returned by _UnaryOperation"
556 typename iterator_traits<_InputIter>::value_type>)
559 for ( ; __first != __last; ++__first, ++__result)
560 *__result = __unary_op(*__first);
564 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
565 typename _BinaryOperation>
567 transform(_InputIter1 __first1, _InputIter1 __last1,
568 _InputIter2 __first2, _OutputIter __result,
569 _BinaryOperation __binary_op)
571 // concept requirements
572 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
573 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
575 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
576 // should be "the type returned by _BinaryOperation"
577 typename iterator_traits<_InputIter1>::value_type>)
580 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
581 *__result = __binary_op(*__first1, *__first2);
585 // replace, replace_if, replace_copy, replace_copy_if
587 template<typename _ForwardIter, typename _Tp>
589 replace(_ForwardIter __first, _ForwardIter __last,
590 const _Tp& __old_value, const _Tp& __new_value)
592 // concept requirements
593 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
594 __glibcpp_function_requires(_EqualOpConcept<
595 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
596 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
597 typename iterator_traits<_ForwardIter>::value_type>)
599 for ( ; __first != __last; ++__first)
600 if (*__first == __old_value)
601 *__first = __new_value;
604 template<typename _ForwardIter, typename _Predicate, typename _Tp>
606 replace_if(_ForwardIter __first, _ForwardIter __last,
607 _Predicate __pred, const _Tp& __new_value)
609 // concept requirements
610 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
611 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
612 typename iterator_traits<_ForwardIter>::value_type>)
613 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
614 typename iterator_traits<_ForwardIter>::value_type>)
616 for ( ; __first != __last; ++__first)
617 if (__pred(*__first))
618 *__first = __new_value;
621 template<typename _InputIter, typename _OutputIter, typename _Tp>
623 replace_copy(_InputIter __first, _InputIter __last,
624 _OutputIter __result,
625 const _Tp& __old_value, const _Tp& __new_value)
627 // concept requirements
628 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
629 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
630 typename iterator_traits<_InputIter>::value_type>)
631 __glibcpp_function_requires(_EqualOpConcept<
632 typename iterator_traits<_InputIter>::value_type, _Tp>)
634 for ( ; __first != __last; ++__first, ++__result)
635 *__result = *__first == __old_value ? __new_value : *__first;
639 template<typename _InputIter, typename _OutputIter, typename _Predicate,
642 replace_copy_if(_InputIter __first, _InputIter __last,
643 _OutputIter __result,
644 _Predicate __pred, const _Tp& __new_value)
646 // concept requirements
647 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
648 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
649 typename iterator_traits<_InputIter>::value_type>)
650 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
651 typename iterator_traits<_InputIter>::value_type>)
653 for ( ; __first != __last; ++__first, ++__result)
654 *__result = __pred(*__first) ? __new_value : *__first;
658 // generate and generate_n
660 template<typename _ForwardIter, typename _Generator>
662 generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
664 // concept requirements
665 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
666 __glibcpp_function_requires(_GeneratorConcept<_Generator,
667 typename iterator_traits<_ForwardIter>::value_type>)
669 for ( ; __first != __last; ++__first)
673 template<typename _OutputIter, typename _Size, typename _Generator>
675 generate_n(_OutputIter __first, _Size __n, _Generator __gen)
678 // XXX concept requirements
679 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
680 "the return type of _Generator" ?? >)
683 for ( ; __n > 0; --__n, ++__first)
688 // remove, remove_if, remove_copy, remove_copy_if
690 template<typename _InputIter, typename _OutputIter, typename _Tp>
692 remove_copy(_InputIter __first, _InputIter __last,
693 _OutputIter __result, const _Tp& __value)
695 // concept requirements
696 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
697 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
698 typename iterator_traits<_InputIter>::value_type>)
699 __glibcpp_function_requires(_EqualOpConcept<
700 typename iterator_traits<_InputIter>::value_type, _Tp>)
702 for ( ; __first != __last; ++__first)
703 if (!(*__first == __value)) {
704 *__result = *__first;
710 template<typename _InputIter, typename _OutputIter, typename _Predicate>
712 remove_copy_if(_InputIter __first, _InputIter __last,
713 _OutputIter __result, _Predicate __pred)
715 // concept requirements
716 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
717 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
718 typename iterator_traits<_InputIter>::value_type>)
719 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
720 typename iterator_traits<_InputIter>::value_type>)
722 for ( ; __first != __last; ++__first)
723 if (!__pred(*__first)) {
724 *__result = *__first;
730 template<typename _ForwardIter, typename _Tp>
732 remove(_ForwardIter __first, _ForwardIter __last,
735 // concept requirements
736 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
737 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
738 typename iterator_traits<_ForwardIter>::value_type>)
739 __glibcpp_function_requires(_EqualOpConcept<
740 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
742 __first = find(__first, __last, __value);
743 _ForwardIter __i = __first;
744 return __first == __last ? __first
745 : remove_copy(++__i, __last, __first, __value);
748 template<typename _ForwardIter, typename _Predicate>
750 remove_if(_ForwardIter __first, _ForwardIter __last,
753 // concept requirements
754 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
755 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
756 typename iterator_traits<_ForwardIter>::value_type>)
758 __first = find_if(__first, __last, __pred);
759 _ForwardIter __i = __first;
760 return __first == __last ? __first
761 : remove_copy_if(++__i, __last, __first, __pred);
764 template<typename _InputIter, typename _OutputIter>
766 __unique_copy(_InputIter __first, _InputIter __last,
767 _OutputIter __result,
770 // concept requirements -- taken care of in dispatching function
771 typename iterator_traits<_InputIter>::value_type __value = *__first;
773 while (++__first != __last)
774 if (!(__value == *__first)) {
776 *++__result = __value;
781 template<typename _InputIter, typename _ForwardIter>
783 __unique_copy(_InputIter __first, _InputIter __last,
784 _ForwardIter __result,
785 forward_iterator_tag)
787 // concept requirements -- taken care of in dispatching function
788 *__result = *__first;
789 while (++__first != __last)
790 if (!(*__result == *__first))
791 *++__result = *__first;
795 template<typename _InputIter, typename _OutputIter>
797 unique_copy(_InputIter __first, _InputIter __last,
798 _OutputIter __result)
800 // concept requirements
801 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
802 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
803 typename iterator_traits<_InputIter>::value_type>)
804 __glibcpp_function_requires(_EqualityComparableConcept<
805 typename iterator_traits<_InputIter>::value_type>)
807 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
809 if (__first == __last) return __result;
810 return __unique_copy(__first, __last, __result, _IterType());
813 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
815 __unique_copy(_InputIter __first, _InputIter __last,
816 _OutputIter __result,
817 _BinaryPredicate __binary_pred,
820 // concept requirements -- iterators already checked
821 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
822 typename iterator_traits<_InputIter>::value_type,
823 typename iterator_traits<_InputIter>::value_type>)
825 typename iterator_traits<_InputIter>::value_type __value = *__first;
827 while (++__first != __last)
828 if (!__binary_pred(__value, *__first)) {
830 *++__result = __value;
835 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
837 __unique_copy(_InputIter __first, _InputIter __last,
838 _ForwardIter __result,
839 _BinaryPredicate __binary_pred,
840 forward_iterator_tag)
842 // concept requirements -- iterators already checked
843 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
844 typename iterator_traits<_ForwardIter>::value_type,
845 typename iterator_traits<_InputIter>::value_type>)
847 *__result = *__first;
848 while (++__first != __last)
849 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
853 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
855 unique_copy(_InputIter __first, _InputIter __last,
856 _OutputIter __result,
857 _BinaryPredicate __binary_pred)
859 // concept requirements -- predicates checked later
860 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
861 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
862 typename iterator_traits<_InputIter>::value_type>)
864 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
866 if (__first == __last) return __result;
867 return __unique_copy(__first, __last,
868 __result, __binary_pred, _IterType());
871 template<typename _ForwardIter>
873 unique(_ForwardIter __first, _ForwardIter __last)
875 // concept requirements
876 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
877 __glibcpp_function_requires(_EqualityComparableConcept<
878 typename iterator_traits<_ForwardIter>::value_type>)
880 __first = adjacent_find(__first, __last);
881 return unique_copy(__first, __last, __first);
884 template<typename _ForwardIter, typename _BinaryPredicate>
886 unique(_ForwardIter __first, _ForwardIter __last,
887 _BinaryPredicate __binary_pred)
889 // concept requirements
890 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
891 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
892 typename iterator_traits<_ForwardIter>::value_type,
893 typename iterator_traits<_ForwardIter>::value_type>)
895 __first = adjacent_find(__first, __last, __binary_pred);
896 return unique_copy(__first, __last, __first, __binary_pred);
899 template<typename _BidirectionalIter>
901 __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
902 bidirectional_iterator_tag)
905 if (__first == __last || __first == --__last)
908 iter_swap(__first++, __last);
911 template<typename _RandomAccessIter>
913 __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
914 random_access_iterator_tag)
916 while (__first < __last)
917 iter_swap(__first++, --__last);
920 template<typename _BidirectionalIter>
922 reverse(_BidirectionalIter __first, _BidirectionalIter __last)
924 // concept requirements
925 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
927 __reverse(__first, __last, __iterator_category(__first));
930 template<typename _BidirectionalIter, typename _OutputIter>
932 reverse_copy(_BidirectionalIter __first, _BidirectionalIter __last,
933 _OutputIter __result)
935 // concept requirements
936 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
937 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
938 typename iterator_traits<_BidirectionalIter>::value_type>)
940 while (__first != __last) {
948 /// This is a helper function for the rotate algorithm specialized on RAIs.
950 template<typename _EuclideanRingElement>
951 _EuclideanRingElement
952 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
955 _EuclideanRingElement __t = __m % __n;
962 template<typename _ForwardIter>
964 __rotate(_ForwardIter __first,
965 _ForwardIter __middle,
967 forward_iterator_tag)
969 if ((__first == __middle) || (__last == __middle))
972 _ForwardIter __first2 = __middle;
974 swap(*__first++, *__first2++);
975 if (__first == __middle)
977 } while (__first2 != __last);
981 while (__first2 != __last) {
982 swap(*__first++, *__first2++);
983 if (__first == __middle)
985 else if (__first2 == __last)
990 template<typename _BidirectionalIter>
992 __rotate(_BidirectionalIter __first,
993 _BidirectionalIter __middle,
994 _BidirectionalIter __last,
995 bidirectional_iterator_tag)
997 // concept requirements
998 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
1001 if ((__first == __middle) || (__last == __middle))
1004 __reverse(__first, __middle, bidirectional_iterator_tag());
1005 __reverse(__middle, __last, bidirectional_iterator_tag());
1007 while (__first != __middle && __middle != __last)
1008 swap (*__first++, *--__last);
1010 if (__first == __middle) {
1011 __reverse(__middle, __last, bidirectional_iterator_tag());
1014 __reverse(__first, __middle, bidirectional_iterator_tag());
1018 template<typename _RandomAccessIter>
1020 __rotate(_RandomAccessIter __first,
1021 _RandomAccessIter __middle,
1022 _RandomAccessIter __last,
1023 random_access_iterator_tag)
1025 // concept requirements
1026 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1029 if ((__first == __middle) || (__last == __middle))
1032 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1033 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1035 _Distance __n = __last - __first;
1036 _Distance __k = __middle - __first;
1037 _Distance __l = __n - __k;
1040 swap_ranges(__first, __middle, __middle);
1044 _Distance __d = __gcd(__n, __k);
1046 for (_Distance __i = 0; __i < __d; __i++) {
1047 _ValueType __tmp = *__first;
1048 _RandomAccessIter __p = __first;
1051 for (_Distance __j = 0; __j < __l/__d; __j++) {
1052 if (__p > __first + __l) {
1053 *__p = *(__p - __l);
1057 *__p = *(__p + __k);
1063 for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
1064 if (__p < __last - __k) {
1065 *__p = *(__p + __k);
1069 *__p = * (__p - __l);
1079 template<typename _ForwardIter>
1081 rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last)
1083 // concept requirements
1084 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1086 typedef typename iterator_traits<_ForwardIter>::iterator_category _IterType;
1087 __rotate(__first, __middle, __last, _IterType());
1090 template<typename _ForwardIter, typename _OutputIter>
1092 rotate_copy(_ForwardIter __first, _ForwardIter __middle,
1093 _ForwardIter __last, _OutputIter __result)
1095 // concept requirements
1096 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1097 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1098 typename iterator_traits<_ForwardIter>::value_type>)
1100 return copy(__first, __middle, copy(__middle, __last, __result));
1103 // Return a random number in the range [0, __n). This function encapsulates
1104 // whether we're using rand (part of the standard C library) or lrand48
1105 // (not standard, but a much better choice whenever it's available).
1106 template<typename _Distance>
1108 __random_number(_Distance __n)
1110 #ifdef _GLIBCPP_HAVE_DRAND48
1111 return lrand48() % __n;
1113 return rand() % __n;
1117 /// 25.2.11 random_shuffle().
1119 template<typename _RandomAccessIter>
1121 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last)
1123 // concept requirements
1124 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1127 if (__first == __last) return;
1128 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1129 iter_swap(__i, __first + __random_number((__i - __first) + 1));
1132 template<typename _RandomAccessIter, typename _RandomNumberGenerator>
1134 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
1135 _RandomNumberGenerator& __rand)
1137 // concept requirements
1138 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1141 if (__first == __last) return;
1142 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1143 iter_swap(__i, __first + __rand((__i - __first) + 1));
1146 // partition, stable_partition, and their auxiliary functions
1148 template<typename _ForwardIter, typename _Predicate>
1150 __partition(_ForwardIter __first, _ForwardIter __last,
1152 forward_iterator_tag)
1154 if (__first == __last) return __first;
1156 while (__pred(*__first))
1157 if (++__first == __last) return __first;
1159 _ForwardIter __next = __first;
1161 while (++__next != __last)
1162 if (__pred(*__next)) {
1163 swap(*__first, *__next);
1170 template<typename _BidirectionalIter, typename _Predicate>
1172 __partition(_BidirectionalIter __first, _BidirectionalIter __last,
1174 bidirectional_iterator_tag)
1178 if (__first == __last)
1180 else if (__pred(*__first))
1186 if (__first == __last)
1188 else if (!__pred(*__last))
1192 iter_swap(__first, __last);
1197 template<typename _ForwardIter, typename _Predicate>
1199 partition(_ForwardIter __first, _ForwardIter __last,
1202 // concept requirements
1203 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1204 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1205 typename iterator_traits<_ForwardIter>::value_type>)
1207 return __partition(__first, __last, __pred, __iterator_category(__first));
1211 template<typename _ForwardIter, typename _Predicate, typename _Distance>
1213 __inplace_stable_partition(_ForwardIter __first, _ForwardIter __last,
1214 _Predicate __pred, _Distance __len)
1217 return __pred(*__first) ? __last : __first;
1218 _ForwardIter __middle = __first;
1219 advance(__middle, __len / 2);
1220 _ForwardIter __begin = __inplace_stable_partition(__first, __middle,
1223 _ForwardIter __end = __inplace_stable_partition(__middle, __last,
1226 rotate(__begin, __middle, __end);
1227 advance(__begin, distance(__middle, __end));
1231 template<typename _ForwardIter, typename _Pointer, typename _Predicate,
1234 __stable_partition_adaptive(_ForwardIter __first, _ForwardIter __last,
1235 _Predicate __pred, _Distance __len,
1237 _Distance __buffer_size)
1239 if (__len <= __buffer_size) {
1240 _ForwardIter __result1 = __first;
1241 _Pointer __result2 = __buffer;
1242 for ( ; __first != __last ; ++__first)
1243 if (__pred(*__first)) {
1244 *__result1 = *__first;
1248 *__result2 = *__first;
1251 copy(__buffer, __result2, __result1);
1255 _ForwardIter __middle = __first;
1256 advance(__middle, __len / 2);
1257 _ForwardIter __begin = __stable_partition_adaptive(__first, __middle,
1260 __buffer, __buffer_size);
1261 _ForwardIter __end = __stable_partition_adaptive( __middle, __last,
1264 __buffer, __buffer_size);
1265 rotate(__begin, __middle, __end);
1266 advance(__begin, distance(__middle, __end));
1271 template<typename _ForwardIter, typename _Predicate>
1273 stable_partition(_ForwardIter __first, _ForwardIter __last,
1276 // concept requirements
1277 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1278 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1279 typename iterator_traits<_ForwardIter>::value_type>)
1281 if (__first == __last)
1285 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1286 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1288 _Temporary_buffer<_ForwardIter, _ValueType> __buf(__first, __last);
1289 if (__buf.size() > 0)
1290 return __stable_partition_adaptive(__first, __last, __pred,
1291 _DistanceType(__buf.requested_size()),
1292 __buf.begin(), __buf.size());
1294 return __inplace_stable_partition(__first, __last, __pred,
1295 _DistanceType(__buf.requested_size()));
1299 template<typename _RandomAccessIter, typename _Tp>
1301 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1305 while (*__first < __pivot)
1308 while (__pivot < *__last)
1310 if (!(__first < __last))
1312 iter_swap(__first, __last);
1317 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1319 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1320 _Tp __pivot, _Compare __comp)
1323 while (__comp(*__first, __pivot))
1326 while (__comp(__pivot, *__last))
1328 if (!(__first < __last))
1330 iter_swap(__first, __last);
1335 const int __stl_threshold = 16;
1337 // sort() and its auxiliary functions.
1339 template<typename _RandomAccessIter, typename _Tp>
1341 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
1343 _RandomAccessIter __next = __last;
1345 while (__val < *__next) {
1353 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1355 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, _Compare __comp)
1357 _RandomAccessIter __next = __last;
1359 while (__comp(__val, *__next)) {
1367 template<typename _RandomAccessIter>
1369 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1371 if (__first == __last) return;
1373 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1375 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1376 if (__val < *__first) {
1377 copy_backward(__first, __i, __i + 1);
1381 __unguarded_linear_insert(__i, __val);
1385 template<typename _RandomAccessIter, typename _Compare>
1387 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1390 if (__first == __last) return;
1392 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1394 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1395 if (__comp(__val, *__first)) {
1396 copy_backward(__first, __i, __i + 1);
1400 __unguarded_linear_insert(__i, __val, __comp);
1404 template<typename _RandomAccessIter>
1406 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1408 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1410 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1411 __unguarded_linear_insert(__i, _ValueType(*__i));
1414 template<typename _RandomAccessIter, typename _Compare>
1416 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1419 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1421 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1422 __unguarded_linear_insert(__i, _ValueType(*__i), __comp);
1425 template<typename _RandomAccessIter>
1427 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1429 if (__last - __first > __stl_threshold) {
1430 __insertion_sort(__first, __first + __stl_threshold);
1431 __unguarded_insertion_sort(__first + __stl_threshold, __last);
1434 __insertion_sort(__first, __last);
1437 template<typename _RandomAccessIter, typename _Compare>
1439 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1442 if (__last - __first > __stl_threshold) {
1443 __insertion_sort(__first, __first + __stl_threshold, __comp);
1444 __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
1447 __insertion_sort(__first, __last, __comp);
1450 template<typename _Size>
1455 for (__k = 0; __n != 1; __n >>= 1) ++__k;
1459 template<typename _RandomAccessIter, typename _Size>
1461 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1462 _Size __depth_limit)
1464 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1466 while (__last - __first > __stl_threshold) {
1467 if (__depth_limit == 0) {
1468 partial_sort(__first, __last, __last);
1472 _RandomAccessIter __cut =
1473 __unguarded_partition(__first, __last,
1474 _ValueType(__median(*__first,
1475 *(__first + (__last - __first)/2),
1477 __introsort_loop(__cut, __last, __depth_limit);
1482 template<typename _RandomAccessIter, typename _Size, typename _Compare>
1484 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1485 _Size __depth_limit, _Compare __comp)
1487 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1489 while (__last - __first > __stl_threshold) {
1490 if (__depth_limit == 0) {
1491 partial_sort(__first, __last, __last, __comp);
1495 _RandomAccessIter __cut =
1496 __unguarded_partition(__first, __last,
1497 _ValueType(__median(*__first,
1498 *(__first + (__last - __first)/2),
1499 *(__last - 1), __comp)),
1501 __introsort_loop(__cut, __last, __depth_limit, __comp);
1506 template<typename _RandomAccessIter>
1508 sort(_RandomAccessIter __first, _RandomAccessIter __last)
1510 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1512 // concept requirements
1513 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1515 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1517 if (__first != __last) {
1518 __introsort_loop(__first, __last, __lg(__last - __first) * 2);
1519 __final_insertion_sort(__first, __last);
1523 template<typename _RandomAccessIter, typename _Compare>
1525 sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1527 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1529 // concept requirements
1530 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1532 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _ValueType>)
1534 if (__first != __last) {
1535 __introsort_loop(__first, __last, __lg(__last - __first) * 2, __comp);
1536 __final_insertion_sort(__first, __last, __comp);
1540 // stable_sort() and its auxiliary functions.
1542 template<typename _RandomAccessIter>
1544 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1546 if (__last - __first < 15) {
1547 __insertion_sort(__first, __last);
1550 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1551 __inplace_stable_sort(__first, __middle);
1552 __inplace_stable_sort(__middle, __last);
1553 __merge_without_buffer(__first, __middle, __last,
1558 template<typename _RandomAccessIter, typename _Compare>
1560 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1563 if (__last - __first < 15) {
1564 __insertion_sort(__first, __last, __comp);
1567 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1568 __inplace_stable_sort(__first, __middle, __comp);
1569 __inplace_stable_sort(__middle, __last, __comp);
1570 __merge_without_buffer(__first, __middle, __last,
1576 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1579 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1580 _RandomAccessIter2 __result, _Distance __step_size)
1582 _Distance __two_step = 2 * __step_size;
1584 while (__last - __first >= __two_step) {
1585 __result = merge(__first, __first + __step_size,
1586 __first + __step_size, __first + __two_step,
1588 __first += __two_step;
1591 __step_size = min(_Distance(__last - __first), __step_size);
1592 merge(__first, __first + __step_size, __first + __step_size, __last,
1596 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1597 typename _Distance, typename _Compare>
1599 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1600 _RandomAccessIter2 __result, _Distance __step_size,
1603 _Distance __two_step = 2 * __step_size;
1605 while (__last - __first >= __two_step) {
1606 __result = merge(__first, __first + __step_size,
1607 __first + __step_size, __first + __two_step,
1610 __first += __two_step;
1612 __step_size = min(_Distance(__last - __first), __step_size);
1614 merge(__first, __first + __step_size,
1615 __first + __step_size, __last,
1620 const int __stl_chunk_size = 7;
1622 template<typename _RandomAccessIter, typename _Distance>
1624 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1625 _Distance __chunk_size)
1627 while (__last - __first >= __chunk_size) {
1628 __insertion_sort(__first, __first + __chunk_size);
1629 __first += __chunk_size;
1631 __insertion_sort(__first, __last);
1634 template<typename _RandomAccessIter, typename _Distance, typename _Compare>
1636 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1637 _Distance __chunk_size, _Compare __comp)
1639 while (__last - __first >= __chunk_size) {
1640 __insertion_sort(__first, __first + __chunk_size, __comp);
1641 __first += __chunk_size;
1643 __insertion_sort(__first, __last, __comp);
1646 template<typename _RandomAccessIter, typename _Pointer>
1648 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1651 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1653 _Distance __len = __last - __first;
1654 _Pointer __buffer_last = __buffer + __len;
1656 _Distance __step_size = __stl_chunk_size;
1657 __chunk_insertion_sort(__first, __last, __step_size);
1659 while (__step_size < __len) {
1660 __merge_sort_loop(__first, __last, __buffer, __step_size);
1662 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
1667 template<typename _RandomAccessIter, typename _Pointer, typename _Compare>
1669 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1670 _Pointer __buffer, _Compare __comp)
1672 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1674 _Distance __len = __last - __first;
1675 _Pointer __buffer_last = __buffer + __len;
1677 _Distance __step_size = __stl_chunk_size;
1678 __chunk_insertion_sort(__first, __last, __step_size, __comp);
1680 while (__step_size < __len) {
1681 __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
1683 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
1688 template<typename _RandomAccessIter, typename _Pointer, typename _Distance>
1690 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1691 _Pointer __buffer, _Distance __buffer_size)
1693 _Distance __len = (__last - __first + 1) / 2;
1694 _RandomAccessIter __middle = __first + __len;
1695 if (__len > __buffer_size) {
1696 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
1697 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
1700 __merge_sort_with_buffer(__first, __middle, __buffer);
1701 __merge_sort_with_buffer(__middle, __last, __buffer);
1703 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1704 _Distance(__last - __middle), __buffer, __buffer_size);
1707 template<typename _RandomAccessIter, typename _Pointer, typename _Distance,
1710 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1711 _Pointer __buffer, _Distance __buffer_size,
1714 _Distance __len = (__last - __first + 1) / 2;
1715 _RandomAccessIter __middle = __first + __len;
1716 if (__len > __buffer_size) {
1717 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
1719 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
1723 __merge_sort_with_buffer(__first, __middle, __buffer, __comp);
1724 __merge_sort_with_buffer(__middle, __last, __buffer, __comp);
1726 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1727 _Distance(__last - __middle), __buffer, __buffer_size,
1731 template<typename _RandomAccessIter>
1733 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1735 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1736 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1738 // concept requirements
1739 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1741 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1743 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1744 if (buf.begin() == 0)
1745 __inplace_stable_sort(__first, __last);
1747 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()));
1750 template<typename _RandomAccessIter, typename _Compare>
1752 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1754 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1755 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1757 // concept requirements
1758 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1760 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1761 _ValueType, _ValueType>)
1763 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1764 if (buf.begin() == 0)
1765 __inplace_stable_sort(__first, __last, __comp);
1767 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()),
1771 template<typename _RandomAccessIter>
1773 partial_sort(_RandomAccessIter __first,
1774 _RandomAccessIter __middle,
1775 _RandomAccessIter __last)
1777 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1779 // concept requirements
1780 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1782 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1784 make_heap(__first, __middle);
1785 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1786 if (*__i < *__first)
1787 __pop_heap(__first, __middle, __i, _ValueType(*__i));
1788 sort_heap(__first, __middle);
1791 template<typename _RandomAccessIter, typename _Compare>
1793 partial_sort(_RandomAccessIter __first,
1794 _RandomAccessIter __middle,
1795 _RandomAccessIter __last,
1798 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1800 // concept requirements
1801 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1803 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1804 _ValueType, _ValueType>)
1806 make_heap(__first, __middle, __comp);
1807 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1808 if (__comp(*__i, *__first))
1809 __pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
1810 sort_heap(__first, __middle, __comp);
1813 template<typename _InputIter, typename _RandomAccessIter>
1815 partial_sort_copy(_InputIter __first, _InputIter __last,
1816 _RandomAccessIter __result_first,
1817 _RandomAccessIter __result_last)
1819 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
1820 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
1821 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1823 // concept requirements
1824 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1825 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
1826 __glibcpp_function_requires(_LessThanComparableConcept<_OutputValueType>)
1827 __glibcpp_function_requires(_LessThanComparableConcept<_InputValueType>)
1829 if (__result_first == __result_last) return __result_last;
1830 _RandomAccessIter __result_real_last = __result_first;
1831 while(__first != __last && __result_real_last != __result_last) {
1832 *__result_real_last = *__first;
1833 ++__result_real_last;
1836 make_heap(__result_first, __result_real_last);
1837 while (__first != __last) {
1838 if (*__first < *__result_first)
1839 __adjust_heap(__result_first, _DistanceType(0),
1840 _DistanceType(__result_real_last - __result_first),
1841 _InputValueType(*__first));
1844 sort_heap(__result_first, __result_real_last);
1845 return __result_real_last;
1848 template<typename _InputIter, typename _RandomAccessIter, typename _Compare>
1850 partial_sort_copy(_InputIter __first, _InputIter __last,
1851 _RandomAccessIter __result_first,
1852 _RandomAccessIter __result_last,
1855 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
1856 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
1857 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1859 // concept requirements
1860 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1861 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1862 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
1863 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1864 _OutputValueType, _OutputValueType>)
1866 if (__result_first == __result_last) return __result_last;
1867 _RandomAccessIter __result_real_last = __result_first;
1868 while(__first != __last && __result_real_last != __result_last) {
1869 *__result_real_last = *__first;
1870 ++__result_real_last;
1873 make_heap(__result_first, __result_real_last, __comp);
1874 while (__first != __last) {
1875 if (__comp(*__first, *__result_first))
1876 __adjust_heap(__result_first, _DistanceType(0),
1877 _DistanceType(__result_real_last - __result_first),
1878 _InputValueType(*__first),
1882 sort_heap(__result_first, __result_real_last, __comp);
1883 return __result_real_last;
1886 template<typename _RandomAccessIter>
1888 nth_element(_RandomAccessIter __first,
1889 _RandomAccessIter __nth,
1890 _RandomAccessIter __last)
1892 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1894 // concept requirements
1895 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1896 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1898 while (__last - __first > 3) {
1899 _RandomAccessIter __cut =
1900 __unguarded_partition(__first, __last,
1901 _ValueType(__median(*__first,
1902 *(__first + (__last - __first)/2),
1909 __insertion_sort(__first, __last);
1912 template<typename _RandomAccessIter, typename _Compare>
1914 nth_element(_RandomAccessIter __first,
1915 _RandomAccessIter __nth,
1916 _RandomAccessIter __last,
1919 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1921 // concept requirements
1922 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
1923 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1924 _ValueType, _ValueType>)
1926 while (__last - __first > 3) {
1927 _RandomAccessIter __cut =
1928 __unguarded_partition(__first, __last,
1929 _ValueType(__median(*__first,
1930 *(__first + (__last - __first)/2),
1939 __insertion_sort(__first, __last, __comp);
1943 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
1945 template<typename _ForwardIter, typename _Tp>
1947 lower_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
1949 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1950 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1952 // concept requirements
1953 // Note that these are slightly stricter than those of the 4-argument
1954 // version, defined next. The difference is in the strictness of the
1955 // comparison operations... so for looser checking, define your own
1956 // comparison function, as was intended.
1957 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1958 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
1959 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
1961 _DistanceType __len = distance(__first, __last);
1962 _DistanceType __half;
1963 _ForwardIter __middle;
1966 __half = __len >> 1;
1968 advance(__middle, __half);
1969 if (*__middle < __val) {
1972 __len = __len - __half - 1;
1980 template<typename _ForwardIter, typename _Tp, typename _Compare>
1982 lower_bound(_ForwardIter __first, _ForwardIter __last,
1983 const _Tp& __val, _Compare __comp)
1985 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1986 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1988 // concept requirements
1989 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1990 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _Tp>)
1992 _DistanceType __len = distance(__first, __last);
1993 _DistanceType __half;
1994 _ForwardIter __middle;
1997 __half = __len >> 1;
1999 advance(__middle, __half);
2000 if (__comp(*__middle, __val)) {
2003 __len = __len - __half - 1;
2011 template<typename _ForwardIter, typename _Tp>
2013 upper_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2015 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2016 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2018 // concept requirements
2019 // See comments on lower_bound.
2020 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2021 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2022 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2024 _DistanceType __len = distance(__first, __last);
2025 _DistanceType __half;
2026 _ForwardIter __middle;
2029 __half = __len >> 1;
2031 advance(__middle, __half);
2032 if (__val < *__middle)
2037 __len = __len - __half - 1;
2043 template<typename _ForwardIter, typename _Tp, typename _Compare>
2045 upper_bound(_ForwardIter __first, _ForwardIter __last,
2046 const _Tp& __val, _Compare __comp)
2048 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2049 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2051 // concept requirements
2052 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2053 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
2055 _DistanceType __len = distance(__first, __last);
2056 _DistanceType __half;
2057 _ForwardIter __middle;
2060 __half = __len >> 1;
2062 advance(__middle, __half);
2063 if (__comp(__val, *__middle))
2068 __len = __len - __half - 1;
2074 template<typename _ForwardIter, typename _Tp>
2075 pair<_ForwardIter, _ForwardIter>
2076 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2078 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2079 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2081 // concept requirements
2082 // See comments on lower_bound.
2083 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2084 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2085 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2087 _DistanceType __len = distance(__first, __last);
2088 _DistanceType __half;
2089 _ForwardIter __middle, __left, __right;
2092 __half = __len >> 1;
2094 advance(__middle, __half);
2095 if (*__middle < __val) {
2098 __len = __len - __half - 1;
2100 else if (__val < *__middle)
2103 __left = lower_bound(__first, __middle, __val);
2104 advance(__first, __len);
2105 __right = upper_bound(++__middle, __first, __val);
2106 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2109 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2112 template<typename _ForwardIter, typename _Tp, typename _Compare>
2113 pair<_ForwardIter, _ForwardIter>
2114 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2117 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2118 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2120 // concept requirements
2121 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2122 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _Tp>)
2123 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
2125 _DistanceType __len = distance(__first, __last);
2126 _DistanceType __half;
2127 _ForwardIter __middle, __left, __right;
2130 __half = __len >> 1;
2132 advance(__middle, __half);
2133 if (__comp(*__middle, __val)) {
2136 __len = __len - __half - 1;
2138 else if (__comp(__val, *__middle))
2141 __left = lower_bound(__first, __middle, __val, __comp);
2142 advance(__first, __len);
2143 __right = upper_bound(++__middle, __first, __val, __comp);
2144 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2147 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2150 template<typename _ForwardIter, typename _Tp>
2152 binary_search(_ForwardIter __first, _ForwardIter __last,
2155 // concept requirements
2156 // See comments on lower_bound.
2157 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2158 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2159 typename iterator_traits<_ForwardIter>::value_type>)
2160 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2162 _ForwardIter __i = lower_bound(__first, __last, __val);
2163 return __i != __last && !(__val < *__i);
2166 template<typename _ForwardIter, typename _Tp, typename _Compare>
2168 binary_search(_ForwardIter __first, _ForwardIter __last,
2169 const _Tp& __val, _Compare __comp)
2171 // concept requirements
2172 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2173 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2174 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
2175 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp,
2176 typename iterator_traits<_ForwardIter>::value_type>)
2178 _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
2179 return __i != __last && !__comp(__val, *__i);
2182 // merge, with and without an explicitly supplied comparison function.
2184 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2186 merge(_InputIter1 __first1, _InputIter1 __last1,
2187 _InputIter2 __first2, _InputIter2 __last2,
2188 _OutputIter __result)
2190 // concept requirements
2191 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2192 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2193 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2194 typename iterator_traits<_InputIter1>::value_type>)
2195 __glibcpp_function_requires(_SameTypeConcept<
2196 typename iterator_traits<_InputIter1>::value_type,
2197 typename iterator_traits<_InputIter2>::value_type>)
2198 __glibcpp_function_requires(_LessThanComparableConcept<
2199 typename iterator_traits<_InputIter1>::value_type>)
2201 while (__first1 != __last1 && __first2 != __last2) {
2202 if (*__first2 < *__first1) {
2203 *__result = *__first2;
2207 *__result = *__first1;
2212 return copy(__first2, __last2, copy(__first1, __last1, __result));
2215 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2218 merge(_InputIter1 __first1, _InputIter1 __last1,
2219 _InputIter2 __first2, _InputIter2 __last2,
2220 _OutputIter __result, _Compare __comp)
2222 // concept requirements
2223 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2224 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2225 __glibcpp_function_requires(_SameTypeConcept<
2226 typename iterator_traits<_InputIter1>::value_type,
2227 typename iterator_traits<_InputIter2>::value_type>)
2228 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2229 typename iterator_traits<_InputIter1>::value_type>)
2230 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2231 typename iterator_traits<_InputIter1>::value_type,
2232 typename iterator_traits<_InputIter2>::value_type>)
2234 while (__first1 != __last1 && __first2 != __last2) {
2235 if (__comp(*__first2, *__first1)) {
2236 *__result = *__first2;
2240 *__result = *__first1;
2245 return copy(__first2, __last2, copy(__first1, __last1, __result));
2248 // inplace_merge and its auxiliary functions.
2250 template<typename _BidirectionalIter, typename _Distance>
2252 __merge_without_buffer(_BidirectionalIter __first,
2253 _BidirectionalIter __middle,
2254 _BidirectionalIter __last,
2255 _Distance __len1, _Distance __len2)
2257 if (__len1 == 0 || __len2 == 0)
2259 if (__len1 + __len2 == 2) {
2260 if (*__middle < *__first)
2261 iter_swap(__first, __middle);
2264 _BidirectionalIter __first_cut = __first;
2265 _BidirectionalIter __second_cut = __middle;
2266 _Distance __len11 = 0;
2267 _Distance __len22 = 0;
2268 if (__len1 > __len2) {
2269 __len11 = __len1 / 2;
2270 advance(__first_cut, __len11);
2271 __second_cut = lower_bound(__middle, __last, *__first_cut);
2272 __len22 = distance(__middle, __second_cut);
2275 __len22 = __len2 / 2;
2276 advance(__second_cut, __len22);
2277 __first_cut = upper_bound(__first, __middle, *__second_cut);
2278 __len11 = distance(__first, __first_cut);
2280 rotate(__first_cut, __middle, __second_cut);
2281 _BidirectionalIter __new_middle = __first_cut;
2282 advance(__new_middle, distance(__middle, __second_cut));
2283 __merge_without_buffer(__first, __first_cut, __new_middle,
2285 __merge_without_buffer(__new_middle, __second_cut, __last,
2286 __len1 - __len11, __len2 - __len22);
2289 template<typename _BidirectionalIter, typename _Distance, typename _Compare>
2291 __merge_without_buffer(_BidirectionalIter __first,
2292 _BidirectionalIter __middle,
2293 _BidirectionalIter __last,
2294 _Distance __len1, _Distance __len2,
2297 if (__len1 == 0 || __len2 == 0)
2299 if (__len1 + __len2 == 2) {
2300 if (__comp(*__middle, *__first))
2301 iter_swap(__first, __middle);
2304 _BidirectionalIter __first_cut = __first;
2305 _BidirectionalIter __second_cut = __middle;
2306 _Distance __len11 = 0;
2307 _Distance __len22 = 0;
2308 if (__len1 > __len2) {
2309 __len11 = __len1 / 2;
2310 advance(__first_cut, __len11);
2311 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2312 __len22 = distance(__middle, __second_cut);
2315 __len22 = __len2 / 2;
2316 advance(__second_cut, __len22);
2317 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2318 __len11 = distance(__first, __first_cut);
2320 rotate(__first_cut, __middle, __second_cut);
2321 _BidirectionalIter __new_middle = __first_cut;
2322 advance(__new_middle, distance(__middle, __second_cut));
2323 __merge_without_buffer(__first, __first_cut, __new_middle,
2324 __len11, __len22, __comp);
2325 __merge_without_buffer(__new_middle, __second_cut, __last,
2326 __len1 - __len11, __len2 - __len22, __comp);
2329 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2332 __rotate_adaptive(_BidirectionalIter1 __first,
2333 _BidirectionalIter1 __middle,
2334 _BidirectionalIter1 __last,
2335 _Distance __len1, _Distance __len2,
2336 _BidirectionalIter2 __buffer,
2337 _Distance __buffer_size)
2339 _BidirectionalIter2 __buffer_end;
2340 if (__len1 > __len2 && __len2 <= __buffer_size) {
2341 __buffer_end = copy(__middle, __last, __buffer);
2342 copy_backward(__first, __middle, __last);
2343 return copy(__buffer, __buffer_end, __first);
2345 else if (__len1 <= __buffer_size) {
2346 __buffer_end = copy(__first, __middle, __buffer);
2347 copy(__middle, __last, __first);
2348 return copy_backward(__buffer, __buffer_end, __last);
2351 rotate(__first, __middle, __last);
2352 advance(__first, distance(__middle, __last));
2357 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2358 typename _BidirectionalIter3>
2360 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2361 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2362 _BidirectionalIter3 __result)
2364 if (__first1 == __last1)
2365 return copy_backward(__first2, __last2, __result);
2366 if (__first2 == __last2)
2367 return copy_backward(__first1, __last1, __result);
2371 if (*__last2 < *__last1) {
2372 *--__result = *__last1;
2373 if (__first1 == __last1)
2374 return copy_backward(__first2, ++__last2, __result);
2378 *--__result = *__last2;
2379 if (__first2 == __last2)
2380 return copy_backward(__first1, ++__last1, __result);
2386 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2387 typename _BidirectionalIter3, typename _Compare>
2389 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2390 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2391 _BidirectionalIter3 __result,
2394 if (__first1 == __last1)
2395 return copy_backward(__first2, __last2, __result);
2396 if (__first2 == __last2)
2397 return copy_backward(__first1, __last1, __result);
2401 if (__comp(*__last2, *__last1)) {
2402 *--__result = *__last1;
2403 if (__first1 == __last1)
2404 return copy_backward(__first2, ++__last2, __result);
2408 *--__result = *__last2;
2409 if (__first2 == __last2)
2410 return copy_backward(__first1, ++__last1, __result);
2416 template<typename _BidirectionalIter, typename _Distance, typename _Pointer>
2418 __merge_adaptive(_BidirectionalIter __first,
2419 _BidirectionalIter __middle,
2420 _BidirectionalIter __last,
2421 _Distance __len1, _Distance __len2,
2422 _Pointer __buffer, _Distance __buffer_size)
2424 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2425 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2426 merge(__buffer, __buffer_end, __middle, __last, __first);
2428 else if (__len2 <= __buffer_size) {
2429 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2430 __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
2433 _BidirectionalIter __first_cut = __first;
2434 _BidirectionalIter __second_cut = __middle;
2435 _Distance __len11 = 0;
2436 _Distance __len22 = 0;
2437 if (__len1 > __len2) {
2438 __len11 = __len1 / 2;
2439 advance(__first_cut, __len11);
2440 __second_cut = lower_bound(__middle, __last, *__first_cut);
2441 __len22 = distance(__middle, __second_cut);
2444 __len22 = __len2 / 2;
2445 advance(__second_cut, __len22);
2446 __first_cut = upper_bound(__first, __middle, *__second_cut);
2447 __len11 = distance(__first, __first_cut);
2449 _BidirectionalIter __new_middle =
2450 __rotate_adaptive(__first_cut, __middle, __second_cut,
2451 __len1 - __len11, __len22, __buffer,
2453 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2454 __len22, __buffer, __buffer_size);
2455 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2456 __len2 - __len22, __buffer, __buffer_size);
2460 template<typename _BidirectionalIter, typename _Distance, typename _Pointer,
2463 __merge_adaptive(_BidirectionalIter __first,
2464 _BidirectionalIter __middle,
2465 _BidirectionalIter __last,
2466 _Distance __len1, _Distance __len2,
2467 _Pointer __buffer, _Distance __buffer_size,
2470 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2471 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2472 merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
2474 else if (__len2 <= __buffer_size) {
2475 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2476 __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
2480 _BidirectionalIter __first_cut = __first;
2481 _BidirectionalIter __second_cut = __middle;
2482 _Distance __len11 = 0;
2483 _Distance __len22 = 0;
2484 if (__len1 > __len2) {
2485 __len11 = __len1 / 2;
2486 advance(__first_cut, __len11);
2487 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2488 __len22 = distance(__middle, __second_cut);
2491 __len22 = __len2 / 2;
2492 advance(__second_cut, __len22);
2493 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2494 __len11 = distance(__first, __first_cut);
2496 _BidirectionalIter __new_middle =
2497 __rotate_adaptive(__first_cut, __middle, __second_cut,
2498 __len1 - __len11, __len22, __buffer,
2500 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2501 __len22, __buffer, __buffer_size, __comp);
2502 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2503 __len2 - __len22, __buffer, __buffer_size, __comp);
2507 template<typename _BidirectionalIter>
2509 inplace_merge(_BidirectionalIter __first,
2510 _BidirectionalIter __middle,
2511 _BidirectionalIter __last)
2513 typedef typename iterator_traits<_BidirectionalIter>::value_type
2515 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2518 // concept requirements
2519 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2520 _BidirectionalIter>)
2521 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
2523 if (__first == __middle || __middle == __last)
2526 _DistanceType __len1 = distance(__first, __middle);
2527 _DistanceType __len2 = distance(__middle, __last);
2529 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2530 if (__buf.begin() == 0)
2531 __merge_without_buffer(__first, __middle, __last, __len1, __len2);
2533 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2534 __buf.begin(), _DistanceType(__buf.size()));
2537 template<typename _BidirectionalIter, typename _Compare>
2539 inplace_merge(_BidirectionalIter __first,
2540 _BidirectionalIter __middle,
2541 _BidirectionalIter __last,
2544 typedef typename iterator_traits<_BidirectionalIter>::value_type
2546 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2549 // concept requirements
2550 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2551 _BidirectionalIter>)
2552 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2553 _ValueType, _ValueType>)
2555 if (__first == __middle || __middle == __last)
2558 _DistanceType __len1 = distance(__first, __middle);
2559 _DistanceType __len2 = distance(__middle, __last);
2561 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2562 if (__buf.begin() == 0)
2563 __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
2565 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2566 __buf.begin(), _DistanceType(__buf.size()),
2570 // Set algorithms: includes, set_union, set_intersection, set_difference,
2571 // set_symmetric_difference. All of these algorithms have the precondition
2572 // that their input ranges are sorted and the postcondition that their output
2573 // ranges are sorted.
2575 template<typename _InputIter1, typename _InputIter2>
2577 includes(_InputIter1 __first1, _InputIter1 __last1,
2578 _InputIter2 __first2, _InputIter2 __last2)
2580 // concept requirements
2581 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2582 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2583 __glibcpp_function_requires(_SameTypeConcept<
2584 typename iterator_traits<_InputIter1>::value_type,
2585 typename iterator_traits<_InputIter2>::value_type>)
2586 __glibcpp_function_requires(_LessThanComparableConcept<
2587 typename iterator_traits<_InputIter1>::value_type>)
2589 while (__first1 != __last1 && __first2 != __last2)
2590 if (*__first2 < *__first1)
2592 else if(*__first1 < *__first2)
2595 ++__first1, ++__first2;
2597 return __first2 == __last2;
2600 template<typename _InputIter1, typename _InputIter2, typename _Compare>
2602 includes(_InputIter1 __first1, _InputIter1 __last1,
2603 _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
2605 // concept requirements
2606 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2607 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2608 __glibcpp_function_requires(_SameTypeConcept<
2609 typename iterator_traits<_InputIter1>::value_type,
2610 typename iterator_traits<_InputIter2>::value_type>)
2611 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2612 typename iterator_traits<_InputIter1>::value_type,
2613 typename iterator_traits<_InputIter2>::value_type>)
2615 while (__first1 != __last1 && __first2 != __last2)
2616 if (__comp(*__first2, *__first1))
2618 else if(__comp(*__first1, *__first2))
2621 ++__first1, ++__first2;
2623 return __first2 == __last2;
2626 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2628 set_union(_InputIter1 __first1, _InputIter1 __last1,
2629 _InputIter2 __first2, _InputIter2 __last2,
2630 _OutputIter __result)
2632 // concept requirements
2633 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2634 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2635 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2636 typename iterator_traits<_InputIter1>::value_type>)
2637 __glibcpp_function_requires(_SameTypeConcept<
2638 typename iterator_traits<_InputIter1>::value_type,
2639 typename iterator_traits<_InputIter2>::value_type>)
2640 __glibcpp_function_requires(_LessThanComparableConcept<
2641 typename iterator_traits<_InputIter1>::value_type>)
2643 while (__first1 != __last1 && __first2 != __last2) {
2644 if (*__first1 < *__first2) {
2645 *__result = *__first1;
2648 else if (*__first2 < *__first1) {
2649 *__result = *__first2;
2653 *__result = *__first1;
2659 return copy(__first2, __last2, copy(__first1, __last1, __result));
2662 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2665 set_union(_InputIter1 __first1, _InputIter1 __last1,
2666 _InputIter2 __first2, _InputIter2 __last2,
2667 _OutputIter __result, _Compare __comp)
2669 // concept requirements
2670 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2671 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2672 __glibcpp_function_requires(_SameTypeConcept<
2673 typename iterator_traits<_InputIter1>::value_type,
2674 typename iterator_traits<_InputIter2>::value_type>)
2675 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2676 typename iterator_traits<_InputIter1>::value_type>)
2677 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2678 typename iterator_traits<_InputIter1>::value_type,
2679 typename iterator_traits<_InputIter2>::value_type>)
2681 while (__first1 != __last1 && __first2 != __last2) {
2682 if (__comp(*__first1, *__first2)) {
2683 *__result = *__first1;
2686 else if (__comp(*__first2, *__first1)) {
2687 *__result = *__first2;
2691 *__result = *__first1;
2697 return copy(__first2, __last2, copy(__first1, __last1, __result));
2700 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2702 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2703 _InputIter2 __first2, _InputIter2 __last2,
2704 _OutputIter __result)
2706 // concept requirements
2707 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2708 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2709 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2710 typename iterator_traits<_InputIter1>::value_type>)
2711 __glibcpp_function_requires(_SameTypeConcept<
2712 typename iterator_traits<_InputIter1>::value_type,
2713 typename iterator_traits<_InputIter2>::value_type>)
2714 __glibcpp_function_requires(_LessThanComparableConcept<
2715 typename iterator_traits<_InputIter1>::value_type>)
2717 while (__first1 != __last1 && __first2 != __last2)
2718 if (*__first1 < *__first2)
2720 else if (*__first2 < *__first1)
2723 *__result = *__first1;
2731 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2734 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2735 _InputIter2 __first2, _InputIter2 __last2,
2736 _OutputIter __result, _Compare __comp)
2738 // concept requirements
2739 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2740 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2741 __glibcpp_function_requires(_SameTypeConcept<
2742 typename iterator_traits<_InputIter1>::value_type,
2743 typename iterator_traits<_InputIter2>::value_type>)
2744 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2745 typename iterator_traits<_InputIter1>::value_type>)
2746 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2747 typename iterator_traits<_InputIter1>::value_type,
2748 typename iterator_traits<_InputIter2>::value_type>)
2750 while (__first1 != __last1 && __first2 != __last2)
2751 if (__comp(*__first1, *__first2))
2753 else if (__comp(*__first2, *__first1))
2756 *__result = *__first1;
2764 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2766 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2767 _InputIter2 __first2, _InputIter2 __last2,
2768 _OutputIter __result)
2770 // concept requirements
2771 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2772 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2773 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2774 typename iterator_traits<_InputIter1>::value_type>)
2775 __glibcpp_function_requires(_SameTypeConcept<
2776 typename iterator_traits<_InputIter1>::value_type,
2777 typename iterator_traits<_InputIter2>::value_type>)
2778 __glibcpp_function_requires(_LessThanComparableConcept<
2779 typename iterator_traits<_InputIter1>::value_type>)
2781 while (__first1 != __last1 && __first2 != __last2)
2782 if (*__first1 < *__first2) {
2783 *__result = *__first1;
2787 else if (*__first2 < *__first1)
2793 return copy(__first1, __last1, __result);
2796 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2799 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2800 _InputIter2 __first2, _InputIter2 __last2,
2801 _OutputIter __result, _Compare __comp)
2803 // concept requirements
2804 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2805 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2806 __glibcpp_function_requires(_SameTypeConcept<
2807 typename iterator_traits<_InputIter1>::value_type,
2808 typename iterator_traits<_InputIter2>::value_type>)
2809 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2810 typename iterator_traits<_InputIter1>::value_type>)
2811 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2812 typename iterator_traits<_InputIter1>::value_type,
2813 typename iterator_traits<_InputIter2>::value_type>)
2815 while (__first1 != __last1 && __first2 != __last2)
2816 if (__comp(*__first1, *__first2)) {
2817 *__result = *__first1;
2821 else if (__comp(*__first2, *__first1))
2827 return copy(__first1, __last1, __result);
2830 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2832 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
2833 _InputIter2 __first2, _InputIter2 __last2,
2834 _OutputIter __result)
2836 // concept requirements
2837 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2838 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2839 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2840 typename iterator_traits<_InputIter1>::value_type>)
2841 __glibcpp_function_requires(_SameTypeConcept<
2842 typename iterator_traits<_InputIter1>::value_type,
2843 typename iterator_traits<_InputIter2>::value_type>)
2844 __glibcpp_function_requires(_LessThanComparableConcept<
2845 typename iterator_traits<_InputIter1>::value_type>)
2847 while (__first1 != __last1 && __first2 != __last2)
2848 if (*__first1 < *__first2) {
2849 *__result = *__first1;
2853 else if (*__first2 < *__first1) {
2854 *__result = *__first2;
2862 return copy(__first2, __last2, copy(__first1, __last1, __result));
2865 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2868 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
2869 _InputIter2 __first2, _InputIter2 __last2,
2870 _OutputIter __result,
2873 // concept requirements
2874 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2875 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2876 __glibcpp_function_requires(_SameTypeConcept<
2877 typename iterator_traits<_InputIter1>::value_type,
2878 typename iterator_traits<_InputIter2>::value_type>)
2879 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2880 typename iterator_traits<_InputIter1>::value_type>)
2881 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2882 typename iterator_traits<_InputIter1>::value_type,
2883 typename iterator_traits<_InputIter2>::value_type>)
2885 while (__first1 != __last1 && __first2 != __last2)
2886 if (__comp(*__first1, *__first2)) {
2887 *__result = *__first1;
2891 else if (__comp(*__first2, *__first1)) {
2892 *__result = *__first2;
2900 return copy(__first2, __last2, copy(__first1, __last1, __result));
2903 // min_element and max_element, with and without an explicitly supplied
2904 // comparison function.
2906 template<typename _ForwardIter>
2908 max_element(_ForwardIter __first, _ForwardIter __last)
2910 // concept requirements
2911 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2912 __glibcpp_function_requires(_LessThanComparableConcept<
2913 typename iterator_traits<_ForwardIter>::value_type>)
2915 if (__first == __last) return __first;
2916 _ForwardIter __result = __first;
2917 while (++__first != __last)
2918 if (*__result < *__first)
2923 template<typename _ForwardIter, typename _Compare>
2925 max_element(_ForwardIter __first, _ForwardIter __last,
2928 // concept requirements
2929 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2930 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2931 typename iterator_traits<_ForwardIter>::value_type,
2932 typename iterator_traits<_ForwardIter>::value_type>)
2934 if (__first == __last) return __first;
2935 _ForwardIter __result = __first;
2936 while (++__first != __last)
2937 if (__comp(*__result, *__first)) __result = __first;
2941 template<typename _ForwardIter>
2943 min_element(_ForwardIter __first, _ForwardIter __last)
2945 // concept requirements
2946 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2947 __glibcpp_function_requires(_LessThanComparableConcept<
2948 typename iterator_traits<_ForwardIter>::value_type>)
2950 if (__first == __last) return __first;
2951 _ForwardIter __result = __first;
2952 while (++__first != __last)
2953 if (*__first < *__result)
2958 template<typename _ForwardIter, typename _Compare>
2960 min_element(_ForwardIter __first, _ForwardIter __last,
2963 // concept requirements
2964 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2965 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2966 typename iterator_traits<_ForwardIter>::value_type,
2967 typename iterator_traits<_ForwardIter>::value_type>)
2969 if (__first == __last) return __first;
2970 _ForwardIter __result = __first;
2971 while (++__first != __last)
2972 if (__comp(*__first, *__result))
2977 // next_permutation and prev_permutation, with and without an explicitly
2978 // supplied comparison function.
2980 template<typename _BidirectionalIter>
2982 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
2984 // concept requirements
2985 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
2986 __glibcpp_function_requires(_LessThanComparableConcept<
2987 typename iterator_traits<_BidirectionalIter>::value_type>)
2989 if (__first == __last)
2991 _BidirectionalIter __i = __first;
2999 _BidirectionalIter __ii = __i;
3002 _BidirectionalIter __j = __last;
3003 while (!(*__i < *--__j))
3005 iter_swap(__i, __j);
3006 reverse(__ii, __last);
3009 if (__i == __first) {
3010 reverse(__first, __last);
3016 template<typename _BidirectionalIter, typename _Compare>
3018 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3021 // concept requirements
3022 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3023 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3024 typename iterator_traits<_BidirectionalIter>::value_type,
3025 typename iterator_traits<_BidirectionalIter>::value_type>)
3027 if (__first == __last)
3029 _BidirectionalIter __i = __first;
3037 _BidirectionalIter __ii = __i;
3039 if (__comp(*__i, *__ii)) {
3040 _BidirectionalIter __j = __last;
3041 while (!__comp(*__i, *--__j))
3043 iter_swap(__i, __j);
3044 reverse(__ii, __last);
3047 if (__i == __first) {
3048 reverse(__first, __last);
3054 template<typename _BidirectionalIter>
3056 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3058 // concept requirements
3059 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3060 __glibcpp_function_requires(_LessThanComparableConcept<
3061 typename iterator_traits<_BidirectionalIter>::value_type>)
3063 if (__first == __last)
3065 _BidirectionalIter __i = __first;
3073 _BidirectionalIter __ii = __i;
3076 _BidirectionalIter __j = __last;
3077 while (!(*--__j < *__i))
3079 iter_swap(__i, __j);
3080 reverse(__ii, __last);
3083 if (__i == __first) {
3084 reverse(__first, __last);
3090 template<typename _BidirectionalIter, typename _Compare>
3092 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3095 // concept requirements
3096 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3097 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3098 typename iterator_traits<_BidirectionalIter>::value_type,
3099 typename iterator_traits<_BidirectionalIter>::value_type>)
3101 if (__first == __last)
3103 _BidirectionalIter __i = __first;
3111 _BidirectionalIter __ii = __i;
3113 if (__comp(*__ii, *__i)) {
3114 _BidirectionalIter __j = __last;
3115 while (!__comp(*--__j, *__i))
3117 iter_swap(__i, __j);
3118 reverse(__ii, __last);
3121 if (__i == __first) {
3122 reverse(__first, __last);
3128 // find_first_of, with and without an explicitly supplied comparison function.
3130 template<typename _InputIter, typename _ForwardIter>
3132 find_first_of(_InputIter __first1, _InputIter __last1,
3133 _ForwardIter __first2, _ForwardIter __last2)
3135 // concept requirements
3136 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3137 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3138 __glibcpp_function_requires(_EqualOpConcept<
3139 typename iterator_traits<_InputIter>::value_type,
3140 typename iterator_traits<_ForwardIter>::value_type>)
3142 for ( ; __first1 != __last1; ++__first1)
3143 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3144 if (*__first1 == *__iter)
3149 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
3151 find_first_of(_InputIter __first1, _InputIter __last1,
3152 _ForwardIter __first2, _ForwardIter __last2,
3153 _BinaryPredicate __comp)
3155 // concept requirements
3156 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3157 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3158 __glibcpp_function_requires(_EqualOpConcept<
3159 typename iterator_traits<_InputIter>::value_type,
3160 typename iterator_traits<_ForwardIter>::value_type>)
3161 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3162 typename iterator_traits<_InputIter>::value_type,
3163 typename iterator_traits<_ForwardIter>::value_type>)
3165 for ( ; __first1 != __last1; ++__first1)
3166 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3167 if (__comp(*__first1, *__iter))
3173 // find_end, with and without an explicitly supplied comparison function.
3174 // Search [first2, last2) as a subsequence in [first1, last1), and return
3175 // the *last* possible match. Note that find_end for bidirectional iterators
3176 // is much faster than for forward iterators.
3178 // find_end for forward iterators.
3179 template<typename _ForwardIter1, typename _ForwardIter2>
3181 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3182 _ForwardIter2 __first2, _ForwardIter2 __last2,
3183 forward_iterator_tag, forward_iterator_tag)
3185 if (__first2 == __last2)
3188 _ForwardIter1 __result = __last1;
3190 _ForwardIter1 __new_result
3191 = search(__first1, __last1, __first2, __last2);
3192 if (__new_result == __last1)
3195 __result = __new_result;
3196 __first1 = __new_result;
3203 template<typename _ForwardIter1, typename _ForwardIter2,
3204 typename _BinaryPredicate>
3206 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3207 _ForwardIter2 __first2, _ForwardIter2 __last2,
3208 forward_iterator_tag, forward_iterator_tag,
3209 _BinaryPredicate __comp)
3211 if (__first2 == __last2)
3214 _ForwardIter1 __result = __last1;
3216 _ForwardIter1 __new_result
3217 = search(__first1, __last1, __first2, __last2, __comp);
3218 if (__new_result == __last1)
3221 __result = __new_result;
3222 __first1 = __new_result;
3229 // find_end for bidirectional iterators. Requires partial specialization.
3230 template<typename _BidirectionalIter1, typename _BidirectionalIter2>
3232 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3233 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3234 bidirectional_iterator_tag, bidirectional_iterator_tag)
3236 // concept requirements
3237 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3238 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3240 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3241 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3243 _RevIter1 __rlast1(__first1);
3244 _RevIter2 __rlast2(__first2);
3245 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3246 _RevIter2(__last2), __rlast2);
3248 if (__rresult == __rlast1)
3251 _BidirectionalIter1 __result = __rresult.base();
3252 advance(__result, -distance(__first2, __last2));
3257 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
3258 typename _BinaryPredicate>
3260 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3261 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3262 bidirectional_iterator_tag, bidirectional_iterator_tag,
3263 _BinaryPredicate __comp)
3265 // concept requirements
3266 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3267 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3269 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3270 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3272 _RevIter1 __rlast1(__first1);
3273 _RevIter2 __rlast2(__first2);
3274 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3275 _RevIter2(__last2), __rlast2,
3278 if (__rresult == __rlast1)
3281 _BidirectionalIter1 __result = __rresult.base();
3282 advance(__result, -distance(__first2, __last2));
3287 // Dispatching functions for find_end.
3289 template<typename _ForwardIter1, typename _ForwardIter2>
3290 inline _ForwardIter1
3291 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3292 _ForwardIter2 __first2, _ForwardIter2 __last2)
3294 // concept requirements
3295 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3296 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3297 __glibcpp_function_requires(_EqualOpConcept<
3298 typename iterator_traits<_ForwardIter1>::value_type,
3299 typename iterator_traits<_ForwardIter2>::value_type>)
3301 return __find_end(__first1, __last1, __first2, __last2,
3302 __iterator_category(__first1),
3303 __iterator_category(__first2));
3306 template<typename _ForwardIter1, typename _ForwardIter2,
3307 typename _BinaryPredicate>
3308 inline _ForwardIter1
3309 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3310 _ForwardIter2 __first2, _ForwardIter2 __last2,
3311 _BinaryPredicate __comp)
3313 // concept requirements
3314 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3315 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3316 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3317 typename iterator_traits<_ForwardIter1>::value_type,
3318 typename iterator_traits<_ForwardIter2>::value_type>)
3320 return __find_end(__first1, __last1, __first2, __last2,
3321 __iterator_category(__first1),
3322 __iterator_category(__first2),
3328 #endif /* __GLIBCPP_INTERNAL_ALGO_H */