4 * Hewlett-Packard Company
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
16 * Silicon Graphics Computer Systems, Inc.
18 * Permission to use, copy, modify, distribute and sell this software
19 * and its documentation for any purpose is hereby granted without fee,
20 * provided that the above copyright notice appear in all copies and
21 * that both that copyright notice and this permission notice appear
22 * in supporting documentation. Silicon Graphics makes no
23 * representations about the suitability of this software for any
24 * purpose. It is provided "as is" without express or implied warranty.
27 /* NOTE: This is an internal header file, included by other STL headers.
28 * You should not attempt to use it directly.
31 #ifndef __SGI_STL_INTERNAL_ALGO_H
32 #define __SGI_STL_INTERNAL_ALGO_H
34 #include <bits/stl_heap.h>
36 // See concept_check.h for the __glibcpp_*_requires macros.
41 // __median (an extension, not present in the C++ standard).
44 inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
46 // concept requirements
47 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
63 template <class _Tp, class _Compare>
65 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
67 // concept requirements
68 __glibcpp_function_requires(_BinaryFunctionConcept<_Compare, bool, _Tp, _Tp>);
72 else if (__comp(__a, __c))
76 else if (__comp(__a, __c))
78 else if (__comp(__b, __c))
84 // for_each. Apply a function to every element of a range.
85 template <class _InputIter, class _Function>
86 _Function for_each(_InputIter __first, _InputIter __last, _Function __f)
88 // concept requirements
89 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
90 for ( ; __first != __last; ++__first)
97 template <class _InputIter, class _Tp>
98 inline _InputIter find(_InputIter __first, _InputIter __last,
102 while (__first != __last && !(*__first == __val))
107 template <class _InputIter, class _Predicate>
108 inline _InputIter find_if(_InputIter __first, _InputIter __last,
112 while (__first != __last && !__pred(*__first))
117 template <class _RandomAccessIter, class _Tp>
118 _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,
120 random_access_iterator_tag)
122 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
123 = (__last - __first) >> 2;
125 for ( ; __trip_count > 0 ; --__trip_count) {
126 if (*__first == __val) return __first;
129 if (*__first == __val) return __first;
132 if (*__first == __val) return __first;
135 if (*__first == __val) return __first;
139 switch(__last - __first) {
141 if (*__first == __val) return __first;
144 if (*__first == __val) return __first;
147 if (*__first == __val) return __first;
155 template <class _RandomAccessIter, class _Predicate>
156 _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,
158 random_access_iterator_tag)
160 typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
161 = (__last - __first) >> 2;
163 for ( ; __trip_count > 0 ; --__trip_count) {
164 if (__pred(*__first)) return __first;
167 if (__pred(*__first)) return __first;
170 if (__pred(*__first)) return __first;
173 if (__pred(*__first)) return __first;
177 switch(__last - __first) {
179 if (__pred(*__first)) return __first;
182 if (__pred(*__first)) return __first;
185 if (__pred(*__first)) return __first;
193 template <class _InputIter, class _Tp>
194 inline _InputIter find(_InputIter __first, _InputIter __last,
197 // concept requirements
198 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
199 __glibcpp_function_requires(_EqualOpConcept<
200 typename iterator_traits<_InputIter>::value_type, _Tp>);
201 return find(__first, __last, __val, __iterator_category(__first));
204 template <class _InputIter, class _Predicate>
205 inline _InputIter find_if(_InputIter __first, _InputIter __last,
208 // concept requirements
209 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
210 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
211 typename iterator_traits<_InputIter>::value_type>);
212 return find_if(__first, __last, __pred, __iterator_category(__first));
217 template <class _ForwardIter>
218 _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last)
220 // concept requirements
221 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
222 __glibcpp_function_requires(_EqualityComparableConcept<
223 typename iterator_traits<_ForwardIter>::value_type>);
224 if (__first == __last)
226 _ForwardIter __next = __first;
227 while(++__next != __last) {
228 if (*__first == *__next)
235 template <class _ForwardIter, class _BinaryPredicate>
236 _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
237 _BinaryPredicate __binary_pred)
239 // concept requirements
240 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
241 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
242 typename iterator_traits<_ForwardIter>::value_type,
243 typename iterator_traits<_ForwardIter>::value_type>);
244 if (__first == __last)
246 _ForwardIter __next = __first;
247 while(++__next != __last) {
248 if (__binary_pred(*__first, *__next))
255 // count and count_if. There are two version of each, one whose return type
256 // type is void and one (present only if we have partial specialization)
257 // whose return type is iterator_traits<_InputIter>::difference_type. The
258 // C++ standard only has the latter version, but the former, which was present
259 // in the HP STL, is retained for backward compatibility.
261 template <class _InputIter, class _Tp, class _Size>
262 void count(_InputIter __first, _InputIter __last, const _Tp& __value,
265 // concept requirements
266 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
267 __glibcpp_function_requires(_EqualityComparableConcept<
268 typename iterator_traits<_InputIter>::value_type >);
269 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>);
270 for ( ; __first != __last; ++__first)
271 if (*__first == __value)
275 template <class _InputIter, class _Predicate, class _Size>
276 void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
279 // concept requirements
280 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
281 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
282 typename iterator_traits<_InputIter>::value_type>);
283 for ( ; __first != __last; ++__first)
284 if (__pred(*__first))
288 template <class _InputIter, class _Tp>
289 typename iterator_traits<_InputIter>::difference_type
290 count(_InputIter __first, _InputIter __last, const _Tp& __value)
292 // concept requirements
293 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
294 __glibcpp_function_requires(_EqualityComparableConcept<
295 typename iterator_traits<_InputIter>::value_type >);
296 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>);
297 typename iterator_traits<_InputIter>::difference_type __n = 0;
298 for ( ; __first != __last; ++__first)
299 if (*__first == __value)
304 template <class _InputIter, class _Predicate>
305 typename iterator_traits<_InputIter>::difference_type
306 count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
308 // concept requirements
309 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
310 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
311 typename iterator_traits<_InputIter>::value_type>);
312 typename iterator_traits<_InputIter>::difference_type __n = 0;
313 for ( ; __first != __last; ++__first)
314 if (__pred(*__first))
322 template <class _ForwardIter1, class _ForwardIter2>
323 _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
324 _ForwardIter2 __first2, _ForwardIter2 __last2)
326 // concept requirements
327 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
328 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
329 __glibcpp_function_requires(_EqualOpConcept<
330 typename iterator_traits<_ForwardIter1>::value_type,
331 typename iterator_traits<_ForwardIter2>::value_type>);
333 // Test for empty ranges
334 if (__first1 == __last1 || __first2 == __last2)
337 // Test for a pattern of length 1.
338 _ForwardIter2 __tmp(__first2);
340 if (__tmp == __last2)
341 return find(__first1, __last1, *__first2);
345 _ForwardIter2 __p1, __p;
347 __p1 = __first2; ++__p1;
349 _ForwardIter1 __current = __first1;
351 while (__first1 != __last1) {
352 __first1 = find(__first1, __last1, *__first2);
353 if (__first1 == __last1)
357 __current = __first1;
358 if (++__current == __last1)
361 while (*__current == *__p) {
362 if (++__p == __last2)
364 if (++__current == __last1)
373 template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
374 _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
375 _ForwardIter2 __first2, _ForwardIter2 __last2,
376 _BinaryPred __predicate)
378 // concept requirements
379 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
380 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
381 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
382 typename iterator_traits<_ForwardIter1>::value_type,
383 typename iterator_traits<_ForwardIter2>::value_type>);
385 // Test for empty ranges
386 if (__first1 == __last1 || __first2 == __last2)
389 // Test for a pattern of length 1.
390 _ForwardIter2 __tmp(__first2);
392 if (__tmp == __last2) {
393 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
400 _ForwardIter2 __p1, __p;
402 __p1 = __first2; ++__p1;
404 _ForwardIter1 __current = __first1;
406 while (__first1 != __last1) {
407 while (__first1 != __last1) {
408 if (__predicate(*__first1, *__first2))
412 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
414 if (__first1 == __last1)
418 __current = __first1;
419 if (++__current == __last1) return __last1;
421 while (__predicate(*__current, *__p)) {
422 if (++__p == __last2)
424 if (++__current == __last1)
433 // search_n. Search for __count consecutive copies of __val.
435 template <class _ForwardIter, class _Integer, class _Tp>
436 _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
437 _Integer __count, const _Tp& __val)
439 // concept requirements
440 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
441 __glibcpp_function_requires(_EqualityComparableConcept<
442 typename iterator_traits<_ForwardIter>::value_type>);
443 __glibcpp_function_requires(_EqualityComparableConcept<_Tp>);
448 __first = find(__first, __last, __val);
449 while (__first != __last) {
450 _Integer __n = __count - 1;
451 _ForwardIter __i = __first;
453 while (__i != __last && __n != 0 && *__i == __val) {
460 __first = find(__i, __last, __val);
466 template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
467 _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
468 _Integer __count, const _Tp& __val,
469 _BinaryPred __binary_pred)
471 // concept requirements
472 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
473 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPred,
474 typename iterator_traits<_ForwardIter>::value_type, _Tp>);
479 while (__first != __last) {
480 if (__binary_pred(*__first, __val))
484 while (__first != __last) {
485 _Integer __n = __count - 1;
486 _ForwardIter __i = __first;
488 while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
495 while (__i != __last) {
496 if (__binary_pred(*__i, __val))
509 template <class _ForwardIter1, class _ForwardIter2>
510 _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
511 _ForwardIter2 __first2)
513 // concept requirements
514 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter1>);
515 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter2>);
516 __glibcpp_function_requires(_ConvertibleConcept<
517 typename iterator_traits<_ForwardIter1>::value_type,
518 typename iterator_traits<_ForwardIter2>::value_type>);
519 __glibcpp_function_requires(_ConvertibleConcept<
520 typename iterator_traits<_ForwardIter2>::value_type,
521 typename iterator_traits<_ForwardIter1>::value_type>);
523 for ( ; __first1 != __last1; ++__first1, ++__first2)
524 iter_swap(__first1, __first2);
530 template <class _InputIter, class _OutputIter, class _UnaryOperation>
531 _OutputIter transform(_InputIter __first, _InputIter __last,
532 _OutputIter __result, _UnaryOperation __unary_op)
534 // concept requirements
535 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
536 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
537 typename iterator_traits<_InputIter>::value_type>);
539 for ( ; __first != __last; ++__first, ++__result)
540 *__result = __unary_op(*__first);
544 template <class _InputIter1, class _InputIter2, class _OutputIter,
545 class _BinaryOperation>
546 _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
547 _InputIter2 __first2, _OutputIter __result,
548 _BinaryOperation __binary_op)
550 // concept requirements
551 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
552 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
553 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
554 // XXX really should be "the type returned by _BinaryOperation"
555 typename iterator_traits<_InputIter1>::value_type>);
557 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
558 *__result = __binary_op(*__first1, *__first2);
562 // replace, replace_if, replace_copy, replace_copy_if
564 template <class _ForwardIter, class _Tp>
565 void replace(_ForwardIter __first, _ForwardIter __last,
566 const _Tp& __old_value, const _Tp& __new_value)
568 // concept requirements
569 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
570 __glibcpp_function_requires(_EqualOpConcept<
571 typename iterator_traits<_ForwardIter>::value_type, _Tp>);
572 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
573 typename iterator_traits<_ForwardIter>::value_type>);
575 for ( ; __first != __last; ++__first)
576 if (*__first == __old_value)
577 *__first = __new_value;
580 template <class _ForwardIter, class _Predicate, class _Tp>
581 void replace_if(_ForwardIter __first, _ForwardIter __last,
582 _Predicate __pred, const _Tp& __new_value)
584 // concept requirements
585 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
586 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
587 typename iterator_traits<_ForwardIter>::value_type>);
588 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
589 typename iterator_traits<_ForwardIter>::value_type>);
591 for ( ; __first != __last; ++__first)
592 if (__pred(*__first))
593 *__first = __new_value;
596 template <class _InputIter, class _OutputIter, class _Tp>
597 _OutputIter replace_copy(_InputIter __first, _InputIter __last,
598 _OutputIter __result,
599 const _Tp& __old_value, const _Tp& __new_value)
601 // concept requirements
602 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
603 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
604 typename iterator_traits<_InputIter>::value_type>);
605 __glibcpp_function_requires(_EqualOpConcept<
606 typename iterator_traits<_InputIter>::value_type, _Tp>);
608 for ( ; __first != __last; ++__first, ++__result)
609 *__result = *__first == __old_value ? __new_value : *__first;
613 template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>
614 _OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
615 _OutputIter __result,
616 _Predicate __pred, const _Tp& __new_value)
618 // concept requirements
619 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
620 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
621 typename iterator_traits<_InputIter>::value_type>);
622 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
623 typename iterator_traits<_InputIter>::value_type>);
625 for ( ; __first != __last; ++__first, ++__result)
626 *__result = __pred(*__first) ? __new_value : *__first;
630 // generate and generate_n
632 template <class _ForwardIter, class _Generator>
633 void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
635 // concept requirements
636 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
637 __glibcpp_function_requires(_GeneratorConcept<_Generator,
638 typename iterator_traits<_ForwardIter>::value_type>);
640 for ( ; __first != __last; ++__first)
644 template <class _OutputIter, class _Size, class _Generator>
645 _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen)
648 // XXX concept requirements
649 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
650 "the return type of _Generator" ?? >);
653 for ( ; __n > 0; --__n, ++__first)
658 // remove, remove_if, remove_copy, remove_copy_if
660 template <class _InputIter, class _OutputIter, class _Tp>
661 _OutputIter remove_copy(_InputIter __first, _InputIter __last,
662 _OutputIter __result, const _Tp& __value)
664 // concept requirements
665 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
666 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
667 typename iterator_traits<_InputIter>::value_type>);
668 __glibcpp_function_requires(_EqualOpConcept<
669 typename iterator_traits<_InputIter>::value_type, _Tp>);
671 for ( ; __first != __last; ++__first)
672 if (!(*__first == __value)) {
673 *__result = *__first;
679 template <class _InputIter, class _OutputIter, class _Predicate>
680 _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
681 _OutputIter __result, _Predicate __pred)
683 // concept requirements
684 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
685 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
686 typename iterator_traits<_InputIter>::value_type>);
687 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
688 typename iterator_traits<_InputIter>::value_type>);
690 for ( ; __first != __last; ++__first)
691 if (!__pred(*__first)) {
692 *__result = *__first;
698 template <class _ForwardIter, class _Tp>
699 _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
702 // concept requirements
703 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
704 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
705 typename iterator_traits<_ForwardIter>::value_type>);
706 __glibcpp_function_requires(_EqualOpConcept<
707 typename iterator_traits<_ForwardIter>::value_type, _Tp>);
709 __first = find(__first, __last, __value);
710 _ForwardIter __i = __first;
711 return __first == __last ? __first
712 : remove_copy(++__i, __last, __first, __value);
715 template <class _ForwardIter, class _Predicate>
716 _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
719 // concept requirements
720 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
721 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
722 typename iterator_traits<_ForwardIter>::value_type>);
724 __first = find_if(__first, __last, __pred);
725 _ForwardIter __i = __first;
726 return __first == __last ? __first
727 : remove_copy_if(++__i, __last, __first, __pred);
730 // unique and unique_copy
732 template <class _InputIter, class _OutputIter, class _Tp>
733 _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
734 _OutputIter __result, _Tp*)
736 // concept requirements -- taken care of in dispatching function
737 _Tp __value = *__first;
739 while (++__first != __last)
740 if (!(__value == *__first)) {
742 *++__result = __value;
747 template <class _InputIter, class _OutputIter>
748 inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
749 _OutputIter __result,
752 // concept requirements -- taken care of in dispatching function
753 return __unique_copy(__first, __last, __result, __value_type(__first));
756 template <class _InputIter, class _ForwardIter>
757 _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
758 _ForwardIter __result, forward_iterator_tag)
760 // concept requirements -- taken care of in dispatching function
761 *__result = *__first;
762 while (++__first != __last)
763 if (!(*__result == *__first))
764 *++__result = *__first;
768 template <class _InputIter, class _OutputIter>
769 inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
770 _OutputIter __result)
772 // concept requirements
773 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
774 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
775 typename iterator_traits<_InputIter>::value_type>);
776 __glibcpp_function_requires(_EqualityComparableConcept<
777 typename iterator_traits<_InputIter>::value_type>);
779 if (__first == __last) return __result;
780 return __unique_copy(__first, __last, __result,
781 __iterator_category(__result));
784 template <class _InputIter, class _OutputIter, class _BinaryPredicate,
786 _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
787 _OutputIter __result,
788 _BinaryPredicate __binary_pred, _Tp*)
790 // concept requirements -- iterators already checked
791 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate, _Tp, _Tp>);
793 _Tp __value = *__first;
795 while (++__first != __last)
796 if (!__binary_pred(__value, *__first)) {
798 *++__result = __value;
803 template <class _InputIter, class _OutputIter, class _BinaryPredicate>
804 inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
805 _OutputIter __result,
806 _BinaryPredicate __binary_pred,
809 // concept requirements -- taken care of in dispatching function
810 return __unique_copy(__first, __last, __result, __binary_pred,
811 __value_type(__first));
814 template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
815 _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
816 _ForwardIter __result,
817 _BinaryPredicate __binary_pred,
818 forward_iterator_tag)
820 // concept requirements -- iterators already checked
821 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
822 typename iterator_traits<_ForwardIter>::value_type,
823 typename iterator_traits<_InputIter>::value_type>);
825 *__result = *__first;
826 while (++__first != __last)
827 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
831 template <class _InputIter, class _OutputIter, class _BinaryPredicate>
832 inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
833 _OutputIter __result,
834 _BinaryPredicate __binary_pred)
836 // concept requirements -- predicates checked later
837 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
838 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
839 typename iterator_traits<_InputIter>::value_type>);
841 if (__first == __last) return __result;
842 return __unique_copy(__first, __last, __result, __binary_pred,
843 __iterator_category(__result));
846 template <class _ForwardIter>
847 _ForwardIter unique(_ForwardIter __first, _ForwardIter __last)
849 // concept requirements
850 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
851 __glibcpp_function_requires(_EqualityComparableConcept<
852 typename iterator_traits<_ForwardIter>::value_type>);
854 __first = adjacent_find(__first, __last);
855 return unique_copy(__first, __last, __first);
858 template <class _ForwardIter, class _BinaryPredicate>
859 _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
860 _BinaryPredicate __binary_pred)
862 // concept requirements
863 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
864 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
865 typename iterator_traits<_ForwardIter>::value_type,
866 typename iterator_traits<_ForwardIter>::value_type>);
868 __first = adjacent_find(__first, __last, __binary_pred);
869 return unique_copy(__first, __last, __first, __binary_pred);
872 // reverse and reverse_copy, and their auxiliary functions
874 template <class _BidirectionalIter>
875 void __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
876 bidirectional_iterator_tag) {
878 if (__first == __last || __first == --__last)
881 iter_swap(__first++, __last);
884 template <class _RandomAccessIter>
885 void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
886 random_access_iterator_tag) {
887 while (__first < __last)
888 iter_swap(__first++, --__last);
891 template <class _BidirectionalIter>
892 inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last)
894 // concept requirements
895 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
896 _BidirectionalIter>);
897 __reverse(__first, __last, __iterator_category(__first));
900 template <class _BidirectionalIter, class _OutputIter>
901 _OutputIter reverse_copy(_BidirectionalIter __first,
902 _BidirectionalIter __last,
903 _OutputIter __result)
905 // concept requirements
906 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
907 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
908 typename iterator_traits<_BidirectionalIter>::value_type>);
910 while (__first != __last) {
918 // rotate and rotate_copy, and their auxiliary functions
920 template <class _EuclideanRingElement>
921 _EuclideanRingElement __gcd(_EuclideanRingElement __m,
922 _EuclideanRingElement __n)
925 _EuclideanRingElement __t = __m % __n;
932 template <class _ForwardIter, class _Distance>
933 _ForwardIter __rotate(_ForwardIter __first,
934 _ForwardIter __middle,
937 forward_iterator_tag)
939 if (__first == __middle)
941 if (__last == __middle)
944 _ForwardIter __first2 = __middle;
946 swap(*__first++, *__first2++);
947 if (__first == __middle)
949 } while (__first2 != __last);
951 _ForwardIter __new_middle = __first;
955 while (__first2 != __last) {
956 swap (*__first++, *__first2++);
957 if (__first == __middle)
959 else if (__first2 == __last)
967 template <class _BidirectionalIter, class _Distance>
968 _BidirectionalIter __rotate(_BidirectionalIter __first,
969 _BidirectionalIter __middle,
970 _BidirectionalIter __last,
972 bidirectional_iterator_tag)
974 // concept requirements
975 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
976 _BidirectionalIter>);
978 if (__first == __middle)
980 if (__last == __middle)
983 __reverse(__first, __middle, bidirectional_iterator_tag());
984 __reverse(__middle, __last, bidirectional_iterator_tag());
986 while (__first != __middle && __middle != __last)
987 swap (*__first++, *--__last);
989 if (__first == __middle) {
990 __reverse(__middle, __last, bidirectional_iterator_tag());
994 __reverse(__first, __middle, bidirectional_iterator_tag());
999 template <class _RandomAccessIter, class _Distance, class _Tp>
1000 _RandomAccessIter __rotate(_RandomAccessIter __first,
1001 _RandomAccessIter __middle,
1002 _RandomAccessIter __last,
1005 // concept requirements
1006 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1007 _RandomAccessIter>);
1009 _Distance __n = __last - __first;
1010 _Distance __k = __middle - __first;
1011 _Distance __l = __n - __k;
1012 _RandomAccessIter __result = __first + (__last - __middle);
1017 else if (__k == __l) {
1018 swap_ranges(__first, __middle, __middle);
1022 _Distance __d = __gcd(__n, __k);
1024 for (_Distance __i = 0; __i < __d; __i++) {
1025 _Tp __tmp = *__first;
1026 _RandomAccessIter __p = __first;
1029 for (_Distance __j = 0; __j < __l/__d; __j++) {
1030 if (__p > __first + __l) {
1031 *__p = *(__p - __l);
1035 *__p = *(__p + __k);
1041 for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
1042 if (__p < __last - __k) {
1043 *__p = *(__p + __k);
1047 *__p = * (__p - __l);
1059 template <class _ForwardIter>
1060 inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
1061 _ForwardIter __last)
1063 // concept requirements
1064 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1066 return __rotate(__first, __middle, __last,
1067 __distance_type(__first),
1068 __iterator_category(__first));
1071 template <class _ForwardIter, class _OutputIter>
1072 _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
1073 _ForwardIter __last, _OutputIter __result)
1075 // concept requirements
1076 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1077 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1078 typename iterator_traits<_ForwardIter>::value_type>);
1080 return copy(__first, __middle, copy(__middle, __last, __result));
1083 // Return a random number in the range [0, __n). This function encapsulates
1084 // whether we're using rand (part of the standard C library) or lrand48
1085 // (not standard, but a much better choice whenever it's available).
1087 template <class _Distance>
1088 inline _Distance __random_number(_Distance __n) {
1089 #ifdef __STL_NO_DRAND48
1090 return rand() % __n;
1092 return lrand48() % __n;
1098 template <class _RandomAccessIter>
1099 inline void random_shuffle(_RandomAccessIter __first,
1100 _RandomAccessIter __last)
1102 // concept requirements
1103 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1104 _RandomAccessIter>);
1106 if (__first == __last) return;
1107 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1108 iter_swap(__i, __first + __random_number((__i - __first) + 1));
1111 template <class _RandomAccessIter, class _RandomNumberGenerator>
1112 void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
1113 _RandomNumberGenerator& __rand)
1115 // concept requirements
1116 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1117 _RandomAccessIter>);
1119 if (__first == __last) return;
1120 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1121 iter_swap(__i, __first + __rand((__i - __first) + 1));
1124 // random_sample and random_sample_n (extensions, not part of the standard).
1126 template <class _ForwardIter, class _OutputIter, class _Distance>
1127 _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
1128 _OutputIter __out, const _Distance __n)
1130 // concept requirements
1131 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1132 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1133 typename iterator_traits<_ForwardIter>::value_type>);
1135 _Distance __remaining = 0;
1136 distance(__first, __last, __remaining);
1137 _Distance __m = min(__n, __remaining);
1140 if (__random_number(__remaining) < __m) {
1152 template <class _ForwardIter, class _OutputIter, class _Distance,
1153 class _RandomNumberGenerator>
1154 _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
1155 _OutputIter __out, const _Distance __n,
1156 _RandomNumberGenerator& __rand)
1158 // concept requirements
1159 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1160 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1161 typename iterator_traits<_ForwardIter>::value_type>);
1162 __glibcpp_function_requires(_UnaryFunctionConcept<
1163 _RandomNumberGenerator, _Distance, _Distance>);
1165 _Distance __remaining = 0;
1166 distance(__first, __last, __remaining);
1167 _Distance __m = min(__n, __remaining);
1170 if (__rand(__remaining) < __m) {
1182 template <class _InputIter, class _RandomAccessIter, class _Distance>
1183 _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
1184 _RandomAccessIter __out,
1185 const _Distance __n)
1188 _Distance __t = __n;
1189 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1190 __out[__m] = *__first;
1192 while (__first != __last) {
1194 _Distance __M = __random_number(__t);
1196 __out[__M] = *__first;
1203 template <class _InputIter, class _RandomAccessIter,
1204 class _RandomNumberGenerator, class _Distance>
1205 _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
1206 _RandomAccessIter __out,
1207 _RandomNumberGenerator& __rand,
1208 const _Distance __n)
1210 // concept requirements
1211 __glibcpp_function_requires(_UnaryFunctionConcept<
1212 _RandomNumberGenerator, _Distance, _Distance>);
1215 _Distance __t = __n;
1216 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1217 __out[__m] = *__first;
1219 while (__first != __last) {
1221 _Distance __M = __rand(__t);
1223 __out[__M] = *__first;
1230 template <class _InputIter, class _RandomAccessIter>
1231 inline _RandomAccessIter
1232 random_sample(_InputIter __first, _InputIter __last,
1233 _RandomAccessIter __out_first, _RandomAccessIter __out_last)
1235 // concept requirements
1236 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
1237 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1238 _RandomAccessIter>);
1240 return __random_sample(__first, __last,
1241 __out_first, __out_last - __out_first);
1245 template <class _InputIter, class _RandomAccessIter,
1246 class _RandomNumberGenerator>
1247 inline _RandomAccessIter
1248 random_sample(_InputIter __first, _InputIter __last,
1249 _RandomAccessIter __out_first, _RandomAccessIter __out_last,
1250 _RandomNumberGenerator& __rand)
1252 // concept requirements
1253 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
1254 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1255 _RandomAccessIter>);
1257 return __random_sample(__first, __last,
1258 __out_first, __rand,
1259 __out_last - __out_first);
1262 // partition, stable_partition, and their auxiliary functions
1264 template <class _ForwardIter, class _Predicate>
1265 _ForwardIter __partition(_ForwardIter __first,
1266 _ForwardIter __last,
1268 forward_iterator_tag)
1270 if (__first == __last) return __first;
1272 while (__pred(*__first))
1273 if (++__first == __last) return __first;
1275 _ForwardIter __next = __first;
1277 while (++__next != __last)
1278 if (__pred(*__next)) {
1279 swap(*__first, *__next);
1286 template <class _BidirectionalIter, class _Predicate>
1287 _BidirectionalIter __partition(_BidirectionalIter __first,
1288 _BidirectionalIter __last,
1290 bidirectional_iterator_tag)
1294 if (__first == __last)
1296 else if (__pred(*__first))
1302 if (__first == __last)
1304 else if (!__pred(*__last))
1308 iter_swap(__first, __last);
1313 template <class _ForwardIter, class _Predicate>
1314 inline _ForwardIter partition(_ForwardIter __first,
1315 _ForwardIter __last,
1318 // concept requirements
1319 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1320 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1321 typename iterator_traits<_ForwardIter>::value_type>);
1323 return __partition(__first, __last, __pred, __iterator_category(__first));
1327 template <class _ForwardIter, class _Predicate, class _Distance>
1328 _ForwardIter __inplace_stable_partition(_ForwardIter __first,
1329 _ForwardIter __last,
1330 _Predicate __pred, _Distance __len)
1333 return __pred(*__first) ? __last : __first;
1334 _ForwardIter __middle = __first;
1335 advance(__middle, __len / 2);
1336 return rotate(__inplace_stable_partition(__first, __middle, __pred,
1339 __inplace_stable_partition(__middle, __last, __pred,
1340 __len - __len / 2));
1343 template <class _ForwardIter, class _Pointer, class _Predicate,
1345 _ForwardIter __stable_partition_adaptive(_ForwardIter __first,
1346 _ForwardIter __last,
1347 _Predicate __pred, _Distance __len,
1349 _Distance __buffer_size)
1351 if (__len <= __buffer_size) {
1352 _ForwardIter __result1 = __first;
1353 _Pointer __result2 = __buffer;
1354 for ( ; __first != __last ; ++__first)
1355 if (__pred(*__first)) {
1356 *__result1 = *__first;
1360 *__result2 = *__first;
1363 copy(__buffer, __result2, __result1);
1367 _ForwardIter __middle = __first;
1368 advance(__middle, __len / 2);
1369 return rotate(__stable_partition_adaptive(
1370 __first, __middle, __pred,
1371 __len / 2, __buffer, __buffer_size),
1373 __stable_partition_adaptive(
1374 __middle, __last, __pred,
1375 __len - __len / 2, __buffer, __buffer_size));
1379 template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
1381 __stable_partition_aux(_ForwardIter __first, _ForwardIter __last,
1382 _Predicate __pred, _Tp*, _Distance*)
1384 _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
1385 if (__buf.size() > 0)
1386 return __stable_partition_adaptive(__first, __last, __pred,
1387 _Distance(__buf.requested_size()),
1388 __buf.begin(), __buf.size());
1390 return __inplace_stable_partition(__first, __last, __pred,
1391 _Distance(__buf.requested_size()));
1394 template <class _ForwardIter, class _Predicate>
1395 inline _ForwardIter stable_partition(_ForwardIter __first,
1396 _ForwardIter __last,
1399 // concept requirements
1400 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1401 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1402 typename iterator_traits<_ForwardIter>::value_type>);
1404 if (__first == __last)
1407 return __stable_partition_aux(__first, __last, __pred,
1408 __value_type(__first),
1409 __distance_type(__first));
1412 template <class _RandomAccessIter, class _Tp>
1413 _RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
1414 _RandomAccessIter __last,
1418 while (*__first < __pivot)
1421 while (__pivot < *__last)
1423 if (!(__first < __last))
1425 iter_swap(__first, __last);
1430 template <class _RandomAccessIter, class _Tp, class _Compare>
1431 _RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
1432 _RandomAccessIter __last,
1433 _Tp __pivot, _Compare __comp)
1436 while (__comp(*__first, __pivot))
1439 while (__comp(__pivot, *__last))
1441 if (!(__first < __last))
1443 iter_swap(__first, __last);
1448 const int __stl_threshold = 16;
1450 // sort() and its auxiliary functions.
1452 template <class _RandomAccessIter, class _Tp>
1453 void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
1455 _RandomAccessIter __next = __last;
1457 while (__val < *__next) {
1465 template <class _RandomAccessIter, class _Tp, class _Compare>
1466 void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
1469 _RandomAccessIter __next = __last;
1471 while (__comp(__val, *__next)) {
1479 template <class _RandomAccessIter, class _Tp>
1480 inline void __linear_insert(_RandomAccessIter __first,
1481 _RandomAccessIter __last, _Tp*)
1483 _Tp __val = *__last;
1484 if (__val < *__first) {
1485 copy_backward(__first, __last, __last + 1);
1489 __unguarded_linear_insert(__last, __val);
1492 template <class _RandomAccessIter, class _Tp, class _Compare>
1493 inline void __linear_insert(_RandomAccessIter __first,
1494 _RandomAccessIter __last, _Tp*, _Compare __comp)
1496 _Tp __val = *__last;
1497 if (__comp(__val, *__first)) {
1498 copy_backward(__first, __last, __last + 1);
1502 __unguarded_linear_insert(__last, __val, __comp);
1505 template <class _RandomAccessIter>
1506 void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1508 if (__first == __last) return;
1509 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1510 __linear_insert(__first, __i, __value_type(__first));
1513 template <class _RandomAccessIter, class _Compare>
1514 void __insertion_sort(_RandomAccessIter __first,
1515 _RandomAccessIter __last, _Compare __comp)
1517 if (__first == __last) return;
1518 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1519 __linear_insert(__first, __i, __value_type(__first), __comp);
1522 template <class _RandomAccessIter, class _Tp>
1523 void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
1524 _RandomAccessIter __last, _Tp*)
1526 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1527 __unguarded_linear_insert(__i, _Tp(*__i));
1530 template <class _RandomAccessIter>
1531 inline void __unguarded_insertion_sort(_RandomAccessIter __first,
1532 _RandomAccessIter __last) {
1533 __unguarded_insertion_sort_aux(__first, __last, __value_type(__first));
1536 template <class _RandomAccessIter, class _Tp, class _Compare>
1537 void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
1538 _RandomAccessIter __last,
1539 _Tp*, _Compare __comp)
1541 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1542 __unguarded_linear_insert(__i, _Tp(*__i), __comp);
1545 template <class _RandomAccessIter, class _Compare>
1546 inline void __unguarded_insertion_sort(_RandomAccessIter __first,
1547 _RandomAccessIter __last,
1550 __unguarded_insertion_sort_aux(__first, __last, __value_type(__first),
1554 template <class _RandomAccessIter>
1555 void __final_insertion_sort(_RandomAccessIter __first,
1556 _RandomAccessIter __last)
1558 if (__last - __first > __stl_threshold) {
1559 __insertion_sort(__first, __first + __stl_threshold);
1560 __unguarded_insertion_sort(__first + __stl_threshold, __last);
1563 __insertion_sort(__first, __last);
1566 template <class _RandomAccessIter, class _Compare>
1567 void __final_insertion_sort(_RandomAccessIter __first,
1568 _RandomAccessIter __last, _Compare __comp)
1570 if (__last - __first > __stl_threshold) {
1571 __insertion_sort(__first, __first + __stl_threshold, __comp);
1572 __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
1575 __insertion_sort(__first, __last, __comp);
1578 template <class _Size>
1579 inline _Size __lg(_Size __n)
1582 for (__k = 0; __n != 1; __n >>= 1) ++__k;
1586 template <class _RandomAccessIter, class _Tp, class _Size>
1587 void __introsort_loop(_RandomAccessIter __first,
1588 _RandomAccessIter __last, _Tp*,
1589 _Size __depth_limit)
1591 while (__last - __first > __stl_threshold) {
1592 if (__depth_limit == 0) {
1593 partial_sort(__first, __last, __last);
1597 _RandomAccessIter __cut =
1598 __unguarded_partition(__first, __last,
1599 _Tp(__median(*__first,
1600 *(__first + (__last - __first)/2),
1602 __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
1607 template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
1608 void __introsort_loop(_RandomAccessIter __first,
1609 _RandomAccessIter __last, _Tp*,
1610 _Size __depth_limit, _Compare __comp)
1612 while (__last - __first > __stl_threshold) {
1613 if (__depth_limit == 0) {
1614 partial_sort(__first, __last, __last, __comp);
1618 _RandomAccessIter __cut =
1619 __unguarded_partition(__first, __last,
1620 _Tp(__median(*__first,
1621 *(__first + (__last - __first)/2),
1622 *(__last - 1), __comp)),
1624 __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
1629 template <class _RandomAccessIter>
1630 inline void sort(_RandomAccessIter __first, _RandomAccessIter __last)
1632 // concept requirements
1633 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1634 _RandomAccessIter>);
1635 __glibcpp_function_requires(_LessThanComparableConcept<
1636 typename iterator_traits<_RandomAccessIter>::value_type>);
1638 if (__first != __last) {
1639 __introsort_loop(__first, __last,
1640 __value_type(__first),
1641 __lg(__last - __first) * 2);
1642 __final_insertion_sort(__first, __last);
1646 template <class _RandomAccessIter, class _Compare>
1647 inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
1650 // concept requirements
1651 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1652 _RandomAccessIter>);
1653 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1654 typename iterator_traits<_RandomAccessIter>::value_type,
1655 typename iterator_traits<_RandomAccessIter>::value_type>);
1657 if (__first != __last) {
1658 __introsort_loop(__first, __last,
1659 __value_type(__first),
1660 __lg(__last - __first) * 2,
1662 __final_insertion_sort(__first, __last, __comp);
1666 // stable_sort() and its auxiliary functions.
1668 template <class _RandomAccessIter>
1669 void __inplace_stable_sort(_RandomAccessIter __first,
1670 _RandomAccessIter __last)
1672 if (__last - __first < 15) {
1673 __insertion_sort(__first, __last);
1676 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1677 __inplace_stable_sort(__first, __middle);
1678 __inplace_stable_sort(__middle, __last);
1679 __merge_without_buffer(__first, __middle, __last,
1684 template <class _RandomAccessIter, class _Compare>
1685 void __inplace_stable_sort(_RandomAccessIter __first,
1686 _RandomAccessIter __last, _Compare __comp)
1688 if (__last - __first < 15) {
1689 __insertion_sort(__first, __last, __comp);
1692 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1693 __inplace_stable_sort(__first, __middle, __comp);
1694 __inplace_stable_sort(__middle, __last, __comp);
1695 __merge_without_buffer(__first, __middle, __last,
1701 template <class _RandomAccessIter1, class _RandomAccessIter2,
1703 void __merge_sort_loop(_RandomAccessIter1 __first,
1704 _RandomAccessIter1 __last,
1705 _RandomAccessIter2 __result, _Distance __step_size)
1707 _Distance __two_step = 2 * __step_size;
1709 while (__last - __first >= __two_step) {
1710 __result = merge(__first, __first + __step_size,
1711 __first + __step_size, __first + __two_step,
1713 __first += __two_step;
1716 __step_size = min(_Distance(__last - __first), __step_size);
1717 merge(__first, __first + __step_size, __first + __step_size, __last,
1721 template <class _RandomAccessIter1, class _RandomAccessIter2,
1722 class _Distance, class _Compare>
1723 void __merge_sort_loop(_RandomAccessIter1 __first,
1724 _RandomAccessIter1 __last,
1725 _RandomAccessIter2 __result, _Distance __step_size,
1728 _Distance __two_step = 2 * __step_size;
1730 while (__last - __first >= __two_step) {
1731 __result = merge(__first, __first + __step_size,
1732 __first + __step_size, __first + __two_step,
1735 __first += __two_step;
1737 __step_size = min(_Distance(__last - __first), __step_size);
1739 merge(__first, __first + __step_size,
1740 __first + __step_size, __last,
1745 const int __stl_chunk_size = 7;
1747 template <class _RandomAccessIter, class _Distance>
1748 void __chunk_insertion_sort(_RandomAccessIter __first,
1749 _RandomAccessIter __last, _Distance __chunk_size)
1751 while (__last - __first >= __chunk_size) {
1752 __insertion_sort(__first, __first + __chunk_size);
1753 __first += __chunk_size;
1755 __insertion_sort(__first, __last);
1758 template <class _RandomAccessIter, class _Distance, class _Compare>
1759 void __chunk_insertion_sort(_RandomAccessIter __first,
1760 _RandomAccessIter __last,
1761 _Distance __chunk_size, _Compare __comp)
1763 while (__last - __first >= __chunk_size) {
1764 __insertion_sort(__first, __first + __chunk_size, __comp);
1765 __first += __chunk_size;
1767 __insertion_sort(__first, __last, __comp);
1770 template <class _RandomAccessIter, class _Pointer, class _Distance>
1771 void __merge_sort_with_buffer(_RandomAccessIter __first,
1772 _RandomAccessIter __last,
1773 _Pointer __buffer, _Distance*)
1775 _Distance __len = __last - __first;
1776 _Pointer __buffer_last = __buffer + __len;
1778 _Distance __step_size = __stl_chunk_size;
1779 __chunk_insertion_sort(__first, __last, __step_size);
1781 while (__step_size < __len) {
1782 __merge_sort_loop(__first, __last, __buffer, __step_size);
1784 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
1789 template <class _RandomAccessIter, class _Pointer, class _Distance,
1791 void __merge_sort_with_buffer(_RandomAccessIter __first,
1792 _RandomAccessIter __last, _Pointer __buffer,
1793 _Distance*, _Compare __comp)
1795 _Distance __len = __last - __first;
1796 _Pointer __buffer_last = __buffer + __len;
1798 _Distance __step_size = __stl_chunk_size;
1799 __chunk_insertion_sort(__first, __last, __step_size, __comp);
1801 while (__step_size < __len) {
1802 __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
1804 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
1809 template <class _RandomAccessIter, class _Pointer, class _Distance>
1810 void __stable_sort_adaptive(_RandomAccessIter __first,
1811 _RandomAccessIter __last, _Pointer __buffer,
1812 _Distance __buffer_size)
1814 _Distance __len = (__last - __first + 1) / 2;
1815 _RandomAccessIter __middle = __first + __len;
1816 if (__len > __buffer_size) {
1817 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
1818 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
1821 __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
1822 __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
1824 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1825 _Distance(__last - __middle), __buffer, __buffer_size);
1828 template <class _RandomAccessIter, class _Pointer, class _Distance,
1830 void __stable_sort_adaptive(_RandomAccessIter __first,
1831 _RandomAccessIter __last, _Pointer __buffer,
1832 _Distance __buffer_size, _Compare __comp)
1834 _Distance __len = (__last - __first + 1) / 2;
1835 _RandomAccessIter __middle = __first + __len;
1836 if (__len > __buffer_size) {
1837 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
1839 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
1843 __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
1845 __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
1848 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1849 _Distance(__last - __middle), __buffer, __buffer_size,
1853 template <class _RandomAccessIter, class _Tp, class _Distance>
1854 inline void __stable_sort_aux(_RandomAccessIter __first,
1855 _RandomAccessIter __last, _Tp*, _Distance*)
1857 _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
1858 if (buf.begin() == 0)
1859 __inplace_stable_sort(__first, __last);
1861 __stable_sort_adaptive(__first, __last, buf.begin(),
1862 _Distance(buf.size()));
1865 template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
1866 inline void __stable_sort_aux(_RandomAccessIter __first,
1867 _RandomAccessIter __last, _Tp*, _Distance*,
1870 _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
1871 if (buf.begin() == 0)
1872 __inplace_stable_sort(__first, __last, __comp);
1874 __stable_sort_adaptive(__first, __last, buf.begin(),
1875 _Distance(buf.size()),
1879 template <class _RandomAccessIter>
1880 inline void stable_sort(_RandomAccessIter __first,
1881 _RandomAccessIter __last)
1883 // concept requirements
1884 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1885 _RandomAccessIter>);
1886 __glibcpp_function_requires(_LessThanComparableConcept<
1887 typename iterator_traits<_RandomAccessIter>::value_type>);
1889 __stable_sort_aux(__first, __last,
1890 __value_type(__first),
1891 __distance_type(__first));
1894 template <class _RandomAccessIter, class _Compare>
1895 inline void stable_sort(_RandomAccessIter __first,
1896 _RandomAccessIter __last, _Compare __comp)
1898 // concept requirements
1899 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1900 _RandomAccessIter>);
1901 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1902 typename iterator_traits<_RandomAccessIter>::value_type,
1903 typename iterator_traits<_RandomAccessIter>::value_type>);
1905 __stable_sort_aux(__first, __last,
1906 __value_type(__first),
1907 __distance_type(__first),
1911 // partial_sort, partial_sort_copy, and auxiliary functions.
1913 template <class _RandomAccessIter, class _Tp>
1914 void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
1915 _RandomAccessIter __last, _Tp*)
1917 make_heap(__first, __middle);
1918 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1919 if (*__i < *__first)
1920 __pop_heap(__first, __middle, __i, _Tp(*__i),
1921 __distance_type(__first));
1922 sort_heap(__first, __middle);
1925 template <class _RandomAccessIter>
1926 inline void partial_sort(_RandomAccessIter __first,
1927 _RandomAccessIter __middle,
1928 _RandomAccessIter __last)
1930 // concept requirements
1931 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1932 _RandomAccessIter>);
1933 __glibcpp_function_requires(_LessThanComparableConcept<
1934 typename iterator_traits<_RandomAccessIter>::value_type>);
1936 __partial_sort(__first, __middle, __last, __value_type(__first));
1939 template <class _RandomAccessIter, class _Tp, class _Compare>
1940 void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
1941 _RandomAccessIter __last, _Tp*, _Compare __comp)
1943 make_heap(__first, __middle, __comp);
1944 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1945 if (__comp(*__i, *__first))
1946 __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
1947 __distance_type(__first));
1948 sort_heap(__first, __middle, __comp);
1951 template <class _RandomAccessIter, class _Compare>
1952 inline void partial_sort(_RandomAccessIter __first,
1953 _RandomAccessIter __middle,
1954 _RandomAccessIter __last, _Compare __comp)
1956 // concept requirements
1957 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1958 _RandomAccessIter>);
1959 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1960 typename iterator_traits<_RandomAccessIter>::value_type,
1961 typename iterator_traits<_RandomAccessIter>::value_type>);
1963 __partial_sort(__first, __middle, __last, __value_type(__first), __comp);
1966 template <class _InputIter, class _RandomAccessIter, class _Distance,
1968 _RandomAccessIter __partial_sort_copy(_InputIter __first,
1970 _RandomAccessIter __result_first,
1971 _RandomAccessIter __result_last,
1974 if (__result_first == __result_last) return __result_last;
1975 _RandomAccessIter __result_real_last = __result_first;
1976 while(__first != __last && __result_real_last != __result_last) {
1977 *__result_real_last = *__first;
1978 ++__result_real_last;
1981 make_heap(__result_first, __result_real_last);
1982 while (__first != __last) {
1983 if (*__first < *__result_first)
1984 __adjust_heap(__result_first, _Distance(0),
1985 _Distance(__result_real_last - __result_first),
1989 sort_heap(__result_first, __result_real_last);
1990 return __result_real_last;
1993 template <class _InputIter, class _RandomAccessIter>
1994 inline _RandomAccessIter
1995 partial_sort_copy(_InputIter __first, _InputIter __last,
1996 _RandomAccessIter __result_first,
1997 _RandomAccessIter __result_last)
1999 // concept requirements
2000 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
2001 __glibcpp_function_requires(_ConvertibleConcept<
2002 typename iterator_traits<_InputIter>::value_type,
2003 typename iterator_traits<_RandomAccessIter>::value_type>);
2004 __glibcpp_function_requires(_LessThanComparableConcept<
2005 typename iterator_traits<_RandomAccessIter>::value_type>);
2006 __glibcpp_function_requires(_LessThanComparableConcept<
2007 typename iterator_traits<_InputIter>::value_type>);
2009 return __partial_sort_copy(__first, __last, __result_first, __result_last,
2010 __distance_type(__result_first),
2011 __value_type(__first));
2014 template <class _InputIter, class _RandomAccessIter, class _Compare,
2015 class _Distance, class _Tp>
2016 _RandomAccessIter __partial_sort_copy(_InputIter __first,
2018 _RandomAccessIter __result_first,
2019 _RandomAccessIter __result_last,
2020 _Compare __comp, _Distance*, _Tp*)
2022 if (__result_first == __result_last) return __result_last;
2023 _RandomAccessIter __result_real_last = __result_first;
2024 while(__first != __last && __result_real_last != __result_last) {
2025 *__result_real_last = *__first;
2026 ++__result_real_last;
2029 make_heap(__result_first, __result_real_last, __comp);
2030 while (__first != __last) {
2031 if (__comp(*__first, *__result_first))
2032 __adjust_heap(__result_first, _Distance(0),
2033 _Distance(__result_real_last - __result_first),
2038 sort_heap(__result_first, __result_real_last, __comp);
2039 return __result_real_last;
2042 template <class _InputIter, class _RandomAccessIter, class _Compare>
2043 inline _RandomAccessIter
2044 partial_sort_copy(_InputIter __first, _InputIter __last,
2045 _RandomAccessIter __result_first,
2046 _RandomAccessIter __result_last, _Compare __comp)
2048 // concept requirements
2049 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
2050 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2051 _RandomAccessIter>);
2052 __glibcpp_function_requires(_ConvertibleConcept<
2053 typename iterator_traits<_InputIter>::value_type,
2054 typename iterator_traits<_RandomAccessIter>::value_type>);
2055 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2056 typename iterator_traits<_RandomAccessIter>::value_type,
2057 typename iterator_traits<_RandomAccessIter>::value_type>);
2059 return __partial_sort_copy(__first, __last, __result_first, __result_last,
2061 __distance_type(__result_first),
2062 __value_type(__first));
2065 // nth_element() and its auxiliary functions.
2067 template <class _RandomAccessIter, class _Tp>
2068 void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2069 _RandomAccessIter __last, _Tp*)
2071 while (__last - __first > 3) {
2072 _RandomAccessIter __cut =
2073 __unguarded_partition(__first, __last,
2074 _Tp(__median(*__first,
2075 *(__first + (__last - __first)/2),
2082 __insertion_sort(__first, __last);
2085 template <class _RandomAccessIter>
2086 inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2087 _RandomAccessIter __last)
2089 // concept requirements
2090 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2091 _RandomAccessIter>);
2092 __glibcpp_function_requires(_LessThanComparableConcept<
2093 typename iterator_traits<_RandomAccessIter>::value_type>);
2095 __nth_element(__first, __nth, __last, __value_type(__first));
2098 template <class _RandomAccessIter, class _Tp, class _Compare>
2099 void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2100 _RandomAccessIter __last, _Tp*, _Compare __comp)
2102 while (__last - __first > 3) {
2103 _RandomAccessIter __cut =
2104 __unguarded_partition(__first, __last,
2105 _Tp(__median(*__first,
2106 *(__first + (__last - __first)/2),
2115 __insertion_sort(__first, __last, __comp);
2118 template <class _RandomAccessIter, class _Compare>
2119 inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2120 _RandomAccessIter __last, _Compare __comp)
2122 // concept requirements
2123 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2124 _RandomAccessIter>);
2125 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2126 typename iterator_traits<_RandomAccessIter>::value_type,
2127 typename iterator_traits<_RandomAccessIter>::value_type>);
2129 __nth_element(__first, __nth, __last, __value_type(__first), __comp);
2133 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
2135 template <class _ForwardIter, class _Tp, class _Distance>
2136 _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
2137 const _Tp& __val, _Distance*)
2139 _Distance __len = 0;
2140 distance(__first, __last, __len);
2142 _ForwardIter __middle;
2145 __half = __len >> 1;
2147 advance(__middle, __half);
2148 if (*__middle < __val) {
2151 __len = __len - __half - 1;
2159 template <class _ForwardIter, class _Tp>
2160 inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
2163 // concept requirements
2164 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2165 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2166 typename iterator_traits<_ForwardIter>::value_type>);
2167 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2169 return __lower_bound(__first, __last, __val,
2170 __distance_type(__first));
2173 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2174 _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
2175 const _Tp& __val, _Compare __comp, _Distance*)
2177 _Distance __len = 0;
2178 distance(__first, __last, __len);
2180 _ForwardIter __middle;
2183 __half = __len >> 1;
2185 advance(__middle, __half);
2186 if (__comp(*__middle, __val)) {
2189 __len = __len - __half - 1;
2197 template <class _ForwardIter, class _Tp, class _Compare>
2198 inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
2199 const _Tp& __val, _Compare __comp)
2201 // concept requirements
2202 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2203 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2204 typename iterator_traits<_ForwardIter>::value_type>);
2205 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2207 return __lower_bound(__first, __last, __val, __comp,
2208 __distance_type(__first));
2211 template <class _ForwardIter, class _Tp, class _Distance>
2212 _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
2213 const _Tp& __val, _Distance*)
2215 _Distance __len = 0;
2216 distance(__first, __last, __len);
2218 _ForwardIter __middle;
2221 __half = __len >> 1;
2223 advance(__middle, __half);
2224 if (__val < *__middle)
2229 __len = __len - __half - 1;
2235 template <class _ForwardIter, class _Tp>
2236 inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
2239 // concept requirements
2240 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2241 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2242 typename iterator_traits<_ForwardIter>::value_type>);
2243 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2245 return __upper_bound(__first, __last, __val,
2246 __distance_type(__first));
2249 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2250 _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
2251 const _Tp& __val, _Compare __comp, _Distance*)
2253 _Distance __len = 0;
2254 distance(__first, __last, __len);
2256 _ForwardIter __middle;
2259 __half = __len >> 1;
2261 advance(__middle, __half);
2262 if (__comp(__val, *__middle))
2267 __len = __len - __half - 1;
2273 template <class _ForwardIter, class _Tp, class _Compare>
2274 inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
2275 const _Tp& __val, _Compare __comp)
2277 // concept requirements
2278 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2279 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2280 typename iterator_traits<_ForwardIter>::value_type>);
2281 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2283 return __upper_bound(__first, __last, __val, __comp,
2284 __distance_type(__first));
2287 template <class _ForwardIter, class _Tp, class _Distance>
2288 pair<_ForwardIter, _ForwardIter>
2289 __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2292 _Distance __len = 0;
2293 distance(__first, __last, __len);
2295 _ForwardIter __middle, __left, __right;
2298 __half = __len >> 1;
2300 advance(__middle, __half);
2301 if (*__middle < __val) {
2304 __len = __len - __half - 1;
2306 else if (__val < *__middle)
2309 __left = lower_bound(__first, __middle, __val);
2310 advance(__first, __len);
2311 __right = upper_bound(++__middle, __first, __val);
2312 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2315 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2318 template <class _ForwardIter, class _Tp>
2319 inline pair<_ForwardIter, _ForwardIter>
2320 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2322 // concept requirements
2323 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2324 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2325 typename iterator_traits<_ForwardIter>::value_type>);
2326 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2328 return __equal_range(__first, __last, __val,
2329 __distance_type(__first));
2332 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2333 pair<_ForwardIter, _ForwardIter>
2334 __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2335 _Compare __comp, _Distance*)
2337 _Distance __len = 0;
2338 distance(__first, __last, __len);
2340 _ForwardIter __middle, __left, __right;
2343 __half = __len >> 1;
2345 advance(__middle, __half);
2346 if (__comp(*__middle, __val)) {
2349 __len = __len - __half - 1;
2351 else if (__comp(__val, *__middle))
2354 __left = lower_bound(__first, __middle, __val, __comp);
2355 advance(__first, __len);
2356 __right = upper_bound(++__middle, __first, __val, __comp);
2357 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2360 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2363 template <class _ForwardIter, class _Tp, class _Compare>
2364 inline pair<_ForwardIter, _ForwardIter>
2365 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2368 // concept requirements
2369 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2370 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2371 typename iterator_traits<_ForwardIter>::value_type>);
2372 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2374 return __equal_range(__first, __last, __val, __comp,
2375 __distance_type(__first));
2378 template <class _ForwardIter, class _Tp>
2379 bool binary_search(_ForwardIter __first, _ForwardIter __last,
2382 // concept requirements
2383 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2384 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2385 typename iterator_traits<_ForwardIter>::value_type>);
2386 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2388 _ForwardIter __i = lower_bound(__first, __last, __val);
2389 return __i != __last && !(__val < *__i);
2392 template <class _ForwardIter, class _Tp, class _Compare>
2393 bool binary_search(_ForwardIter __first, _ForwardIter __last,
2397 // concept requirements
2398 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2399 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2400 typename iterator_traits<_ForwardIter>::value_type>);
2401 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2403 _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
2404 return __i != __last && !__comp(__val, *__i);
2407 // merge, with and without an explicitly supplied comparison function.
2409 template <class _InputIter1, class _InputIter2, class _OutputIter>
2410 _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
2411 _InputIter2 __first2, _InputIter2 __last2,
2412 _OutputIter __result)
2414 // concept requirements
2415 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2416 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2417 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2418 typename iterator_traits<_InputIter1>::value_type>);
2419 __glibcpp_function_requires(_SameTypeConcept<
2420 typename iterator_traits<_InputIter1>::value_type,
2421 typename iterator_traits<_InputIter2>::value_type>);
2422 __glibcpp_function_requires(_LessThanComparableConcept<
2423 typename iterator_traits<_InputIter1>::value_type>);
2425 while (__first1 != __last1 && __first2 != __last2) {
2426 if (*__first2 < *__first1) {
2427 *__result = *__first2;
2431 *__result = *__first1;
2436 return copy(__first2, __last2, copy(__first1, __last1, __result));
2439 template <class _InputIter1, class _InputIter2, class _OutputIter,
2441 _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
2442 _InputIter2 __first2, _InputIter2 __last2,
2443 _OutputIter __result, _Compare __comp)
2445 // concept requirements
2446 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2447 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2448 __glibcpp_function_requires(_SameTypeConcept<
2449 typename iterator_traits<_InputIter1>::value_type,
2450 typename iterator_traits<_InputIter2>::value_type>);
2451 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2452 typename iterator_traits<_InputIter1>::value_type>);
2453 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2454 typename iterator_traits<_InputIter1>::value_type,
2455 typename iterator_traits<_InputIter2>::value_type>);
2457 while (__first1 != __last1 && __first2 != __last2) {
2458 if (__comp(*__first2, *__first1)) {
2459 *__result = *__first2;
2463 *__result = *__first1;
2468 return copy(__first2, __last2, copy(__first1, __last1, __result));
2471 // inplace_merge and its auxiliary functions.
2473 template <class _BidirectionalIter, class _Distance>
2474 void __merge_without_buffer(_BidirectionalIter __first,
2475 _BidirectionalIter __middle,
2476 _BidirectionalIter __last,
2477 _Distance __len1, _Distance __len2)
2479 if (__len1 == 0 || __len2 == 0)
2481 if (__len1 + __len2 == 2) {
2482 if (*__middle < *__first)
2483 iter_swap(__first, __middle);
2486 _BidirectionalIter __first_cut = __first;
2487 _BidirectionalIter __second_cut = __middle;
2488 _Distance __len11 = 0;
2489 _Distance __len22 = 0;
2490 if (__len1 > __len2) {
2491 __len11 = __len1 / 2;
2492 advance(__first_cut, __len11);
2493 __second_cut = lower_bound(__middle, __last, *__first_cut);
2494 distance(__middle, __second_cut, __len22);
2497 __len22 = __len2 / 2;
2498 advance(__second_cut, __len22);
2499 __first_cut = upper_bound(__first, __middle, *__second_cut);
2500 distance(__first, __first_cut, __len11);
2502 _BidirectionalIter __new_middle
2503 = rotate(__first_cut, __middle, __second_cut);
2504 __merge_without_buffer(__first, __first_cut, __new_middle,
2506 __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
2510 template <class _BidirectionalIter, class _Distance, class _Compare>
2511 void __merge_without_buffer(_BidirectionalIter __first,
2512 _BidirectionalIter __middle,
2513 _BidirectionalIter __last,
2514 _Distance __len1, _Distance __len2,
2517 if (__len1 == 0 || __len2 == 0)
2519 if (__len1 + __len2 == 2) {
2520 if (__comp(*__middle, *__first))
2521 iter_swap(__first, __middle);
2524 _BidirectionalIter __first_cut = __first;
2525 _BidirectionalIter __second_cut = __middle;
2526 _Distance __len11 = 0;
2527 _Distance __len22 = 0;
2528 if (__len1 > __len2) {
2529 __len11 = __len1 / 2;
2530 advance(__first_cut, __len11);
2531 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2532 distance(__middle, __second_cut, __len22);
2535 __len22 = __len2 / 2;
2536 advance(__second_cut, __len22);
2537 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2538 distance(__first, __first_cut, __len11);
2540 _BidirectionalIter __new_middle
2541 = rotate(__first_cut, __middle, __second_cut);
2542 __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
2544 __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
2545 __len2 - __len22, __comp);
2548 template <class _BidirectionalIter1, class _BidirectionalIter2,
2550 _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
2551 _BidirectionalIter1 __middle,
2552 _BidirectionalIter1 __last,
2553 _Distance __len1, _Distance __len2,
2554 _BidirectionalIter2 __buffer,
2555 _Distance __buffer_size)
2557 _BidirectionalIter2 __buffer_end;
2558 if (__len1 > __len2 && __len2 <= __buffer_size) {
2559 __buffer_end = copy(__middle, __last, __buffer);
2560 copy_backward(__first, __middle, __last);
2561 return copy(__buffer, __buffer_end, __first);
2563 else if (__len1 <= __buffer_size) {
2564 __buffer_end = copy(__first, __middle, __buffer);
2565 copy(__middle, __last, __first);
2566 return copy_backward(__buffer, __buffer_end, __last);
2569 return rotate(__first, __middle, __last);
2572 template <class _BidirectionalIter1, class _BidirectionalIter2,
2573 class _BidirectionalIter3>
2574 _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
2575 _BidirectionalIter1 __last1,
2576 _BidirectionalIter2 __first2,
2577 _BidirectionalIter2 __last2,
2578 _BidirectionalIter3 __result)
2580 if (__first1 == __last1)
2581 return copy_backward(__first2, __last2, __result);
2582 if (__first2 == __last2)
2583 return copy_backward(__first1, __last1, __result);
2587 if (*__last2 < *__last1) {
2588 *--__result = *__last1;
2589 if (__first1 == __last1)
2590 return copy_backward(__first2, ++__last2, __result);
2594 *--__result = *__last2;
2595 if (__first2 == __last2)
2596 return copy_backward(__first1, ++__last1, __result);
2602 template <class _BidirectionalIter1, class _BidirectionalIter2,
2603 class _BidirectionalIter3, class _Compare>
2604 _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
2605 _BidirectionalIter1 __last1,
2606 _BidirectionalIter2 __first2,
2607 _BidirectionalIter2 __last2,
2608 _BidirectionalIter3 __result,
2611 if (__first1 == __last1)
2612 return copy_backward(__first2, __last2, __result);
2613 if (__first2 == __last2)
2614 return copy_backward(__first1, __last1, __result);
2618 if (__comp(*__last2, *__last1)) {
2619 *--__result = *__last1;
2620 if (__first1 == __last1)
2621 return copy_backward(__first2, ++__last2, __result);
2625 *--__result = *__last2;
2626 if (__first2 == __last2)
2627 return copy_backward(__first1, ++__last1, __result);
2633 template <class _BidirectionalIter, class _Distance, class _Pointer>
2634 void __merge_adaptive(_BidirectionalIter __first,
2635 _BidirectionalIter __middle,
2636 _BidirectionalIter __last,
2637 _Distance __len1, _Distance __len2,
2638 _Pointer __buffer, _Distance __buffer_size)
2640 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2641 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2642 merge(__buffer, __buffer_end, __middle, __last, __first);
2644 else if (__len2 <= __buffer_size) {
2645 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2646 __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
2649 _BidirectionalIter __first_cut = __first;
2650 _BidirectionalIter __second_cut = __middle;
2651 _Distance __len11 = 0;
2652 _Distance __len22 = 0;
2653 if (__len1 > __len2) {
2654 __len11 = __len1 / 2;
2655 advance(__first_cut, __len11);
2656 __second_cut = lower_bound(__middle, __last, *__first_cut);
2657 distance(__middle, __second_cut, __len22);
2660 __len22 = __len2 / 2;
2661 advance(__second_cut, __len22);
2662 __first_cut = upper_bound(__first, __middle, *__second_cut);
2663 distance(__first, __first_cut, __len11);
2665 _BidirectionalIter __new_middle =
2666 __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
2667 __len22, __buffer, __buffer_size);
2668 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2669 __len22, __buffer, __buffer_size);
2670 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2671 __len2 - __len22, __buffer, __buffer_size);
2675 template <class _BidirectionalIter, class _Distance, class _Pointer,
2677 void __merge_adaptive(_BidirectionalIter __first,
2678 _BidirectionalIter __middle,
2679 _BidirectionalIter __last,
2680 _Distance __len1, _Distance __len2,
2681 _Pointer __buffer, _Distance __buffer_size,
2684 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2685 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2686 merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
2688 else if (__len2 <= __buffer_size) {
2689 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2690 __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
2694 _BidirectionalIter __first_cut = __first;
2695 _BidirectionalIter __second_cut = __middle;
2696 _Distance __len11 = 0;
2697 _Distance __len22 = 0;
2698 if (__len1 > __len2) {
2699 __len11 = __len1 / 2;
2700 advance(__first_cut, __len11);
2701 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2702 distance(__middle, __second_cut, __len22);
2705 __len22 = __len2 / 2;
2706 advance(__second_cut, __len22);
2707 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2708 distance(__first, __first_cut, __len11);
2710 _BidirectionalIter __new_middle =
2711 __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
2712 __len22, __buffer, __buffer_size);
2713 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2714 __len22, __buffer, __buffer_size, __comp);
2715 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2716 __len2 - __len22, __buffer, __buffer_size, __comp);
2720 template <class _BidirectionalIter, class _Tp, class _Distance>
2721 inline void __inplace_merge_aux(_BidirectionalIter __first,
2722 _BidirectionalIter __middle,
2723 _BidirectionalIter __last, _Tp*, _Distance*)
2725 _Distance __len1 = 0;
2726 distance(__first, __middle, __len1);
2727 _Distance __len2 = 0;
2728 distance(__middle, __last, __len2);
2730 _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
2731 if (__buf.begin() == 0)
2732 __merge_without_buffer(__first, __middle, __last, __len1, __len2);
2734 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2735 __buf.begin(), _Distance(__buf.size()));
2738 template <class _BidirectionalIter, class _Tp,
2739 class _Distance, class _Compare>
2740 inline void __inplace_merge_aux(_BidirectionalIter __first,
2741 _BidirectionalIter __middle,
2742 _BidirectionalIter __last, _Tp*, _Distance*,
2745 _Distance __len1 = 0;
2746 distance(__first, __middle, __len1);
2747 _Distance __len2 = 0;
2748 distance(__middle, __last, __len2);
2750 _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
2751 if (__buf.begin() == 0)
2752 __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
2754 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2755 __buf.begin(), _Distance(__buf.size()),
2759 template <class _BidirectionalIter>
2760 inline void inplace_merge(_BidirectionalIter __first,
2761 _BidirectionalIter __middle,
2762 _BidirectionalIter __last)
2764 // concept requirements
2765 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2766 _BidirectionalIter>);
2767 __glibcpp_function_requires(_LessThanComparableConcept<
2768 typename iterator_traits<_BidirectionalIter>::value_type>);
2770 if (__first == __middle || __middle == __last)
2772 __inplace_merge_aux(__first, __middle, __last,
2773 __value_type(__first), __distance_type(__first));
2776 template <class _BidirectionalIter, class _Compare>
2777 inline void inplace_merge(_BidirectionalIter __first,
2778 _BidirectionalIter __middle,
2779 _BidirectionalIter __last, _Compare __comp)
2781 // concept requirements
2782 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2783 _BidirectionalIter>);
2784 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2785 typename iterator_traits<_BidirectionalIter>::value_type,
2786 typename iterator_traits<_BidirectionalIter>::value_type>);
2788 if (__first == __middle || __middle == __last)
2790 __inplace_merge_aux(__first, __middle, __last,
2791 __value_type(__first), __distance_type(__first),
2795 // Set algorithms: includes, set_union, set_intersection, set_difference,
2796 // set_symmetric_difference. All of these algorithms have the precondition
2797 // that their input ranges are sorted and the postcondition that their output
2798 // ranges are sorted.
2800 template <class _InputIter1, class _InputIter2>
2801 bool includes(_InputIter1 __first1, _InputIter1 __last1,
2802 _InputIter2 __first2, _InputIter2 __last2)
2804 // concept requirements
2805 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2806 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2807 __glibcpp_function_requires(_SameTypeConcept<
2808 typename iterator_traits<_InputIter1>::value_type,
2809 typename iterator_traits<_InputIter2>::value_type>);
2810 __glibcpp_function_requires(_LessThanComparableConcept<
2811 typename iterator_traits<_InputIter1>::value_type>);
2813 while (__first1 != __last1 && __first2 != __last2)
2814 if (*__first2 < *__first1)
2816 else if(*__first1 < *__first2)
2819 ++__first1, ++__first2;
2821 return __first2 == __last2;
2824 template <class _InputIter1, class _InputIter2, class _Compare>
2825 bool includes(_InputIter1 __first1, _InputIter1 __last1,
2826 _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
2828 // concept requirements
2829 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2830 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2831 __glibcpp_function_requires(_SameTypeConcept<
2832 typename iterator_traits<_InputIter1>::value_type,
2833 typename iterator_traits<_InputIter2>::value_type>);
2834 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2835 typename iterator_traits<_InputIter1>::value_type,
2836 typename iterator_traits<_InputIter2>::value_type>);
2838 while (__first1 != __last1 && __first2 != __last2)
2839 if (__comp(*__first2, *__first1))
2841 else if(__comp(*__first1, *__first2))
2844 ++__first1, ++__first2;
2846 return __first2 == __last2;
2849 template <class _InputIter1, class _InputIter2, class _OutputIter>
2850 _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
2851 _InputIter2 __first2, _InputIter2 __last2,
2852 _OutputIter __result)
2854 // concept requirements
2855 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2856 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2857 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2858 typename iterator_traits<_InputIter1>::value_type>);
2859 __glibcpp_function_requires(_SameTypeConcept<
2860 typename iterator_traits<_InputIter1>::value_type,
2861 typename iterator_traits<_InputIter2>::value_type>);
2862 __glibcpp_function_requires(_LessThanComparableConcept<
2863 typename iterator_traits<_InputIter1>::value_type>);
2865 while (__first1 != __last1 && __first2 != __last2) {
2866 if (*__first1 < *__first2) {
2867 *__result = *__first1;
2870 else if (*__first2 < *__first1) {
2871 *__result = *__first2;
2875 *__result = *__first1;
2881 return copy(__first2, __last2, copy(__first1, __last1, __result));
2884 template <class _InputIter1, class _InputIter2, class _OutputIter,
2886 _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
2887 _InputIter2 __first2, _InputIter2 __last2,
2888 _OutputIter __result, _Compare __comp)
2890 // concept requirements
2891 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2892 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2893 __glibcpp_function_requires(_SameTypeConcept<
2894 typename iterator_traits<_InputIter1>::value_type,
2895 typename iterator_traits<_InputIter2>::value_type>);
2896 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2897 typename iterator_traits<_InputIter1>::value_type>);
2898 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2899 typename iterator_traits<_InputIter1>::value_type,
2900 typename iterator_traits<_InputIter2>::value_type>);
2902 while (__first1 != __last1 && __first2 != __last2) {
2903 if (__comp(*__first1, *__first2)) {
2904 *__result = *__first1;
2907 else if (__comp(*__first2, *__first1)) {
2908 *__result = *__first2;
2912 *__result = *__first1;
2918 return copy(__first2, __last2, copy(__first1, __last1, __result));
2921 template <class _InputIter1, class _InputIter2, class _OutputIter>
2922 _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2923 _InputIter2 __first2, _InputIter2 __last2,
2924 _OutputIter __result)
2926 // concept requirements
2927 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2928 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2929 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2930 typename iterator_traits<_InputIter1>::value_type>);
2931 __glibcpp_function_requires(_SameTypeConcept<
2932 typename iterator_traits<_InputIter1>::value_type,
2933 typename iterator_traits<_InputIter2>::value_type>);
2934 __glibcpp_function_requires(_LessThanComparableConcept<
2935 typename iterator_traits<_InputIter1>::value_type>);
2937 while (__first1 != __last1 && __first2 != __last2)
2938 if (*__first1 < *__first2)
2940 else if (*__first2 < *__first1)
2943 *__result = *__first1;
2951 template <class _InputIter1, class _InputIter2, class _OutputIter,
2953 _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2954 _InputIter2 __first2, _InputIter2 __last2,
2955 _OutputIter __result, _Compare __comp)
2957 // concept requirements
2958 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2959 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2960 __glibcpp_function_requires(_SameTypeConcept<
2961 typename iterator_traits<_InputIter1>::value_type,
2962 typename iterator_traits<_InputIter2>::value_type>);
2963 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2964 typename iterator_traits<_InputIter1>::value_type>);
2965 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2966 typename iterator_traits<_InputIter1>::value_type,
2967 typename iterator_traits<_InputIter2>::value_type>);
2969 while (__first1 != __last1 && __first2 != __last2)
2970 if (__comp(*__first1, *__first2))
2972 else if (__comp(*__first2, *__first1))
2975 *__result = *__first1;
2983 template <class _InputIter1, class _InputIter2, class _OutputIter>
2984 _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
2985 _InputIter2 __first2, _InputIter2 __last2,
2986 _OutputIter __result)
2988 // concept requirements
2989 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2990 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2991 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2992 typename iterator_traits<_InputIter1>::value_type>);
2993 __glibcpp_function_requires(_SameTypeConcept<
2994 typename iterator_traits<_InputIter1>::value_type,
2995 typename iterator_traits<_InputIter2>::value_type>);
2996 __glibcpp_function_requires(_LessThanComparableConcept<
2997 typename iterator_traits<_InputIter1>::value_type>);
2999 while (__first1 != __last1 && __first2 != __last2)
3000 if (*__first1 < *__first2) {
3001 *__result = *__first1;
3005 else if (*__first2 < *__first1)
3011 return copy(__first1, __last1, __result);
3014 template <class _InputIter1, class _InputIter2, class _OutputIter,
3016 _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
3017 _InputIter2 __first2, _InputIter2 __last2,
3018 _OutputIter __result, _Compare __comp)
3020 // concept requirements
3021 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3022 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3023 __glibcpp_function_requires(_SameTypeConcept<
3024 typename iterator_traits<_InputIter1>::value_type,
3025 typename iterator_traits<_InputIter2>::value_type>);
3026 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3027 typename iterator_traits<_InputIter1>::value_type>);
3028 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3029 typename iterator_traits<_InputIter1>::value_type,
3030 typename iterator_traits<_InputIter2>::value_type>);
3032 while (__first1 != __last1 && __first2 != __last2)
3033 if (__comp(*__first1, *__first2)) {
3034 *__result = *__first1;
3038 else if (__comp(*__first2, *__first1))
3044 return copy(__first1, __last1, __result);
3047 template <class _InputIter1, class _InputIter2, class _OutputIter>
3049 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3050 _InputIter2 __first2, _InputIter2 __last2,
3051 _OutputIter __result)
3053 // concept requirements
3054 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3055 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3056 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3057 typename iterator_traits<_InputIter1>::value_type>);
3058 __glibcpp_function_requires(_SameTypeConcept<
3059 typename iterator_traits<_InputIter1>::value_type,
3060 typename iterator_traits<_InputIter2>::value_type>);
3061 __glibcpp_function_requires(_LessThanComparableConcept<
3062 typename iterator_traits<_InputIter1>::value_type>);
3064 while (__first1 != __last1 && __first2 != __last2)
3065 if (*__first1 < *__first2) {
3066 *__result = *__first1;
3070 else if (*__first2 < *__first1) {
3071 *__result = *__first2;
3079 return copy(__first2, __last2, copy(__first1, __last1, __result));
3082 template <class _InputIter1, class _InputIter2, class _OutputIter,
3085 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3086 _InputIter2 __first2, _InputIter2 __last2,
3087 _OutputIter __result,
3090 // concept requirements
3091 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3092 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3093 __glibcpp_function_requires(_SameTypeConcept<
3094 typename iterator_traits<_InputIter1>::value_type,
3095 typename iterator_traits<_InputIter2>::value_type>);
3096 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3097 typename iterator_traits<_InputIter1>::value_type>);
3098 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3099 typename iterator_traits<_InputIter1>::value_type,
3100 typename iterator_traits<_InputIter2>::value_type>);
3102 while (__first1 != __last1 && __first2 != __last2)
3103 if (__comp(*__first1, *__first2)) {
3104 *__result = *__first1;
3108 else if (__comp(*__first2, *__first1)) {
3109 *__result = *__first2;
3117 return copy(__first2, __last2, copy(__first1, __last1, __result));
3120 // min_element and max_element, with and without an explicitly supplied
3121 // comparison function.
3123 template <class _ForwardIter>
3124 _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last)
3126 // concept requirements
3127 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3128 __glibcpp_function_requires(_LessThanComparableConcept<
3129 typename iterator_traits<_ForwardIter>::value_type>);
3131 if (__first == __last) return __first;
3132 _ForwardIter __result = __first;
3133 while (++__first != __last)
3134 if (*__result < *__first)
3139 template <class _ForwardIter, class _Compare>
3140 _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
3143 // concept requirements
3144 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3145 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3146 typename iterator_traits<_ForwardIter>::value_type,
3147 typename iterator_traits<_ForwardIter>::value_type>);
3149 if (__first == __last) return __first;
3150 _ForwardIter __result = __first;
3151 while (++__first != __last)
3152 if (__comp(*__result, *__first)) __result = __first;
3156 template <class _ForwardIter>
3157 _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last)
3159 // concept requirements
3160 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3161 __glibcpp_function_requires(_LessThanComparableConcept<
3162 typename iterator_traits<_ForwardIter>::value_type>);
3164 if (__first == __last) return __first;
3165 _ForwardIter __result = __first;
3166 while (++__first != __last)
3167 if (*__first < *__result)
3172 template <class _ForwardIter, class _Compare>
3173 _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
3176 // concept requirements
3177 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3178 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3179 typename iterator_traits<_ForwardIter>::value_type,
3180 typename iterator_traits<_ForwardIter>::value_type>);
3182 if (__first == __last) return __first;
3183 _ForwardIter __result = __first;
3184 while (++__first != __last)
3185 if (__comp(*__first, *__result))
3190 // next_permutation and prev_permutation, with and without an explicitly
3191 // supplied comparison function.
3193 template <class _BidirectionalIter>
3194 bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3196 // concept requirements
3197 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3198 __glibcpp_function_requires(_LessThanComparableConcept<
3199 typename iterator_traits<_BidirectionalIter>::value_type>);
3201 if (__first == __last)
3203 _BidirectionalIter __i = __first;
3211 _BidirectionalIter __ii = __i;
3214 _BidirectionalIter __j = __last;
3215 while (!(*__i < *--__j))
3217 iter_swap(__i, __j);
3218 reverse(__ii, __last);
3221 if (__i == __first) {
3222 reverse(__first, __last);
3228 template <class _BidirectionalIter, class _Compare>
3229 bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3232 // concept requirements
3233 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3234 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3235 typename iterator_traits<_BidirectionalIter>::value_type,
3236 typename iterator_traits<_BidirectionalIter>::value_type>);
3238 if (__first == __last)
3240 _BidirectionalIter __i = __first;
3248 _BidirectionalIter __ii = __i;
3250 if (__comp(*__i, *__ii)) {
3251 _BidirectionalIter __j = __last;
3252 while (!__comp(*__i, *--__j))
3254 iter_swap(__i, __j);
3255 reverse(__ii, __last);
3258 if (__i == __first) {
3259 reverse(__first, __last);
3265 template <class _BidirectionalIter>
3266 bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3268 // concept requirements
3269 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3270 __glibcpp_function_requires(_LessThanComparableConcept<
3271 typename iterator_traits<_BidirectionalIter>::value_type>);
3273 if (__first == __last)
3275 _BidirectionalIter __i = __first;
3283 _BidirectionalIter __ii = __i;
3286 _BidirectionalIter __j = __last;
3287 while (!(*--__j < *__i))
3289 iter_swap(__i, __j);
3290 reverse(__ii, __last);
3293 if (__i == __first) {
3294 reverse(__first, __last);
3300 template <class _BidirectionalIter, class _Compare>
3301 bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3304 // concept requirements
3305 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3306 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3307 typename iterator_traits<_BidirectionalIter>::value_type,
3308 typename iterator_traits<_BidirectionalIter>::value_type>);
3310 if (__first == __last)
3312 _BidirectionalIter __i = __first;
3320 _BidirectionalIter __ii = __i;
3322 if (__comp(*__ii, *__i)) {
3323 _BidirectionalIter __j = __last;
3324 while (!__comp(*--__j, *__i))
3326 iter_swap(__i, __j);
3327 reverse(__ii, __last);
3330 if (__i == __first) {
3331 reverse(__first, __last);
3337 // find_first_of, with and without an explicitly supplied comparison function.
3339 template <class _InputIter, class _ForwardIter>
3340 _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
3341 _ForwardIter __first2, _ForwardIter __last2)
3343 // concept requirements
3344 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
3345 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3346 __glibcpp_function_requires(_EqualOpConcept<
3347 typename iterator_traits<_InputIter>::value_type,
3348 typename iterator_traits<_ForwardIter>::value_type>);
3350 for ( ; __first1 != __last1; ++__first1)
3351 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3352 if (*__first1 == *__iter)
3357 template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
3358 _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
3359 _ForwardIter __first2, _ForwardIter __last2,
3360 _BinaryPredicate __comp)
3362 // concept requirements
3363 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
3364 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3365 __glibcpp_function_requires(_EqualOpConcept<
3366 typename iterator_traits<_InputIter>::value_type,
3367 typename iterator_traits<_ForwardIter>::value_type>);
3368 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3369 typename iterator_traits<_InputIter>::value_type,
3370 typename iterator_traits<_ForwardIter>::value_type>);
3372 for ( ; __first1 != __last1; ++__first1)
3373 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3374 if (__comp(*__first1, *__iter))
3380 // find_end, with and without an explicitly supplied comparison function.
3381 // Search [first2, last2) as a subsequence in [first1, last1), and return
3382 // the *last* possible match. Note that find_end for bidirectional iterators
3383 // is much faster than for forward iterators.
3385 // find_end for forward iterators.
3386 template <class _ForwardIter1, class _ForwardIter2>
3387 _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3388 _ForwardIter2 __first2, _ForwardIter2 __last2,
3389 forward_iterator_tag, forward_iterator_tag)
3391 if (__first2 == __last2)
3394 _ForwardIter1 __result = __last1;
3396 _ForwardIter1 __new_result
3397 = search(__first1, __last1, __first2, __last2);
3398 if (__new_result == __last1)
3401 __result = __new_result;
3402 __first1 = __new_result;
3409 template <class _ForwardIter1, class _ForwardIter2,
3410 class _BinaryPredicate>
3411 _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3412 _ForwardIter2 __first2, _ForwardIter2 __last2,
3413 forward_iterator_tag, forward_iterator_tag,
3414 _BinaryPredicate __comp)
3416 if (__first2 == __last2)
3419 _ForwardIter1 __result = __last1;
3421 _ForwardIter1 __new_result
3422 = search(__first1, __last1, __first2, __last2, __comp);
3423 if (__new_result == __last1)
3426 __result = __new_result;
3427 __first1 = __new_result;
3434 // find_end for bidirectional iterators. Requires partial specialization.
3435 template <class _BidirectionalIter1, class _BidirectionalIter2>
3437 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3438 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3439 bidirectional_iterator_tag, bidirectional_iterator_tag)
3441 // concept requirements
3442 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>);
3443 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>);
3445 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3446 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3448 _RevIter1 __rlast1(__first1);
3449 _RevIter2 __rlast2(__first2);
3450 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3451 _RevIter2(__last2), __rlast2);
3453 if (__rresult == __rlast1)
3456 _BidirectionalIter1 __result = __rresult.base();
3457 advance(__result, -distance(__first2, __last2));
3462 template <class _BidirectionalIter1, class _BidirectionalIter2,
3463 class _BinaryPredicate>
3465 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3466 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3467 bidirectional_iterator_tag, bidirectional_iterator_tag,
3468 _BinaryPredicate __comp)
3470 // concept requirements
3471 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>);
3472 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>);
3474 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3475 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3477 _RevIter1 __rlast1(__first1);
3478 _RevIter2 __rlast2(__first2);
3479 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3480 _RevIter2(__last2), __rlast2,
3483 if (__rresult == __rlast1)
3486 _BidirectionalIter1 __result = __rresult.base();
3487 advance(__result, -distance(__first2, __last2));
3492 // Dispatching functions for find_end.
3494 template <class _ForwardIter1, class _ForwardIter2>
3495 inline _ForwardIter1
3496 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3497 _ForwardIter2 __first2, _ForwardIter2 __last2)
3499 // concept requirements
3500 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
3501 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
3502 __glibcpp_function_requires(_EqualOpConcept<
3503 typename iterator_traits<_ForwardIter1>::value_type,
3504 typename iterator_traits<_ForwardIter2>::value_type>);
3506 return __find_end(__first1, __last1, __first2, __last2,
3507 __iterator_category(__first1),
3508 __iterator_category(__first2));
3511 template <class _ForwardIter1, class _ForwardIter2,
3512 class _BinaryPredicate>
3513 inline _ForwardIter1
3514 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3515 _ForwardIter2 __first2, _ForwardIter2 __last2,
3516 _BinaryPredicate __comp)
3518 // concept requirements
3519 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
3520 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
3521 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3522 typename iterator_traits<_ForwardIter1>::value_type,
3523 typename iterator_traits<_ForwardIter2>::value_type>);
3525 return __find_end(__first1, __last1, __first2, __last2,
3526 __iterator_category(__first1),
3527 __iterator_category(__first2),
3531 // is_heap, a predicate testing whether or not a range is
3532 // a heap. This function is an extension, not part of the C++
3535 template <class _RandomAccessIter, class _Distance>
3536 bool __is_heap(_RandomAccessIter __first, _Distance __n)
3538 _Distance __parent = 0;
3539 for (_Distance __child = 1; __child < __n; ++__child) {
3540 if (__first[__parent] < __first[__child])
3542 if ((__child & 1) == 0)
3548 template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
3549 bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
3552 _Distance __parent = 0;
3553 for (_Distance __child = 1; __child < __n; ++__child) {
3554 if (__comp(__first[__parent], __first[__child]))
3556 if ((__child & 1) == 0)
3562 template <class _RandomAccessIter>
3563 inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
3565 // concept requirements
3566 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>);
3567 __glibcpp_function_requires(_LessThanComparableConcept<
3568 typename iterator_traits<_RandomAccessIter>::value_type>);
3570 return __is_heap(__first, __last - __first);
3574 template <class _RandomAccessIter, class _StrictWeakOrdering>
3575 inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
3576 _StrictWeakOrdering __comp)
3578 // concept requirements
3579 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>);
3580 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3581 typename iterator_traits<_RandomAccessIter>::value_type,
3582 typename iterator_traits<_RandomAccessIter>::value_type>);
3584 return __is_heap(__first, __comp, __last - __first);
3587 // is_sorted, a predicated testing whether a range is sorted in
3588 // nondescending order. This is an extension, not part of the C++
3591 template <class _ForwardIter>
3592 bool is_sorted(_ForwardIter __first, _ForwardIter __last)
3594 // concept requirements
3595 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3596 __glibcpp_function_requires(_LessThanComparableConcept<
3597 typename iterator_traits<_ForwardIter>::value_type>);
3599 if (__first == __last)
3602 _ForwardIter __next = __first;
3603 for (++__next; __next != __last; __first = __next, ++__next) {
3604 if (*__next < *__first)
3611 template <class _ForwardIter, class _StrictWeakOrdering>
3612 bool is_sorted(_ForwardIter __first, _ForwardIter __last,
3613 _StrictWeakOrdering __comp)
3615 // concept requirements
3616 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3617 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3618 typename iterator_traits<_ForwardIter>::value_type,
3619 typename iterator_traits<_ForwardIter>::value_type>);
3621 if (__first == __last)
3624 _ForwardIter __next = __first;
3625 for (++__next; __next != __last; __first = __next, ++__next) {
3626 if (__comp(*__next, *__first))
3635 #endif /* __SGI_STL_INTERNAL_ALGO_H */