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>);
537 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
538 // should be "the type returned by _UnaryOperation"
539 typename iterator_traits<_InputIter>::value_type>);
542 for ( ; __first != __last; ++__first, ++__result)
543 *__result = __unary_op(*__first);
547 template <class _InputIter1, class _InputIter2, class _OutputIter,
548 class _BinaryOperation>
549 _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
550 _InputIter2 __first2, _OutputIter __result,
551 _BinaryOperation __binary_op)
553 // concept requirements
554 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
555 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
557 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
558 // should be "the type returned by _BinaryOperation"
559 typename iterator_traits<_InputIter1>::value_type>);
562 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
563 *__result = __binary_op(*__first1, *__first2);
567 // replace, replace_if, replace_copy, replace_copy_if
569 template <class _ForwardIter, class _Tp>
570 void replace(_ForwardIter __first, _ForwardIter __last,
571 const _Tp& __old_value, const _Tp& __new_value)
573 // concept requirements
574 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
575 __glibcpp_function_requires(_EqualOpConcept<
576 typename iterator_traits<_ForwardIter>::value_type, _Tp>);
577 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
578 typename iterator_traits<_ForwardIter>::value_type>);
580 for ( ; __first != __last; ++__first)
581 if (*__first == __old_value)
582 *__first = __new_value;
585 template <class _ForwardIter, class _Predicate, class _Tp>
586 void replace_if(_ForwardIter __first, _ForwardIter __last,
587 _Predicate __pred, const _Tp& __new_value)
589 // concept requirements
590 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
591 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
592 typename iterator_traits<_ForwardIter>::value_type>);
593 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
594 typename iterator_traits<_ForwardIter>::value_type>);
596 for ( ; __first != __last; ++__first)
597 if (__pred(*__first))
598 *__first = __new_value;
601 template <class _InputIter, class _OutputIter, class _Tp>
602 _OutputIter replace_copy(_InputIter __first, _InputIter __last,
603 _OutputIter __result,
604 const _Tp& __old_value, const _Tp& __new_value)
606 // concept requirements
607 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
608 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
609 typename iterator_traits<_InputIter>::value_type>);
610 __glibcpp_function_requires(_EqualOpConcept<
611 typename iterator_traits<_InputIter>::value_type, _Tp>);
613 for ( ; __first != __last; ++__first, ++__result)
614 *__result = *__first == __old_value ? __new_value : *__first;
618 template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>
619 _OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
620 _OutputIter __result,
621 _Predicate __pred, const _Tp& __new_value)
623 // concept requirements
624 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
625 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
626 typename iterator_traits<_InputIter>::value_type>);
627 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
628 typename iterator_traits<_InputIter>::value_type>);
630 for ( ; __first != __last; ++__first, ++__result)
631 *__result = __pred(*__first) ? __new_value : *__first;
635 // generate and generate_n
637 template <class _ForwardIter, class _Generator>
638 void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
640 // concept requirements
641 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
642 __glibcpp_function_requires(_GeneratorConcept<_Generator,
643 typename iterator_traits<_ForwardIter>::value_type>);
645 for ( ; __first != __last; ++__first)
649 template <class _OutputIter, class _Size, class _Generator>
650 _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen)
653 // XXX concept requirements
654 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
655 "the return type of _Generator" ?? >);
658 for ( ; __n > 0; --__n, ++__first)
663 // remove, remove_if, remove_copy, remove_copy_if
665 template <class _InputIter, class _OutputIter, class _Tp>
666 _OutputIter remove_copy(_InputIter __first, _InputIter __last,
667 _OutputIter __result, const _Tp& __value)
669 // concept requirements
670 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
671 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
672 typename iterator_traits<_InputIter>::value_type>);
673 __glibcpp_function_requires(_EqualOpConcept<
674 typename iterator_traits<_InputIter>::value_type, _Tp>);
676 for ( ; __first != __last; ++__first)
677 if (!(*__first == __value)) {
678 *__result = *__first;
684 template <class _InputIter, class _OutputIter, class _Predicate>
685 _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
686 _OutputIter __result, _Predicate __pred)
688 // concept requirements
689 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
690 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
691 typename iterator_traits<_InputIter>::value_type>);
692 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
693 typename iterator_traits<_InputIter>::value_type>);
695 for ( ; __first != __last; ++__first)
696 if (!__pred(*__first)) {
697 *__result = *__first;
703 template <class _ForwardIter, class _Tp>
704 _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
707 // concept requirements
708 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
709 __glibcpp_function_requires(_ConvertibleConcept<_Tp,
710 typename iterator_traits<_ForwardIter>::value_type>);
711 __glibcpp_function_requires(_EqualOpConcept<
712 typename iterator_traits<_ForwardIter>::value_type, _Tp>);
714 __first = find(__first, __last, __value);
715 _ForwardIter __i = __first;
716 return __first == __last ? __first
717 : remove_copy(++__i, __last, __first, __value);
720 template <class _ForwardIter, class _Predicate>
721 _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
724 // concept requirements
725 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
726 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
727 typename iterator_traits<_ForwardIter>::value_type>);
729 __first = find_if(__first, __last, __pred);
730 _ForwardIter __i = __first;
731 return __first == __last ? __first
732 : remove_copy_if(++__i, __last, __first, __pred);
735 // unique and unique_copy
737 template <class _InputIter, class _OutputIter, class _Tp>
738 _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
739 _OutputIter __result, _Tp*)
741 // concept requirements -- taken care of in dispatching function
742 _Tp __value = *__first;
744 while (++__first != __last)
745 if (!(__value == *__first)) {
747 *++__result = __value;
752 template <class _InputIter, class _OutputIter>
753 inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
754 _OutputIter __result,
757 // concept requirements -- taken care of in dispatching function
758 return __unique_copy(__first, __last, __result, __value_type(__first));
761 template <class _InputIter, class _ForwardIter>
762 _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
763 _ForwardIter __result, forward_iterator_tag)
765 // concept requirements -- taken care of in dispatching function
766 *__result = *__first;
767 while (++__first != __last)
768 if (!(*__result == *__first))
769 *++__result = *__first;
773 template <class _InputIter, class _OutputIter>
774 inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
775 _OutputIter __result)
777 // concept requirements
778 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
779 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
780 typename iterator_traits<_InputIter>::value_type>);
781 __glibcpp_function_requires(_EqualityComparableConcept<
782 typename iterator_traits<_InputIter>::value_type>);
784 if (__first == __last) return __result;
785 return __unique_copy(__first, __last, __result,
786 __iterator_category(__result));
789 template <class _InputIter, class _OutputIter, class _BinaryPredicate,
791 _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
792 _OutputIter __result,
793 _BinaryPredicate __binary_pred, _Tp*)
795 // concept requirements -- iterators already checked
796 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate, _Tp, _Tp>);
798 _Tp __value = *__first;
800 while (++__first != __last)
801 if (!__binary_pred(__value, *__first)) {
803 *++__result = __value;
808 template <class _InputIter, class _OutputIter, class _BinaryPredicate>
809 inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
810 _OutputIter __result,
811 _BinaryPredicate __binary_pred,
814 // concept requirements -- taken care of in dispatching function
815 return __unique_copy(__first, __last, __result, __binary_pred,
816 __value_type(__first));
819 template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
820 _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
821 _ForwardIter __result,
822 _BinaryPredicate __binary_pred,
823 forward_iterator_tag)
825 // concept requirements -- iterators already checked
826 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
827 typename iterator_traits<_ForwardIter>::value_type,
828 typename iterator_traits<_InputIter>::value_type>);
830 *__result = *__first;
831 while (++__first != __last)
832 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
836 template <class _InputIter, class _OutputIter, class _BinaryPredicate>
837 inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
838 _OutputIter __result,
839 _BinaryPredicate __binary_pred)
841 // concept requirements -- predicates checked later
842 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
843 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
844 typename iterator_traits<_InputIter>::value_type>);
846 if (__first == __last) return __result;
847 return __unique_copy(__first, __last, __result, __binary_pred,
848 __iterator_category(__result));
851 template <class _ForwardIter>
852 _ForwardIter unique(_ForwardIter __first, _ForwardIter __last)
854 // concept requirements
855 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
856 __glibcpp_function_requires(_EqualityComparableConcept<
857 typename iterator_traits<_ForwardIter>::value_type>);
859 __first = adjacent_find(__first, __last);
860 return unique_copy(__first, __last, __first);
863 template <class _ForwardIter, class _BinaryPredicate>
864 _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
865 _BinaryPredicate __binary_pred)
867 // concept requirements
868 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
869 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
870 typename iterator_traits<_ForwardIter>::value_type,
871 typename iterator_traits<_ForwardIter>::value_type>);
873 __first = adjacent_find(__first, __last, __binary_pred);
874 return unique_copy(__first, __last, __first, __binary_pred);
877 // reverse and reverse_copy, and their auxiliary functions
879 template <class _BidirectionalIter>
880 void __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
881 bidirectional_iterator_tag) {
883 if (__first == __last || __first == --__last)
886 iter_swap(__first++, __last);
889 template <class _RandomAccessIter>
890 void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
891 random_access_iterator_tag) {
892 while (__first < __last)
893 iter_swap(__first++, --__last);
896 template <class _BidirectionalIter>
897 inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last)
899 // concept requirements
900 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
901 _BidirectionalIter>);
902 __reverse(__first, __last, __iterator_category(__first));
905 template <class _BidirectionalIter, class _OutputIter>
906 _OutputIter reverse_copy(_BidirectionalIter __first,
907 _BidirectionalIter __last,
908 _OutputIter __result)
910 // concept requirements
911 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
912 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
913 typename iterator_traits<_BidirectionalIter>::value_type>);
915 while (__first != __last) {
923 // rotate and rotate_copy, and their auxiliary functions
925 template <class _EuclideanRingElement>
926 _EuclideanRingElement __gcd(_EuclideanRingElement __m,
927 _EuclideanRingElement __n)
930 _EuclideanRingElement __t = __m % __n;
937 template <class _ForwardIter, class _Distance>
938 _ForwardIter __rotate(_ForwardIter __first,
939 _ForwardIter __middle,
942 forward_iterator_tag)
944 if (__first == __middle)
946 if (__last == __middle)
949 _ForwardIter __first2 = __middle;
951 swap(*__first++, *__first2++);
952 if (__first == __middle)
954 } while (__first2 != __last);
956 _ForwardIter __new_middle = __first;
960 while (__first2 != __last) {
961 swap (*__first++, *__first2++);
962 if (__first == __middle)
964 else if (__first2 == __last)
972 template <class _BidirectionalIter, class _Distance>
973 _BidirectionalIter __rotate(_BidirectionalIter __first,
974 _BidirectionalIter __middle,
975 _BidirectionalIter __last,
977 bidirectional_iterator_tag)
979 // concept requirements
980 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
981 _BidirectionalIter>);
983 if (__first == __middle)
985 if (__last == __middle)
988 __reverse(__first, __middle, bidirectional_iterator_tag());
989 __reverse(__middle, __last, bidirectional_iterator_tag());
991 while (__first != __middle && __middle != __last)
992 swap (*__first++, *--__last);
994 if (__first == __middle) {
995 __reverse(__middle, __last, bidirectional_iterator_tag());
999 __reverse(__first, __middle, bidirectional_iterator_tag());
1004 template <class _RandomAccessIter, class _Distance, class _Tp>
1005 _RandomAccessIter __rotate(_RandomAccessIter __first,
1006 _RandomAccessIter __middle,
1007 _RandomAccessIter __last,
1010 // concept requirements
1011 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1012 _RandomAccessIter>);
1014 _Distance __n = __last - __first;
1015 _Distance __k = __middle - __first;
1016 _Distance __l = __n - __k;
1017 _RandomAccessIter __result = __first + (__last - __middle);
1022 else if (__k == __l) {
1023 swap_ranges(__first, __middle, __middle);
1027 _Distance __d = __gcd(__n, __k);
1029 for (_Distance __i = 0; __i < __d; __i++) {
1030 _Tp __tmp = *__first;
1031 _RandomAccessIter __p = __first;
1034 for (_Distance __j = 0; __j < __l/__d; __j++) {
1035 if (__p > __first + __l) {
1036 *__p = *(__p - __l);
1040 *__p = *(__p + __k);
1046 for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
1047 if (__p < __last - __k) {
1048 *__p = *(__p + __k);
1052 *__p = * (__p - __l);
1064 template <class _ForwardIter>
1065 inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
1066 _ForwardIter __last)
1068 // concept requirements
1069 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1071 return __rotate(__first, __middle, __last,
1072 __distance_type(__first),
1073 __iterator_category(__first));
1076 template <class _ForwardIter, class _OutputIter>
1077 _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
1078 _ForwardIter __last, _OutputIter __result)
1080 // concept requirements
1081 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1082 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1083 typename iterator_traits<_ForwardIter>::value_type>);
1085 return copy(__first, __middle, copy(__middle, __last, __result));
1088 // Return a random number in the range [0, __n). This function encapsulates
1089 // whether we're using rand (part of the standard C library) or lrand48
1090 // (not standard, but a much better choice whenever it's available).
1091 template <class _Distance>
1092 inline _Distance __random_number(_Distance __n) {
1093 #ifdef _GLIBCPP_HAVE_DRAND48
1094 return lrand48() % __n;
1096 return rand() % __n;
1102 template <class _RandomAccessIter>
1103 inline void random_shuffle(_RandomAccessIter __first,
1104 _RandomAccessIter __last)
1106 // concept requirements
1107 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1108 _RandomAccessIter>);
1110 if (__first == __last) return;
1111 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1112 iter_swap(__i, __first + __random_number((__i - __first) + 1));
1115 template <class _RandomAccessIter, class _RandomNumberGenerator>
1116 void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
1117 _RandomNumberGenerator& __rand)
1119 // concept requirements
1120 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1121 _RandomAccessIter>);
1123 if (__first == __last) return;
1124 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1125 iter_swap(__i, __first + __rand((__i - __first) + 1));
1128 // random_sample and random_sample_n (extensions, not part of the standard).
1130 template <class _ForwardIter, class _OutputIter, class _Distance>
1131 _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
1132 _OutputIter __out, const _Distance __n)
1134 // concept requirements
1135 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1136 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1137 typename iterator_traits<_ForwardIter>::value_type>);
1139 _Distance __remaining = 0;
1140 distance(__first, __last, __remaining);
1141 _Distance __m = min(__n, __remaining);
1144 if (__random_number(__remaining) < __m) {
1156 template <class _ForwardIter, class _OutputIter, class _Distance,
1157 class _RandomNumberGenerator>
1158 _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
1159 _OutputIter __out, const _Distance __n,
1160 _RandomNumberGenerator& __rand)
1162 // concept requirements
1163 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
1164 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
1165 typename iterator_traits<_ForwardIter>::value_type>);
1166 __glibcpp_function_requires(_UnaryFunctionConcept<
1167 _RandomNumberGenerator, _Distance, _Distance>);
1169 _Distance __remaining = 0;
1170 distance(__first, __last, __remaining);
1171 _Distance __m = min(__n, __remaining);
1174 if (__rand(__remaining) < __m) {
1186 template <class _InputIter, class _RandomAccessIter, class _Distance>
1187 _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
1188 _RandomAccessIter __out,
1189 const _Distance __n)
1192 _Distance __t = __n;
1193 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1194 __out[__m] = *__first;
1196 while (__first != __last) {
1198 _Distance __M = __random_number(__t);
1200 __out[__M] = *__first;
1207 template <class _InputIter, class _RandomAccessIter,
1208 class _RandomNumberGenerator, class _Distance>
1209 _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
1210 _RandomAccessIter __out,
1211 _RandomNumberGenerator& __rand,
1212 const _Distance __n)
1214 // concept requirements
1215 __glibcpp_function_requires(_UnaryFunctionConcept<
1216 _RandomNumberGenerator, _Distance, _Distance>);
1219 _Distance __t = __n;
1220 for ( ; __first != __last && __m < __n; ++__m, ++__first)
1221 __out[__m] = *__first;
1223 while (__first != __last) {
1225 _Distance __M = __rand(__t);
1227 __out[__M] = *__first;
1234 template <class _InputIter, class _RandomAccessIter>
1235 inline _RandomAccessIter
1236 random_sample(_InputIter __first, _InputIter __last,
1237 _RandomAccessIter __out_first, _RandomAccessIter __out_last)
1239 // concept requirements
1240 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
1241 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1242 _RandomAccessIter>);
1244 return __random_sample(__first, __last,
1245 __out_first, __out_last - __out_first);
1249 template <class _InputIter, class _RandomAccessIter,
1250 class _RandomNumberGenerator>
1251 inline _RandomAccessIter
1252 random_sample(_InputIter __first, _InputIter __last,
1253 _RandomAccessIter __out_first, _RandomAccessIter __out_last,
1254 _RandomNumberGenerator& __rand)
1256 // concept requirements
1257 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
1258 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1259 _RandomAccessIter>);
1261 return __random_sample(__first, __last,
1262 __out_first, __rand,
1263 __out_last - __out_first);
1266 // partition, stable_partition, and their auxiliary functions
1268 template <class _ForwardIter, class _Predicate>
1269 _ForwardIter __partition(_ForwardIter __first,
1270 _ForwardIter __last,
1272 forward_iterator_tag)
1274 if (__first == __last) return __first;
1276 while (__pred(*__first))
1277 if (++__first == __last) return __first;
1279 _ForwardIter __next = __first;
1281 while (++__next != __last)
1282 if (__pred(*__next)) {
1283 swap(*__first, *__next);
1290 template <class _BidirectionalIter, class _Predicate>
1291 _BidirectionalIter __partition(_BidirectionalIter __first,
1292 _BidirectionalIter __last,
1294 bidirectional_iterator_tag)
1298 if (__first == __last)
1300 else if (__pred(*__first))
1306 if (__first == __last)
1308 else if (!__pred(*__last))
1312 iter_swap(__first, __last);
1317 template <class _ForwardIter, class _Predicate>
1318 inline _ForwardIter partition(_ForwardIter __first,
1319 _ForwardIter __last,
1322 // concept requirements
1323 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1324 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1325 typename iterator_traits<_ForwardIter>::value_type>);
1327 return __partition(__first, __last, __pred, __iterator_category(__first));
1331 template <class _ForwardIter, class _Predicate, class _Distance>
1332 _ForwardIter __inplace_stable_partition(_ForwardIter __first,
1333 _ForwardIter __last,
1334 _Predicate __pred, _Distance __len)
1337 return __pred(*__first) ? __last : __first;
1338 _ForwardIter __middle = __first;
1339 advance(__middle, __len / 2);
1340 return rotate(__inplace_stable_partition(__first, __middle, __pred,
1343 __inplace_stable_partition(__middle, __last, __pred,
1344 __len - __len / 2));
1347 template <class _ForwardIter, class _Pointer, class _Predicate,
1349 _ForwardIter __stable_partition_adaptive(_ForwardIter __first,
1350 _ForwardIter __last,
1351 _Predicate __pred, _Distance __len,
1353 _Distance __buffer_size)
1355 if (__len <= __buffer_size) {
1356 _ForwardIter __result1 = __first;
1357 _Pointer __result2 = __buffer;
1358 for ( ; __first != __last ; ++__first)
1359 if (__pred(*__first)) {
1360 *__result1 = *__first;
1364 *__result2 = *__first;
1367 copy(__buffer, __result2, __result1);
1371 _ForwardIter __middle = __first;
1372 advance(__middle, __len / 2);
1373 return rotate(__stable_partition_adaptive(
1374 __first, __middle, __pred,
1375 __len / 2, __buffer, __buffer_size),
1377 __stable_partition_adaptive(
1378 __middle, __last, __pred,
1379 __len - __len / 2, __buffer, __buffer_size));
1383 template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
1385 __stable_partition_aux(_ForwardIter __first, _ForwardIter __last,
1386 _Predicate __pred, _Tp*, _Distance*)
1388 _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
1389 if (__buf.size() > 0)
1390 return __stable_partition_adaptive(__first, __last, __pred,
1391 _Distance(__buf.requested_size()),
1392 __buf.begin(), __buf.size());
1394 return __inplace_stable_partition(__first, __last, __pred,
1395 _Distance(__buf.requested_size()));
1398 template <class _ForwardIter, class _Predicate>
1399 inline _ForwardIter stable_partition(_ForwardIter __first,
1400 _ForwardIter __last,
1403 // concept requirements
1404 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIter>);
1405 __glibcpp_function_requires(_UnaryPredicateConcept<_Predicate,
1406 typename iterator_traits<_ForwardIter>::value_type>);
1408 if (__first == __last)
1411 return __stable_partition_aux(__first, __last, __pred,
1412 __value_type(__first),
1413 __distance_type(__first));
1416 template <class _RandomAccessIter, class _Tp>
1417 _RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
1418 _RandomAccessIter __last,
1422 while (*__first < __pivot)
1425 while (__pivot < *__last)
1427 if (!(__first < __last))
1429 iter_swap(__first, __last);
1434 template <class _RandomAccessIter, class _Tp, class _Compare>
1435 _RandomAccessIter __unguarded_partition(_RandomAccessIter __first,
1436 _RandomAccessIter __last,
1437 _Tp __pivot, _Compare __comp)
1440 while (__comp(*__first, __pivot))
1443 while (__comp(__pivot, *__last))
1445 if (!(__first < __last))
1447 iter_swap(__first, __last);
1452 const int __stl_threshold = 16;
1454 // sort() and its auxiliary functions.
1456 template <class _RandomAccessIter, class _Tp>
1457 void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
1459 _RandomAccessIter __next = __last;
1461 while (__val < *__next) {
1469 template <class _RandomAccessIter, class _Tp, class _Compare>
1470 void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
1473 _RandomAccessIter __next = __last;
1475 while (__comp(__val, *__next)) {
1483 template <class _RandomAccessIter, class _Tp>
1484 inline void __linear_insert(_RandomAccessIter __first,
1485 _RandomAccessIter __last, _Tp*)
1487 _Tp __val = *__last;
1488 if (__val < *__first) {
1489 copy_backward(__first, __last, __last + 1);
1493 __unguarded_linear_insert(__last, __val);
1496 template <class _RandomAccessIter, class _Tp, class _Compare>
1497 inline void __linear_insert(_RandomAccessIter __first,
1498 _RandomAccessIter __last, _Tp*, _Compare __comp)
1500 _Tp __val = *__last;
1501 if (__comp(__val, *__first)) {
1502 copy_backward(__first, __last, __last + 1);
1506 __unguarded_linear_insert(__last, __val, __comp);
1509 template <class _RandomAccessIter>
1510 void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
1512 if (__first == __last) return;
1513 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1514 __linear_insert(__first, __i, __value_type(__first));
1517 template <class _RandomAccessIter, class _Compare>
1518 void __insertion_sort(_RandomAccessIter __first,
1519 _RandomAccessIter __last, _Compare __comp)
1521 if (__first == __last) return;
1522 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
1523 __linear_insert(__first, __i, __value_type(__first), __comp);
1526 template <class _RandomAccessIter, class _Tp>
1527 void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
1528 _RandomAccessIter __last, _Tp*)
1530 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1531 __unguarded_linear_insert(__i, _Tp(*__i));
1534 template <class _RandomAccessIter>
1535 inline void __unguarded_insertion_sort(_RandomAccessIter __first,
1536 _RandomAccessIter __last) {
1537 __unguarded_insertion_sort_aux(__first, __last, __value_type(__first));
1540 template <class _RandomAccessIter, class _Tp, class _Compare>
1541 void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
1542 _RandomAccessIter __last,
1543 _Tp*, _Compare __comp)
1545 for (_RandomAccessIter __i = __first; __i != __last; ++__i)
1546 __unguarded_linear_insert(__i, _Tp(*__i), __comp);
1549 template <class _RandomAccessIter, class _Compare>
1550 inline void __unguarded_insertion_sort(_RandomAccessIter __first,
1551 _RandomAccessIter __last,
1554 __unguarded_insertion_sort_aux(__first, __last, __value_type(__first),
1558 template <class _RandomAccessIter>
1559 void __final_insertion_sort(_RandomAccessIter __first,
1560 _RandomAccessIter __last)
1562 if (__last - __first > __stl_threshold) {
1563 __insertion_sort(__first, __first + __stl_threshold);
1564 __unguarded_insertion_sort(__first + __stl_threshold, __last);
1567 __insertion_sort(__first, __last);
1570 template <class _RandomAccessIter, class _Compare>
1571 void __final_insertion_sort(_RandomAccessIter __first,
1572 _RandomAccessIter __last, _Compare __comp)
1574 if (__last - __first > __stl_threshold) {
1575 __insertion_sort(__first, __first + __stl_threshold, __comp);
1576 __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
1579 __insertion_sort(__first, __last, __comp);
1582 template <class _Size>
1583 inline _Size __lg(_Size __n)
1586 for (__k = 0; __n != 1; __n >>= 1) ++__k;
1590 template <class _RandomAccessIter, class _Tp, class _Size>
1591 void __introsort_loop(_RandomAccessIter __first,
1592 _RandomAccessIter __last, _Tp*,
1593 _Size __depth_limit)
1595 while (__last - __first > __stl_threshold) {
1596 if (__depth_limit == 0) {
1597 partial_sort(__first, __last, __last);
1601 _RandomAccessIter __cut =
1602 __unguarded_partition(__first, __last,
1603 _Tp(__median(*__first,
1604 *(__first + (__last - __first)/2),
1606 __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
1611 template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
1612 void __introsort_loop(_RandomAccessIter __first,
1613 _RandomAccessIter __last, _Tp*,
1614 _Size __depth_limit, _Compare __comp)
1616 while (__last - __first > __stl_threshold) {
1617 if (__depth_limit == 0) {
1618 partial_sort(__first, __last, __last, __comp);
1622 _RandomAccessIter __cut =
1623 __unguarded_partition(__first, __last,
1624 _Tp(__median(*__first,
1625 *(__first + (__last - __first)/2),
1626 *(__last - 1), __comp)),
1628 __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
1633 template <class _RandomAccessIter>
1634 inline void sort(_RandomAccessIter __first, _RandomAccessIter __last)
1636 // concept requirements
1637 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1638 _RandomAccessIter>);
1639 __glibcpp_function_requires(_LessThanComparableConcept<
1640 typename iterator_traits<_RandomAccessIter>::value_type>);
1642 if (__first != __last) {
1643 __introsort_loop(__first, __last,
1644 __value_type(__first),
1645 __lg(__last - __first) * 2);
1646 __final_insertion_sort(__first, __last);
1650 template <class _RandomAccessIter, class _Compare>
1651 inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
1654 // concept requirements
1655 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1656 _RandomAccessIter>);
1657 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1658 typename iterator_traits<_RandomAccessIter>::value_type,
1659 typename iterator_traits<_RandomAccessIter>::value_type>);
1661 if (__first != __last) {
1662 __introsort_loop(__first, __last,
1663 __value_type(__first),
1664 __lg(__last - __first) * 2,
1666 __final_insertion_sort(__first, __last, __comp);
1670 // stable_sort() and its auxiliary functions.
1672 template <class _RandomAccessIter>
1673 void __inplace_stable_sort(_RandomAccessIter __first,
1674 _RandomAccessIter __last)
1676 if (__last - __first < 15) {
1677 __insertion_sort(__first, __last);
1680 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1681 __inplace_stable_sort(__first, __middle);
1682 __inplace_stable_sort(__middle, __last);
1683 __merge_without_buffer(__first, __middle, __last,
1688 template <class _RandomAccessIter, class _Compare>
1689 void __inplace_stable_sort(_RandomAccessIter __first,
1690 _RandomAccessIter __last, _Compare __comp)
1692 if (__last - __first < 15) {
1693 __insertion_sort(__first, __last, __comp);
1696 _RandomAccessIter __middle = __first + (__last - __first) / 2;
1697 __inplace_stable_sort(__first, __middle, __comp);
1698 __inplace_stable_sort(__middle, __last, __comp);
1699 __merge_without_buffer(__first, __middle, __last,
1705 template <class _RandomAccessIter1, class _RandomAccessIter2,
1707 void __merge_sort_loop(_RandomAccessIter1 __first,
1708 _RandomAccessIter1 __last,
1709 _RandomAccessIter2 __result, _Distance __step_size)
1711 _Distance __two_step = 2 * __step_size;
1713 while (__last - __first >= __two_step) {
1714 __result = merge(__first, __first + __step_size,
1715 __first + __step_size, __first + __two_step,
1717 __first += __two_step;
1720 __step_size = min(_Distance(__last - __first), __step_size);
1721 merge(__first, __first + __step_size, __first + __step_size, __last,
1725 template <class _RandomAccessIter1, class _RandomAccessIter2,
1726 class _Distance, class _Compare>
1727 void __merge_sort_loop(_RandomAccessIter1 __first,
1728 _RandomAccessIter1 __last,
1729 _RandomAccessIter2 __result, _Distance __step_size,
1732 _Distance __two_step = 2 * __step_size;
1734 while (__last - __first >= __two_step) {
1735 __result = merge(__first, __first + __step_size,
1736 __first + __step_size, __first + __two_step,
1739 __first += __two_step;
1741 __step_size = min(_Distance(__last - __first), __step_size);
1743 merge(__first, __first + __step_size,
1744 __first + __step_size, __last,
1749 const int __stl_chunk_size = 7;
1751 template <class _RandomAccessIter, class _Distance>
1752 void __chunk_insertion_sort(_RandomAccessIter __first,
1753 _RandomAccessIter __last, _Distance __chunk_size)
1755 while (__last - __first >= __chunk_size) {
1756 __insertion_sort(__first, __first + __chunk_size);
1757 __first += __chunk_size;
1759 __insertion_sort(__first, __last);
1762 template <class _RandomAccessIter, class _Distance, class _Compare>
1763 void __chunk_insertion_sort(_RandomAccessIter __first,
1764 _RandomAccessIter __last,
1765 _Distance __chunk_size, _Compare __comp)
1767 while (__last - __first >= __chunk_size) {
1768 __insertion_sort(__first, __first + __chunk_size, __comp);
1769 __first += __chunk_size;
1771 __insertion_sort(__first, __last, __comp);
1774 template <class _RandomAccessIter, class _Pointer, class _Distance>
1775 void __merge_sort_with_buffer(_RandomAccessIter __first,
1776 _RandomAccessIter __last,
1777 _Pointer __buffer, _Distance*)
1779 _Distance __len = __last - __first;
1780 _Pointer __buffer_last = __buffer + __len;
1782 _Distance __step_size = __stl_chunk_size;
1783 __chunk_insertion_sort(__first, __last, __step_size);
1785 while (__step_size < __len) {
1786 __merge_sort_loop(__first, __last, __buffer, __step_size);
1788 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
1793 template <class _RandomAccessIter, class _Pointer, class _Distance,
1795 void __merge_sort_with_buffer(_RandomAccessIter __first,
1796 _RandomAccessIter __last, _Pointer __buffer,
1797 _Distance*, _Compare __comp)
1799 _Distance __len = __last - __first;
1800 _Pointer __buffer_last = __buffer + __len;
1802 _Distance __step_size = __stl_chunk_size;
1803 __chunk_insertion_sort(__first, __last, __step_size, __comp);
1805 while (__step_size < __len) {
1806 __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
1808 __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
1813 template <class _RandomAccessIter, class _Pointer, class _Distance>
1814 void __stable_sort_adaptive(_RandomAccessIter __first,
1815 _RandomAccessIter __last, _Pointer __buffer,
1816 _Distance __buffer_size)
1818 _Distance __len = (__last - __first + 1) / 2;
1819 _RandomAccessIter __middle = __first + __len;
1820 if (__len > __buffer_size) {
1821 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
1822 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
1825 __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
1826 __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
1828 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1829 _Distance(__last - __middle), __buffer, __buffer_size);
1832 template <class _RandomAccessIter, class _Pointer, class _Distance,
1834 void __stable_sort_adaptive(_RandomAccessIter __first,
1835 _RandomAccessIter __last, _Pointer __buffer,
1836 _Distance __buffer_size, _Compare __comp)
1838 _Distance __len = (__last - __first + 1) / 2;
1839 _RandomAccessIter __middle = __first + __len;
1840 if (__len > __buffer_size) {
1841 __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
1843 __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
1847 __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
1849 __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
1852 __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
1853 _Distance(__last - __middle), __buffer, __buffer_size,
1857 template <class _RandomAccessIter, class _Tp, class _Distance>
1858 inline void __stable_sort_aux(_RandomAccessIter __first,
1859 _RandomAccessIter __last, _Tp*, _Distance*)
1861 _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
1862 if (buf.begin() == 0)
1863 __inplace_stable_sort(__first, __last);
1865 __stable_sort_adaptive(__first, __last, buf.begin(),
1866 _Distance(buf.size()));
1869 template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
1870 inline void __stable_sort_aux(_RandomAccessIter __first,
1871 _RandomAccessIter __last, _Tp*, _Distance*,
1874 _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
1875 if (buf.begin() == 0)
1876 __inplace_stable_sort(__first, __last, __comp);
1878 __stable_sort_adaptive(__first, __last, buf.begin(),
1879 _Distance(buf.size()),
1883 template <class _RandomAccessIter>
1884 inline void stable_sort(_RandomAccessIter __first,
1885 _RandomAccessIter __last)
1887 // concept requirements
1888 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1889 _RandomAccessIter>);
1890 __glibcpp_function_requires(_LessThanComparableConcept<
1891 typename iterator_traits<_RandomAccessIter>::value_type>);
1893 __stable_sort_aux(__first, __last,
1894 __value_type(__first),
1895 __distance_type(__first));
1898 template <class _RandomAccessIter, class _Compare>
1899 inline void stable_sort(_RandomAccessIter __first,
1900 _RandomAccessIter __last, _Compare __comp)
1902 // concept requirements
1903 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1904 _RandomAccessIter>);
1905 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1906 typename iterator_traits<_RandomAccessIter>::value_type,
1907 typename iterator_traits<_RandomAccessIter>::value_type>);
1909 __stable_sort_aux(__first, __last,
1910 __value_type(__first),
1911 __distance_type(__first),
1915 // partial_sort, partial_sort_copy, and auxiliary functions.
1917 template <class _RandomAccessIter, class _Tp>
1918 void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
1919 _RandomAccessIter __last, _Tp*)
1921 make_heap(__first, __middle);
1922 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1923 if (*__i < *__first)
1924 __pop_heap(__first, __middle, __i, _Tp(*__i),
1925 __distance_type(__first));
1926 sort_heap(__first, __middle);
1929 template <class _RandomAccessIter>
1930 inline void partial_sort(_RandomAccessIter __first,
1931 _RandomAccessIter __middle,
1932 _RandomAccessIter __last)
1934 // concept requirements
1935 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1936 _RandomAccessIter>);
1937 __glibcpp_function_requires(_LessThanComparableConcept<
1938 typename iterator_traits<_RandomAccessIter>::value_type>);
1940 __partial_sort(__first, __middle, __last, __value_type(__first));
1943 template <class _RandomAccessIter, class _Tp, class _Compare>
1944 void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
1945 _RandomAccessIter __last, _Tp*, _Compare __comp)
1947 make_heap(__first, __middle, __comp);
1948 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1949 if (__comp(*__i, *__first))
1950 __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
1951 __distance_type(__first));
1952 sort_heap(__first, __middle, __comp);
1955 template <class _RandomAccessIter, class _Compare>
1956 inline void partial_sort(_RandomAccessIter __first,
1957 _RandomAccessIter __middle,
1958 _RandomAccessIter __last, _Compare __comp)
1960 // concept requirements
1961 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
1962 _RandomAccessIter>);
1963 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
1964 typename iterator_traits<_RandomAccessIter>::value_type,
1965 typename iterator_traits<_RandomAccessIter>::value_type>);
1967 __partial_sort(__first, __middle, __last, __value_type(__first), __comp);
1970 template <class _InputIter, class _RandomAccessIter, class _Distance,
1972 _RandomAccessIter __partial_sort_copy(_InputIter __first,
1974 _RandomAccessIter __result_first,
1975 _RandomAccessIter __result_last,
1978 if (__result_first == __result_last) return __result_last;
1979 _RandomAccessIter __result_real_last = __result_first;
1980 while(__first != __last && __result_real_last != __result_last) {
1981 *__result_real_last = *__first;
1982 ++__result_real_last;
1985 make_heap(__result_first, __result_real_last);
1986 while (__first != __last) {
1987 if (*__first < *__result_first)
1988 __adjust_heap(__result_first, _Distance(0),
1989 _Distance(__result_real_last - __result_first),
1993 sort_heap(__result_first, __result_real_last);
1994 return __result_real_last;
1997 template <class _InputIter, class _RandomAccessIter>
1998 inline _RandomAccessIter
1999 partial_sort_copy(_InputIter __first, _InputIter __last,
2000 _RandomAccessIter __result_first,
2001 _RandomAccessIter __result_last)
2003 // concept requirements
2004 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
2005 __glibcpp_function_requires(_ConvertibleConcept<
2006 typename iterator_traits<_InputIter>::value_type,
2007 typename iterator_traits<_RandomAccessIter>::value_type>);
2008 __glibcpp_function_requires(_LessThanComparableConcept<
2009 typename iterator_traits<_RandomAccessIter>::value_type>);
2010 __glibcpp_function_requires(_LessThanComparableConcept<
2011 typename iterator_traits<_InputIter>::value_type>);
2013 return __partial_sort_copy(__first, __last, __result_first, __result_last,
2014 __distance_type(__result_first),
2015 __value_type(__first));
2018 template <class _InputIter, class _RandomAccessIter, class _Compare,
2019 class _Distance, class _Tp>
2020 _RandomAccessIter __partial_sort_copy(_InputIter __first,
2022 _RandomAccessIter __result_first,
2023 _RandomAccessIter __result_last,
2024 _Compare __comp, _Distance*, _Tp*)
2026 if (__result_first == __result_last) return __result_last;
2027 _RandomAccessIter __result_real_last = __result_first;
2028 while(__first != __last && __result_real_last != __result_last) {
2029 *__result_real_last = *__first;
2030 ++__result_real_last;
2033 make_heap(__result_first, __result_real_last, __comp);
2034 while (__first != __last) {
2035 if (__comp(*__first, *__result_first))
2036 __adjust_heap(__result_first, _Distance(0),
2037 _Distance(__result_real_last - __result_first),
2042 sort_heap(__result_first, __result_real_last, __comp);
2043 return __result_real_last;
2046 template <class _InputIter, class _RandomAccessIter, class _Compare>
2047 inline _RandomAccessIter
2048 partial_sort_copy(_InputIter __first, _InputIter __last,
2049 _RandomAccessIter __result_first,
2050 _RandomAccessIter __result_last, _Compare __comp)
2052 // concept requirements
2053 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
2054 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2055 _RandomAccessIter>);
2056 __glibcpp_function_requires(_ConvertibleConcept<
2057 typename iterator_traits<_InputIter>::value_type,
2058 typename iterator_traits<_RandomAccessIter>::value_type>);
2059 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2060 typename iterator_traits<_RandomAccessIter>::value_type,
2061 typename iterator_traits<_RandomAccessIter>::value_type>);
2063 return __partial_sort_copy(__first, __last, __result_first, __result_last,
2065 __distance_type(__result_first),
2066 __value_type(__first));
2069 // nth_element() and its auxiliary functions.
2071 template <class _RandomAccessIter, class _Tp>
2072 void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2073 _RandomAccessIter __last, _Tp*)
2075 while (__last - __first > 3) {
2076 _RandomAccessIter __cut =
2077 __unguarded_partition(__first, __last,
2078 _Tp(__median(*__first,
2079 *(__first + (__last - __first)/2),
2086 __insertion_sort(__first, __last);
2089 template <class _RandomAccessIter>
2090 inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2091 _RandomAccessIter __last)
2093 // concept requirements
2094 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2095 _RandomAccessIter>);
2096 __glibcpp_function_requires(_LessThanComparableConcept<
2097 typename iterator_traits<_RandomAccessIter>::value_type>);
2099 __nth_element(__first, __nth, __last, __value_type(__first));
2102 template <class _RandomAccessIter, class _Tp, class _Compare>
2103 void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2104 _RandomAccessIter __last, _Tp*, _Compare __comp)
2106 while (__last - __first > 3) {
2107 _RandomAccessIter __cut =
2108 __unguarded_partition(__first, __last,
2109 _Tp(__median(*__first,
2110 *(__first + (__last - __first)/2),
2119 __insertion_sort(__first, __last, __comp);
2122 template <class _RandomAccessIter, class _Compare>
2123 inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
2124 _RandomAccessIter __last, _Compare __comp)
2126 // concept requirements
2127 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept<
2128 _RandomAccessIter>);
2129 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2130 typename iterator_traits<_RandomAccessIter>::value_type,
2131 typename iterator_traits<_RandomAccessIter>::value_type>);
2133 __nth_element(__first, __nth, __last, __value_type(__first), __comp);
2137 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
2139 template <class _ForwardIter, class _Tp, class _Distance>
2140 _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
2141 const _Tp& __val, _Distance*)
2143 _Distance __len = 0;
2144 distance(__first, __last, __len);
2146 _ForwardIter __middle;
2149 __half = __len >> 1;
2151 advance(__middle, __half);
2152 if (*__middle < __val) {
2155 __len = __len - __half - 1;
2163 template <class _ForwardIter, class _Tp>
2164 inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
2167 // concept requirements
2168 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2169 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2170 typename iterator_traits<_ForwardIter>::value_type>);
2171 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2173 return __lower_bound(__first, __last, __val,
2174 __distance_type(__first));
2177 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2178 _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
2179 const _Tp& __val, _Compare __comp, _Distance*)
2181 _Distance __len = 0;
2182 distance(__first, __last, __len);
2184 _ForwardIter __middle;
2187 __half = __len >> 1;
2189 advance(__middle, __half);
2190 if (__comp(*__middle, __val)) {
2193 __len = __len - __half - 1;
2201 template <class _ForwardIter, class _Tp, class _Compare>
2202 inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
2203 const _Tp& __val, _Compare __comp)
2205 // concept requirements
2206 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2207 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2208 typename iterator_traits<_ForwardIter>::value_type>);
2209 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2211 return __lower_bound(__first, __last, __val, __comp,
2212 __distance_type(__first));
2215 template <class _ForwardIter, class _Tp, class _Distance>
2216 _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
2217 const _Tp& __val, _Distance*)
2219 _Distance __len = 0;
2220 distance(__first, __last, __len);
2222 _ForwardIter __middle;
2225 __half = __len >> 1;
2227 advance(__middle, __half);
2228 if (__val < *__middle)
2233 __len = __len - __half - 1;
2239 template <class _ForwardIter, class _Tp>
2240 inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
2243 // concept requirements
2244 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2245 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2246 typename iterator_traits<_ForwardIter>::value_type>);
2247 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2249 return __upper_bound(__first, __last, __val,
2250 __distance_type(__first));
2253 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2254 _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
2255 const _Tp& __val, _Compare __comp, _Distance*)
2257 _Distance __len = 0;
2258 distance(__first, __last, __len);
2260 _ForwardIter __middle;
2263 __half = __len >> 1;
2265 advance(__middle, __half);
2266 if (__comp(__val, *__middle))
2271 __len = __len - __half - 1;
2277 template <class _ForwardIter, class _Tp, class _Compare>
2278 inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
2279 const _Tp& __val, _Compare __comp)
2281 // concept requirements
2282 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2283 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2284 typename iterator_traits<_ForwardIter>::value_type>);
2285 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2287 return __upper_bound(__first, __last, __val, __comp,
2288 __distance_type(__first));
2291 template <class _ForwardIter, class _Tp, class _Distance>
2292 pair<_ForwardIter, _ForwardIter>
2293 __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2296 _Distance __len = 0;
2297 distance(__first, __last, __len);
2299 _ForwardIter __middle, __left, __right;
2302 __half = __len >> 1;
2304 advance(__middle, __half);
2305 if (*__middle < __val) {
2308 __len = __len - __half - 1;
2310 else if (__val < *__middle)
2313 __left = lower_bound(__first, __middle, __val);
2314 advance(__first, __len);
2315 __right = upper_bound(++__middle, __first, __val);
2316 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2319 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2322 template <class _ForwardIter, class _Tp>
2323 inline pair<_ForwardIter, _ForwardIter>
2324 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
2326 // concept requirements
2327 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2328 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2329 typename iterator_traits<_ForwardIter>::value_type>);
2330 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2332 return __equal_range(__first, __last, __val,
2333 __distance_type(__first));
2336 template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
2337 pair<_ForwardIter, _ForwardIter>
2338 __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2339 _Compare __comp, _Distance*)
2341 _Distance __len = 0;
2342 distance(__first, __last, __len);
2344 _ForwardIter __middle, __left, __right;
2347 __half = __len >> 1;
2349 advance(__middle, __half);
2350 if (__comp(*__middle, __val)) {
2353 __len = __len - __half - 1;
2355 else if (__comp(__val, *__middle))
2358 __left = lower_bound(__first, __middle, __val, __comp);
2359 advance(__first, __len);
2360 __right = upper_bound(++__middle, __first, __val, __comp);
2361 return pair<_ForwardIter, _ForwardIter>(__left, __right);
2364 return pair<_ForwardIter, _ForwardIter>(__first, __first);
2367 template <class _ForwardIter, class _Tp, class _Compare>
2368 inline pair<_ForwardIter, _ForwardIter>
2369 equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
2372 // concept requirements
2373 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2374 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2375 typename iterator_traits<_ForwardIter>::value_type>);
2376 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2378 return __equal_range(__first, __last, __val, __comp,
2379 __distance_type(__first));
2382 template <class _ForwardIter, class _Tp>
2383 bool binary_search(_ForwardIter __first, _ForwardIter __last,
2386 // concept requirements
2387 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2388 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2389 typename iterator_traits<_ForwardIter>::value_type>);
2390 __glibcpp_function_requires(_LessThanComparableConcept<_Tp>);
2392 _ForwardIter __i = lower_bound(__first, __last, __val);
2393 return __i != __last && !(__val < *__i);
2396 template <class _ForwardIter, class _Tp, class _Compare>
2397 bool binary_search(_ForwardIter __first, _ForwardIter __last,
2401 // concept requirements
2402 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
2403 __glibcpp_function_requires(_SameTypeConcept<_Tp,
2404 typename iterator_traits<_ForwardIter>::value_type>);
2405 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>);
2407 _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
2408 return __i != __last && !__comp(__val, *__i);
2411 // merge, with and without an explicitly supplied comparison function.
2413 template <class _InputIter1, class _InputIter2, class _OutputIter>
2414 _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
2415 _InputIter2 __first2, _InputIter2 __last2,
2416 _OutputIter __result)
2418 // concept requirements
2419 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2420 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2421 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2422 typename iterator_traits<_InputIter1>::value_type>);
2423 __glibcpp_function_requires(_SameTypeConcept<
2424 typename iterator_traits<_InputIter1>::value_type,
2425 typename iterator_traits<_InputIter2>::value_type>);
2426 __glibcpp_function_requires(_LessThanComparableConcept<
2427 typename iterator_traits<_InputIter1>::value_type>);
2429 while (__first1 != __last1 && __first2 != __last2) {
2430 if (*__first2 < *__first1) {
2431 *__result = *__first2;
2435 *__result = *__first1;
2440 return copy(__first2, __last2, copy(__first1, __last1, __result));
2443 template <class _InputIter1, class _InputIter2, class _OutputIter,
2445 _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
2446 _InputIter2 __first2, _InputIter2 __last2,
2447 _OutputIter __result, _Compare __comp)
2449 // concept requirements
2450 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2451 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2452 __glibcpp_function_requires(_SameTypeConcept<
2453 typename iterator_traits<_InputIter1>::value_type,
2454 typename iterator_traits<_InputIter2>::value_type>);
2455 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2456 typename iterator_traits<_InputIter1>::value_type>);
2457 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2458 typename iterator_traits<_InputIter1>::value_type,
2459 typename iterator_traits<_InputIter2>::value_type>);
2461 while (__first1 != __last1 && __first2 != __last2) {
2462 if (__comp(*__first2, *__first1)) {
2463 *__result = *__first2;
2467 *__result = *__first1;
2472 return copy(__first2, __last2, copy(__first1, __last1, __result));
2475 // inplace_merge and its auxiliary functions.
2477 template <class _BidirectionalIter, class _Distance>
2478 void __merge_without_buffer(_BidirectionalIter __first,
2479 _BidirectionalIter __middle,
2480 _BidirectionalIter __last,
2481 _Distance __len1, _Distance __len2)
2483 if (__len1 == 0 || __len2 == 0)
2485 if (__len1 + __len2 == 2) {
2486 if (*__middle < *__first)
2487 iter_swap(__first, __middle);
2490 _BidirectionalIter __first_cut = __first;
2491 _BidirectionalIter __second_cut = __middle;
2492 _Distance __len11 = 0;
2493 _Distance __len22 = 0;
2494 if (__len1 > __len2) {
2495 __len11 = __len1 / 2;
2496 advance(__first_cut, __len11);
2497 __second_cut = lower_bound(__middle, __last, *__first_cut);
2498 distance(__middle, __second_cut, __len22);
2501 __len22 = __len2 / 2;
2502 advance(__second_cut, __len22);
2503 __first_cut = upper_bound(__first, __middle, *__second_cut);
2504 distance(__first, __first_cut, __len11);
2506 _BidirectionalIter __new_middle
2507 = rotate(__first_cut, __middle, __second_cut);
2508 __merge_without_buffer(__first, __first_cut, __new_middle,
2510 __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
2514 template <class _BidirectionalIter, class _Distance, class _Compare>
2515 void __merge_without_buffer(_BidirectionalIter __first,
2516 _BidirectionalIter __middle,
2517 _BidirectionalIter __last,
2518 _Distance __len1, _Distance __len2,
2521 if (__len1 == 0 || __len2 == 0)
2523 if (__len1 + __len2 == 2) {
2524 if (__comp(*__middle, *__first))
2525 iter_swap(__first, __middle);
2528 _BidirectionalIter __first_cut = __first;
2529 _BidirectionalIter __second_cut = __middle;
2530 _Distance __len11 = 0;
2531 _Distance __len22 = 0;
2532 if (__len1 > __len2) {
2533 __len11 = __len1 / 2;
2534 advance(__first_cut, __len11);
2535 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2536 distance(__middle, __second_cut, __len22);
2539 __len22 = __len2 / 2;
2540 advance(__second_cut, __len22);
2541 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2542 distance(__first, __first_cut, __len11);
2544 _BidirectionalIter __new_middle
2545 = rotate(__first_cut, __middle, __second_cut);
2546 __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
2548 __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
2549 __len2 - __len22, __comp);
2552 template <class _BidirectionalIter1, class _BidirectionalIter2,
2554 _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
2555 _BidirectionalIter1 __middle,
2556 _BidirectionalIter1 __last,
2557 _Distance __len1, _Distance __len2,
2558 _BidirectionalIter2 __buffer,
2559 _Distance __buffer_size)
2561 _BidirectionalIter2 __buffer_end;
2562 if (__len1 > __len2 && __len2 <= __buffer_size) {
2563 __buffer_end = copy(__middle, __last, __buffer);
2564 copy_backward(__first, __middle, __last);
2565 return copy(__buffer, __buffer_end, __first);
2567 else if (__len1 <= __buffer_size) {
2568 __buffer_end = copy(__first, __middle, __buffer);
2569 copy(__middle, __last, __first);
2570 return copy_backward(__buffer, __buffer_end, __last);
2573 return rotate(__first, __middle, __last);
2576 template <class _BidirectionalIter1, class _BidirectionalIter2,
2577 class _BidirectionalIter3>
2578 _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
2579 _BidirectionalIter1 __last1,
2580 _BidirectionalIter2 __first2,
2581 _BidirectionalIter2 __last2,
2582 _BidirectionalIter3 __result)
2584 if (__first1 == __last1)
2585 return copy_backward(__first2, __last2, __result);
2586 if (__first2 == __last2)
2587 return copy_backward(__first1, __last1, __result);
2591 if (*__last2 < *__last1) {
2592 *--__result = *__last1;
2593 if (__first1 == __last1)
2594 return copy_backward(__first2, ++__last2, __result);
2598 *--__result = *__last2;
2599 if (__first2 == __last2)
2600 return copy_backward(__first1, ++__last1, __result);
2606 template <class _BidirectionalIter1, class _BidirectionalIter2,
2607 class _BidirectionalIter3, class _Compare>
2608 _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
2609 _BidirectionalIter1 __last1,
2610 _BidirectionalIter2 __first2,
2611 _BidirectionalIter2 __last2,
2612 _BidirectionalIter3 __result,
2615 if (__first1 == __last1)
2616 return copy_backward(__first2, __last2, __result);
2617 if (__first2 == __last2)
2618 return copy_backward(__first1, __last1, __result);
2622 if (__comp(*__last2, *__last1)) {
2623 *--__result = *__last1;
2624 if (__first1 == __last1)
2625 return copy_backward(__first2, ++__last2, __result);
2629 *--__result = *__last2;
2630 if (__first2 == __last2)
2631 return copy_backward(__first1, ++__last1, __result);
2637 template <class _BidirectionalIter, class _Distance, class _Pointer>
2638 void __merge_adaptive(_BidirectionalIter __first,
2639 _BidirectionalIter __middle,
2640 _BidirectionalIter __last,
2641 _Distance __len1, _Distance __len2,
2642 _Pointer __buffer, _Distance __buffer_size)
2644 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2645 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2646 merge(__buffer, __buffer_end, __middle, __last, __first);
2648 else if (__len2 <= __buffer_size) {
2649 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2650 __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
2653 _BidirectionalIter __first_cut = __first;
2654 _BidirectionalIter __second_cut = __middle;
2655 _Distance __len11 = 0;
2656 _Distance __len22 = 0;
2657 if (__len1 > __len2) {
2658 __len11 = __len1 / 2;
2659 advance(__first_cut, __len11);
2660 __second_cut = lower_bound(__middle, __last, *__first_cut);
2661 distance(__middle, __second_cut, __len22);
2664 __len22 = __len2 / 2;
2665 advance(__second_cut, __len22);
2666 __first_cut = upper_bound(__first, __middle, *__second_cut);
2667 distance(__first, __first_cut, __len11);
2669 _BidirectionalIter __new_middle =
2670 __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
2671 __len22, __buffer, __buffer_size);
2672 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2673 __len22, __buffer, __buffer_size);
2674 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2675 __len2 - __len22, __buffer, __buffer_size);
2679 template <class _BidirectionalIter, class _Distance, class _Pointer,
2681 void __merge_adaptive(_BidirectionalIter __first,
2682 _BidirectionalIter __middle,
2683 _BidirectionalIter __last,
2684 _Distance __len1, _Distance __len2,
2685 _Pointer __buffer, _Distance __buffer_size,
2688 if (__len1 <= __len2 && __len1 <= __buffer_size) {
2689 _Pointer __buffer_end = copy(__first, __middle, __buffer);
2690 merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
2692 else if (__len2 <= __buffer_size) {
2693 _Pointer __buffer_end = copy(__middle, __last, __buffer);
2694 __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
2698 _BidirectionalIter __first_cut = __first;
2699 _BidirectionalIter __second_cut = __middle;
2700 _Distance __len11 = 0;
2701 _Distance __len22 = 0;
2702 if (__len1 > __len2) {
2703 __len11 = __len1 / 2;
2704 advance(__first_cut, __len11);
2705 __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
2706 distance(__middle, __second_cut, __len22);
2709 __len22 = __len2 / 2;
2710 advance(__second_cut, __len22);
2711 __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
2712 distance(__first, __first_cut, __len11);
2714 _BidirectionalIter __new_middle =
2715 __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
2716 __len22, __buffer, __buffer_size);
2717 __merge_adaptive(__first, __first_cut, __new_middle, __len11,
2718 __len22, __buffer, __buffer_size, __comp);
2719 __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
2720 __len2 - __len22, __buffer, __buffer_size, __comp);
2724 template <class _BidirectionalIter, class _Tp, class _Distance>
2725 inline void __inplace_merge_aux(_BidirectionalIter __first,
2726 _BidirectionalIter __middle,
2727 _BidirectionalIter __last, _Tp*, _Distance*)
2729 _Distance __len1 = 0;
2730 distance(__first, __middle, __len1);
2731 _Distance __len2 = 0;
2732 distance(__middle, __last, __len2);
2734 _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
2735 if (__buf.begin() == 0)
2736 __merge_without_buffer(__first, __middle, __last, __len1, __len2);
2738 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2739 __buf.begin(), _Distance(__buf.size()));
2742 template <class _BidirectionalIter, class _Tp,
2743 class _Distance, class _Compare>
2744 inline void __inplace_merge_aux(_BidirectionalIter __first,
2745 _BidirectionalIter __middle,
2746 _BidirectionalIter __last, _Tp*, _Distance*,
2749 _Distance __len1 = 0;
2750 distance(__first, __middle, __len1);
2751 _Distance __len2 = 0;
2752 distance(__middle, __last, __len2);
2754 _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
2755 if (__buf.begin() == 0)
2756 __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
2758 __merge_adaptive(__first, __middle, __last, __len1, __len2,
2759 __buf.begin(), _Distance(__buf.size()),
2763 template <class _BidirectionalIter>
2764 inline void inplace_merge(_BidirectionalIter __first,
2765 _BidirectionalIter __middle,
2766 _BidirectionalIter __last)
2768 // concept requirements
2769 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2770 _BidirectionalIter>);
2771 __glibcpp_function_requires(_LessThanComparableConcept<
2772 typename iterator_traits<_BidirectionalIter>::value_type>);
2774 if (__first == __middle || __middle == __last)
2776 __inplace_merge_aux(__first, __middle, __last,
2777 __value_type(__first), __distance_type(__first));
2780 template <class _BidirectionalIter, class _Compare>
2781 inline void inplace_merge(_BidirectionalIter __first,
2782 _BidirectionalIter __middle,
2783 _BidirectionalIter __last, _Compare __comp)
2785 // concept requirements
2786 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept<
2787 _BidirectionalIter>);
2788 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2789 typename iterator_traits<_BidirectionalIter>::value_type,
2790 typename iterator_traits<_BidirectionalIter>::value_type>);
2792 if (__first == __middle || __middle == __last)
2794 __inplace_merge_aux(__first, __middle, __last,
2795 __value_type(__first), __distance_type(__first),
2799 // Set algorithms: includes, set_union, set_intersection, set_difference,
2800 // set_symmetric_difference. All of these algorithms have the precondition
2801 // that their input ranges are sorted and the postcondition that their output
2802 // ranges are sorted.
2804 template <class _InputIter1, class _InputIter2>
2805 bool includes(_InputIter1 __first1, _InputIter1 __last1,
2806 _InputIter2 __first2, _InputIter2 __last2)
2808 // concept requirements
2809 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2810 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2811 __glibcpp_function_requires(_SameTypeConcept<
2812 typename iterator_traits<_InputIter1>::value_type,
2813 typename iterator_traits<_InputIter2>::value_type>);
2814 __glibcpp_function_requires(_LessThanComparableConcept<
2815 typename iterator_traits<_InputIter1>::value_type>);
2817 while (__first1 != __last1 && __first2 != __last2)
2818 if (*__first2 < *__first1)
2820 else if(*__first1 < *__first2)
2823 ++__first1, ++__first2;
2825 return __first2 == __last2;
2828 template <class _InputIter1, class _InputIter2, class _Compare>
2829 bool includes(_InputIter1 __first1, _InputIter1 __last1,
2830 _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
2832 // concept requirements
2833 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2834 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2835 __glibcpp_function_requires(_SameTypeConcept<
2836 typename iterator_traits<_InputIter1>::value_type,
2837 typename iterator_traits<_InputIter2>::value_type>);
2838 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2839 typename iterator_traits<_InputIter1>::value_type,
2840 typename iterator_traits<_InputIter2>::value_type>);
2842 while (__first1 != __last1 && __first2 != __last2)
2843 if (__comp(*__first2, *__first1))
2845 else if(__comp(*__first1, *__first2))
2848 ++__first1, ++__first2;
2850 return __first2 == __last2;
2853 template <class _InputIter1, class _InputIter2, class _OutputIter>
2854 _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
2855 _InputIter2 __first2, _InputIter2 __last2,
2856 _OutputIter __result)
2858 // concept requirements
2859 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2860 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2861 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2862 typename iterator_traits<_InputIter1>::value_type>);
2863 __glibcpp_function_requires(_SameTypeConcept<
2864 typename iterator_traits<_InputIter1>::value_type,
2865 typename iterator_traits<_InputIter2>::value_type>);
2866 __glibcpp_function_requires(_LessThanComparableConcept<
2867 typename iterator_traits<_InputIter1>::value_type>);
2869 while (__first1 != __last1 && __first2 != __last2) {
2870 if (*__first1 < *__first2) {
2871 *__result = *__first1;
2874 else if (*__first2 < *__first1) {
2875 *__result = *__first2;
2879 *__result = *__first1;
2885 return copy(__first2, __last2, copy(__first1, __last1, __result));
2888 template <class _InputIter1, class _InputIter2, class _OutputIter,
2890 _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
2891 _InputIter2 __first2, _InputIter2 __last2,
2892 _OutputIter __result, _Compare __comp)
2894 // concept requirements
2895 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2896 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2897 __glibcpp_function_requires(_SameTypeConcept<
2898 typename iterator_traits<_InputIter1>::value_type,
2899 typename iterator_traits<_InputIter2>::value_type>);
2900 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2901 typename iterator_traits<_InputIter1>::value_type>);
2902 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2903 typename iterator_traits<_InputIter1>::value_type,
2904 typename iterator_traits<_InputIter2>::value_type>);
2906 while (__first1 != __last1 && __first2 != __last2) {
2907 if (__comp(*__first1, *__first2)) {
2908 *__result = *__first1;
2911 else if (__comp(*__first2, *__first1)) {
2912 *__result = *__first2;
2916 *__result = *__first1;
2922 return copy(__first2, __last2, copy(__first1, __last1, __result));
2925 template <class _InputIter1, class _InputIter2, class _OutputIter>
2926 _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2927 _InputIter2 __first2, _InputIter2 __last2,
2928 _OutputIter __result)
2930 // concept requirements
2931 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2932 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2933 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2934 typename iterator_traits<_InputIter1>::value_type>);
2935 __glibcpp_function_requires(_SameTypeConcept<
2936 typename iterator_traits<_InputIter1>::value_type,
2937 typename iterator_traits<_InputIter2>::value_type>);
2938 __glibcpp_function_requires(_LessThanComparableConcept<
2939 typename iterator_traits<_InputIter1>::value_type>);
2941 while (__first1 != __last1 && __first2 != __last2)
2942 if (*__first1 < *__first2)
2944 else if (*__first2 < *__first1)
2947 *__result = *__first1;
2955 template <class _InputIter1, class _InputIter2, class _OutputIter,
2957 _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
2958 _InputIter2 __first2, _InputIter2 __last2,
2959 _OutputIter __result, _Compare __comp)
2961 // concept requirements
2962 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2963 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2964 __glibcpp_function_requires(_SameTypeConcept<
2965 typename iterator_traits<_InputIter1>::value_type,
2966 typename iterator_traits<_InputIter2>::value_type>);
2967 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2968 typename iterator_traits<_InputIter1>::value_type>);
2969 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
2970 typename iterator_traits<_InputIter1>::value_type,
2971 typename iterator_traits<_InputIter2>::value_type>);
2973 while (__first1 != __last1 && __first2 != __last2)
2974 if (__comp(*__first1, *__first2))
2976 else if (__comp(*__first2, *__first1))
2979 *__result = *__first1;
2987 template <class _InputIter1, class _InputIter2, class _OutputIter>
2988 _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
2989 _InputIter2 __first2, _InputIter2 __last2,
2990 _OutputIter __result)
2992 // concept requirements
2993 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
2994 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
2995 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
2996 typename iterator_traits<_InputIter1>::value_type>);
2997 __glibcpp_function_requires(_SameTypeConcept<
2998 typename iterator_traits<_InputIter1>::value_type,
2999 typename iterator_traits<_InputIter2>::value_type>);
3000 __glibcpp_function_requires(_LessThanComparableConcept<
3001 typename iterator_traits<_InputIter1>::value_type>);
3003 while (__first1 != __last1 && __first2 != __last2)
3004 if (*__first1 < *__first2) {
3005 *__result = *__first1;
3009 else if (*__first2 < *__first1)
3015 return copy(__first1, __last1, __result);
3018 template <class _InputIter1, class _InputIter2, class _OutputIter,
3020 _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
3021 _InputIter2 __first2, _InputIter2 __last2,
3022 _OutputIter __result, _Compare __comp)
3024 // concept requirements
3025 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3026 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3027 __glibcpp_function_requires(_SameTypeConcept<
3028 typename iterator_traits<_InputIter1>::value_type,
3029 typename iterator_traits<_InputIter2>::value_type>);
3030 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3031 typename iterator_traits<_InputIter1>::value_type>);
3032 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3033 typename iterator_traits<_InputIter1>::value_type,
3034 typename iterator_traits<_InputIter2>::value_type>);
3036 while (__first1 != __last1 && __first2 != __last2)
3037 if (__comp(*__first1, *__first2)) {
3038 *__result = *__first1;
3042 else if (__comp(*__first2, *__first1))
3048 return copy(__first1, __last1, __result);
3051 template <class _InputIter1, class _InputIter2, class _OutputIter>
3053 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3054 _InputIter2 __first2, _InputIter2 __last2,
3055 _OutputIter __result)
3057 // concept requirements
3058 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3059 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3060 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3061 typename iterator_traits<_InputIter1>::value_type>);
3062 __glibcpp_function_requires(_SameTypeConcept<
3063 typename iterator_traits<_InputIter1>::value_type,
3064 typename iterator_traits<_InputIter2>::value_type>);
3065 __glibcpp_function_requires(_LessThanComparableConcept<
3066 typename iterator_traits<_InputIter1>::value_type>);
3068 while (__first1 != __last1 && __first2 != __last2)
3069 if (*__first1 < *__first2) {
3070 *__result = *__first1;
3074 else if (*__first2 < *__first1) {
3075 *__result = *__first2;
3083 return copy(__first2, __last2, copy(__first1, __last1, __result));
3086 template <class _InputIter1, class _InputIter2, class _OutputIter,
3089 set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
3090 _InputIter2 __first2, _InputIter2 __last2,
3091 _OutputIter __result,
3094 // concept requirements
3095 __glibcpp_function_requires(_InputIteratorConcept<_InputIter1>);
3096 __glibcpp_function_requires(_InputIteratorConcept<_InputIter2>);
3097 __glibcpp_function_requires(_SameTypeConcept<
3098 typename iterator_traits<_InputIter1>::value_type,
3099 typename iterator_traits<_InputIter2>::value_type>);
3100 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
3101 typename iterator_traits<_InputIter1>::value_type>);
3102 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3103 typename iterator_traits<_InputIter1>::value_type,
3104 typename iterator_traits<_InputIter2>::value_type>);
3106 while (__first1 != __last1 && __first2 != __last2)
3107 if (__comp(*__first1, *__first2)) {
3108 *__result = *__first1;
3112 else if (__comp(*__first2, *__first1)) {
3113 *__result = *__first2;
3121 return copy(__first2, __last2, copy(__first1, __last1, __result));
3124 // min_element and max_element, with and without an explicitly supplied
3125 // comparison function.
3127 template <class _ForwardIter>
3128 _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last)
3130 // concept requirements
3131 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3132 __glibcpp_function_requires(_LessThanComparableConcept<
3133 typename iterator_traits<_ForwardIter>::value_type>);
3135 if (__first == __last) return __first;
3136 _ForwardIter __result = __first;
3137 while (++__first != __last)
3138 if (*__result < *__first)
3143 template <class _ForwardIter, class _Compare>
3144 _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
3147 // concept requirements
3148 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3149 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3150 typename iterator_traits<_ForwardIter>::value_type,
3151 typename iterator_traits<_ForwardIter>::value_type>);
3153 if (__first == __last) return __first;
3154 _ForwardIter __result = __first;
3155 while (++__first != __last)
3156 if (__comp(*__result, *__first)) __result = __first;
3160 template <class _ForwardIter>
3161 _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last)
3163 // concept requirements
3164 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3165 __glibcpp_function_requires(_LessThanComparableConcept<
3166 typename iterator_traits<_ForwardIter>::value_type>);
3168 if (__first == __last) return __first;
3169 _ForwardIter __result = __first;
3170 while (++__first != __last)
3171 if (*__first < *__result)
3176 template <class _ForwardIter, class _Compare>
3177 _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
3180 // concept requirements
3181 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3182 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3183 typename iterator_traits<_ForwardIter>::value_type,
3184 typename iterator_traits<_ForwardIter>::value_type>);
3186 if (__first == __last) return __first;
3187 _ForwardIter __result = __first;
3188 while (++__first != __last)
3189 if (__comp(*__first, *__result))
3194 // next_permutation and prev_permutation, with and without an explicitly
3195 // supplied comparison function.
3197 template <class _BidirectionalIter>
3198 bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3200 // concept requirements
3201 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3202 __glibcpp_function_requires(_LessThanComparableConcept<
3203 typename iterator_traits<_BidirectionalIter>::value_type>);
3205 if (__first == __last)
3207 _BidirectionalIter __i = __first;
3215 _BidirectionalIter __ii = __i;
3218 _BidirectionalIter __j = __last;
3219 while (!(*__i < *--__j))
3221 iter_swap(__i, __j);
3222 reverse(__ii, __last);
3225 if (__i == __first) {
3226 reverse(__first, __last);
3232 template <class _BidirectionalIter, class _Compare>
3233 bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3236 // concept requirements
3237 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3238 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3239 typename iterator_traits<_BidirectionalIter>::value_type,
3240 typename iterator_traits<_BidirectionalIter>::value_type>);
3242 if (__first == __last)
3244 _BidirectionalIter __i = __first;
3252 _BidirectionalIter __ii = __i;
3254 if (__comp(*__i, *__ii)) {
3255 _BidirectionalIter __j = __last;
3256 while (!__comp(*__i, *--__j))
3258 iter_swap(__i, __j);
3259 reverse(__ii, __last);
3262 if (__i == __first) {
3263 reverse(__first, __last);
3269 template <class _BidirectionalIter>
3270 bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
3272 // concept requirements
3273 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3274 __glibcpp_function_requires(_LessThanComparableConcept<
3275 typename iterator_traits<_BidirectionalIter>::value_type>);
3277 if (__first == __last)
3279 _BidirectionalIter __i = __first;
3287 _BidirectionalIter __ii = __i;
3290 _BidirectionalIter __j = __last;
3291 while (!(*--__j < *__i))
3293 iter_swap(__i, __j);
3294 reverse(__ii, __last);
3297 if (__i == __first) {
3298 reverse(__first, __last);
3304 template <class _BidirectionalIter, class _Compare>
3305 bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
3308 // concept requirements
3309 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter>);
3310 __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
3311 typename iterator_traits<_BidirectionalIter>::value_type,
3312 typename iterator_traits<_BidirectionalIter>::value_type>);
3314 if (__first == __last)
3316 _BidirectionalIter __i = __first;
3324 _BidirectionalIter __ii = __i;
3326 if (__comp(*__ii, *__i)) {
3327 _BidirectionalIter __j = __last;
3328 while (!__comp(*--__j, *__i))
3330 iter_swap(__i, __j);
3331 reverse(__ii, __last);
3334 if (__i == __first) {
3335 reverse(__first, __last);
3341 // find_first_of, with and without an explicitly supplied comparison function.
3343 template <class _InputIter, class _ForwardIter>
3344 _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
3345 _ForwardIter __first2, _ForwardIter __last2)
3347 // concept requirements
3348 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
3349 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3350 __glibcpp_function_requires(_EqualOpConcept<
3351 typename iterator_traits<_InputIter>::value_type,
3352 typename iterator_traits<_ForwardIter>::value_type>);
3354 for ( ; __first1 != __last1; ++__first1)
3355 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3356 if (*__first1 == *__iter)
3361 template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
3362 _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
3363 _ForwardIter __first2, _ForwardIter __last2,
3364 _BinaryPredicate __comp)
3366 // concept requirements
3367 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
3368 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3369 __glibcpp_function_requires(_EqualOpConcept<
3370 typename iterator_traits<_InputIter>::value_type,
3371 typename iterator_traits<_ForwardIter>::value_type>);
3372 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3373 typename iterator_traits<_InputIter>::value_type,
3374 typename iterator_traits<_ForwardIter>::value_type>);
3376 for ( ; __first1 != __last1; ++__first1)
3377 for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
3378 if (__comp(*__first1, *__iter))
3384 // find_end, with and without an explicitly supplied comparison function.
3385 // Search [first2, last2) as a subsequence in [first1, last1), and return
3386 // the *last* possible match. Note that find_end for bidirectional iterators
3387 // is much faster than for forward iterators.
3389 // find_end for forward iterators.
3390 template <class _ForwardIter1, class _ForwardIter2>
3391 _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3392 _ForwardIter2 __first2, _ForwardIter2 __last2,
3393 forward_iterator_tag, forward_iterator_tag)
3395 if (__first2 == __last2)
3398 _ForwardIter1 __result = __last1;
3400 _ForwardIter1 __new_result
3401 = search(__first1, __last1, __first2, __last2);
3402 if (__new_result == __last1)
3405 __result = __new_result;
3406 __first1 = __new_result;
3413 template <class _ForwardIter1, class _ForwardIter2,
3414 class _BinaryPredicate>
3415 _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3416 _ForwardIter2 __first2, _ForwardIter2 __last2,
3417 forward_iterator_tag, forward_iterator_tag,
3418 _BinaryPredicate __comp)
3420 if (__first2 == __last2)
3423 _ForwardIter1 __result = __last1;
3425 _ForwardIter1 __new_result
3426 = search(__first1, __last1, __first2, __last2, __comp);
3427 if (__new_result == __last1)
3430 __result = __new_result;
3431 __first1 = __new_result;
3438 // find_end for bidirectional iterators. Requires partial specialization.
3439 template <class _BidirectionalIter1, class _BidirectionalIter2>
3441 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3442 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3443 bidirectional_iterator_tag, bidirectional_iterator_tag)
3445 // concept requirements
3446 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>);
3447 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>);
3449 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3450 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3452 _RevIter1 __rlast1(__first1);
3453 _RevIter2 __rlast2(__first2);
3454 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3455 _RevIter2(__last2), __rlast2);
3457 if (__rresult == __rlast1)
3460 _BidirectionalIter1 __result = __rresult.base();
3461 advance(__result, -distance(__first2, __last2));
3466 template <class _BidirectionalIter1, class _BidirectionalIter2,
3467 class _BinaryPredicate>
3469 __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
3470 _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
3471 bidirectional_iterator_tag, bidirectional_iterator_tag,
3472 _BinaryPredicate __comp)
3474 // concept requirements
3475 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter1>);
3476 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIter2>);
3478 typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
3479 typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
3481 _RevIter1 __rlast1(__first1);
3482 _RevIter2 __rlast2(__first2);
3483 _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
3484 _RevIter2(__last2), __rlast2,
3487 if (__rresult == __rlast1)
3490 _BidirectionalIter1 __result = __rresult.base();
3491 advance(__result, -distance(__first2, __last2));
3496 // Dispatching functions for find_end.
3498 template <class _ForwardIter1, class _ForwardIter2>
3499 inline _ForwardIter1
3500 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3501 _ForwardIter2 __first2, _ForwardIter2 __last2)
3503 // concept requirements
3504 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
3505 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
3506 __glibcpp_function_requires(_EqualOpConcept<
3507 typename iterator_traits<_ForwardIter1>::value_type,
3508 typename iterator_traits<_ForwardIter2>::value_type>);
3510 return __find_end(__first1, __last1, __first2, __last2,
3511 __iterator_category(__first1),
3512 __iterator_category(__first2));
3515 template <class _ForwardIter1, class _ForwardIter2,
3516 class _BinaryPredicate>
3517 inline _ForwardIter1
3518 find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
3519 _ForwardIter2 __first2, _ForwardIter2 __last2,
3520 _BinaryPredicate __comp)
3522 // concept requirements
3523 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter1>);
3524 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter2>);
3525 __glibcpp_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3526 typename iterator_traits<_ForwardIter1>::value_type,
3527 typename iterator_traits<_ForwardIter2>::value_type>);
3529 return __find_end(__first1, __last1, __first2, __last2,
3530 __iterator_category(__first1),
3531 __iterator_category(__first2),
3535 // is_heap, a predicate testing whether or not a range is
3536 // a heap. This function is an extension, not part of the C++
3539 template <class _RandomAccessIter, class _Distance>
3540 bool __is_heap(_RandomAccessIter __first, _Distance __n)
3542 _Distance __parent = 0;
3543 for (_Distance __child = 1; __child < __n; ++__child) {
3544 if (__first[__parent] < __first[__child])
3546 if ((__child & 1) == 0)
3552 template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
3553 bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
3556 _Distance __parent = 0;
3557 for (_Distance __child = 1; __child < __n; ++__child) {
3558 if (__comp(__first[__parent], __first[__child]))
3560 if ((__child & 1) == 0)
3566 template <class _RandomAccessIter>
3567 inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
3569 // concept requirements
3570 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>);
3571 __glibcpp_function_requires(_LessThanComparableConcept<
3572 typename iterator_traits<_RandomAccessIter>::value_type>);
3574 return __is_heap(__first, __last - __first);
3578 template <class _RandomAccessIter, class _StrictWeakOrdering>
3579 inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
3580 _StrictWeakOrdering __comp)
3582 // concept requirements
3583 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIter>);
3584 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3585 typename iterator_traits<_RandomAccessIter>::value_type,
3586 typename iterator_traits<_RandomAccessIter>::value_type>);
3588 return __is_heap(__first, __comp, __last - __first);
3591 // is_sorted, a predicated testing whether a range is sorted in
3592 // nondescending order. This is an extension, not part of the C++
3595 template <class _ForwardIter>
3596 bool is_sorted(_ForwardIter __first, _ForwardIter __last)
3598 // concept requirements
3599 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3600 __glibcpp_function_requires(_LessThanComparableConcept<
3601 typename iterator_traits<_ForwardIter>::value_type>);
3603 if (__first == __last)
3606 _ForwardIter __next = __first;
3607 for (++__next; __next != __last; __first = __next, ++__next) {
3608 if (*__next < *__first)
3615 template <class _ForwardIter, class _StrictWeakOrdering>
3616 bool is_sorted(_ForwardIter __first, _ForwardIter __last,
3617 _StrictWeakOrdering __comp)
3619 // concept requirements
3620 __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>);
3621 __glibcpp_function_requires(_BinaryPredicateConcept<_StrictWeakOrdering,
3622 typename iterator_traits<_ForwardIter>::value_type,
3623 typename iterator_traits<_ForwardIter>::value_type>);
3625 if (__first == __last)
3628 _ForwardIter __next = __first;
3629 for (++__next; __next != __last; __first = __next, ++__next) {
3630 if (__comp(*__next, *__first))
3639 #endif /* __SGI_STL_INTERNAL_ALGO_H */