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).
1092 template <class _Distance
>
1093 inline _Distance
__random_number(_Distance __n
) {
1094 #ifdef __STL_NO_DRAND48
1095 return rand() % __n
;
1097 return lrand48() % __n
;
1103 template <class _RandomAccessIter
>
1104 inline void random_shuffle(_RandomAccessIter __first
,
1105 _RandomAccessIter __last
)
1107 // concept requirements
1108 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1109 _RandomAccessIter
>);
1111 if (__first
== __last
) return;
1112 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1113 iter_swap(__i
, __first
+ __random_number((__i
- __first
) + 1));
1116 template <class _RandomAccessIter
, class _RandomNumberGenerator
>
1117 void random_shuffle(_RandomAccessIter __first
, _RandomAccessIter __last
,
1118 _RandomNumberGenerator
& __rand
)
1120 // concept requirements
1121 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1122 _RandomAccessIter
>);
1124 if (__first
== __last
) return;
1125 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1126 iter_swap(__i
, __first
+ __rand((__i
- __first
) + 1));
1129 // random_sample and random_sample_n (extensions, not part of the standard).
1131 template <class _ForwardIter
, class _OutputIter
, class _Distance
>
1132 _OutputIter
random_sample_n(_ForwardIter __first
, _ForwardIter __last
,
1133 _OutputIter __out
, const _Distance __n
)
1135 // concept requirements
1136 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
1137 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1138 typename iterator_traits
<_ForwardIter
>::value_type
>);
1140 _Distance __remaining
= 0;
1141 distance(__first
, __last
, __remaining
);
1142 _Distance __m
= min(__n
, __remaining
);
1145 if (__random_number(__remaining
) < __m
) {
1157 template <class _ForwardIter
, class _OutputIter
, class _Distance
,
1158 class _RandomNumberGenerator
>
1159 _OutputIter
random_sample_n(_ForwardIter __first
, _ForwardIter __last
,
1160 _OutputIter __out
, const _Distance __n
,
1161 _RandomNumberGenerator
& __rand
)
1163 // concept requirements
1164 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
1165 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1166 typename iterator_traits
<_ForwardIter
>::value_type
>);
1167 __glibcpp_function_requires(_UnaryFunctionConcept
<
1168 _RandomNumberGenerator
, _Distance
, _Distance
>);
1170 _Distance __remaining
= 0;
1171 distance(__first
, __last
, __remaining
);
1172 _Distance __m
= min(__n
, __remaining
);
1175 if (__rand(__remaining
) < __m
) {
1187 template <class _InputIter
, class _RandomAccessIter
, class _Distance
>
1188 _RandomAccessIter
__random_sample(_InputIter __first
, _InputIter __last
,
1189 _RandomAccessIter __out
,
1190 const _Distance __n
)
1193 _Distance __t
= __n
;
1194 for ( ; __first
!= __last
&& __m
< __n
; ++__m
, ++__first
)
1195 __out
[__m
] = *__first
;
1197 while (__first
!= __last
) {
1199 _Distance __M
= __random_number(__t
);
1201 __out
[__M
] = *__first
;
1208 template <class _InputIter
, class _RandomAccessIter
,
1209 class _RandomNumberGenerator
, class _Distance
>
1210 _RandomAccessIter
__random_sample(_InputIter __first
, _InputIter __last
,
1211 _RandomAccessIter __out
,
1212 _RandomNumberGenerator
& __rand
,
1213 const _Distance __n
)
1215 // concept requirements
1216 __glibcpp_function_requires(_UnaryFunctionConcept
<
1217 _RandomNumberGenerator
, _Distance
, _Distance
>);
1220 _Distance __t
= __n
;
1221 for ( ; __first
!= __last
&& __m
< __n
; ++__m
, ++__first
)
1222 __out
[__m
] = *__first
;
1224 while (__first
!= __last
) {
1226 _Distance __M
= __rand(__t
);
1228 __out
[__M
] = *__first
;
1235 template <class _InputIter
, class _RandomAccessIter
>
1236 inline _RandomAccessIter
1237 random_sample(_InputIter __first
, _InputIter __last
,
1238 _RandomAccessIter __out_first
, _RandomAccessIter __out_last
)
1240 // concept requirements
1241 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
1242 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1243 _RandomAccessIter
>);
1245 return __random_sample(__first
, __last
,
1246 __out_first
, __out_last
- __out_first
);
1250 template <class _InputIter
, class _RandomAccessIter
,
1251 class _RandomNumberGenerator
>
1252 inline _RandomAccessIter
1253 random_sample(_InputIter __first
, _InputIter __last
,
1254 _RandomAccessIter __out_first
, _RandomAccessIter __out_last
,
1255 _RandomNumberGenerator
& __rand
)
1257 // concept requirements
1258 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
1259 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1260 _RandomAccessIter
>);
1262 return __random_sample(__first
, __last
,
1263 __out_first
, __rand
,
1264 __out_last
- __out_first
);
1267 // partition, stable_partition, and their auxiliary functions
1269 template <class _ForwardIter
, class _Predicate
>
1270 _ForwardIter
__partition(_ForwardIter __first
,
1271 _ForwardIter __last
,
1273 forward_iterator_tag
)
1275 if (__first
== __last
) return __first
;
1277 while (__pred(*__first
))
1278 if (++__first
== __last
) return __first
;
1280 _ForwardIter __next
= __first
;
1282 while (++__next
!= __last
)
1283 if (__pred(*__next
)) {
1284 swap(*__first
, *__next
);
1291 template <class _BidirectionalIter
, class _Predicate
>
1292 _BidirectionalIter
__partition(_BidirectionalIter __first
,
1293 _BidirectionalIter __last
,
1295 bidirectional_iterator_tag
)
1299 if (__first
== __last
)
1301 else if (__pred(*__first
))
1307 if (__first
== __last
)
1309 else if (!__pred(*__last
))
1313 iter_swap(__first
, __last
);
1318 template <class _ForwardIter
, class _Predicate
>
1319 inline _ForwardIter
partition(_ForwardIter __first
,
1320 _ForwardIter __last
,
1323 // concept requirements
1324 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>);
1325 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1326 typename iterator_traits
<_ForwardIter
>::value_type
>);
1328 return __partition(__first
, __last
, __pred
, __iterator_category(__first
));
1332 template <class _ForwardIter
, class _Predicate
, class _Distance
>
1333 _ForwardIter
__inplace_stable_partition(_ForwardIter __first
,
1334 _ForwardIter __last
,
1335 _Predicate __pred
, _Distance __len
)
1338 return __pred(*__first
) ? __last
: __first
;
1339 _ForwardIter __middle
= __first
;
1340 advance(__middle
, __len
/ 2);
1341 return rotate(__inplace_stable_partition(__first
, __middle
, __pred
,
1344 __inplace_stable_partition(__middle
, __last
, __pred
,
1345 __len
- __len
/ 2));
1348 template <class _ForwardIter
, class _Pointer
, class _Predicate
,
1350 _ForwardIter
__stable_partition_adaptive(_ForwardIter __first
,
1351 _ForwardIter __last
,
1352 _Predicate __pred
, _Distance __len
,
1354 _Distance __buffer_size
)
1356 if (__len
<= __buffer_size
) {
1357 _ForwardIter __result1
= __first
;
1358 _Pointer __result2
= __buffer
;
1359 for ( ; __first
!= __last
; ++__first
)
1360 if (__pred(*__first
)) {
1361 *__result1
= *__first
;
1365 *__result2
= *__first
;
1368 copy(__buffer
, __result2
, __result1
);
1372 _ForwardIter __middle
= __first
;
1373 advance(__middle
, __len
/ 2);
1374 return rotate(__stable_partition_adaptive(
1375 __first
, __middle
, __pred
,
1376 __len
/ 2, __buffer
, __buffer_size
),
1378 __stable_partition_adaptive(
1379 __middle
, __last
, __pred
,
1380 __len
- __len
/ 2, __buffer
, __buffer_size
));
1384 template <class _ForwardIter
, class _Predicate
, class _Tp
, class _Distance
>
1386 __stable_partition_aux(_ForwardIter __first
, _ForwardIter __last
,
1387 _Predicate __pred
, _Tp
*, _Distance
*)
1389 _Temporary_buffer
<_ForwardIter
, _Tp
> __buf(__first
, __last
);
1390 if (__buf
.size() > 0)
1391 return __stable_partition_adaptive(__first
, __last
, __pred
,
1392 _Distance(__buf
.requested_size()),
1393 __buf
.begin(), __buf
.size());
1395 return __inplace_stable_partition(__first
, __last
, __pred
,
1396 _Distance(__buf
.requested_size()));
1399 template <class _ForwardIter
, class _Predicate
>
1400 inline _ForwardIter
stable_partition(_ForwardIter __first
,
1401 _ForwardIter __last
,
1404 // concept requirements
1405 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>);
1406 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1407 typename iterator_traits
<_ForwardIter
>::value_type
>);
1409 if (__first
== __last
)
1412 return __stable_partition_aux(__first
, __last
, __pred
,
1413 __value_type(__first
),
1414 __distance_type(__first
));
1417 template <class _RandomAccessIter
, class _Tp
>
1418 _RandomAccessIter
__unguarded_partition(_RandomAccessIter __first
,
1419 _RandomAccessIter __last
,
1423 while (*__first
< __pivot
)
1426 while (__pivot
< *__last
)
1428 if (!(__first
< __last
))
1430 iter_swap(__first
, __last
);
1435 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
1436 _RandomAccessIter
__unguarded_partition(_RandomAccessIter __first
,
1437 _RandomAccessIter __last
,
1438 _Tp __pivot
, _Compare __comp
)
1441 while (__comp(*__first
, __pivot
))
1444 while (__comp(__pivot
, *__last
))
1446 if (!(__first
< __last
))
1448 iter_swap(__first
, __last
);
1453 const int __stl_threshold
= 16;
1455 // sort() and its auxiliary functions.
1457 template <class _RandomAccessIter
, class _Tp
>
1458 void __unguarded_linear_insert(_RandomAccessIter __last
, _Tp __val
)
1460 _RandomAccessIter __next
= __last
;
1462 while (__val
< *__next
) {
1470 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
1471 void __unguarded_linear_insert(_RandomAccessIter __last
, _Tp __val
,
1474 _RandomAccessIter __next
= __last
;
1476 while (__comp(__val
, *__next
)) {
1484 template <class _RandomAccessIter
, class _Tp
>
1485 inline void __linear_insert(_RandomAccessIter __first
,
1486 _RandomAccessIter __last
, _Tp
*)
1488 _Tp __val
= *__last
;
1489 if (__val
< *__first
) {
1490 copy_backward(__first
, __last
, __last
+ 1);
1494 __unguarded_linear_insert(__last
, __val
);
1497 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
1498 inline void __linear_insert(_RandomAccessIter __first
,
1499 _RandomAccessIter __last
, _Tp
*, _Compare __comp
)
1501 _Tp __val
= *__last
;
1502 if (__comp(__val
, *__first
)) {
1503 copy_backward(__first
, __last
, __last
+ 1);
1507 __unguarded_linear_insert(__last
, __val
, __comp
);
1510 template <class _RandomAccessIter
>
1511 void __insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1513 if (__first
== __last
) return;
1514 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1515 __linear_insert(__first
, __i
, __value_type(__first
));
1518 template <class _RandomAccessIter
, class _Compare
>
1519 void __insertion_sort(_RandomAccessIter __first
,
1520 _RandomAccessIter __last
, _Compare __comp
)
1522 if (__first
== __last
) return;
1523 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1524 __linear_insert(__first
, __i
, __value_type(__first
), __comp
);
1527 template <class _RandomAccessIter
, class _Tp
>
1528 void __unguarded_insertion_sort_aux(_RandomAccessIter __first
,
1529 _RandomAccessIter __last
, _Tp
*)
1531 for (_RandomAccessIter __i
= __first
; __i
!= __last
; ++__i
)
1532 __unguarded_linear_insert(__i
, _Tp(*__i
));
1535 template <class _RandomAccessIter
>
1536 inline void __unguarded_insertion_sort(_RandomAccessIter __first
,
1537 _RandomAccessIter __last
) {
1538 __unguarded_insertion_sort_aux(__first
, __last
, __value_type(__first
));
1541 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
1542 void __unguarded_insertion_sort_aux(_RandomAccessIter __first
,
1543 _RandomAccessIter __last
,
1544 _Tp
*, _Compare __comp
)
1546 for (_RandomAccessIter __i
= __first
; __i
!= __last
; ++__i
)
1547 __unguarded_linear_insert(__i
, _Tp(*__i
), __comp
);
1550 template <class _RandomAccessIter
, class _Compare
>
1551 inline void __unguarded_insertion_sort(_RandomAccessIter __first
,
1552 _RandomAccessIter __last
,
1555 __unguarded_insertion_sort_aux(__first
, __last
, __value_type(__first
),
1559 template <class _RandomAccessIter
>
1560 void __final_insertion_sort(_RandomAccessIter __first
,
1561 _RandomAccessIter __last
)
1563 if (__last
- __first
> __stl_threshold
) {
1564 __insertion_sort(__first
, __first
+ __stl_threshold
);
1565 __unguarded_insertion_sort(__first
+ __stl_threshold
, __last
);
1568 __insertion_sort(__first
, __last
);
1571 template <class _RandomAccessIter
, class _Compare
>
1572 void __final_insertion_sort(_RandomAccessIter __first
,
1573 _RandomAccessIter __last
, _Compare __comp
)
1575 if (__last
- __first
> __stl_threshold
) {
1576 __insertion_sort(__first
, __first
+ __stl_threshold
, __comp
);
1577 __unguarded_insertion_sort(__first
+ __stl_threshold
, __last
, __comp
);
1580 __insertion_sort(__first
, __last
, __comp
);
1583 template <class _Size
>
1584 inline _Size
__lg(_Size __n
)
1587 for (__k
= 0; __n
!= 1; __n
>>= 1) ++__k
;
1591 template <class _RandomAccessIter
, class _Tp
, class _Size
>
1592 void __introsort_loop(_RandomAccessIter __first
,
1593 _RandomAccessIter __last
, _Tp
*,
1594 _Size __depth_limit
)
1596 while (__last
- __first
> __stl_threshold
) {
1597 if (__depth_limit
== 0) {
1598 partial_sort(__first
, __last
, __last
);
1602 _RandomAccessIter __cut
=
1603 __unguarded_partition(__first
, __last
,
1604 _Tp(__median(*__first
,
1605 *(__first
+ (__last
- __first
)/2),
1607 __introsort_loop(__cut
, __last
, (_Tp
*) 0, __depth_limit
);
1612 template <class _RandomAccessIter
, class _Tp
, class _Size
, class _Compare
>
1613 void __introsort_loop(_RandomAccessIter __first
,
1614 _RandomAccessIter __last
, _Tp
*,
1615 _Size __depth_limit
, _Compare __comp
)
1617 while (__last
- __first
> __stl_threshold
) {
1618 if (__depth_limit
== 0) {
1619 partial_sort(__first
, __last
, __last
, __comp
);
1623 _RandomAccessIter __cut
=
1624 __unguarded_partition(__first
, __last
,
1625 _Tp(__median(*__first
,
1626 *(__first
+ (__last
- __first
)/2),
1627 *(__last
- 1), __comp
)),
1629 __introsort_loop(__cut
, __last
, (_Tp
*) 0, __depth_limit
, __comp
);
1634 template <class _RandomAccessIter
>
1635 inline void sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1637 // concept requirements
1638 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1639 _RandomAccessIter
>);
1640 __glibcpp_function_requires(_LessThanComparableConcept
<
1641 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1643 if (__first
!= __last
) {
1644 __introsort_loop(__first
, __last
,
1645 __value_type(__first
),
1646 __lg(__last
- __first
) * 2);
1647 __final_insertion_sort(__first
, __last
);
1651 template <class _RandomAccessIter
, class _Compare
>
1652 inline void sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
1655 // concept requirements
1656 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1657 _RandomAccessIter
>);
1658 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
1659 typename iterator_traits
<_RandomAccessIter
>::value_type
,
1660 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1662 if (__first
!= __last
) {
1663 __introsort_loop(__first
, __last
,
1664 __value_type(__first
),
1665 __lg(__last
- __first
) * 2,
1667 __final_insertion_sort(__first
, __last
, __comp
);
1671 // stable_sort() and its auxiliary functions.
1673 template <class _RandomAccessIter
>
1674 void __inplace_stable_sort(_RandomAccessIter __first
,
1675 _RandomAccessIter __last
)
1677 if (__last
- __first
< 15) {
1678 __insertion_sort(__first
, __last
);
1681 _RandomAccessIter __middle
= __first
+ (__last
- __first
) / 2;
1682 __inplace_stable_sort(__first
, __middle
);
1683 __inplace_stable_sort(__middle
, __last
);
1684 __merge_without_buffer(__first
, __middle
, __last
,
1689 template <class _RandomAccessIter
, class _Compare
>
1690 void __inplace_stable_sort(_RandomAccessIter __first
,
1691 _RandomAccessIter __last
, _Compare __comp
)
1693 if (__last
- __first
< 15) {
1694 __insertion_sort(__first
, __last
, __comp
);
1697 _RandomAccessIter __middle
= __first
+ (__last
- __first
) / 2;
1698 __inplace_stable_sort(__first
, __middle
, __comp
);
1699 __inplace_stable_sort(__middle
, __last
, __comp
);
1700 __merge_without_buffer(__first
, __middle
, __last
,
1706 template <class _RandomAccessIter1
, class _RandomAccessIter2
,
1708 void __merge_sort_loop(_RandomAccessIter1 __first
,
1709 _RandomAccessIter1 __last
,
1710 _RandomAccessIter2 __result
, _Distance __step_size
)
1712 _Distance __two_step
= 2 * __step_size
;
1714 while (__last
- __first
>= __two_step
) {
1715 __result
= merge(__first
, __first
+ __step_size
,
1716 __first
+ __step_size
, __first
+ __two_step
,
1718 __first
+= __two_step
;
1721 __step_size
= min(_Distance(__last
- __first
), __step_size
);
1722 merge(__first
, __first
+ __step_size
, __first
+ __step_size
, __last
,
1726 template <class _RandomAccessIter1
, class _RandomAccessIter2
,
1727 class _Distance
, class _Compare
>
1728 void __merge_sort_loop(_RandomAccessIter1 __first
,
1729 _RandomAccessIter1 __last
,
1730 _RandomAccessIter2 __result
, _Distance __step_size
,
1733 _Distance __two_step
= 2 * __step_size
;
1735 while (__last
- __first
>= __two_step
) {
1736 __result
= merge(__first
, __first
+ __step_size
,
1737 __first
+ __step_size
, __first
+ __two_step
,
1740 __first
+= __two_step
;
1742 __step_size
= min(_Distance(__last
- __first
), __step_size
);
1744 merge(__first
, __first
+ __step_size
,
1745 __first
+ __step_size
, __last
,
1750 const int __stl_chunk_size
= 7;
1752 template <class _RandomAccessIter
, class _Distance
>
1753 void __chunk_insertion_sort(_RandomAccessIter __first
,
1754 _RandomAccessIter __last
, _Distance __chunk_size
)
1756 while (__last
- __first
>= __chunk_size
) {
1757 __insertion_sort(__first
, __first
+ __chunk_size
);
1758 __first
+= __chunk_size
;
1760 __insertion_sort(__first
, __last
);
1763 template <class _RandomAccessIter
, class _Distance
, class _Compare
>
1764 void __chunk_insertion_sort(_RandomAccessIter __first
,
1765 _RandomAccessIter __last
,
1766 _Distance __chunk_size
, _Compare __comp
)
1768 while (__last
- __first
>= __chunk_size
) {
1769 __insertion_sort(__first
, __first
+ __chunk_size
, __comp
);
1770 __first
+= __chunk_size
;
1772 __insertion_sort(__first
, __last
, __comp
);
1775 template <class _RandomAccessIter
, class _Pointer
, class _Distance
>
1776 void __merge_sort_with_buffer(_RandomAccessIter __first
,
1777 _RandomAccessIter __last
,
1778 _Pointer __buffer
, _Distance
*)
1780 _Distance __len
= __last
- __first
;
1781 _Pointer __buffer_last
= __buffer
+ __len
;
1783 _Distance __step_size
= __stl_chunk_size
;
1784 __chunk_insertion_sort(__first
, __last
, __step_size
);
1786 while (__step_size
< __len
) {
1787 __merge_sort_loop(__first
, __last
, __buffer
, __step_size
);
1789 __merge_sort_loop(__buffer
, __buffer_last
, __first
, __step_size
);
1794 template <class _RandomAccessIter
, class _Pointer
, class _Distance
,
1796 void __merge_sort_with_buffer(_RandomAccessIter __first
,
1797 _RandomAccessIter __last
, _Pointer __buffer
,
1798 _Distance
*, _Compare __comp
)
1800 _Distance __len
= __last
- __first
;
1801 _Pointer __buffer_last
= __buffer
+ __len
;
1803 _Distance __step_size
= __stl_chunk_size
;
1804 __chunk_insertion_sort(__first
, __last
, __step_size
, __comp
);
1806 while (__step_size
< __len
) {
1807 __merge_sort_loop(__first
, __last
, __buffer
, __step_size
, __comp
);
1809 __merge_sort_loop(__buffer
, __buffer_last
, __first
, __step_size
, __comp
);
1814 template <class _RandomAccessIter
, class _Pointer
, class _Distance
>
1815 void __stable_sort_adaptive(_RandomAccessIter __first
,
1816 _RandomAccessIter __last
, _Pointer __buffer
,
1817 _Distance __buffer_size
)
1819 _Distance __len
= (__last
- __first
+ 1) / 2;
1820 _RandomAccessIter __middle
= __first
+ __len
;
1821 if (__len
> __buffer_size
) {
1822 __stable_sort_adaptive(__first
, __middle
, __buffer
, __buffer_size
);
1823 __stable_sort_adaptive(__middle
, __last
, __buffer
, __buffer_size
);
1826 __merge_sort_with_buffer(__first
, __middle
, __buffer
, (_Distance
*)0);
1827 __merge_sort_with_buffer(__middle
, __last
, __buffer
, (_Distance
*)0);
1829 __merge_adaptive(__first
, __middle
, __last
, _Distance(__middle
- __first
),
1830 _Distance(__last
- __middle
), __buffer
, __buffer_size
);
1833 template <class _RandomAccessIter
, class _Pointer
, class _Distance
,
1835 void __stable_sort_adaptive(_RandomAccessIter __first
,
1836 _RandomAccessIter __last
, _Pointer __buffer
,
1837 _Distance __buffer_size
, _Compare __comp
)
1839 _Distance __len
= (__last
- __first
+ 1) / 2;
1840 _RandomAccessIter __middle
= __first
+ __len
;
1841 if (__len
> __buffer_size
) {
1842 __stable_sort_adaptive(__first
, __middle
, __buffer
, __buffer_size
,
1844 __stable_sort_adaptive(__middle
, __last
, __buffer
, __buffer_size
,
1848 __merge_sort_with_buffer(__first
, __middle
, __buffer
, (_Distance
*)0,
1850 __merge_sort_with_buffer(__middle
, __last
, __buffer
, (_Distance
*)0,
1853 __merge_adaptive(__first
, __middle
, __last
, _Distance(__middle
- __first
),
1854 _Distance(__last
- __middle
), __buffer
, __buffer_size
,
1858 template <class _RandomAccessIter
, class _Tp
, class _Distance
>
1859 inline void __stable_sort_aux(_RandomAccessIter __first
,
1860 _RandomAccessIter __last
, _Tp
*, _Distance
*)
1862 _Temporary_buffer
<_RandomAccessIter
, _Tp
> buf(__first
, __last
);
1863 if (buf
.begin() == 0)
1864 __inplace_stable_sort(__first
, __last
);
1866 __stable_sort_adaptive(__first
, __last
, buf
.begin(),
1867 _Distance(buf
.size()));
1870 template <class _RandomAccessIter
, class _Tp
, class _Distance
, class _Compare
>
1871 inline void __stable_sort_aux(_RandomAccessIter __first
,
1872 _RandomAccessIter __last
, _Tp
*, _Distance
*,
1875 _Temporary_buffer
<_RandomAccessIter
, _Tp
> buf(__first
, __last
);
1876 if (buf
.begin() == 0)
1877 __inplace_stable_sort(__first
, __last
, __comp
);
1879 __stable_sort_adaptive(__first
, __last
, buf
.begin(),
1880 _Distance(buf
.size()),
1884 template <class _RandomAccessIter
>
1885 inline void stable_sort(_RandomAccessIter __first
,
1886 _RandomAccessIter __last
)
1888 // concept requirements
1889 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1890 _RandomAccessIter
>);
1891 __glibcpp_function_requires(_LessThanComparableConcept
<
1892 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1894 __stable_sort_aux(__first
, __last
,
1895 __value_type(__first
),
1896 __distance_type(__first
));
1899 template <class _RandomAccessIter
, class _Compare
>
1900 inline void stable_sort(_RandomAccessIter __first
,
1901 _RandomAccessIter __last
, _Compare __comp
)
1903 // concept requirements
1904 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1905 _RandomAccessIter
>);
1906 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
1907 typename iterator_traits
<_RandomAccessIter
>::value_type
,
1908 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1910 __stable_sort_aux(__first
, __last
,
1911 __value_type(__first
),
1912 __distance_type(__first
),
1916 // partial_sort, partial_sort_copy, and auxiliary functions.
1918 template <class _RandomAccessIter
, class _Tp
>
1919 void __partial_sort(_RandomAccessIter __first
, _RandomAccessIter __middle
,
1920 _RandomAccessIter __last
, _Tp
*)
1922 make_heap(__first
, __middle
);
1923 for (_RandomAccessIter __i
= __middle
; __i
< __last
; ++__i
)
1924 if (*__i
< *__first
)
1925 __pop_heap(__first
, __middle
, __i
, _Tp(*__i
),
1926 __distance_type(__first
));
1927 sort_heap(__first
, __middle
);
1930 template <class _RandomAccessIter
>
1931 inline void partial_sort(_RandomAccessIter __first
,
1932 _RandomAccessIter __middle
,
1933 _RandomAccessIter __last
)
1935 // concept requirements
1936 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1937 _RandomAccessIter
>);
1938 __glibcpp_function_requires(_LessThanComparableConcept
<
1939 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1941 __partial_sort(__first
, __middle
, __last
, __value_type(__first
));
1944 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
1945 void __partial_sort(_RandomAccessIter __first
, _RandomAccessIter __middle
,
1946 _RandomAccessIter __last
, _Tp
*, _Compare __comp
)
1948 make_heap(__first
, __middle
, __comp
);
1949 for (_RandomAccessIter __i
= __middle
; __i
< __last
; ++__i
)
1950 if (__comp(*__i
, *__first
))
1951 __pop_heap(__first
, __middle
, __i
, _Tp(*__i
), __comp
,
1952 __distance_type(__first
));
1953 sort_heap(__first
, __middle
, __comp
);
1956 template <class _RandomAccessIter
, class _Compare
>
1957 inline void partial_sort(_RandomAccessIter __first
,
1958 _RandomAccessIter __middle
,
1959 _RandomAccessIter __last
, _Compare __comp
)
1961 // concept requirements
1962 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1963 _RandomAccessIter
>);
1964 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
1965 typename iterator_traits
<_RandomAccessIter
>::value_type
,
1966 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
1968 __partial_sort(__first
, __middle
, __last
, __value_type(__first
), __comp
);
1971 template <class _InputIter
, class _RandomAccessIter
, class _Distance
,
1973 _RandomAccessIter
__partial_sort_copy(_InputIter __first
,
1975 _RandomAccessIter __result_first
,
1976 _RandomAccessIter __result_last
,
1979 if (__result_first
== __result_last
) return __result_last
;
1980 _RandomAccessIter __result_real_last
= __result_first
;
1981 while(__first
!= __last
&& __result_real_last
!= __result_last
) {
1982 *__result_real_last
= *__first
;
1983 ++__result_real_last
;
1986 make_heap(__result_first
, __result_real_last
);
1987 while (__first
!= __last
) {
1988 if (*__first
< *__result_first
)
1989 __adjust_heap(__result_first
, _Distance(0),
1990 _Distance(__result_real_last
- __result_first
),
1994 sort_heap(__result_first
, __result_real_last
);
1995 return __result_real_last
;
1998 template <class _InputIter
, class _RandomAccessIter
>
1999 inline _RandomAccessIter
2000 partial_sort_copy(_InputIter __first
, _InputIter __last
,
2001 _RandomAccessIter __result_first
,
2002 _RandomAccessIter __result_last
)
2004 // concept requirements
2005 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
2006 __glibcpp_function_requires(_ConvertibleConcept
<
2007 typename iterator_traits
<_InputIter
>::value_type
,
2008 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2009 __glibcpp_function_requires(_LessThanComparableConcept
<
2010 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2011 __glibcpp_function_requires(_LessThanComparableConcept
<
2012 typename iterator_traits
<_InputIter
>::value_type
>);
2014 return __partial_sort_copy(__first
, __last
, __result_first
, __result_last
,
2015 __distance_type(__result_first
),
2016 __value_type(__first
));
2019 template <class _InputIter
, class _RandomAccessIter
, class _Compare
,
2020 class _Distance
, class _Tp
>
2021 _RandomAccessIter
__partial_sort_copy(_InputIter __first
,
2023 _RandomAccessIter __result_first
,
2024 _RandomAccessIter __result_last
,
2025 _Compare __comp
, _Distance
*, _Tp
*)
2027 if (__result_first
== __result_last
) return __result_last
;
2028 _RandomAccessIter __result_real_last
= __result_first
;
2029 while(__first
!= __last
&& __result_real_last
!= __result_last
) {
2030 *__result_real_last
= *__first
;
2031 ++__result_real_last
;
2034 make_heap(__result_first
, __result_real_last
, __comp
);
2035 while (__first
!= __last
) {
2036 if (__comp(*__first
, *__result_first
))
2037 __adjust_heap(__result_first
, _Distance(0),
2038 _Distance(__result_real_last
- __result_first
),
2043 sort_heap(__result_first
, __result_real_last
, __comp
);
2044 return __result_real_last
;
2047 template <class _InputIter
, class _RandomAccessIter
, class _Compare
>
2048 inline _RandomAccessIter
2049 partial_sort_copy(_InputIter __first
, _InputIter __last
,
2050 _RandomAccessIter __result_first
,
2051 _RandomAccessIter __result_last
, _Compare __comp
)
2053 // concept requirements
2054 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
2055 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2056 _RandomAccessIter
>);
2057 __glibcpp_function_requires(_ConvertibleConcept
<
2058 typename iterator_traits
<_InputIter
>::value_type
,
2059 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2060 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2061 typename iterator_traits
<_RandomAccessIter
>::value_type
,
2062 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2064 return __partial_sort_copy(__first
, __last
, __result_first
, __result_last
,
2066 __distance_type(__result_first
),
2067 __value_type(__first
));
2070 // nth_element() and its auxiliary functions.
2072 template <class _RandomAccessIter
, class _Tp
>
2073 void __nth_element(_RandomAccessIter __first
, _RandomAccessIter __nth
,
2074 _RandomAccessIter __last
, _Tp
*)
2076 while (__last
- __first
> 3) {
2077 _RandomAccessIter __cut
=
2078 __unguarded_partition(__first
, __last
,
2079 _Tp(__median(*__first
,
2080 *(__first
+ (__last
- __first
)/2),
2087 __insertion_sort(__first
, __last
);
2090 template <class _RandomAccessIter
>
2091 inline void nth_element(_RandomAccessIter __first
, _RandomAccessIter __nth
,
2092 _RandomAccessIter __last
)
2094 // concept requirements
2095 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2096 _RandomAccessIter
>);
2097 __glibcpp_function_requires(_LessThanComparableConcept
<
2098 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2100 __nth_element(__first
, __nth
, __last
, __value_type(__first
));
2103 template <class _RandomAccessIter
, class _Tp
, class _Compare
>
2104 void __nth_element(_RandomAccessIter __first
, _RandomAccessIter __nth
,
2105 _RandomAccessIter __last
, _Tp
*, _Compare __comp
)
2107 while (__last
- __first
> 3) {
2108 _RandomAccessIter __cut
=
2109 __unguarded_partition(__first
, __last
,
2110 _Tp(__median(*__first
,
2111 *(__first
+ (__last
- __first
)/2),
2120 __insertion_sort(__first
, __last
, __comp
);
2123 template <class _RandomAccessIter
, class _Compare
>
2124 inline void nth_element(_RandomAccessIter __first
, _RandomAccessIter __nth
,
2125 _RandomAccessIter __last
, _Compare __comp
)
2127 // concept requirements
2128 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2129 _RandomAccessIter
>);
2130 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2131 typename iterator_traits
<_RandomAccessIter
>::value_type
,
2132 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
2134 __nth_element(__first
, __nth
, __last
, __value_type(__first
), __comp
);
2138 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
2140 template <class _ForwardIter
, class _Tp
, class _Distance
>
2141 _ForwardIter
__lower_bound(_ForwardIter __first
, _ForwardIter __last
,
2142 const _Tp
& __val
, _Distance
*)
2144 _Distance __len
= 0;
2145 distance(__first
, __last
, __len
);
2147 _ForwardIter __middle
;
2150 __half
= __len
>> 1;
2152 advance(__middle
, __half
);
2153 if (*__middle
< __val
) {
2156 __len
= __len
- __half
- 1;
2164 template <class _ForwardIter
, class _Tp
>
2165 inline _ForwardIter
lower_bound(_ForwardIter __first
, _ForwardIter __last
,
2168 // concept requirements
2169 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2170 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2171 typename iterator_traits
<_ForwardIter
>::value_type
>);
2172 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>);
2174 return __lower_bound(__first
, __last
, __val
,
2175 __distance_type(__first
));
2178 template <class _ForwardIter
, class _Tp
, class _Compare
, class _Distance
>
2179 _ForwardIter
__lower_bound(_ForwardIter __first
, _ForwardIter __last
,
2180 const _Tp
& __val
, _Compare __comp
, _Distance
*)
2182 _Distance __len
= 0;
2183 distance(__first
, __last
, __len
);
2185 _ForwardIter __middle
;
2188 __half
= __len
>> 1;
2190 advance(__middle
, __half
);
2191 if (__comp(*__middle
, __val
)) {
2194 __len
= __len
- __half
- 1;
2202 template <class _ForwardIter
, class _Tp
, class _Compare
>
2203 inline _ForwardIter
lower_bound(_ForwardIter __first
, _ForwardIter __last
,
2204 const _Tp
& __val
, _Compare __comp
)
2206 // concept requirements
2207 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2208 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2209 typename iterator_traits
<_ForwardIter
>::value_type
>);
2210 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _Tp
>);
2212 return __lower_bound(__first
, __last
, __val
, __comp
,
2213 __distance_type(__first
));
2216 template <class _ForwardIter
, class _Tp
, class _Distance
>
2217 _ForwardIter
__upper_bound(_ForwardIter __first
, _ForwardIter __last
,
2218 const _Tp
& __val
, _Distance
*)
2220 _Distance __len
= 0;
2221 distance(__first
, __last
, __len
);
2223 _ForwardIter __middle
;
2226 __half
= __len
>> 1;
2228 advance(__middle
, __half
);
2229 if (__val
< *__middle
)
2234 __len
= __len
- __half
- 1;
2240 template <class _ForwardIter
, class _Tp
>
2241 inline _ForwardIter
upper_bound(_ForwardIter __first
, _ForwardIter __last
,
2244 // concept requirements
2245 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2246 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2247 typename iterator_traits
<_ForwardIter
>::value_type
>);
2248 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>);
2250 return __upper_bound(__first
, __last
, __val
,
2251 __distance_type(__first
));
2254 template <class _ForwardIter
, class _Tp
, class _Compare
, class _Distance
>
2255 _ForwardIter
__upper_bound(_ForwardIter __first
, _ForwardIter __last
,
2256 const _Tp
& __val
, _Compare __comp
, _Distance
*)
2258 _Distance __len
= 0;
2259 distance(__first
, __last
, __len
);
2261 _ForwardIter __middle
;
2264 __half
= __len
>> 1;
2266 advance(__middle
, __half
);
2267 if (__comp(__val
, *__middle
))
2272 __len
= __len
- __half
- 1;
2278 template <class _ForwardIter
, class _Tp
, class _Compare
>
2279 inline _ForwardIter
upper_bound(_ForwardIter __first
, _ForwardIter __last
,
2280 const _Tp
& __val
, _Compare __comp
)
2282 // concept requirements
2283 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2284 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2285 typename iterator_traits
<_ForwardIter
>::value_type
>);
2286 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _Tp
>);
2288 return __upper_bound(__first
, __last
, __val
, __comp
,
2289 __distance_type(__first
));
2292 template <class _ForwardIter
, class _Tp
, class _Distance
>
2293 pair
<_ForwardIter
, _ForwardIter
>
2294 __equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
,
2297 _Distance __len
= 0;
2298 distance(__first
, __last
, __len
);
2300 _ForwardIter __middle
, __left
, __right
;
2303 __half
= __len
>> 1;
2305 advance(__middle
, __half
);
2306 if (*__middle
< __val
) {
2309 __len
= __len
- __half
- 1;
2311 else if (__val
< *__middle
)
2314 __left
= lower_bound(__first
, __middle
, __val
);
2315 advance(__first
, __len
);
2316 __right
= upper_bound(++__middle
, __first
, __val
);
2317 return pair
<_ForwardIter
, _ForwardIter
>(__left
, __right
);
2320 return pair
<_ForwardIter
, _ForwardIter
>(__first
, __first
);
2323 template <class _ForwardIter
, class _Tp
>
2324 inline pair
<_ForwardIter
, _ForwardIter
>
2325 equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
)
2327 // concept requirements
2328 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2329 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2330 typename iterator_traits
<_ForwardIter
>::value_type
>);
2331 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>);
2333 return __equal_range(__first
, __last
, __val
,
2334 __distance_type(__first
));
2337 template <class _ForwardIter
, class _Tp
, class _Compare
, class _Distance
>
2338 pair
<_ForwardIter
, _ForwardIter
>
2339 __equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
,
2340 _Compare __comp
, _Distance
*)
2342 _Distance __len
= 0;
2343 distance(__first
, __last
, __len
);
2345 _ForwardIter __middle
, __left
, __right
;
2348 __half
= __len
>> 1;
2350 advance(__middle
, __half
);
2351 if (__comp(*__middle
, __val
)) {
2354 __len
= __len
- __half
- 1;
2356 else if (__comp(__val
, *__middle
))
2359 __left
= lower_bound(__first
, __middle
, __val
, __comp
);
2360 advance(__first
, __len
);
2361 __right
= upper_bound(++__middle
, __first
, __val
, __comp
);
2362 return pair
<_ForwardIter
, _ForwardIter
>(__left
, __right
);
2365 return pair
<_ForwardIter
, _ForwardIter
>(__first
, __first
);
2368 template <class _ForwardIter
, class _Tp
, class _Compare
>
2369 inline pair
<_ForwardIter
, _ForwardIter
>
2370 equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
,
2373 // concept requirements
2374 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2375 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2376 typename iterator_traits
<_ForwardIter
>::value_type
>);
2377 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _Tp
>);
2379 return __equal_range(__first
, __last
, __val
, __comp
,
2380 __distance_type(__first
));
2383 template <class _ForwardIter
, class _Tp
>
2384 bool binary_search(_ForwardIter __first
, _ForwardIter __last
,
2387 // concept requirements
2388 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2389 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2390 typename iterator_traits
<_ForwardIter
>::value_type
>);
2391 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>);
2393 _ForwardIter __i
= lower_bound(__first
, __last
, __val
);
2394 return __i
!= __last
&& !(__val
< *__i
);
2397 template <class _ForwardIter
, class _Tp
, class _Compare
>
2398 bool binary_search(_ForwardIter __first
, _ForwardIter __last
,
2402 // concept requirements
2403 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
2404 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2405 typename iterator_traits
<_ForwardIter
>::value_type
>);
2406 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _Tp
>);
2408 _ForwardIter __i
= lower_bound(__first
, __last
, __val
, __comp
);
2409 return __i
!= __last
&& !__comp(__val
, *__i
);
2412 // merge, with and without an explicitly supplied comparison function.
2414 template <class _InputIter1
, class _InputIter2
, class _OutputIter
>
2415 _OutputIter
merge(_InputIter1 __first1
, _InputIter1 __last1
,
2416 _InputIter2 __first2
, _InputIter2 __last2
,
2417 _OutputIter __result
)
2419 // concept requirements
2420 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2421 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2422 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2423 typename iterator_traits
<_InputIter1
>::value_type
>);
2424 __glibcpp_function_requires(_SameTypeConcept
<
2425 typename iterator_traits
<_InputIter1
>::value_type
,
2426 typename iterator_traits
<_InputIter2
>::value_type
>);
2427 __glibcpp_function_requires(_LessThanComparableConcept
<
2428 typename iterator_traits
<_InputIter1
>::value_type
>);
2430 while (__first1
!= __last1
&& __first2
!= __last2
) {
2431 if (*__first2
< *__first1
) {
2432 *__result
= *__first2
;
2436 *__result
= *__first1
;
2441 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2444 template <class _InputIter1
, class _InputIter2
, class _OutputIter
,
2446 _OutputIter
merge(_InputIter1 __first1
, _InputIter1 __last1
,
2447 _InputIter2 __first2
, _InputIter2 __last2
,
2448 _OutputIter __result
, _Compare __comp
)
2450 // concept requirements
2451 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2452 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2453 __glibcpp_function_requires(_SameTypeConcept
<
2454 typename iterator_traits
<_InputIter1
>::value_type
,
2455 typename iterator_traits
<_InputIter2
>::value_type
>);
2456 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2457 typename iterator_traits
<_InputIter1
>::value_type
>);
2458 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2459 typename iterator_traits
<_InputIter1
>::value_type
,
2460 typename iterator_traits
<_InputIter2
>::value_type
>);
2462 while (__first1
!= __last1
&& __first2
!= __last2
) {
2463 if (__comp(*__first2
, *__first1
)) {
2464 *__result
= *__first2
;
2468 *__result
= *__first1
;
2473 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2476 // inplace_merge and its auxiliary functions.
2478 template <class _BidirectionalIter
, class _Distance
>
2479 void __merge_without_buffer(_BidirectionalIter __first
,
2480 _BidirectionalIter __middle
,
2481 _BidirectionalIter __last
,
2482 _Distance __len1
, _Distance __len2
)
2484 if (__len1
== 0 || __len2
== 0)
2486 if (__len1
+ __len2
== 2) {
2487 if (*__middle
< *__first
)
2488 iter_swap(__first
, __middle
);
2491 _BidirectionalIter __first_cut
= __first
;
2492 _BidirectionalIter __second_cut
= __middle
;
2493 _Distance __len11
= 0;
2494 _Distance __len22
= 0;
2495 if (__len1
> __len2
) {
2496 __len11
= __len1
/ 2;
2497 advance(__first_cut
, __len11
);
2498 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
);
2499 distance(__middle
, __second_cut
, __len22
);
2502 __len22
= __len2
/ 2;
2503 advance(__second_cut
, __len22
);
2504 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
);
2505 distance(__first
, __first_cut
, __len11
);
2507 _BidirectionalIter __new_middle
2508 = rotate(__first_cut
, __middle
, __second_cut
);
2509 __merge_without_buffer(__first
, __first_cut
, __new_middle
,
2511 __merge_without_buffer(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2515 template <class _BidirectionalIter
, class _Distance
, class _Compare
>
2516 void __merge_without_buffer(_BidirectionalIter __first
,
2517 _BidirectionalIter __middle
,
2518 _BidirectionalIter __last
,
2519 _Distance __len1
, _Distance __len2
,
2522 if (__len1
== 0 || __len2
== 0)
2524 if (__len1
+ __len2
== 2) {
2525 if (__comp(*__middle
, *__first
))
2526 iter_swap(__first
, __middle
);
2529 _BidirectionalIter __first_cut
= __first
;
2530 _BidirectionalIter __second_cut
= __middle
;
2531 _Distance __len11
= 0;
2532 _Distance __len22
= 0;
2533 if (__len1
> __len2
) {
2534 __len11
= __len1
/ 2;
2535 advance(__first_cut
, __len11
);
2536 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
, __comp
);
2537 distance(__middle
, __second_cut
, __len22
);
2540 __len22
= __len2
/ 2;
2541 advance(__second_cut
, __len22
);
2542 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
, __comp
);
2543 distance(__first
, __first_cut
, __len11
);
2545 _BidirectionalIter __new_middle
2546 = rotate(__first_cut
, __middle
, __second_cut
);
2547 __merge_without_buffer(__first
, __first_cut
, __new_middle
, __len11
, __len22
,
2549 __merge_without_buffer(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2550 __len2
- __len22
, __comp
);
2553 template <class _BidirectionalIter1
, class _BidirectionalIter2
,
2555 _BidirectionalIter1
__rotate_adaptive(_BidirectionalIter1 __first
,
2556 _BidirectionalIter1 __middle
,
2557 _BidirectionalIter1 __last
,
2558 _Distance __len1
, _Distance __len2
,
2559 _BidirectionalIter2 __buffer
,
2560 _Distance __buffer_size
)
2562 _BidirectionalIter2 __buffer_end
;
2563 if (__len1
> __len2
&& __len2
<= __buffer_size
) {
2564 __buffer_end
= copy(__middle
, __last
, __buffer
);
2565 copy_backward(__first
, __middle
, __last
);
2566 return copy(__buffer
, __buffer_end
, __first
);
2568 else if (__len1
<= __buffer_size
) {
2569 __buffer_end
= copy(__first
, __middle
, __buffer
);
2570 copy(__middle
, __last
, __first
);
2571 return copy_backward(__buffer
, __buffer_end
, __last
);
2574 return rotate(__first
, __middle
, __last
);
2577 template <class _BidirectionalIter1
, class _BidirectionalIter2
,
2578 class _BidirectionalIter3
>
2579 _BidirectionalIter3
__merge_backward(_BidirectionalIter1 __first1
,
2580 _BidirectionalIter1 __last1
,
2581 _BidirectionalIter2 __first2
,
2582 _BidirectionalIter2 __last2
,
2583 _BidirectionalIter3 __result
)
2585 if (__first1
== __last1
)
2586 return copy_backward(__first2
, __last2
, __result
);
2587 if (__first2
== __last2
)
2588 return copy_backward(__first1
, __last1
, __result
);
2592 if (*__last2
< *__last1
) {
2593 *--__result
= *__last1
;
2594 if (__first1
== __last1
)
2595 return copy_backward(__first2
, ++__last2
, __result
);
2599 *--__result
= *__last2
;
2600 if (__first2
== __last2
)
2601 return copy_backward(__first1
, ++__last1
, __result
);
2607 template <class _BidirectionalIter1
, class _BidirectionalIter2
,
2608 class _BidirectionalIter3
, class _Compare
>
2609 _BidirectionalIter3
__merge_backward(_BidirectionalIter1 __first1
,
2610 _BidirectionalIter1 __last1
,
2611 _BidirectionalIter2 __first2
,
2612 _BidirectionalIter2 __last2
,
2613 _BidirectionalIter3 __result
,
2616 if (__first1
== __last1
)
2617 return copy_backward(__first2
, __last2
, __result
);
2618 if (__first2
== __last2
)
2619 return copy_backward(__first1
, __last1
, __result
);
2623 if (__comp(*__last2
, *__last1
)) {
2624 *--__result
= *__last1
;
2625 if (__first1
== __last1
)
2626 return copy_backward(__first2
, ++__last2
, __result
);
2630 *--__result
= *__last2
;
2631 if (__first2
== __last2
)
2632 return copy_backward(__first1
, ++__last1
, __result
);
2638 template <class _BidirectionalIter
, class _Distance
, class _Pointer
>
2639 void __merge_adaptive(_BidirectionalIter __first
,
2640 _BidirectionalIter __middle
,
2641 _BidirectionalIter __last
,
2642 _Distance __len1
, _Distance __len2
,
2643 _Pointer __buffer
, _Distance __buffer_size
)
2645 if (__len1
<= __len2
&& __len1
<= __buffer_size
) {
2646 _Pointer __buffer_end
= copy(__first
, __middle
, __buffer
);
2647 merge(__buffer
, __buffer_end
, __middle
, __last
, __first
);
2649 else if (__len2
<= __buffer_size
) {
2650 _Pointer __buffer_end
= copy(__middle
, __last
, __buffer
);
2651 __merge_backward(__first
, __middle
, __buffer
, __buffer_end
, __last
);
2654 _BidirectionalIter __first_cut
= __first
;
2655 _BidirectionalIter __second_cut
= __middle
;
2656 _Distance __len11
= 0;
2657 _Distance __len22
= 0;
2658 if (__len1
> __len2
) {
2659 __len11
= __len1
/ 2;
2660 advance(__first_cut
, __len11
);
2661 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
);
2662 distance(__middle
, __second_cut
, __len22
);
2665 __len22
= __len2
/ 2;
2666 advance(__second_cut
, __len22
);
2667 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
);
2668 distance(__first
, __first_cut
, __len11
);
2670 _BidirectionalIter __new_middle
=
2671 __rotate_adaptive(__first_cut
, __middle
, __second_cut
, __len1
- __len11
,
2672 __len22
, __buffer
, __buffer_size
);
2673 __merge_adaptive(__first
, __first_cut
, __new_middle
, __len11
,
2674 __len22
, __buffer
, __buffer_size
);
2675 __merge_adaptive(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2676 __len2
- __len22
, __buffer
, __buffer_size
);
2680 template <class _BidirectionalIter
, class _Distance
, class _Pointer
,
2682 void __merge_adaptive(_BidirectionalIter __first
,
2683 _BidirectionalIter __middle
,
2684 _BidirectionalIter __last
,
2685 _Distance __len1
, _Distance __len2
,
2686 _Pointer __buffer
, _Distance __buffer_size
,
2689 if (__len1
<= __len2
&& __len1
<= __buffer_size
) {
2690 _Pointer __buffer_end
= copy(__first
, __middle
, __buffer
);
2691 merge(__buffer
, __buffer_end
, __middle
, __last
, __first
, __comp
);
2693 else if (__len2
<= __buffer_size
) {
2694 _Pointer __buffer_end
= copy(__middle
, __last
, __buffer
);
2695 __merge_backward(__first
, __middle
, __buffer
, __buffer_end
, __last
,
2699 _BidirectionalIter __first_cut
= __first
;
2700 _BidirectionalIter __second_cut
= __middle
;
2701 _Distance __len11
= 0;
2702 _Distance __len22
= 0;
2703 if (__len1
> __len2
) {
2704 __len11
= __len1
/ 2;
2705 advance(__first_cut
, __len11
);
2706 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
, __comp
);
2707 distance(__middle
, __second_cut
, __len22
);
2710 __len22
= __len2
/ 2;
2711 advance(__second_cut
, __len22
);
2712 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
, __comp
);
2713 distance(__first
, __first_cut
, __len11
);
2715 _BidirectionalIter __new_middle
=
2716 __rotate_adaptive(__first_cut
, __middle
, __second_cut
, __len1
- __len11
,
2717 __len22
, __buffer
, __buffer_size
);
2718 __merge_adaptive(__first
, __first_cut
, __new_middle
, __len11
,
2719 __len22
, __buffer
, __buffer_size
, __comp
);
2720 __merge_adaptive(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2721 __len2
- __len22
, __buffer
, __buffer_size
, __comp
);
2725 template <class _BidirectionalIter
, class _Tp
, class _Distance
>
2726 inline void __inplace_merge_aux(_BidirectionalIter __first
,
2727 _BidirectionalIter __middle
,
2728 _BidirectionalIter __last
, _Tp
*, _Distance
*)
2730 _Distance __len1
= 0;
2731 distance(__first
, __middle
, __len1
);
2732 _Distance __len2
= 0;
2733 distance(__middle
, __last
, __len2
);
2735 _Temporary_buffer
<_BidirectionalIter
, _Tp
> __buf(__first
, __last
);
2736 if (__buf
.begin() == 0)
2737 __merge_without_buffer(__first
, __middle
, __last
, __len1
, __len2
);
2739 __merge_adaptive(__first
, __middle
, __last
, __len1
, __len2
,
2740 __buf
.begin(), _Distance(__buf
.size()));
2743 template <class _BidirectionalIter
, class _Tp
,
2744 class _Distance
, class _Compare
>
2745 inline void __inplace_merge_aux(_BidirectionalIter __first
,
2746 _BidirectionalIter __middle
,
2747 _BidirectionalIter __last
, _Tp
*, _Distance
*,
2750 _Distance __len1
= 0;
2751 distance(__first
, __middle
, __len1
);
2752 _Distance __len2
= 0;
2753 distance(__middle
, __last
, __len2
);
2755 _Temporary_buffer
<_BidirectionalIter
, _Tp
> __buf(__first
, __last
);
2756 if (__buf
.begin() == 0)
2757 __merge_without_buffer(__first
, __middle
, __last
, __len1
, __len2
, __comp
);
2759 __merge_adaptive(__first
, __middle
, __last
, __len1
, __len2
,
2760 __buf
.begin(), _Distance(__buf
.size()),
2764 template <class _BidirectionalIter
>
2765 inline void inplace_merge(_BidirectionalIter __first
,
2766 _BidirectionalIter __middle
,
2767 _BidirectionalIter __last
)
2769 // concept requirements
2770 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
2771 _BidirectionalIter
>);
2772 __glibcpp_function_requires(_LessThanComparableConcept
<
2773 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
2775 if (__first
== __middle
|| __middle
== __last
)
2777 __inplace_merge_aux(__first
, __middle
, __last
,
2778 __value_type(__first
), __distance_type(__first
));
2781 template <class _BidirectionalIter
, class _Compare
>
2782 inline void inplace_merge(_BidirectionalIter __first
,
2783 _BidirectionalIter __middle
,
2784 _BidirectionalIter __last
, _Compare __comp
)
2786 // concept requirements
2787 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
2788 _BidirectionalIter
>);
2789 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2790 typename iterator_traits
<_BidirectionalIter
>::value_type
,
2791 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
2793 if (__first
== __middle
|| __middle
== __last
)
2795 __inplace_merge_aux(__first
, __middle
, __last
,
2796 __value_type(__first
), __distance_type(__first
),
2800 // Set algorithms: includes, set_union, set_intersection, set_difference,
2801 // set_symmetric_difference. All of these algorithms have the precondition
2802 // that their input ranges are sorted and the postcondition that their output
2803 // ranges are sorted.
2805 template <class _InputIter1
, class _InputIter2
>
2806 bool includes(_InputIter1 __first1
, _InputIter1 __last1
,
2807 _InputIter2 __first2
, _InputIter2 __last2
)
2809 // concept requirements
2810 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2811 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2812 __glibcpp_function_requires(_SameTypeConcept
<
2813 typename iterator_traits
<_InputIter1
>::value_type
,
2814 typename iterator_traits
<_InputIter2
>::value_type
>);
2815 __glibcpp_function_requires(_LessThanComparableConcept
<
2816 typename iterator_traits
<_InputIter1
>::value_type
>);
2818 while (__first1
!= __last1
&& __first2
!= __last2
)
2819 if (*__first2
< *__first1
)
2821 else if(*__first1
< *__first2
)
2824 ++__first1
, ++__first2
;
2826 return __first2
== __last2
;
2829 template <class _InputIter1
, class _InputIter2
, class _Compare
>
2830 bool includes(_InputIter1 __first1
, _InputIter1 __last1
,
2831 _InputIter2 __first2
, _InputIter2 __last2
, _Compare __comp
)
2833 // concept requirements
2834 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2835 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2836 __glibcpp_function_requires(_SameTypeConcept
<
2837 typename iterator_traits
<_InputIter1
>::value_type
,
2838 typename iterator_traits
<_InputIter2
>::value_type
>);
2839 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2840 typename iterator_traits
<_InputIter1
>::value_type
,
2841 typename iterator_traits
<_InputIter2
>::value_type
>);
2843 while (__first1
!= __last1
&& __first2
!= __last2
)
2844 if (__comp(*__first2
, *__first1
))
2846 else if(__comp(*__first1
, *__first2
))
2849 ++__first1
, ++__first2
;
2851 return __first2
== __last2
;
2854 template <class _InputIter1
, class _InputIter2
, class _OutputIter
>
2855 _OutputIter
set_union(_InputIter1 __first1
, _InputIter1 __last1
,
2856 _InputIter2 __first2
, _InputIter2 __last2
,
2857 _OutputIter __result
)
2859 // concept requirements
2860 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2861 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2862 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2863 typename iterator_traits
<_InputIter1
>::value_type
>);
2864 __glibcpp_function_requires(_SameTypeConcept
<
2865 typename iterator_traits
<_InputIter1
>::value_type
,
2866 typename iterator_traits
<_InputIter2
>::value_type
>);
2867 __glibcpp_function_requires(_LessThanComparableConcept
<
2868 typename iterator_traits
<_InputIter1
>::value_type
>);
2870 while (__first1
!= __last1
&& __first2
!= __last2
) {
2871 if (*__first1
< *__first2
) {
2872 *__result
= *__first1
;
2875 else if (*__first2
< *__first1
) {
2876 *__result
= *__first2
;
2880 *__result
= *__first1
;
2886 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2889 template <class _InputIter1
, class _InputIter2
, class _OutputIter
,
2891 _OutputIter
set_union(_InputIter1 __first1
, _InputIter1 __last1
,
2892 _InputIter2 __first2
, _InputIter2 __last2
,
2893 _OutputIter __result
, _Compare __comp
)
2895 // concept requirements
2896 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2897 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2898 __glibcpp_function_requires(_SameTypeConcept
<
2899 typename iterator_traits
<_InputIter1
>::value_type
,
2900 typename iterator_traits
<_InputIter2
>::value_type
>);
2901 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2902 typename iterator_traits
<_InputIter1
>::value_type
>);
2903 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2904 typename iterator_traits
<_InputIter1
>::value_type
,
2905 typename iterator_traits
<_InputIter2
>::value_type
>);
2907 while (__first1
!= __last1
&& __first2
!= __last2
) {
2908 if (__comp(*__first1
, *__first2
)) {
2909 *__result
= *__first1
;
2912 else if (__comp(*__first2
, *__first1
)) {
2913 *__result
= *__first2
;
2917 *__result
= *__first1
;
2923 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2926 template <class _InputIter1
, class _InputIter2
, class _OutputIter
>
2927 _OutputIter
set_intersection(_InputIter1 __first1
, _InputIter1 __last1
,
2928 _InputIter2 __first2
, _InputIter2 __last2
,
2929 _OutputIter __result
)
2931 // concept requirements
2932 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2933 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2934 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2935 typename iterator_traits
<_InputIter1
>::value_type
>);
2936 __glibcpp_function_requires(_SameTypeConcept
<
2937 typename iterator_traits
<_InputIter1
>::value_type
,
2938 typename iterator_traits
<_InputIter2
>::value_type
>);
2939 __glibcpp_function_requires(_LessThanComparableConcept
<
2940 typename iterator_traits
<_InputIter1
>::value_type
>);
2942 while (__first1
!= __last1
&& __first2
!= __last2
)
2943 if (*__first1
< *__first2
)
2945 else if (*__first2
< *__first1
)
2948 *__result
= *__first1
;
2956 template <class _InputIter1
, class _InputIter2
, class _OutputIter
,
2958 _OutputIter
set_intersection(_InputIter1 __first1
, _InputIter1 __last1
,
2959 _InputIter2 __first2
, _InputIter2 __last2
,
2960 _OutputIter __result
, _Compare __comp
)
2962 // concept requirements
2963 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2964 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2965 __glibcpp_function_requires(_SameTypeConcept
<
2966 typename iterator_traits
<_InputIter1
>::value_type
,
2967 typename iterator_traits
<_InputIter2
>::value_type
>);
2968 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2969 typename iterator_traits
<_InputIter1
>::value_type
>);
2970 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2971 typename iterator_traits
<_InputIter1
>::value_type
,
2972 typename iterator_traits
<_InputIter2
>::value_type
>);
2974 while (__first1
!= __last1
&& __first2
!= __last2
)
2975 if (__comp(*__first1
, *__first2
))
2977 else if (__comp(*__first2
, *__first1
))
2980 *__result
= *__first1
;
2988 template <class _InputIter1
, class _InputIter2
, class _OutputIter
>
2989 _OutputIter
set_difference(_InputIter1 __first1
, _InputIter1 __last1
,
2990 _InputIter2 __first2
, _InputIter2 __last2
,
2991 _OutputIter __result
)
2993 // concept requirements
2994 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
2995 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
2996 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2997 typename iterator_traits
<_InputIter1
>::value_type
>);
2998 __glibcpp_function_requires(_SameTypeConcept
<
2999 typename iterator_traits
<_InputIter1
>::value_type
,
3000 typename iterator_traits
<_InputIter2
>::value_type
>);
3001 __glibcpp_function_requires(_LessThanComparableConcept
<
3002 typename iterator_traits
<_InputIter1
>::value_type
>);
3004 while (__first1
!= __last1
&& __first2
!= __last2
)
3005 if (*__first1
< *__first2
) {
3006 *__result
= *__first1
;
3010 else if (*__first2
< *__first1
)
3016 return copy(__first1
, __last1
, __result
);
3019 template <class _InputIter1
, class _InputIter2
, class _OutputIter
,
3021 _OutputIter
set_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3022 _InputIter2 __first2
, _InputIter2 __last2
,
3023 _OutputIter __result
, _Compare __comp
)
3025 // concept requirements
3026 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
3027 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
3028 __glibcpp_function_requires(_SameTypeConcept
<
3029 typename iterator_traits
<_InputIter1
>::value_type
,
3030 typename iterator_traits
<_InputIter2
>::value_type
>);
3031 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3032 typename iterator_traits
<_InputIter1
>::value_type
>);
3033 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3034 typename iterator_traits
<_InputIter1
>::value_type
,
3035 typename iterator_traits
<_InputIter2
>::value_type
>);
3037 while (__first1
!= __last1
&& __first2
!= __last2
)
3038 if (__comp(*__first1
, *__first2
)) {
3039 *__result
= *__first1
;
3043 else if (__comp(*__first2
, *__first1
))
3049 return copy(__first1
, __last1
, __result
);
3052 template <class _InputIter1
, class _InputIter2
, class _OutputIter
>
3054 set_symmetric_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3055 _InputIter2 __first2
, _InputIter2 __last2
,
3056 _OutputIter __result
)
3058 // concept requirements
3059 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
3060 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
3061 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3062 typename iterator_traits
<_InputIter1
>::value_type
>);
3063 __glibcpp_function_requires(_SameTypeConcept
<
3064 typename iterator_traits
<_InputIter1
>::value_type
,
3065 typename iterator_traits
<_InputIter2
>::value_type
>);
3066 __glibcpp_function_requires(_LessThanComparableConcept
<
3067 typename iterator_traits
<_InputIter1
>::value_type
>);
3069 while (__first1
!= __last1
&& __first2
!= __last2
)
3070 if (*__first1
< *__first2
) {
3071 *__result
= *__first1
;
3075 else if (*__first2
< *__first1
) {
3076 *__result
= *__first2
;
3084 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3087 template <class _InputIter1
, class _InputIter2
, class _OutputIter
,
3090 set_symmetric_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3091 _InputIter2 __first2
, _InputIter2 __last2
,
3092 _OutputIter __result
,
3095 // concept requirements
3096 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>);
3097 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>);
3098 __glibcpp_function_requires(_SameTypeConcept
<
3099 typename iterator_traits
<_InputIter1
>::value_type
,
3100 typename iterator_traits
<_InputIter2
>::value_type
>);
3101 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3102 typename iterator_traits
<_InputIter1
>::value_type
>);
3103 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3104 typename iterator_traits
<_InputIter1
>::value_type
,
3105 typename iterator_traits
<_InputIter2
>::value_type
>);
3107 while (__first1
!= __last1
&& __first2
!= __last2
)
3108 if (__comp(*__first1
, *__first2
)) {
3109 *__result
= *__first1
;
3113 else if (__comp(*__first2
, *__first1
)) {
3114 *__result
= *__first2
;
3122 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3125 // min_element and max_element, with and without an explicitly supplied
3126 // comparison function.
3128 template <class _ForwardIter
>
3129 _ForwardIter
max_element(_ForwardIter __first
, _ForwardIter __last
)
3131 // concept requirements
3132 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3133 __glibcpp_function_requires(_LessThanComparableConcept
<
3134 typename iterator_traits
<_ForwardIter
>::value_type
>);
3136 if (__first
== __last
) return __first
;
3137 _ForwardIter __result
= __first
;
3138 while (++__first
!= __last
)
3139 if (*__result
< *__first
)
3144 template <class _ForwardIter
, class _Compare
>
3145 _ForwardIter
max_element(_ForwardIter __first
, _ForwardIter __last
,
3148 // concept requirements
3149 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3150 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3151 typename iterator_traits
<_ForwardIter
>::value_type
,
3152 typename iterator_traits
<_ForwardIter
>::value_type
>);
3154 if (__first
== __last
) return __first
;
3155 _ForwardIter __result
= __first
;
3156 while (++__first
!= __last
)
3157 if (__comp(*__result
, *__first
)) __result
= __first
;
3161 template <class _ForwardIter
>
3162 _ForwardIter
min_element(_ForwardIter __first
, _ForwardIter __last
)
3164 // concept requirements
3165 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3166 __glibcpp_function_requires(_LessThanComparableConcept
<
3167 typename iterator_traits
<_ForwardIter
>::value_type
>);
3169 if (__first
== __last
) return __first
;
3170 _ForwardIter __result
= __first
;
3171 while (++__first
!= __last
)
3172 if (*__first
< *__result
)
3177 template <class _ForwardIter
, class _Compare
>
3178 _ForwardIter
min_element(_ForwardIter __first
, _ForwardIter __last
,
3181 // concept requirements
3182 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3183 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3184 typename iterator_traits
<_ForwardIter
>::value_type
,
3185 typename iterator_traits
<_ForwardIter
>::value_type
>);
3187 if (__first
== __last
) return __first
;
3188 _ForwardIter __result
= __first
;
3189 while (++__first
!= __last
)
3190 if (__comp(*__first
, *__result
))
3195 // next_permutation and prev_permutation, with and without an explicitly
3196 // supplied comparison function.
3198 template <class _BidirectionalIter
>
3199 bool next_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
)
3201 // concept requirements
3202 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>);
3203 __glibcpp_function_requires(_LessThanComparableConcept
<
3204 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
3206 if (__first
== __last
)
3208 _BidirectionalIter __i
= __first
;
3216 _BidirectionalIter __ii
= __i
;
3219 _BidirectionalIter __j
= __last
;
3220 while (!(*__i
< *--__j
))
3222 iter_swap(__i
, __j
);
3223 reverse(__ii
, __last
);
3226 if (__i
== __first
) {
3227 reverse(__first
, __last
);
3233 template <class _BidirectionalIter
, class _Compare
>
3234 bool next_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
,
3237 // concept requirements
3238 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>);
3239 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3240 typename iterator_traits
<_BidirectionalIter
>::value_type
,
3241 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
3243 if (__first
== __last
)
3245 _BidirectionalIter __i
= __first
;
3253 _BidirectionalIter __ii
= __i
;
3255 if (__comp(*__i
, *__ii
)) {
3256 _BidirectionalIter __j
= __last
;
3257 while (!__comp(*__i
, *--__j
))
3259 iter_swap(__i
, __j
);
3260 reverse(__ii
, __last
);
3263 if (__i
== __first
) {
3264 reverse(__first
, __last
);
3270 template <class _BidirectionalIter
>
3271 bool prev_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
)
3273 // concept requirements
3274 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>);
3275 __glibcpp_function_requires(_LessThanComparableConcept
<
3276 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
3278 if (__first
== __last
)
3280 _BidirectionalIter __i
= __first
;
3288 _BidirectionalIter __ii
= __i
;
3291 _BidirectionalIter __j
= __last
;
3292 while (!(*--__j
< *__i
))
3294 iter_swap(__i
, __j
);
3295 reverse(__ii
, __last
);
3298 if (__i
== __first
) {
3299 reverse(__first
, __last
);
3305 template <class _BidirectionalIter
, class _Compare
>
3306 bool prev_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
,
3309 // concept requirements
3310 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>);
3311 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3312 typename iterator_traits
<_BidirectionalIter
>::value_type
,
3313 typename iterator_traits
<_BidirectionalIter
>::value_type
>);
3315 if (__first
== __last
)
3317 _BidirectionalIter __i
= __first
;
3325 _BidirectionalIter __ii
= __i
;
3327 if (__comp(*__ii
, *__i
)) {
3328 _BidirectionalIter __j
= __last
;
3329 while (!__comp(*--__j
, *__i
))
3331 iter_swap(__i
, __j
);
3332 reverse(__ii
, __last
);
3335 if (__i
== __first
) {
3336 reverse(__first
, __last
);
3342 // find_first_of, with and without an explicitly supplied comparison function.
3344 template <class _InputIter
, class _ForwardIter
>
3345 _InputIter
find_first_of(_InputIter __first1
, _InputIter __last1
,
3346 _ForwardIter __first2
, _ForwardIter __last2
)
3348 // concept requirements
3349 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
3350 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3351 __glibcpp_function_requires(_EqualOpConcept
<
3352 typename iterator_traits
<_InputIter
>::value_type
,
3353 typename iterator_traits
<_ForwardIter
>::value_type
>);
3355 for ( ; __first1
!= __last1
; ++__first1
)
3356 for (_ForwardIter __iter
= __first2
; __iter
!= __last2
; ++__iter
)
3357 if (*__first1
== *__iter
)
3362 template <class _InputIter
, class _ForwardIter
, class _BinaryPredicate
>
3363 _InputIter
find_first_of(_InputIter __first1
, _InputIter __last1
,
3364 _ForwardIter __first2
, _ForwardIter __last2
,
3365 _BinaryPredicate __comp
)
3367 // concept requirements
3368 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>);
3369 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3370 __glibcpp_function_requires(_EqualOpConcept
<
3371 typename iterator_traits
<_InputIter
>::value_type
,
3372 typename iterator_traits
<_ForwardIter
>::value_type
>);
3373 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
3374 typename iterator_traits
<_InputIter
>::value_type
,
3375 typename iterator_traits
<_ForwardIter
>::value_type
>);
3377 for ( ; __first1
!= __last1
; ++__first1
)
3378 for (_ForwardIter __iter
= __first2
; __iter
!= __last2
; ++__iter
)
3379 if (__comp(*__first1
, *__iter
))
3385 // find_end, with and without an explicitly supplied comparison function.
3386 // Search [first2, last2) as a subsequence in [first1, last1), and return
3387 // the *last* possible match. Note that find_end for bidirectional iterators
3388 // is much faster than for forward iterators.
3390 // find_end for forward iterators.
3391 template <class _ForwardIter1
, class _ForwardIter2
>
3392 _ForwardIter1
__find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3393 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3394 forward_iterator_tag
, forward_iterator_tag
)
3396 if (__first2
== __last2
)
3399 _ForwardIter1 __result
= __last1
;
3401 _ForwardIter1 __new_result
3402 = search(__first1
, __last1
, __first2
, __last2
);
3403 if (__new_result
== __last1
)
3406 __result
= __new_result
;
3407 __first1
= __new_result
;
3414 template <class _ForwardIter1
, class _ForwardIter2
,
3415 class _BinaryPredicate
>
3416 _ForwardIter1
__find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3417 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3418 forward_iterator_tag
, forward_iterator_tag
,
3419 _BinaryPredicate __comp
)
3421 if (__first2
== __last2
)
3424 _ForwardIter1 __result
= __last1
;
3426 _ForwardIter1 __new_result
3427 = search(__first1
, __last1
, __first2
, __last2
, __comp
);
3428 if (__new_result
== __last1
)
3431 __result
= __new_result
;
3432 __first1
= __new_result
;
3439 // find_end for bidirectional iterators. Requires partial specialization.
3440 template <class _BidirectionalIter1
, class _BidirectionalIter2
>
3442 __find_end(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
3443 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
3444 bidirectional_iterator_tag
, bidirectional_iterator_tag
)
3446 // concept requirements
3447 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter1
>);
3448 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter2
>);
3450 typedef reverse_iterator
<_BidirectionalIter1
> _RevIter1
;
3451 typedef reverse_iterator
<_BidirectionalIter2
> _RevIter2
;
3453 _RevIter1
__rlast1(__first1
);
3454 _RevIter2
__rlast2(__first2
);
3455 _RevIter1 __rresult
= search(_RevIter1(__last1
), __rlast1
,
3456 _RevIter2(__last2
), __rlast2
);
3458 if (__rresult
== __rlast1
)
3461 _BidirectionalIter1 __result
= __rresult
.base();
3462 advance(__result
, -distance(__first2
, __last2
));
3467 template <class _BidirectionalIter1
, class _BidirectionalIter2
,
3468 class _BinaryPredicate
>
3470 __find_end(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
3471 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
3472 bidirectional_iterator_tag
, bidirectional_iterator_tag
,
3473 _BinaryPredicate __comp
)
3475 // concept requirements
3476 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter1
>);
3477 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter2
>);
3479 typedef reverse_iterator
<_BidirectionalIter1
> _RevIter1
;
3480 typedef reverse_iterator
<_BidirectionalIter2
> _RevIter2
;
3482 _RevIter1
__rlast1(__first1
);
3483 _RevIter2
__rlast2(__first2
);
3484 _RevIter1 __rresult
= search(_RevIter1(__last1
), __rlast1
,
3485 _RevIter2(__last2
), __rlast2
,
3488 if (__rresult
== __rlast1
)
3491 _BidirectionalIter1 __result
= __rresult
.base();
3492 advance(__result
, -distance(__first2
, __last2
));
3497 // Dispatching functions for find_end.
3499 template <class _ForwardIter1
, class _ForwardIter2
>
3500 inline _ForwardIter1
3501 find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3502 _ForwardIter2 __first2
, _ForwardIter2 __last2
)
3504 // concept requirements
3505 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>);
3506 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>);
3507 __glibcpp_function_requires(_EqualOpConcept
<
3508 typename iterator_traits
<_ForwardIter1
>::value_type
,
3509 typename iterator_traits
<_ForwardIter2
>::value_type
>);
3511 return __find_end(__first1
, __last1
, __first2
, __last2
,
3512 __iterator_category(__first1
),
3513 __iterator_category(__first2
));
3516 template <class _ForwardIter1
, class _ForwardIter2
,
3517 class _BinaryPredicate
>
3518 inline _ForwardIter1
3519 find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3520 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3521 _BinaryPredicate __comp
)
3523 // concept requirements
3524 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>);
3525 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>);
3526 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
3527 typename iterator_traits
<_ForwardIter1
>::value_type
,
3528 typename iterator_traits
<_ForwardIter2
>::value_type
>);
3530 return __find_end(__first1
, __last1
, __first2
, __last2
,
3531 __iterator_category(__first1
),
3532 __iterator_category(__first2
),
3536 // is_heap, a predicate testing whether or not a range is
3537 // a heap. This function is an extension, not part of the C++
3540 template <class _RandomAccessIter
, class _Distance
>
3541 bool __is_heap(_RandomAccessIter __first
, _Distance __n
)
3543 _Distance __parent
= 0;
3544 for (_Distance __child
= 1; __child
< __n
; ++__child
) {
3545 if (__first
[__parent
] < __first
[__child
])
3547 if ((__child
& 1) == 0)
3553 template <class _RandomAccessIter
, class _Distance
, class _StrictWeakOrdering
>
3554 bool __is_heap(_RandomAccessIter __first
, _StrictWeakOrdering __comp
,
3557 _Distance __parent
= 0;
3558 for (_Distance __child
= 1; __child
< __n
; ++__child
) {
3559 if (__comp(__first
[__parent
], __first
[__child
]))
3561 if ((__child
& 1) == 0)
3567 template <class _RandomAccessIter
>
3568 inline bool is_heap(_RandomAccessIter __first
, _RandomAccessIter __last
)
3570 // concept requirements
3571 __glibcpp_function_requires(_RandomAccessIteratorConcept
<_RandomAccessIter
>);
3572 __glibcpp_function_requires(_LessThanComparableConcept
<
3573 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
3575 return __is_heap(__first
, __last
- __first
);
3579 template <class _RandomAccessIter
, class _StrictWeakOrdering
>
3580 inline bool is_heap(_RandomAccessIter __first
, _RandomAccessIter __last
,
3581 _StrictWeakOrdering __comp
)
3583 // concept requirements
3584 __glibcpp_function_requires(_RandomAccessIteratorConcept
<_RandomAccessIter
>);
3585 __glibcpp_function_requires(_BinaryPredicateConcept
<_StrictWeakOrdering
,
3586 typename iterator_traits
<_RandomAccessIter
>::value_type
,
3587 typename iterator_traits
<_RandomAccessIter
>::value_type
>);
3589 return __is_heap(__first
, __comp
, __last
- __first
);
3592 // is_sorted, a predicated testing whether a range is sorted in
3593 // nondescending order. This is an extension, not part of the C++
3596 template <class _ForwardIter
>
3597 bool is_sorted(_ForwardIter __first
, _ForwardIter __last
)
3599 // concept requirements
3600 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3601 __glibcpp_function_requires(_LessThanComparableConcept
<
3602 typename iterator_traits
<_ForwardIter
>::value_type
>);
3604 if (__first
== __last
)
3607 _ForwardIter __next
= __first
;
3608 for (++__next
; __next
!= __last
; __first
= __next
, ++__next
) {
3609 if (*__next
< *__first
)
3616 template <class _ForwardIter
, class _StrictWeakOrdering
>
3617 bool is_sorted(_ForwardIter __first
, _ForwardIter __last
,
3618 _StrictWeakOrdering __comp
)
3620 // concept requirements
3621 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>);
3622 __glibcpp_function_requires(_BinaryPredicateConcept
<_StrictWeakOrdering
,
3623 typename iterator_traits
<_ForwardIter
>::value_type
,
3624 typename iterator_traits
<_ForwardIter
>::value_type
>);
3626 if (__first
== __last
)
3629 _ForwardIter __next
= __first
;
3630 for (++__next
; __next
!= __last
; __first
= __next
, ++__next
) {
3631 if (__comp(*__next
, *__first
))
3640 #endif /* __SGI_STL_INTERNAL_ALGO_H */