00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00062 #ifndef _ALGO_H
00063 #define _ALGO_H 1
00064
00065 #include <bits/stl_heap.h>
00066 #include <bits/stl_tempbuf.h>
00067 #include <debug/debug.h>
00068
00069
00070
00071 namespace std
00072 {
00085 template<typename _Tp>
00086 inline const _Tp&
00087 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
00088 {
00089
00090 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
00091 if (__a < __b)
00092 if (__b < __c)
00093 return __b;
00094 else if (__a < __c)
00095 return __c;
00096 else
00097 return __a;
00098 else if (__a < __c)
00099 return __a;
00100 else if (__b < __c)
00101 return __c;
00102 else
00103 return __b;
00104 }
00105
00119 template<typename _Tp, typename _Compare>
00120 inline const _Tp&
00121 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
00122 {
00123
00124 __glibcxx_function_requires(_BinaryFunctionConcept<_Compare,bool,_Tp,_Tp>)
00125 if (__comp(__a, __b))
00126 if (__comp(__b, __c))
00127 return __b;
00128 else if (__comp(__a, __c))
00129 return __c;
00130 else
00131 return __a;
00132 else if (__comp(__a, __c))
00133 return __a;
00134 else if (__comp(__b, __c))
00135 return __c;
00136 else
00137 return __b;
00138 }
00139
00151 template<typename _InputIterator, typename _Function>
00152 _Function
00153 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
00154 {
00155
00156 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00157 __glibcxx_requires_valid_range(__first, __last);
00158 for ( ; __first != __last; ++__first)
00159 __f(*__first);
00160 return __f;
00161 }
00162
00168 template<typename _InputIterator, typename _Tp>
00169 inline _InputIterator
00170 __find(_InputIterator __first, _InputIterator __last,
00171 const _Tp& __val, input_iterator_tag)
00172 {
00173 while (__first != __last && !(*__first == __val))
00174 ++__first;
00175 return __first;
00176 }
00177
00183 template<typename _InputIterator, typename _Predicate>
00184 inline _InputIterator
00185 __find_if(_InputIterator __first, _InputIterator __last,
00186 _Predicate __pred, input_iterator_tag)
00187 {
00188 while (__first != __last && !__pred(*__first))
00189 ++__first;
00190 return __first;
00191 }
00192
00198 template<typename _RandomAccessIterator, typename _Tp>
00199 _RandomAccessIterator
00200 __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
00201 const _Tp& __val, random_access_iterator_tag)
00202 {
00203 typename iterator_traits<_RandomAccessIterator>::difference_type
00204 __trip_count = (__last - __first) >> 2;
00205
00206 for ( ; __trip_count > 0 ; --__trip_count)
00207 {
00208 if (*__first == __val)
00209 return __first;
00210 ++__first;
00211
00212 if (*__first == __val)
00213 return __first;
00214 ++__first;
00215
00216 if (*__first == __val)
00217 return __first;
00218 ++__first;
00219
00220 if (*__first == __val)
00221 return __first;
00222 ++__first;
00223 }
00224
00225 switch (__last - __first)
00226 {
00227 case 3:
00228 if (*__first == __val)
00229 return __first;
00230 ++__first;
00231 case 2:
00232 if (*__first == __val)
00233 return __first;
00234 ++__first;
00235 case 1:
00236 if (*__first == __val)
00237 return __first;
00238 ++__first;
00239 case 0:
00240 default:
00241 return __last;
00242 }
00243 }
00244
00250 template<typename _RandomAccessIterator, typename _Predicate>
00251 _RandomAccessIterator
00252 __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
00253 _Predicate __pred, random_access_iterator_tag)
00254 {
00255 typename iterator_traits<_RandomAccessIterator>::difference_type
00256 __trip_count = (__last - __first) >> 2;
00257
00258 for ( ; __trip_count > 0 ; --__trip_count)
00259 {
00260 if (__pred(*__first))
00261 return __first;
00262 ++__first;
00263
00264 if (__pred(*__first))
00265 return __first;
00266 ++__first;
00267
00268 if (__pred(*__first))
00269 return __first;
00270 ++__first;
00271
00272 if (__pred(*__first))
00273 return __first;
00274 ++__first;
00275 }
00276
00277 switch (__last - __first)
00278 {
00279 case 3:
00280 if (__pred(*__first))
00281 return __first;
00282 ++__first;
00283 case 2:
00284 if (__pred(*__first))
00285 return __first;
00286 ++__first;
00287 case 1:
00288 if (__pred(*__first))
00289 return __first;
00290 ++__first;
00291 case 0:
00292 default:
00293 return __last;
00294 }
00295 }
00296
00305 template<typename _InputIterator, typename _Tp>
00306 inline _InputIterator
00307 find(_InputIterator __first, _InputIterator __last,
00308 const _Tp& __val)
00309 {
00310
00311 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00312 __glibcxx_function_requires(_EqualOpConcept<
00313 typename iterator_traits<_InputIterator>::value_type, _Tp>)
00314 __glibcxx_requires_valid_range(__first, __last);
00315 return std::__find(__first, __last, __val,
00316 std::__iterator_category(__first));
00317 }
00318
00327 template<typename _InputIterator, typename _Predicate>
00328 inline _InputIterator
00329 find_if(_InputIterator __first, _InputIterator __last,
00330 _Predicate __pred)
00331 {
00332
00333 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00334 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00335 typename iterator_traits<_InputIterator>::value_type>)
00336 __glibcxx_requires_valid_range(__first, __last);
00337 return std::__find_if(__first, __last, __pred,
00338 std::__iterator_category(__first));
00339 }
00340
00349 template<typename _ForwardIterator>
00350 _ForwardIterator
00351 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
00352 {
00353
00354 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
00355 __glibcxx_function_requires(_EqualityComparableConcept<
00356 typename iterator_traits<_ForwardIterator>::value_type>)
00357 __glibcxx_requires_valid_range(__first, __last);
00358 if (__first == __last)
00359 return __last;
00360 _ForwardIterator __next = __first;
00361 while(++__next != __last)
00362 {
00363 if (*__first == *__next)
00364 return __first;
00365 __first = __next;
00366 }
00367 return __last;
00368 }
00369
00380 template<typename _ForwardIterator, typename _BinaryPredicate>
00381 _ForwardIterator
00382 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
00383 _BinaryPredicate __binary_pred)
00384 {
00385
00386 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
00387 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
00388 typename iterator_traits<_ForwardIterator>::value_type,
00389 typename iterator_traits<_ForwardIterator>::value_type>)
00390 __glibcxx_requires_valid_range(__first, __last);
00391 if (__first == __last)
00392 return __last;
00393 _ForwardIterator __next = __first;
00394 while(++__next != __last)
00395 {
00396 if (__binary_pred(*__first, *__next))
00397 return __first;
00398 __first = __next;
00399 }
00400 return __last;
00401 }
00402
00411 template<typename _InputIterator, typename _Tp>
00412 typename iterator_traits<_InputIterator>::difference_type
00413 count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
00414 {
00415
00416 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00417 __glibcxx_function_requires(_EqualOpConcept<
00418 typename iterator_traits<_InputIterator>::value_type, _Tp>)
00419 __glibcxx_requires_valid_range(__first, __last);
00420 typename iterator_traits<_InputIterator>::difference_type __n = 0;
00421 for ( ; __first != __last; ++__first)
00422 if (*__first == __value)
00423 ++__n;
00424 return __n;
00425 }
00426
00435 template<typename _InputIterator, typename _Predicate>
00436 typename iterator_traits<_InputIterator>::difference_type
00437 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
00438 {
00439
00440 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00441 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00442 typename iterator_traits<_InputIterator>::value_type>)
00443 __glibcxx_requires_valid_range(__first, __last);
00444 typename iterator_traits<_InputIterator>::difference_type __n = 0;
00445 for ( ; __first != __last; ++__first)
00446 if (__pred(*__first))
00447 ++__n;
00448 return __n;
00449 }
00450
00474 template<typename _ForwardIterator1, typename _ForwardIterator2>
00475 _ForwardIterator1
00476 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00477 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
00478 {
00479
00480 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
00481 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
00482 __glibcxx_function_requires(_EqualOpConcept<
00483 typename iterator_traits<_ForwardIterator1>::value_type,
00484 typename iterator_traits<_ForwardIterator2>::value_type>)
00485 __glibcxx_requires_valid_range(__first1, __last1);
00486 __glibcxx_requires_valid_range(__first2, __last2);
00487
00488 if (__first1 == __last1 || __first2 == __last2)
00489 return __first1;
00490
00491
00492 _ForwardIterator2 __tmp(__first2);
00493 ++__tmp;
00494 if (__tmp == __last2)
00495 return std::find(__first1, __last1, *__first2);
00496
00497
00498 _ForwardIterator2 __p1, __p;
00499 __p1 = __first2; ++__p1;
00500 _ForwardIterator1 __current = __first1;
00501
00502 while (__first1 != __last1)
00503 {
00504 __first1 = std::find(__first1, __last1, *__first2);
00505 if (__first1 == __last1)
00506 return __last1;
00507
00508 __p = __p1;
00509 __current = __first1;
00510 if (++__current == __last1)
00511 return __last1;
00512
00513 while (*__current == *__p)
00514 {
00515 if (++__p == __last2)
00516 return __first1;
00517 if (++__current == __last1)
00518 return __last1;
00519 }
00520 ++__first1;
00521 }
00522 return __first1;
00523 }
00524
00545 template<typename _ForwardIterator1, typename _ForwardIterator2,
00546 typename _BinaryPredicate>
00547 _ForwardIterator1
00548 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00549 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
00550 _BinaryPredicate __predicate)
00551 {
00552
00553 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
00554 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
00555 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
00556 typename iterator_traits<_ForwardIterator1>::value_type,
00557 typename iterator_traits<_ForwardIterator2>::value_type>)
00558 __glibcxx_requires_valid_range(__first1, __last1);
00559 __glibcxx_requires_valid_range(__first2, __last2);
00560
00561
00562 if (__first1 == __last1 || __first2 == __last2)
00563 return __first1;
00564
00565
00566 _ForwardIterator2 __tmp(__first2);
00567 ++__tmp;
00568 if (__tmp == __last2)
00569 {
00570 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
00571 ++__first1;
00572 return __first1;
00573 }
00574
00575
00576 _ForwardIterator2 __p1, __p;
00577 __p1 = __first2; ++__p1;
00578 _ForwardIterator1 __current = __first1;
00579
00580 while (__first1 != __last1)
00581 {
00582 while (__first1 != __last1)
00583 {
00584 if (__predicate(*__first1, *__first2))
00585 break;
00586 ++__first1;
00587 }
00588 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
00589 ++__first1;
00590 if (__first1 == __last1)
00591 return __last1;
00592
00593 __p = __p1;
00594 __current = __first1;
00595 if (++__current == __last1)
00596 return __last1;
00597
00598 while (__predicate(*__current, *__p))
00599 {
00600 if (++__p == __last2)
00601 return __first1;
00602 if (++__current == __last1)
00603 return __last1;
00604 }
00605 ++__first1;
00606 }
00607 return __first1;
00608 }
00609
00617 template<typename _ForwardIterator, typename _Integer, typename _Tp>
00618 _ForwardIterator
00619 __search_n(_ForwardIterator __first, _ForwardIterator __last,
00620 _Integer __count, const _Tp& __val,
00621 std::forward_iterator_tag)
00622 {
00623 __first = std::find(__first, __last, __val);
00624 while (__first != __last)
00625 {
00626 typename iterator_traits<_ForwardIterator>::difference_type
00627 __n = __count;
00628 _ForwardIterator __i = __first;
00629 ++__i;
00630 while (__i != __last && __n != 1 && *__i == __val)
00631 {
00632 ++__i;
00633 --__n;
00634 }
00635 if (__n == 1)
00636 return __first;
00637 if (__i == __last)
00638 return __last;
00639 __first = std::find(++__i, __last, __val);
00640 }
00641 return __last;
00642 }
00643
00651 template<typename _RandomAccessIter, typename _Integer, typename _Tp>
00652 _RandomAccessIter
00653 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
00654 _Integer __count, const _Tp& __val,
00655 std::random_access_iterator_tag)
00656 {
00657
00658 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
00659 _DistanceType;
00660
00661 _DistanceType __tailSize = __last - __first;
00662 const _DistanceType __pattSize = __count;
00663
00664 if (__tailSize < __pattSize)
00665 return __last;
00666
00667 const _DistanceType __skipOffset = __pattSize - 1;
00668 _RandomAccessIter __lookAhead = __first + __skipOffset;
00669 __tailSize -= __pattSize;
00670
00671 while (1)
00672 {
00673
00674
00675 while (!(*__lookAhead == __val))
00676 {
00677 if (__tailSize < __pattSize)
00678 return __last;
00679 __lookAhead += __pattSize;
00680 __tailSize -= __pattSize;
00681 }
00682 _DistanceType __remainder = __skipOffset;
00683 for (_RandomAccessIter __backTrack = __lookAhead - 1;
00684 *__backTrack == __val; --__backTrack)
00685 {
00686 if (--__remainder == 0)
00687 return (__lookAhead - __skipOffset);
00688 }
00689 if (__remainder > __tailSize)
00690 return __last;
00691 __lookAhead += __remainder;
00692 __tailSize -= __remainder;
00693 }
00694 }
00695
00709 template<typename _ForwardIterator, typename _Integer, typename _Tp>
00710 _ForwardIterator
00711 search_n(_ForwardIterator __first, _ForwardIterator __last,
00712 _Integer __count, const _Tp& __val)
00713 {
00714
00715 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
00716 __glibcxx_function_requires(_EqualOpConcept<
00717 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
00718 __glibcxx_requires_valid_range(__first, __last);
00719
00720 if (__count <= 0)
00721 return __first;
00722 if (__count == 1)
00723 return std::find(__first, __last, __val);
00724 return std::__search_n(__first, __last, __count, __val,
00725 std::__iterator_category(__first));
00726 }
00727
00736 template<typename _ForwardIterator, typename _Integer, typename _Tp,
00737 typename _BinaryPredicate>
00738 _ForwardIterator
00739 __search_n(_ForwardIterator __first, _ForwardIterator __last,
00740 _Integer __count, const _Tp& __val,
00741 _BinaryPredicate __binary_pred, std::forward_iterator_tag)
00742 {
00743 while (__first != __last && !__binary_pred(*__first, __val))
00744 ++__first;
00745
00746 while (__first != __last)
00747 {
00748 typename iterator_traits<_ForwardIterator>::difference_type
00749 __n = __count;
00750 _ForwardIterator __i = __first;
00751 ++__i;
00752 while (__i != __last && __n != 1 && __binary_pred(*__i, __val))
00753 {
00754 ++__i;
00755 --__n;
00756 }
00757 if (__n == 1)
00758 return __first;
00759 if (__i == __last)
00760 return __last;
00761 __first = ++__i;
00762 while (__first != __last && !__binary_pred(*__first, __val))
00763 ++__first;
00764 }
00765 return __last;
00766 }
00767
00776 template<typename _RandomAccessIter, typename _Integer, typename _Tp,
00777 typename _BinaryPredicate>
00778 _RandomAccessIter
00779 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
00780 _Integer __count, const _Tp& __val,
00781 _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
00782 {
00783
00784 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
00785 _DistanceType;
00786
00787 _DistanceType __tailSize = __last - __first;
00788 const _DistanceType __pattSize = __count;
00789
00790 if (__tailSize < __pattSize)
00791 return __last;
00792
00793 const _DistanceType __skipOffset = __pattSize - 1;
00794 _RandomAccessIter __lookAhead = __first + __skipOffset;
00795 __tailSize -= __pattSize;
00796
00797 while (1)
00798 {
00799
00800
00801 while (!__binary_pred(*__lookAhead, __val))
00802 {
00803 if (__tailSize < __pattSize)
00804 return __last;
00805 __lookAhead += __pattSize;
00806 __tailSize -= __pattSize;
00807 }
00808 _DistanceType __remainder = __skipOffset;
00809 for (_RandomAccessIter __backTrack = __lookAhead - 1;
00810 __binary_pred(*__backTrack, __val); --__backTrack)
00811 {
00812 if (--__remainder == 0)
00813 return (__lookAhead - __skipOffset);
00814 }
00815 if (__remainder > __tailSize)
00816 return __last;
00817 __lookAhead += __remainder;
00818 __tailSize -= __remainder;
00819 }
00820 }
00821
00837 template<typename _ForwardIterator, typename _Integer, typename _Tp,
00838 typename _BinaryPredicate>
00839 _ForwardIterator
00840 search_n(_ForwardIterator __first, _ForwardIterator __last,
00841 _Integer __count, const _Tp& __val,
00842 _BinaryPredicate __binary_pred)
00843 {
00844
00845 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
00846 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
00847 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
00848 __glibcxx_requires_valid_range(__first, __last);
00849
00850 if (__count <= 0)
00851 return __first;
00852 if (__count == 1)
00853 {
00854 while (__first != __last && !__binary_pred(*__first, __val))
00855 ++__first;
00856 return __first;
00857 }
00858 return std::__search_n(__first, __last, __count, __val, __binary_pred,
00859 std::__iterator_category(__first));
00860 }
00861
00873 template<typename _ForwardIterator1, typename _ForwardIterator2>
00874 _ForwardIterator2
00875 swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00876 _ForwardIterator2 __first2)
00877 {
00878
00879 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
00880 _ForwardIterator1>)
00881 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
00882 _ForwardIterator2>)
00883 __glibcxx_function_requires(_ConvertibleConcept<
00884 typename iterator_traits<_ForwardIterator1>::value_type,
00885 typename iterator_traits<_ForwardIterator2>::value_type>)
00886 __glibcxx_function_requires(_ConvertibleConcept<
00887 typename iterator_traits<_ForwardIterator2>::value_type,
00888 typename iterator_traits<_ForwardIterator1>::value_type>)
00889 __glibcxx_requires_valid_range(__first1, __last1);
00890
00891 for ( ; __first1 != __last1; ++__first1, ++__first2)
00892 std::iter_swap(__first1, __first2);
00893 return __first2;
00894 }
00895
00911 template<typename _InputIterator, typename _OutputIterator,
00912 typename _UnaryOperation>
00913 _OutputIterator
00914 transform(_InputIterator __first, _InputIterator __last,
00915 _OutputIterator __result, _UnaryOperation __unary_op)
00916 {
00917
00918 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00919 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
00920
00921 __typeof__(__unary_op(*__first))>)
00922 __glibcxx_requires_valid_range(__first, __last);
00923
00924 for ( ; __first != __last; ++__first, ++__result)
00925 *__result = __unary_op(*__first);
00926 return __result;
00927 }
00928
00946 template<typename _InputIterator1, typename _InputIterator2,
00947 typename _OutputIterator, typename _BinaryOperation>
00948 _OutputIterator
00949 transform(_InputIterator1 __first1, _InputIterator1 __last1,
00950 _InputIterator2 __first2, _OutputIterator __result,
00951 _BinaryOperation __binary_op)
00952 {
00953
00954 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
00955 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
00956 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
00957
00958 __typeof__(__binary_op(*__first1,*__first2))>)
00959 __glibcxx_requires_valid_range(__first1, __last1);
00960
00961 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
00962 *__result = __binary_op(*__first1, *__first2);
00963 return __result;
00964 }
00965
00978 template<typename _ForwardIterator, typename _Tp>
00979 void
00980 replace(_ForwardIterator __first, _ForwardIterator __last,
00981 const _Tp& __old_value, const _Tp& __new_value)
00982 {
00983
00984 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
00985 _ForwardIterator>)
00986 __glibcxx_function_requires(_EqualOpConcept<
00987 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
00988 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
00989 typename iterator_traits<_ForwardIterator>::value_type>)
00990 __glibcxx_requires_valid_range(__first, __last);
00991
00992 for ( ; __first != __last; ++__first)
00993 if (*__first == __old_value)
00994 *__first = __new_value;
00995 }
00996
01009 template<typename _ForwardIterator, typename _Predicate, typename _Tp>
01010 void
01011 replace_if(_ForwardIterator __first, _ForwardIterator __last,
01012 _Predicate __pred, const _Tp& __new_value)
01013 {
01014
01015 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01016 _ForwardIterator>)
01017 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
01018 typename iterator_traits<_ForwardIterator>::value_type>)
01019 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01020 typename iterator_traits<_ForwardIterator>::value_type>)
01021 __glibcxx_requires_valid_range(__first, __last);
01022
01023 for ( ; __first != __last; ++__first)
01024 if (__pred(*__first))
01025 *__first = __new_value;
01026 }
01027
01042 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
01043 _OutputIterator
01044 replace_copy(_InputIterator __first, _InputIterator __last,
01045 _OutputIterator __result,
01046 const _Tp& __old_value, const _Tp& __new_value)
01047 {
01048
01049 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01050 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01051 typename iterator_traits<_InputIterator>::value_type>)
01052 __glibcxx_function_requires(_EqualOpConcept<
01053 typename iterator_traits<_InputIterator>::value_type, _Tp>)
01054 __glibcxx_requires_valid_range(__first, __last);
01055
01056 for ( ; __first != __last; ++__first, ++__result)
01057 if (*__first == __old_value)
01058 *__result = __new_value;
01059 else
01060 *__result = *__first;
01061 return __result;
01062 }
01063
01078 template<typename _InputIterator, typename _OutputIterator,
01079 typename _Predicate, typename _Tp>
01080 _OutputIterator
01081 replace_copy_if(_InputIterator __first, _InputIterator __last,
01082 _OutputIterator __result,
01083 _Predicate __pred, const _Tp& __new_value)
01084 {
01085
01086 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01087 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01088 typename iterator_traits<_InputIterator>::value_type>)
01089 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01090 typename iterator_traits<_InputIterator>::value_type>)
01091 __glibcxx_requires_valid_range(__first, __last);
01092
01093 for ( ; __first != __last; ++__first, ++__result)
01094 if (__pred(*__first))
01095 *__result = __new_value;
01096 else
01097 *__result = *__first;
01098 return __result;
01099 }
01100
01112 template<typename _ForwardIterator, typename _Generator>
01113 void
01114 generate(_ForwardIterator __first, _ForwardIterator __last,
01115 _Generator __gen)
01116 {
01117
01118 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
01119 __glibcxx_function_requires(_GeneratorConcept<_Generator,
01120 typename iterator_traits<_ForwardIterator>::value_type>)
01121 __glibcxx_requires_valid_range(__first, __last);
01122
01123 for ( ; __first != __last; ++__first)
01124 *__first = __gen();
01125 }
01126
01138 template<typename _OutputIterator, typename _Size, typename _Generator>
01139 _OutputIterator
01140 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
01141 {
01142
01143 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01144
01145 __typeof__(__gen())>)
01146
01147 for ( ; __n > 0; --__n, ++__first)
01148 *__first = __gen();
01149 return __first;
01150 }
01151
01165 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
01166 _OutputIterator
01167 remove_copy(_InputIterator __first, _InputIterator __last,
01168 _OutputIterator __result, const _Tp& __value)
01169 {
01170
01171 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01172 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01173 typename iterator_traits<_InputIterator>::value_type>)
01174 __glibcxx_function_requires(_EqualOpConcept<
01175 typename iterator_traits<_InputIterator>::value_type, _Tp>)
01176 __glibcxx_requires_valid_range(__first, __last);
01177
01178 for ( ; __first != __last; ++__first)
01179 if (!(*__first == __value))
01180 {
01181 *__result = *__first;
01182 ++__result;
01183 }
01184 return __result;
01185 }
01186
01201 template<typename _InputIterator, typename _OutputIterator,
01202 typename _Predicate>
01203 _OutputIterator
01204 remove_copy_if(_InputIterator __first, _InputIterator __last,
01205 _OutputIterator __result, _Predicate __pred)
01206 {
01207
01208 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01209 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01210 typename iterator_traits<_InputIterator>::value_type>)
01211 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01212 typename iterator_traits<_InputIterator>::value_type>)
01213 __glibcxx_requires_valid_range(__first, __last);
01214
01215 for ( ; __first != __last; ++__first)
01216 if (!__pred(*__first))
01217 {
01218 *__result = *__first;
01219 ++__result;
01220 }
01221 return __result;
01222 }
01223
01240 template<typename _ForwardIterator, typename _Tp>
01241 _ForwardIterator
01242 remove(_ForwardIterator __first, _ForwardIterator __last,
01243 const _Tp& __value)
01244 {
01245
01246 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01247 _ForwardIterator>)
01248 __glibcxx_function_requires(_EqualOpConcept<
01249 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
01250 __glibcxx_requires_valid_range(__first, __last);
01251
01252 __first = std::find(__first, __last, __value);
01253 _ForwardIterator __i = __first;
01254 return __first == __last ? __first
01255 : std::remove_copy(++__i, __last,
01256 __first, __value);
01257 }
01258
01275 template<typename _ForwardIterator, typename _Predicate>
01276 _ForwardIterator
01277 remove_if(_ForwardIterator __first, _ForwardIterator __last,
01278 _Predicate __pred)
01279 {
01280
01281 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01282 _ForwardIterator>)
01283 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01284 typename iterator_traits<_ForwardIterator>::value_type>)
01285 __glibcxx_requires_valid_range(__first, __last);
01286
01287 __first = std::find_if(__first, __last, __pred);
01288 _ForwardIterator __i = __first;
01289 return __first == __last ? __first
01290 : std::remove_copy_if(++__i, __last,
01291 __first, __pred);
01292 }
01293
01301 template<typename _InputIterator, typename _OutputIterator>
01302 _OutputIterator
01303 __unique_copy(_InputIterator __first, _InputIterator __last,
01304 _OutputIterator __result,
01305 output_iterator_tag)
01306 {
01307
01308 typename iterator_traits<_InputIterator>::value_type __value = *__first;
01309 *__result = __value;
01310 while (++__first != __last)
01311 if (!(__value == *__first))
01312 {
01313 __value = *__first;
01314 *++__result = __value;
01315 }
01316 return ++__result;
01317 }
01318
01326 template<typename _InputIterator, typename _ForwardIterator>
01327 _ForwardIterator
01328 __unique_copy(_InputIterator __first, _InputIterator __last,
01329 _ForwardIterator __result,
01330 forward_iterator_tag)
01331 {
01332
01333 *__result = *__first;
01334 while (++__first != __last)
01335 if (!(*__result == *__first))
01336 *++__result = *__first;
01337 return ++__result;
01338 }
01339
01348 template<typename _InputIterator, typename _OutputIterator,
01349 typename _BinaryPredicate>
01350 _OutputIterator
01351 __unique_copy(_InputIterator __first, _InputIterator __last,
01352 _OutputIterator __result,
01353 _BinaryPredicate __binary_pred,
01354 output_iterator_tag)
01355 {
01356
01357 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01358 typename iterator_traits<_InputIterator>::value_type,
01359 typename iterator_traits<_InputIterator>::value_type>)
01360
01361 typename iterator_traits<_InputIterator>::value_type __value = *__first;
01362 *__result = __value;
01363 while (++__first != __last)
01364 if (!__binary_pred(__value, *__first))
01365 {
01366 __value = *__first;
01367 *++__result = __value;
01368 }
01369 return ++__result;
01370 }
01371
01380 template<typename _InputIterator, typename _ForwardIterator,
01381 typename _BinaryPredicate>
01382 _ForwardIterator
01383 __unique_copy(_InputIterator __first, _InputIterator __last,
01384 _ForwardIterator __result,
01385 _BinaryPredicate __binary_pred,
01386 forward_iterator_tag)
01387 {
01388
01389 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01390 typename iterator_traits<_ForwardIterator>::value_type,
01391 typename iterator_traits<_InputIterator>::value_type>)
01392
01393 *__result = *__first;
01394 while (++__first != __last)
01395 if (!__binary_pred(*__result, *__first)) *++__result = *__first;
01396 return ++__result;
01397 }
01398
01412 template<typename _InputIterator, typename _OutputIterator>
01413 inline _OutputIterator
01414 unique_copy(_InputIterator __first, _InputIterator __last,
01415 _OutputIterator __result)
01416 {
01417
01418 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01419 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01420 typename iterator_traits<_InputIterator>::value_type>)
01421 __glibcxx_function_requires(_EqualityComparableConcept<
01422 typename iterator_traits<_InputIterator>::value_type>)
01423 __glibcxx_requires_valid_range(__first, __last);
01424
01425 typedef typename iterator_traits<_OutputIterator>::iterator_category
01426 _IterType;
01427
01428 if (__first == __last) return __result;
01429 return std::__unique_copy(__first, __last, __result, _IterType());
01430 }
01431
01447 template<typename _InputIterator, typename _OutputIterator,
01448 typename _BinaryPredicate>
01449 inline _OutputIterator
01450 unique_copy(_InputIterator __first, _InputIterator __last,
01451 _OutputIterator __result,
01452 _BinaryPredicate __binary_pred)
01453 {
01454
01455 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01456 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01457 typename iterator_traits<_InputIterator>::value_type>)
01458 __glibcxx_requires_valid_range(__first, __last);
01459
01460 typedef typename iterator_traits<_OutputIterator>::iterator_category
01461 _IterType;
01462
01463 if (__first == __last) return __result;
01464 return std::__unique_copy(__first, __last, __result,
01465 __binary_pred, _IterType());
01466 }
01467
01481 template<typename _ForwardIterator>
01482 _ForwardIterator
01483 unique(_ForwardIterator __first, _ForwardIterator __last)
01484 {
01485
01486 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01487 _ForwardIterator>)
01488 __glibcxx_function_requires(_EqualityComparableConcept<
01489 typename iterator_traits<_ForwardIterator>::value_type>)
01490 __glibcxx_requires_valid_range(__first, __last);
01491
01492
01493 __first = std::adjacent_find(__first, __last);
01494 if (__first == __last)
01495 return __last;
01496
01497
01498 _ForwardIterator __dest = __first;
01499 ++__first;
01500 while (++__first != __last)
01501 if (!(*__dest == *__first))
01502 *++__dest = *__first;
01503 return ++__dest;
01504 }
01505
01520 template<typename _ForwardIterator, typename _BinaryPredicate>
01521 _ForwardIterator
01522 unique(_ForwardIterator __first, _ForwardIterator __last,
01523 _BinaryPredicate __binary_pred)
01524 {
01525
01526 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01527 _ForwardIterator>)
01528 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01529 typename iterator_traits<_ForwardIterator>::value_type,
01530 typename iterator_traits<_ForwardIterator>::value_type>)
01531 __glibcxx_requires_valid_range(__first, __last);
01532
01533
01534 __first = std::adjacent_find(__first, __last, __binary_pred);
01535 if (__first == __last)
01536 return __last;
01537
01538
01539 _ForwardIterator __dest = __first;
01540 ++__first;
01541 while (++__first != __last)
01542 if (!__binary_pred(*__dest, *__first))
01543 *++__dest = *__first;
01544 return ++__dest;
01545 }
01546
01554 template<typename _BidirectionalIterator>
01555 void
01556 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
01557 bidirectional_iterator_tag)
01558 {
01559 while (true)
01560 if (__first == __last || __first == --__last)
01561 return;
01562 else
01563 {
01564 std::iter_swap(__first, __last);
01565 ++__first;
01566 }
01567 }
01568
01576 template<typename _RandomAccessIterator>
01577 void
01578 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
01579 random_access_iterator_tag)
01580 {
01581 if (__first == __last)
01582 return;
01583 --__last;
01584 while (__first < __last)
01585 {
01586 std::iter_swap(__first, __last);
01587 ++__first;
01588 --__last;
01589 }
01590 }
01591
01603 template<typename _BidirectionalIterator>
01604 inline void
01605 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
01606 {
01607
01608 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
01609 _BidirectionalIterator>)
01610 __glibcxx_requires_valid_range(__first, __last);
01611 std::__reverse(__first, __last, std::__iterator_category(__first));
01612 }
01613
01629 template<typename _BidirectionalIterator, typename _OutputIterator>
01630 _OutputIterator
01631 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
01632 _OutputIterator __result)
01633 {
01634
01635 __glibcxx_function_requires(_BidirectionalIteratorConcept<
01636 _BidirectionalIterator>)
01637 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01638 typename iterator_traits<_BidirectionalIterator>::value_type>)
01639 __glibcxx_requires_valid_range(__first, __last);
01640
01641 while (__first != __last)
01642 {
01643 --__last;
01644 *__result = *__last;
01645 ++__result;
01646 }
01647 return __result;
01648 }
01649
01650
01657 template<typename _EuclideanRingElement>
01658 _EuclideanRingElement
01659 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
01660 {
01661 while (__n != 0)
01662 {
01663 _EuclideanRingElement __t = __m % __n;
01664 __m = __n;
01665 __n = __t;
01666 }
01667 return __m;
01668 }
01669
01675 template<typename _ForwardIterator>
01676 void
01677 __rotate(_ForwardIterator __first,
01678 _ForwardIterator __middle,
01679 _ForwardIterator __last,
01680 forward_iterator_tag)
01681 {
01682 if (__first == __middle || __last == __middle)
01683 return;
01684
01685 _ForwardIterator __first2 = __middle;
01686 do
01687 {
01688 swap(*__first, *__first2);
01689 ++__first;
01690 ++__first2;
01691 if (__first == __middle)
01692 __middle = __first2;
01693 }
01694 while (__first2 != __last);
01695
01696 __first2 = __middle;
01697
01698 while (__first2 != __last)
01699 {
01700 swap(*__first, *__first2);
01701 ++__first;
01702 ++__first2;
01703 if (__first == __middle)
01704 __middle = __first2;
01705 else if (__first2 == __last)
01706 __first2 = __middle;
01707 }
01708 }
01709
01715 template<typename _BidirectionalIterator>
01716 void
01717 __rotate(_BidirectionalIterator __first,
01718 _BidirectionalIterator __middle,
01719 _BidirectionalIterator __last,
01720 bidirectional_iterator_tag)
01721 {
01722
01723 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
01724 _BidirectionalIterator>)
01725
01726 if (__first == __middle || __last == __middle)
01727 return;
01728
01729 std::__reverse(__first, __middle, bidirectional_iterator_tag());
01730 std::__reverse(__middle, __last, bidirectional_iterator_tag());
01731
01732 while (__first != __middle && __middle != __last)
01733 {
01734 swap(*__first, *--__last);
01735 ++__first;
01736 }
01737
01738 if (__first == __middle)
01739 std::__reverse(__middle, __last, bidirectional_iterator_tag());
01740 else
01741 std::__reverse(__first, __middle, bidirectional_iterator_tag());
01742 }
01743
01749 template<typename _RandomAccessIterator>
01750 void
01751 __rotate(_RandomAccessIterator __first,
01752 _RandomAccessIterator __middle,
01753 _RandomAccessIterator __last,
01754 random_access_iterator_tag)
01755 {
01756
01757 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
01758 _RandomAccessIterator>)
01759
01760 if (__first == __middle || __last == __middle)
01761 return;
01762
01763 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
01764 _Distance;
01765 typedef typename iterator_traits<_RandomAccessIterator>::value_type
01766 _ValueType;
01767
01768 const _Distance __n = __last - __first;
01769 const _Distance __k = __middle - __first;
01770 const _Distance __l = __n - __k;
01771
01772 if (__k == __l)
01773 {
01774 std::swap_ranges(__first, __middle, __middle);
01775 return;
01776 }
01777
01778 const _Distance __d = __gcd(__n, __k);
01779
01780 for (_Distance __i = 0; __i < __d; __i++)
01781 {
01782 _ValueType __tmp = *__first;
01783 _RandomAccessIterator __p = __first;
01784
01785 if (__k < __l)
01786 {
01787 for (_Distance __j = 0; __j < __l / __d; __j++)
01788 {
01789 if (__p > __first + __l)
01790 {
01791 *__p = *(__p - __l);
01792 __p -= __l;
01793 }
01794
01795 *__p = *(__p + __k);
01796 __p += __k;
01797 }
01798 }
01799 else
01800 {
01801 for (_Distance __j = 0; __j < __k / __d - 1; __j ++)
01802 {
01803 if (__p < __last - __k)
01804 {
01805 *__p = *(__p + __k);
01806 __p += __k;
01807 }
01808 *__p = * (__p - __l);
01809 __p -= __l;
01810 }
01811 }
01812
01813 *__p = __tmp;
01814 ++__first;
01815 }
01816 }
01817
01836 template<typename _ForwardIterator>
01837 inline void
01838 rotate(_ForwardIterator __first, _ForwardIterator __middle,
01839 _ForwardIterator __last)
01840 {
01841
01842 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01843 _ForwardIterator>)
01844 __glibcxx_requires_valid_range(__first, __middle);
01845 __glibcxx_requires_valid_range(__middle, __last);
01846
01847 typedef typename iterator_traits<_ForwardIterator>::iterator_category
01848 _IterType;
01849 std::__rotate(__first, __middle, __last, _IterType());
01850 }
01851
01869 template<typename _ForwardIterator, typename _OutputIterator>
01870 _OutputIterator
01871 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
01872 _ForwardIterator __last, _OutputIterator __result)
01873 {
01874
01875 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
01876 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01877 typename iterator_traits<_ForwardIterator>::value_type>)
01878 __glibcxx_requires_valid_range(__first, __middle);
01879 __glibcxx_requires_valid_range(__middle, __last);
01880
01881 return std::copy(__first, __middle,
01882 std::copy(__middle, __last, __result));
01883 }
01884
01895 template<typename _RandomAccessIterator>
01896 inline void
01897 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
01898 {
01899
01900 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
01901 _RandomAccessIterator>)
01902 __glibcxx_requires_valid_range(__first, __last);
01903
01904 if (__first != __last)
01905 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
01906 std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
01907 }
01908
01922 template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
01923 void
01924 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
01925 _RandomNumberGenerator& __rand)
01926 {
01927
01928 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
01929 _RandomAccessIterator>)
01930 __glibcxx_requires_valid_range(__first, __last);
01931
01932 if (__first == __last)
01933 return;
01934 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
01935 std::iter_swap(__i, __first + __rand((__i - __first) + 1));
01936 }
01937
01938
01944 template<typename _ForwardIterator, typename _Predicate>
01945 _ForwardIterator
01946 __partition(_ForwardIterator __first, _ForwardIterator __last,
01947 _Predicate __pred,
01948 forward_iterator_tag)
01949 {
01950 if (__first == __last)
01951 return __first;
01952
01953 while (__pred(*__first))
01954 if (++__first == __last)
01955 return __first;
01956
01957 _ForwardIterator __next = __first;
01958
01959 while (++__next != __last)
01960 if (__pred(*__next))
01961 {
01962 swap(*__first, *__next);
01963 ++__first;
01964 }
01965
01966 return __first;
01967 }
01968
01974 template<typename _BidirectionalIterator, typename _Predicate>
01975 _BidirectionalIterator
01976 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
01977 _Predicate __pred,
01978 bidirectional_iterator_tag)
01979 {
01980 while (true)
01981 {
01982 while (true)
01983 if (__first == __last)
01984 return __first;
01985 else if (__pred(*__first))
01986 ++__first;
01987 else
01988 break;
01989 --__last;
01990 while (true)
01991 if (__first == __last)
01992 return __first;
01993 else if (!__pred(*__last))
01994 --__last;
01995 else
01996 break;
01997 std::iter_swap(__first, __last);
01998 ++__first;
01999 }
02000 }
02001
02016 template<typename _ForwardIterator, typename _Predicate>
02017 inline _ForwardIterator
02018 partition(_ForwardIterator __first, _ForwardIterator __last,
02019 _Predicate __pred)
02020 {
02021
02022 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
02023 _ForwardIterator>)
02024 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
02025 typename iterator_traits<_ForwardIterator>::value_type>)
02026 __glibcxx_requires_valid_range(__first, __last);
02027
02028 return std::__partition(__first, __last, __pred,
02029 std::__iterator_category(__first));
02030 }
02031
02032
02038 template<typename _ForwardIterator, typename _Predicate, typename _Distance>
02039 _ForwardIterator
02040 __inplace_stable_partition(_ForwardIterator __first,
02041 _ForwardIterator __last,
02042 _Predicate __pred, _Distance __len)
02043 {
02044 if (__len == 1)
02045 return __pred(*__first) ? __last : __first;
02046 _ForwardIterator __middle = __first;
02047 std::advance(__middle, __len / 2);
02048 _ForwardIterator __begin = std::__inplace_stable_partition(__first,
02049 __middle,
02050 __pred,
02051 __len / 2);
02052 _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
02053 __pred,
02054 __len
02055 - __len / 2);
02056 std::rotate(__begin, __middle, __end);
02057 std::advance(__begin, std::distance(__middle, __end));
02058 return __begin;
02059 }
02060
02066 template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
02067 typename _Distance>
02068 _ForwardIterator
02069 __stable_partition_adaptive(_ForwardIterator __first,
02070 _ForwardIterator __last,
02071 _Predicate __pred, _Distance __len,
02072 _Pointer __buffer,
02073 _Distance __buffer_size)
02074 {
02075 if (__len <= __buffer_size)
02076 {
02077 _ForwardIterator __result1 = __first;
02078 _Pointer __result2 = __buffer;
02079 for ( ; __first != __last ; ++__first)
02080 if (__pred(*__first))
02081 {
02082 *__result1 = *__first;
02083 ++__result1;
02084 }
02085 else
02086 {
02087 *__result2 = *__first;
02088 ++__result2;
02089 }
02090 std::copy(__buffer, __result2, __result1);
02091 return __result1;
02092 }
02093 else
02094 {
02095 _ForwardIterator __middle = __first;
02096 std::advance(__middle, __len / 2);
02097 _ForwardIterator __begin =
02098 std::__stable_partition_adaptive(__first, __middle, __pred,
02099 __len / 2, __buffer,
02100 __buffer_size);
02101 _ForwardIterator __end =
02102 std::__stable_partition_adaptive(__middle, __last, __pred,
02103 __len - __len / 2,
02104 __buffer, __buffer_size);
02105 std::rotate(__begin, __middle, __end);
02106 std::advance(__begin, std::distance(__middle, __end));
02107 return __begin;
02108 }
02109 }
02110
02127 template<typename _ForwardIterator, typename _Predicate>
02128 _ForwardIterator
02129 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
02130 _Predicate __pred)
02131 {
02132
02133 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
02134 _ForwardIterator>)
02135 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
02136 typename iterator_traits<_ForwardIterator>::value_type>)
02137 __glibcxx_requires_valid_range(__first, __last);
02138
02139 if (__first == __last)
02140 return __first;
02141 else
02142 {
02143 typedef typename iterator_traits<_ForwardIterator>::value_type
02144 _ValueType;
02145 typedef typename iterator_traits<_ForwardIterator>::difference_type
02146 _DistanceType;
02147
02148 _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
02149 __last);
02150 if (__buf.size() > 0)
02151 return
02152 std::__stable_partition_adaptive(__first, __last, __pred,
02153 _DistanceType(__buf.requested_size()),
02154 __buf.begin(), __buf.size());
02155 else
02156 return
02157 std::__inplace_stable_partition(__first, __last, __pred,
02158 _DistanceType(__buf.requested_size()));
02159 }
02160 }
02161
02167 template<typename _RandomAccessIterator, typename _Tp>
02168 _RandomAccessIterator
02169 __unguarded_partition(_RandomAccessIterator __first,
02170 _RandomAccessIterator __last, _Tp __pivot)
02171 {
02172 while (true)
02173 {
02174 while (*__first < __pivot)
02175 ++__first;
02176 --__last;
02177 while (__pivot < *__last)
02178 --__last;
02179 if (!(__first < __last))
02180 return __first;
02181 std::iter_swap(__first, __last);
02182 ++__first;
02183 }
02184 }
02185
02191 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
02192 _RandomAccessIterator
02193 __unguarded_partition(_RandomAccessIterator __first,
02194 _RandomAccessIterator __last,
02195 _Tp __pivot, _Compare __comp)
02196 {
02197 while (true)
02198 {
02199 while (__comp(*__first, __pivot))
02200 ++__first;
02201 --__last;
02202 while (__comp(__pivot, *__last))
02203 --__last;
02204 if (!(__first < __last))
02205 return __first;
02206 std::iter_swap(__first, __last);
02207 ++__first;
02208 }
02209 }
02210
02217 enum { _S_threshold = 16 };
02218
02224 template<typename _RandomAccessIterator, typename _Tp>
02225 void
02226 __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val)
02227 {
02228 _RandomAccessIterator __next = __last;
02229 --__next;
02230 while (__val < *__next)
02231 {
02232 *__last = *__next;
02233 __last = __next;
02234 --__next;
02235 }
02236 *__last = __val;
02237 }
02238
02244 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
02245 void
02246 __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val,
02247 _Compare __comp)
02248 {
02249 _RandomAccessIterator __next = __last;
02250 --__next;
02251 while (__comp(__val, *__next))
02252 {
02253 *__last = *__next;
02254 __last = __next;
02255 --__next;
02256 }
02257 *__last = __val;
02258 }
02259
02265 template<typename _RandomAccessIterator>
02266 void
02267 __insertion_sort(_RandomAccessIterator __first,
02268 _RandomAccessIterator __last)
02269 {
02270 if (__first == __last)
02271 return;
02272
02273 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
02274 {
02275 typename iterator_traits<_RandomAccessIterator>::value_type
02276 __val = *__i;
02277 if (__val < *__first)
02278 {
02279 std::copy_backward(__first, __i, __i + 1);
02280 *__first = __val;
02281 }
02282 else
02283 std::__unguarded_linear_insert(__i, __val);
02284 }
02285 }
02286
02292 template<typename _RandomAccessIterator, typename _Compare>
02293 void
02294 __insertion_sort(_RandomAccessIterator __first,
02295 _RandomAccessIterator __last, _Compare __comp)
02296 {
02297 if (__first == __last) return;
02298
02299 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
02300 {
02301 typename iterator_traits<_RandomAccessIterator>::value_type
02302 __val = *__i;
02303 if (__comp(__val, *__first))
02304 {
02305 std::copy_backward(__first, __i, __i + 1);
02306 *__first = __val;
02307 }
02308 else
02309 std::__unguarded_linear_insert(__i, __val, __comp);
02310 }
02311 }
02312
02318 template<typename _RandomAccessIterator>
02319 inline void
02320 __unguarded_insertion_sort(_RandomAccessIterator __first,
02321 _RandomAccessIterator __last)
02322 {
02323 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02324 _ValueType;
02325
02326 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
02327 std::__unguarded_linear_insert(__i, _ValueType(*__i));
02328 }
02329
02335 template<typename _RandomAccessIterator, typename _Compare>
02336 inline void
02337 __unguarded_insertion_sort(_RandomAccessIterator __first,
02338 _RandomAccessIterator __last, _Compare __comp)
02339 {
02340 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02341 _ValueType;
02342
02343 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
02344 std::__unguarded_linear_insert(__i, _ValueType(*__i), __comp);
02345 }
02346
02352 template<typename _RandomAccessIterator>
02353 void
02354 __final_insertion_sort(_RandomAccessIterator __first,
02355 _RandomAccessIterator __last)
02356 {
02357 if (__last - __first > int(_S_threshold))
02358 {
02359 std::__insertion_sort(__first, __first + int(_S_threshold));
02360 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
02361 }
02362 else
02363 std::__insertion_sort(__first, __last);
02364 }
02365
02371 template<typename _RandomAccessIterator, typename _Compare>
02372 void
02373 __final_insertion_sort(_RandomAccessIterator __first,
02374 _RandomAccessIterator __last, _Compare __comp)
02375 {
02376 if (__last - __first > int(_S_threshold))
02377 {
02378 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
02379 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
02380 __comp);
02381 }
02382 else
02383 std::__insertion_sort(__first, __last, __comp);
02384 }
02385
02391 template<typename _Size>
02392 inline _Size
02393 __lg(_Size __n)
02394 {
02395 _Size __k;
02396 for (__k = 0; __n != 1; __n >>= 1)
02397 ++__k;
02398 return __k;
02399 }
02400
02416 template<typename _RandomAccessIterator>
02417 void
02418 partial_sort(_RandomAccessIterator __first,
02419 _RandomAccessIterator __middle,
02420 _RandomAccessIterator __last)
02421 {
02422 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02423 _ValueType;
02424
02425
02426 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02427 _RandomAccessIterator>)
02428 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
02429 __glibcxx_requires_valid_range(__first, __middle);
02430 __glibcxx_requires_valid_range(__middle, __last);
02431
02432 std::make_heap(__first, __middle);
02433 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
02434 if (*__i < *__first)
02435 std::__pop_heap(__first, __middle, __i, _ValueType(*__i));
02436 std::sort_heap(__first, __middle);
02437 }
02438
02457 template<typename _RandomAccessIterator, typename _Compare>
02458 void
02459 partial_sort(_RandomAccessIterator __first,
02460 _RandomAccessIterator __middle,
02461 _RandomAccessIterator __last,
02462 _Compare __comp)
02463 {
02464 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02465 _ValueType;
02466
02467
02468 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02469 _RandomAccessIterator>)
02470 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02471 _ValueType, _ValueType>)
02472 __glibcxx_requires_valid_range(__first, __middle);
02473 __glibcxx_requires_valid_range(__middle, __last);
02474
02475 std::make_heap(__first, __middle, __comp);
02476 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
02477 if (__comp(*__i, *__first))
02478 std::__pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
02479 std::sort_heap(__first, __middle, __comp);
02480 }
02481
02499 template<typename _InputIterator, typename _RandomAccessIterator>
02500 _RandomAccessIterator
02501 partial_sort_copy(_InputIterator __first, _InputIterator __last,
02502 _RandomAccessIterator __result_first,
02503 _RandomAccessIterator __result_last)
02504 {
02505 typedef typename iterator_traits<_InputIterator>::value_type
02506 _InputValueType;
02507 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02508 _OutputValueType;
02509 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
02510 _DistanceType;
02511
02512
02513 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
02514 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
02515 _OutputValueType>)
02516 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
02517 __glibcxx_function_requires(_LessThanComparableConcept<_InputValueType>)
02518 __glibcxx_requires_valid_range(__first, __last);
02519 __glibcxx_requires_valid_range(__result_first, __result_last);
02520
02521 if (__result_first == __result_last)
02522 return __result_last;
02523 _RandomAccessIterator __result_real_last = __result_first;
02524 while(__first != __last && __result_real_last != __result_last)
02525 {
02526 *__result_real_last = *__first;
02527 ++__result_real_last;
02528 ++__first;
02529 }
02530 std::make_heap(__result_first, __result_real_last);
02531 while (__first != __last)
02532 {
02533 if (*__first < *__result_first)
02534 std::__adjust_heap(__result_first, _DistanceType(0),
02535 _DistanceType(__result_real_last
02536 - __result_first),
02537 _InputValueType(*__first));
02538 ++__first;
02539 }
02540 std::sort_heap(__result_first, __result_real_last);
02541 return __result_real_last;
02542 }
02543
02563 template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
02564 _RandomAccessIterator
02565 partial_sort_copy(_InputIterator __first, _InputIterator __last,
02566 _RandomAccessIterator __result_first,
02567 _RandomAccessIterator __result_last,
02568 _Compare __comp)
02569 {
02570 typedef typename iterator_traits<_InputIterator>::value_type
02571 _InputValueType;
02572 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02573 _OutputValueType;
02574 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
02575 _DistanceType;
02576
02577
02578 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
02579 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02580 _RandomAccessIterator>)
02581 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
02582 _OutputValueType>)
02583 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02584 _OutputValueType, _OutputValueType>)
02585 __glibcxx_requires_valid_range(__first, __last);
02586 __glibcxx_requires_valid_range(__result_first, __result_last);
02587
02588 if (__result_first == __result_last)
02589 return __result_last;
02590 _RandomAccessIterator __result_real_last = __result_first;
02591 while(__first != __last && __result_real_last != __result_last)
02592 {
02593 *__result_real_last = *__first;
02594 ++__result_real_last;
02595 ++__first;
02596 }
02597 std::make_heap(__result_first, __result_real_last, __comp);
02598 while (__first != __last)
02599 {
02600 if (__comp(*__first, *__result_first))
02601 std::__adjust_heap(__result_first, _DistanceType(0),
02602 _DistanceType(__result_real_last
02603 - __result_first),
02604 _InputValueType(*__first),
02605 __comp);
02606 ++__first;
02607 }
02608 std::sort_heap(__result_first, __result_real_last, __comp);
02609 return __result_real_last;
02610 }
02611
02617 template<typename _RandomAccessIterator, typename _Size>
02618 void
02619 __introsort_loop(_RandomAccessIterator __first,
02620 _RandomAccessIterator __last,
02621 _Size __depth_limit)
02622 {
02623 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02624 _ValueType;
02625
02626 while (__last - __first > int(_S_threshold))
02627 {
02628 if (__depth_limit == 0)
02629 {
02630 std::partial_sort(__first, __last, __last);
02631 return;
02632 }
02633 --__depth_limit;
02634 _RandomAccessIterator __cut =
02635 std::__unguarded_partition(__first, __last,
02636 _ValueType(std::__median(*__first,
02637 *(__first
02638 + (__last
02639 - __first)
02640 / 2),
02641 *(__last
02642 - 1))));
02643 std::__introsort_loop(__cut, __last, __depth_limit);
02644 __last = __cut;
02645 }
02646 }
02647
02653 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
02654 void
02655 __introsort_loop(_RandomAccessIterator __first,
02656 _RandomAccessIterator __last,
02657 _Size __depth_limit, _Compare __comp)
02658 {
02659 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02660 _ValueType;
02661
02662 while (__last - __first > int(_S_threshold))
02663 {
02664 if (__depth_limit == 0)
02665 {
02666 std::partial_sort(__first, __last, __last, __comp);
02667 return;
02668 }
02669 --__depth_limit;
02670 _RandomAccessIterator __cut =
02671 std::__unguarded_partition(__first, __last,
02672 _ValueType(std::__median(*__first,
02673 *(__first
02674 + (__last
02675 - __first)
02676 / 2),
02677 *(__last - 1),
02678 __comp)),
02679 __comp);
02680 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
02681 __last = __cut;
02682 }
02683 }
02684
02698 template<typename _RandomAccessIterator>
02699 inline void
02700 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
02701 {
02702 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02703 _ValueType;
02704
02705
02706 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02707 _RandomAccessIterator>)
02708 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
02709 __glibcxx_requires_valid_range(__first, __last);
02710
02711 if (__first != __last)
02712 {
02713 std::__introsort_loop(__first, __last, __lg(__last - __first) * 2);
02714 std::__final_insertion_sort(__first, __last);
02715 }
02716 }
02717
02732 template<typename _RandomAccessIterator, typename _Compare>
02733 inline void
02734 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
02735 _Compare __comp)
02736 {
02737 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02738 _ValueType;
02739
02740
02741 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02742 _RandomAccessIterator>)
02743 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
02744 _ValueType>)
02745 __glibcxx_requires_valid_range(__first, __last);
02746
02747 if (__first != __last)
02748 {
02749 std::__introsort_loop(__first, __last, __lg(__last - __first) * 2,
02750 __comp);
02751 std::__final_insertion_sort(__first, __last, __comp);
02752 }
02753 }
02754
02765 template<typename _ForwardIterator, typename _Tp>
02766 _ForwardIterator
02767 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
02768 const _Tp& __val)
02769 {
02770 typedef typename iterator_traits<_ForwardIterator>::value_type
02771 _ValueType;
02772 typedef typename iterator_traits<_ForwardIterator>::difference_type
02773 _DistanceType;
02774
02775
02776
02777
02778
02779
02780 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02781 __glibcxx_function_requires(_SameTypeConcept<_Tp, _ValueType>)
02782 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
02783 __glibcxx_requires_partitioned(__first, __last, __val);
02784
02785 _DistanceType __len = std::distance(__first, __last);
02786 _DistanceType __half;
02787 _ForwardIterator __middle;
02788
02789 while (__len > 0)
02790 {
02791 __half = __len >> 1;
02792 __middle = __first;
02793 std::advance(__middle, __half);
02794 if (*__middle < __val)
02795 {
02796 __first = __middle;
02797 ++__first;
02798 __len = __len - __half - 1;
02799 }
02800 else
02801 __len = __half;
02802 }
02803 return __first;
02804 }
02805
02820 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02821 _ForwardIterator
02822 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
02823 const _Tp& __val, _Compare __comp)
02824 {
02825 typedef typename iterator_traits<_ForwardIterator>::value_type
02826 _ValueType;
02827 typedef typename iterator_traits<_ForwardIterator>::difference_type
02828 _DistanceType;
02829
02830
02831 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02832 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02833 _ValueType, _Tp>)
02834 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
02835
02836 _DistanceType __len = std::distance(__first, __last);
02837 _DistanceType __half;
02838 _ForwardIterator __middle;
02839
02840 while (__len > 0)
02841 {
02842 __half = __len >> 1;
02843 __middle = __first;
02844 std::advance(__middle, __half);
02845 if (__comp(*__middle, __val))
02846 {
02847 __first = __middle;
02848 ++__first;
02849 __len = __len - __half - 1;
02850 }
02851 else
02852 __len = __half;
02853 }
02854 return __first;
02855 }
02856
02867 template<typename _ForwardIterator, typename _Tp>
02868 _ForwardIterator
02869 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
02870 const _Tp& __val)
02871 {
02872 typedef typename iterator_traits<_ForwardIterator>::value_type
02873 _ValueType;
02874 typedef typename iterator_traits<_ForwardIterator>::difference_type
02875 _DistanceType;
02876
02877
02878
02879 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02880 __glibcxx_function_requires(_SameTypeConcept<_Tp, _ValueType>)
02881 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
02882 __glibcxx_requires_partitioned(__first, __last, __val);
02883
02884 _DistanceType __len = std::distance(__first, __last);
02885 _DistanceType __half;
02886 _ForwardIterator __middle;
02887
02888 while (__len > 0)
02889 {
02890 __half = __len >> 1;
02891 __middle = __first;
02892 std::advance(__middle, __half);
02893 if (__val < *__middle)
02894 __len = __half;
02895 else
02896 {
02897 __first = __middle;
02898 ++__first;
02899 __len = __len - __half - 1;
02900 }
02901 }
02902 return __first;
02903 }
02904
02919 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02920 _ForwardIterator
02921 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
02922 const _Tp& __val, _Compare __comp)
02923 {
02924 typedef typename iterator_traits<_ForwardIterator>::value_type
02925 _ValueType;
02926 typedef typename iterator_traits<_ForwardIterator>::difference_type
02927 _DistanceType;
02928
02929
02930 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02931 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02932 _Tp, _ValueType>)
02933 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
02934
02935 _DistanceType __len = std::distance(__first, __last);
02936 _DistanceType __half;
02937 _ForwardIterator __middle;
02938
02939 while (__len > 0)
02940 {
02941 __half = __len >> 1;
02942 __middle = __first;
02943 std::advance(__middle, __half);
02944 if (__comp(__val, *__middle))
02945 __len = __half;
02946 else
02947 {
02948 __first = __middle;
02949 ++__first;
02950 __len = __len - __half - 1;
02951 }
02952 }
02953 return __first;
02954 }
02955
02961 template<typename _BidirectionalIterator, typename _Distance>
02962 void
02963 __merge_without_buffer(_BidirectionalIterator __first,
02964 _BidirectionalIterator __middle,
02965 _BidirectionalIterator __last,
02966 _Distance __len1, _Distance __len2)
02967 {
02968 if (__len1 == 0 || __len2 == 0)
02969 return;
02970 if (__len1 + __len2 == 2)
02971 {
02972 if (*__middle < *__first)
02973 std::iter_swap(__first, __middle);
02974 return;
02975 }
02976 _BidirectionalIterator __first_cut = __first;
02977 _BidirectionalIterator __second_cut = __middle;
02978 _Distance __len11 = 0;
02979 _Distance __len22 = 0;
02980 if (__len1 > __len2)
02981 {
02982 __len11 = __len1 / 2;
02983 std::advance(__first_cut, __len11);
02984 __second_cut = std::lower_bound(__middle, __last, *__first_cut);
02985 __len22 = std::distance(__middle, __second_cut);
02986 }
02987 else
02988 {
02989 __len22 = __len2 / 2;
02990 std::advance(__second_cut, __len22);
02991 __first_cut = std::upper_bound(__first, __middle, *__second_cut);
02992 __len11 = std::distance(__first, __first_cut);
02993 }
02994 std::rotate(__first_cut, __middle, __second_cut);
02995 _BidirectionalIterator __new_middle = __first_cut;
02996 std::advance(__new_middle, std::distance(__middle, __second_cut));
02997 std::__merge_without_buffer(__first, __first_cut, __new_middle,
02998 __len11, __len22);
02999 std::__merge_without_buffer(__new_middle, __second_cut, __last,
03000 __len1 - __len11, __len2 - __len22);
03001 }
03002
03008 template<typename _BidirectionalIterator, typename _Distance,
03009 typename _Compare>
03010 void
03011 __merge_without_buffer(_BidirectionalIterator __first,
03012 _BidirectionalIterator __middle,
03013 _BidirectionalIterator __last,
03014 _Distance __len1, _Distance __len2,
03015 _Compare __comp)
03016 {
03017 if (__len1 == 0 || __len2 == 0)
03018 return;
03019 if (__len1 + __len2 == 2)
03020 {
03021 if (__comp(*__middle, *__first))
03022 std::iter_swap(__first, __middle);
03023 return;
03024 }
03025 _BidirectionalIterator __first_cut = __first;
03026 _BidirectionalIterator __second_cut = __middle;
03027 _Distance __len11 = 0;
03028 _Distance __len22 = 0;
03029 if (__len1 > __len2)
03030 {
03031 __len11 = __len1 / 2;
03032 std::advance(__first_cut, __len11);
03033 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
03034 __comp);
03035 __len22 = std::distance(__middle, __second_cut);
03036 }
03037 else
03038 {
03039 __len22 = __len2 / 2;
03040 std::advance(__second_cut, __len22);
03041 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
03042 __comp);
03043 __len11 = std::distance(__first, __first_cut);
03044 }
03045 std::rotate(__first_cut, __middle, __second_cut);
03046 _BidirectionalIterator __new_middle = __first_cut;
03047 std::advance(__new_middle, std::distance(__middle, __second_cut));
03048 std::__merge_without_buffer(__first, __first_cut, __new_middle,
03049 __len11, __len22, __comp);
03050 std::__merge_without_buffer(__new_middle, __second_cut, __last,
03051 __len1 - __len11, __len2 - __len22, __comp);
03052 }
03053
03059 template<typename _RandomAccessIterator>
03060 void
03061 __inplace_stable_sort(_RandomAccessIterator __first,
03062 _RandomAccessIterator __last)
03063 {
03064 if (__last - __first < 15)
03065 {
03066 std::__insertion_sort(__first, __last);
03067 return;
03068 }
03069 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
03070 std::__inplace_stable_sort(__first, __middle);
03071 std::__inplace_stable_sort(__middle, __last);
03072 std::__merge_without_buffer(__first, __middle, __last,
03073 __middle - __first,
03074 __last - __middle);
03075 }
03076
03082 template<typename _RandomAccessIterator, typename _Compare>
03083 void
03084 __inplace_stable_sort(_RandomAccessIterator __first,
03085 _RandomAccessIterator __last, _Compare __comp)
03086 {
03087 if (__last - __first < 15)
03088 {
03089 std::__insertion_sort(__first, __last, __comp);
03090 return;
03091 }
03092 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
03093 std::__inplace_stable_sort(__first, __middle, __comp);
03094 std::__inplace_stable_sort(__middle, __last, __comp);
03095 std::__merge_without_buffer(__first, __middle, __last,
03096 __middle - __first,
03097 __last - __middle,
03098 __comp);
03099 }
03100
03117 template<typename _InputIterator1, typename _InputIterator2,
03118 typename _OutputIterator>
03119 _OutputIterator
03120 merge(_InputIterator1 __first1, _InputIterator1 __last1,
03121 _InputIterator2 __first2, _InputIterator2 __last2,
03122 _OutputIterator __result)
03123 {
03124
03125 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
03126 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
03127 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
03128 typename iterator_traits<_InputIterator1>::value_type>)
03129 __glibcxx_function_requires(_SameTypeConcept<
03130 typename iterator_traits<_InputIterator1>::value_type,
03131 typename iterator_traits<_InputIterator2>::value_type>)
03132 __glibcxx_function_requires(_LessThanComparableConcept<
03133 typename iterator_traits<_InputIterator1>::value_type>)
03134 __glibcxx_requires_sorted(__first1, __last1);
03135 __glibcxx_requires_sorted(__first2, __last2);
03136
03137 while (__first1 != __last1 && __first2 != __last2)
03138 {
03139 if (*__first2 < *__first1)
03140 {
03141 *__result = *__first2;
03142 ++__first2;
03143 }
03144 else
03145 {
03146 *__result = *__first1;
03147 ++__first1;
03148 }
03149 ++__result;
03150 }
03151 return std::copy(__first2, __last2, std::copy(__first1, __last1,
03152 __result));
03153 }
03154
03175 template<typename _InputIterator1, typename _InputIterator2,
03176 typename _OutputIterator, typename _Compare>
03177 _OutputIterator
03178 merge(_InputIterator1 __first1, _InputIterator1 __last1,
03179 _InputIterator2 __first2, _InputIterator2 __last2,
03180 _OutputIterator __result, _Compare __comp)
03181 {
03182
03183 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
03184 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
03185 __glibcxx_function_requires(_SameTypeConcept<
03186 typename iterator_traits<_InputIterator1>::value_type,
03187 typename iterator_traits<_InputIterator2>::value_type>)
03188 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
03189 typename iterator_traits<_InputIterator1>::value_type>)
03190 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03191 typename iterator_traits<_InputIterator1>::value_type,
03192 typename iterator_traits<_InputIterator2>::value_type>)
03193 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
03194 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
03195
03196 while (__first1 != __last1 && __first2 != __last2)
03197 {
03198 if (__comp(*__first2, *__first1))
03199 {
03200 *__result = *__first2;
03201 ++__first2;
03202 }
03203 else
03204 {
03205 *__result = *__first1;
03206 ++__first1;
03207 }
03208 ++__result;
03209 }
03210 return std::copy(__first2, __last2, std::copy(__first1, __last1,
03211 __result));
03212 }
03213
03214 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
03215 typename _Distance>
03216 void
03217 __merge_sort_loop(_RandomAccessIterator1 __first,
03218 _RandomAccessIterator1 __last,
03219 _RandomAccessIterator2 __result,
03220 _Distance __step_size)
03221 {
03222 const _Distance __two_step = 2 * __step_size;
03223
03224 while (__last - __first >= __two_step)
03225 {
03226 __result = std::merge(__first, __first + __step_size,
03227 __first + __step_size, __first + __two_step,
03228 __result);
03229 __first += __two_step;
03230 }
03231
03232 __step_size = std::min(_Distance(__last - __first), __step_size);
03233 std::merge(__first, __first + __step_size, __first + __step_size, __last,
03234 __result);
03235 }
03236
03237 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
03238 typename _Distance, typename _Compare>
03239 void
03240 __merge_sort_loop(_RandomAccessIterator1 __first,
03241 _RandomAccessIterator1 __last,
03242 _RandomAccessIterator2 __result, _Distance __step_size,
03243 _Compare __comp)
03244 {
03245 const _Distance __two_step = 2 * __step_size;
03246
03247 while (__last - __first >= __two_step)
03248 {
03249 __result = std::merge(__first, __first + __step_size,
03250 __first + __step_size, __first + __two_step,
03251 __result,
03252 __comp);
03253 __first += __two_step;
03254 }
03255 __step_size = std::min(_Distance(__last - __first), __step_size);
03256
03257 std::merge(__first, __first + __step_size,
03258 __first + __step_size, __last,
03259 __result,
03260 __comp);
03261 }
03262
03263 enum { _S_chunk_size = 7 };
03264
03265 template<typename _RandomAccessIterator, typename _Distance>
03266 void
03267 __chunk_insertion_sort(_RandomAccessIterator __first,
03268 _RandomAccessIterator __last,
03269 _Distance __chunk_size)
03270 {
03271 while (__last - __first >= __chunk_size)
03272 {
03273 std::__insertion_sort(__first, __first + __chunk_size);
03274 __first += __chunk_size;
03275 }
03276 std::__insertion_sort(__first, __last);
03277 }
03278
03279 template<typename _RandomAccessIterator, typename _Distance, typename _Compare>
03280 void
03281 __chunk_insertion_sort(_RandomAccessIterator __first,
03282 _RandomAccessIterator __last,
03283 _Distance __chunk_size, _Compare __comp)
03284 {
03285 while (__last - __first >= __chunk_size)
03286 {
03287 std::__insertion_sort(__first, __first + __chunk_size, __comp);
03288 __first += __chunk_size;
03289 }
03290 std::__insertion_sort(__first, __last, __comp);
03291 }
03292
03293 template<typename _RandomAccessIterator, typename _Pointer>
03294 void
03295 __merge_sort_with_buffer(_RandomAccessIterator __first,
03296 _RandomAccessIterator __last,
03297 _Pointer __buffer)
03298 {
03299 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03300 _Distance;
03301
03302 const _Distance __len = __last - __first;
03303 const _Pointer __buffer_last = __buffer + __len;
03304
03305 _Distance __step_size = _S_chunk_size;
03306 std::__chunk_insertion_sort(__first, __last, __step_size);
03307
03308 while (__step_size < __len)
03309 {
03310 std::__merge_sort_loop(__first, __last, __buffer, __step_size);
03311 __step_size *= 2;
03312 std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
03313 __step_size *= 2;
03314 }
03315 }
03316
03317 template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
03318 void
03319 __merge_sort_with_buffer(_RandomAccessIterator __first,
03320 _RandomAccessIterator __last,
03321 _Pointer __buffer, _Compare __comp)
03322 {
03323 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03324 _Distance;
03325
03326 const _Distance __len = __last - __first;
03327 const _Pointer __buffer_last = __buffer + __len;
03328
03329 _Distance __step_size = _S_chunk_size;
03330 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
03331
03332 while (__step_size < __len)
03333 {
03334 std::__merge_sort_loop(__first, __last, __buffer,
03335 __step_size, __comp);
03336 __step_size *= 2;
03337 std::__merge_sort_loop(__buffer, __buffer_last, __first,
03338 __step_size, __comp);
03339 __step_size *= 2;
03340 }
03341 }
03342
03348 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
03349 typename _BidirectionalIterator3>
03350 _BidirectionalIterator3
03351 __merge_backward(_BidirectionalIterator1 __first1,
03352 _BidirectionalIterator1 __last1,
03353 _BidirectionalIterator2 __first2,
03354 _BidirectionalIterator2 __last2,
03355 _BidirectionalIterator3 __result)
03356 {
03357 if (__first1 == __last1)
03358 return std::copy_backward(__first2, __last2, __result);
03359 if (__first2 == __last2)
03360 return std::copy_backward(__first1, __last1, __result);
03361 --__last1;
03362 --__last2;
03363 while (true)
03364 {
03365 if (*__last2 < *__last1)
03366 {
03367 *--__result = *__last1;
03368 if (__first1 == __last1)
03369 return std::copy_backward(__first2, ++__last2, __result);
03370 --__last1;
03371 }
03372 else
03373 {
03374 *--__result = *__last2;
03375 if (__first2 == __last2)
03376 return std::copy_backward(__first1, ++__last1, __result);
03377 --__last2;
03378 }
03379 }
03380 }
03381
03387 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
03388 typename _BidirectionalIterator3, typename _Compare>
03389 _BidirectionalIterator3
03390 __merge_backward(_BidirectionalIterator1 __first1,
03391 _BidirectionalIterator1 __last1,
03392 _BidirectionalIterator2 __first2,
03393 _BidirectionalIterator2 __last2,
03394 _BidirectionalIterator3 __result,
03395 _Compare __comp)
03396 {
03397 if (__first1 == __last1)
03398 return std::copy_backward(__first2, __last2, __result);
03399 if (__first2 == __last2)
03400 return std::copy_backward(__first1, __last1, __result);
03401 --__last1;
03402 --__last2;
03403 while (true)
03404 {
03405 if (__comp(*__last2, *__last1))
03406 {
03407 *--__result = *__last1;
03408 if (__first1 == __last1)
03409 return std::copy_backward(__first2, ++__last2, __result);
03410 --__last1;
03411 }
03412 else
03413 {
03414 *--__result = *__last2;
03415 if (__first2 == __last2)
03416 return std::copy_backward(__first1, ++__last1, __result);
03417 --__last2;
03418 }
03419 }
03420 }
03421
03427 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
03428 typename _Distance>
03429 _BidirectionalIterator1
03430 __rotate_adaptive(_BidirectionalIterator1 __first,
03431 _BidirectionalIterator1 __middle,
03432 _BidirectionalIterator1 __last,
03433 _Distance __len1, _Distance __len2,
03434 _BidirectionalIterator2 __buffer,
03435 _Distance __buffer_size)
03436 {
03437 _BidirectionalIterator2 __buffer_end;
03438 if (__len1 > __len2 && __len2 <= __buffer_size)
03439 {
03440 __buffer_end = std::copy(__middle, __last, __buffer);
03441 std::copy_backward(__first, __middle, __last);
03442 return std::copy(__buffer, __buffer_end, __first);
03443 }
03444 else if (__len1 <= __buffer_size)
03445 {
03446 __buffer_end = std::copy(__first, __middle, __buffer);
03447 std::copy(__middle, __last, __first);
03448 return std::copy_backward(__buffer, __buffer_end, __last);
03449 }
03450 else
03451 {
03452 std::rotate(__first, __middle, __last);
03453 std::advance(__first, std::distance(__middle, __last));
03454 return __first;
03455 }
03456 }
03457
03463 template<typename _BidirectionalIterator, typename _Distance,
03464 typename _Pointer>
03465 void
03466 __merge_adaptive(_BidirectionalIterator __first,
03467 _BidirectionalIterator __middle,
03468 _BidirectionalIterator __last,
03469 _Distance __len1, _Distance __len2,
03470 _Pointer __buffer, _Distance __buffer_size)
03471 {
03472 if (__len1 <= __len2 && __len1 <= __buffer_size)
03473 {
03474 _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
03475 std::merge(__buffer, __buffer_end, __middle, __last, __first);
03476 }
03477 else if (__len2 <= __buffer_size)
03478 {
03479 _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
03480 std::__merge_backward(__first, __middle, __buffer,
03481 __buffer_end, __last);
03482 }
03483 else
03484 {
03485 _BidirectionalIterator __first_cut = __first;
03486 _BidirectionalIterator __second_cut = __middle;
03487 _Distance __len11 = 0;
03488 _Distance __len22 = 0;
03489 if (__len1 > __len2)
03490 {
03491 __len11 = __len1 / 2;
03492 std::advance(__first_cut, __len11);
03493 __second_cut = std::lower_bound(__middle, __last,
03494 *__first_cut);
03495 __len22 = std::distance(__middle, __second_cut);
03496 }
03497 else
03498 {
03499 __len22 = __len2 / 2;
03500 std::advance(__second_cut, __len22);
03501 __first_cut = std::upper_bound(__first, __middle,
03502 *__second_cut);
03503 __len11 = std::distance(__first, __first_cut);
03504 }
03505 _BidirectionalIterator __new_middle =
03506 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
03507 __len1 - __len11, __len22, __buffer,
03508 __buffer_size);
03509 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
03510 __len22, __buffer, __buffer_size);
03511 std::__merge_adaptive(__new_middle, __second_cut, __last,
03512 __len1 - __len11,
03513 __len2 - __len22, __buffer, __buffer_size);
03514 }
03515 }
03516
03522 template<typename _BidirectionalIterator, typename _Distance, typename _Pointer,
03523 typename _Compare>
03524 void
03525 __merge_adaptive(_BidirectionalIterator __first,
03526 _BidirectionalIterator __middle,
03527 _BidirectionalIterator __last,
03528 _Distance __len1, _Distance __len2,
03529 _Pointer __buffer, _Distance __buffer_size,
03530 _Compare __comp)
03531 {
03532 if (__len1 <= __len2 && __len1 <= __buffer_size)
03533 {
03534 _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
03535 std::merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
03536 }
03537 else if (__len2 <= __buffer_size)
03538 {
03539 _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
03540 std::__merge_backward(__first, __middle, __buffer, __buffer_end,
03541 __last, __comp);
03542 }
03543 else
03544 {
03545 _BidirectionalIterator __first_cut = __first;
03546 _BidirectionalIterator __second_cut = __middle;
03547 _Distance __len11 = 0;
03548 _Distance __len22 = 0;
03549 if (__len1 > __len2)
03550 {
03551 __len11 = __len1 / 2;
03552 std::advance(__first_cut, __len11);
03553 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
03554 __comp);
03555 __len22 = std::distance(__middle, __second_cut);
03556 }
03557 else
03558 {
03559 __len22 = __len2 / 2;
03560 std::advance(__second_cut, __len22);
03561 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
03562 __comp);
03563 __len11 = std::distance(__first, __first_cut);
03564 }
03565 _BidirectionalIterator __new_middle =
03566 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
03567 __len1 - __len11, __len22, __buffer,
03568 __buffer_size);
03569 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
03570 __len22, __buffer, __buffer_size, __comp);
03571 std::__merge_adaptive(__new_middle, __second_cut, __last,
03572 __len1 - __len11,
03573 __len2 - __len22, __buffer,
03574 __buffer_size, __comp);
03575 }
03576 }
03577
03595 template<typename _BidirectionalIterator>
03596 void
03597 inplace_merge(_BidirectionalIterator __first,
03598 _BidirectionalIterator __middle,
03599 _BidirectionalIterator __last)
03600 {
03601 typedef typename iterator_traits<_BidirectionalIterator>::value_type
03602 _ValueType;
03603 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
03604 _DistanceType;
03605
03606
03607 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
03608 _BidirectionalIterator>)
03609 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
03610 __glibcxx_requires_sorted(__first, __middle);
03611 __glibcxx_requires_sorted(__middle, __last);
03612
03613 if (__first == __middle || __middle == __last)
03614 return;
03615
03616 _DistanceType __len1 = std::distance(__first, __middle);
03617 _DistanceType __len2 = std::distance(__middle, __last);
03618
03619 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
03620 __last);
03621 if (__buf.begin() == 0)
03622 std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
03623 else
03624 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
03625 __buf.begin(), _DistanceType(__buf.size()));
03626 }
03627
03649 template<typename _BidirectionalIterator, typename _Compare>
03650 void
03651 inplace_merge(_BidirectionalIterator __first,
03652 _BidirectionalIterator __middle,
03653 _BidirectionalIterator __last,
03654 _Compare __comp)
03655 {
03656 typedef typename iterator_traits<_BidirectionalIterator>::value_type
03657 _ValueType;
03658 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
03659 _DistanceType;
03660
03661
03662 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
03663 _BidirectionalIterator>)
03664 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03665 _ValueType, _ValueType>)
03666 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
03667 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
03668
03669 if (__first == __middle || __middle == __last)
03670 return;
03671
03672 const _DistanceType __len1 = std::distance(__first, __middle);
03673 const _DistanceType __len2 = std::distance(__middle, __last);
03674
03675 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
03676 __last);
03677 if (__buf.begin() == 0)
03678 std::__merge_without_buffer(__first, __middle, __last, __len1,
03679 __len2, __comp);
03680 else
03681 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
03682 __buf.begin(), _DistanceType(__buf.size()),
03683 __comp);
03684 }
03685
03686 template<typename _RandomAccessIterator, typename _Pointer,
03687 typename _Distance>
03688 void
03689 __stable_sort_adaptive(_RandomAccessIterator __first,
03690 _RandomAccessIterator __last,
03691 _Pointer __buffer, _Distance __buffer_size)
03692 {
03693 const _Distance __len = (__last - __first + 1) / 2;
03694 const _RandomAccessIterator __middle = __first + __len;
03695 if (__len > __buffer_size)
03696 {
03697 std::__stable_sort_adaptive(__first, __middle,
03698 __buffer, __buffer_size);
03699 std::__stable_sort_adaptive(__middle, __last,
03700 __buffer, __buffer_size);
03701 }
03702 else
03703 {
03704 std::__merge_sort_with_buffer(__first, __middle, __buffer);
03705 std::__merge_sort_with_buffer(__middle, __last, __buffer);
03706 }
03707 std::__merge_adaptive(__first, __middle, __last,
03708 _Distance(__middle - __first),
03709 _Distance(__last - __middle),
03710 __buffer, __buffer_size);
03711 }
03712
03713 template<typename _RandomAccessIterator, typename _Pointer,
03714 typename _Distance, typename _Compare>
03715 void
03716 __stable_sort_adaptive(_RandomAccessIterator __first,
03717 _RandomAccessIterator __last,
03718 _Pointer __buffer, _Distance __buffer_size,
03719 _Compare __comp)
03720 {
03721 const _Distance __len = (__last - __first + 1) / 2;
03722 const _RandomAccessIterator __middle = __first + __len;
03723 if (__len > __buffer_size)
03724 {
03725 std::__stable_sort_adaptive(__first, __middle, __buffer,
03726 __buffer_size, __comp);
03727 std::__stable_sort_adaptive(__middle, __last, __buffer,
03728 __buffer_size, __comp);
03729 }
03730 else
03731 {
03732 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
03733 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
03734 }
03735 std::__merge_adaptive(__first, __middle, __last,
03736 _Distance(__middle - __first),
03737 _Distance(__last - __middle),
03738 __buffer, __buffer_size,
03739 __comp);
03740 }
03741
03758 template<typename _RandomAccessIterator>
03759 inline void
03760 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
03761 {
03762 typedef typename iterator_traits<_RandomAccessIterator>::value_type
03763 _ValueType;
03764 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03765 _DistanceType;
03766
03767
03768 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
03769 _RandomAccessIterator>)
03770 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
03771 __glibcxx_requires_valid_range(__first, __last);
03772
03773 _Temporary_buffer<_RandomAccessIterator, _ValueType>
03774 buf(__first, __last);
03775 if (buf.begin() == 0)
03776 std::__inplace_stable_sort(__first, __last);
03777 else
03778 std::__stable_sort_adaptive(__first, __last, buf.begin(),
03779 _DistanceType(buf.size()));
03780 }
03781
03799 template<typename _RandomAccessIterator, typename _Compare>
03800 inline void
03801 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
03802 _Compare __comp)
03803 {
03804 typedef typename iterator_traits<_RandomAccessIterator>::value_type
03805 _ValueType;
03806 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03807 _DistanceType;
03808
03809
03810 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
03811 _RandomAccessIterator>)
03812 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03813 _ValueType,
03814 _ValueType>)
03815 __glibcxx_requires_valid_range(__first, __last);
03816
03817 _Temporary_buffer<_RandomAccessIterator, _ValueType> buf(__first, __last);
03818 if (buf.begin() == 0)
03819 std::__inplace_stable_sort(__first, __last, __comp);
03820 else
03821 std::__stable_sort_adaptive(__first, __last, buf.begin(),
03822 _DistanceType(buf.size()), __comp);
03823 }
03824
03840 template<typename _RandomAccessIterator>
03841 void
03842 nth_element(_RandomAccessIterator __first,
03843 _RandomAccessIterator __nth,
03844 _RandomAccessIterator __last)
03845 {
03846 typedef typename iterator_traits<_RandomAccessIterator>::value_type
03847 _ValueType;
03848
03849
03850 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
03851 _RandomAccessIterator>)
03852 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
03853 __glibcxx_requires_valid_range(__first, __nth);
03854 __glibcxx_requires_valid_range(__nth, __last);
03855
03856 while (__last - __first > 3)
03857 {
03858 _RandomAccessIterator __cut =
03859 std::__unguarded_partition(__first, __last,
03860 _ValueType(std::__median(*__first,
03861 *(__first
03862 + (__last
03863 - __first)
03864 / 2),
03865 *(__last
03866 - 1))));
03867 if (__cut <= __nth)
03868 __first = __cut;
03869 else
03870 __last = __cut;
03871 }
03872 std::__insertion_sort(__first, __last);
03873 }
03874
03891 template<typename _RandomAccessIterator, typename _Compare>
03892 void
03893 nth_element(_RandomAccessIterator __first,
03894 _RandomAccessIterator __nth,
03895 _RandomAccessIterator __last,
03896 _Compare __comp)
03897 {
03898 typedef typename iterator_traits<_RandomAccessIterator>::value_type
03899 _ValueType;
03900
03901
03902 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
03903 _RandomAccessIterator>)
03904 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03905 _ValueType, _ValueType>)
03906 __glibcxx_requires_valid_range(__first, __nth);
03907 __glibcxx_requires_valid_range(__nth, __last);
03908
03909 while (__last - __first > 3)
03910 {
03911 _RandomAccessIterator __cut =
03912 std::__unguarded_partition(__first, __last,
03913 _ValueType(std::__median(*__first,
03914 *(__first
03915 + (__last
03916 - __first)
03917 / 2),
03918 *(__last - 1),
03919 __comp)), __comp);
03920 if (__cut <= __nth)
03921 __first = __cut;
03922 else
03923 __last = __cut;
03924 }
03925 std::__insertion_sort(__first, __last, __comp);
03926 }
03927
03944 template<typename _ForwardIterator, typename _Tp>
03945 pair<_ForwardIterator, _ForwardIterator>
03946 equal_range(_ForwardIterator __first, _ForwardIterator __last,
03947 const _Tp& __val)
03948 {
03949 typedef typename iterator_traits<_ForwardIterator>::value_type
03950 _ValueType;
03951 typedef typename iterator_traits<_ForwardIterator>::difference_type
03952 _DistanceType;
03953
03954
03955
03956 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
03957 __glibcxx_function_requires(_SameTypeConcept<_Tp, _ValueType>)
03958 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
03959 __glibcxx_requires_partitioned(__first, __last, __val);
03960
03961 _DistanceType __len = std::distance(__first, __last);
03962 _DistanceType __half;
03963 _ForwardIterator __middle, __left, __right;
03964
03965 while (__len > 0)
03966 {
03967 __half = __len >> 1;
03968 __middle = __first;
03969 std::advance(__middle, __half);
03970 if (*__middle < __val)
03971 {
03972 __first = __middle;
03973 ++__first;
03974 __len = __len - __half - 1;
03975 }
03976 else if (__val < *__middle)
03977 __len = __half;
03978 else
03979 {
03980 __left = std::lower_bound(__first, __middle, __val);
03981 std::advance(__first, __len);
03982 __right = std::upper_bound(++__middle, __first, __val);
03983 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
03984 }
03985 }
03986 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
03987 }
03988
04006 template<typename _ForwardIterator, typename _Tp, typename _Compare>
04007 pair<_ForwardIterator, _ForwardIterator>
04008 equal_range(_ForwardIterator __first, _ForwardIterator __last,
04009 const _Tp& __val,
04010 _Compare __comp)
04011 {
04012 typedef typename iterator_traits<_ForwardIterator>::value_type
04013 _ValueType;
04014 typedef typename iterator_traits<_ForwardIterator>::difference_type
04015 _DistanceType;
04016
04017
04018 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04019 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04020 _ValueType, _Tp>)
04021 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04022 _Tp, _ValueType>)
04023 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
04024
04025 _DistanceType __len = std::distance(__first, __last);
04026 _DistanceType __half;
04027 _ForwardIterator __middle, __left, __right;
04028
04029 while (__len > 0)
04030 {
04031 __half = __len >> 1;
04032 __middle = __first;
04033 std::advance(__middle, __half);
04034 if (__comp(*__middle, __val))
04035 {
04036 __first = __middle;
04037 ++__first;
04038 __len = __len - __half - 1;
04039 }
04040 else if (__comp(__val, *__middle))
04041 __len = __half;
04042 else
04043 {
04044 __left = std::lower_bound(__first, __middle, __val, __comp);
04045 std::advance(__first, __len);
04046 __right = std::upper_bound(++__middle, __first, __val, __comp);
04047 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
04048 }
04049 }
04050 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
04051 }
04052
04064 template<typename _ForwardIterator, typename _Tp>
04065 bool
04066 binary_search(_ForwardIterator __first, _ForwardIterator __last,
04067 const _Tp& __val)
04068 {
04069
04070
04071 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04072 __glibcxx_function_requires(_SameTypeConcept<_Tp,
04073 typename iterator_traits<_ForwardIterator>::value_type>)
04074 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
04075 __glibcxx_requires_partitioned(__first, __last, __val);
04076
04077 _ForwardIterator __i = std::lower_bound(__first, __last, __val);
04078 return __i != __last && !(__val < *__i);
04079 }
04080
04096 template<typename _ForwardIterator, typename _Tp, typename _Compare>
04097 bool
04098 binary_search(_ForwardIterator __first, _ForwardIterator __last,
04099 const _Tp& __val, _Compare __comp)
04100 {
04101
04102 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04103 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04104 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
04105 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _Tp,
04106 typename iterator_traits<_ForwardIterator>::value_type>)
04107 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
04108
04109 _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
04110 return __i != __last && !__comp(__val, *__i);
04111 }
04112
04113
04114
04115
04116
04117
04134 template<typename _InputIterator1, typename _InputIterator2>
04135 bool
04136 includes(_InputIterator1 __first1, _InputIterator1 __last1,
04137 _InputIterator2 __first2, _InputIterator2 __last2)
04138 {
04139
04140 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04141 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04142 __glibcxx_function_requires(_SameTypeConcept<
04143 typename iterator_traits<_InputIterator1>::value_type,
04144 typename iterator_traits<_InputIterator2>::value_type>)
04145 __glibcxx_function_requires(_LessThanComparableConcept<
04146 typename iterator_traits<_InputIterator1>::value_type>)
04147 __glibcxx_requires_sorted(__first1, __last1);
04148 __glibcxx_requires_sorted(__first2, __last2);
04149
04150 while (__first1 != __last1 && __first2 != __last2)
04151 if (*__first2 < *__first1)
04152 return false;
04153 else if(*__first1 < *__first2)
04154 ++__first1;
04155 else
04156 ++__first1, ++__first2;
04157
04158 return __first2 == __last2;
04159 }
04160
04180 template<typename _InputIterator1, typename _InputIterator2,
04181 typename _Compare>
04182 bool
04183 includes(_InputIterator1 __first1, _InputIterator1 __last1,
04184 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
04185 {
04186
04187 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04188 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04189 __glibcxx_function_requires(_SameTypeConcept<
04190 typename iterator_traits<_InputIterator1>::value_type,
04191 typename iterator_traits<_InputIterator2>::value_type>)
04192 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04193 typename iterator_traits<_InputIterator1>::value_type,
04194 typename iterator_traits<_InputIterator2>::value_type>)
04195 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
04196 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
04197
04198 while (__first1 != __last1 && __first2 != __last2)
04199 if (__comp(*__first2, *__first1))
04200 return false;
04201 else if(__comp(*__first1, *__first2))
04202 ++__first1;
04203 else
04204 ++__first1, ++__first2;
04205
04206 return __first2 == __last2;
04207 }
04208
04226 template<typename _InputIterator1, typename _InputIterator2,
04227 typename _OutputIterator>
04228 _OutputIterator
04229 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
04230 _InputIterator2 __first2, _InputIterator2 __last2,
04231 _OutputIterator __result)
04232 {
04233
04234 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04235 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04236 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04237 typename iterator_traits<_InputIterator1>::value_type>)
04238 __glibcxx_function_requires(_SameTypeConcept<
04239 typename iterator_traits<_InputIterator1>::value_type,
04240 typename iterator_traits<_InputIterator2>::value_type>)
04241 __glibcxx_function_requires(_LessThanComparableConcept<
04242 typename iterator_traits<_InputIterator1>::value_type>)
04243 __glibcxx_requires_sorted(__first1, __last1);
04244 __glibcxx_requires_sorted(__first2, __last2);
04245
04246 while (__first1 != __last1 && __first2 != __last2)
04247 {
04248 if (*__first1 < *__first2)
04249 {
04250 *__result = *__first1;
04251 ++__first1;
04252 }
04253 else if (*__first2 < *__first1)
04254 {
04255 *__result = *__first2;
04256 ++__first2;
04257 }
04258 else
04259 {
04260 *__result = *__first1;
04261 ++__first1;
04262 ++__first2;
04263 }
04264 ++__result;
04265 }
04266 return std::copy(__first2, __last2, std::copy(__first1, __last1,
04267 __result));
04268 }
04269
04288 template<typename _InputIterator1, typename _InputIterator2,
04289 typename _OutputIterator, typename _Compare>
04290 _OutputIterator
04291 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
04292 _InputIterator2 __first2, _InputIterator2 __last2,
04293 _OutputIterator __result, _Compare __comp)
04294 {
04295
04296 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04297 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04298 __glibcxx_function_requires(_SameTypeConcept<
04299 typename iterator_traits<_InputIterator1>::value_type,
04300 typename iterator_traits<_InputIterator2>::value_type>)
04301 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04302 typename iterator_traits<_InputIterator1>::value_type>)
04303 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04304 typename iterator_traits<_InputIterator1>::value_type,
04305 typename iterator_traits<_InputIterator2>::value_type>)
04306 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
04307 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
04308
04309 while (__first1 != __last1 && __first2 != __last2)
04310 {
04311 if (__comp(*__first1, *__first2))
04312 {
04313 *__result = *__first1;
04314 ++__first1;
04315 }
04316 else if (__comp(*__first2, *__first1))
04317 {
04318 *__result = *__first2;
04319 ++__first2;
04320 }
04321 else
04322 {
04323 *__result = *__first1;
04324 ++__first1;
04325 ++__first2;
04326 }
04327 ++__result;
04328 }
04329 return std::copy(__first2, __last2, std::copy(__first1, __last1,
04330 __result));
04331 }
04332
04349 template<typename _InputIterator1, typename _InputIterator2,
04350 typename _OutputIterator>
04351 _OutputIterator
04352 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
04353 _InputIterator2 __first2, _InputIterator2 __last2,
04354 _OutputIterator __result)
04355 {
04356
04357 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04358 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04359 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04360 typename iterator_traits<_InputIterator1>::value_type>)
04361 __glibcxx_function_requires(_SameTypeConcept<
04362 typename iterator_traits<_InputIterator1>::value_type,
04363 typename iterator_traits<_InputIterator2>::value_type>)
04364 __glibcxx_function_requires(_LessThanComparableConcept<
04365 typename iterator_traits<_InputIterator1>::value_type>)
04366 __glibcxx_requires_sorted(__first1, __last1);
04367 __glibcxx_requires_sorted(__first2, __last2);
04368
04369 while (__first1 != __last1 && __first2 != __last2)
04370 if (*__first1 < *__first2)
04371 ++__first1;
04372 else if (*__first2 < *__first1)
04373 ++__first2;
04374 else
04375 {
04376 *__result = *__first1;
04377 ++__first1;
04378 ++__first2;
04379 ++__result;
04380 }
04381 return __result;
04382 }
04383
04403 template<typename _InputIterator1, typename _InputIterator2,
04404 typename _OutputIterator, typename _Compare>
04405 _OutputIterator
04406 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
04407 _InputIterator2 __first2, _InputIterator2 __last2,
04408 _OutputIterator __result, _Compare __comp)
04409 {
04410
04411 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04412 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04413 __glibcxx_function_requires(_SameTypeConcept<
04414 typename iterator_traits<_InputIterator1>::value_type,
04415 typename iterator_traits<_InputIterator2>::value_type>)
04416 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04417 typename iterator_traits<_InputIterator1>::value_type>)
04418 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04419 typename iterator_traits<_InputIterator1>::value_type,
04420 typename iterator_traits<_InputIterator2>::value_type>)
04421 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
04422 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
04423
04424 while (__first1 != __last1 && __first2 != __last2)
04425 if (__comp(*__first1, *__first2))
04426 ++__first1;
04427 else if (__comp(*__first2, *__first1))
04428 ++__first2;
04429 else
04430 {
04431 *__result = *__first1;
04432 ++__first1;
04433 ++__first2;
04434 ++__result;
04435 }
04436 return __result;
04437 }
04438
04457 template<typename _InputIterator1, typename _InputIterator2,
04458 typename _OutputIterator>
04459 _OutputIterator
04460 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
04461 _InputIterator2 __first2, _InputIterator2 __last2,
04462 _OutputIterator __result)
04463 {
04464
04465 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04466 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04467 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04468 typename iterator_traits<_InputIterator1>::value_type>)
04469 __glibcxx_function_requires(_SameTypeConcept<
04470 typename iterator_traits<_InputIterator1>::value_type,
04471 typename iterator_traits<_InputIterator2>::value_type>)
04472 __glibcxx_function_requires(_LessThanComparableConcept<
04473 typename iterator_traits<_InputIterator1>::value_type>)
04474 __glibcxx_requires_sorted(__first1, __last1);
04475 __glibcxx_requires_sorted(__first2, __last2);
04476
04477 while (__first1 != __last1 && __first2 != __last2)
04478 if (*__first1 < *__first2)
04479 {
04480 *__result = *__first1;
04481 ++__first1;
04482 ++__result;
04483 }
04484 else if (*__first2 < *__first1)
04485 ++__first2;
04486 else
04487 {
04488 ++__first1;
04489 ++__first2;
04490 }
04491 return std::copy(__first1, __last1, __result);
04492 }
04493
04515 template<typename _InputIterator1, typename _InputIterator2,
04516 typename _OutputIterator, typename _Compare>
04517 _OutputIterator
04518 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
04519 _InputIterator2 __first2, _InputIterator2 __last2,
04520 _OutputIterator __result, _Compare __comp)
04521 {
04522
04523 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04524 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04525 __glibcxx_function_requires(_SameTypeConcept<
04526 typename iterator_traits<_InputIterator1>::value_type,
04527 typename iterator_traits<_InputIterator2>::value_type>)
04528 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04529 typename iterator_traits<_InputIterator1>::value_type>)
04530 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04531 typename iterator_traits<_InputIterator1>::value_type,
04532 typename iterator_traits<_InputIterator2>::value_type>)
04533 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
04534 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
04535
04536 while (__first1 != __last1 && __first2 != __last2)
04537 if (__comp(*__first1, *__first2))
04538 {
04539 *__result = *__first1;
04540 ++__first1;
04541 ++__result;
04542 }
04543 else if (__comp(*__first2, *__first1))
04544 ++__first2;
04545 else
04546 {
04547 ++__first1;
04548 ++__first2;
04549 }
04550 return std::copy(__first1, __last1, __result);
04551 }
04552
04569 template<typename _InputIterator1, typename _InputIterator2,
04570 typename _OutputIterator>
04571 _OutputIterator
04572 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
04573 _InputIterator2 __first2, _InputIterator2 __last2,
04574 _OutputIterator __result)
04575 {
04576
04577 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04578 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04579 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04580 typename iterator_traits<_InputIterator1>::value_type>)
04581 __glibcxx_function_requires(_SameTypeConcept<
04582 typename iterator_traits<_InputIterator1>::value_type,
04583 typename iterator_traits<_InputIterator2>::value_type>)
04584 __glibcxx_function_requires(_LessThanComparableConcept<
04585 typename iterator_traits<_InputIterator1>::value_type>)
04586 __glibcxx_requires_sorted(__first1, __last1);
04587 __glibcxx_requires_sorted(__first2, __last2);
04588
04589 while (__first1 != __last1 && __first2 != __last2)
04590 if (*__first1 < *__first2)
04591 {
04592 *__result = *__first1;
04593 ++__first1;
04594 ++__result;
04595 }
04596 else if (*__first2 < *__first1)
04597 {
04598 *__result = *__first2;
04599 ++__first2;
04600 ++__result;
04601 }
04602 else
04603 {
04604 ++__first1;
04605 ++__first2;
04606 }
04607 return std::copy(__first2, __last2, std::copy(__first1,
04608 __last1, __result));
04609 }
04610
04630 template<typename _InputIterator1, typename _InputIterator2,
04631 typename _OutputIterator, typename _Compare>
04632 _OutputIterator
04633 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
04634 _InputIterator2 __first2, _InputIterator2 __last2,
04635 _OutputIterator __result,
04636 _Compare __comp)
04637 {
04638
04639 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04640 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04641 __glibcxx_function_requires(_SameTypeConcept<
04642 typename iterator_traits<_InputIterator1>::value_type,
04643 typename iterator_traits<_InputIterator2>::value_type>)
04644 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04645 typename iterator_traits<_InputIterator1>::value_type>)
04646 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04647 typename iterator_traits<_InputIterator1>::value_type,
04648 typename iterator_traits<_InputIterator2>::value_type>)
04649 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
04650 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
04651
04652 while (__first1 != __last1 && __first2 != __last2)
04653 if (__comp(*__first1, *__first2))
04654 {
04655 *__result = *__first1;
04656 ++__first1;
04657 ++__result;
04658 }
04659 else if (__comp(*__first2, *__first1))
04660 {
04661 *__result = *__first2;
04662 ++__first2;
04663 ++__result;
04664 }
04665 else
04666 {
04667 ++__first1;
04668 ++__first2;
04669 }
04670 return std::copy(__first2, __last2, std::copy(__first1,
04671 __last1, __result));
04672 }
04673
04674
04675
04676
04683 template<typename _ForwardIterator>
04684 _ForwardIterator
04685 max_element(_ForwardIterator __first, _ForwardIterator __last)
04686 {
04687
04688 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04689 __glibcxx_function_requires(_LessThanComparableConcept<
04690 typename iterator_traits<_ForwardIterator>::value_type>)
04691 __glibcxx_requires_valid_range(__first, __last);
04692
04693 if (__first == __last)
04694 return __first;
04695 _ForwardIterator __result = __first;
04696 while (++__first != __last)
04697 if (*__result < *__first)
04698 __result = __first;
04699 return __result;
04700 }
04701
04710 template<typename _ForwardIterator, typename _Compare>
04711 _ForwardIterator
04712 max_element(_ForwardIterator __first, _ForwardIterator __last,
04713 _Compare __comp)
04714 {
04715
04716 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04717 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04718 typename iterator_traits<_ForwardIterator>::value_type,
04719 typename iterator_traits<_ForwardIterator>::value_type>)
04720 __glibcxx_requires_valid_range(__first, __last);
04721
04722 if (__first == __last) return __first;
04723 _ForwardIterator __result = __first;
04724 while (++__first != __last)
04725 if (__comp(*__result, *__first)) __result = __first;
04726 return __result;
04727 }
04728
04735 template<typename _ForwardIterator>
04736 _ForwardIterator
04737 min_element(_ForwardIterator __first, _ForwardIterator __last)
04738 {
04739
04740 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04741 __glibcxx_function_requires(_LessThanComparableConcept<
04742 typename iterator_traits<_ForwardIterator>::value_type>)
04743 __glibcxx_requires_valid_range(__first, __last);
04744
04745 if (__first == __last)
04746 return __first;
04747 _ForwardIterator __result = __first;
04748 while (++__first != __last)
04749 if (*__first < *__result)
04750 __result = __first;
04751 return __result;
04752 }
04753
04762 template<typename _ForwardIterator, typename _Compare>
04763 _ForwardIterator
04764 min_element(_ForwardIterator __first, _ForwardIterator __last,
04765 _Compare __comp)
04766 {
04767
04768 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04769 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04770 typename iterator_traits<_ForwardIterator>::value_type,
04771 typename iterator_traits<_ForwardIterator>::value_type>)
04772 __glibcxx_requires_valid_range(__first, __last);
04773
04774 if (__first == __last)
04775 return __first;
04776 _ForwardIterator __result = __first;
04777 while (++__first != __last)
04778 if (__comp(*__first, *__result))
04779 __result = __first;
04780 return __result;
04781 }
04782
04783
04784
04785
04797 template<typename _BidirectionalIterator>
04798 bool
04799 next_permutation(_BidirectionalIterator __first,
04800 _BidirectionalIterator __last)
04801 {
04802
04803 __glibcxx_function_requires(_BidirectionalIteratorConcept<
04804 _BidirectionalIterator>)
04805 __glibcxx_function_requires(_LessThanComparableConcept<
04806 typename iterator_traits<_BidirectionalIterator>::value_type>)
04807 __glibcxx_requires_valid_range(__first, __last);
04808
04809 if (__first == __last)
04810 return false;
04811 _BidirectionalIterator __i = __first;
04812 ++__i;
04813 if (__i == __last)
04814 return false;
04815 __i = __last;
04816 --__i;
04817
04818 for(;;)
04819 {
04820 _BidirectionalIterator __ii = __i;
04821 --__i;
04822 if (*__i < *__ii)
04823 {
04824 _BidirectionalIterator __j = __last;
04825 while (!(*__i < *--__j))
04826 {}
04827 std::iter_swap(__i, __j);
04828 std::reverse(__ii, __last);
04829 return true;
04830 }
04831 if (__i == __first)
04832 {
04833 std::reverse(__first, __last);
04834 return false;
04835 }
04836 }
04837 }
04838
04853 template<typename _BidirectionalIterator, typename _Compare>
04854 bool
04855 next_permutation(_BidirectionalIterator __first,
04856 _BidirectionalIterator __last, _Compare __comp)
04857 {
04858
04859 __glibcxx_function_requires(_BidirectionalIteratorConcept<
04860 _BidirectionalIterator>)
04861 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04862 typename iterator_traits<_BidirectionalIterator>::value_type,
04863 typename iterator_traits<_BidirectionalIterator>::value_type>)
04864 __glibcxx_requires_valid_range(__first, __last);
04865
04866 if (__first == __last)
04867 return false;
04868 _BidirectionalIterator __i = __first;
04869 ++__i;
04870 if (__i == __last)
04871 return false;
04872 __i = __last;
04873 --__i;
04874
04875 for(;;)
04876 {
04877 _BidirectionalIterator __ii = __i;
04878 --__i;
04879 if (__comp(*__i, *__ii))
04880 {
04881 _BidirectionalIterator __j = __last;
04882 while (!__comp(*__i, *--__j))
04883 {}
04884 std::iter_swap(__i, __j);
04885 std::reverse(__ii, __last);
04886 return true;
04887 }
04888 if (__i == __first)
04889 {
04890 std::reverse(__first, __last);
04891 return false;
04892 }
04893 }
04894 }
04895
04908 template<typename _BidirectionalIterator>
04909 bool
04910 prev_permutation(_BidirectionalIterator __first,
04911 _BidirectionalIterator __last)
04912 {
04913
04914 __glibcxx_function_requires(_BidirectionalIteratorConcept<
04915 _BidirectionalIterator>)
04916 __glibcxx_function_requires(_LessThanComparableConcept<
04917 typename iterator_traits<_BidirectionalIterator>::value_type>)
04918 __glibcxx_requires_valid_range(__first, __last);
04919
04920 if (__first == __last)
04921 return false;
04922 _BidirectionalIterator __i = __first;
04923 ++__i;
04924 if (__i == __last)
04925 return false;
04926 __i = __last;
04927 --__i;
04928
04929 for(;;)
04930 {
04931 _BidirectionalIterator __ii = __i;
04932 --__i;
04933 if (*__ii < *__i)
04934 {
04935 _BidirectionalIterator __j = __last;
04936 while (!(*--__j < *__i))
04937 {}
04938 std::iter_swap(__i, __j);
04939 std::reverse(__ii, __last);
04940 return true;
04941 }
04942 if (__i == __first)
04943 {
04944 std::reverse(__first, __last);
04945 return false;
04946 }
04947 }
04948 }
04949
04964 template<typename _BidirectionalIterator, typename _Compare>
04965 bool
04966 prev_permutation(_BidirectionalIterator __first,
04967 _BidirectionalIterator __last, _Compare __comp)
04968 {
04969
04970 __glibcxx_function_requires(_BidirectionalIteratorConcept<
04971 _BidirectionalIterator>)
04972 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04973 typename iterator_traits<_BidirectionalIterator>::value_type,
04974 typename iterator_traits<_BidirectionalIterator>::value_type>)
04975 __glibcxx_requires_valid_range(__first, __last);
04976
04977 if (__first == __last)
04978 return false;
04979 _BidirectionalIterator __i = __first;
04980 ++__i;
04981 if (__i == __last)
04982 return false;
04983 __i = __last;
04984 --__i;
04985
04986 for(;;)
04987 {
04988 _BidirectionalIterator __ii = __i;
04989 --__i;
04990 if (__comp(*__ii, *__i))
04991 {
04992 _BidirectionalIterator __j = __last;
04993 while (!__comp(*--__j, *__i))
04994 {}
04995 std::iter_swap(__i, __j);
04996 std::reverse(__ii, __last);
04997 return true;
04998 }
04999 if (__i == __first)
05000 {
05001 std::reverse(__first, __last);
05002 return false;
05003 }
05004 }
05005 }
05006
05007
05008
05023 template<typename _InputIterator, typename _ForwardIterator>
05024 _InputIterator
05025 find_first_of(_InputIterator __first1, _InputIterator __last1,
05026 _ForwardIterator __first2, _ForwardIterator __last2)
05027 {
05028
05029 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
05030 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
05031 __glibcxx_function_requires(_EqualOpConcept<
05032 typename iterator_traits<_InputIterator>::value_type,
05033 typename iterator_traits<_ForwardIterator>::value_type>)
05034 __glibcxx_requires_valid_range(__first1, __last1);
05035 __glibcxx_requires_valid_range(__first2, __last2);
05036
05037 for ( ; __first1 != __last1; ++__first1)
05038 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
05039 if (*__first1 == *__iter)
05040 return __first1;
05041 return __last1;
05042 }
05043
05059 template<typename _InputIterator, typename _ForwardIterator,
05060 typename _BinaryPredicate>
05061 _InputIterator
05062 find_first_of(_InputIterator __first1, _InputIterator __last1,
05063 _ForwardIterator __first2, _ForwardIterator __last2,
05064 _BinaryPredicate __comp)
05065 {
05066
05067 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
05068 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
05069 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
05070 typename iterator_traits<_InputIterator>::value_type,
05071 typename iterator_traits<_ForwardIterator>::value_type>)
05072 __glibcxx_requires_valid_range(__first1, __last1);
05073 __glibcxx_requires_valid_range(__first2, __last2);
05074
05075 for ( ; __first1 != __last1; ++__first1)
05076 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
05077 if (__comp(*__first1, *__iter))
05078 return __first1;
05079 return __last1;
05080 }
05081
05082
05083
05084
05085
05086
05087
05088
05089 template<typename _ForwardIterator1, typename _ForwardIterator2>
05090 _ForwardIterator1
05091 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
05092 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
05093 forward_iterator_tag, forward_iterator_tag)
05094 {
05095 if (__first2 == __last2)
05096 return __last1;
05097 else
05098 {
05099 _ForwardIterator1 __result = __last1;
05100 while (1)
05101 {
05102 _ForwardIterator1 __new_result
05103 = std::search(__first1, __last1, __first2, __last2);
05104 if (__new_result == __last1)
05105 return __result;
05106 else
05107 {
05108 __result = __new_result;
05109 __first1 = __new_result;
05110 ++__first1;
05111 }
05112 }
05113 }
05114 }
05115
05116 template<typename _ForwardIterator1, typename _ForwardIterator2,
05117 typename _BinaryPredicate>
05118 _ForwardIterator1
05119 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
05120 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
05121 forward_iterator_tag, forward_iterator_tag,
05122 _BinaryPredicate __comp)
05123 {
05124 if (__first2 == __last2)
05125 return __last1;
05126 else
05127 {
05128 _ForwardIterator1 __result = __last1;
05129 while (1)
05130 {
05131 _ForwardIterator1 __new_result
05132 = std::search(__first1, __last1, __first2, __last2, __comp);
05133 if (__new_result == __last1)
05134 return __result;
05135 else
05136 {
05137 __result = __new_result;
05138 __first1 = __new_result;
05139 ++__first1;
05140 }
05141 }
05142 }
05143 }
05144
05145
05146 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
05147 _BidirectionalIterator1
05148 __find_end(_BidirectionalIterator1 __first1,
05149 _BidirectionalIterator1 __last1,
05150 _BidirectionalIterator2 __first2,
05151 _BidirectionalIterator2 __last2,
05152 bidirectional_iterator_tag, bidirectional_iterator_tag)
05153 {
05154
05155 __glibcxx_function_requires(_BidirectionalIteratorConcept<
05156 _BidirectionalIterator1>)
05157 __glibcxx_function_requires(_BidirectionalIteratorConcept<
05158 _BidirectionalIterator2>)
05159
05160 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
05161 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
05162
05163 _RevIterator1 __rlast1(__first1);
05164 _RevIterator2 __rlast2(__first2);
05165 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
05166 _RevIterator2(__last2), __rlast2);
05167
05168 if (__rresult == __rlast1)
05169 return __last1;
05170 else
05171 {
05172 _BidirectionalIterator1 __result = __rresult.base();
05173 std::advance(__result, -std::distance(__first2, __last2));
05174 return __result;
05175 }
05176 }
05177
05178 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
05179 typename _BinaryPredicate>
05180 _BidirectionalIterator1
05181 __find_end(_BidirectionalIterator1 __first1,
05182 _BidirectionalIterator1 __last1,
05183 _BidirectionalIterator2 __first2,
05184 _BidirectionalIterator2 __last2,
05185 bidirectional_iterator_tag, bidirectional_iterator_tag,
05186 _BinaryPredicate __comp)
05187 {
05188
05189 __glibcxx_function_requires(_BidirectionalIteratorConcept<
05190 _BidirectionalIterator1>)
05191 __glibcxx_function_requires(_BidirectionalIteratorConcept<
05192 _BidirectionalIterator2>)
05193
05194 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
05195 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
05196
05197 _RevIterator1 __rlast1(__first1);
05198 _RevIterator2 __rlast2(__first2);
05199 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
05200 _RevIterator2(__last2), __rlast2,
05201 __comp);
05202
05203 if (__rresult == __rlast1)
05204 return __last1;
05205 else
05206 {
05207 _BidirectionalIterator1 __result = __rresult.base();
05208 std::advance(__result, -std::distance(__first2, __last2));
05209 return __result;
05210 }
05211 }
05212
05213
05214
05239 template<typename _ForwardIterator1, typename _ForwardIterator2>
05240 inline _ForwardIterator1
05241 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
05242 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
05243 {
05244
05245 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
05246 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
05247 __glibcxx_function_requires(_EqualOpConcept<
05248 typename iterator_traits<_ForwardIterator1>::value_type,
05249 typename iterator_traits<_ForwardIterator2>::value_type>)
05250 __glibcxx_requires_valid_range(__first1, __last1);
05251 __glibcxx_requires_valid_range(__first2, __last2);
05252
05253 return std::__find_end(__first1, __last1, __first2, __last2,
05254 std::__iterator_category(__first1),
05255 std::__iterator_category(__first2));
05256 }
05257
05284 template<typename _ForwardIterator1, typename _ForwardIterator2,
05285 typename _BinaryPredicate>
05286 inline _ForwardIterator1
05287 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
05288 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
05289 _BinaryPredicate __comp)
05290 {
05291
05292 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
05293 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
05294 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
05295 typename iterator_traits<_ForwardIterator1>::value_type,
05296 typename iterator_traits<_ForwardIterator2>::value_type>)
05297 __glibcxx_requires_valid_range(__first1, __last1);
05298 __glibcxx_requires_valid_range(__first2, __last2);
05299
05300 return std::__find_end(__first1, __last1, __first2, __last2,
05301 std::__iterator_category(__first1),
05302 std::__iterator_category(__first2),
05303 __comp);
05304 }
05305
05306 }
05307
05308 #endif