1 // Algorithm implementation -*- C++ -*-
3 // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
33 * Hewlett-Packard Company
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation. Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose. It is provided "as is" without express or implied warranty.
45 * Silicon Graphics Computer Systems, Inc.
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation. Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose. It is provided "as is" without express or implied warranty.
57 * This is an internal header file, included by other library headers.
58 * You should not attempt to use it directly.
61 #ifndef __GLIBCPP_INTERNAL_ALGO_H
62 #define __GLIBCPP_INTERNAL_ALGO_H
64 #include <bits/stl_heap.h>
65 #include <bits/stl_tempbuf.h> // for _Temporary_buffer
67 // See concept_check.h for the __glibcpp_*_requires macros.
73 * @brief Find the median of three values.
77 * @return One of @p a, @p b or @p c.
79 * If @c {l,m,n} is some convolution of @p {a,b,c} such that @c l<=m<=n
80 * then the value returned will be @c m.
81 * This is an SGI extension.
82 * @ingroup SGIextensions
84 template<typename _Tp
>
86 __median(const _Tp
& __a
, const _Tp
& __b
, const _Tp
& __c
)
88 // concept requirements
89 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>)
106 * @brief Find the median of three values using a predicate for comparison.
110 * @param comp A binary predicate.
111 * @return One of @p a, @p b or @p c.
113 * If @c {l,m,n} is some convolution of @p {a,b,c} such that @p comp(l,m)
114 * and @p comp(m,n) are both true then the value returned will be @c m.
115 * This is an SGI extension.
116 * @ingroup SGIextensions
118 template<typename _Tp
, typename _Compare
>
120 __median(const _Tp
& __a
, const _Tp
& __b
, const _Tp
& __c
, _Compare __comp
)
122 // concept requirements
123 __glibcpp_function_requires(_BinaryFunctionConcept
<_Compare
, bool, _Tp
, _Tp
>)
124 if (__comp(__a
, __b
))
125 if (__comp(__b
, __c
))
127 else if (__comp(__a
, __c
))
131 else if (__comp(__a
, __c
))
133 else if (__comp(__b
, __c
))
140 * @brief Apply a function to every element of a sequence.
141 * @param first An input iterator.
142 * @param last An input iterator.
143 * @param f A unary function object.
146 * Applies the function object @p f to each element in the range
148 * @p f must not modify its argument.
149 * If @p f has a return value it is ignored.
151 template<typename _InputIter
, typename _Function
>
153 for_each(_InputIter __first
, _InputIter __last
, _Function __f
)
155 // concept requirements
156 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
157 for ( ; __first
!= __last
; ++__first
)
164 * This is an overload used by find() for the Input Iterator case.
167 template<typename _InputIter
, typename _Tp
>
169 find(_InputIter __first
, _InputIter __last
,
173 while (__first
!= __last
&& !(*__first
== __val
))
180 * This is an overload used by find_if() for the Input Iterator case.
183 template<typename _InputIter
, typename _Predicate
>
185 find_if(_InputIter __first
, _InputIter __last
,
189 while (__first
!= __last
&& !__pred(*__first
))
196 * This is an overload used by find() for the RAI case.
199 template<typename _RandomAccessIter
, typename _Tp
>
201 find(_RandomAccessIter __first
, _RandomAccessIter __last
,
203 random_access_iterator_tag
)
205 typename iterator_traits
<_RandomAccessIter
>::difference_type __trip_count
206 = (__last
- __first
) >> 2;
208 for ( ; __trip_count
> 0 ; --__trip_count
) {
209 if (*__first
== __val
) return __first
;
212 if (*__first
== __val
) return __first
;
215 if (*__first
== __val
) return __first
;
218 if (*__first
== __val
) return __first
;
222 switch(__last
- __first
) {
224 if (*__first
== __val
) return __first
;
227 if (*__first
== __val
) return __first
;
230 if (*__first
== __val
) return __first
;
240 * This is an overload used by find_if() for the RAI case.
243 template<typename _RandomAccessIter
, typename _Predicate
>
245 find_if(_RandomAccessIter __first
, _RandomAccessIter __last
,
247 random_access_iterator_tag
)
249 typename iterator_traits
<_RandomAccessIter
>::difference_type __trip_count
250 = (__last
- __first
) >> 2;
252 for ( ; __trip_count
> 0 ; --__trip_count
) {
253 if (__pred(*__first
)) return __first
;
256 if (__pred(*__first
)) return __first
;
259 if (__pred(*__first
)) return __first
;
262 if (__pred(*__first
)) return __first
;
266 switch(__last
- __first
) {
268 if (__pred(*__first
)) return __first
;
271 if (__pred(*__first
)) return __first
;
274 if (__pred(*__first
)) return __first
;
283 * @brief Find the first occurrence of a value in a sequence.
284 * @param first An input iterator.
285 * @param last An input iterator.
286 * @param val The value to find.
287 * @return The first iterator @c i in the range @p [first,last)
288 * such that @c *i == @p val, or @p last if no such iterator exists.
290 template<typename _InputIter
, typename _Tp
>
292 find(_InputIter __first
, _InputIter __last
,
295 // concept requirements
296 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
297 __glibcpp_function_requires(_EqualOpConcept
<
298 typename iterator_traits
<_InputIter
>::value_type
, _Tp
>)
299 return find(__first
, __last
, __val
, __iterator_category(__first
));
303 * @brief Find the first element in a sequence for which a predicate is true.
304 * @param first An input iterator.
305 * @param last An input iterator.
306 * @param pred A predicate.
307 * @return The first iterator @c i in the range @p [first,last)
308 * such that @p pred(*i) is true, or @p last if no such iterator exists.
310 template<typename _InputIter
, typename _Predicate
>
312 find_if(_InputIter __first
, _InputIter __last
,
315 // concept requirements
316 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
317 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
318 typename iterator_traits
<_InputIter
>::value_type
>)
319 return find_if(__first
, __last
, __pred
, __iterator_category(__first
));
323 * @brief Find two adjacent values in a sequence that are equal.
324 * @param first A forward iterator.
325 * @param last A forward iterator.
326 * @return The first iterator @c i such that @c i and @c i+1 are both
327 * valid iterators in @p [first,last) and such that @c *i == @c *(i+1),
328 * or @p last if no such iterator exists.
330 template<typename _ForwardIter
>
332 adjacent_find(_ForwardIter __first
, _ForwardIter __last
)
334 // concept requirements
335 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
336 __glibcpp_function_requires(_EqualityComparableConcept
<
337 typename iterator_traits
<_ForwardIter
>::value_type
>)
338 if (__first
== __last
)
340 _ForwardIter __next
= __first
;
341 while(++__next
!= __last
) {
342 if (*__first
== *__next
)
350 * @brief Find two adjacent values in a sequence using a predicate.
351 * @param first A forward iterator.
352 * @param last A forward iterator.
353 * @param binary_pred A binary predicate.
354 * @return The first iterator @c i such that @c i and @c i+1 are both
355 * valid iterators in @p [first,last) and such that
356 * @p binary_pred(*i,*(i+1)) is true, or @p last if no such iterator
359 template<typename _ForwardIter
, typename _BinaryPredicate
>
361 adjacent_find(_ForwardIter __first
, _ForwardIter __last
,
362 _BinaryPredicate __binary_pred
)
364 // concept requirements
365 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
366 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
367 typename iterator_traits
<_ForwardIter
>::value_type
,
368 typename iterator_traits
<_ForwardIter
>::value_type
>)
369 if (__first
== __last
)
371 _ForwardIter __next
= __first
;
372 while(++__next
!= __last
) {
373 if (__binary_pred(*__first
, *__next
))
381 * @brief Count the number of copies of a value in a sequence.
382 * @param first An input iterator.
383 * @param last An input iterator.
384 * @param value The value to be counted.
385 * @return The number of iterators @c i in the range @p [first,last)
386 * for which @c *i == @p value
388 template<typename _InputIter
, typename _Tp
>
389 typename iterator_traits
<_InputIter
>::difference_type
390 count(_InputIter __first
, _InputIter __last
, const _Tp
& __value
)
392 // concept requirements
393 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
394 __glibcpp_function_requires(_EqualityComparableConcept
<
395 typename iterator_traits
<_InputIter
>::value_type
>)
396 __glibcpp_function_requires(_EqualityComparableConcept
<_Tp
>)
397 typename iterator_traits
<_InputIter
>::difference_type __n
= 0;
398 for ( ; __first
!= __last
; ++__first
)
399 if (*__first
== __value
)
405 * @brief Count the elements of a sequence for which a predicate is true.
406 * @param first An input iterator.
407 * @param last An input iterator.
408 * @param pred A predicate.
409 * @return The number of iterators @c i in the range @p [first,last)
410 * for which @p pred(*i) is true.
412 template<typename _InputIter
, typename _Predicate
>
413 typename iterator_traits
<_InputIter
>::difference_type
414 count_if(_InputIter __first
, _InputIter __last
, _Predicate __pred
)
416 // concept requirements
417 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
418 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
419 typename iterator_traits
<_InputIter
>::value_type
>)
420 typename iterator_traits
<_InputIter
>::difference_type __n
= 0;
421 for ( ; __first
!= __last
; ++__first
)
422 if (__pred(*__first
))
429 * @brief Search a sequence for a matching sub-sequence.
430 * @param first1 A forward iterator.
431 * @param last1 A forward iterator.
432 * @param first2 A forward iterator.
433 * @param last2 A forward iterator.
434 * @return The first iterator @c i in the range
435 * @p [first1,last1-(last2-first2)) such that @c *(i+N) == @p *(first2+N)
436 * for each @c N in the range @p [0,last2-first2), or @p last1 if no
437 * such iterator exists.
439 * Searches the range @p [first1,last1) for a sub-sequence that compares
440 * equal value-by-value with the sequence given by @p [first2,last2) and
441 * returns an iterator to the first element of the sub-sequence, or
442 * @p last1 if the sub-sequence is not found.
444 * Because the sub-sequence must lie completely within the range
445 * @p [first1,last1) it must start at a position less than
446 * @p last1-(last2-first2) where @p last2-first2 is the length of the
448 * This means that the returned iterator @c i will be in the range
449 * @p [first1,last1-(last2-first2))
451 template<typename _ForwardIter1
, typename _ForwardIter2
>
453 search(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
454 _ForwardIter2 __first2
, _ForwardIter2 __last2
)
456 // concept requirements
457 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>)
458 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>)
459 __glibcpp_function_requires(_EqualOpConcept
<
460 typename iterator_traits
<_ForwardIter1
>::value_type
,
461 typename iterator_traits
<_ForwardIter2
>::value_type
>)
463 // Test for empty ranges
464 if (__first1
== __last1
|| __first2
== __last2
)
467 // Test for a pattern of length 1.
468 _ForwardIter2
__tmp(__first2
);
470 if (__tmp
== __last2
)
471 return find(__first1
, __last1
, *__first2
);
475 _ForwardIter2 __p1
, __p
;
477 __p1
= __first2
; ++__p1
;
479 _ForwardIter1 __current
= __first1
;
481 while (__first1
!= __last1
) {
482 __first1
= find(__first1
, __last1
, *__first2
);
483 if (__first1
== __last1
)
487 __current
= __first1
;
488 if (++__current
== __last1
)
491 while (*__current
== *__p
) {
492 if (++__p
== __last2
)
494 if (++__current
== __last1
)
504 * @brief Search a sequence for a matching sub-sequence using a predicate.
505 * @param first1 A forward iterator.
506 * @param last1 A forward iterator.
507 * @param first2 A forward iterator.
508 * @param last2 A forward iterator.
509 * @param predicate A binary predicate.
510 * @return The first iterator @c i in the range
511 * @p [first1,last1-(last2-first2)) such that
512 * @p predicate(*(i+N),*(first2+N)) is true for each @c N in the range
513 * @p [0,last2-first2), or @p last1 if no such iterator exists.
515 * Searches the range @p [first1,last1) for a sub-sequence that compares
516 * equal value-by-value with the sequence given by @p [first2,last2),
517 * using @p predicate to determine equality, and returns an iterator
518 * to the first element of the sub-sequence, or @p last1 if no such
521 * @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2)
523 template<typename _ForwardIter1
, typename _ForwardIter2
, typename _BinaryPred
>
525 search(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
526 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
527 _BinaryPred __predicate
)
529 // concept requirements
530 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>)
531 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>)
532 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPred
,
533 typename iterator_traits
<_ForwardIter1
>::value_type
,
534 typename iterator_traits
<_ForwardIter2
>::value_type
>)
536 // Test for empty ranges
537 if (__first1
== __last1
|| __first2
== __last2
)
540 // Test for a pattern of length 1.
541 _ForwardIter2
__tmp(__first2
);
543 if (__tmp
== __last2
) {
544 while (__first1
!= __last1
&& !__predicate(*__first1
, *__first2
))
551 _ForwardIter2 __p1
, __p
;
553 __p1
= __first2
; ++__p1
;
555 _ForwardIter1 __current
= __first1
;
557 while (__first1
!= __last1
) {
558 while (__first1
!= __last1
) {
559 if (__predicate(*__first1
, *__first2
))
563 while (__first1
!= __last1
&& !__predicate(*__first1
, *__first2
))
565 if (__first1
== __last1
)
569 __current
= __first1
;
570 if (++__current
== __last1
) return __last1
;
572 while (__predicate(*__current
, *__p
)) {
573 if (++__p
== __last2
)
575 if (++__current
== __last1
)
585 * @brief Search a sequence for a number of consecutive values.
586 * @param first A forward iterator.
587 * @param last A forward iterator.
588 * @param count The number of consecutive values.
589 * @param val The value to find.
590 * @return The first iterator @c i in the range @p [first,last-count)
591 * such that @c *(i+N) == @p val for each @c N in the range @p [0,count),
592 * or @p last if no such iterator exists.
594 * Searches the range @p [first,last) for @p count consecutive elements
597 template<typename _ForwardIter
, typename _Integer
, typename _Tp
>
599 search_n(_ForwardIter __first
, _ForwardIter __last
,
600 _Integer __count
, const _Tp
& __val
)
602 // concept requirements
603 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
604 __glibcpp_function_requires(_EqualityComparableConcept
<
605 typename iterator_traits
<_ForwardIter
>::value_type
>)
606 __glibcpp_function_requires(_EqualityComparableConcept
<_Tp
>)
611 __first
= find(__first
, __last
, __val
);
612 while (__first
!= __last
) {
613 _Integer __n
= __count
- 1;
614 _ForwardIter __i
= __first
;
616 while (__i
!= __last
&& __n
!= 0 && *__i
== __val
) {
623 __first
= find(__i
, __last
, __val
);
630 * @brief Search a sequence for a number of consecutive values using a
632 * @param first A forward iterator.
633 * @param last A forward iterator.
634 * @param count The number of consecutive values.
635 * @param val The value to find.
636 * @param binary_pred A binary predicate.
637 * @return The first iterator @c i in the range @p [first,last-count)
638 * such that @p binary_pred(*(i+N),val) is true for each @c N in the
639 * range @p [0,count), or @p last if no such iterator exists.
641 * Searches the range @p [first,last) for @p count consecutive elements
642 * for which the predicate returns true.
644 template<typename _ForwardIter
, typename _Integer
, typename _Tp
,
645 typename _BinaryPred
>
647 search_n(_ForwardIter __first
, _ForwardIter __last
,
648 _Integer __count
, const _Tp
& __val
,
649 _BinaryPred __binary_pred
)
651 // concept requirements
652 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
653 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPred
,
654 typename iterator_traits
<_ForwardIter
>::value_type
, _Tp
>)
659 while (__first
!= __last
) {
660 if (__binary_pred(*__first
, __val
))
664 while (__first
!= __last
) {
665 _Integer __n
= __count
- 1;
666 _ForwardIter __i
= __first
;
668 while (__i
!= __last
&& __n
!= 0 && __binary_pred(*__i
, __val
)) {
675 while (__i
!= __last
) {
676 if (__binary_pred(*__i
, __val
))
688 * @brief Swap the elements of two sequences.
689 * @param first1 A forward iterator.
690 * @param last1 A forward iterator.
691 * @param first2 A forward iterator.
692 * @return An iterator equal to @p first2+(last1-first1).
694 * Swaps each element in the range @p [first1,last1) with the
695 * corresponding element in the range @p [first2,(last1-first1)).
696 * The ranges must not overlap.
698 template<typename _ForwardIter1
, typename _ForwardIter2
>
700 swap_ranges(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
701 _ForwardIter2 __first2
)
703 // concept requirements
704 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter1
>)
705 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter2
>)
706 __glibcpp_function_requires(_ConvertibleConcept
<
707 typename iterator_traits
<_ForwardIter1
>::value_type
,
708 typename iterator_traits
<_ForwardIter2
>::value_type
>)
709 __glibcpp_function_requires(_ConvertibleConcept
<
710 typename iterator_traits
<_ForwardIter2
>::value_type
,
711 typename iterator_traits
<_ForwardIter1
>::value_type
>)
713 for ( ; __first1
!= __last1
; ++__first1
, ++__first2
)
714 iter_swap(__first1
, __first2
);
719 * @brief Perform an operation on a sequence.
720 * @param first An input iterator.
721 * @param last An input iterator.
722 * @param result An output iterator.
723 * @param unary_op A unary operator.
724 * @return An output iterator equal to @p result+(last-first).
726 * Applies the operator to each element in the input range and assigns
727 * the results to successive elements of the output sequence.
728 * Evaluates @p *(result+N)=unary_op(*(first+N)) for each @c N in the
729 * range @p [0,last-first).
731 * @p unary_op must not alter its argument.
733 template<typename _InputIter
, typename _OutputIter
, typename _UnaryOperation
>
735 transform(_InputIter __first
, _InputIter __last
,
736 _OutputIter __result
, _UnaryOperation __unary_op
)
738 // concept requirements
739 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
740 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
741 // "the type returned by a _UnaryOperation"
742 __typeof__(__unary_op(*__first
))>)
744 for ( ; __first
!= __last
; ++__first
, ++__result
)
745 *__result
= __unary_op(*__first
);
750 * @brief Perform an operation on corresponding elements of two sequences.
751 * @param first1 An input iterator.
752 * @param last1 An input iterator.
753 * @param first2 An input iterator.
754 * @param result An output iterator.
755 * @param binary_op A binary operator.
756 * @return An output iterator equal to @p result+(last-first).
758 * Applies the operator to the corresponding elements in the two
759 * input ranges and assigns the results to successive elements of the
761 * Evaluates @p *(result+N)=binary_op(*(first1+N),*(first2+N)) for each
762 * @c N in the range @p [0,last1-first1).
764 * @p binary_op must not alter either of its arguments.
766 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
767 typename _BinaryOperation
>
769 transform(_InputIter1 __first1
, _InputIter1 __last1
,
770 _InputIter2 __first2
, _OutputIter __result
,
771 _BinaryOperation __binary_op
)
773 // concept requirements
774 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
775 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
776 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
777 // "the type returned by a _BinaryOperation"
778 __typeof__(__binary_op(*__first1
,*__first2
))>)
780 for ( ; __first1
!= __last1
; ++__first1
, ++__first2
, ++__result
)
781 *__result
= __binary_op(*__first1
, *__first2
);
786 * @brief Replace each occurrence of one value in a sequence with another
788 * @param first A forward iterator.
789 * @param last A forward iterator.
790 * @param old_value The value to be replaced.
791 * @param new_value The replacement value.
792 * @return replace() returns no value.
794 * For each iterator @c i in the range @p [first,last) if @c *i ==
795 * @p old_value then the assignment @c *i = @p new_value is performed.
797 template<typename _ForwardIter
, typename _Tp
>
799 replace(_ForwardIter __first
, _ForwardIter __last
,
800 const _Tp
& __old_value
, const _Tp
& __new_value
)
802 // concept requirements
803 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
804 __glibcpp_function_requires(_EqualOpConcept
<
805 typename iterator_traits
<_ForwardIter
>::value_type
, _Tp
>)
806 __glibcpp_function_requires(_ConvertibleConcept
<_Tp
,
807 typename iterator_traits
<_ForwardIter
>::value_type
>)
809 for ( ; __first
!= __last
; ++__first
)
810 if (*__first
== __old_value
)
811 *__first
= __new_value
;
815 * @brief Replace each value in a sequence for which a predicate returns
816 * true with another value.
817 * @param first A forward iterator.
818 * @param last A forward iterator.
819 * @param pred A predicate.
820 * @param new_value The replacement value.
821 * @return replace_if() returns no value.
823 * For each iterator @c i in the range @p [first,last) if @p pred(*i)
824 * is true then the assignment @c *i = @p new_value is performed.
826 template<typename _ForwardIter
, typename _Predicate
, typename _Tp
>
828 replace_if(_ForwardIter __first
, _ForwardIter __last
,
829 _Predicate __pred
, const _Tp
& __new_value
)
831 // concept requirements
832 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
833 __glibcpp_function_requires(_ConvertibleConcept
<_Tp
,
834 typename iterator_traits
<_ForwardIter
>::value_type
>)
835 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
836 typename iterator_traits
<_ForwardIter
>::value_type
>)
838 for ( ; __first
!= __last
; ++__first
)
839 if (__pred(*__first
))
840 *__first
= __new_value
;
844 * @brief Copy a sequence, replacing each element of one value with another
846 * @param first An input iterator.
847 * @param last An input iterator.
848 * @param result An output iterator.
849 * @param old_value The value to be replaced.
850 * @param new_value The replacement value.
851 * @return The end of the output sequence, @p result+(last-first).
853 * Copies each element in the input range @p [first,last) to the
854 * output range @p [result,result+(last-first)) replacing elements
855 * equal to @p old_value with @p new_value.
857 template<typename _InputIter
, typename _OutputIter
, typename _Tp
>
859 replace_copy(_InputIter __first
, _InputIter __last
,
860 _OutputIter __result
,
861 const _Tp
& __old_value
, const _Tp
& __new_value
)
863 // concept requirements
864 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
865 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
866 typename iterator_traits
<_InputIter
>::value_type
>)
867 __glibcpp_function_requires(_EqualOpConcept
<
868 typename iterator_traits
<_InputIter
>::value_type
, _Tp
>)
870 for ( ; __first
!= __last
; ++__first
, ++__result
)
871 *__result
= *__first
== __old_value
? __new_value
: *__first
;
876 * @brief Copy a sequence, replacing each value for which a predicate
877 * returns true with another value.
878 * @param first An input iterator.
879 * @param last An input iterator.
880 * @param result An output iterator.
881 * @param pred A predicate.
882 * @param new_value The replacement value.
883 * @return The end of the output sequence, @p result+(last-first).
885 * Copies each element in the range @p [first,last) to the range
886 * @p [result,result+(last-first)) replacing elements for which
887 * @p pred returns true with @p new_value.
889 template<typename _InputIter
, typename _OutputIter
, typename _Predicate
,
892 replace_copy_if(_InputIter __first
, _InputIter __last
,
893 _OutputIter __result
,
894 _Predicate __pred
, const _Tp
& __new_value
)
896 // concept requirements
897 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
898 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
899 typename iterator_traits
<_InputIter
>::value_type
>)
900 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
901 typename iterator_traits
<_InputIter
>::value_type
>)
903 for ( ; __first
!= __last
; ++__first
, ++__result
)
904 *__result
= __pred(*__first
) ? __new_value
: *__first
;
909 * @brief Assign the result of a function object to each value in a
911 * @param first A forward iterator.
912 * @param last A forward iterator.
913 * @param gen A function object taking no arguments.
914 * @return generate() returns no value.
916 * Performs the assignment @c *i = @p gen() for each @c i in the range
919 template<typename _ForwardIter
, typename _Generator
>
921 generate(_ForwardIter __first
, _ForwardIter __last
, _Generator __gen
)
923 // concept requirements
924 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
925 __glibcpp_function_requires(_GeneratorConcept
<_Generator
,
926 typename iterator_traits
<_ForwardIter
>::value_type
>)
928 for ( ; __first
!= __last
; ++__first
)
933 * @brief Assign the result of a function object to each value in a
935 * @param first A forward iterator.
936 * @param n The length of the sequence.
937 * @param gen A function object taking no arguments.
938 * @return The end of the sequence, @p first+n
940 * Performs the assignment @c *i = @p gen() for each @c i in the range
941 * @p [first,first+n).
943 template<typename _OutputIter
, typename _Size
, typename _Generator
>
945 generate_n(_OutputIter __first
, _Size __n
, _Generator __gen
)
947 // concept requirements
948 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
949 // "the type returned by a _Generator"
952 for ( ; __n
> 0; --__n
, ++__first
)
958 * @brief Copy a sequence, removing elements of a given value.
959 * @param first An input iterator.
960 * @param last An input iterator.
961 * @param result An output iterator.
962 * @param value The value to be removed.
963 * @return An iterator designating the end of the resulting sequence.
965 * Copies each element in the range @p [first,last) not equal to @p value
966 * to the range beginning at @p result.
967 * remove_copy() is stable, so the relative order of elements that are
968 * copied is unchanged.
970 template<typename _InputIter
, typename _OutputIter
, typename _Tp
>
972 remove_copy(_InputIter __first
, _InputIter __last
,
973 _OutputIter __result
, const _Tp
& __value
)
975 // concept requirements
976 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
977 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
978 typename iterator_traits
<_InputIter
>::value_type
>)
979 __glibcpp_function_requires(_EqualOpConcept
<
980 typename iterator_traits
<_InputIter
>::value_type
, _Tp
>)
982 for ( ; __first
!= __last
; ++__first
)
983 if (!(*__first
== __value
)) {
984 *__result
= *__first
;
991 * @brief Copy a sequence, removing elements for which a predicate is true.
992 * @param first An input iterator.
993 * @param last An input iterator.
994 * @param result An output iterator.
995 * @param pred A predicate.
996 * @return An iterator designating the end of the resulting sequence.
998 * Copies each element in the range @p [first,last) for which
999 * @p pred returns true to the range beginning at @p result.
1001 * remove_copy_if() is stable, so the relative order of elements that are
1002 * copied is unchanged.
1004 template<typename _InputIter
, typename _OutputIter
, typename _Predicate
>
1006 remove_copy_if(_InputIter __first
, _InputIter __last
,
1007 _OutputIter __result
, _Predicate __pred
)
1009 // concept requirements
1010 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
1011 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1012 typename iterator_traits
<_InputIter
>::value_type
>)
1013 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1014 typename iterator_traits
<_InputIter
>::value_type
>)
1016 for ( ; __first
!= __last
; ++__first
)
1017 if (!__pred(*__first
)) {
1018 *__result
= *__first
;
1025 * @brief Remove elements from a sequence.
1026 * @param first An input iterator.
1027 * @param last An input iterator.
1028 * @param value The value to be removed.
1029 * @return An iterator designating the end of the resulting sequence.
1031 * All elements equal to @p value are removed from the range
1034 * remove() is stable, so the relative order of elements that are
1035 * not removed is unchanged.
1037 * Elements between the end of the resulting sequence and @p last
1038 * are still present, but their value is unspecified.
1040 template<typename _ForwardIter
, typename _Tp
>
1042 remove(_ForwardIter __first
, _ForwardIter __last
,
1045 // concept requirements
1046 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1047 __glibcpp_function_requires(_ConvertibleConcept
<_Tp
,
1048 typename iterator_traits
<_ForwardIter
>::value_type
>)
1049 __glibcpp_function_requires(_EqualOpConcept
<
1050 typename iterator_traits
<_ForwardIter
>::value_type
, _Tp
>)
1052 __first
= find(__first
, __last
, __value
);
1053 _ForwardIter __i
= __first
;
1054 return __first
== __last
? __first
1055 : remove_copy(++__i
, __last
, __first
, __value
);
1059 * @brief Remove elements from a sequence using a predicate.
1060 * @param first A forward iterator.
1061 * @param last A forward iterator.
1062 * @param pred A predicate.
1063 * @return An iterator designating the end of the resulting sequence.
1065 * All elements for which @p pred returns true are removed from the range
1068 * remove_if() is stable, so the relative order of elements that are
1069 * not removed is unchanged.
1071 * Elements between the end of the resulting sequence and @p last
1072 * are still present, but their value is unspecified.
1074 template<typename _ForwardIter
, typename _Predicate
>
1076 remove_if(_ForwardIter __first
, _ForwardIter __last
,
1079 // concept requirements
1080 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1081 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1082 typename iterator_traits
<_ForwardIter
>::value_type
>)
1084 __first
= find_if(__first
, __last
, __pred
);
1085 _ForwardIter __i
= __first
;
1086 return __first
== __last
? __first
1087 : remove_copy_if(++__i
, __last
, __first
, __pred
);
1092 * This is an uglified unique_copy(_InputIter, _InputIter, _OutputIter)
1093 * overloaded for output iterators.
1096 template<typename _InputIter
, typename _OutputIter
>
1098 __unique_copy(_InputIter __first
, _InputIter __last
,
1099 _OutputIter __result
,
1100 output_iterator_tag
)
1102 // concept requirements -- taken care of in dispatching function
1103 typename iterator_traits
<_InputIter
>::value_type __value
= *__first
;
1104 *__result
= __value
;
1105 while (++__first
!= __last
)
1106 if (!(__value
== *__first
)) {
1108 *++__result
= __value
;
1115 * This is an uglified unique_copy(_InputIter, _InputIter, _OutputIter)
1116 * overloaded for forward iterators.
1119 template<typename _InputIter
, typename _ForwardIter
>
1121 __unique_copy(_InputIter __first
, _InputIter __last
,
1122 _ForwardIter __result
,
1123 forward_iterator_tag
)
1125 // concept requirements -- taken care of in dispatching function
1126 *__result
= *__first
;
1127 while (++__first
!= __last
)
1128 if (!(*__result
== *__first
))
1129 *++__result
= *__first
;
1134 * @brief Copy a sequence, removing consecutive duplicate values.
1135 * @param first An input iterator.
1136 * @param last An input iterator.
1137 * @param result An output iterator.
1138 * @return An iterator designating the end of the resulting sequence.
1140 * Copies each element in the range @p [first,last) to the range
1141 * beginning at @p result, except that only the first element is copied
1142 * from groups of consecutive elements that compare equal.
1144 template<typename _InputIter
, typename _OutputIter
>
1146 unique_copy(_InputIter __first
, _InputIter __last
,
1147 _OutputIter __result
)
1149 // concept requirements
1150 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
1151 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1152 typename iterator_traits
<_InputIter
>::value_type
>)
1153 __glibcpp_function_requires(_EqualityComparableConcept
<
1154 typename iterator_traits
<_InputIter
>::value_type
>)
1156 typedef typename iterator_traits
<_OutputIter
>::iterator_category _IterType
;
1158 if (__first
== __last
) return __result
;
1159 return __unique_copy(__first
, __last
, __result
, _IterType());
1164 * This is an uglified
1165 * unique_copy(_InputIter, _InputIter, _OutputIter, _BinaryPredicate)
1166 * overloaded for output iterators.
1169 template<typename _InputIter
, typename _OutputIter
, typename _BinaryPredicate
>
1171 __unique_copy(_InputIter __first
, _InputIter __last
,
1172 _OutputIter __result
,
1173 _BinaryPredicate __binary_pred
,
1174 output_iterator_tag
)
1176 // concept requirements -- iterators already checked
1177 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
1178 typename iterator_traits
<_InputIter
>::value_type
,
1179 typename iterator_traits
<_InputIter
>::value_type
>)
1181 typename iterator_traits
<_InputIter
>::value_type __value
= *__first
;
1182 *__result
= __value
;
1183 while (++__first
!= __last
)
1184 if (!__binary_pred(__value
, *__first
)) {
1186 *++__result
= __value
;
1193 * This is an uglified
1194 * unique_copy(_InputIter, _InputIter, _OutputIter, _BinaryPredicate)
1195 * overloaded for forward iterators.
1198 template<typename _InputIter
, typename _ForwardIter
, typename _BinaryPredicate
>
1200 __unique_copy(_InputIter __first
, _InputIter __last
,
1201 _ForwardIter __result
,
1202 _BinaryPredicate __binary_pred
,
1203 forward_iterator_tag
)
1205 // concept requirements -- iterators already checked
1206 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
1207 typename iterator_traits
<_ForwardIter
>::value_type
,
1208 typename iterator_traits
<_InputIter
>::value_type
>)
1210 *__result
= *__first
;
1211 while (++__first
!= __last
)
1212 if (!__binary_pred(*__result
, *__first
)) *++__result
= *__first
;
1217 * @brief Copy a sequence, removing consecutive values using a predicate.
1218 * @param first An input iterator.
1219 * @param last An input iterator.
1220 * @param result An output iterator.
1221 * @param binary_pred A binary predicate.
1222 * @return An iterator designating the end of the resulting sequence.
1224 * Copies each element in the range @p [first,last) to the range
1225 * beginning at @p result, except that only the first element is copied
1226 * from groups of consecutive elements for which @p binary_pred returns
1228 * unique_copy() is stable, so the relative order of elements that are
1229 * copied is unchanged.
1231 template<typename _InputIter
, typename _OutputIter
, typename _BinaryPredicate
>
1233 unique_copy(_InputIter __first
, _InputIter __last
,
1234 _OutputIter __result
,
1235 _BinaryPredicate __binary_pred
)
1237 // concept requirements -- predicates checked later
1238 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
1239 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1240 typename iterator_traits
<_InputIter
>::value_type
>)
1242 typedef typename iterator_traits
<_OutputIter
>::iterator_category _IterType
;
1244 if (__first
== __last
) return __result
;
1245 return __unique_copy(__first
, __last
,
1246 __result
, __binary_pred
, _IterType());
1250 * @brief Remove consecutive duplicate values from a sequence.
1251 * @param first A forward iterator.
1252 * @param last A forward iterator.
1253 * @return An iterator designating the end of the resulting sequence.
1255 * Removes all but the first element from each group of consecutive
1256 * values that compare equal.
1257 * unique() is stable, so the relative order of elements that are
1258 * not removed is unchanged.
1259 * Elements between the end of the resulting sequence and @p last
1260 * are still present, but their value is unspecified.
1262 template<typename _ForwardIter
>
1264 unique(_ForwardIter __first
, _ForwardIter __last
)
1266 // concept requirements
1267 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1268 __glibcpp_function_requires(_EqualityComparableConcept
<
1269 typename iterator_traits
<_ForwardIter
>::value_type
>)
1271 __first
= adjacent_find(__first
, __last
);
1272 return unique_copy(__first
, __last
, __first
);
1276 * @brief Remove consecutive values from a sequence using a predicate.
1277 * @param first A forward iterator.
1278 * @param last A forward iterator.
1279 * @param binary_pred A binary predicate.
1280 * @return An iterator designating the end of the resulting sequence.
1282 * Removes all but the first element from each group of consecutive
1283 * values for which @p binary_pred returns true.
1284 * unique() is stable, so the relative order of elements that are
1285 * not removed is unchanged.
1286 * Elements between the end of the resulting sequence and @p last
1287 * are still present, but their value is unspecified.
1289 template<typename _ForwardIter
, typename _BinaryPredicate
>
1291 unique(_ForwardIter __first
, _ForwardIter __last
,
1292 _BinaryPredicate __binary_pred
)
1294 // concept requirements
1295 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1296 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
1297 typename iterator_traits
<_ForwardIter
>::value_type
,
1298 typename iterator_traits
<_ForwardIter
>::value_type
>)
1300 __first
= adjacent_find(__first
, __last
, __binary_pred
);
1301 return unique_copy(__first
, __last
, __first
, __binary_pred
);
1306 * This is an uglified reverse(_BidirectionalIter, _BidirectionalIter)
1307 * overloaded for bidirectional iterators.
1310 template<typename _BidirectionalIter
>
1312 __reverse(_BidirectionalIter __first
, _BidirectionalIter __last
,
1313 bidirectional_iterator_tag
)
1316 if (__first
== __last
|| __first
== --__last
)
1319 iter_swap(__first
++, __last
);
1324 * This is an uglified reverse(_BidirectionalIter, _BidirectionalIter)
1325 * overloaded for bidirectional iterators.
1328 template<typename _RandomAccessIter
>
1330 __reverse(_RandomAccessIter __first
, _RandomAccessIter __last
,
1331 random_access_iterator_tag
)
1333 while (__first
< __last
)
1334 iter_swap(__first
++, --__last
);
1338 * @brief Reverse a sequence.
1339 * @param first A bidirectional iterator.
1340 * @param last A bidirectional iterator.
1341 * @return reverse() returns no value.
1343 * Reverses the order of the elements in the range @p [first,last),
1344 * so that the first element becomes the last etc.
1345 * For every @c i such that @p 0<=i<=(last-first)/2), @p reverse()
1346 * swaps @p *(first+i) and @p *(last-(i+1))
1348 template<typename _BidirectionalIter
>
1350 reverse(_BidirectionalIter __first
, _BidirectionalIter __last
)
1352 // concept requirements
1353 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
1354 _BidirectionalIter
>)
1355 __reverse(__first
, __last
, __iterator_category(__first
));
1359 * @brief Copy a sequence, reversing its elements.
1360 * @param first A bidirectional iterator.
1361 * @param last A bidirectional iterator.
1362 * @param result An output iterator.
1363 * @return An iterator designating the end of the resulting sequence.
1365 * Copies the elements in the range @p [first,last) to the range
1366 * @p [result,result+(last-first)) such that the order of the
1367 * elements is reversed.
1368 * For every @c i such that @p 0<=i<=(last-first), @p reverse_copy()
1369 * performs the assignment @p *(result+(last-first)-i) = *(first+i).
1370 * The ranges @p [first,last) and @p [result,result+(last-first))
1373 template<typename _BidirectionalIter
, typename _OutputIter
>
1375 reverse_copy(_BidirectionalIter __first
, _BidirectionalIter __last
,
1376 _OutputIter __result
)
1378 // concept requirements
1379 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>)
1380 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1381 typename iterator_traits
<_BidirectionalIter
>::value_type
>)
1383 while (__first
!= __last
) {
1385 *__result
= *__last
;
1391 /// This is a helper function for the rotate algorithm specialized on RAIs.
1393 template<typename _EuclideanRingElement
>
1394 _EuclideanRingElement
1395 __gcd(_EuclideanRingElement __m
, _EuclideanRingElement __n
)
1398 _EuclideanRingElement __t
= __m
% __n
;
1405 template<typename _ForwardIter
>
1407 __rotate(_ForwardIter __first
,
1408 _ForwardIter __middle
,
1409 _ForwardIter __last
,
1410 forward_iterator_tag
)
1412 if ((__first
== __middle
) || (__last
== __middle
))
1415 _ForwardIter __first2
= __middle
;
1417 swap(*__first
++, *__first2
++);
1418 if (__first
== __middle
)
1419 __middle
= __first2
;
1420 } while (__first2
!= __last
);
1422 __first2
= __middle
;
1424 while (__first2
!= __last
) {
1425 swap(*__first
++, *__first2
++);
1426 if (__first
== __middle
)
1427 __middle
= __first2
;
1428 else if (__first2
== __last
)
1429 __first2
= __middle
;
1433 template<typename _BidirectionalIter
>
1435 __rotate(_BidirectionalIter __first
,
1436 _BidirectionalIter __middle
,
1437 _BidirectionalIter __last
,
1438 bidirectional_iterator_tag
)
1440 // concept requirements
1441 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
1442 _BidirectionalIter
>)
1444 if ((__first
== __middle
) || (__last
== __middle
))
1447 __reverse(__first
, __middle
, bidirectional_iterator_tag());
1448 __reverse(__middle
, __last
, bidirectional_iterator_tag());
1450 while (__first
!= __middle
&& __middle
!= __last
)
1451 swap (*__first
++, *--__last
);
1453 if (__first
== __middle
) {
1454 __reverse(__middle
, __last
, bidirectional_iterator_tag());
1457 __reverse(__first
, __middle
, bidirectional_iterator_tag());
1461 template<typename _RandomAccessIter
>
1463 __rotate(_RandomAccessIter __first
,
1464 _RandomAccessIter __middle
,
1465 _RandomAccessIter __last
,
1466 random_access_iterator_tag
)
1468 // concept requirements
1469 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1472 if ((__first
== __middle
) || (__last
== __middle
))
1475 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _Distance
;
1476 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1478 _Distance __n
= __last
- __first
;
1479 _Distance __k
= __middle
- __first
;
1480 _Distance __l
= __n
- __k
;
1483 swap_ranges(__first
, __middle
, __middle
);
1487 _Distance __d
= __gcd(__n
, __k
);
1489 for (_Distance __i
= 0; __i
< __d
; __i
++) {
1490 _ValueType __tmp
= *__first
;
1491 _RandomAccessIter __p
= __first
;
1494 for (_Distance __j
= 0; __j
< __l
/__d
; __j
++) {
1495 if (__p
> __first
+ __l
) {
1496 *__p
= *(__p
- __l
);
1500 *__p
= *(__p
+ __k
);
1506 for (_Distance __j
= 0; __j
< __k
/__d
- 1; __j
++) {
1507 if (__p
< __last
- __k
) {
1508 *__p
= *(__p
+ __k
);
1512 *__p
= * (__p
- __l
);
1522 template<typename _ForwardIter
>
1524 rotate(_ForwardIter __first
, _ForwardIter __middle
, _ForwardIter __last
)
1526 // concept requirements
1527 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1529 typedef typename iterator_traits
<_ForwardIter
>::iterator_category _IterType
;
1530 __rotate(__first
, __middle
, __last
, _IterType());
1533 template<typename _ForwardIter
, typename _OutputIter
>
1535 rotate_copy(_ForwardIter __first
, _ForwardIter __middle
,
1536 _ForwardIter __last
, _OutputIter __result
)
1538 // concept requirements
1539 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
1540 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
1541 typename iterator_traits
<_ForwardIter
>::value_type
>)
1543 return copy(__first
, __middle
, copy(__middle
, __last
, __result
));
1546 // Return a random number in the range [0, __n). This function encapsulates
1547 // whether we're using rand (part of the standard C library) or lrand48
1548 // (not standard, but a much better choice whenever it's available).
1549 template<typename _Distance
>
1551 __random_number(_Distance __n
)
1553 #ifdef _GLIBCPP_HAVE_DRAND48
1554 return lrand48() % __n
;
1556 return rand() % __n
;
1560 /// 25.2.11 random_shuffle().
1562 template<typename _RandomAccessIter
>
1564 random_shuffle(_RandomAccessIter __first
, _RandomAccessIter __last
)
1566 // concept requirements
1567 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1570 if (__first
== __last
) return;
1571 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1572 iter_swap(__i
, __first
+ __random_number((__i
- __first
) + 1));
1575 template<typename _RandomAccessIter
, typename _RandomNumberGenerator
>
1577 random_shuffle(_RandomAccessIter __first
, _RandomAccessIter __last
,
1578 _RandomNumberGenerator
& __rand
)
1580 // concept requirements
1581 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1584 if (__first
== __last
) return;
1585 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1586 iter_swap(__i
, __first
+ __rand((__i
- __first
) + 1));
1589 // partition, stable_partition, and their auxiliary functions
1591 template<typename _ForwardIter
, typename _Predicate
>
1593 __partition(_ForwardIter __first
, _ForwardIter __last
,
1595 forward_iterator_tag
)
1597 if (__first
== __last
) return __first
;
1599 while (__pred(*__first
))
1600 if (++__first
== __last
) return __first
;
1602 _ForwardIter __next
= __first
;
1604 while (++__next
!= __last
)
1605 if (__pred(*__next
)) {
1606 swap(*__first
, *__next
);
1613 template<typename _BidirectionalIter
, typename _Predicate
>
1615 __partition(_BidirectionalIter __first
, _BidirectionalIter __last
,
1617 bidirectional_iterator_tag
)
1621 if (__first
== __last
)
1623 else if (__pred(*__first
))
1629 if (__first
== __last
)
1631 else if (!__pred(*__last
))
1635 iter_swap(__first
, __last
);
1640 template<typename _ForwardIter
, typename _Predicate
>
1642 partition(_ForwardIter __first
, _ForwardIter __last
,
1645 // concept requirements
1646 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1647 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1648 typename iterator_traits
<_ForwardIter
>::value_type
>)
1650 return __partition(__first
, __last
, __pred
, __iterator_category(__first
));
1654 template<typename _ForwardIter
, typename _Predicate
, typename _Distance
>
1656 __inplace_stable_partition(_ForwardIter __first
, _ForwardIter __last
,
1657 _Predicate __pred
, _Distance __len
)
1660 return __pred(*__first
) ? __last
: __first
;
1661 _ForwardIter __middle
= __first
;
1662 advance(__middle
, __len
/ 2);
1663 _ForwardIter __begin
= __inplace_stable_partition(__first
, __middle
,
1666 _ForwardIter __end
= __inplace_stable_partition(__middle
, __last
,
1669 rotate(__begin
, __middle
, __end
);
1670 advance(__begin
, distance(__middle
, __end
));
1674 template<typename _ForwardIter
, typename _Pointer
, typename _Predicate
,
1677 __stable_partition_adaptive(_ForwardIter __first
, _ForwardIter __last
,
1678 _Predicate __pred
, _Distance __len
,
1680 _Distance __buffer_size
)
1682 if (__len
<= __buffer_size
) {
1683 _ForwardIter __result1
= __first
;
1684 _Pointer __result2
= __buffer
;
1685 for ( ; __first
!= __last
; ++__first
)
1686 if (__pred(*__first
)) {
1687 *__result1
= *__first
;
1691 *__result2
= *__first
;
1694 copy(__buffer
, __result2
, __result1
);
1698 _ForwardIter __middle
= __first
;
1699 advance(__middle
, __len
/ 2);
1700 _ForwardIter __begin
= __stable_partition_adaptive(__first
, __middle
,
1703 __buffer
, __buffer_size
);
1704 _ForwardIter __end
= __stable_partition_adaptive( __middle
, __last
,
1707 __buffer
, __buffer_size
);
1708 rotate(__begin
, __middle
, __end
);
1709 advance(__begin
, distance(__middle
, __end
));
1714 template<typename _ForwardIter
, typename _Predicate
>
1716 stable_partition(_ForwardIter __first
, _ForwardIter __last
,
1719 // concept requirements
1720 __glibcpp_function_requires(_Mutable_ForwardIteratorConcept
<_ForwardIter
>)
1721 __glibcpp_function_requires(_UnaryPredicateConcept
<_Predicate
,
1722 typename iterator_traits
<_ForwardIter
>::value_type
>)
1724 if (__first
== __last
)
1728 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
1729 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
1731 _Temporary_buffer
<_ForwardIter
, _ValueType
> __buf(__first
, __last
);
1732 if (__buf
.size() > 0)
1733 return __stable_partition_adaptive(__first
, __last
, __pred
,
1734 _DistanceType(__buf
.requested_size()),
1735 __buf
.begin(), __buf
.size());
1737 return __inplace_stable_partition(__first
, __last
, __pred
,
1738 _DistanceType(__buf
.requested_size()));
1742 template<typename _RandomAccessIter
, typename _Tp
>
1744 __unguarded_partition(_RandomAccessIter __first
, _RandomAccessIter __last
,
1748 while (*__first
< __pivot
)
1751 while (__pivot
< *__last
)
1753 if (!(__first
< __last
))
1755 iter_swap(__first
, __last
);
1760 template<typename _RandomAccessIter
, typename _Tp
, typename _Compare
>
1762 __unguarded_partition(_RandomAccessIter __first
, _RandomAccessIter __last
,
1763 _Tp __pivot
, _Compare __comp
)
1766 while (__comp(*__first
, __pivot
))
1769 while (__comp(__pivot
, *__last
))
1771 if (!(__first
< __last
))
1773 iter_swap(__first
, __last
);
1778 const int __stl_threshold
= 16;
1780 // sort() and its auxiliary functions.
1782 template<typename _RandomAccessIter
, typename _Tp
>
1784 __unguarded_linear_insert(_RandomAccessIter __last
, _Tp __val
)
1786 _RandomAccessIter __next
= __last
;
1788 while (__val
< *__next
) {
1796 template<typename _RandomAccessIter
, typename _Tp
, typename _Compare
>
1798 __unguarded_linear_insert(_RandomAccessIter __last
, _Tp __val
, _Compare __comp
)
1800 _RandomAccessIter __next
= __last
;
1802 while (__comp(__val
, *__next
)) {
1810 template<typename _RandomAccessIter
>
1812 __insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1814 if (__first
== __last
) return;
1816 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1818 typename iterator_traits
<_RandomAccessIter
>::value_type __val
= *__i
;
1819 if (__val
< *__first
) {
1820 copy_backward(__first
, __i
, __i
+ 1);
1824 __unguarded_linear_insert(__i
, __val
);
1828 template<typename _RandomAccessIter
, typename _Compare
>
1830 __insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
1833 if (__first
== __last
) return;
1835 for (_RandomAccessIter __i
= __first
+ 1; __i
!= __last
; ++__i
)
1837 typename iterator_traits
<_RandomAccessIter
>::value_type __val
= *__i
;
1838 if (__comp(__val
, *__first
)) {
1839 copy_backward(__first
, __i
, __i
+ 1);
1843 __unguarded_linear_insert(__i
, __val
, __comp
);
1847 template<typename _RandomAccessIter
>
1849 __unguarded_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1851 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1853 for (_RandomAccessIter __i
= __first
; __i
!= __last
; ++__i
)
1854 __unguarded_linear_insert(__i
, _ValueType(*__i
));
1857 template<typename _RandomAccessIter
, typename _Compare
>
1859 __unguarded_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
1862 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1864 for (_RandomAccessIter __i
= __first
; __i
!= __last
; ++__i
)
1865 __unguarded_linear_insert(__i
, _ValueType(*__i
), __comp
);
1868 template<typename _RandomAccessIter
>
1870 __final_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1872 if (__last
- __first
> __stl_threshold
) {
1873 __insertion_sort(__first
, __first
+ __stl_threshold
);
1874 __unguarded_insertion_sort(__first
+ __stl_threshold
, __last
);
1877 __insertion_sort(__first
, __last
);
1880 template<typename _RandomAccessIter
, typename _Compare
>
1882 __final_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
1885 if (__last
- __first
> __stl_threshold
) {
1886 __insertion_sort(__first
, __first
+ __stl_threshold
, __comp
);
1887 __unguarded_insertion_sort(__first
+ __stl_threshold
, __last
, __comp
);
1890 __insertion_sort(__first
, __last
, __comp
);
1893 template<typename _Size
>
1898 for (__k
= 0; __n
!= 1; __n
>>= 1) ++__k
;
1902 template<typename _RandomAccessIter
, typename _Size
>
1904 __introsort_loop(_RandomAccessIter __first
, _RandomAccessIter __last
,
1905 _Size __depth_limit
)
1907 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1909 while (__last
- __first
> __stl_threshold
) {
1910 if (__depth_limit
== 0) {
1911 partial_sort(__first
, __last
, __last
);
1915 _RandomAccessIter __cut
=
1916 __unguarded_partition(__first
, __last
,
1917 _ValueType(__median(*__first
,
1918 *(__first
+ (__last
- __first
)/2),
1920 __introsort_loop(__cut
, __last
, __depth_limit
);
1925 template<typename _RandomAccessIter
, typename _Size
, typename _Compare
>
1927 __introsort_loop(_RandomAccessIter __first
, _RandomAccessIter __last
,
1928 _Size __depth_limit
, _Compare __comp
)
1930 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1932 while (__last
- __first
> __stl_threshold
) {
1933 if (__depth_limit
== 0) {
1934 partial_sort(__first
, __last
, __last
, __comp
);
1938 _RandomAccessIter __cut
=
1939 __unguarded_partition(__first
, __last
,
1940 _ValueType(__median(*__first
,
1941 *(__first
+ (__last
- __first
)/2),
1942 *(__last
- 1), __comp
)),
1944 __introsort_loop(__cut
, __last
, __depth_limit
, __comp
);
1949 template<typename _RandomAccessIter
>
1951 sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1953 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1955 // concept requirements
1956 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1958 __glibcpp_function_requires(_LessThanComparableConcept
<_ValueType
>)
1960 if (__first
!= __last
) {
1961 __introsort_loop(__first
, __last
, __lg(__last
- __first
) * 2);
1962 __final_insertion_sort(__first
, __last
);
1966 template<typename _RandomAccessIter
, typename _Compare
>
1968 sort(_RandomAccessIter __first
, _RandomAccessIter __last
, _Compare __comp
)
1970 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
1972 // concept requirements
1973 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
1975 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _ValueType
, _ValueType
>)
1977 if (__first
!= __last
) {
1978 __introsort_loop(__first
, __last
, __lg(__last
- __first
) * 2, __comp
);
1979 __final_insertion_sort(__first
, __last
, __comp
);
1983 // stable_sort() and its auxiliary functions.
1985 template<typename _RandomAccessIter
>
1987 __inplace_stable_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
1989 if (__last
- __first
< 15) {
1990 __insertion_sort(__first
, __last
);
1993 _RandomAccessIter __middle
= __first
+ (__last
- __first
) / 2;
1994 __inplace_stable_sort(__first
, __middle
);
1995 __inplace_stable_sort(__middle
, __last
);
1996 __merge_without_buffer(__first
, __middle
, __last
,
2001 template<typename _RandomAccessIter
, typename _Compare
>
2003 __inplace_stable_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
2006 if (__last
- __first
< 15) {
2007 __insertion_sort(__first
, __last
, __comp
);
2010 _RandomAccessIter __middle
= __first
+ (__last
- __first
) / 2;
2011 __inplace_stable_sort(__first
, __middle
, __comp
);
2012 __inplace_stable_sort(__middle
, __last
, __comp
);
2013 __merge_without_buffer(__first
, __middle
, __last
,
2019 template<typename _RandomAccessIter1
, typename _RandomAccessIter2
,
2022 __merge_sort_loop(_RandomAccessIter1 __first
, _RandomAccessIter1 __last
,
2023 _RandomAccessIter2 __result
, _Distance __step_size
)
2025 _Distance __two_step
= 2 * __step_size
;
2027 while (__last
- __first
>= __two_step
) {
2028 __result
= merge(__first
, __first
+ __step_size
,
2029 __first
+ __step_size
, __first
+ __two_step
,
2031 __first
+= __two_step
;
2034 __step_size
= min(_Distance(__last
- __first
), __step_size
);
2035 merge(__first
, __first
+ __step_size
, __first
+ __step_size
, __last
,
2039 template<typename _RandomAccessIter1
, typename _RandomAccessIter2
,
2040 typename _Distance
, typename _Compare
>
2042 __merge_sort_loop(_RandomAccessIter1 __first
, _RandomAccessIter1 __last
,
2043 _RandomAccessIter2 __result
, _Distance __step_size
,
2046 _Distance __two_step
= 2 * __step_size
;
2048 while (__last
- __first
>= __two_step
) {
2049 __result
= merge(__first
, __first
+ __step_size
,
2050 __first
+ __step_size
, __first
+ __two_step
,
2053 __first
+= __two_step
;
2055 __step_size
= min(_Distance(__last
- __first
), __step_size
);
2057 merge(__first
, __first
+ __step_size
,
2058 __first
+ __step_size
, __last
,
2063 const int __stl_chunk_size
= 7;
2065 template<typename _RandomAccessIter
, typename _Distance
>
2067 __chunk_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
2068 _Distance __chunk_size
)
2070 while (__last
- __first
>= __chunk_size
) {
2071 __insertion_sort(__first
, __first
+ __chunk_size
);
2072 __first
+= __chunk_size
;
2074 __insertion_sort(__first
, __last
);
2077 template<typename _RandomAccessIter
, typename _Distance
, typename _Compare
>
2079 __chunk_insertion_sort(_RandomAccessIter __first
, _RandomAccessIter __last
,
2080 _Distance __chunk_size
, _Compare __comp
)
2082 while (__last
- __first
>= __chunk_size
) {
2083 __insertion_sort(__first
, __first
+ __chunk_size
, __comp
);
2084 __first
+= __chunk_size
;
2086 __insertion_sort(__first
, __last
, __comp
);
2089 template<typename _RandomAccessIter
, typename _Pointer
>
2091 __merge_sort_with_buffer(_RandomAccessIter __first
, _RandomAccessIter __last
,
2094 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _Distance
;
2096 _Distance __len
= __last
- __first
;
2097 _Pointer __buffer_last
= __buffer
+ __len
;
2099 _Distance __step_size
= __stl_chunk_size
;
2100 __chunk_insertion_sort(__first
, __last
, __step_size
);
2102 while (__step_size
< __len
) {
2103 __merge_sort_loop(__first
, __last
, __buffer
, __step_size
);
2105 __merge_sort_loop(__buffer
, __buffer_last
, __first
, __step_size
);
2110 template<typename _RandomAccessIter
, typename _Pointer
, typename _Compare
>
2112 __merge_sort_with_buffer(_RandomAccessIter __first
, _RandomAccessIter __last
,
2113 _Pointer __buffer
, _Compare __comp
)
2115 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _Distance
;
2117 _Distance __len
= __last
- __first
;
2118 _Pointer __buffer_last
= __buffer
+ __len
;
2120 _Distance __step_size
= __stl_chunk_size
;
2121 __chunk_insertion_sort(__first
, __last
, __step_size
, __comp
);
2123 while (__step_size
< __len
) {
2124 __merge_sort_loop(__first
, __last
, __buffer
, __step_size
, __comp
);
2126 __merge_sort_loop(__buffer
, __buffer_last
, __first
, __step_size
, __comp
);
2131 template<typename _RandomAccessIter
, typename _Pointer
, typename _Distance
>
2133 __stable_sort_adaptive(_RandomAccessIter __first
, _RandomAccessIter __last
,
2134 _Pointer __buffer
, _Distance __buffer_size
)
2136 _Distance __len
= (__last
- __first
+ 1) / 2;
2137 _RandomAccessIter __middle
= __first
+ __len
;
2138 if (__len
> __buffer_size
) {
2139 __stable_sort_adaptive(__first
, __middle
, __buffer
, __buffer_size
);
2140 __stable_sort_adaptive(__middle
, __last
, __buffer
, __buffer_size
);
2143 __merge_sort_with_buffer(__first
, __middle
, __buffer
);
2144 __merge_sort_with_buffer(__middle
, __last
, __buffer
);
2146 __merge_adaptive(__first
, __middle
, __last
, _Distance(__middle
- __first
),
2147 _Distance(__last
- __middle
), __buffer
, __buffer_size
);
2150 template<typename _RandomAccessIter
, typename _Pointer
, typename _Distance
,
2153 __stable_sort_adaptive(_RandomAccessIter __first
, _RandomAccessIter __last
,
2154 _Pointer __buffer
, _Distance __buffer_size
,
2157 _Distance __len
= (__last
- __first
+ 1) / 2;
2158 _RandomAccessIter __middle
= __first
+ __len
;
2159 if (__len
> __buffer_size
) {
2160 __stable_sort_adaptive(__first
, __middle
, __buffer
, __buffer_size
,
2162 __stable_sort_adaptive(__middle
, __last
, __buffer
, __buffer_size
,
2166 __merge_sort_with_buffer(__first
, __middle
, __buffer
, __comp
);
2167 __merge_sort_with_buffer(__middle
, __last
, __buffer
, __comp
);
2169 __merge_adaptive(__first
, __middle
, __last
, _Distance(__middle
- __first
),
2170 _Distance(__last
- __middle
), __buffer
, __buffer_size
,
2174 template<typename _RandomAccessIter
>
2176 stable_sort(_RandomAccessIter __first
, _RandomAccessIter __last
)
2178 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2179 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _DistanceType
;
2181 // concept requirements
2182 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2184 __glibcpp_function_requires(_LessThanComparableConcept
<_ValueType
>)
2186 _Temporary_buffer
<_RandomAccessIter
, _ValueType
> buf(__first
, __last
);
2187 if (buf
.begin() == 0)
2188 __inplace_stable_sort(__first
, __last
);
2190 __stable_sort_adaptive(__first
, __last
, buf
.begin(), _DistanceType(buf
.size()));
2193 template<typename _RandomAccessIter
, typename _Compare
>
2195 stable_sort(_RandomAccessIter __first
, _RandomAccessIter __last
, _Compare __comp
)
2197 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2198 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _DistanceType
;
2200 // concept requirements
2201 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2203 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2204 _ValueType
, _ValueType
>)
2206 _Temporary_buffer
<_RandomAccessIter
, _ValueType
> buf(__first
, __last
);
2207 if (buf
.begin() == 0)
2208 __inplace_stable_sort(__first
, __last
, __comp
);
2210 __stable_sort_adaptive(__first
, __last
, buf
.begin(), _DistanceType(buf
.size()),
2214 template<typename _RandomAccessIter
>
2216 partial_sort(_RandomAccessIter __first
,
2217 _RandomAccessIter __middle
,
2218 _RandomAccessIter __last
)
2220 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2222 // concept requirements
2223 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2225 __glibcpp_function_requires(_LessThanComparableConcept
<_ValueType
>)
2227 make_heap(__first
, __middle
);
2228 for (_RandomAccessIter __i
= __middle
; __i
< __last
; ++__i
)
2229 if (*__i
< *__first
)
2230 __pop_heap(__first
, __middle
, __i
, _ValueType(*__i
));
2231 sort_heap(__first
, __middle
);
2234 template<typename _RandomAccessIter
, typename _Compare
>
2236 partial_sort(_RandomAccessIter __first
,
2237 _RandomAccessIter __middle
,
2238 _RandomAccessIter __last
,
2241 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2243 // concept requirements
2244 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<
2246 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2247 _ValueType
, _ValueType
>)
2249 make_heap(__first
, __middle
, __comp
);
2250 for (_RandomAccessIter __i
= __middle
; __i
< __last
; ++__i
)
2251 if (__comp(*__i
, *__first
))
2252 __pop_heap(__first
, __middle
, __i
, _ValueType(*__i
), __comp
);
2253 sort_heap(__first
, __middle
, __comp
);
2256 template<typename _InputIter
, typename _RandomAccessIter
>
2258 partial_sort_copy(_InputIter __first
, _InputIter __last
,
2259 _RandomAccessIter __result_first
,
2260 _RandomAccessIter __result_last
)
2262 typedef typename iterator_traits
<_InputIter
>::value_type _InputValueType
;
2263 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _OutputValueType
;
2264 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _DistanceType
;
2266 // concept requirements
2267 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
2268 __glibcpp_function_requires(_ConvertibleConcept
<_InputValueType
, _OutputValueType
>)
2269 __glibcpp_function_requires(_LessThanComparableConcept
<_OutputValueType
>)
2270 __glibcpp_function_requires(_LessThanComparableConcept
<_InputValueType
>)
2272 if (__result_first
== __result_last
) return __result_last
;
2273 _RandomAccessIter __result_real_last
= __result_first
;
2274 while(__first
!= __last
&& __result_real_last
!= __result_last
) {
2275 *__result_real_last
= *__first
;
2276 ++__result_real_last
;
2279 make_heap(__result_first
, __result_real_last
);
2280 while (__first
!= __last
) {
2281 if (*__first
< *__result_first
)
2282 __adjust_heap(__result_first
, _DistanceType(0),
2283 _DistanceType(__result_real_last
- __result_first
),
2284 _InputValueType(*__first
));
2287 sort_heap(__result_first
, __result_real_last
);
2288 return __result_real_last
;
2291 template<typename _InputIter
, typename _RandomAccessIter
, typename _Compare
>
2293 partial_sort_copy(_InputIter __first
, _InputIter __last
,
2294 _RandomAccessIter __result_first
,
2295 _RandomAccessIter __result_last
,
2298 typedef typename iterator_traits
<_InputIter
>::value_type _InputValueType
;
2299 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _OutputValueType
;
2300 typedef typename iterator_traits
<_RandomAccessIter
>::difference_type _DistanceType
;
2302 // concept requirements
2303 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
2304 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<_RandomAccessIter
>)
2305 __glibcpp_function_requires(_ConvertibleConcept
<_InputValueType
, _OutputValueType
>)
2306 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2307 _OutputValueType
, _OutputValueType
>)
2309 if (__result_first
== __result_last
) return __result_last
;
2310 _RandomAccessIter __result_real_last
= __result_first
;
2311 while(__first
!= __last
&& __result_real_last
!= __result_last
) {
2312 *__result_real_last
= *__first
;
2313 ++__result_real_last
;
2316 make_heap(__result_first
, __result_real_last
, __comp
);
2317 while (__first
!= __last
) {
2318 if (__comp(*__first
, *__result_first
))
2319 __adjust_heap(__result_first
, _DistanceType(0),
2320 _DistanceType(__result_real_last
- __result_first
),
2321 _InputValueType(*__first
),
2325 sort_heap(__result_first
, __result_real_last
, __comp
);
2326 return __result_real_last
;
2329 template<typename _RandomAccessIter
>
2331 nth_element(_RandomAccessIter __first
,
2332 _RandomAccessIter __nth
,
2333 _RandomAccessIter __last
)
2335 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2337 // concept requirements
2338 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<_RandomAccessIter
>)
2339 __glibcpp_function_requires(_LessThanComparableConcept
<_ValueType
>)
2341 while (__last
- __first
> 3) {
2342 _RandomAccessIter __cut
=
2343 __unguarded_partition(__first
, __last
,
2344 _ValueType(__median(*__first
,
2345 *(__first
+ (__last
- __first
)/2),
2352 __insertion_sort(__first
, __last
);
2355 template<typename _RandomAccessIter
, typename _Compare
>
2357 nth_element(_RandomAccessIter __first
,
2358 _RandomAccessIter __nth
,
2359 _RandomAccessIter __last
,
2362 typedef typename iterator_traits
<_RandomAccessIter
>::value_type _ValueType
;
2364 // concept requirements
2365 __glibcpp_function_requires(_Mutable_RandomAccessIteratorConcept
<_RandomAccessIter
>)
2366 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2367 _ValueType
, _ValueType
>)
2369 while (__last
- __first
> 3) {
2370 _RandomAccessIter __cut
=
2371 __unguarded_partition(__first
, __last
,
2372 _ValueType(__median(*__first
,
2373 *(__first
+ (__last
- __first
)/2),
2382 __insertion_sort(__first
, __last
, __comp
);
2386 // Binary search (lower_bound, upper_bound, equal_range, binary_search).
2388 template<typename _ForwardIter
, typename _Tp
>
2390 lower_bound(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
)
2392 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2393 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2395 // concept requirements
2396 // Note that these are slightly stricter than those of the 4-argument
2397 // version, defined next. The difference is in the strictness of the
2398 // comparison operations... so for looser checking, define your own
2399 // comparison function, as was intended.
2400 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2401 __glibcpp_function_requires(_SameTypeConcept
<_Tp
, _ValueType
>)
2402 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>)
2404 _DistanceType __len
= distance(__first
, __last
);
2405 _DistanceType __half
;
2406 _ForwardIter __middle
;
2409 __half
= __len
>> 1;
2411 advance(__middle
, __half
);
2412 if (*__middle
< __val
) {
2415 __len
= __len
- __half
- 1;
2423 template<typename _ForwardIter
, typename _Tp
, typename _Compare
>
2425 lower_bound(_ForwardIter __first
, _ForwardIter __last
,
2426 const _Tp
& __val
, _Compare __comp
)
2428 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2429 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2431 // concept requirements
2432 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2433 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _ValueType
, _Tp
>)
2435 _DistanceType __len
= distance(__first
, __last
);
2436 _DistanceType __half
;
2437 _ForwardIter __middle
;
2440 __half
= __len
>> 1;
2442 advance(__middle
, __half
);
2443 if (__comp(*__middle
, __val
)) {
2446 __len
= __len
- __half
- 1;
2454 template<typename _ForwardIter
, typename _Tp
>
2456 upper_bound(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
)
2458 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2459 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2461 // concept requirements
2462 // See comments on lower_bound.
2463 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2464 __glibcpp_function_requires(_SameTypeConcept
<_Tp
, _ValueType
>)
2465 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>)
2467 _DistanceType __len
= distance(__first
, __last
);
2468 _DistanceType __half
;
2469 _ForwardIter __middle
;
2472 __half
= __len
>> 1;
2474 advance(__middle
, __half
);
2475 if (__val
< *__middle
)
2480 __len
= __len
- __half
- 1;
2486 template<typename _ForwardIter
, typename _Tp
, typename _Compare
>
2488 upper_bound(_ForwardIter __first
, _ForwardIter __last
,
2489 const _Tp
& __val
, _Compare __comp
)
2491 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2492 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2494 // concept requirements
2495 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2496 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _ValueType
>)
2498 _DistanceType __len
= distance(__first
, __last
);
2499 _DistanceType __half
;
2500 _ForwardIter __middle
;
2503 __half
= __len
>> 1;
2505 advance(__middle
, __half
);
2506 if (__comp(__val
, *__middle
))
2511 __len
= __len
- __half
- 1;
2517 template<typename _ForwardIter
, typename _Tp
>
2518 pair
<_ForwardIter
, _ForwardIter
>
2519 equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
)
2521 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2522 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2524 // concept requirements
2525 // See comments on lower_bound.
2526 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2527 __glibcpp_function_requires(_SameTypeConcept
<_Tp
, _ValueType
>)
2528 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>)
2530 _DistanceType __len
= distance(__first
, __last
);
2531 _DistanceType __half
;
2532 _ForwardIter __middle
, __left
, __right
;
2535 __half
= __len
>> 1;
2537 advance(__middle
, __half
);
2538 if (*__middle
< __val
) {
2541 __len
= __len
- __half
- 1;
2543 else if (__val
< *__middle
)
2546 __left
= lower_bound(__first
, __middle
, __val
);
2547 advance(__first
, __len
);
2548 __right
= upper_bound(++__middle
, __first
, __val
);
2549 return pair
<_ForwardIter
, _ForwardIter
>(__left
, __right
);
2552 return pair
<_ForwardIter
, _ForwardIter
>(__first
, __first
);
2555 template<typename _ForwardIter
, typename _Tp
, typename _Compare
>
2556 pair
<_ForwardIter
, _ForwardIter
>
2557 equal_range(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __val
,
2560 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
2561 typedef typename iterator_traits
<_ForwardIter
>::difference_type _DistanceType
;
2563 // concept requirements
2564 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2565 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _ValueType
, _Tp
>)
2566 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
, _ValueType
>)
2568 _DistanceType __len
= distance(__first
, __last
);
2569 _DistanceType __half
;
2570 _ForwardIter __middle
, __left
, __right
;
2573 __half
= __len
>> 1;
2575 advance(__middle
, __half
);
2576 if (__comp(*__middle
, __val
)) {
2579 __len
= __len
- __half
- 1;
2581 else if (__comp(__val
, *__middle
))
2584 __left
= lower_bound(__first
, __middle
, __val
, __comp
);
2585 advance(__first
, __len
);
2586 __right
= upper_bound(++__middle
, __first
, __val
, __comp
);
2587 return pair
<_ForwardIter
, _ForwardIter
>(__left
, __right
);
2590 return pair
<_ForwardIter
, _ForwardIter
>(__first
, __first
);
2593 template<typename _ForwardIter
, typename _Tp
>
2595 binary_search(_ForwardIter __first
, _ForwardIter __last
,
2598 // concept requirements
2599 // See comments on lower_bound.
2600 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2601 __glibcpp_function_requires(_SameTypeConcept
<_Tp
,
2602 typename iterator_traits
<_ForwardIter
>::value_type
>)
2603 __glibcpp_function_requires(_LessThanComparableConcept
<_Tp
>)
2605 _ForwardIter __i
= lower_bound(__first
, __last
, __val
);
2606 return __i
!= __last
&& !(__val
< *__i
);
2609 template<typename _ForwardIter
, typename _Tp
, typename _Compare
>
2611 binary_search(_ForwardIter __first
, _ForwardIter __last
,
2612 const _Tp
& __val
, _Compare __comp
)
2614 // concept requirements
2615 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
2616 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2617 typename iterator_traits
<_ForwardIter
>::value_type
, _Tp
>)
2618 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
, _Tp
,
2619 typename iterator_traits
<_ForwardIter
>::value_type
>)
2621 _ForwardIter __i
= lower_bound(__first
, __last
, __val
, __comp
);
2622 return __i
!= __last
&& !__comp(__val
, *__i
);
2625 // merge, with and without an explicitly supplied comparison function.
2627 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
>
2629 merge(_InputIter1 __first1
, _InputIter1 __last1
,
2630 _InputIter2 __first2
, _InputIter2 __last2
,
2631 _OutputIter __result
)
2633 // concept requirements
2634 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
2635 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
2636 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2637 typename iterator_traits
<_InputIter1
>::value_type
>)
2638 __glibcpp_function_requires(_SameTypeConcept
<
2639 typename iterator_traits
<_InputIter1
>::value_type
,
2640 typename iterator_traits
<_InputIter2
>::value_type
>)
2641 __glibcpp_function_requires(_LessThanComparableConcept
<
2642 typename iterator_traits
<_InputIter1
>::value_type
>)
2644 while (__first1
!= __last1
&& __first2
!= __last2
) {
2645 if (*__first2
< *__first1
) {
2646 *__result
= *__first2
;
2650 *__result
= *__first1
;
2655 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2658 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
2661 merge(_InputIter1 __first1
, _InputIter1 __last1
,
2662 _InputIter2 __first2
, _InputIter2 __last2
,
2663 _OutputIter __result
, _Compare __comp
)
2665 // concept requirements
2666 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
2667 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
2668 __glibcpp_function_requires(_SameTypeConcept
<
2669 typename iterator_traits
<_InputIter1
>::value_type
,
2670 typename iterator_traits
<_InputIter2
>::value_type
>)
2671 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
2672 typename iterator_traits
<_InputIter1
>::value_type
>)
2673 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2674 typename iterator_traits
<_InputIter1
>::value_type
,
2675 typename iterator_traits
<_InputIter2
>::value_type
>)
2677 while (__first1
!= __last1
&& __first2
!= __last2
) {
2678 if (__comp(*__first2
, *__first1
)) {
2679 *__result
= *__first2
;
2683 *__result
= *__first1
;
2688 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
2691 // inplace_merge and its auxiliary functions.
2693 template<typename _BidirectionalIter
, typename _Distance
>
2695 __merge_without_buffer(_BidirectionalIter __first
,
2696 _BidirectionalIter __middle
,
2697 _BidirectionalIter __last
,
2698 _Distance __len1
, _Distance __len2
)
2700 if (__len1
== 0 || __len2
== 0)
2702 if (__len1
+ __len2
== 2) {
2703 if (*__middle
< *__first
)
2704 iter_swap(__first
, __middle
);
2707 _BidirectionalIter __first_cut
= __first
;
2708 _BidirectionalIter __second_cut
= __middle
;
2709 _Distance __len11
= 0;
2710 _Distance __len22
= 0;
2711 if (__len1
> __len2
) {
2712 __len11
= __len1
/ 2;
2713 advance(__first_cut
, __len11
);
2714 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
);
2715 __len22
= distance(__middle
, __second_cut
);
2718 __len22
= __len2
/ 2;
2719 advance(__second_cut
, __len22
);
2720 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
);
2721 __len11
= distance(__first
, __first_cut
);
2723 rotate(__first_cut
, __middle
, __second_cut
);
2724 _BidirectionalIter __new_middle
= __first_cut
;
2725 advance(__new_middle
, distance(__middle
, __second_cut
));
2726 __merge_without_buffer(__first
, __first_cut
, __new_middle
,
2728 __merge_without_buffer(__new_middle
, __second_cut
, __last
,
2729 __len1
- __len11
, __len2
- __len22
);
2732 template<typename _BidirectionalIter
, typename _Distance
, typename _Compare
>
2734 __merge_without_buffer(_BidirectionalIter __first
,
2735 _BidirectionalIter __middle
,
2736 _BidirectionalIter __last
,
2737 _Distance __len1
, _Distance __len2
,
2740 if (__len1
== 0 || __len2
== 0)
2742 if (__len1
+ __len2
== 2) {
2743 if (__comp(*__middle
, *__first
))
2744 iter_swap(__first
, __middle
);
2747 _BidirectionalIter __first_cut
= __first
;
2748 _BidirectionalIter __second_cut
= __middle
;
2749 _Distance __len11
= 0;
2750 _Distance __len22
= 0;
2751 if (__len1
> __len2
) {
2752 __len11
= __len1
/ 2;
2753 advance(__first_cut
, __len11
);
2754 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
, __comp
);
2755 __len22
= distance(__middle
, __second_cut
);
2758 __len22
= __len2
/ 2;
2759 advance(__second_cut
, __len22
);
2760 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
, __comp
);
2761 __len11
= distance(__first
, __first_cut
);
2763 rotate(__first_cut
, __middle
, __second_cut
);
2764 _BidirectionalIter __new_middle
= __first_cut
;
2765 advance(__new_middle
, distance(__middle
, __second_cut
));
2766 __merge_without_buffer(__first
, __first_cut
, __new_middle
,
2767 __len11
, __len22
, __comp
);
2768 __merge_without_buffer(__new_middle
, __second_cut
, __last
,
2769 __len1
- __len11
, __len2
- __len22
, __comp
);
2772 template<typename _BidirectionalIter1
, typename _BidirectionalIter2
,
2775 __rotate_adaptive(_BidirectionalIter1 __first
,
2776 _BidirectionalIter1 __middle
,
2777 _BidirectionalIter1 __last
,
2778 _Distance __len1
, _Distance __len2
,
2779 _BidirectionalIter2 __buffer
,
2780 _Distance __buffer_size
)
2782 _BidirectionalIter2 __buffer_end
;
2783 if (__len1
> __len2
&& __len2
<= __buffer_size
) {
2784 __buffer_end
= copy(__middle
, __last
, __buffer
);
2785 copy_backward(__first
, __middle
, __last
);
2786 return copy(__buffer
, __buffer_end
, __first
);
2788 else if (__len1
<= __buffer_size
) {
2789 __buffer_end
= copy(__first
, __middle
, __buffer
);
2790 copy(__middle
, __last
, __first
);
2791 return copy_backward(__buffer
, __buffer_end
, __last
);
2794 rotate(__first
, __middle
, __last
);
2795 advance(__first
, distance(__middle
, __last
));
2800 template<typename _BidirectionalIter1
, typename _BidirectionalIter2
,
2801 typename _BidirectionalIter3
>
2803 __merge_backward(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
2804 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
2805 _BidirectionalIter3 __result
)
2807 if (__first1
== __last1
)
2808 return copy_backward(__first2
, __last2
, __result
);
2809 if (__first2
== __last2
)
2810 return copy_backward(__first1
, __last1
, __result
);
2814 if (*__last2
< *__last1
) {
2815 *--__result
= *__last1
;
2816 if (__first1
== __last1
)
2817 return copy_backward(__first2
, ++__last2
, __result
);
2821 *--__result
= *__last2
;
2822 if (__first2
== __last2
)
2823 return copy_backward(__first1
, ++__last1
, __result
);
2829 template<typename _BidirectionalIter1
, typename _BidirectionalIter2
,
2830 typename _BidirectionalIter3
, typename _Compare
>
2832 __merge_backward(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
2833 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
2834 _BidirectionalIter3 __result
,
2837 if (__first1
== __last1
)
2838 return copy_backward(__first2
, __last2
, __result
);
2839 if (__first2
== __last2
)
2840 return copy_backward(__first1
, __last1
, __result
);
2844 if (__comp(*__last2
, *__last1
)) {
2845 *--__result
= *__last1
;
2846 if (__first1
== __last1
)
2847 return copy_backward(__first2
, ++__last2
, __result
);
2851 *--__result
= *__last2
;
2852 if (__first2
== __last2
)
2853 return copy_backward(__first1
, ++__last1
, __result
);
2859 template<typename _BidirectionalIter
, typename _Distance
, typename _Pointer
>
2861 __merge_adaptive(_BidirectionalIter __first
,
2862 _BidirectionalIter __middle
,
2863 _BidirectionalIter __last
,
2864 _Distance __len1
, _Distance __len2
,
2865 _Pointer __buffer
, _Distance __buffer_size
)
2867 if (__len1
<= __len2
&& __len1
<= __buffer_size
) {
2868 _Pointer __buffer_end
= copy(__first
, __middle
, __buffer
);
2869 merge(__buffer
, __buffer_end
, __middle
, __last
, __first
);
2871 else if (__len2
<= __buffer_size
) {
2872 _Pointer __buffer_end
= copy(__middle
, __last
, __buffer
);
2873 __merge_backward(__first
, __middle
, __buffer
, __buffer_end
, __last
);
2876 _BidirectionalIter __first_cut
= __first
;
2877 _BidirectionalIter __second_cut
= __middle
;
2878 _Distance __len11
= 0;
2879 _Distance __len22
= 0;
2880 if (__len1
> __len2
) {
2881 __len11
= __len1
/ 2;
2882 advance(__first_cut
, __len11
);
2883 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
);
2884 __len22
= distance(__middle
, __second_cut
);
2887 __len22
= __len2
/ 2;
2888 advance(__second_cut
, __len22
);
2889 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
);
2890 __len11
= distance(__first
, __first_cut
);
2892 _BidirectionalIter __new_middle
=
2893 __rotate_adaptive(__first_cut
, __middle
, __second_cut
,
2894 __len1
- __len11
, __len22
, __buffer
,
2896 __merge_adaptive(__first
, __first_cut
, __new_middle
, __len11
,
2897 __len22
, __buffer
, __buffer_size
);
2898 __merge_adaptive(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2899 __len2
- __len22
, __buffer
, __buffer_size
);
2903 template<typename _BidirectionalIter
, typename _Distance
, typename _Pointer
,
2906 __merge_adaptive(_BidirectionalIter __first
,
2907 _BidirectionalIter __middle
,
2908 _BidirectionalIter __last
,
2909 _Distance __len1
, _Distance __len2
,
2910 _Pointer __buffer
, _Distance __buffer_size
,
2913 if (__len1
<= __len2
&& __len1
<= __buffer_size
) {
2914 _Pointer __buffer_end
= copy(__first
, __middle
, __buffer
);
2915 merge(__buffer
, __buffer_end
, __middle
, __last
, __first
, __comp
);
2917 else if (__len2
<= __buffer_size
) {
2918 _Pointer __buffer_end
= copy(__middle
, __last
, __buffer
);
2919 __merge_backward(__first
, __middle
, __buffer
, __buffer_end
, __last
,
2923 _BidirectionalIter __first_cut
= __first
;
2924 _BidirectionalIter __second_cut
= __middle
;
2925 _Distance __len11
= 0;
2926 _Distance __len22
= 0;
2927 if (__len1
> __len2
) {
2928 __len11
= __len1
/ 2;
2929 advance(__first_cut
, __len11
);
2930 __second_cut
= lower_bound(__middle
, __last
, *__first_cut
, __comp
);
2931 __len22
= distance(__middle
, __second_cut
);
2934 __len22
= __len2
/ 2;
2935 advance(__second_cut
, __len22
);
2936 __first_cut
= upper_bound(__first
, __middle
, *__second_cut
, __comp
);
2937 __len11
= distance(__first
, __first_cut
);
2939 _BidirectionalIter __new_middle
=
2940 __rotate_adaptive(__first_cut
, __middle
, __second_cut
,
2941 __len1
- __len11
, __len22
, __buffer
,
2943 __merge_adaptive(__first
, __first_cut
, __new_middle
, __len11
,
2944 __len22
, __buffer
, __buffer_size
, __comp
);
2945 __merge_adaptive(__new_middle
, __second_cut
, __last
, __len1
- __len11
,
2946 __len2
- __len22
, __buffer
, __buffer_size
, __comp
);
2950 template<typename _BidirectionalIter
>
2952 inplace_merge(_BidirectionalIter __first
,
2953 _BidirectionalIter __middle
,
2954 _BidirectionalIter __last
)
2956 typedef typename iterator_traits
<_BidirectionalIter
>::value_type
2958 typedef typename iterator_traits
<_BidirectionalIter
>::difference_type
2961 // concept requirements
2962 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
2963 _BidirectionalIter
>)
2964 __glibcpp_function_requires(_LessThanComparableConcept
<_ValueType
>)
2966 if (__first
== __middle
|| __middle
== __last
)
2969 _DistanceType __len1
= distance(__first
, __middle
);
2970 _DistanceType __len2
= distance(__middle
, __last
);
2972 _Temporary_buffer
<_BidirectionalIter
, _ValueType
> __buf(__first
, __last
);
2973 if (__buf
.begin() == 0)
2974 __merge_without_buffer(__first
, __middle
, __last
, __len1
, __len2
);
2976 __merge_adaptive(__first
, __middle
, __last
, __len1
, __len2
,
2977 __buf
.begin(), _DistanceType(__buf
.size()));
2980 template<typename _BidirectionalIter
, typename _Compare
>
2982 inplace_merge(_BidirectionalIter __first
,
2983 _BidirectionalIter __middle
,
2984 _BidirectionalIter __last
,
2987 typedef typename iterator_traits
<_BidirectionalIter
>::value_type
2989 typedef typename iterator_traits
<_BidirectionalIter
>::difference_type
2992 // concept requirements
2993 __glibcpp_function_requires(_Mutable_BidirectionalIteratorConcept
<
2994 _BidirectionalIter
>)
2995 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
2996 _ValueType
, _ValueType
>)
2998 if (__first
== __middle
|| __middle
== __last
)
3001 _DistanceType __len1
= distance(__first
, __middle
);
3002 _DistanceType __len2
= distance(__middle
, __last
);
3004 _Temporary_buffer
<_BidirectionalIter
, _ValueType
> __buf(__first
, __last
);
3005 if (__buf
.begin() == 0)
3006 __merge_without_buffer(__first
, __middle
, __last
, __len1
, __len2
, __comp
);
3008 __merge_adaptive(__first
, __middle
, __last
, __len1
, __len2
,
3009 __buf
.begin(), _DistanceType(__buf
.size()),
3013 // Set algorithms: includes, set_union, set_intersection, set_difference,
3014 // set_symmetric_difference. All of these algorithms have the precondition
3015 // that their input ranges are sorted and the postcondition that their output
3016 // ranges are sorted.
3018 template<typename _InputIter1
, typename _InputIter2
>
3020 includes(_InputIter1 __first1
, _InputIter1 __last1
,
3021 _InputIter2 __first2
, _InputIter2 __last2
)
3023 // concept requirements
3024 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3025 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3026 __glibcpp_function_requires(_SameTypeConcept
<
3027 typename iterator_traits
<_InputIter1
>::value_type
,
3028 typename iterator_traits
<_InputIter2
>::value_type
>)
3029 __glibcpp_function_requires(_LessThanComparableConcept
<
3030 typename iterator_traits
<_InputIter1
>::value_type
>)
3032 while (__first1
!= __last1
&& __first2
!= __last2
)
3033 if (*__first2
< *__first1
)
3035 else if(*__first1
< *__first2
)
3038 ++__first1
, ++__first2
;
3040 return __first2
== __last2
;
3043 template<typename _InputIter1
, typename _InputIter2
, typename _Compare
>
3045 includes(_InputIter1 __first1
, _InputIter1 __last1
,
3046 _InputIter2 __first2
, _InputIter2 __last2
, _Compare __comp
)
3048 // concept requirements
3049 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3050 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3051 __glibcpp_function_requires(_SameTypeConcept
<
3052 typename iterator_traits
<_InputIter1
>::value_type
,
3053 typename iterator_traits
<_InputIter2
>::value_type
>)
3054 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3055 typename iterator_traits
<_InputIter1
>::value_type
,
3056 typename iterator_traits
<_InputIter2
>::value_type
>)
3058 while (__first1
!= __last1
&& __first2
!= __last2
)
3059 if (__comp(*__first2
, *__first1
))
3061 else if(__comp(*__first1
, *__first2
))
3064 ++__first1
, ++__first2
;
3066 return __first2
== __last2
;
3069 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
>
3071 set_union(_InputIter1 __first1
, _InputIter1 __last1
,
3072 _InputIter2 __first2
, _InputIter2 __last2
,
3073 _OutputIter __result
)
3075 // concept requirements
3076 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3077 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3078 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3079 typename iterator_traits
<_InputIter1
>::value_type
>)
3080 __glibcpp_function_requires(_SameTypeConcept
<
3081 typename iterator_traits
<_InputIter1
>::value_type
,
3082 typename iterator_traits
<_InputIter2
>::value_type
>)
3083 __glibcpp_function_requires(_LessThanComparableConcept
<
3084 typename iterator_traits
<_InputIter1
>::value_type
>)
3086 while (__first1
!= __last1
&& __first2
!= __last2
) {
3087 if (*__first1
< *__first2
) {
3088 *__result
= *__first1
;
3091 else if (*__first2
< *__first1
) {
3092 *__result
= *__first2
;
3096 *__result
= *__first1
;
3102 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3105 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
3108 set_union(_InputIter1 __first1
, _InputIter1 __last1
,
3109 _InputIter2 __first2
, _InputIter2 __last2
,
3110 _OutputIter __result
, _Compare __comp
)
3112 // concept requirements
3113 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3114 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3115 __glibcpp_function_requires(_SameTypeConcept
<
3116 typename iterator_traits
<_InputIter1
>::value_type
,
3117 typename iterator_traits
<_InputIter2
>::value_type
>)
3118 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3119 typename iterator_traits
<_InputIter1
>::value_type
>)
3120 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3121 typename iterator_traits
<_InputIter1
>::value_type
,
3122 typename iterator_traits
<_InputIter2
>::value_type
>)
3124 while (__first1
!= __last1
&& __first2
!= __last2
) {
3125 if (__comp(*__first1
, *__first2
)) {
3126 *__result
= *__first1
;
3129 else if (__comp(*__first2
, *__first1
)) {
3130 *__result
= *__first2
;
3134 *__result
= *__first1
;
3140 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3143 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
>
3145 set_intersection(_InputIter1 __first1
, _InputIter1 __last1
,
3146 _InputIter2 __first2
, _InputIter2 __last2
,
3147 _OutputIter __result
)
3149 // concept requirements
3150 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3151 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3152 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3153 typename iterator_traits
<_InputIter1
>::value_type
>)
3154 __glibcpp_function_requires(_SameTypeConcept
<
3155 typename iterator_traits
<_InputIter1
>::value_type
,
3156 typename iterator_traits
<_InputIter2
>::value_type
>)
3157 __glibcpp_function_requires(_LessThanComparableConcept
<
3158 typename iterator_traits
<_InputIter1
>::value_type
>)
3160 while (__first1
!= __last1
&& __first2
!= __last2
)
3161 if (*__first1
< *__first2
)
3163 else if (*__first2
< *__first1
)
3166 *__result
= *__first1
;
3174 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
3177 set_intersection(_InputIter1 __first1
, _InputIter1 __last1
,
3178 _InputIter2 __first2
, _InputIter2 __last2
,
3179 _OutputIter __result
, _Compare __comp
)
3181 // concept requirements
3182 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3183 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3184 __glibcpp_function_requires(_SameTypeConcept
<
3185 typename iterator_traits
<_InputIter1
>::value_type
,
3186 typename iterator_traits
<_InputIter2
>::value_type
>)
3187 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3188 typename iterator_traits
<_InputIter1
>::value_type
>)
3189 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3190 typename iterator_traits
<_InputIter1
>::value_type
,
3191 typename iterator_traits
<_InputIter2
>::value_type
>)
3193 while (__first1
!= __last1
&& __first2
!= __last2
)
3194 if (__comp(*__first1
, *__first2
))
3196 else if (__comp(*__first2
, *__first1
))
3199 *__result
= *__first1
;
3207 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
>
3209 set_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3210 _InputIter2 __first2
, _InputIter2 __last2
,
3211 _OutputIter __result
)
3213 // concept requirements
3214 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3215 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3216 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3217 typename iterator_traits
<_InputIter1
>::value_type
>)
3218 __glibcpp_function_requires(_SameTypeConcept
<
3219 typename iterator_traits
<_InputIter1
>::value_type
,
3220 typename iterator_traits
<_InputIter2
>::value_type
>)
3221 __glibcpp_function_requires(_LessThanComparableConcept
<
3222 typename iterator_traits
<_InputIter1
>::value_type
>)
3224 while (__first1
!= __last1
&& __first2
!= __last2
)
3225 if (*__first1
< *__first2
) {
3226 *__result
= *__first1
;
3230 else if (*__first2
< *__first1
)
3236 return copy(__first1
, __last1
, __result
);
3239 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
3242 set_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3243 _InputIter2 __first2
, _InputIter2 __last2
,
3244 _OutputIter __result
, _Compare __comp
)
3246 // concept requirements
3247 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3248 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3249 __glibcpp_function_requires(_SameTypeConcept
<
3250 typename iterator_traits
<_InputIter1
>::value_type
,
3251 typename iterator_traits
<_InputIter2
>::value_type
>)
3252 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3253 typename iterator_traits
<_InputIter1
>::value_type
>)
3254 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3255 typename iterator_traits
<_InputIter1
>::value_type
,
3256 typename iterator_traits
<_InputIter2
>::value_type
>)
3258 while (__first1
!= __last1
&& __first2
!= __last2
)
3259 if (__comp(*__first1
, *__first2
)) {
3260 *__result
= *__first1
;
3264 else if (__comp(*__first2
, *__first1
))
3270 return copy(__first1
, __last1
, __result
);
3273 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
>
3275 set_symmetric_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3276 _InputIter2 __first2
, _InputIter2 __last2
,
3277 _OutputIter __result
)
3279 // concept requirements
3280 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3281 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3282 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3283 typename iterator_traits
<_InputIter1
>::value_type
>)
3284 __glibcpp_function_requires(_SameTypeConcept
<
3285 typename iterator_traits
<_InputIter1
>::value_type
,
3286 typename iterator_traits
<_InputIter2
>::value_type
>)
3287 __glibcpp_function_requires(_LessThanComparableConcept
<
3288 typename iterator_traits
<_InputIter1
>::value_type
>)
3290 while (__first1
!= __last1
&& __first2
!= __last2
)
3291 if (*__first1
< *__first2
) {
3292 *__result
= *__first1
;
3296 else if (*__first2
< *__first1
) {
3297 *__result
= *__first2
;
3305 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3308 template<typename _InputIter1
, typename _InputIter2
, typename _OutputIter
,
3311 set_symmetric_difference(_InputIter1 __first1
, _InputIter1 __last1
,
3312 _InputIter2 __first2
, _InputIter2 __last2
,
3313 _OutputIter __result
,
3316 // concept requirements
3317 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter1
>)
3318 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter2
>)
3319 __glibcpp_function_requires(_SameTypeConcept
<
3320 typename iterator_traits
<_InputIter1
>::value_type
,
3321 typename iterator_traits
<_InputIter2
>::value_type
>)
3322 __glibcpp_function_requires(_OutputIteratorConcept
<_OutputIter
,
3323 typename iterator_traits
<_InputIter1
>::value_type
>)
3324 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3325 typename iterator_traits
<_InputIter1
>::value_type
,
3326 typename iterator_traits
<_InputIter2
>::value_type
>)
3328 while (__first1
!= __last1
&& __first2
!= __last2
)
3329 if (__comp(*__first1
, *__first2
)) {
3330 *__result
= *__first1
;
3334 else if (__comp(*__first2
, *__first1
)) {
3335 *__result
= *__first2
;
3343 return copy(__first2
, __last2
, copy(__first1
, __last1
, __result
));
3346 // min_element and max_element, with and without an explicitly supplied
3347 // comparison function.
3349 template<typename _ForwardIter
>
3351 max_element(_ForwardIter __first
, _ForwardIter __last
)
3353 // concept requirements
3354 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3355 __glibcpp_function_requires(_LessThanComparableConcept
<
3356 typename iterator_traits
<_ForwardIter
>::value_type
>)
3358 if (__first
== __last
) return __first
;
3359 _ForwardIter __result
= __first
;
3360 while (++__first
!= __last
)
3361 if (*__result
< *__first
)
3366 template<typename _ForwardIter
, typename _Compare
>
3368 max_element(_ForwardIter __first
, _ForwardIter __last
,
3371 // concept requirements
3372 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3373 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3374 typename iterator_traits
<_ForwardIter
>::value_type
,
3375 typename iterator_traits
<_ForwardIter
>::value_type
>)
3377 if (__first
== __last
) return __first
;
3378 _ForwardIter __result
= __first
;
3379 while (++__first
!= __last
)
3380 if (__comp(*__result
, *__first
)) __result
= __first
;
3384 template<typename _ForwardIter
>
3386 min_element(_ForwardIter __first
, _ForwardIter __last
)
3388 // concept requirements
3389 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3390 __glibcpp_function_requires(_LessThanComparableConcept
<
3391 typename iterator_traits
<_ForwardIter
>::value_type
>)
3393 if (__first
== __last
) return __first
;
3394 _ForwardIter __result
= __first
;
3395 while (++__first
!= __last
)
3396 if (*__first
< *__result
)
3401 template<typename _ForwardIter
, typename _Compare
>
3403 min_element(_ForwardIter __first
, _ForwardIter __last
,
3406 // concept requirements
3407 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3408 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3409 typename iterator_traits
<_ForwardIter
>::value_type
,
3410 typename iterator_traits
<_ForwardIter
>::value_type
>)
3412 if (__first
== __last
) return __first
;
3413 _ForwardIter __result
= __first
;
3414 while (++__first
!= __last
)
3415 if (__comp(*__first
, *__result
))
3420 // next_permutation and prev_permutation, with and without an explicitly
3421 // supplied comparison function.
3423 template<typename _BidirectionalIter
>
3425 next_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
)
3427 // concept requirements
3428 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>)
3429 __glibcpp_function_requires(_LessThanComparableConcept
<
3430 typename iterator_traits
<_BidirectionalIter
>::value_type
>)
3432 if (__first
== __last
)
3434 _BidirectionalIter __i
= __first
;
3442 _BidirectionalIter __ii
= __i
;
3445 _BidirectionalIter __j
= __last
;
3446 while (!(*__i
< *--__j
))
3448 iter_swap(__i
, __j
);
3449 reverse(__ii
, __last
);
3452 if (__i
== __first
) {
3453 reverse(__first
, __last
);
3459 template<typename _BidirectionalIter
, typename _Compare
>
3461 next_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
,
3464 // concept requirements
3465 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>)
3466 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3467 typename iterator_traits
<_BidirectionalIter
>::value_type
,
3468 typename iterator_traits
<_BidirectionalIter
>::value_type
>)
3470 if (__first
== __last
)
3472 _BidirectionalIter __i
= __first
;
3480 _BidirectionalIter __ii
= __i
;
3482 if (__comp(*__i
, *__ii
)) {
3483 _BidirectionalIter __j
= __last
;
3484 while (!__comp(*__i
, *--__j
))
3486 iter_swap(__i
, __j
);
3487 reverse(__ii
, __last
);
3490 if (__i
== __first
) {
3491 reverse(__first
, __last
);
3497 template<typename _BidirectionalIter
>
3499 prev_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
)
3501 // concept requirements
3502 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>)
3503 __glibcpp_function_requires(_LessThanComparableConcept
<
3504 typename iterator_traits
<_BidirectionalIter
>::value_type
>)
3506 if (__first
== __last
)
3508 _BidirectionalIter __i
= __first
;
3516 _BidirectionalIter __ii
= __i
;
3519 _BidirectionalIter __j
= __last
;
3520 while (!(*--__j
< *__i
))
3522 iter_swap(__i
, __j
);
3523 reverse(__ii
, __last
);
3526 if (__i
== __first
) {
3527 reverse(__first
, __last
);
3533 template<typename _BidirectionalIter
, typename _Compare
>
3535 prev_permutation(_BidirectionalIter __first
, _BidirectionalIter __last
,
3538 // concept requirements
3539 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter
>)
3540 __glibcpp_function_requires(_BinaryPredicateConcept
<_Compare
,
3541 typename iterator_traits
<_BidirectionalIter
>::value_type
,
3542 typename iterator_traits
<_BidirectionalIter
>::value_type
>)
3544 if (__first
== __last
)
3546 _BidirectionalIter __i
= __first
;
3554 _BidirectionalIter __ii
= __i
;
3556 if (__comp(*__ii
, *__i
)) {
3557 _BidirectionalIter __j
= __last
;
3558 while (!__comp(*--__j
, *__i
))
3560 iter_swap(__i
, __j
);
3561 reverse(__ii
, __last
);
3564 if (__i
== __first
) {
3565 reverse(__first
, __last
);
3571 // find_first_of, with and without an explicitly supplied comparison function.
3573 template<typename _InputIter
, typename _ForwardIter
>
3575 find_first_of(_InputIter __first1
, _InputIter __last1
,
3576 _ForwardIter __first2
, _ForwardIter __last2
)
3578 // concept requirements
3579 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
3580 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3581 __glibcpp_function_requires(_EqualOpConcept
<
3582 typename iterator_traits
<_InputIter
>::value_type
,
3583 typename iterator_traits
<_ForwardIter
>::value_type
>)
3585 for ( ; __first1
!= __last1
; ++__first1
)
3586 for (_ForwardIter __iter
= __first2
; __iter
!= __last2
; ++__iter
)
3587 if (*__first1
== *__iter
)
3592 template<typename _InputIter
, typename _ForwardIter
, typename _BinaryPredicate
>
3594 find_first_of(_InputIter __first1
, _InputIter __last1
,
3595 _ForwardIter __first2
, _ForwardIter __last2
,
3596 _BinaryPredicate __comp
)
3598 // concept requirements
3599 __glibcpp_function_requires(_InputIteratorConcept
<_InputIter
>)
3600 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter
>)
3601 __glibcpp_function_requires(_EqualOpConcept
<
3602 typename iterator_traits
<_InputIter
>::value_type
,
3603 typename iterator_traits
<_ForwardIter
>::value_type
>)
3604 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
3605 typename iterator_traits
<_InputIter
>::value_type
,
3606 typename iterator_traits
<_ForwardIter
>::value_type
>)
3608 for ( ; __first1
!= __last1
; ++__first1
)
3609 for (_ForwardIter __iter
= __first2
; __iter
!= __last2
; ++__iter
)
3610 if (__comp(*__first1
, *__iter
))
3616 // find_end, with and without an explicitly supplied comparison function.
3617 // Search [first2, last2) as a subsequence in [first1, last1), and return
3618 // the *last* possible match. Note that find_end for bidirectional iterators
3619 // is much faster than for forward iterators.
3621 // find_end for forward iterators.
3622 template<typename _ForwardIter1
, typename _ForwardIter2
>
3624 __find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3625 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3626 forward_iterator_tag
, forward_iterator_tag
)
3628 if (__first2
== __last2
)
3631 _ForwardIter1 __result
= __last1
;
3633 _ForwardIter1 __new_result
3634 = search(__first1
, __last1
, __first2
, __last2
);
3635 if (__new_result
== __last1
)
3638 __result
= __new_result
;
3639 __first1
= __new_result
;
3646 template<typename _ForwardIter1
, typename _ForwardIter2
,
3647 typename _BinaryPredicate
>
3649 __find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3650 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3651 forward_iterator_tag
, forward_iterator_tag
,
3652 _BinaryPredicate __comp
)
3654 if (__first2
== __last2
)
3657 _ForwardIter1 __result
= __last1
;
3659 _ForwardIter1 __new_result
3660 = search(__first1
, __last1
, __first2
, __last2
, __comp
);
3661 if (__new_result
== __last1
)
3664 __result
= __new_result
;
3665 __first1
= __new_result
;
3672 // find_end for bidirectional iterators. Requires partial specialization.
3673 template<typename _BidirectionalIter1
, typename _BidirectionalIter2
>
3675 __find_end(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
3676 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
3677 bidirectional_iterator_tag
, bidirectional_iterator_tag
)
3679 // concept requirements
3680 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter1
>)
3681 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter2
>)
3683 typedef reverse_iterator
<_BidirectionalIter1
> _RevIter1
;
3684 typedef reverse_iterator
<_BidirectionalIter2
> _RevIter2
;
3686 _RevIter1
__rlast1(__first1
);
3687 _RevIter2
__rlast2(__first2
);
3688 _RevIter1 __rresult
= search(_RevIter1(__last1
), __rlast1
,
3689 _RevIter2(__last2
), __rlast2
);
3691 if (__rresult
== __rlast1
)
3694 _BidirectionalIter1 __result
= __rresult
.base();
3695 advance(__result
, -distance(__first2
, __last2
));
3700 template<typename _BidirectionalIter1
, typename _BidirectionalIter2
,
3701 typename _BinaryPredicate
>
3703 __find_end(_BidirectionalIter1 __first1
, _BidirectionalIter1 __last1
,
3704 _BidirectionalIter2 __first2
, _BidirectionalIter2 __last2
,
3705 bidirectional_iterator_tag
, bidirectional_iterator_tag
,
3706 _BinaryPredicate __comp
)
3708 // concept requirements
3709 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter1
>)
3710 __glibcpp_function_requires(_BidirectionalIteratorConcept
<_BidirectionalIter2
>)
3712 typedef reverse_iterator
<_BidirectionalIter1
> _RevIter1
;
3713 typedef reverse_iterator
<_BidirectionalIter2
> _RevIter2
;
3715 _RevIter1
__rlast1(__first1
);
3716 _RevIter2
__rlast2(__first2
);
3717 _RevIter1 __rresult
= search(_RevIter1(__last1
), __rlast1
,
3718 _RevIter2(__last2
), __rlast2
,
3721 if (__rresult
== __rlast1
)
3724 _BidirectionalIter1 __result
= __rresult
.base();
3725 advance(__result
, -distance(__first2
, __last2
));
3730 // Dispatching functions for find_end.
3732 template<typename _ForwardIter1
, typename _ForwardIter2
>
3733 inline _ForwardIter1
3734 find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3735 _ForwardIter2 __first2
, _ForwardIter2 __last2
)
3737 // concept requirements
3738 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>)
3739 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>)
3740 __glibcpp_function_requires(_EqualOpConcept
<
3741 typename iterator_traits
<_ForwardIter1
>::value_type
,
3742 typename iterator_traits
<_ForwardIter2
>::value_type
>)
3744 return __find_end(__first1
, __last1
, __first2
, __last2
,
3745 __iterator_category(__first1
),
3746 __iterator_category(__first2
));
3749 template<typename _ForwardIter1
, typename _ForwardIter2
,
3750 typename _BinaryPredicate
>
3751 inline _ForwardIter1
3752 find_end(_ForwardIter1 __first1
, _ForwardIter1 __last1
,
3753 _ForwardIter2 __first2
, _ForwardIter2 __last2
,
3754 _BinaryPredicate __comp
)
3756 // concept requirements
3757 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter1
>)
3758 __glibcpp_function_requires(_ForwardIteratorConcept
<_ForwardIter2
>)
3759 __glibcpp_function_requires(_BinaryPredicateConcept
<_BinaryPredicate
,
3760 typename iterator_traits
<_ForwardIter1
>::value_type
,
3761 typename iterator_traits
<_ForwardIter2
>::value_type
>)
3763 return __find_end(__first1
, __last1
, __first2
, __last2
,
3764 __iterator_category(__first1
),
3765 __iterator_category(__first2
),
3771 #endif /* __GLIBCPP_INTERNAL_ALGO_H */