1 // Algorithm implimentation -*- C++ -*-
3 // Copyright (C) 2001 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
33 * Hewlett-Packard Company
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation. Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose. It is provided "as is" without express or implied warranty.
45 * Silicon Graphics Computer Systems, Inc.
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation. Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose. It is provided "as is" without express or implied warranty.
56 /* NOTE: This is an internal header file, included by other STL headers.
57 * You should not attempt to use it directly.
60 #ifndef __SGI_STL_INTERNAL_ALGO_H
61 #define __SGI_STL_INTERNAL_ALGO_H
63 #include <bits/stl_heap.h>
65 // See concept_check.h for the __glibcpp_*_requires macros.
70 // __median (an extension, not present in the C++ standard).
72 template<typename _Tp>
74 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
76 // concept requirements
77 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
93 template<typename _Tp, typename _Compare>
95 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
97 // concept requirements
98 __glibcpp_function_requires(_BinaryFunctionConcept<_Compare, bool, _Tp, _Tp>)
100 if (__comp(__b, __c))
102 else if (__comp(__a, __c))
106 else if (__comp(__a, __c))
108 else if (__comp(__b, __c))
114 // for_each. Apply a function to every element of a range.
115 template<typename _InputIter, typename _Function>
117 for_each(_InputIter __first, _InputIter __last, _Function __f)
119 // concept requirements
120 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
121 for ( ; __first != __last; ++__first)
128 template<typename _InputIter, typename _Tp>
130 find(_InputIter __first, _InputIter __last,
134 while (__first != __last && !(*__first == __val))
139 template<typename _InputIter, typename _Predicate>
141 find_if(_InputIter __first, _InputIter __last,
145 while (__first != __last && !__pred(*__first))
150 template<typename _RandomAccessIter, typename _Tp>
152 find(_RandomAccessIter __first, _RandomAccessIter __last,
154 random_access_iterator_tag)
156 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
157 = (__last - __first) >> 2;
159 for ( ; __trip_count > 0 ; --__trip_count) {
160 if (*__first == __val) return __first;
163 if (*__first == __val) return __first;
166 if (*__first == __val) return __first;
169 if (*__first == __val) return __first;
173 switch(__last - __first) {
175 if (*__first == __val) return __first;
178 if (*__first == __val) return __first;
181 if (*__first == __val) return __first;
189 template<typename _RandomAccessIter, typename _Predicate>
191 find_if(_RandomAccessIter __first, _RandomAccessIter __last,
193 random_access_iterator_tag)
195 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
196 = (__last - __first) >> 2;
198 for ( ; __trip_count > 0 ; --__trip_count) {
199 if (__pred(*__first)) return __first;
202 if (__pred(*__first)) return __first;
205 if (__pred(*__first)) return __first;
208 if (__pred(*__first)) return __first;
212 switch(__last - __first) {
214 if (__pred(*__first)) return __first;
217 if (__pred(*__first)) return __first;
220 if (__pred(*__first)) return __first;
228 template<typename _InputIter, typename _Tp>
230 find(_InputIter __first, _InputIter __last,
233 // concept requirements
234 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
235 __glibcpp_function_requires(_EqualOpConcept<
236 typename iterator_traits<_InputIter>::value_type, _Tp>)
237 return find(__first, __last, __val, __iterator_category(__first));
240 template<typename _InputIter, typename _Predicate>
242 find_if(_InputIter __first, _InputIter __last,
245 // concept requirements
246 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
247 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
248 typename iterator_traits<_InputIter>::value_type>)
249 return find_if(__first, __last, __pred, __iterator_category(__first));
254 template<typename _ForwardIter>
256 adjacent_find(_ForwardIter __first, _ForwardIter __last)
258 // concept requirements
259 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
260 __glibcpp_function_requires(_EqualityComparableConcept<
261 typename iterator_traits<_ForwardIter>::value_type>)
262 if (__first == __last)
264 _ForwardIter __next = __first;
265 while(++__next != __last) {
266 if (*__first == *__next)
273 template<typename _ForwardIter, typename _BinaryPredicate>
275 adjacent_find(_ForwardIter __first, _ForwardIter __last,
276 _BinaryPredicate __binary_pred)
278 // concept requirements
279 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
280 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
281 typename iterator_traits<_ForwardIter>::value_type,
282 typename iterator_traits<_ForwardIter>::value_type>)
283 if (__first == __last)
285 _ForwardIter __next = __first;
286 while(++__next != __last) {
287 if (__binary_pred(*__first, *__next))
294 // count and count_if. There are two version of each, one whose return type
295 // type is void and one (present only if we have partial specialization)
296 // whose return type is iterator_traits<_InputIter>::difference_type. The
297 // C++ standard only has the latter version, but the former, which was present
298 // in the HP STL, is retained for backward compatibility.
300 template<typename _InputIter, typename _Tp, typename _Size>
302 count(_InputIter __first, _InputIter __last,
306 // concept requirements
307 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
308 __glibcpp_function_requires(_EqualityComparableConcept<
309 typename iterator_traits<_InputIter>::value_type >)
310 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
311 for ( ; __first != __last; ++__first)
312 if (*__first == __value)
316 template<typename _InputIter, typename _Predicate, typename _Size>
318 count_if(_InputIter __first, _InputIter __last,
322 // concept requirements
323 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
324 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
325 typename iterator_traits<_InputIter>::value_type>)
326 for ( ; __first != __last; ++__first)
327 if (__pred(*__first))
331 template<typename _InputIter, typename _Tp>
332 typename iterator_traits<_InputIter>::difference_type
333 count(_InputIter __first, _InputIter __last, const _Tp& __value)
335 // concept requirements
336 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
337 __glibcpp_function_requires(_EqualityComparableConcept<
338 typename iterator_traits<_InputIter>::value_type >)
339 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
340 typename iterator_traits<_InputIter>::difference_type __n = 0;
341 for ( ; __first != __last; ++__first)
342 if (*__first == __value)
347 template<typename _InputIter, typename _Predicate>
348 typename iterator_traits<_InputIter>::difference_type
349 count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
351 // concept requirements
352 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
353 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
354 typename iterator_traits<_InputIter>::value_type>)
355 typename iterator_traits<_InputIter>::difference_type __n = 0;
356 for ( ; __first != __last; ++__first)
357 if (__pred(*__first))
365 template<typename _ForwardIter1, typename _ForwardIter2>
367 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
368 _ForwardIter2 __first2, _ForwardIter2 __last2)
370 // concept requirements
371 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
372 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
373 __glibcpp_function_requires(_EqualOpConcept<
374 typename iterator_traits<_ForwardIter1>::value_type,
375 typename iterator_traits<_ForwardIter2>::value_type>)
377 // Test for empty ranges
378 if (__first1 == __last1 || __first2 == __last2)
381 // Test for a pattern of length 1.
382 _ForwardIter2 __tmp(__first2);
384 if (__tmp == __last2)
385 return find(__first1, __last1, *__first2);
389 _ForwardIter2 __p1, __p;
391 __p1 = __first2; ++__p1;
393 _ForwardIter1 __current = __first1;
395 while (__first1 != __last1) {
396 __first1 = find(__first1, __last1, *__first2);
397 if (__first1 == __last1)
401 __current = __first1;
402 if (++__current == __last1)
405 while (*__current == *__p) {
406 if (++__p == __last2)
408 if (++__current == __last1)
417 template<typename _ForwardIter1, typename _ForwardIter2, typename _BinaryPred>
419 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
420 _ForwardIter2 __first2, _ForwardIter2 __last2,
421 _BinaryPred __predicate)
423 // concept requirements
424 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
425 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
426 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
427 typename iterator_traits<_ForwardIter1>::value_type,
428 typename iterator_traits<_ForwardIter2>::value_type>)
430 // Test for empty ranges
431 if (__first1 == __last1 || __first2 == __last2)
434 // Test for a pattern of length 1.
435 _ForwardIter2 __tmp(__first2);
437 if (__tmp == __last2) {
438 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
445 _ForwardIter2 __p1, __p;
447 __p1 = __first2; ++__p1;
449 _ForwardIter1 __current = __first1;
451 while (__first1 != __last1) {
452 while (__first1 != __last1) {
453 if (__predicate(*__first1, *__first2))
457 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
459 if (__first1 == __last1)
463 __current = __first1;
464 if (++__current == __last1) return __last1;
466 while (__predicate(*__current, *__p)) {
467 if (++__p == __last2)
469 if (++__current == __last1)
478 // search_n. Search for __count consecutive copies of __val.
480 template<typename _ForwardIter, typename _Integer, typename _Tp>
482 search_n(_ForwardIter __first, _ForwardIter __last,
483 _Integer __count, const _Tp& __val)
485 // concept requirements
486 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
487 __glibcpp_function_requires(_EqualityComparableConcept<
488 typename iterator_traits<_ForwardIter>::value_type>)
489 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>)
494 __first = find(__first, __last, __val);
495 while (__first != __last) {
496 _Integer __n = __count - 1;
497 _ForwardIter __i = __first;
499 while (__i != __last && __n != 0 && *__i == __val) {
506 __first = find(__i, __last, __val);
512 template<typename _ForwardIter, typename _Integer, typename _Tp,
513 typename _BinaryPred>
515 search_n(_ForwardIter __first, _ForwardIter __last,
516 _Integer __count, const _Tp& __val,
517 _BinaryPred __binary_pred)
519 // concept requirements
520 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
521 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
522 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
527 while (__first != __last) {
528 if (__binary_pred(*__first, __val))
532 while (__first != __last) {
533 _Integer __n = __count - 1;
534 _ForwardIter __i = __first;
536 while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
543 while (__i != __last) {
544 if (__binary_pred(*__i, __val))
557 template<typename _ForwardIter1, typename _ForwardIter2>
559 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
560 _ForwardIter2 __first2)
562 // concept requirements
563 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter1>)
564 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter2>)
565 __glibcpp_function_requires(_ConvertibleConcept<
566 typename iterator_traits<_ForwardIter1>::value_type,
567 typename iterator_traits<_ForwardIter2>::value_type>)
568 __glibcpp_function_requires(_ConvertibleConcept<
569 typename iterator_traits<_ForwardIter2>::value_type,
570 typename iterator_traits<_ForwardIter1>::value_type>)
572 for ( ; __first1 != __last1; ++__first1, ++__first2)
573 iter_swap(__first1, __first2);
579 template<typename _InputIter, typename _OutputIter, typename _UnaryOperation>
581 transform(_InputIter __first, _InputIter __last,
582 _OutputIter __result, _UnaryOperation __unary_op)
584 // concept requirements
585 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
587 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
588 // should be "the type returned by _UnaryOperation"
589 typename iterator_traits<_InputIter>::value_type>)
592 for ( ; __first != __last; ++__first, ++__result)
593 *__result = __unary_op(*__first);
597 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
598 typename _BinaryOperation>
600 transform(_InputIter1 __first1, _InputIter1 __last1,
601 _InputIter2 __first2, _OutputIter __result,
602 _BinaryOperation __binary_op)
604 // concept requirements
605 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
606 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
608 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
609 // should be "the type returned by _BinaryOperation"
610 typename iterator_traits<_InputIter1>::value_type>)
613 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
614 *__result = __binary_op(*__first1, *__first2);
618 // replace, replace_if, replace_copy, replace_copy_if
620 template<typename _ForwardIter, typename _Tp>
622 replace(_ForwardIter __first, _ForwardIter __last,
623 const _Tp& __old_value, const _Tp& __new_value)
625 // concept requirements
626 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
627 __glibcpp_function_requires(_EqualOpConcept<
628 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
629 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
630 typename iterator_traits<_ForwardIter>::value_type>)
632 for ( ; __first != __last; ++__first)
633 if (*__first == __old_value)
634 *__first = __new_value;
637 template<typename _ForwardIter, typename _Predicate, typename _Tp>
639 replace_if(_ForwardIter __first, _ForwardIter __last,
640 _Predicate __pred, const _Tp& __new_value)
642 // concept requirements
643 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
644 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
645 typename iterator_traits<_ForwardIter>::value_type>)
646 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
647 typename iterator_traits<_ForwardIter>::value_type>)
649 for ( ; __first != __last; ++__first)
650 if (__pred(*__first))
651 *__first = __new_value;
654 template<typename _InputIter, typename _OutputIter, typename _Tp>
656 replace_copy(_InputIter __first, _InputIter __last,
657 _OutputIter __result,
658 const _Tp& __old_value, const _Tp& __new_value)
660 // concept requirements
661 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
662 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
663 typename iterator_traits<_InputIter>::value_type>)
664 __glibcpp_function_requires(_EqualOpConcept<
665 typename iterator_traits<_InputIter>::value_type, _Tp>)
667 for ( ; __first != __last; ++__first, ++__result)
668 *__result = *__first == __old_value ? __new_value : *__first;
672 template<typename _InputIter, typename _OutputIter, typename _Predicate,
675 replace_copy_if(_InputIter __first, _InputIter __last,
676 _OutputIter __result,
677 _Predicate __pred, const _Tp& __new_value)
679 // concept requirements
680 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
681 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
682 typename iterator_traits<_InputIter>::value_type>)
683 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
684 typename iterator_traits<_InputIter>::value_type>)
686 for ( ; __first != __last; ++__first, ++__result)
687 *__result = __pred(*__first) ? __new_value : *__first;
691 // generate and generate_n
693 template<typename _ForwardIter, typename _Generator>
695 generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
697 // concept requirements
698 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
699 __glibcpp_function_requires(_GeneratorConcept<_Generator,
700 typename iterator_traits<_ForwardIter>::value_type>)
702 for ( ; __first != __last; ++__first)
706 template<typename _OutputIter, typename _Size, typename _Generator>
708 generate_n(_OutputIter __first, _Size __n, _Generator __gen)
711 // XXX concept requirements
712 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
713 "the return type of _Generator" ?? >)
716 for ( ; __n > 0; --__n, ++__first)
721 // remove, remove_if, remove_copy, remove_copy_if
723 template<typename _InputIter, typename _OutputIter, typename _Tp>
725 remove_copy(_InputIter __first, _InputIter __last,
726 _OutputIter __result, const _Tp& __value)
728 // concept requirements
729 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
730 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
731 typename iterator_traits<_InputIter>::value_type>)
732 __glibcpp_function_requires(_EqualOpConcept<
733 typename iterator_traits<_InputIter>::value_type, _Tp>)
735 for ( ; __first != __last; ++__first)
736 if (!(*__first == __value)) {
737 *__result = *__first;
743 template<typename _InputIter, typename _OutputIter, typename _Predicate>
745 remove_copy_if(_InputIter __first, _InputIter __last,
746 _OutputIter __result, _Predicate __pred)
748 // concept requirements
749 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
750 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
751 typename iterator_traits<_InputIter>::value_type>)
752 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
753 typename iterator_traits<_InputIter>::value_type>)
755 for ( ; __first != __last; ++__first)
756 if (!__pred(*__first)) {
757 *__result = *__first;
763 template<typename _ForwardIter, typename _Tp>
765 remove(_ForwardIter __first, _ForwardIter __last,
768 // concept requirements
769 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
770 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
771 typename iterator_traits<_ForwardIter>::value_type>)
772 __glibcpp_function_requires(_EqualOpConcept<
773 typename iterator_traits<_ForwardIter>::value_type, _Tp>)
775 __first = find(__first, __last, __value);
776 _ForwardIter __i = __first;
777 return __first == __last ? __first
778 : remove_copy(++__i, __last, __first, __value);
781 template<typename _ForwardIter, typename _Predicate>
783 remove_if(_ForwardIter __first, _ForwardIter __last,
786 // concept requirements
787 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
788 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
789 typename iterator_traits<_ForwardIter>::value_type>)
791 __first = find_if(__first, __last, __pred);
792 _ForwardIter __i = __first;
793 return __first == __last ? __first
794 : remove_copy_if(++__i, __last, __first, __pred);
797 template<typename _InputIter, typename _OutputIter>
799 __unique_copy(_InputIter __first, _InputIter __last,
800 _OutputIter __result,
803 // concept requirements -- taken care of in dispatching function
804 typename iterator_traits<_InputIter>::value_type __value = *__first;
806 while (++__first != __last)
807 if (!(__value == *__first)) {
809 *++__result = __value;
814 template<typename _InputIter, typename _ForwardIter>
816 __unique_copy(_InputIter __first, _InputIter __last,
817 _ForwardIter __result,
818 forward_iterator_tag)
820 // concept requirements -- taken care of in dispatching function
821 *__result = *__first;
822 while (++__first != __last)
823 if (!(*__result == *__first))
824 *++__result = *__first;
828 template<typename _InputIter, typename _OutputIter>
830 unique_copy(_InputIter __first, _InputIter __last,
831 _OutputIter __result)
833 // concept requirements
834 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
835 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
836 typename iterator_traits<_InputIter>::value_type>)
837 __glibcpp_function_requires(_EqualityComparableConcept<
838 typename iterator_traits<_InputIter>::value_type>)
840 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
842 if (__first == __last) return __result;
843 return __unique_copy(__first, __last, __result, _IterType());
846 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
848 __unique_copy(_InputIter __first, _InputIter __last,
849 _OutputIter __result,
850 _BinaryPredicate __binary_pred,
853 // concept requirements -- iterators already checked
854 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
855 typename iterator_traits<_InputIter>::value_type,
856 typename iterator_traits<_InputIter>::value_type>)
858 typename iterator_traits<_InputIter>::value_type __value = *__first;
860 while (++__first != __last)
861 if (!__binary_pred(__value, *__first)) {
863 *++__result = __value;
868 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
870 __unique_copy(_InputIter __first, _InputIter __last,
871 _ForwardIter __result,
872 _BinaryPredicate __binary_pred,
873 forward_iterator_tag)
875 // concept requirements -- iterators already checked
876 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
877 typename iterator_traits<_ForwardIter>::value_type,
878 typename iterator_traits<_InputIter>::value_type>)
880 *__result = *__first;
881 while (++__first != __last)
882 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
886 template<typename _InputIter, typename _OutputIter, typename _BinaryPredicate>
888 unique_copy(_InputIter __first, _InputIter __last,
889 _OutputIter __result,
890 _BinaryPredicate __binary_pred)
892 // concept requirements -- predicates checked later
893 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
894 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
895 typename iterator_traits<_InputIter>::value_type>)
897 typedef typename iterator_traits<_OutputIter>::iterator_category _IterType;
899 if (__first == __last) return __result;
900 return __unique_copy(__first, __last,
901 __result, __binary_pred, _IterType());
904 template<typename _ForwardIter>
906 unique(_ForwardIter __first, _ForwardIter __last)
908 // concept requirements
909 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
910 __glibcpp_function_requires(_EqualityComparableConcept<
911 typename iterator_traits<_ForwardIter>::value_type>)
913 __first = adjacent_find(__first, __last);
914 return unique_copy(__first, __last, __first);
917 template<typename _ForwardIter, typename _BinaryPredicate>
919 unique(_ForwardIter __first, _ForwardIter __last,
920 _BinaryPredicate __binary_pred)
922 // concept requirements
923 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
924 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
925 typename iterator_traits<_ForwardIter>::value_type,
926 typename iterator_traits<_ForwardIter>::value_type>)
928 __first = adjacent_find(__first, __last, __binary_pred);
929 return unique_copy(__first, __last, __first, __binary_pred);
932 template<typename _BidirectionalIter>
934 __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
935 bidirectional_iterator_tag)
938 if (__first == __last || __first == --__last)
941 iter_swap(__first++, __last);
944 template<typename _RandomAccessIter>
946 __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
947 random_access_iterator_tag)
949 while (__first < __last)
950 iter_swap(__first++, --__last);
953 template<typename _BidirectionalIter>
955 reverse(_BidirectionalIter __first, _BidirectionalIter __last)
957 // concept requirements
958 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
960 __reverse(__first, __last, __iterator_category(__first));
963 template<typename _BidirectionalIter, typename _OutputIter>
965 reverse_copy(_BidirectionalIter __first, _BidirectionalIter __last,
966 _OutputIter __result)
968 // concept requirements
969 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
970 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
971 typename iterator_traits<_BidirectionalIter>::value_type>)
973 while (__first != __last) {
981 /// This is a helper function for the rotate algorithm specialized on RAIs.
983 template<typename _EuclideanRingElement>
984 _EuclideanRingElement
985 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
988 _EuclideanRingElement __t = __m % __n;
995 template<typename _ForwardIter>
997 __rotate(_ForwardIter __first,
998 _ForwardIter __middle,
1000 forward_iterator_tag)
1002 if ((__first == __middle) || (__last == __middle))
1005 _ForwardIter __first2 = __middle;
1007 swap(*__first++, *__first2++);
1008 if (__first == __middle)
1009 __middle = __first2;
1010 } while (__first2 != __last);
1012 __first2 = __middle;
1014 while (__first2 != __last) {
1015 swap(*__first++, *__first2++);
1016 if (__first == __middle)
1017 __middle = __first2;
1018 else if (__first2 == __last)
1019 __first2 = __middle;
1023 template<typename _BidirectionalIter>
1025 __rotate(_BidirectionalIter __first,
1026 _BidirectionalIter __middle,
1027 _BidirectionalIter __last,
1028 bidirectional_iterator_tag)
1030 // concept requirements
1031 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
1032 _BidirectionalIter>)
1034 if ((__first == __middle) || (__last == __middle))
1037 __reverse(__first, __middle, bidirectional_iterator_tag());
1038 __reverse(__middle, __last, bidirectional_iterator_tag());
1040 while (__first != __middle && __middle != __last)
1041 swap (*__first++, *--__last);
1043 if (__first == __middle) {
1044 __reverse(__middle, __last, bidirectional_iterator_tag());
1047 __reverse(__first, __middle, bidirectional_iterator_tag());
1051 template<typename _RandomAccessIter>
1053 __rotate(_RandomAccessIter __first,
1054 _RandomAccessIter __middle,
1055 _RandomAccessIter __last,
1056 random_access_iterator_tag)
1058 // concept requirements
1059 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1062 if ((__first == __middle) || (__last == __middle))
1065 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1066 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1068 _Distance __n = __last - __first;
1069 _Distance __k = __middle - __first;
1070 _Distance __l = __n - __k;
1073 swap_ranges(__first, __middle, __middle);
1077 _Distance __d = __gcd(__n, __k);
1079 for (_Distance __i = 0; __i < __d; __i++) {
1080 _ValueType __tmp = *__first;
1081 _RandomAccessIter __p = __first;
1084 for (_Distance __j = 0; __j < __l/__d; __j++) {
1085 if (__p > __first + __l) {
1086 *__p = *(__p - __l);
1090 *__p = *(__p + __k);
1096 for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
1097 if (__p < __last - __k) {
1098 *__p = *(__p + __k);
1102 *__p = * (__p - __l);
1112 template<typename _ForwardIter>
1114 rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last)
1116 // concept requirements
1117 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1119 typedef typename iterator_traits<_ForwardIter>::iterator_category _IterType;
1120 __rotate(__first, __middle, __last, _IterType());
1123 template<typename _ForwardIter, typename _OutputIter>
1125 rotate_copy(_ForwardIter __first, _ForwardIter __middle,
1126 _ForwardIter __last, _OutputIter __result)
1128 // concept requirements
1129 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1130 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1131 typename iterator_traits<_ForwardIter>::value_type>)
1133 return copy(__first, __middle, copy(__middle, __last, __result));
1136 // Return a random number in the range [0, __n). This function encapsulates
1137 // whether we're using rand (part of the standard C library) or lrand48
1138 // (not standard, but a much better choice whenever it's available).
1139 template<typename _Distance>
1141 __random_number(_Distance __n)
1143 #ifdef _GLIBCPP_HAVE_DRAND48
1144 return lrand48() % __n;
1146 return rand() % __n;
1150 /// 25.2.11 random_shuffle().
1152 template<typename _RandomAccessIter>
1154 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last)
1156 // concept requirements
1157 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1160 if (__first == __last) return;
1161 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1162 iter_swap(__i, __first + __random_number((__i - __first) + 1));
1165 template<typename _RandomAccessIter, typename _RandomNumberGenerator>
1167 random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
1168 _RandomNumberGenerator& __rand)
1170 // concept requirements
1171 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1174 if (__first == __last) return;
1175 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1176 iter_swap(__i, __first + __rand((__i - __first) + 1));
1179 // random_sample and random_sample_n (extensions, not part of the standard).
1181 template<typename _ForwardIter, typename _OutputIter, typename _Distance>
1183 random_sample_n(_ForwardIter __first, _ForwardIter __last,
1184 _OutputIter __out, const _Distance __n)
1186 // concept requirements
1187 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1188 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1189 typename iterator_traits<_ForwardIter>::value_type>)
1191 _Distance __remaining = distance(__first, __last);
1192 _Distance __m = min(__n, __remaining);
1195 if (__random_number(__remaining) < __m) {
1207 template<typename _ForwardIter, typename _OutputIter, typename _Distance,
1208 typename _RandomNumberGenerator>
1210 random_sample_n(_ForwardIter __first, _ForwardIter __last,
1211 _OutputIter __out, const _Distance __n,
1212 _RandomNumberGenerator& __rand)
1214 // concept requirements
1215 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
1216 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1217 typename iterator_traits<_ForwardIter>::value_type>)
1218 __glibcpp_function_requires(_UnaryFunctionConcept<
1219 _RandomNumberGenerator, _Distance, _Distance>)
1221 _Distance __remaining = distance(__first, __last);
1222 _Distance __m = min(__n, __remaining);
1225 if (__rand(__remaining) < __m) {
1237 template<typename _InputIter, typename _RandomAccessIter, typename _Distance>
1239 __random_sample(_InputIter __first, _InputIter __last,
1240 _RandomAccessIter __out,
1241 const _Distance __n)
1244 _Distance __t = __n;
1245 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1246 __out[__m] = *__first;
1248 while (__first != __last) {
1250 _Distance __M = __random_number(__t);
1252 __out[__M] = *__first;
1259 template<typename _InputIter, typename _RandomAccessIter,
1260 typename _RandomNumberGenerator, typename _Distance>
1262 __random_sample(_InputIter __first, _InputIter __last,
1263 _RandomAccessIter __out,
1264 _RandomNumberGenerator& __rand,
1265 const _Distance __n)
1267 // concept requirements
1268 __glibcpp_function_requires(_UnaryFunctionConcept<
1269 _RandomNumberGenerator, _Distance, _Distance>)
1272 _Distance __t = __n;
1273 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1274 __out[__m] = *__first;
1276 while (__first != __last) {
1278 _Distance __M = __rand(__t);
1280 __out[__M] = *__first;
1287 template<typename _InputIter, typename _RandomAccessIter>
1288 inline _RandomAccessIter
1289 random_sample(_InputIter __first, _InputIter __last,
1290 _RandomAccessIter __out_first, _RandomAccessIter __out_last)
1292 // concept requirements
1293 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1294 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1297 return __random_sample(__first, __last,
1298 __out_first, __out_last - __out_first);
1302 template<typename _InputIter, typename _RandomAccessIter,
1303 typename _RandomNumberGenerator>
1304 inline _RandomAccessIter
1305 random_sample(_InputIter __first, _InputIter __last,
1306 _RandomAccessIter __out_first, _RandomAccessIter __out_last,
1307 _RandomNumberGenerator& __rand)
1309 // concept requirements
1310 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1311 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1314 return __random_sample(__first, __last,
1315 __out_first, __rand,
1316 __out_last - __out_first);
1319 // partition, stable_partition, and their auxiliary functions
1321 template<typename _ForwardIter, typename _Predicate>
1323 __partition(_ForwardIter __first, _ForwardIter __last,
1325 forward_iterator_tag)
1327 if (__first == __last) return __first;
1329 while (__pred(*__first))
1330 if (++__first == __last) return __first;
1332 _ForwardIter __next = __first;
1334 while (++__next != __last)
1335 if (__pred(*__next)) {
1336 swap(*__first, *__next);
1343 template<typename _BidirectionalIter, typename _Predicate>
1345 __partition(_BidirectionalIter __first, _BidirectionalIter __last,
1347 bidirectional_iterator_tag)
1351 if (__first == __last)
1353 else if (__pred(*__first))
1359 if (__first == __last)
1361 else if (!__pred(*__last))
1365 iter_swap(__first, __last);
1370 template<typename _ForwardIter, typename _Predicate>
1372 partition(_ForwardIter __first, _ForwardIter __last,
1375 // concept requirements
1376 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1377 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1378 typename iterator_traits<_ForwardIter>::value_type>)
1380 return __partition(__first, __last, __pred, __iterator_category(__first));
1384 template<typename _ForwardIter, typename _Predicate, typename _Distance>
1386 __inplace_stable_partition(_ForwardIter __first, _ForwardIter __last,
1387 _Predicate __pred, _Distance __len)
1390 return __pred(*__first) ? __last : __first;
1391 _ForwardIter __middle = __first;
1392 advance(__middle, __len / 2);
1393 _ForwardIter __begin = __inplace_stable_partition(__first, __middle,
1396 _ForwardIter __end = __inplace_stable_partition(__middle, __last,
1399 rotate(__begin, __middle, __end);
1400 advance(__begin, distance(__middle, __end));
1404 template<typename _ForwardIter, typename _Pointer, typename _Predicate,
1407 __stable_partition_adaptive(_ForwardIter __first, _ForwardIter __last,
1408 _Predicate __pred, _Distance __len,
1410 _Distance __buffer_size)
1412 if (__len <= __buffer_size) {
1413 _ForwardIter __result1 = __first;
1414 _Pointer __result2 = __buffer;
1415 for ( ; __first != __last ; ++__first)
1416 if (__pred(*__first)) {
1417 *__result1 = *__first;
1421 *__result2 = *__first;
1424 copy(__buffer, __result2, __result1);
1428 _ForwardIter __middle = __first;
1429 advance(__middle, __len / 2);
1430 _ForwardIter __begin = __stable_partition_adaptive(__first, __middle,
1433 __buffer, __buffer_size);
1434 _ForwardIter __end = __stable_partition_adaptive( __middle, __last,
1437 __buffer, __buffer_size);
1438 rotate(__begin, __middle, __end);
1439 advance(__begin, distance(__middle, __end));
1444 template<typename _ForwardIter, typename _Predicate>
1446 stable_partition(_ForwardIter __first, _ForwardIter __last,
1449 // concept requirements
1450 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>)
1451 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1452 typename iterator_traits<_ForwardIter>::value_type>)
1454 if (__first == __last)
1458 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
1459 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
1461 _Temporary_buffer<_ForwardIter, _ValueType> __buf(__first, __last);
1462 if (__buf.size() > 0)
1463 return __stable_partition_adaptive(__first, __last, __pred,
1464 _DistanceType(__buf.requested_size()),
1465 __buf.begin(), __buf.size());
1467 return __inplace_stable_partition(__first, __last, __pred,
1468 _DistanceType(__buf.requested_size()));
1472 template<typename _RandomAccessIter, typename _Tp>
1474 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1478 while (*__first < __pivot)
1481 while (__pivot < *__last)
1483 if (!(__first < __last))
1485 iter_swap(__first, __last);
1490 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1492 __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,
1493 _Tp __pivot, _Compare __comp)
1496 while (__comp(*__first, __pivot))
1499 while (__comp(__pivot, *__last))
1501 if (!(__first < __last))
1503 iter_swap(__first, __last);
1508 const int __stl_threshold = 16;
1510 // sort() and its auxiliary functions.
1512 template<typename _RandomAccessIter, typename _Tp>
1514 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
1516 _RandomAccessIter __next = __last;
1518 while (__val < *__next) {
1526 template<typename _RandomAccessIter, typename _Tp, typename _Compare>
1528 __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, _Compare __comp)
1530 _RandomAccessIter __next = __last;
1532 while (__comp(__val, *__next)) {
1540 template<typename _RandomAccessIter>
1542 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1544 if (__first == __last) return;
1546 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1548 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1549 if (__val < *__first) {
1550 copy_backward(__first, __i, __i + 1);
1554 __unguarded_linear_insert(__i, __val);
1558 template<typename _RandomAccessIter, typename _Compare>
1560 __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1563 if (__first == __last) return;
1565 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1567 typename iterator_traits<_RandomAccessIter>::value_type __val = *__i;
1568 if (__comp(__val, *__first)) {
1569 copy_backward(__first, __i, __i + 1);
1573 __unguarded_linear_insert(__i, __val, __comp);
1577 template<typename _RandomAccessIter>
1579 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1581 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1583 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1584 __unguarded_linear_insert(__i, _ValueType(*__i));
1587 template<typename _RandomAccessIter, typename _Compare>
1589 __unguarded_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1592 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1594 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1595 __unguarded_linear_insert(__i, _ValueType(*__i), __comp);
1598 template<typename _RandomAccessIter>
1600 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1602 if (__last - __first > __stl_threshold) {
1603 __insertion_sort(__first, __first + __stl_threshold);
1604 __unguarded_insertion_sort(__first + __stl_threshold, __last);
1607 __insertion_sort(__first, __last);
1610 template<typename _RandomAccessIter, typename _Compare>
1612 __final_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1615 if (__last - __first > __stl_threshold) {
1616 __insertion_sort(__first, __first + __stl_threshold, __comp);
1617 __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
1620 __insertion_sort(__first, __last, __comp);
1623 template<typename _Size>
1628 for (__k = 0; __n != 1; __n >>= 1) ++__k;
1632 template<typename _RandomAccessIter, typename _Size>
1634 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1635 _Size __depth_limit)
1637 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1639 while (__last - __first > __stl_threshold) {
1640 if (__depth_limit == 0) {
1641 partial_sort(__first, __last, __last);
1645 _RandomAccessIter __cut =
1646 __unguarded_partition(__first, __last,
1647 _ValueType(__median(*__first,
1648 *(__first + (__last - __first)/2),
1650 __introsort_loop(__cut, __last, __depth_limit);
1655 template<typename _RandomAccessIter, typename _Size, typename _Compare>
1657 __introsort_loop(_RandomAccessIter __first, _RandomAccessIter __last,
1658 _Size __depth_limit, _Compare __comp)
1660 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1662 while (__last - __first > __stl_threshold) {
1663 if (__depth_limit == 0) {
1664 partial_sort(__first, __last, __last, __comp);
1668 _RandomAccessIter __cut =
1669 __unguarded_partition(__first, __last,
1670 _ValueType(__median(*__first,
1671 *(__first + (__last - __first)/2),
1672 *(__last - 1), __comp)),
1674 __introsort_loop(__cut, __last, __depth_limit, __comp);
1679 template<typename _RandomAccessIter>
1681 sort(_RandomAccessIter __first, _RandomAccessIter __last)
1683 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1685 // concept requirements
1686 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1688 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1690 if (__first != __last) {
1691 __introsort_loop(__first, __last, __lg(__last - __first) * 2);
1692 __final_insertion_sort(__first, __last);
1696 template<typename _RandomAccessIter, typename _Compare>
1698 sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1700 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1702 // concept requirements
1703 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1705 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _ValueType>)
1707 if (__first != __last) {
1708 __introsort_loop(__first, __last, __lg(__last - __first) * 2, __comp);
1709 __final_insertion_sort(__first, __last, __comp);
1713 // stable_sort() and its auxiliary functions.
1715 template<typename _RandomAccessIter>
1717 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1719 if (__last - __first < 15) {
1720 __insertion_sort(__first, __last);
1723 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1724 __inplace_stable_sort(__first, __middle);
1725 __inplace_stable_sort(__middle, __last);
1726 __merge_without_buffer(__first, __middle, __last,
1731 template<typename _RandomAccessIter, typename _Compare>
1733 __inplace_stable_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1736 if (__last - __first < 15) {
1737 __insertion_sort(__first, __last, __comp);
1740 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1741 __inplace_stable_sort(__first, __middle, __comp);
1742 __inplace_stable_sort(__middle, __last, __comp);
1743 __merge_without_buffer(__first, __middle, __last,
1749 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1752 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1753 _RandomAccessIter2 __result, _Distance __step_size)
1755 _Distance __two_step = 2 * __step_size;
1757 while (__last - __first >= __two_step) {
1758 __result = merge(__first, __first + __step_size,
1759 __first + __step_size, __first + __two_step,
1761 __first += __two_step;
1764 __step_size = min(_Distance(__last - __first), __step_size);
1765 merge(__first, __first + __step_size, __first + __step_size, __last,
1769 template<typename _RandomAccessIter1, typename _RandomAccessIter2,
1770 typename _Distance, typename _Compare>
1772 __merge_sort_loop(_RandomAccessIter1 __first, _RandomAccessIter1 __last,
1773 _RandomAccessIter2 __result, _Distance __step_size,
1776 _Distance __two_step = 2 * __step_size;
1778 while (__last - __first >= __two_step) {
1779 __result = merge(__first, __first + __step_size,
1780 __first + __step_size, __first + __two_step,
1783 __first += __two_step;
1785 __step_size = min(_Distance(__last - __first), __step_size);
1787 merge(__first, __first + __step_size,
1788 __first + __step_size, __last,
1793 const int __stl_chunk_size = 7;
1795 template<typename _RandomAccessIter, typename _Distance>
1797 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1798 _Distance __chunk_size)
1800 while (__last - __first >= __chunk_size) {
1801 __insertion_sort(__first, __first + __chunk_size);
1802 __first += __chunk_size;
1804 __insertion_sort(__first, __last);
1807 template<typename _RandomAccessIter, typename _Distance, typename _Compare>
1809 __chunk_insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last,
1810 _Distance __chunk_size, _Compare __comp)
1812 while (__last - __first >= __chunk_size) {
1813 __insertion_sort(__first, __first + __chunk_size, __comp);
1814 __first += __chunk_size;
1816 __insertion_sort(__first, __last, __comp);
1819 template<typename _RandomAccessIter, typename _Pointer>
1821 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1824 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1826 _Distance __len = __last - __first;
1827 _Pointer __buffer_last = __buffer + __len;
1829 _Distance __step_size = __stl_chunk_size;
1830 __chunk_insertion_sort(__first, __last, __step_size);
1832 while (__step_size < __len) {
1833 __merge_sort_loop(__first, __last, __buffer, __step_size);
1835 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
1840 template<typename _RandomAccessIter, typename _Pointer, typename _Compare>
1842 __merge_sort_with_buffer(_RandomAccessIter __first, _RandomAccessIter __last,
1843 _Pointer __buffer, _Compare __comp)
1845 typedef typename iterator_traits<_RandomAccessIter>::difference_type _Distance;
1847 _Distance __len = __last - __first;
1848 _Pointer __buffer_last = __buffer + __len;
1850 _Distance __step_size = __stl_chunk_size;
1851 __chunk_insertion_sort(__first, __last, __step_size, __comp);
1853 while (__step_size < __len) {
1854 __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
1856 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
1861 template<typename _RandomAccessIter, typename _Pointer, typename _Distance>
1863 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1864 _Pointer __buffer, _Distance __buffer_size)
1866 _Distance __len = (__last - __first + 1) / 2;
1867 _RandomAccessIter __middle = __first + __len;
1868 if (__len > __buffer_size) {
1869 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
1870 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
1873 __merge_sort_with_buffer(__first, __middle, __buffer);
1874 __merge_sort_with_buffer(__middle, __last, __buffer);
1876 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1877 _Distance(__last - __middle), __buffer, __buffer_size);
1880 template<typename _RandomAccessIter, typename _Pointer, typename _Distance,
1883 __stable_sort_adaptive(_RandomAccessIter __first, _RandomAccessIter __last,
1884 _Pointer __buffer, _Distance __buffer_size,
1887 _Distance __len = (__last - __first + 1) / 2;
1888 _RandomAccessIter __middle = __first + __len;
1889 if (__len > __buffer_size) {
1890 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
1892 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
1896 __merge_sort_with_buffer(__first, __middle, __buffer, __comp);
1897 __merge_sort_with_buffer(__middle, __last, __buffer, __comp);
1899 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1900 _Distance(__last - __middle), __buffer, __buffer_size,
1904 template<typename _RandomAccessIter>
1906 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1908 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1909 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1911 // concept requirements
1912 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1914 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1916 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1917 if (buf.begin() == 0)
1918 __inplace_stable_sort(__first, __last);
1920 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()));
1923 template<typename _RandomAccessIter, typename _Compare>
1925 stable_sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp)
1927 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1928 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1930 // concept requirements
1931 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1933 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1934 _ValueType, _ValueType>)
1936 _Temporary_buffer<_RandomAccessIter, _ValueType> buf(__first, __last);
1937 if (buf.begin() == 0)
1938 __inplace_stable_sort(__first, __last, __comp);
1940 __stable_sort_adaptive(__first, __last, buf.begin(), _DistanceType(buf.size()),
1944 template<typename _RandomAccessIter>
1946 partial_sort(_RandomAccessIter __first,
1947 _RandomAccessIter __middle,
1948 _RandomAccessIter __last)
1950 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1952 // concept requirements
1953 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1955 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
1957 make_heap(__first, __middle);
1958 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1959 if (*__i < *__first)
1960 __pop_heap(__first, __middle, __i, _ValueType(*__i));
1961 sort_heap(__first, __middle);
1964 template<typename _RandomAccessIter, typename _Compare>
1966 partial_sort(_RandomAccessIter __first,
1967 _RandomAccessIter __middle,
1968 _RandomAccessIter __last,
1971 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
1973 // concept requirements
1974 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1976 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1977 _ValueType, _ValueType>)
1979 make_heap(__first, __middle, __comp);
1980 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1981 if (__comp(*__i, *__first))
1982 __pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
1983 sort_heap(__first, __middle, __comp);
1986 template<typename _InputIter, typename _RandomAccessIter>
1988 partial_sort_copy(_InputIter __first, _InputIter __last,
1989 _RandomAccessIter __result_first,
1990 _RandomAccessIter __result_last)
1992 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
1993 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
1994 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
1996 // concept requirements
1997 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
1998 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
1999 __glibcpp_function_requires(_LessThanComparableConcept<_OutputValueType>)
2000 __glibcpp_function_requires(_LessThanComparableConcept<_InputValueType>)
2002 if (__result_first == __result_last) return __result_last;
2003 _RandomAccessIter __result_real_last = __result_first;
2004 while(__first != __last && __result_real_last != __result_last) {
2005 *__result_real_last = *__first;
2006 ++__result_real_last;
2009 make_heap(__result_first, __result_real_last);
2010 while (__first != __last) {
2011 if (*__first < *__result_first)
2012 __adjust_heap(__result_first, _DistanceType(0),
2013 _DistanceType(__result_real_last - __result_first),
2014 _InputValueType(*__first));
2017 sort_heap(__result_first, __result_real_last);
2018 return __result_real_last;
2021 template<typename _InputIter, typename _RandomAccessIter, typename _Compare>
2023 partial_sort_copy(_InputIter __first, _InputIter __last,
2024 _RandomAccessIter __result_first,
2025 _RandomAccessIter __result_last,
2028 typedef typename iterator_traits<_InputIter>::value_type _InputValueType;
2029 typedef typename iterator_traits<_RandomAccessIter>::value_type _OutputValueType;
2030 typedef typename iterator_traits<_RandomAccessIter>::difference_type _DistanceType;
2032 // concept requirements
2033 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
2034 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
2035 __glibcpp_function_requires(_ConvertibleConcept<_InputValueType, _OutputValueType>)
2036 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2037 _OutputValueType, _OutputValueType>)
2039 if (__result_first == __result_last) return __result_last;
2040 _RandomAccessIter __result_real_last = __result_first;
2041 while(__first != __last && __result_real_last != __result_last) {
2042 *__result_real_last = *__first;
2043 ++__result_real_last;
2046 make_heap(__result_first, __result_real_last, __comp);
2047 while (__first != __last) {
2048 if (__comp(*__first, *__result_first))
2049 __adjust_heap(__result_first, _DistanceType(0),
2050 _DistanceType(__result_real_last - __result_first),
2051 _InputValueType(*__first),
2055 sort_heap(__result_first, __result_real_last, __comp);
2056 return __result_real_last;
2059 template<typename _RandomAccessIter>
2061 nth_element(_RandomAccessIter __first,
2062 _RandomAccessIter __nth,
2063 _RandomAccessIter __last)
2065 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
2067 // concept requirements
2068 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
2069 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
2071 while (__last - __first > 3) {
2072 _RandomAccessIter __cut =
2073 __unguarded_partition(__first, __last,
2074 _ValueType(__median(*__first,
2075 *(__first + (__last - __first)/2),
2082 __insertion_sort(__first, __last);
2085 template<typename _RandomAccessIter, typename _Compare>
2087 nth_element(_RandomAccessIter __first,
2088 _RandomAccessIter __nth,
2089 _RandomAccessIter __last,
2092 typedef typename iterator_traits<_RandomAccessIter>::value_type _ValueType;
2094 // concept requirements
2095 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIter>)
2096 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2097 _ValueType, _ValueType>)
2099 while (__last - __first > 3) {
2100 _RandomAccessIter __cut =
2101 __unguarded_partition(__first, __last,
2102 _ValueType(__median(*__first,
2103 *(__first + (__last - __first)/2),
2112 __insertion_sort(__first, __last, __comp);
2116 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
2118 template<typename _ForwardIter, typename _Tp>
2120 lower_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2122 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2123 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2125 // concept requirements
2126 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2127 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2128 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2130 _DistanceType __len = distance(__first, __last);
2131 _DistanceType __half;
2132 _ForwardIter __middle;
2135 __half = __len >> 1;
2137 advance(__middle, __half);
2138 if (*__middle < __val) {
2141 __len = __len - __half - 1;
2149 template<typename _ForwardIter, typename _Tp, typename _Compare>
2151 lower_bound(_ForwardIter __first, _ForwardIter __last,
2152 const _Tp& __val, _Compare __comp)
2154 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2155 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2157 // concept requirements
2158 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2159 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2160 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2162 _DistanceType __len = distance(__first, __last);
2163 _DistanceType __half;
2164 _ForwardIter __middle;
2167 __half = __len >> 1;
2169 advance(__middle, __half);
2170 if (__comp(*__middle, __val)) {
2173 __len = __len - __half - 1;
2181 template<typename _ForwardIter, typename _Tp>
2183 upper_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2185 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2186 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2188 // concept requirements
2189 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2190 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2191 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2193 _DistanceType __len = distance(__first, __last);
2194 _DistanceType __half;
2195 _ForwardIter __middle;
2198 __half = __len >> 1;
2200 advance(__middle, __half);
2201 if (__val < *__middle)
2206 __len = __len - __half - 1;
2212 template<typename _ForwardIter, typename _Tp, typename _Compare>
2214 upper_bound(_ForwardIter __first, _ForwardIter __last,
2215 const _Tp& __val, _Compare __comp)
2217 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2218 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2220 // concept requirements
2221 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2222 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2223 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2225 _DistanceType __len = distance(__first, __last);
2226 _DistanceType __half;
2227 _ForwardIter __middle;
2230 __half = __len >> 1;
2232 advance(__middle, __half);
2233 if (__comp(__val, *__middle))
2238 __len = __len - __half - 1;
2244 template<typename _ForwardIter, typename _Tp>
2245 pair<_ForwardIter, _ForwardIter>
2246 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2248 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2249 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2251 // concept requirements
2252 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2253 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2254 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2256 _DistanceType __len = distance(__first, __last);
2257 _DistanceType __half;
2258 _ForwardIter __middle, __left, __right;
2261 __half = __len >> 1;
2263 advance(__middle, __half);
2264 if (*__middle < __val) {
2267 __len = __len - __half - 1;
2269 else if (__val < *__middle)
2272 __left = lower_bound(__first, __middle, __val);
2273 advance(__first, __len);
2274 __right = upper_bound(++__middle, __first, __val);
2275 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2278 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2281 template<typename _ForwardIter, typename _Tp, typename _Compare>
2282 pair<_ForwardIter, _ForwardIter>
2283 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2286 typedef typename iterator_traits<_ForwardIter>::value_type _ValueType;
2287 typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
2289 // concept requirements
2290 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2291 __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
2292 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2294 _DistanceType __len = distance(__first, __last);
2295 _DistanceType __half;
2296 _ForwardIter __middle, __left, __right;
2299 __half = __len >> 1;
2301 advance(__middle, __half);
2302 if (__comp(*__middle, __val)) {
2305 __len = __len - __half - 1;
2307 else if (__comp(__val, *__middle))
2310 __left = lower_bound(__first, __middle, __val, __comp);
2311 advance(__first, __len);
2312 __right = upper_bound(++__middle, __first, __val, __comp);
2313 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2316 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2319 template<typename _ForwardIter, typename _Tp>
2321 binary_search(_ForwardIter __first, _ForwardIter __last,
2324 // concept requirements
2325 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2326 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2327 typename iterator_traits<_ForwardIter>::value_type>)
2328 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
2330 _ForwardIter __i = lower_bound(__first, __last, __val);
2331 return __i != __last && !(__val < *__i);
2334 template<typename _ForwardIter, typename _Tp, typename _Compare>
2336 binary_search(_ForwardIter __first, _ForwardIter __last,
2337 const _Tp& __val, _Compare __comp)
2339 // concept requirements
2340 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
2341 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2342 typename iterator_traits<_ForwardIter>::value_type>)
2343 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
2345 _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
2346 return __i != __last && !__comp(__val, *__i);
2349 // merge, with and without an explicitly supplied comparison function.
2351 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2353 merge(_InputIter1 __first1, _InputIter1 __last1,
2354 _InputIter2 __first2, _InputIter2 __last2,
2355 _OutputIter __result)
2357 // concept requirements
2358 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2359 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2360 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2361 typename iterator_traits<_InputIter1>::value_type>)
2362 __glibcpp_function_requires(_SameTypeConcept<
2363 typename iterator_traits<_InputIter1>::value_type,
2364 typename iterator_traits<_InputIter2>::value_type>)
2365 __glibcpp_function_requires(_LessThanComparableConcept<
2366 typename iterator_traits<_InputIter1>::value_type>)
2368 while (__first1 != __last1 && __first2 != __last2) {
2369 if (*__first2 < *__first1) {
2370 *__result = *__first2;
2374 *__result = *__first1;
2379 return copy(__first2, __last2, copy(__first1, __last1, __result));
2382 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2385 merge(_InputIter1 __first1, _InputIter1 __last1,
2386 _InputIter2 __first2, _InputIter2 __last2,
2387 _OutputIter __result, _Compare __comp)
2389 // concept requirements
2390 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2391 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2392 __glibcpp_function_requires(_SameTypeConcept<
2393 typename iterator_traits<_InputIter1>::value_type,
2394 typename iterator_traits<_InputIter2>::value_type>)
2395 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2396 typename iterator_traits<_InputIter1>::value_type>)
2397 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2398 typename iterator_traits<_InputIter1>::value_type,
2399 typename iterator_traits<_InputIter2>::value_type>)
2401 while (__first1 != __last1 && __first2 != __last2) {
2402 if (__comp(*__first2, *__first1)) {
2403 *__result = *__first2;
2407 *__result = *__first1;
2412 return copy(__first2, __last2, copy(__first1, __last1, __result));
2415 // inplace_merge and its auxiliary functions.
2417 template<typename _BidirectionalIter, typename _Distance>
2419 __merge_without_buffer(_BidirectionalIter __first,
2420 _BidirectionalIter __middle,
2421 _BidirectionalIter __last,
2422 _Distance __len1, _Distance __len2)
2424 if (__len1 == 0 || __len2 == 0)
2426 if (__len1 + __len2 == 2) {
2427 if (*__middle < *__first)
2428 iter_swap(__first, __middle);
2431 _BidirectionalIter __first_cut = __first;
2432 _BidirectionalIter __second_cut = __middle;
2433 _Distance __len11 = 0;
2434 _Distance __len22 = 0;
2435 if (__len1 > __len2) {
2436 __len11 = __len1 / 2;
2437 advance(__first_cut, __len11);
2438 __second_cut = lower_bound(__middle, __last, *__first_cut);
2439 __len22 = distance(__middle, __second_cut);
2442 __len22 = __len2 / 2;
2443 advance(__second_cut, __len22);
2444 __first_cut = upper_bound(__first, __middle, *__second_cut);
2445 __len11 = distance(__first, __first_cut);
2447 rotate(__first_cut, __middle, __second_cut);
2448 _BidirectionalIter __new_middle = __first_cut;
2449 advance(__new_middle, distance(__middle, __second_cut));
2450 __merge_without_buffer(__first, __first_cut, __new_middle,
2452 __merge_without_buffer(__new_middle, __second_cut, __last,
2453 __len1 - __len11, __len2 - __len22);
2456 template<typename _BidirectionalIter, typename _Distance, typename _Compare>
2458 __merge_without_buffer(_BidirectionalIter __first,
2459 _BidirectionalIter __middle,
2460 _BidirectionalIter __last,
2461 _Distance __len1, _Distance __len2,
2464 if (__len1 == 0 || __len2 == 0)
2466 if (__len1 + __len2 == 2) {
2467 if (__comp(*__middle, *__first))
2468 iter_swap(__first, __middle);
2471 _BidirectionalIter __first_cut = __first;
2472 _BidirectionalIter __second_cut = __middle;
2473 _Distance __len11 = 0;
2474 _Distance __len22 = 0;
2475 if (__len1 > __len2) {
2476 __len11 = __len1 / 2;
2477 advance(__first_cut, __len11);
2478 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2479 __len22 = distance(__middle, __second_cut);
2482 __len22 = __len2 / 2;
2483 advance(__second_cut, __len22);
2484 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2485 __len11 = distance(__first, __first_cut);
2487 rotate(__first_cut, __middle, __second_cut);
2488 _BidirectionalIter __new_middle = __first_cut;
2489 advance(__new_middle, distance(__middle, __second_cut));
2490 __merge_without_buffer(__first, __first_cut, __new_middle,
2491 __len11, __len22, __comp);
2492 __merge_without_buffer(__new_middle, __second_cut, __last,
2493 __len1 - __len11, __len2 - __len22, __comp);
2496 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2499 __rotate_adaptive(_BidirectionalIter1 __first,
2500 _BidirectionalIter1 __middle,
2501 _BidirectionalIter1 __last,
2502 _Distance __len1, _Distance __len2,
2503 _BidirectionalIter2 __buffer,
2504 _Distance __buffer_size)
2506 _BidirectionalIter2 __buffer_end;
2507 if (__len1 > __len2 && __len2 <= __buffer_size) {
2508 __buffer_end = copy(__middle, __last, __buffer);
2509 copy_backward(__first, __middle, __last);
2510 return copy(__buffer, __buffer_end, __first);
2512 else if (__len1 <= __buffer_size) {
2513 __buffer_end = copy(__first, __middle, __buffer);
2514 copy(__middle, __last, __first);
2515 return copy_backward(__buffer, __buffer_end, __last);
2518 rotate(__first, __middle, __last);
2519 advance(__first, distance(__middle, __last));
2524 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2525 typename _BidirectionalIter3>
2527 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2528 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2529 _BidirectionalIter3 __result)
2531 if (__first1 == __last1)
2532 return copy_backward(__first2, __last2, __result);
2533 if (__first2 == __last2)
2534 return copy_backward(__first1, __last1, __result);
2538 if (*__last2 < *__last1) {
2539 *--__result = *__last1;
2540 if (__first1 == __last1)
2541 return copy_backward(__first2, ++__last2, __result);
2545 *--__result = *__last2;
2546 if (__first2 == __last2)
2547 return copy_backward(__first1, ++__last1, __result);
2553 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
2554 typename _BidirectionalIter3, typename _Compare>
2556 __merge_backward(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
2557 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
2558 _BidirectionalIter3 __result,
2561 if (__first1 == __last1)
2562 return copy_backward(__first2, __last2, __result);
2563 if (__first2 == __last2)
2564 return copy_backward(__first1, __last1, __result);
2568 if (__comp(*__last2, *__last1)) {
2569 *--__result = *__last1;
2570 if (__first1 == __last1)
2571 return copy_backward(__first2, ++__last2, __result);
2575 *--__result = *__last2;
2576 if (__first2 == __last2)
2577 return copy_backward(__first1, ++__last1, __result);
2583 template<typename _BidirectionalIter, typename _Distance, typename _Pointer>
2585 __merge_adaptive(_BidirectionalIter __first,
2586 _BidirectionalIter __middle,
2587 _BidirectionalIter __last,
2588 _Distance __len1, _Distance __len2,
2589 _Pointer __buffer, _Distance __buffer_size)
2591 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2592 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2593 merge(__buffer, __buffer_end, __middle, __last, __first);
2595 else if (__len2 <= __buffer_size) {
2596 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2597 __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
2600 _BidirectionalIter __first_cut = __first;
2601 _BidirectionalIter __second_cut = __middle;
2602 _Distance __len11 = 0;
2603 _Distance __len22 = 0;
2604 if (__len1 > __len2) {
2605 __len11 = __len1 / 2;
2606 advance(__first_cut, __len11);
2607 __second_cut = lower_bound(__middle, __last, *__first_cut);
2608 __len22 = distance(__middle, __second_cut);
2611 __len22 = __len2 / 2;
2612 advance(__second_cut, __len22);
2613 __first_cut = upper_bound(__first, __middle, *__second_cut);
2614 __len11 = distance(__first, __first_cut);
2616 _BidirectionalIter __new_middle =
2617 __rotate_adaptive(__first_cut, __middle, __second_cut,
2618 __len1 - __len11, __len22, __buffer,
2620 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2621 __len22, __buffer, __buffer_size);
2622 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2623 __len2 - __len22, __buffer, __buffer_size);
2627 template<typename _BidirectionalIter, typename _Distance, typename _Pointer,
2630 __merge_adaptive(_BidirectionalIter __first,
2631 _BidirectionalIter __middle,
2632 _BidirectionalIter __last,
2633 _Distance __len1, _Distance __len2,
2634 _Pointer __buffer, _Distance __buffer_size,
2637 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2638 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2639 merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
2641 else if (__len2 <= __buffer_size) {
2642 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2643 __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
2647 _BidirectionalIter __first_cut = __first;
2648 _BidirectionalIter __second_cut = __middle;
2649 _Distance __len11 = 0;
2650 _Distance __len22 = 0;
2651 if (__len1 > __len2) {
2652 __len11 = __len1 / 2;
2653 advance(__first_cut, __len11);
2654 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2655 __len22 = distance(__middle, __second_cut);
2658 __len22 = __len2 / 2;
2659 advance(__second_cut, __len22);
2660 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2661 __len11 = distance(__first, __first_cut);
2663 _BidirectionalIter __new_middle =
2664 __rotate_adaptive(__first_cut, __middle, __second_cut,
2665 __len1 - __len11, __len22, __buffer,
2667 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2668 __len22, __buffer, __buffer_size, __comp);
2669 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2670 __len2 - __len22, __buffer, __buffer_size, __comp);
2674 template<typename _BidirectionalIter>
2676 inplace_merge(_BidirectionalIter __first,
2677 _BidirectionalIter __middle,
2678 _BidirectionalIter __last)
2680 typedef typename iterator_traits<_BidirectionalIter>::value_type
2682 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2685 // concept requirements
2686 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2687 _BidirectionalIter>)
2688 __glibcpp_function_requires(_LessThanComparableConcept<_ValueType>)
2690 if (__first == __middle || __middle == __last)
2693 _DistanceType __len1 = distance(__first, __middle);
2694 _DistanceType __len2 = distance(__middle, __last);
2696 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2697 if (__buf.begin() == 0)
2698 __merge_without_buffer(__first, __middle, __last, __len1, __len2);
2700 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2701 __buf.begin(), _DistanceType(__buf.size()));
2704 template<typename _BidirectionalIter, typename _Compare>
2706 inplace_merge(_BidirectionalIter __first,
2707 _BidirectionalIter __middle,
2708 _BidirectionalIter __last,
2711 typedef typename iterator_traits<_BidirectionalIter>::value_type
2713 typedef typename iterator_traits<_BidirectionalIter>::difference_type
2716 // concept requirements
2717 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2718 _BidirectionalIter>)
2719 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2720 _ValueType, _ValueType>)
2722 if (__first == __middle || __middle == __last)
2725 _DistanceType __len1 = distance(__first, __middle);
2726 _DistanceType __len2 = distance(__middle, __last);
2728 _Temporary_buffer<_BidirectionalIter, _ValueType> __buf(__first, __last);
2729 if (__buf.begin() == 0)
2730 __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
2732 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2733 __buf.begin(), _DistanceType(__buf.size()),
2737 // Set algorithms: includes, set_union, set_intersection, set_difference,
2738 // set_symmetric_difference. All of these algorithms have the precondition
2739 // that their input ranges are sorted and the postcondition that their output
2740 // ranges are sorted.
2742 template<typename _InputIter1, typename _InputIter2>
2744 includes(_InputIter1 __first1, _InputIter1 __last1,
2745 _InputIter2 __first2, _InputIter2 __last2)
2747 // concept requirements
2748 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2749 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2750 __glibcpp_function_requires(_SameTypeConcept<
2751 typename iterator_traits<_InputIter1>::value_type,
2752 typename iterator_traits<_InputIter2>::value_type>)
2753 __glibcpp_function_requires(_LessThanComparableConcept<
2754 typename iterator_traits<_InputIter1>::value_type>)
2756 while (__first1 != __last1 && __first2 != __last2)
2757 if (*__first2 < *__first1)
2759 else if(*__first1 < *__first2)
2762 ++__first1, ++__first2;
2764 return __first2 == __last2;
2767 template<typename _InputIter1, typename _InputIter2, typename _Compare>
2769 includes(_InputIter1 __first1, _InputIter1 __last1,
2770 _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
2772 // concept requirements
2773 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2774 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2775 __glibcpp_function_requires(_SameTypeConcept<
2776 typename iterator_traits<_InputIter1>::value_type,
2777 typename iterator_traits<_InputIter2>::value_type>)
2778 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2779 typename iterator_traits<_InputIter1>::value_type,
2780 typename iterator_traits<_InputIter2>::value_type>)
2782 while (__first1 != __last1 && __first2 != __last2)
2783 if (__comp(*__first2, *__first1))
2785 else if(__comp(*__first1, *__first2))
2788 ++__first1, ++__first2;
2790 return __first2 == __last2;
2793 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2795 set_union(_InputIter1 __first1, _InputIter1 __last1,
2796 _InputIter2 __first2, _InputIter2 __last2,
2797 _OutputIter __result)
2799 // concept requirements
2800 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2801 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2802 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2803 typename iterator_traits<_InputIter1>::value_type>)
2804 __glibcpp_function_requires(_SameTypeConcept<
2805 typename iterator_traits<_InputIter1>::value_type,
2806 typename iterator_traits<_InputIter2>::value_type>)
2807 __glibcpp_function_requires(_LessThanComparableConcept<
2808 typename iterator_traits<_InputIter1>::value_type>)
2810 while (__first1 != __last1 && __first2 != __last2) {
2811 if (*__first1 < *__first2) {
2812 *__result = *__first1;
2815 else if (*__first2 < *__first1) {
2816 *__result = *__first2;
2820 *__result = *__first1;
2826 return copy(__first2, __last2, copy(__first1, __last1, __result));
2829 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2832 set_union(_InputIter1 __first1, _InputIter1 __last1,
2833 _InputIter2 __first2, _InputIter2 __last2,
2834 _OutputIter __result, _Compare __comp)
2836 // concept requirements
2837 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2838 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2839 __glibcpp_function_requires(_SameTypeConcept<
2840 typename iterator_traits<_InputIter1>::value_type,
2841 typename iterator_traits<_InputIter2>::value_type>)
2842 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2843 typename iterator_traits<_InputIter1>::value_type>)
2844 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2845 typename iterator_traits<_InputIter1>::value_type,
2846 typename iterator_traits<_InputIter2>::value_type>)
2848 while (__first1 != __last1 && __first2 != __last2) {
2849 if (__comp(*__first1, *__first2)) {
2850 *__result = *__first1;
2853 else if (__comp(*__first2, *__first1)) {
2854 *__result = *__first2;
2858 *__result = *__first1;
2864 return copy(__first2, __last2, copy(__first1, __last1, __result));
2867 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2869 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2870 _InputIter2 __first2, _InputIter2 __last2,
2871 _OutputIter __result)
2873 // concept requirements
2874 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2875 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2876 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2877 typename iterator_traits<_InputIter1>::value_type>)
2878 __glibcpp_function_requires(_SameTypeConcept<
2879 typename iterator_traits<_InputIter1>::value_type,
2880 typename iterator_traits<_InputIter2>::value_type>)
2881 __glibcpp_function_requires(_LessThanComparableConcept<
2882 typename iterator_traits<_InputIter1>::value_type>)
2884 while (__first1 != __last1 && __first2 != __last2)
2885 if (*__first1 < *__first2)
2887 else if (*__first2 < *__first1)
2890 *__result = *__first1;
2898 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2901 set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2902 _InputIter2 __first2, _InputIter2 __last2,
2903 _OutputIter __result, _Compare __comp)
2905 // concept requirements
2906 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2907 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2908 __glibcpp_function_requires(_SameTypeConcept<
2909 typename iterator_traits<_InputIter1>::value_type,
2910 typename iterator_traits<_InputIter2>::value_type>)
2911 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2912 typename iterator_traits<_InputIter1>::value_type>)
2913 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2914 typename iterator_traits<_InputIter1>::value_type,
2915 typename iterator_traits<_InputIter2>::value_type>)
2917 while (__first1 != __last1 && __first2 != __last2)
2918 if (__comp(*__first1, *__first2))
2920 else if (__comp(*__first2, *__first1))
2923 *__result = *__first1;
2931 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2933 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2934 _InputIter2 __first2, _InputIter2 __last2,
2935 _OutputIter __result)
2937 // concept requirements
2938 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2939 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2940 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2941 typename iterator_traits<_InputIter1>::value_type>)
2942 __glibcpp_function_requires(_SameTypeConcept<
2943 typename iterator_traits<_InputIter1>::value_type,
2944 typename iterator_traits<_InputIter2>::value_type>)
2945 __glibcpp_function_requires(_LessThanComparableConcept<
2946 typename iterator_traits<_InputIter1>::value_type>)
2948 while (__first1 != __last1 && __first2 != __last2)
2949 if (*__first1 < *__first2) {
2950 *__result = *__first1;
2954 else if (*__first2 < *__first1)
2960 return copy(__first1, __last1, __result);
2963 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
2966 set_difference(_InputIter1 __first1, _InputIter1 __last1,
2967 _InputIter2 __first2, _InputIter2 __last2,
2968 _OutputIter __result, _Compare __comp)
2970 // concept requirements
2971 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
2972 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
2973 __glibcpp_function_requires(_SameTypeConcept<
2974 typename iterator_traits<_InputIter1>::value_type,
2975 typename iterator_traits<_InputIter2>::value_type>)
2976 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2977 typename iterator_traits<_InputIter1>::value_type>)
2978 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2979 typename iterator_traits<_InputIter1>::value_type,
2980 typename iterator_traits<_InputIter2>::value_type>)
2982 while (__first1 != __last1 && __first2 != __last2)
2983 if (__comp(*__first1, *__first2)) {
2984 *__result = *__first1;
2988 else if (__comp(*__first2, *__first1))
2994 return copy(__first1, __last1, __result);
2997 template<typename _InputIter1, typename _InputIter2, typename _OutputIter>
2999 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3000 _InputIter2 __first2, _InputIter2 __last2,
3001 _OutputIter __result)
3003 // concept requirements
3004 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
3005 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
3006 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3007 typename iterator_traits<_InputIter1>::value_type>)
3008 __glibcpp_function_requires(_SameTypeConcept<
3009 typename iterator_traits<_InputIter1>::value_type,
3010 typename iterator_traits<_InputIter2>::value_type>)
3011 __glibcpp_function_requires(_LessThanComparableConcept<
3012 typename iterator_traits<_InputIter1>::value_type>)
3014 while (__first1 != __last1 && __first2 != __last2)
3015 if (*__first1 < *__first2) {
3016 *__result = *__first1;
3020 else if (*__first2 < *__first1) {
3021 *__result = *__first2;
3029 return copy(__first2, __last2, copy(__first1, __last1, __result));
3032 template<typename _InputIter1, typename _InputIter2, typename _OutputIter,
3035 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3036 _InputIter2 __first2, _InputIter2 __last2,
3037 _OutputIter __result,
3040 // concept requirements
3041 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
3042 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
3043 __glibcpp_function_requires(_SameTypeConcept<
3044 typename iterator_traits<_InputIter1>::value_type,
3045 typename iterator_traits<_InputIter2>::value_type>)
3046 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3047 typename iterator_traits<_InputIter1>::value_type>)
3048 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3049 typename iterator_traits<_InputIter1>::value_type,
3050 typename iterator_traits<_InputIter2>::value_type>)
3052 while (__first1 != __last1 && __first2 != __last2)
3053 if (__comp(*__first1, *__first2)) {
3054 *__result = *__first1;
3058 else if (__comp(*__first2, *__first1)) {
3059 *__result = *__first2;
3067 return copy(__first2, __last2, copy(__first1, __last1, __result));
3070 // min_element and max_element, with and without an explicitly supplied
3071 // comparison function.
3073 template<typename _ForwardIter>
3075 max_element(_ForwardIter __first, _ForwardIter __last)
3077 // concept requirements
3078 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3079 __glibcpp_function_requires(_LessThanComparableConcept<
3080 typename iterator_traits<_ForwardIter>::value_type>)
3082 if (__first == __last) return __first;
3083 _ForwardIter __result = __first;
3084 while (++__first != __last)
3085 if (*__result < *__first)
3090 template<typename _ForwardIter, typename _Compare>
3092 max_element(_ForwardIter __first, _ForwardIter __last,
3095 // concept requirements
3096 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3097 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3098 typename iterator_traits<_ForwardIter>::value_type,
3099 typename iterator_traits<_ForwardIter>::value_type>)
3101 if (__first == __last) return __first;
3102 _ForwardIter __result = __first;
3103 while (++__first != __last)
3104 if (__comp(*__result, *__first)) __result = __first;
3108 template<typename _ForwardIter>
3110 min_element(_ForwardIter __first, _ForwardIter __last)
3112 // concept requirements
3113 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3114 __glibcpp_function_requires(_LessThanComparableConcept<
3115 typename iterator_traits<_ForwardIter>::value_type>)
3117 if (__first == __last) return __first;
3118 _ForwardIter __result = __first;
3119 while (++__first != __last)
3120 if (*__first < *__result)
3125 template<typename _ForwardIter, typename _Compare>
3127 min_element(_ForwardIter __first, _ForwardIter __last,
3130 // concept requirements
3131 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3132 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3133 typename iterator_traits<_ForwardIter>::value_type,
3134 typename iterator_traits<_ForwardIter>::value_type>)
3136 if (__first == __last) return __first;
3137 _ForwardIter __result = __first;
3138 while (++__first != __last)
3139 if (__comp(*__first, *__result))
3144 // next_permutation and prev_permutation, with and without an explicitly
3145 // supplied comparison function.
3147 template<typename _BidirectionalIter>
3149 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3151 // concept requirements
3152 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3153 __glibcpp_function_requires(_LessThanComparableConcept<
3154 typename iterator_traits<_BidirectionalIter>::value_type>)
3156 if (__first == __last)
3158 _BidirectionalIter __i = __first;
3166 _BidirectionalIter __ii = __i;
3169 _BidirectionalIter __j = __last;
3170 while (!(*__i < *--__j))
3172 iter_swap(__i, __j);
3173 reverse(__ii, __last);
3176 if (__i == __first) {
3177 reverse(__first, __last);
3183 template<typename _BidirectionalIter, typename _Compare>
3185 next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3188 // concept requirements
3189 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3190 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3191 typename iterator_traits<_BidirectionalIter>::value_type,
3192 typename iterator_traits<_BidirectionalIter>::value_type>)
3194 if (__first == __last)
3196 _BidirectionalIter __i = __first;
3204 _BidirectionalIter __ii = __i;
3206 if (__comp(*__i, *__ii)) {
3207 _BidirectionalIter __j = __last;
3208 while (!__comp(*__i, *--__j))
3210 iter_swap(__i, __j);
3211 reverse(__ii, __last);
3214 if (__i == __first) {
3215 reverse(__first, __last);
3221 template<typename _BidirectionalIter>
3223 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3225 // concept requirements
3226 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3227 __glibcpp_function_requires(_LessThanComparableConcept<
3228 typename iterator_traits<_BidirectionalIter>::value_type>)
3230 if (__first == __last)
3232 _BidirectionalIter __i = __first;
3240 _BidirectionalIter __ii = __i;
3243 _BidirectionalIter __j = __last;
3244 while (!(*--__j < *__i))
3246 iter_swap(__i, __j);
3247 reverse(__ii, __last);
3250 if (__i == __first) {
3251 reverse(__first, __last);
3257 template<typename _BidirectionalIter, typename _Compare>
3259 prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3262 // concept requirements
3263 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>)
3264 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3265 typename iterator_traits<_BidirectionalIter>::value_type,
3266 typename iterator_traits<_BidirectionalIter>::value_type>)
3268 if (__first == __last)
3270 _BidirectionalIter __i = __first;
3278 _BidirectionalIter __ii = __i;
3280 if (__comp(*__ii, *__i)) {
3281 _BidirectionalIter __j = __last;
3282 while (!__comp(*--__j, *__i))
3284 iter_swap(__i, __j);
3285 reverse(__ii, __last);
3288 if (__i == __first) {
3289 reverse(__first, __last);
3295 // find_first_of, with and without an explicitly supplied comparison function.
3297 template<typename _InputIter, typename _ForwardIter>
3299 find_first_of(_InputIter __first1, _InputIter __last1,
3300 _ForwardIter __first2, _ForwardIter __last2)
3302 // concept requirements
3303 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3304 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3305 __glibcpp_function_requires(_EqualOpConcept<
3306 typename iterator_traits<_InputIter>::value_type,
3307 typename iterator_traits<_ForwardIter>::value_type>)
3309 for ( ; __first1 != __last1; ++__first1)
3310 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3311 if (*__first1 == *__iter)
3316 template<typename _InputIter, typename _ForwardIter, typename _BinaryPredicate>
3318 find_first_of(_InputIter __first1, _InputIter __last1,
3319 _ForwardIter __first2, _ForwardIter __last2,
3320 _BinaryPredicate __comp)
3322 // concept requirements
3323 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>)
3324 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3325 __glibcpp_function_requires(_EqualOpConcept<
3326 typename iterator_traits<_InputIter>::value_type,
3327 typename iterator_traits<_ForwardIter>::value_type>)
3328 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3329 typename iterator_traits<_InputIter>::value_type,
3330 typename iterator_traits<_ForwardIter>::value_type>)
3332 for ( ; __first1 != __last1; ++__first1)
3333 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3334 if (__comp(*__first1, *__iter))
3340 // find_end, with and without an explicitly supplied comparison function.
3341 // Search [first2, last2) as a subsequence in [first1, last1), and return
3342 // the *last* possible match. Note that find_end for bidirectional iterators
3343 // is much faster than for forward iterators.
3345 // find_end for forward iterators.
3346 template<typename _ForwardIter1, typename _ForwardIter2>
3348 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3349 _ForwardIter2 __first2, _ForwardIter2 __last2,
3350 forward_iterator_tag, forward_iterator_tag)
3352 if (__first2 == __last2)
3355 _ForwardIter1 __result = __last1;
3357 _ForwardIter1 __new_result
3358 = search(__first1, __last1, __first2, __last2);
3359 if (__new_result == __last1)
3362 __result = __new_result;
3363 __first1 = __new_result;
3370 template<typename _ForwardIter1, typename _ForwardIter2,
3371 typename _BinaryPredicate>
3373 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3374 _ForwardIter2 __first2, _ForwardIter2 __last2,
3375 forward_iterator_tag, forward_iterator_tag,
3376 _BinaryPredicate __comp)
3378 if (__first2 == __last2)
3381 _ForwardIter1 __result = __last1;
3383 _ForwardIter1 __new_result
3384 = search(__first1, __last1, __first2, __last2, __comp);
3385 if (__new_result == __last1)
3388 __result = __new_result;
3389 __first1 = __new_result;
3396 // find_end for bidirectional iterators. Requires partial specialization.
3397 template<typename _BidirectionalIter1, typename _BidirectionalIter2>
3399 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3400 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3401 bidirectional_iterator_tag, bidirectional_iterator_tag)
3403 // concept requirements
3404 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3405 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3407 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3408 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3410 _RevIter1 __rlast1(__first1);
3411 _RevIter2 __rlast2(__first2);
3412 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3413 _RevIter2(__last2), __rlast2);
3415 if (__rresult == __rlast1)
3418 _BidirectionalIter1 __result = __rresult.base();
3419 advance(__result, -distance(__first2, __last2));
3424 template<typename _BidirectionalIter1, typename _BidirectionalIter2,
3425 typename _BinaryPredicate>
3427 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3428 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3429 bidirectional_iterator_tag, bidirectional_iterator_tag,
3430 _BinaryPredicate __comp)
3432 // concept requirements
3433 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>)
3434 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>)
3436 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3437 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3439 _RevIter1 __rlast1(__first1);
3440 _RevIter2 __rlast2(__first2);
3441 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3442 _RevIter2(__last2), __rlast2,
3445 if (__rresult == __rlast1)
3448 _BidirectionalIter1 __result = __rresult.base();
3449 advance(__result, -distance(__first2, __last2));
3454 // Dispatching functions for find_end.
3456 template<typename _ForwardIter1, typename _ForwardIter2>
3457 inline _ForwardIter1
3458 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3459 _ForwardIter2 __first2, _ForwardIter2 __last2)
3461 // concept requirements
3462 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3463 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3464 __glibcpp_function_requires(_EqualOpConcept<
3465 typename iterator_traits<_ForwardIter1>::value_type,
3466 typename iterator_traits<_ForwardIter2>::value_type>)
3468 return __find_end(__first1, __last1, __first2, __last2,
3469 __iterator_category(__first1),
3470 __iterator_category(__first2));
3473 template<typename _ForwardIter1, typename _ForwardIter2,
3474 typename _BinaryPredicate>
3475 inline _ForwardIter1
3476 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3477 _ForwardIter2 __first2, _ForwardIter2 __last2,
3478 _BinaryPredicate __comp)
3480 // concept requirements
3481 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>)
3482 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>)
3483 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3484 typename iterator_traits<_ForwardIter1>::value_type,
3485 typename iterator_traits<_ForwardIter2>::value_type>)
3487 return __find_end(__first1, __last1, __first2, __last2,
3488 __iterator_category(__first1),
3489 __iterator_category(__first2),
3493 // is_heap, a predicate testing whether or not a range is
3494 // a heap. This function is an extension, not part of the C++
3497 template<typename _RandomAccessIter, typename _Distance>
3499 __is_heap(_RandomAccessIter __first, _Distance __n)
3501 _Distance __parent = 0;
3502 for (_Distance __child = 1; __child < __n; ++__child) {
3503 if (__first[__parent] < __first[__child])
3505 if ((__child & 1) == 0)
3511 template<typename _RandomAccessIter, typename _Distance,
3512 typename _StrictWeakOrdering>
3514 __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
3517 _Distance __parent = 0;
3518 for (_Distance __child = 1; __child < __n; ++__child) {
3519 if (__comp(__first[__parent], __first[__child]))
3521 if ((__child & 1) == 0)
3527 template<typename _RandomAccessIter>
3529 is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
3531 // concept requirements
3532 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>)
3533 __glibcpp_function_requires(_LessThanComparableConcept<
3534 typename iterator_traits<_RandomAccessIter>::value_type>)
3536 return __is_heap(__first, __last - __first);
3540 template<typename _RandomAccessIter, typename _StrictWeakOrdering>
3542 is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
3543 _StrictWeakOrdering __comp)
3545 // concept requirements
3546 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>)
3547 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3548 typename iterator_traits<_RandomAccessIter>::value_type,
3549 typename iterator_traits<_RandomAccessIter>::value_type>)
3551 return __is_heap(__first, __comp, __last - __first);
3554 // is_sorted, a predicated testing whether a range is sorted in
3555 // nondescending order. This is an extension, not part of the C++
3558 template<typename _ForwardIter>
3560 is_sorted(_ForwardIter __first, _ForwardIter __last)
3562 // concept requirements
3563 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3564 __glibcpp_function_requires(_LessThanComparableConcept<
3565 typename iterator_traits<_ForwardIter>::value_type>)
3567 if (__first == __last)
3570 _ForwardIter __next = __first;
3571 for (++__next; __next != __last; __first = __next, ++__next) {
3572 if (*__next < *__first)
3579 template<typename _ForwardIter, typename _StrictWeakOrdering>
3581 is_sorted(_ForwardIter __first, _ForwardIter __last, _StrictWeakOrdering __comp)
3583 // concept requirements
3584 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
3585 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3586 typename iterator_traits<_ForwardIter>::value_type,
3587 typename iterator_traits<_ForwardIter>::value_type>)
3589 if (__first == __last)
3592 _ForwardIter __next = __first;
3593 for (++__next; __next != __last; __first = __next, ++__next) {
3594 if (__comp(*__next, *__first))
3603 #endif /* __SGI_STL_INTERNAL_ALGO_H */