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
00057 #ifndef _STL_ALGO_H
00058 #define _STL_ALGO_H 1
00059
00060 #include <cstdlib>
00061 #include <bits/algorithmfwd.h>
00062 #include <bits/stl_heap.h>
00063 #include <bits/stl_tempbuf.h>
00064
00065 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00066 #include <random>
00067 #endif
00068
00069
00070
00071 _GLIBCXX_BEGIN_NAMESPACE(std)
00072
00073
00074 template<typename _Iterator>
00075 void
00076 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
00077 {
00078
00079 __glibcxx_function_requires(_LessThanComparableConcept<
00080 typename iterator_traits<_Iterator>::value_type>)
00081
00082 if (*__a < *__b)
00083 {
00084 if (*__b < *__c)
00085 std::iter_swap(__a, __b);
00086 else if (*__a < *__c)
00087 std::iter_swap(__a, __c);
00088 }
00089 else if (*__a < *__c)
00090 return;
00091 else if (*__b < *__c)
00092 std::iter_swap(__a, __c);
00093 else
00094 std::iter_swap(__a, __b);
00095 }
00096
00097
00098 template<typename _Iterator, typename _Compare>
00099 void
00100 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
00101 _Compare __comp)
00102 {
00103
00104 __glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
00105 typename iterator_traits<_Iterator>::value_type,
00106 typename iterator_traits<_Iterator>::value_type>)
00107
00108 if (__comp(*__a, *__b))
00109 {
00110 if (__comp(*__b, *__c))
00111 std::iter_swap(__a, __b);
00112 else if (__comp(*__a, *__c))
00113 std::iter_swap(__a, __c);
00114 }
00115 else if (__comp(*__a, *__c))
00116 return;
00117 else if (__comp(*__b, *__c))
00118 std::iter_swap(__a, __c);
00119 else
00120 std::iter_swap(__a, __b);
00121 }
00122
00123
00124
00125
00126 template<typename _InputIterator, typename _Tp>
00127 inline _InputIterator
00128 __find(_InputIterator __first, _InputIterator __last,
00129 const _Tp& __val, input_iterator_tag)
00130 {
00131 while (__first != __last && !(*__first == __val))
00132 ++__first;
00133 return __first;
00134 }
00135
00136
00137 template<typename _InputIterator, typename _Predicate>
00138 inline _InputIterator
00139 __find_if(_InputIterator __first, _InputIterator __last,
00140 _Predicate __pred, input_iterator_tag)
00141 {
00142 while (__first != __last && !bool(__pred(*__first)))
00143 ++__first;
00144 return __first;
00145 }
00146
00147
00148 template<typename _RandomAccessIterator, typename _Tp>
00149 _RandomAccessIterator
00150 __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
00151 const _Tp& __val, random_access_iterator_tag)
00152 {
00153 typename iterator_traits<_RandomAccessIterator>::difference_type
00154 __trip_count = (__last - __first) >> 2;
00155
00156 for (; __trip_count > 0; --__trip_count)
00157 {
00158 if (*__first == __val)
00159 return __first;
00160 ++__first;
00161
00162 if (*__first == __val)
00163 return __first;
00164 ++__first;
00165
00166 if (*__first == __val)
00167 return __first;
00168 ++__first;
00169
00170 if (*__first == __val)
00171 return __first;
00172 ++__first;
00173 }
00174
00175 switch (__last - __first)
00176 {
00177 case 3:
00178 if (*__first == __val)
00179 return __first;
00180 ++__first;
00181 case 2:
00182 if (*__first == __val)
00183 return __first;
00184 ++__first;
00185 case 1:
00186 if (*__first == __val)
00187 return __first;
00188 ++__first;
00189 case 0:
00190 default:
00191 return __last;
00192 }
00193 }
00194
00195
00196 template<typename _RandomAccessIterator, typename _Predicate>
00197 _RandomAccessIterator
00198 __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
00199 _Predicate __pred, random_access_iterator_tag)
00200 {
00201 typename iterator_traits<_RandomAccessIterator>::difference_type
00202 __trip_count = (__last - __first) >> 2;
00203
00204 for (; __trip_count > 0; --__trip_count)
00205 {
00206 if (__pred(*__first))
00207 return __first;
00208 ++__first;
00209
00210 if (__pred(*__first))
00211 return __first;
00212 ++__first;
00213
00214 if (__pred(*__first))
00215 return __first;
00216 ++__first;
00217
00218 if (__pred(*__first))
00219 return __first;
00220 ++__first;
00221 }
00222
00223 switch (__last - __first)
00224 {
00225 case 3:
00226 if (__pred(*__first))
00227 return __first;
00228 ++__first;
00229 case 2:
00230 if (__pred(*__first))
00231 return __first;
00232 ++__first;
00233 case 1:
00234 if (__pred(*__first))
00235 return __first;
00236 ++__first;
00237 case 0:
00238 default:
00239 return __last;
00240 }
00241 }
00242
00243 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00244
00245 template<typename _InputIterator, typename _Predicate>
00246 inline _InputIterator
00247 __find_if_not(_InputIterator __first, _InputIterator __last,
00248 _Predicate __pred, input_iterator_tag)
00249 {
00250 while (__first != __last && bool(__pred(*__first)))
00251 ++__first;
00252 return __first;
00253 }
00254
00255
00256 template<typename _RandomAccessIterator, typename _Predicate>
00257 _RandomAccessIterator
00258 __find_if_not(_RandomAccessIterator __first, _RandomAccessIterator __last,
00259 _Predicate __pred, random_access_iterator_tag)
00260 {
00261 typename iterator_traits<_RandomAccessIterator>::difference_type
00262 __trip_count = (__last - __first) >> 2;
00263
00264 for (; __trip_count > 0; --__trip_count)
00265 {
00266 if (!bool(__pred(*__first)))
00267 return __first;
00268 ++__first;
00269
00270 if (!bool(__pred(*__first)))
00271 return __first;
00272 ++__first;
00273
00274 if (!bool(__pred(*__first)))
00275 return __first;
00276 ++__first;
00277
00278 if (!bool(__pred(*__first)))
00279 return __first;
00280 ++__first;
00281 }
00282
00283 switch (__last - __first)
00284 {
00285 case 3:
00286 if (!bool(__pred(*__first)))
00287 return __first;
00288 ++__first;
00289 case 2:
00290 if (!bool(__pred(*__first)))
00291 return __first;
00292 ++__first;
00293 case 1:
00294 if (!bool(__pred(*__first)))
00295 return __first;
00296 ++__first;
00297 case 0:
00298 default:
00299 return __last;
00300 }
00301 }
00302 #endif
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 template<typename _ForwardIterator, typename _Integer, typename _Tp>
00323 _ForwardIterator
00324 __search_n(_ForwardIterator __first, _ForwardIterator __last,
00325 _Integer __count, const _Tp& __val,
00326 std::forward_iterator_tag)
00327 {
00328 __first = _GLIBCXX_STD_P::find(__first, __last, __val);
00329 while (__first != __last)
00330 {
00331 typename iterator_traits<_ForwardIterator>::difference_type
00332 __n = __count;
00333 _ForwardIterator __i = __first;
00334 ++__i;
00335 while (__i != __last && __n != 1 && *__i == __val)
00336 {
00337 ++__i;
00338 --__n;
00339 }
00340 if (__n == 1)
00341 return __first;
00342 if (__i == __last)
00343 return __last;
00344 __first = _GLIBCXX_STD_P::find(++__i, __last, __val);
00345 }
00346 return __last;
00347 }
00348
00349
00350
00351
00352
00353
00354 template<typename _RandomAccessIter, typename _Integer, typename _Tp>
00355 _RandomAccessIter
00356 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
00357 _Integer __count, const _Tp& __val,
00358 std::random_access_iterator_tag)
00359 {
00360
00361 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
00362 _DistanceType;
00363
00364 _DistanceType __tailSize = __last - __first;
00365 const _DistanceType __pattSize = __count;
00366
00367 if (__tailSize < __pattSize)
00368 return __last;
00369
00370 const _DistanceType __skipOffset = __pattSize - 1;
00371 _RandomAccessIter __lookAhead = __first + __skipOffset;
00372 __tailSize -= __pattSize;
00373
00374 while (1)
00375 {
00376
00377
00378 while (!(*__lookAhead == __val))
00379 {
00380 if (__tailSize < __pattSize)
00381 return __last;
00382 __lookAhead += __pattSize;
00383 __tailSize -= __pattSize;
00384 }
00385 _DistanceType __remainder = __skipOffset;
00386 for (_RandomAccessIter __backTrack = __lookAhead - 1;
00387 *__backTrack == __val; --__backTrack)
00388 {
00389 if (--__remainder == 0)
00390 return (__lookAhead - __skipOffset);
00391 }
00392 if (__remainder > __tailSize)
00393 return __last;
00394 __lookAhead += __remainder;
00395 __tailSize -= __remainder;
00396 }
00397 }
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 template<typename _ForwardIterator, typename _Integer, typename _Tp,
00408 typename _BinaryPredicate>
00409 _ForwardIterator
00410 __search_n(_ForwardIterator __first, _ForwardIterator __last,
00411 _Integer __count, const _Tp& __val,
00412 _BinaryPredicate __binary_pred, std::forward_iterator_tag)
00413 {
00414 while (__first != __last && !bool(__binary_pred(*__first, __val)))
00415 ++__first;
00416
00417 while (__first != __last)
00418 {
00419 typename iterator_traits<_ForwardIterator>::difference_type
00420 __n = __count;
00421 _ForwardIterator __i = __first;
00422 ++__i;
00423 while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
00424 {
00425 ++__i;
00426 --__n;
00427 }
00428 if (__n == 1)
00429 return __first;
00430 if (__i == __last)
00431 return __last;
00432 __first = ++__i;
00433 while (__first != __last
00434 && !bool(__binary_pred(*__first, __val)))
00435 ++__first;
00436 }
00437 return __last;
00438 }
00439
00440
00441
00442
00443
00444
00445
00446 template<typename _RandomAccessIter, typename _Integer, typename _Tp,
00447 typename _BinaryPredicate>
00448 _RandomAccessIter
00449 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
00450 _Integer __count, const _Tp& __val,
00451 _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
00452 {
00453
00454 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
00455 _DistanceType;
00456
00457 _DistanceType __tailSize = __last - __first;
00458 const _DistanceType __pattSize = __count;
00459
00460 if (__tailSize < __pattSize)
00461 return __last;
00462
00463 const _DistanceType __skipOffset = __pattSize - 1;
00464 _RandomAccessIter __lookAhead = __first + __skipOffset;
00465 __tailSize -= __pattSize;
00466
00467 while (1)
00468 {
00469
00470
00471 while (!bool(__binary_pred(*__lookAhead, __val)))
00472 {
00473 if (__tailSize < __pattSize)
00474 return __last;
00475 __lookAhead += __pattSize;
00476 __tailSize -= __pattSize;
00477 }
00478 _DistanceType __remainder = __skipOffset;
00479 for (_RandomAccessIter __backTrack = __lookAhead - 1;
00480 __binary_pred(*__backTrack, __val); --__backTrack)
00481 {
00482 if (--__remainder == 0)
00483 return (__lookAhead - __skipOffset);
00484 }
00485 if (__remainder > __tailSize)
00486 return __last;
00487 __lookAhead += __remainder;
00488 __tailSize -= __remainder;
00489 }
00490 }
00491
00492
00493 template<typename _ForwardIterator1, typename _ForwardIterator2>
00494 _ForwardIterator1
00495 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00496 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
00497 forward_iterator_tag, forward_iterator_tag)
00498 {
00499 if (__first2 == __last2)
00500 return __last1;
00501 else
00502 {
00503 _ForwardIterator1 __result = __last1;
00504 while (1)
00505 {
00506 _ForwardIterator1 __new_result
00507 = _GLIBCXX_STD_P::search(__first1, __last1, __first2, __last2);
00508 if (__new_result == __last1)
00509 return __result;
00510 else
00511 {
00512 __result = __new_result;
00513 __first1 = __new_result;
00514 ++__first1;
00515 }
00516 }
00517 }
00518 }
00519
00520 template<typename _ForwardIterator1, typename _ForwardIterator2,
00521 typename _BinaryPredicate>
00522 _ForwardIterator1
00523 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00524 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
00525 forward_iterator_tag, forward_iterator_tag,
00526 _BinaryPredicate __comp)
00527 {
00528 if (__first2 == __last2)
00529 return __last1;
00530 else
00531 {
00532 _ForwardIterator1 __result = __last1;
00533 while (1)
00534 {
00535 _ForwardIterator1 __new_result
00536 = _GLIBCXX_STD_P::search(__first1, __last1, __first2,
00537 __last2, __comp);
00538 if (__new_result == __last1)
00539 return __result;
00540 else
00541 {
00542 __result = __new_result;
00543 __first1 = __new_result;
00544 ++__first1;
00545 }
00546 }
00547 }
00548 }
00549
00550
00551 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
00552 _BidirectionalIterator1
00553 __find_end(_BidirectionalIterator1 __first1,
00554 _BidirectionalIterator1 __last1,
00555 _BidirectionalIterator2 __first2,
00556 _BidirectionalIterator2 __last2,
00557 bidirectional_iterator_tag, bidirectional_iterator_tag)
00558 {
00559
00560 __glibcxx_function_requires(_BidirectionalIteratorConcept<
00561 _BidirectionalIterator1>)
00562 __glibcxx_function_requires(_BidirectionalIteratorConcept<
00563 _BidirectionalIterator2>)
00564
00565 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
00566 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
00567
00568 _RevIterator1 __rlast1(__first1);
00569 _RevIterator2 __rlast2(__first2);
00570 _RevIterator1 __rresult = _GLIBCXX_STD_P::search(_RevIterator1(__last1),
00571 __rlast1,
00572 _RevIterator2(__last2),
00573 __rlast2);
00574
00575 if (__rresult == __rlast1)
00576 return __last1;
00577 else
00578 {
00579 _BidirectionalIterator1 __result = __rresult.base();
00580 std::advance(__result, -std::distance(__first2, __last2));
00581 return __result;
00582 }
00583 }
00584
00585 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
00586 typename _BinaryPredicate>
00587 _BidirectionalIterator1
00588 __find_end(_BidirectionalIterator1 __first1,
00589 _BidirectionalIterator1 __last1,
00590 _BidirectionalIterator2 __first2,
00591 _BidirectionalIterator2 __last2,
00592 bidirectional_iterator_tag, bidirectional_iterator_tag,
00593 _BinaryPredicate __comp)
00594 {
00595
00596 __glibcxx_function_requires(_BidirectionalIteratorConcept<
00597 _BidirectionalIterator1>)
00598 __glibcxx_function_requires(_BidirectionalIteratorConcept<
00599 _BidirectionalIterator2>)
00600
00601 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
00602 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
00603
00604 _RevIterator1 __rlast1(__first1);
00605 _RevIterator2 __rlast2(__first2);
00606 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
00607 _RevIterator2(__last2), __rlast2,
00608 __comp);
00609
00610 if (__rresult == __rlast1)
00611 return __last1;
00612 else
00613 {
00614 _BidirectionalIterator1 __result = __rresult.base();
00615 std::advance(__result, -std::distance(__first2, __last2));
00616 return __result;
00617 }
00618 }
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645 template<typename _ForwardIterator1, typename _ForwardIterator2>
00646 inline _ForwardIterator1
00647 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00648 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
00649 {
00650
00651 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
00652 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
00653 __glibcxx_function_requires(_EqualOpConcept<
00654 typename iterator_traits<_ForwardIterator1>::value_type,
00655 typename iterator_traits<_ForwardIterator2>::value_type>)
00656 __glibcxx_requires_valid_range(__first1, __last1);
00657 __glibcxx_requires_valid_range(__first2, __last2);
00658
00659 return std::__find_end(__first1, __last1, __first2, __last2,
00660 std::__iterator_category(__first1),
00661 std::__iterator_category(__first2));
00662 }
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691 template<typename _ForwardIterator1, typename _ForwardIterator2,
00692 typename _BinaryPredicate>
00693 inline _ForwardIterator1
00694 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
00695 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
00696 _BinaryPredicate __comp)
00697 {
00698
00699 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
00700 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
00701 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
00702 typename iterator_traits<_ForwardIterator1>::value_type,
00703 typename iterator_traits<_ForwardIterator2>::value_type>)
00704 __glibcxx_requires_valid_range(__first1, __last1);
00705 __glibcxx_requires_valid_range(__first2, __last2);
00706
00707 return std::__find_end(__first1, __last1, __first2, __last2,
00708 std::__iterator_category(__first1),
00709 std::__iterator_category(__first2),
00710 __comp);
00711 }
00712
00713 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726 template<typename _InputIterator, typename _Predicate>
00727 inline bool
00728 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
00729 { return __last == std::find_if_not(__first, __last, __pred); }
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743 template<typename _InputIterator, typename _Predicate>
00744 inline bool
00745 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
00746 { return __last == _GLIBCXX_STD_P::find_if(__first, __last, __pred); }
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760 template<typename _InputIterator, typename _Predicate>
00761 inline bool
00762 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
00763 { return !std::none_of(__first, __last, __pred); }
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775 template<typename _InputIterator, typename _Predicate>
00776 inline _InputIterator
00777 find_if_not(_InputIterator __first, _InputIterator __last,
00778 _Predicate __pred)
00779 {
00780
00781 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00782 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00783 typename iterator_traits<_InputIterator>::value_type>)
00784 __glibcxx_requires_valid_range(__first, __last);
00785 return std::__find_if_not(__first, __last, __pred,
00786 std::__iterator_category(__first));
00787 }
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799 template<typename _InputIterator, typename _Predicate>
00800 inline bool
00801 is_partitioned(_InputIterator __first, _InputIterator __last,
00802 _Predicate __pred)
00803 {
00804 __first = std::find_if_not(__first, __last, __pred);
00805 return std::none_of(__first, __last, __pred);
00806 }
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817 template<typename _ForwardIterator, typename _Predicate>
00818 _ForwardIterator
00819 partition_point(_ForwardIterator __first, _ForwardIterator __last,
00820 _Predicate __pred)
00821 {
00822
00823 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
00824 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00825 typename iterator_traits<_ForwardIterator>::value_type>)
00826
00827
00828 __glibcxx_requires_valid_range(__first, __last);
00829
00830 typedef typename iterator_traits<_ForwardIterator>::difference_type
00831 _DistanceType;
00832
00833 _DistanceType __len = std::distance(__first, __last);
00834 _DistanceType __half;
00835 _ForwardIterator __middle;
00836
00837 while (__len > 0)
00838 {
00839 __half = __len >> 1;
00840 __middle = __first;
00841 std::advance(__middle, __half);
00842 if (__pred(*__middle))
00843 {
00844 __first = __middle;
00845 ++__first;
00846 __len = __len - __half - 1;
00847 }
00848 else
00849 __len = __half;
00850 }
00851 return __first;
00852 }
00853 #endif
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
00871 _OutputIterator
00872 remove_copy(_InputIterator __first, _InputIterator __last,
00873 _OutputIterator __result, const _Tp& __value)
00874 {
00875
00876 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00877 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
00878 typename iterator_traits<_InputIterator>::value_type>)
00879 __glibcxx_function_requires(_EqualOpConcept<
00880 typename iterator_traits<_InputIterator>::value_type, _Tp>)
00881 __glibcxx_requires_valid_range(__first, __last);
00882
00883 for (; __first != __last; ++__first)
00884 if (!(*__first == __value))
00885 {
00886 *__result = *__first;
00887 ++__result;
00888 }
00889 return __result;
00890 }
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907 template<typename _InputIterator, typename _OutputIterator,
00908 typename _Predicate>
00909 _OutputIterator
00910 remove_copy_if(_InputIterator __first, _InputIterator __last,
00911 _OutputIterator __result, _Predicate __pred)
00912 {
00913
00914 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00915 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
00916 typename iterator_traits<_InputIterator>::value_type>)
00917 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00918 typename iterator_traits<_InputIterator>::value_type>)
00919 __glibcxx_requires_valid_range(__first, __last);
00920
00921 for (; __first != __last; ++__first)
00922 if (!bool(__pred(*__first)))
00923 {
00924 *__result = *__first;
00925 ++__result;
00926 }
00927 return __result;
00928 }
00929
00930 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946 template<typename _InputIterator, typename _OutputIterator,
00947 typename _Predicate>
00948 _OutputIterator
00949 copy_if(_InputIterator __first, _InputIterator __last,
00950 _OutputIterator __result, _Predicate __pred)
00951 {
00952
00953 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00954 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
00955 typename iterator_traits<_InputIterator>::value_type>)
00956 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
00957 typename iterator_traits<_InputIterator>::value_type>)
00958 __glibcxx_requires_valid_range(__first, __last);
00959
00960 for (; __first != __last; ++__first)
00961 if (__pred(*__first))
00962 {
00963 *__result = *__first;
00964 ++__result;
00965 }
00966 return __result;
00967 }
00968
00969
00970 template<typename _InputIterator, typename _Size, typename _OutputIterator>
00971 _OutputIterator
00972 __copy_n(_InputIterator __first, _Size __n,
00973 _OutputIterator __result, input_iterator_tag)
00974 {
00975 for (; __n > 0; --__n)
00976 {
00977 *__result = *__first;
00978 ++__first;
00979 ++__result;
00980 }
00981 return __result;
00982 }
00983
00984 template<typename _RandomAccessIterator, typename _Size,
00985 typename _OutputIterator>
00986 inline _OutputIterator
00987 __copy_n(_RandomAccessIterator __first, _Size __n,
00988 _OutputIterator __result, random_access_iterator_tag)
00989 { return std::copy(__first, __first + __n, __result); }
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004 template<typename _InputIterator, typename _Size, typename _OutputIterator>
01005 inline _OutputIterator
01006 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
01007 {
01008
01009 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01010 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01011 typename iterator_traits<_InputIterator>::value_type>)
01012
01013 return std::__copy_n(__first, __n, __result,
01014 std::__iterator_category(__first));
01015 }
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032 template<typename _InputIterator, typename _OutputIterator1,
01033 typename _OutputIterator2, typename _Predicate>
01034 pair<_OutputIterator1, _OutputIterator2>
01035 partition_copy(_InputIterator __first, _InputIterator __last,
01036 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
01037 _Predicate __pred)
01038 {
01039
01040 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01041 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
01042 typename iterator_traits<_InputIterator>::value_type>)
01043 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
01044 typename iterator_traits<_InputIterator>::value_type>)
01045 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01046 typename iterator_traits<_InputIterator>::value_type>)
01047 __glibcxx_requires_valid_range(__first, __last);
01048
01049 for (; __first != __last; ++__first)
01050 if (__pred(*__first))
01051 {
01052 *__out_true = *__first;
01053 ++__out_true;
01054 }
01055 else
01056 {
01057 *__out_false = *__first;
01058 ++__out_false;
01059 }
01060
01061 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
01062 }
01063 #endif
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082 template<typename _ForwardIterator, typename _Tp>
01083 _ForwardIterator
01084 remove(_ForwardIterator __first, _ForwardIterator __last,
01085 const _Tp& __value)
01086 {
01087
01088 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01089 _ForwardIterator>)
01090 __glibcxx_function_requires(_EqualOpConcept<
01091 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
01092 __glibcxx_requires_valid_range(__first, __last);
01093
01094 __first = _GLIBCXX_STD_P::find(__first, __last, __value);
01095 if(__first == __last)
01096 return __first;
01097 _ForwardIterator __result = __first;
01098 ++__first;
01099 for(; __first != __last; ++__first)
01100 if(!(*__first == __value))
01101 {
01102 *__result = _GLIBCXX_MOVE(*__first);
01103 ++__result;
01104 }
01105 return __result;
01106 }
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125 template<typename _ForwardIterator, typename _Predicate>
01126 _ForwardIterator
01127 remove_if(_ForwardIterator __first, _ForwardIterator __last,
01128 _Predicate __pred)
01129 {
01130
01131 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01132 _ForwardIterator>)
01133 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01134 typename iterator_traits<_ForwardIterator>::value_type>)
01135 __glibcxx_requires_valid_range(__first, __last);
01136
01137 __first = _GLIBCXX_STD_P::find_if(__first, __last, __pred);
01138 if(__first == __last)
01139 return __first;
01140 _ForwardIterator __result = __first;
01141 ++__first;
01142 for(; __first != __last; ++__first)
01143 if(!bool(__pred(*__first)))
01144 {
01145 *__result = _GLIBCXX_MOVE(*__first);
01146 ++__result;
01147 }
01148 return __result;
01149 }
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165 template<typename _ForwardIterator>
01166 _ForwardIterator
01167 unique(_ForwardIterator __first, _ForwardIterator __last)
01168 {
01169
01170 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01171 _ForwardIterator>)
01172 __glibcxx_function_requires(_EqualityComparableConcept<
01173 typename iterator_traits<_ForwardIterator>::value_type>)
01174 __glibcxx_requires_valid_range(__first, __last);
01175
01176
01177 __first = _GLIBCXX_STD_P::adjacent_find(__first, __last);
01178 if (__first == __last)
01179 return __last;
01180
01181
01182 _ForwardIterator __dest = __first;
01183 ++__first;
01184 while (++__first != __last)
01185 if (!(*__dest == *__first))
01186 *++__dest = _GLIBCXX_MOVE(*__first);
01187 return ++__dest;
01188 }
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205 template<typename _ForwardIterator, typename _BinaryPredicate>
01206 _ForwardIterator
01207 unique(_ForwardIterator __first, _ForwardIterator __last,
01208 _BinaryPredicate __binary_pred)
01209 {
01210
01211 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01212 _ForwardIterator>)
01213 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01214 typename iterator_traits<_ForwardIterator>::value_type,
01215 typename iterator_traits<_ForwardIterator>::value_type>)
01216 __glibcxx_requires_valid_range(__first, __last);
01217
01218
01219 __first = _GLIBCXX_STD_P::adjacent_find(__first, __last, __binary_pred);
01220 if (__first == __last)
01221 return __last;
01222
01223
01224 _ForwardIterator __dest = __first;
01225 ++__first;
01226 while (++__first != __last)
01227 if (!bool(__binary_pred(*__dest, *__first)))
01228 *++__dest = _GLIBCXX_MOVE(*__first);
01229 return ++__dest;
01230 }
01231
01232
01233
01234
01235
01236
01237 template<typename _ForwardIterator, typename _OutputIterator>
01238 _OutputIterator
01239 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
01240 _OutputIterator __result,
01241 forward_iterator_tag, output_iterator_tag)
01242 {
01243
01244 _ForwardIterator __next = __first;
01245 *__result = *__first;
01246 while (++__next != __last)
01247 if (!(*__first == *__next))
01248 {
01249 __first = __next;
01250 *++__result = *__first;
01251 }
01252 return ++__result;
01253 }
01254
01255
01256
01257
01258
01259
01260 template<typename _InputIterator, typename _OutputIterator>
01261 _OutputIterator
01262 __unique_copy(_InputIterator __first, _InputIterator __last,
01263 _OutputIterator __result,
01264 input_iterator_tag, output_iterator_tag)
01265 {
01266
01267 typename iterator_traits<_InputIterator>::value_type __value = *__first;
01268 *__result = __value;
01269 while (++__first != __last)
01270 if (!(__value == *__first))
01271 {
01272 __value = *__first;
01273 *++__result = __value;
01274 }
01275 return ++__result;
01276 }
01277
01278
01279
01280
01281
01282
01283 template<typename _InputIterator, typename _ForwardIterator>
01284 _ForwardIterator
01285 __unique_copy(_InputIterator __first, _InputIterator __last,
01286 _ForwardIterator __result,
01287 input_iterator_tag, forward_iterator_tag)
01288 {
01289
01290 *__result = *__first;
01291 while (++__first != __last)
01292 if (!(*__result == *__first))
01293 *++__result = *__first;
01294 return ++__result;
01295 }
01296
01297
01298
01299
01300
01301
01302
01303 template<typename _ForwardIterator, typename _OutputIterator,
01304 typename _BinaryPredicate>
01305 _OutputIterator
01306 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
01307 _OutputIterator __result, _BinaryPredicate __binary_pred,
01308 forward_iterator_tag, output_iterator_tag)
01309 {
01310
01311 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01312 typename iterator_traits<_ForwardIterator>::value_type,
01313 typename iterator_traits<_ForwardIterator>::value_type>)
01314
01315 _ForwardIterator __next = __first;
01316 *__result = *__first;
01317 while (++__next != __last)
01318 if (!bool(__binary_pred(*__first, *__next)))
01319 {
01320 __first = __next;
01321 *++__result = *__first;
01322 }
01323 return ++__result;
01324 }
01325
01326
01327
01328
01329
01330
01331
01332 template<typename _InputIterator, typename _OutputIterator,
01333 typename _BinaryPredicate>
01334 _OutputIterator
01335 __unique_copy(_InputIterator __first, _InputIterator __last,
01336 _OutputIterator __result, _BinaryPredicate __binary_pred,
01337 input_iterator_tag, output_iterator_tag)
01338 {
01339
01340 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01341 typename iterator_traits<_InputIterator>::value_type,
01342 typename iterator_traits<_InputIterator>::value_type>)
01343
01344 typename iterator_traits<_InputIterator>::value_type __value = *__first;
01345 *__result = __value;
01346 while (++__first != __last)
01347 if (!bool(__binary_pred(__value, *__first)))
01348 {
01349 __value = *__first;
01350 *++__result = __value;
01351 }
01352 return ++__result;
01353 }
01354
01355
01356
01357
01358
01359
01360
01361 template<typename _InputIterator, typename _ForwardIterator,
01362 typename _BinaryPredicate>
01363 _ForwardIterator
01364 __unique_copy(_InputIterator __first, _InputIterator __last,
01365 _ForwardIterator __result, _BinaryPredicate __binary_pred,
01366 input_iterator_tag, forward_iterator_tag)
01367 {
01368
01369 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
01370 typename iterator_traits<_ForwardIterator>::value_type,
01371 typename iterator_traits<_InputIterator>::value_type>)
01372
01373 *__result = *__first;
01374 while (++__first != __last)
01375 if (!bool(__binary_pred(*__result, *__first)))
01376 *++__result = *__first;
01377 return ++__result;
01378 }
01379
01380
01381
01382
01383
01384
01385 template<typename _BidirectionalIterator>
01386 void
01387 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
01388 bidirectional_iterator_tag)
01389 {
01390 while (true)
01391 if (__first == __last || __first == --__last)
01392 return;
01393 else
01394 {
01395 std::iter_swap(__first, __last);
01396 ++__first;
01397 }
01398 }
01399
01400
01401
01402
01403
01404
01405 template<typename _RandomAccessIterator>
01406 void
01407 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
01408 random_access_iterator_tag)
01409 {
01410 if (__first == __last)
01411 return;
01412 --__last;
01413 while (__first < __last)
01414 {
01415 std::iter_swap(__first, __last);
01416 ++__first;
01417 --__last;
01418 }
01419 }
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433 template<typename _BidirectionalIterator>
01434 inline void
01435 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
01436 {
01437
01438 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
01439 _BidirectionalIterator>)
01440 __glibcxx_requires_valid_range(__first, __last);
01441 std::__reverse(__first, __last, std::__iterator_category(__first));
01442 }
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460 template<typename _BidirectionalIterator, typename _OutputIterator>
01461 _OutputIterator
01462 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
01463 _OutputIterator __result)
01464 {
01465
01466 __glibcxx_function_requires(_BidirectionalIteratorConcept<
01467 _BidirectionalIterator>)
01468 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01469 typename iterator_traits<_BidirectionalIterator>::value_type>)
01470 __glibcxx_requires_valid_range(__first, __last);
01471
01472 while (__first != __last)
01473 {
01474 --__last;
01475 *__result = *__last;
01476 ++__result;
01477 }
01478 return __result;
01479 }
01480
01481
01482
01483
01484
01485 template<typename _EuclideanRingElement>
01486 _EuclideanRingElement
01487 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
01488 {
01489 while (__n != 0)
01490 {
01491 _EuclideanRingElement __t = __m % __n;
01492 __m = __n;
01493 __n = __t;
01494 }
01495 return __m;
01496 }
01497
01498
01499 template<typename _ForwardIterator>
01500 void
01501 __rotate(_ForwardIterator __first,
01502 _ForwardIterator __middle,
01503 _ForwardIterator __last,
01504 forward_iterator_tag)
01505 {
01506 if (__first == __middle || __last == __middle)
01507 return;
01508
01509 _ForwardIterator __first2 = __middle;
01510 do
01511 {
01512 std::iter_swap(__first, __first2);
01513 ++__first;
01514 ++__first2;
01515 if (__first == __middle)
01516 __middle = __first2;
01517 }
01518 while (__first2 != __last);
01519
01520 __first2 = __middle;
01521
01522 while (__first2 != __last)
01523 {
01524 std::iter_swap(__first, __first2);
01525 ++__first;
01526 ++__first2;
01527 if (__first == __middle)
01528 __middle = __first2;
01529 else if (__first2 == __last)
01530 __first2 = __middle;
01531 }
01532 }
01533
01534
01535 template<typename _BidirectionalIterator>
01536 void
01537 __rotate(_BidirectionalIterator __first,
01538 _BidirectionalIterator __middle,
01539 _BidirectionalIterator __last,
01540 bidirectional_iterator_tag)
01541 {
01542
01543 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
01544 _BidirectionalIterator>)
01545
01546 if (__first == __middle || __last == __middle)
01547 return;
01548
01549 std::__reverse(__first, __middle, bidirectional_iterator_tag());
01550 std::__reverse(__middle, __last, bidirectional_iterator_tag());
01551
01552 while (__first != __middle && __middle != __last)
01553 {
01554 std::iter_swap(__first, --__last);
01555 ++__first;
01556 }
01557
01558 if (__first == __middle)
01559 std::__reverse(__middle, __last, bidirectional_iterator_tag());
01560 else
01561 std::__reverse(__first, __middle, bidirectional_iterator_tag());
01562 }
01563
01564
01565 template<typename _RandomAccessIterator>
01566 void
01567 __rotate(_RandomAccessIterator __first,
01568 _RandomAccessIterator __middle,
01569 _RandomAccessIterator __last,
01570 random_access_iterator_tag)
01571 {
01572
01573 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
01574 _RandomAccessIterator>)
01575
01576 if (__first == __middle || __last == __middle)
01577 return;
01578
01579 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
01580 _Distance;
01581 typedef typename iterator_traits<_RandomAccessIterator>::value_type
01582 _ValueType;
01583
01584 _Distance __n = __last - __first;
01585 _Distance __k = __middle - __first;
01586
01587 if (__k == __n - __k)
01588 {
01589 std::swap_ranges(__first, __middle, __middle);
01590 return;
01591 }
01592
01593 _RandomAccessIterator __p = __first;
01594
01595 for (;;)
01596 {
01597 if (__k < __n - __k)
01598 {
01599 if (__is_pod(_ValueType) && __k == 1)
01600 {
01601 _ValueType __t = _GLIBCXX_MOVE(*__p);
01602 _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
01603 *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
01604 return;
01605 }
01606 _RandomAccessIterator __q = __p + __k;
01607 for (_Distance __i = 0; __i < __n - __k; ++ __i)
01608 {
01609 std::iter_swap(__p, __q);
01610 ++__p;
01611 ++__q;
01612 }
01613 __n %= __k;
01614 if (__n == 0)
01615 return;
01616 std::swap(__n, __k);
01617 __k = __n - __k;
01618 }
01619 else
01620 {
01621 __k = __n - __k;
01622 if (__is_pod(_ValueType) && __k == 1)
01623 {
01624 _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
01625 _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
01626 *__p = _GLIBCXX_MOVE(__t);
01627 return;
01628 }
01629 _RandomAccessIterator __q = __p + __n;
01630 __p = __q - __k;
01631 for (_Distance __i = 0; __i < __n - __k; ++ __i)
01632 {
01633 --__p;
01634 --__q;
01635 std::iter_swap(__p, __q);
01636 }
01637 __n %= __k;
01638 if (__n == 0)
01639 return;
01640 std::swap(__n, __k);
01641 }
01642 }
01643 }
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664 template<typename _ForwardIterator>
01665 inline void
01666 rotate(_ForwardIterator __first, _ForwardIterator __middle,
01667 _ForwardIterator __last)
01668 {
01669
01670 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01671 _ForwardIterator>)
01672 __glibcxx_requires_valid_range(__first, __middle);
01673 __glibcxx_requires_valid_range(__middle, __last);
01674
01675 typedef typename iterator_traits<_ForwardIterator>::iterator_category
01676 _IterType;
01677 std::__rotate(__first, __middle, __last, _IterType());
01678 }
01679
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698 template<typename _ForwardIterator, typename _OutputIterator>
01699 _OutputIterator
01700 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
01701 _ForwardIterator __last, _OutputIterator __result)
01702 {
01703
01704 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
01705 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
01706 typename iterator_traits<_ForwardIterator>::value_type>)
01707 __glibcxx_requires_valid_range(__first, __middle);
01708 __glibcxx_requires_valid_range(__middle, __last);
01709
01710 return std::copy(__first, __middle,
01711 std::copy(__middle, __last, __result));
01712 }
01713
01714
01715 template<typename _ForwardIterator, typename _Predicate>
01716 _ForwardIterator
01717 __partition(_ForwardIterator __first, _ForwardIterator __last,
01718 _Predicate __pred, forward_iterator_tag)
01719 {
01720 if (__first == __last)
01721 return __first;
01722
01723 while (__pred(*__first))
01724 if (++__first == __last)
01725 return __first;
01726
01727 _ForwardIterator __next = __first;
01728
01729 while (++__next != __last)
01730 if (__pred(*__next))
01731 {
01732 std::iter_swap(__first, __next);
01733 ++__first;
01734 }
01735
01736 return __first;
01737 }
01738
01739
01740 template<typename _BidirectionalIterator, typename _Predicate>
01741 _BidirectionalIterator
01742 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
01743 _Predicate __pred, bidirectional_iterator_tag)
01744 {
01745 while (true)
01746 {
01747 while (true)
01748 if (__first == __last)
01749 return __first;
01750 else if (__pred(*__first))
01751 ++__first;
01752 else
01753 break;
01754 --__last;
01755 while (true)
01756 if (__first == __last)
01757 return __first;
01758 else if (!bool(__pred(*__last)))
01759 --__last;
01760 else
01761 break;
01762 std::iter_swap(__first, __last);
01763 ++__first;
01764 }
01765 }
01766
01767
01768
01769
01770 template<typename _ForwardIterator, typename _Predicate, typename _Distance>
01771 _ForwardIterator
01772 __inplace_stable_partition(_ForwardIterator __first,
01773 _ForwardIterator __last,
01774 _Predicate __pred, _Distance __len)
01775 {
01776 if (__len == 1)
01777 return __pred(*__first) ? __last : __first;
01778 _ForwardIterator __middle = __first;
01779 std::advance(__middle, __len / 2);
01780 _ForwardIterator __begin = std::__inplace_stable_partition(__first,
01781 __middle,
01782 __pred,
01783 __len / 2);
01784 _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
01785 __pred,
01786 __len
01787 - __len / 2);
01788 std::rotate(__begin, __middle, __end);
01789 std::advance(__begin, std::distance(__middle, __end));
01790 return __begin;
01791 }
01792
01793
01794 template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
01795 typename _Distance>
01796 _ForwardIterator
01797 __stable_partition_adaptive(_ForwardIterator __first,
01798 _ForwardIterator __last,
01799 _Predicate __pred, _Distance __len,
01800 _Pointer __buffer,
01801 _Distance __buffer_size)
01802 {
01803 if (__len <= __buffer_size)
01804 {
01805 _ForwardIterator __result1 = __first;
01806 _Pointer __result2 = __buffer;
01807 for (; __first != __last; ++__first)
01808 if (__pred(*__first))
01809 {
01810 *__result1 = _GLIBCXX_MOVE(*__first);
01811 ++__result1;
01812 }
01813 else
01814 {
01815 *__result2 = _GLIBCXX_MOVE(*__first);
01816 ++__result2;
01817 }
01818 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
01819 return __result1;
01820 }
01821 else
01822 {
01823 _ForwardIterator __middle = __first;
01824 std::advance(__middle, __len / 2);
01825 _ForwardIterator __begin =
01826 std::__stable_partition_adaptive(__first, __middle, __pred,
01827 __len / 2, __buffer,
01828 __buffer_size);
01829 _ForwardIterator __end =
01830 std::__stable_partition_adaptive(__middle, __last, __pred,
01831 __len - __len / 2,
01832 __buffer, __buffer_size);
01833 std::rotate(__begin, __middle, __end);
01834 std::advance(__begin, std::distance(__middle, __end));
01835 return __begin;
01836 }
01837 }
01838
01839
01840
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850
01851
01852
01853
01854
01855
01856 template<typename _ForwardIterator, typename _Predicate>
01857 _ForwardIterator
01858 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
01859 _Predicate __pred)
01860 {
01861
01862 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
01863 _ForwardIterator>)
01864 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
01865 typename iterator_traits<_ForwardIterator>::value_type>)
01866 __glibcxx_requires_valid_range(__first, __last);
01867
01868 if (__first == __last)
01869 return __first;
01870 else
01871 {
01872 typedef typename iterator_traits<_ForwardIterator>::value_type
01873 _ValueType;
01874 typedef typename iterator_traits<_ForwardIterator>::difference_type
01875 _DistanceType;
01876
01877 _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
01878 __last);
01879 if (__buf.size() > 0)
01880 return
01881 std::__stable_partition_adaptive(__first, __last, __pred,
01882 _DistanceType(__buf.requested_size()),
01883 __buf.begin(),
01884 _DistanceType(__buf.size()));
01885 else
01886 return
01887 std::__inplace_stable_partition(__first, __last, __pred,
01888 _DistanceType(__buf.requested_size()));
01889 }
01890 }
01891
01892
01893 template<typename _RandomAccessIterator>
01894 void
01895 __heap_select(_RandomAccessIterator __first,
01896 _RandomAccessIterator __middle,
01897 _RandomAccessIterator __last)
01898 {
01899 std::make_heap(__first, __middle);
01900 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
01901 if (*__i < *__first)
01902 std::__pop_heap(__first, __middle, __i);
01903 }
01904
01905
01906 template<typename _RandomAccessIterator, typename _Compare>
01907 void
01908 __heap_select(_RandomAccessIterator __first,
01909 _RandomAccessIterator __middle,
01910 _RandomAccessIterator __last, _Compare __comp)
01911 {
01912 std::make_heap(__first, __middle, __comp);
01913 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
01914 if (__comp(*__i, *__first))
01915 std::__pop_heap(__first, __middle, __i, __comp);
01916 }
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935
01936
01937
01938 template<typename _InputIterator, typename _RandomAccessIterator>
01939 _RandomAccessIterator
01940 partial_sort_copy(_InputIterator __first, _InputIterator __last,
01941 _RandomAccessIterator __result_first,
01942 _RandomAccessIterator __result_last)
01943 {
01944 typedef typename iterator_traits<_InputIterator>::value_type
01945 _InputValueType;
01946 typedef typename iterator_traits<_RandomAccessIterator>::value_type
01947 _OutputValueType;
01948 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
01949 _DistanceType;
01950
01951
01952 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
01953 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
01954 _OutputValueType>)
01955 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
01956 _OutputValueType>)
01957 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
01958 __glibcxx_requires_valid_range(__first, __last);
01959 __glibcxx_requires_valid_range(__result_first, __result_last);
01960
01961 if (__result_first == __result_last)
01962 return __result_last;
01963 _RandomAccessIterator __result_real_last = __result_first;
01964 while(__first != __last && __result_real_last != __result_last)
01965 {
01966 *__result_real_last = *__first;
01967 ++__result_real_last;
01968 ++__first;
01969 }
01970 std::make_heap(__result_first, __result_real_last);
01971 while (__first != __last)
01972 {
01973 if (*__first < *__result_first)
01974 std::__adjust_heap(__result_first, _DistanceType(0),
01975 _DistanceType(__result_real_last
01976 - __result_first),
01977 _InputValueType(*__first));
01978 ++__first;
01979 }
01980 std::sort_heap(__result_first, __result_real_last);
01981 return __result_real_last;
01982 }
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004 template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
02005 _RandomAccessIterator
02006 partial_sort_copy(_InputIterator __first, _InputIterator __last,
02007 _RandomAccessIterator __result_first,
02008 _RandomAccessIterator __result_last,
02009 _Compare __comp)
02010 {
02011 typedef typename iterator_traits<_InputIterator>::value_type
02012 _InputValueType;
02013 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02014 _OutputValueType;
02015 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
02016 _DistanceType;
02017
02018
02019 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
02020 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
02021 _RandomAccessIterator>)
02022 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
02023 _OutputValueType>)
02024 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02025 _InputValueType, _OutputValueType>)
02026 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02027 _OutputValueType, _OutputValueType>)
02028 __glibcxx_requires_valid_range(__first, __last);
02029 __glibcxx_requires_valid_range(__result_first, __result_last);
02030
02031 if (__result_first == __result_last)
02032 return __result_last;
02033 _RandomAccessIterator __result_real_last = __result_first;
02034 while(__first != __last && __result_real_last != __result_last)
02035 {
02036 *__result_real_last = *__first;
02037 ++__result_real_last;
02038 ++__first;
02039 }
02040 std::make_heap(__result_first, __result_real_last, __comp);
02041 while (__first != __last)
02042 {
02043 if (__comp(*__first, *__result_first))
02044 std::__adjust_heap(__result_first, _DistanceType(0),
02045 _DistanceType(__result_real_last
02046 - __result_first),
02047 _InputValueType(*__first),
02048 __comp);
02049 ++__first;
02050 }
02051 std::sort_heap(__result_first, __result_real_last, __comp);
02052 return __result_real_last;
02053 }
02054
02055
02056 template<typename _RandomAccessIterator>
02057 void
02058 __unguarded_linear_insert(_RandomAccessIterator __last)
02059 {
02060 typename iterator_traits<_RandomAccessIterator>::value_type
02061 __val = _GLIBCXX_MOVE(*__last);
02062 _RandomAccessIterator __next = __last;
02063 --__next;
02064 while (__val < *__next)
02065 {
02066 *__last = _GLIBCXX_MOVE(*__next);
02067 __last = __next;
02068 --__next;
02069 }
02070 *__last = _GLIBCXX_MOVE(__val);
02071 }
02072
02073
02074 template<typename _RandomAccessIterator, typename _Compare>
02075 void
02076 __unguarded_linear_insert(_RandomAccessIterator __last,
02077 _Compare __comp)
02078 {
02079 typename iterator_traits<_RandomAccessIterator>::value_type
02080 __val = _GLIBCXX_MOVE(*__last);
02081 _RandomAccessIterator __next = __last;
02082 --__next;
02083 while (__comp(__val, *__next))
02084 {
02085 *__last = _GLIBCXX_MOVE(*__next);
02086 __last = __next;
02087 --__next;
02088 }
02089 *__last = _GLIBCXX_MOVE(__val);
02090 }
02091
02092
02093 template<typename _RandomAccessIterator>
02094 void
02095 __insertion_sort(_RandomAccessIterator __first,
02096 _RandomAccessIterator __last)
02097 {
02098 if (__first == __last)
02099 return;
02100
02101 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
02102 {
02103 if (*__i < *__first)
02104 {
02105 typename iterator_traits<_RandomAccessIterator>::value_type
02106 __val = _GLIBCXX_MOVE(*__i);
02107 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
02108 *__first = _GLIBCXX_MOVE(__val);
02109 }
02110 else
02111 std::__unguarded_linear_insert(__i);
02112 }
02113 }
02114
02115
02116 template<typename _RandomAccessIterator, typename _Compare>
02117 void
02118 __insertion_sort(_RandomAccessIterator __first,
02119 _RandomAccessIterator __last, _Compare __comp)
02120 {
02121 if (__first == __last) return;
02122
02123 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
02124 {
02125 if (__comp(*__i, *__first))
02126 {
02127 typename iterator_traits<_RandomAccessIterator>::value_type
02128 __val = _GLIBCXX_MOVE(*__i);
02129 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
02130 *__first = _GLIBCXX_MOVE(__val);
02131 }
02132 else
02133 std::__unguarded_linear_insert(__i, __comp);
02134 }
02135 }
02136
02137
02138 template<typename _RandomAccessIterator>
02139 inline void
02140 __unguarded_insertion_sort(_RandomAccessIterator __first,
02141 _RandomAccessIterator __last)
02142 {
02143 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02144 _ValueType;
02145
02146 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
02147 std::__unguarded_linear_insert(__i);
02148 }
02149
02150
02151 template<typename _RandomAccessIterator, typename _Compare>
02152 inline void
02153 __unguarded_insertion_sort(_RandomAccessIterator __first,
02154 _RandomAccessIterator __last, _Compare __comp)
02155 {
02156 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02157 _ValueType;
02158
02159 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
02160 std::__unguarded_linear_insert(__i, __comp);
02161 }
02162
02163
02164
02165
02166
02167 enum { _S_threshold = 16 };
02168
02169
02170 template<typename _RandomAccessIterator>
02171 void
02172 __final_insertion_sort(_RandomAccessIterator __first,
02173 _RandomAccessIterator __last)
02174 {
02175 if (__last - __first > int(_S_threshold))
02176 {
02177 std::__insertion_sort(__first, __first + int(_S_threshold));
02178 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
02179 }
02180 else
02181 std::__insertion_sort(__first, __last);
02182 }
02183
02184
02185 template<typename _RandomAccessIterator, typename _Compare>
02186 void
02187 __final_insertion_sort(_RandomAccessIterator __first,
02188 _RandomAccessIterator __last, _Compare __comp)
02189 {
02190 if (__last - __first > int(_S_threshold))
02191 {
02192 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
02193 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
02194 __comp);
02195 }
02196 else
02197 std::__insertion_sort(__first, __last, __comp);
02198 }
02199
02200
02201 template<typename _RandomAccessIterator, typename _Tp>
02202 _RandomAccessIterator
02203 __unguarded_partition(_RandomAccessIterator __first,
02204 _RandomAccessIterator __last, const _Tp& __pivot)
02205 {
02206 while (true)
02207 {
02208 while (*__first < __pivot)
02209 ++__first;
02210 --__last;
02211 while (__pivot < *__last)
02212 --__last;
02213 if (!(__first < __last))
02214 return __first;
02215 std::iter_swap(__first, __last);
02216 ++__first;
02217 }
02218 }
02219
02220
02221 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
02222 _RandomAccessIterator
02223 __unguarded_partition(_RandomAccessIterator __first,
02224 _RandomAccessIterator __last,
02225 const _Tp& __pivot, _Compare __comp)
02226 {
02227 while (true)
02228 {
02229 while (__comp(*__first, __pivot))
02230 ++__first;
02231 --__last;
02232 while (__comp(__pivot, *__last))
02233 --__last;
02234 if (!(__first < __last))
02235 return __first;
02236 std::iter_swap(__first, __last);
02237 ++__first;
02238 }
02239 }
02240
02241
02242 template<typename _RandomAccessIterator>
02243 inline _RandomAccessIterator
02244 __unguarded_partition_pivot(_RandomAccessIterator __first,
02245 _RandomAccessIterator __last)
02246 {
02247 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
02248 std::__move_median_first(__first, __mid, (__last - 1));
02249 return std::__unguarded_partition(__first + 1, __last, *__first);
02250 }
02251
02252
02253
02254 template<typename _RandomAccessIterator, typename _Compare>
02255 inline _RandomAccessIterator
02256 __unguarded_partition_pivot(_RandomAccessIterator __first,
02257 _RandomAccessIterator __last, _Compare __comp)
02258 {
02259 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
02260 std::__move_median_first(__first, __mid, (__last - 1), __comp);
02261 return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
02262 }
02263
02264
02265 template<typename _RandomAccessIterator, typename _Size>
02266 void
02267 __introsort_loop(_RandomAccessIterator __first,
02268 _RandomAccessIterator __last,
02269 _Size __depth_limit)
02270 {
02271 while (__last - __first > int(_S_threshold))
02272 {
02273 if (__depth_limit == 0)
02274 {
02275 _GLIBCXX_STD_P::partial_sort(__first, __last, __last);
02276 return;
02277 }
02278 --__depth_limit;
02279 _RandomAccessIterator __cut =
02280 std::__unguarded_partition_pivot(__first, __last);
02281 std::__introsort_loop(__cut, __last, __depth_limit);
02282 __last = __cut;
02283 }
02284 }
02285
02286
02287 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
02288 void
02289 __introsort_loop(_RandomAccessIterator __first,
02290 _RandomAccessIterator __last,
02291 _Size __depth_limit, _Compare __comp)
02292 {
02293 while (__last - __first > int(_S_threshold))
02294 {
02295 if (__depth_limit == 0)
02296 {
02297 _GLIBCXX_STD_P::partial_sort(__first, __last, __last, __comp);
02298 return;
02299 }
02300 --__depth_limit;
02301 _RandomAccessIterator __cut =
02302 std::__unguarded_partition_pivot(__first, __last, __comp);
02303 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
02304 __last = __cut;
02305 }
02306 }
02307
02308
02309
02310 template<typename _RandomAccessIterator, typename _Size>
02311 void
02312 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
02313 _RandomAccessIterator __last, _Size __depth_limit)
02314 {
02315 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02316 _ValueType;
02317
02318 while (__last - __first > 3)
02319 {
02320 if (__depth_limit == 0)
02321 {
02322 std::__heap_select(__first, __nth + 1, __last);
02323
02324
02325 std::iter_swap(__first, __nth);
02326 return;
02327 }
02328 --__depth_limit;
02329 _RandomAccessIterator __cut =
02330 std::__unguarded_partition_pivot(__first, __last);
02331 if (__cut <= __nth)
02332 __first = __cut;
02333 else
02334 __last = __cut;
02335 }
02336 std::__insertion_sort(__first, __last);
02337 }
02338
02339 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
02340 void
02341 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
02342 _RandomAccessIterator __last, _Size __depth_limit,
02343 _Compare __comp)
02344 {
02345 typedef typename iterator_traits<_RandomAccessIterator>::value_type
02346 _ValueType;
02347
02348 while (__last - __first > 3)
02349 {
02350 if (__depth_limit == 0)
02351 {
02352 std::__heap_select(__first, __nth + 1, __last, __comp);
02353
02354 std::iter_swap(__first, __nth);
02355 return;
02356 }
02357 --__depth_limit;
02358 _RandomAccessIterator __cut =
02359 std::__unguarded_partition_pivot(__first, __last, __comp);
02360 if (__cut <= __nth)
02361 __first = __cut;
02362 else
02363 __last = __cut;
02364 }
02365 std::__insertion_sort(__first, __last, __comp);
02366 }
02367
02368
02369
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380
02381
02382
02383
02384
02385
02386
02387
02388 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02389 _ForwardIterator
02390 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
02391 const _Tp& __val, _Compare __comp)
02392 {
02393 typedef typename iterator_traits<_ForwardIterator>::value_type
02394 _ValueType;
02395 typedef typename iterator_traits<_ForwardIterator>::difference_type
02396 _DistanceType;
02397
02398
02399 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02400 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02401 _ValueType, _Tp>)
02402 __glibcxx_requires_partitioned_lower_pred(__first, __last,
02403 __val, __comp);
02404
02405 _DistanceType __len = std::distance(__first, __last);
02406 _DistanceType __half;
02407 _ForwardIterator __middle;
02408
02409 while (__len > 0)
02410 {
02411 __half = __len >> 1;
02412 __middle = __first;
02413 std::advance(__middle, __half);
02414 if (__comp(*__middle, __val))
02415 {
02416 __first = __middle;
02417 ++__first;
02418 __len = __len - __half - 1;
02419 }
02420 else
02421 __len = __half;
02422 }
02423 return __first;
02424 }
02425
02426
02427
02428
02429
02430
02431
02432
02433
02434
02435
02436
02437 template<typename _ForwardIterator, typename _Tp>
02438 _ForwardIterator
02439 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
02440 const _Tp& __val)
02441 {
02442 typedef typename iterator_traits<_ForwardIterator>::value_type
02443 _ValueType;
02444 typedef typename iterator_traits<_ForwardIterator>::difference_type
02445 _DistanceType;
02446
02447
02448 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02449 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
02450 __glibcxx_requires_partitioned_upper(__first, __last, __val);
02451
02452 _DistanceType __len = std::distance(__first, __last);
02453 _DistanceType __half;
02454 _ForwardIterator __middle;
02455
02456 while (__len > 0)
02457 {
02458 __half = __len >> 1;
02459 __middle = __first;
02460 std::advance(__middle, __half);
02461 if (__val < *__middle)
02462 __len = __half;
02463 else
02464 {
02465 __first = __middle;
02466 ++__first;
02467 __len = __len - __half - 1;
02468 }
02469 }
02470 return __first;
02471 }
02472
02473
02474
02475
02476
02477
02478
02479
02480
02481
02482
02483
02484
02485
02486
02487
02488 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02489 _ForwardIterator
02490 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
02491 const _Tp& __val, _Compare __comp)
02492 {
02493 typedef typename iterator_traits<_ForwardIterator>::value_type
02494 _ValueType;
02495 typedef typename iterator_traits<_ForwardIterator>::difference_type
02496 _DistanceType;
02497
02498
02499 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02500 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02501 _Tp, _ValueType>)
02502 __glibcxx_requires_partitioned_upper_pred(__first, __last,
02503 __val, __comp);
02504
02505 _DistanceType __len = std::distance(__first, __last);
02506 _DistanceType __half;
02507 _ForwardIterator __middle;
02508
02509 while (__len > 0)
02510 {
02511 __half = __len >> 1;
02512 __middle = __first;
02513 std::advance(__middle, __half);
02514 if (__comp(__val, *__middle))
02515 __len = __half;
02516 else
02517 {
02518 __first = __middle;
02519 ++__first;
02520 __len = __len - __half - 1;
02521 }
02522 }
02523 return __first;
02524 }
02525
02526
02527
02528
02529
02530
02531
02532
02533
02534
02535
02536
02537
02538
02539
02540
02541
02542
02543 template<typename _ForwardIterator, typename _Tp>
02544 pair<_ForwardIterator, _ForwardIterator>
02545 equal_range(_ForwardIterator __first, _ForwardIterator __last,
02546 const _Tp& __val)
02547 {
02548 typedef typename iterator_traits<_ForwardIterator>::value_type
02549 _ValueType;
02550 typedef typename iterator_traits<_ForwardIterator>::difference_type
02551 _DistanceType;
02552
02553
02554 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02555 __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
02556 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
02557 __glibcxx_requires_partitioned_lower(__first, __last, __val);
02558 __glibcxx_requires_partitioned_upper(__first, __last, __val);
02559
02560 _DistanceType __len = std::distance(__first, __last);
02561 _DistanceType __half;
02562 _ForwardIterator __middle, __left, __right;
02563
02564 while (__len > 0)
02565 {
02566 __half = __len >> 1;
02567 __middle = __first;
02568 std::advance(__middle, __half);
02569 if (*__middle < __val)
02570 {
02571 __first = __middle;
02572 ++__first;
02573 __len = __len - __half - 1;
02574 }
02575 else if (__val < *__middle)
02576 __len = __half;
02577 else
02578 {
02579 __left = std::lower_bound(__first, __middle, __val);
02580 std::advance(__first, __len);
02581 __right = std::upper_bound(++__middle, __first, __val);
02582 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
02583 }
02584 }
02585 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
02586 }
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599
02600
02601
02602
02603
02604
02605 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02606 pair<_ForwardIterator, _ForwardIterator>
02607 equal_range(_ForwardIterator __first, _ForwardIterator __last,
02608 const _Tp& __val,
02609 _Compare __comp)
02610 {
02611 typedef typename iterator_traits<_ForwardIterator>::value_type
02612 _ValueType;
02613 typedef typename iterator_traits<_ForwardIterator>::difference_type
02614 _DistanceType;
02615
02616
02617 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02618 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02619 _ValueType, _Tp>)
02620 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02621 _Tp, _ValueType>)
02622 __glibcxx_requires_partitioned_lower_pred(__first, __last,
02623 __val, __comp);
02624 __glibcxx_requires_partitioned_upper_pred(__first, __last,
02625 __val, __comp);
02626
02627 _DistanceType __len = std::distance(__first, __last);
02628 _DistanceType __half;
02629 _ForwardIterator __middle, __left, __right;
02630
02631 while (__len > 0)
02632 {
02633 __half = __len >> 1;
02634 __middle = __first;
02635 std::advance(__middle, __half);
02636 if (__comp(*__middle, __val))
02637 {
02638 __first = __middle;
02639 ++__first;
02640 __len = __len - __half - 1;
02641 }
02642 else if (__comp(__val, *__middle))
02643 __len = __half;
02644 else
02645 {
02646 __left = std::lower_bound(__first, __middle, __val, __comp);
02647 std::advance(__first, __len);
02648 __right = std::upper_bound(++__middle, __first, __val, __comp);
02649 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
02650 }
02651 }
02652 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
02653 }
02654
02655
02656
02657
02658
02659
02660
02661
02662
02663
02664
02665
02666 template<typename _ForwardIterator, typename _Tp>
02667 bool
02668 binary_search(_ForwardIterator __first, _ForwardIterator __last,
02669 const _Tp& __val)
02670 {
02671 typedef typename iterator_traits<_ForwardIterator>::value_type
02672 _ValueType;
02673
02674
02675 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02676 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
02677 __glibcxx_requires_partitioned_lower(__first, __last, __val);
02678 __glibcxx_requires_partitioned_upper(__first, __last, __val);
02679
02680 _ForwardIterator __i = std::lower_bound(__first, __last, __val);
02681 return __i != __last && !(__val < *__i);
02682 }
02683
02684
02685
02686
02687
02688
02689
02690
02691
02692
02693
02694
02695
02696
02697
02698
02699 template<typename _ForwardIterator, typename _Tp, typename _Compare>
02700 bool
02701 binary_search(_ForwardIterator __first, _ForwardIterator __last,
02702 const _Tp& __val, _Compare __comp)
02703 {
02704 typedef typename iterator_traits<_ForwardIterator>::value_type
02705 _ValueType;
02706
02707
02708 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
02709 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
02710 _Tp, _ValueType>)
02711 __glibcxx_requires_partitioned_lower_pred(__first, __last,
02712 __val, __comp);
02713 __glibcxx_requires_partitioned_upper_pred(__first, __last,
02714 __val, __comp);
02715
02716 _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
02717 return __i != __last && !bool(__comp(__val, *__i));
02718 }
02719
02720
02721
02722
02723 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
02724 typename _BidirectionalIterator3>
02725 _BidirectionalIterator3
02726 __merge_backward(_BidirectionalIterator1 __first1,
02727 _BidirectionalIterator1 __last1,
02728 _BidirectionalIterator2 __first2,
02729 _BidirectionalIterator2 __last2,
02730 _BidirectionalIterator3 __result)
02731 {
02732 if (__first1 == __last1)
02733 return std::copy_backward(__first2, __last2, __result);
02734 if (__first2 == __last2)
02735 return std::copy_backward(__first1, __last1, __result);
02736 --__last1;
02737 --__last2;
02738 while (true)
02739 {
02740 if (*__last2 < *__last1)
02741 {
02742 *--__result = *__last1;
02743 if (__first1 == __last1)
02744 return std::copy_backward(__first2, ++__last2, __result);
02745 --__last1;
02746 }
02747 else
02748 {
02749 *--__result = *__last2;
02750 if (__first2 == __last2)
02751 return std::copy_backward(__first1, ++__last1, __result);
02752 --__last2;
02753 }
02754 }
02755 }
02756
02757
02758 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
02759 typename _BidirectionalIterator3, typename _Compare>
02760 _BidirectionalIterator3
02761 __merge_backward(_BidirectionalIterator1 __first1,
02762 _BidirectionalIterator1 __last1,
02763 _BidirectionalIterator2 __first2,
02764 _BidirectionalIterator2 __last2,
02765 _BidirectionalIterator3 __result,
02766 _Compare __comp)
02767 {
02768 if (__first1 == __last1)
02769 return std::copy_backward(__first2, __last2, __result);
02770 if (__first2 == __last2)
02771 return std::copy_backward(__first1, __last1, __result);
02772 --__last1;
02773 --__last2;
02774 while (true)
02775 {
02776 if (__comp(*__last2, *__last1))
02777 {
02778 *--__result = *__last1;
02779 if (__first1 == __last1)
02780 return std::copy_backward(__first2, ++__last2, __result);
02781 --__last1;
02782 }
02783 else
02784 {
02785 *--__result = *__last2;
02786 if (__first2 == __last2)
02787 return std::copy_backward(__first1, ++__last1, __result);
02788 --__last2;
02789 }
02790 }
02791 }
02792
02793
02794 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
02795 typename _Distance>
02796 _BidirectionalIterator1
02797 __rotate_adaptive(_BidirectionalIterator1 __first,
02798 _BidirectionalIterator1 __middle,
02799 _BidirectionalIterator1 __last,
02800 _Distance __len1, _Distance __len2,
02801 _BidirectionalIterator2 __buffer,
02802 _Distance __buffer_size)
02803 {
02804 _BidirectionalIterator2 __buffer_end;
02805 if (__len1 > __len2 && __len2 <= __buffer_size)
02806 {
02807 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
02808 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
02809 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
02810 }
02811 else if (__len1 <= __buffer_size)
02812 {
02813 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
02814 _GLIBCXX_MOVE3(__middle, __last, __first);
02815 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
02816 }
02817 else
02818 {
02819 std::rotate(__first, __middle, __last);
02820 std::advance(__first, std::distance(__middle, __last));
02821 return __first;
02822 }
02823 }
02824
02825
02826 template<typename _BidirectionalIterator, typename _Distance,
02827 typename _Pointer>
02828 void
02829 __merge_adaptive(_BidirectionalIterator __first,
02830 _BidirectionalIterator __middle,
02831 _BidirectionalIterator __last,
02832 _Distance __len1, _Distance __len2,
02833 _Pointer __buffer, _Distance __buffer_size)
02834 {
02835 if (__len1 <= __len2 && __len1 <= __buffer_size)
02836 {
02837 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
02838 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
02839 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
02840 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
02841 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
02842 __first);
02843 }
02844 else if (__len2 <= __buffer_size)
02845 {
02846 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
02847 std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
02848 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
02849 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
02850 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
02851 __last);
02852 }
02853 else
02854 {
02855 _BidirectionalIterator __first_cut = __first;
02856 _BidirectionalIterator __second_cut = __middle;
02857 _Distance __len11 = 0;
02858 _Distance __len22 = 0;
02859 if (__len1 > __len2)
02860 {
02861 __len11 = __len1 / 2;
02862 std::advance(__first_cut, __len11);
02863 __second_cut = std::lower_bound(__middle, __last,
02864 *__first_cut);
02865 __len22 = std::distance(__middle, __second_cut);
02866 }
02867 else
02868 {
02869 __len22 = __len2 / 2;
02870 std::advance(__second_cut, __len22);
02871 __first_cut = std::upper_bound(__first, __middle,
02872 *__second_cut);
02873 __len11 = std::distance(__first, __first_cut);
02874 }
02875 _BidirectionalIterator __new_middle =
02876 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
02877 __len1 - __len11, __len22, __buffer,
02878 __buffer_size);
02879 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
02880 __len22, __buffer, __buffer_size);
02881 std::__merge_adaptive(__new_middle, __second_cut, __last,
02882 __len1 - __len11,
02883 __len2 - __len22, __buffer, __buffer_size);
02884 }
02885 }
02886
02887
02888 template<typename _BidirectionalIterator, typename _Distance,
02889 typename _Pointer, typename _Compare>
02890 void
02891 __merge_adaptive(_BidirectionalIterator __first,
02892 _BidirectionalIterator __middle,
02893 _BidirectionalIterator __last,
02894 _Distance __len1, _Distance __len2,
02895 _Pointer __buffer, _Distance __buffer_size,
02896 _Compare __comp)
02897 {
02898 if (__len1 <= __len2 && __len1 <= __buffer_size)
02899 {
02900 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
02901 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
02902 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
02903 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
02904 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
02905 __first, __comp);
02906 }
02907 else if (__len2 <= __buffer_size)
02908 {
02909 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
02910 std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
02911 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
02912 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
02913 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
02914 __last,__comp);
02915 }
02916 else
02917 {
02918 _BidirectionalIterator __first_cut = __first;
02919 _BidirectionalIterator __second_cut = __middle;
02920 _Distance __len11 = 0;
02921 _Distance __len22 = 0;
02922 if (__len1 > __len2)
02923 {
02924 __len11 = __len1 / 2;
02925 std::advance(__first_cut, __len11);
02926 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
02927 __comp);
02928 __len22 = std::distance(__middle, __second_cut);
02929 }
02930 else
02931 {
02932 __len22 = __len2 / 2;
02933 std::advance(__second_cut, __len22);
02934 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
02935 __comp);
02936 __len11 = std::distance(__first, __first_cut);
02937 }
02938 _BidirectionalIterator __new_middle =
02939 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
02940 __len1 - __len11, __len22, __buffer,
02941 __buffer_size);
02942 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
02943 __len22, __buffer, __buffer_size, __comp);
02944 std::__merge_adaptive(__new_middle, __second_cut, __last,
02945 __len1 - __len11,
02946 __len2 - __len22, __buffer,
02947 __buffer_size, __comp);
02948 }
02949 }
02950
02951
02952 template<typename _BidirectionalIterator, typename _Distance>
02953 void
02954 __merge_without_buffer(_BidirectionalIterator __first,
02955 _BidirectionalIterator __middle,
02956 _BidirectionalIterator __last,
02957 _Distance __len1, _Distance __len2)
02958 {
02959 if (__len1 == 0 || __len2 == 0)
02960 return;
02961 if (__len1 + __len2 == 2)
02962 {
02963 if (*__middle < *__first)
02964 std::iter_swap(__first, __middle);
02965 return;
02966 }
02967 _BidirectionalIterator __first_cut = __first;
02968 _BidirectionalIterator __second_cut = __middle;
02969 _Distance __len11 = 0;
02970 _Distance __len22 = 0;
02971 if (__len1 > __len2)
02972 {
02973 __len11 = __len1 / 2;
02974 std::advance(__first_cut, __len11);
02975 __second_cut = std::lower_bound(__middle, __last, *__first_cut);
02976 __len22 = std::distance(__middle, __second_cut);
02977 }
02978 else
02979 {
02980 __len22 = __len2 / 2;
02981 std::advance(__second_cut, __len22);
02982 __first_cut = std::upper_bound(__first, __middle, *__second_cut);
02983 __len11 = std::distance(__first, __first_cut);
02984 }
02985 std::rotate(__first_cut, __middle, __second_cut);
02986 _BidirectionalIterator __new_middle = __first_cut;
02987 std::advance(__new_middle, std::distance(__middle, __second_cut));
02988 std::__merge_without_buffer(__first, __first_cut, __new_middle,
02989 __len11, __len22);
02990 std::__merge_without_buffer(__new_middle, __second_cut, __last,
02991 __len1 - __len11, __len2 - __len22);
02992 }
02993
02994
02995 template<typename _BidirectionalIterator, typename _Distance,
02996 typename _Compare>
02997 void
02998 __merge_without_buffer(_BidirectionalIterator __first,
02999 _BidirectionalIterator __middle,
03000 _BidirectionalIterator __last,
03001 _Distance __len1, _Distance __len2,
03002 _Compare __comp)
03003 {
03004 if (__len1 == 0 || __len2 == 0)
03005 return;
03006 if (__len1 + __len2 == 2)
03007 {
03008 if (__comp(*__middle, *__first))
03009 std::iter_swap(__first, __middle);
03010 return;
03011 }
03012 _BidirectionalIterator __first_cut = __first;
03013 _BidirectionalIterator __second_cut = __middle;
03014 _Distance __len11 = 0;
03015 _Distance __len22 = 0;
03016 if (__len1 > __len2)
03017 {
03018 __len11 = __len1 / 2;
03019 std::advance(__first_cut, __len11);
03020 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
03021 __comp);
03022 __len22 = std::distance(__middle, __second_cut);
03023 }
03024 else
03025 {
03026 __len22 = __len2 / 2;
03027 std::advance(__second_cut, __len22);
03028 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
03029 __comp);
03030 __len11 = std::distance(__first, __first_cut);
03031 }
03032 std::rotate(__first_cut, __middle, __second_cut);
03033 _BidirectionalIterator __new_middle = __first_cut;
03034 std::advance(__new_middle, std::distance(__middle, __second_cut));
03035 std::__merge_without_buffer(__first, __first_cut, __new_middle,
03036 __len11, __len22, __comp);
03037 std::__merge_without_buffer(__new_middle, __second_cut, __last,
03038 __len1 - __len11, __len2 - __len22, __comp);
03039 }
03040
03041
03042
03043
03044
03045
03046
03047
03048
03049
03050
03051
03052
03053
03054
03055
03056
03057
03058
03059 template<typename _BidirectionalIterator>
03060 void
03061 inplace_merge(_BidirectionalIterator __first,
03062 _BidirectionalIterator __middle,
03063 _BidirectionalIterator __last)
03064 {
03065 typedef typename iterator_traits<_BidirectionalIterator>::value_type
03066 _ValueType;
03067 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
03068 _DistanceType;
03069
03070
03071 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
03072 _BidirectionalIterator>)
03073 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
03074 __glibcxx_requires_sorted(__first, __middle);
03075 __glibcxx_requires_sorted(__middle, __last);
03076
03077 if (__first == __middle || __middle == __last)
03078 return;
03079
03080 _DistanceType __len1 = std::distance(__first, __middle);
03081 _DistanceType __len2 = std::distance(__middle, __last);
03082
03083 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
03084 __last);
03085 if (__buf.begin() == 0)
03086 std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
03087 else
03088 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
03089 __buf.begin(), _DistanceType(__buf.size()));
03090 }
03091
03092
03093
03094
03095
03096
03097
03098
03099
03100
03101
03102
03103
03104
03105
03106
03107
03108
03109
03110
03111
03112
03113
03114 template<typename _BidirectionalIterator, typename _Compare>
03115 void
03116 inplace_merge(_BidirectionalIterator __first,
03117 _BidirectionalIterator __middle,
03118 _BidirectionalIterator __last,
03119 _Compare __comp)
03120 {
03121 typedef typename iterator_traits<_BidirectionalIterator>::value_type
03122 _ValueType;
03123 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
03124 _DistanceType;
03125
03126
03127 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
03128 _BidirectionalIterator>)
03129 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03130 _ValueType, _ValueType>)
03131 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
03132 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
03133
03134 if (__first == __middle || __middle == __last)
03135 return;
03136
03137 const _DistanceType __len1 = std::distance(__first, __middle);
03138 const _DistanceType __len2 = std::distance(__middle, __last);
03139
03140 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
03141 __last);
03142 if (__buf.begin() == 0)
03143 std::__merge_without_buffer(__first, __middle, __last, __len1,
03144 __len2, __comp);
03145 else
03146 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
03147 __buf.begin(), _DistanceType(__buf.size()),
03148 __comp);
03149 }
03150
03151 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
03152 typename _Distance>
03153 void
03154 __merge_sort_loop(_RandomAccessIterator1 __first,
03155 _RandomAccessIterator1 __last,
03156 _RandomAccessIterator2 __result,
03157 _Distance __step_size)
03158 {
03159 const _Distance __two_step = 2 * __step_size;
03160
03161 while (__last - __first >= __two_step)
03162 {
03163 __result = _GLIBCXX_STD_P::merge(
03164 _GLIBCXX_MAKE_MOVE_ITERATOR(__first),
03165 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __step_size),
03166 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __step_size),
03167 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __two_step),
03168 __result);
03169 __first += __two_step;
03170 }
03171
03172 __step_size = std::min(_Distance(__last - __first), __step_size);
03173 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
03174 _GLIBCXX_MAKE_MOVE_ITERATOR(__first +
03175 __step_size),
03176 _GLIBCXX_MAKE_MOVE_ITERATOR(__first +
03177 __step_size),
03178 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
03179 __result);
03180 }
03181
03182 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
03183 typename _Distance, typename _Compare>
03184 void
03185 __merge_sort_loop(_RandomAccessIterator1 __first,
03186 _RandomAccessIterator1 __last,
03187 _RandomAccessIterator2 __result, _Distance __step_size,
03188 _Compare __comp)
03189 {
03190 const _Distance __two_step = 2 * __step_size;
03191
03192 while (__last - __first >= __two_step)
03193 {
03194 __result = _GLIBCXX_STD_P::merge(
03195 _GLIBCXX_MAKE_MOVE_ITERATOR(__first),
03196 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __step_size),
03197 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __step_size),
03198 _GLIBCXX_MAKE_MOVE_ITERATOR(__first + __two_step),
03199 __result, __comp);
03200 __first += __two_step;
03201 }
03202 __step_size = std::min(_Distance(__last - __first), __step_size);
03203
03204 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
03205 _GLIBCXX_MAKE_MOVE_ITERATOR(__first +
03206 __step_size),
03207 _GLIBCXX_MAKE_MOVE_ITERATOR(__first +
03208 __step_size),
03209 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
03210 __result, __comp);
03211 }
03212
03213 template<typename _RandomAccessIterator, typename _Distance>
03214 void
03215 __chunk_insertion_sort(_RandomAccessIterator __first,
03216 _RandomAccessIterator __last,
03217 _Distance __chunk_size)
03218 {
03219 while (__last - __first >= __chunk_size)
03220 {
03221 std::__insertion_sort(__first, __first + __chunk_size);
03222 __first += __chunk_size;
03223 }
03224 std::__insertion_sort(__first, __last);
03225 }
03226
03227 template<typename _RandomAccessIterator, typename _Distance,
03228 typename _Compare>
03229 void
03230 __chunk_insertion_sort(_RandomAccessIterator __first,
03231 _RandomAccessIterator __last,
03232 _Distance __chunk_size, _Compare __comp)
03233 {
03234 while (__last - __first >= __chunk_size)
03235 {
03236 std::__insertion_sort(__first, __first + __chunk_size, __comp);
03237 __first += __chunk_size;
03238 }
03239 std::__insertion_sort(__first, __last, __comp);
03240 }
03241
03242 enum { _S_chunk_size = 7 };
03243
03244 template<typename _RandomAccessIterator, typename _Pointer>
03245 void
03246 __merge_sort_with_buffer(_RandomAccessIterator __first,
03247 _RandomAccessIterator __last,
03248 _Pointer __buffer)
03249 {
03250 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03251 _Distance;
03252
03253 const _Distance __len = __last - __first;
03254 const _Pointer __buffer_last = __buffer + __len;
03255
03256 _Distance __step_size = _S_chunk_size;
03257 std::__chunk_insertion_sort(__first, __last, __step_size);
03258
03259 while (__step_size < __len)
03260 {
03261 std::__merge_sort_loop(__first, __last, __buffer, __step_size);
03262 __step_size *= 2;
03263 std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
03264 __step_size *= 2;
03265 }
03266 }
03267
03268 template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
03269 void
03270 __merge_sort_with_buffer(_RandomAccessIterator __first,
03271 _RandomAccessIterator __last,
03272 _Pointer __buffer, _Compare __comp)
03273 {
03274 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
03275 _Distance;
03276
03277 const _Distance __len = __last - __first;
03278 const _Pointer __buffer_last = __buffer + __len;
03279
03280 _Distance __step_size = _S_chunk_size;
03281 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
03282
03283 while (__step_size < __len)
03284 {
03285 std::__merge_sort_loop(__first, __last, __buffer,
03286 __step_size, __comp);
03287 __step_size *= 2;
03288 std::__merge_sort_loop(__buffer, __buffer_last, __first,
03289 __step_size, __comp);
03290 __step_size *= 2;
03291 }
03292 }
03293
03294 template<typename _RandomAccessIterator, typename _Pointer,
03295 typename _Distance>
03296 void
03297 __stable_sort_adaptive(_RandomAccessIterator __first,
03298 _RandomAccessIterator __last,
03299 _Pointer __buffer, _Distance __buffer_size)
03300 {
03301 const _Distance __len = (__last - __first + 1) / 2;
03302 const _RandomAccessIterator __middle = __first + __len;
03303 if (__len > __buffer_size)
03304 {
03305 std::__stable_sort_adaptive(__first, __middle,
03306 __buffer, __buffer_size);
03307 std::__stable_sort_adaptive(__middle, __last,
03308 __buffer, __buffer_size);
03309 }
03310 else
03311 {
03312 std::__merge_sort_with_buffer(__first, __middle, __buffer);
03313 std::__merge_sort_with_buffer(__middle, __last, __buffer);
03314 }
03315 std::__merge_adaptive(__first, __middle, __last,
03316 _Distance(__middle - __first),
03317 _Distance(__last - __middle),
03318 __buffer, __buffer_size);
03319 }
03320
03321 template<typename _RandomAccessIterator, typename _Pointer,
03322 typename _Distance, typename _Compare>
03323 void
03324 __stable_sort_adaptive(_RandomAccessIterator __first,
03325 _RandomAccessIterator __last,
03326 _Pointer __buffer, _Distance __buffer_size,
03327 _Compare __comp)
03328 {
03329 const _Distance __len = (__last - __first + 1) / 2;
03330 const _RandomAccessIterator __middle = __first + __len;
03331 if (__len > __buffer_size)
03332 {
03333 std::__stable_sort_adaptive(__first, __middle, __buffer,
03334 __buffer_size, __comp);
03335 std::__stable_sort_adaptive(__middle, __last, __buffer,
03336 __buffer_size, __comp);
03337 }
03338 else
03339 {
03340 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
03341 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
03342 }
03343 std::__merge_adaptive(__first, __middle, __last,
03344 _Distance(__middle - __first),
03345 _Distance(__last - __middle),
03346 __buffer, __buffer_size,
03347 __comp);
03348 }
03349
03350
03351 template<typename _RandomAccessIterator>
03352 void
03353 __inplace_stable_sort(_RandomAccessIterator __first,
03354 _RandomAccessIterator __last)
03355 {
03356 if (__last - __first < 15)
03357 {
03358 std::__insertion_sort(__first, __last);
03359 return;
03360 }
03361 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
03362 std::__inplace_stable_sort(__first, __middle);
03363 std::__inplace_stable_sort(__middle, __last);
03364 std::__merge_without_buffer(__first, __middle, __last,
03365 __middle - __first,
03366 __last - __middle);
03367 }
03368
03369
03370 template<typename _RandomAccessIterator, typename _Compare>
03371 void
03372 __inplace_stable_sort(_RandomAccessIterator __first,
03373 _RandomAccessIterator __last, _Compare __comp)
03374 {
03375 if (__last - __first < 15)
03376 {
03377 std::__insertion_sort(__first, __last, __comp);
03378 return;
03379 }
03380 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
03381 std::__inplace_stable_sort(__first, __middle, __comp);
03382 std::__inplace_stable_sort(__middle, __last, __comp);
03383 std::__merge_without_buffer(__first, __middle, __last,
03384 __middle - __first,
03385 __last - __middle,
03386 __comp);
03387 }
03388
03389
03390
03391
03392
03393
03394
03395
03396
03397
03398
03399
03400
03401
03402
03403
03404
03405
03406
03407
03408
03409
03410
03411
03412 template<typename _InputIterator1, typename _InputIterator2>
03413 bool
03414 includes(_InputIterator1 __first1, _InputIterator1 __last1,
03415 _InputIterator2 __first2, _InputIterator2 __last2)
03416 {
03417 typedef typename iterator_traits<_InputIterator1>::value_type
03418 _ValueType1;
03419 typedef typename iterator_traits<_InputIterator2>::value_type
03420 _ValueType2;
03421
03422
03423 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
03424 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
03425 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
03426 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
03427 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
03428 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
03429
03430 while (__first1 != __last1 && __first2 != __last2)
03431 if (*__first2 < *__first1)
03432 return false;
03433 else if(*__first1 < *__first2)
03434 ++__first1;
03435 else
03436 ++__first1, ++__first2;
03437
03438 return __first2 == __last2;
03439 }
03440
03441
03442
03443
03444
03445
03446
03447
03448
03449
03450
03451
03452
03453
03454
03455
03456
03457
03458
03459
03460
03461 template<typename _InputIterator1, typename _InputIterator2,
03462 typename _Compare>
03463 bool
03464 includes(_InputIterator1 __first1, _InputIterator1 __last1,
03465 _InputIterator2 __first2, _InputIterator2 __last2,
03466 _Compare __comp)
03467 {
03468 typedef typename iterator_traits<_InputIterator1>::value_type
03469 _ValueType1;
03470 typedef typename iterator_traits<_InputIterator2>::value_type
03471 _ValueType2;
03472
03473
03474 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
03475 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
03476 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03477 _ValueType1, _ValueType2>)
03478 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03479 _ValueType2, _ValueType1>)
03480 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
03481 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
03482
03483 while (__first1 != __last1 && __first2 != __last2)
03484 if (__comp(*__first2, *__first1))
03485 return false;
03486 else if(__comp(*__first1, *__first2))
03487 ++__first1;
03488 else
03489 ++__first1, ++__first2;
03490
03491 return __first2 == __last2;
03492 }
03493
03494
03495
03496
03497
03498
03499
03500
03501
03502
03503
03504
03505
03506
03507
03508
03509
03510
03511
03512
03513
03514
03515
03516 template<typename _BidirectionalIterator>
03517 bool
03518 next_permutation(_BidirectionalIterator __first,
03519 _BidirectionalIterator __last)
03520 {
03521
03522 __glibcxx_function_requires(_BidirectionalIteratorConcept<
03523 _BidirectionalIterator>)
03524 __glibcxx_function_requires(_LessThanComparableConcept<
03525 typename iterator_traits<_BidirectionalIterator>::value_type>)
03526 __glibcxx_requires_valid_range(__first, __last);
03527
03528 if (__first == __last)
03529 return false;
03530 _BidirectionalIterator __i = __first;
03531 ++__i;
03532 if (__i == __last)
03533 return false;
03534 __i = __last;
03535 --__i;
03536
03537 for(;;)
03538 {
03539 _BidirectionalIterator __ii = __i;
03540 --__i;
03541 if (*__i < *__ii)
03542 {
03543 _BidirectionalIterator __j = __last;
03544 while (!(*__i < *--__j))
03545 {}
03546 std::iter_swap(__i, __j);
03547 std::reverse(__ii, __last);
03548 return true;
03549 }
03550 if (__i == __first)
03551 {
03552 std::reverse(__first, __last);
03553 return false;
03554 }
03555 }
03556 }
03557
03558
03559
03560
03561
03562
03563
03564
03565
03566
03567
03568
03569
03570
03571
03572
03573 template<typename _BidirectionalIterator, typename _Compare>
03574 bool
03575 next_permutation(_BidirectionalIterator __first,
03576 _BidirectionalIterator __last, _Compare __comp)
03577 {
03578
03579 __glibcxx_function_requires(_BidirectionalIteratorConcept<
03580 _BidirectionalIterator>)
03581 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03582 typename iterator_traits<_BidirectionalIterator>::value_type,
03583 typename iterator_traits<_BidirectionalIterator>::value_type>)
03584 __glibcxx_requires_valid_range(__first, __last);
03585
03586 if (__first == __last)
03587 return false;
03588 _BidirectionalIterator __i = __first;
03589 ++__i;
03590 if (__i == __last)
03591 return false;
03592 __i = __last;
03593 --__i;
03594
03595 for(;;)
03596 {
03597 _BidirectionalIterator __ii = __i;
03598 --__i;
03599 if (__comp(*__i, *__ii))
03600 {
03601 _BidirectionalIterator __j = __last;
03602 while (!bool(__comp(*__i, *--__j)))
03603 {}
03604 std::iter_swap(__i, __j);
03605 std::reverse(__ii, __last);
03606 return true;
03607 }
03608 if (__i == __first)
03609 {
03610 std::reverse(__first, __last);
03611 return false;
03612 }
03613 }
03614 }
03615
03616
03617
03618
03619
03620
03621
03622
03623
03624
03625
03626
03627
03628
03629 template<typename _BidirectionalIterator>
03630 bool
03631 prev_permutation(_BidirectionalIterator __first,
03632 _BidirectionalIterator __last)
03633 {
03634
03635 __glibcxx_function_requires(_BidirectionalIteratorConcept<
03636 _BidirectionalIterator>)
03637 __glibcxx_function_requires(_LessThanComparableConcept<
03638 typename iterator_traits<_BidirectionalIterator>::value_type>)
03639 __glibcxx_requires_valid_range(__first, __last);
03640
03641 if (__first == __last)
03642 return false;
03643 _BidirectionalIterator __i = __first;
03644 ++__i;
03645 if (__i == __last)
03646 return false;
03647 __i = __last;
03648 --__i;
03649
03650 for(;;)
03651 {
03652 _BidirectionalIterator __ii = __i;
03653 --__i;
03654 if (*__ii < *__i)
03655 {
03656 _BidirectionalIterator __j = __last;
03657 while (!(*--__j < *__i))
03658 {}
03659 std::iter_swap(__i, __j);
03660 std::reverse(__ii, __last);
03661 return true;
03662 }
03663 if (__i == __first)
03664 {
03665 std::reverse(__first, __last);
03666 return false;
03667 }
03668 }
03669 }
03670
03671
03672
03673
03674
03675
03676
03677
03678
03679
03680
03681
03682
03683
03684
03685
03686 template<typename _BidirectionalIterator, typename _Compare>
03687 bool
03688 prev_permutation(_BidirectionalIterator __first,
03689 _BidirectionalIterator __last, _Compare __comp)
03690 {
03691
03692 __glibcxx_function_requires(_BidirectionalIteratorConcept<
03693 _BidirectionalIterator>)
03694 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03695 typename iterator_traits<_BidirectionalIterator>::value_type,
03696 typename iterator_traits<_BidirectionalIterator>::value_type>)
03697 __glibcxx_requires_valid_range(__first, __last);
03698
03699 if (__first == __last)
03700 return false;
03701 _BidirectionalIterator __i = __first;
03702 ++__i;
03703 if (__i == __last)
03704 return false;
03705 __i = __last;
03706 --__i;
03707
03708 for(;;)
03709 {
03710 _BidirectionalIterator __ii = __i;
03711 --__i;
03712 if (__comp(*__ii, *__i))
03713 {
03714 _BidirectionalIterator __j = __last;
03715 while (!bool(__comp(*--__j, *__i)))
03716 {}
03717 std::iter_swap(__i, __j);
03718 std::reverse(__ii, __last);
03719 return true;
03720 }
03721 if (__i == __first)
03722 {
03723 std::reverse(__first, __last);
03724 return false;
03725 }
03726 }
03727 }
03728
03729
03730
03731
03732
03733
03734
03735
03736
03737
03738
03739
03740
03741
03742
03743
03744
03745
03746 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
03747 _OutputIterator
03748 replace_copy(_InputIterator __first, _InputIterator __last,
03749 _OutputIterator __result,
03750 const _Tp& __old_value, const _Tp& __new_value)
03751 {
03752
03753 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
03754 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
03755 typename iterator_traits<_InputIterator>::value_type>)
03756 __glibcxx_function_requires(_EqualOpConcept<
03757 typename iterator_traits<_InputIterator>::value_type, _Tp>)
03758 __glibcxx_requires_valid_range(__first, __last);
03759
03760 for (; __first != __last; ++__first, ++__result)
03761 if (*__first == __old_value)
03762 *__result = __new_value;
03763 else
03764 *__result = *__first;
03765 return __result;
03766 }
03767
03768
03769
03770
03771
03772
03773
03774
03775
03776
03777
03778
03779
03780
03781
03782
03783 template<typename _InputIterator, typename _OutputIterator,
03784 typename _Predicate, typename _Tp>
03785 _OutputIterator
03786 replace_copy_if(_InputIterator __first, _InputIterator __last,
03787 _OutputIterator __result,
03788 _Predicate __pred, const _Tp& __new_value)
03789 {
03790
03791 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
03792 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
03793 typename iterator_traits<_InputIterator>::value_type>)
03794 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
03795 typename iterator_traits<_InputIterator>::value_type>)
03796 __glibcxx_requires_valid_range(__first, __last);
03797
03798 for (; __first != __last; ++__first, ++__result)
03799 if (__pred(*__first))
03800 *__result = __new_value;
03801 else
03802 *__result = *__first;
03803 return __result;
03804 }
03805
03806 #ifdef __GXX_EXPERIMENTAL_CXX0X__
03807
03808
03809
03810
03811
03812
03813
03814 template<typename _ForwardIterator>
03815 inline bool
03816 is_sorted(_ForwardIterator __first, _ForwardIterator __last)
03817 { return std::is_sorted_until(__first, __last) == __last; }
03818
03819
03820
03821
03822
03823
03824
03825
03826
03827
03828 template<typename _ForwardIterator, typename _Compare>
03829 inline bool
03830 is_sorted(_ForwardIterator __first, _ForwardIterator __last,
03831 _Compare __comp)
03832 { return std::is_sorted_until(__first, __last, __comp) == __last; }
03833
03834
03835
03836
03837
03838
03839
03840
03841
03842 template<typename _ForwardIterator>
03843 _ForwardIterator
03844 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
03845 {
03846
03847 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
03848 __glibcxx_function_requires(_LessThanComparableConcept<
03849 typename iterator_traits<_ForwardIterator>::value_type>)
03850 __glibcxx_requires_valid_range(__first, __last);
03851
03852 if (__first == __last)
03853 return __last;
03854
03855 _ForwardIterator __next = __first;
03856 for (++__next; __next != __last; __first = __next, ++__next)
03857 if (*__next < *__first)
03858 return __next;
03859 return __next;
03860 }
03861
03862
03863
03864
03865
03866
03867
03868
03869
03870
03871 template<typename _ForwardIterator, typename _Compare>
03872 _ForwardIterator
03873 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
03874 _Compare __comp)
03875 {
03876
03877 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
03878 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
03879 typename iterator_traits<_ForwardIterator>::value_type,
03880 typename iterator_traits<_ForwardIterator>::value_type>)
03881 __glibcxx_requires_valid_range(__first, __last);
03882
03883 if (__first == __last)
03884 return __last;
03885
03886 _ForwardIterator __next = __first;
03887 for (++__next; __next != __last; __first = __next, ++__next)
03888 if (__comp(*__next, *__first))
03889 return __next;
03890 return __next;
03891 }
03892
03893
03894
03895
03896
03897
03898
03899
03900 template<typename _Tp>
03901 inline pair<const _Tp&, const _Tp&>
03902 minmax(const _Tp& __a, const _Tp& __b)
03903 {
03904
03905 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
03906
03907 return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
03908 : pair<const _Tp&, const _Tp&>(__a, __b);
03909 }
03910
03911
03912
03913
03914
03915
03916
03917
03918
03919 template<typename _Tp, typename _Compare>
03920 inline pair<const _Tp&, const _Tp&>
03921 minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
03922 {
03923 return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a)
03924 : pair<const _Tp&, const _Tp&>(__a, __b);
03925 }
03926
03927
03928
03929
03930
03931
03932
03933
03934
03935
03936
03937
03938 template<typename _ForwardIterator>
03939 pair<_ForwardIterator, _ForwardIterator>
03940 minmax_element(_ForwardIterator __first, _ForwardIterator __last)
03941 {
03942
03943 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
03944 __glibcxx_function_requires(_LessThanComparableConcept<
03945 typename iterator_traits<_ForwardIterator>::value_type>)
03946 __glibcxx_requires_valid_range(__first, __last);
03947
03948 _ForwardIterator __next = __first;
03949 if (__first == __last
03950 || ++__next == __last)
03951 return std::make_pair(__first, __first);
03952
03953 _ForwardIterator __min, __max;
03954 if (*__next < *__first)
03955 {
03956 __min = __next;
03957 __max = __first;
03958 }
03959 else
03960 {
03961 __min = __first;
03962 __max = __next;
03963 }
03964
03965 __first = __next;
03966 ++__first;
03967
03968 while (__first != __last)
03969 {
03970 __next = __first;
03971 if (++__next == __last)
03972 {
03973 if (*__first < *__min)
03974 __min = __first;
03975 else if (!(*__first < *__max))
03976 __max = __first;
03977 break;
03978 }
03979
03980 if (*__next < *__first)
03981 {
03982 if (*__next < *__min)
03983 __min = __next;
03984 if (!(*__first < *__max))
03985 __max = __first;
03986 }
03987 else
03988 {
03989 if (*__first < *__min)
03990 __min = __first;
03991 if (!(*__next < *__max))
03992 __max = __next;
03993 }
03994
03995 __first = __next;
03996 ++__first;
03997 }
03998
03999 return std::make_pair(__min, __max);
04000 }
04001
04002
04003
04004
04005
04006
04007
04008
04009
04010
04011
04012
04013
04014 template<typename _ForwardIterator, typename _Compare>
04015 pair<_ForwardIterator, _ForwardIterator>
04016 minmax_element(_ForwardIterator __first, _ForwardIterator __last,
04017 _Compare __comp)
04018 {
04019
04020 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04021 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
04022 typename iterator_traits<_ForwardIterator>::value_type,
04023 typename iterator_traits<_ForwardIterator>::value_type>)
04024 __glibcxx_requires_valid_range(__first, __last);
04025
04026 _ForwardIterator __next = __first;
04027 if (__first == __last
04028 || ++__next == __last)
04029 return std::make_pair(__first, __first);
04030
04031 _ForwardIterator __min, __max;
04032 if (__comp(*__next, *__first))
04033 {
04034 __min = __next;
04035 __max = __first;
04036 }
04037 else
04038 {
04039 __min = __first;
04040 __max = __next;
04041 }
04042
04043 __first = __next;
04044 ++__first;
04045
04046 while (__first != __last)
04047 {
04048 __next = __first;
04049 if (++__next == __last)
04050 {
04051 if (__comp(*__first, *__min))
04052 __min = __first;
04053 else if (!__comp(*__first, *__max))
04054 __max = __first;
04055 break;
04056 }
04057
04058 if (__comp(*__next, *__first))
04059 {
04060 if (__comp(*__next, *__min))
04061 __min = __next;
04062 if (!__comp(*__first, *__max))
04063 __max = __first;
04064 }
04065 else
04066 {
04067 if (__comp(*__first, *__min))
04068 __min = __first;
04069 if (!__comp(*__next, *__max))
04070 __max = __next;
04071 }
04072
04073 __first = __next;
04074 ++__first;
04075 }
04076
04077 return std::make_pair(__min, __max);
04078 }
04079
04080
04081 template<typename _Tp>
04082 inline _Tp
04083 min(initializer_list<_Tp> __l)
04084 { return *std::min_element(__l.begin(), __l.end()); }
04085
04086 template<typename _Tp, typename _Compare>
04087 inline _Tp
04088 min(initializer_list<_Tp> __l, _Compare __comp)
04089 { return *std::min_element(__l.begin(), __l.end(), __comp); }
04090
04091 template<typename _Tp>
04092 inline _Tp
04093 max(initializer_list<_Tp> __l)
04094 { return *std::max_element(__l.begin(), __l.end()); }
04095
04096 template<typename _Tp, typename _Compare>
04097 inline _Tp
04098 max(initializer_list<_Tp> __l, _Compare __comp)
04099 { return *std::max_element(__l.begin(), __l.end(), __comp); }
04100
04101 template<typename _Tp>
04102 inline pair<_Tp, _Tp>
04103 minmax(initializer_list<_Tp> __l)
04104 {
04105 pair<const _Tp*, const _Tp*> __p =
04106 std::minmax_element(__l.begin(), __l.end());
04107 return std::make_pair(*__p.first, *__p.second);
04108 }
04109
04110 template<typename _Tp, typename _Compare>
04111 inline pair<_Tp, _Tp>
04112 minmax(initializer_list<_Tp> __l, _Compare __comp)
04113 {
04114 pair<const _Tp*, const _Tp*> __p =
04115 std::minmax_element(__l.begin(), __l.end(), __comp);
04116 return std::make_pair(*__p.first, *__p.second);
04117 }
04118
04119 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
04120
04121
04122
04123
04124
04125
04126
04127
04128
04129
04130
04131
04132 template<typename _RandomAccessIterator,
04133 typename _UniformRandomNumberGenerator>
04134 void
04135 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
04136 _UniformRandomNumberGenerator& __g)
04137 {
04138
04139 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
04140 _RandomAccessIterator>)
04141 __glibcxx_requires_valid_range(__first, __last);
04142
04143 if (__first == __last)
04144 return;
04145
04146 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
04147 _DistanceType;
04148
04149 typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
04150 typedef typename std::uniform_int_distribution<__ud_type> __distr_type;
04151 typedef typename __distr_type::param_type __p_type;
04152 __distr_type __d;
04153
04154 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
04155 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
04156 }
04157 #endif
04158
04159 #endif // __GXX_EXPERIMENTAL_CXX0X__
04160
04161 _GLIBCXX_END_NAMESPACE
04162
04163 _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P)
04164
04165
04166
04167
04168
04169
04170
04171
04172
04173
04174
04175
04176
04177 template<typename _InputIterator, typename _Function>
04178 _Function
04179 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
04180 {
04181
04182 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04183 __glibcxx_requires_valid_range(__first, __last);
04184 for (; __first != __last; ++__first)
04185 __f(*__first);
04186 return _GLIBCXX_MOVE(__f);
04187 }
04188
04189
04190
04191
04192
04193
04194
04195
04196
04197
04198 template<typename _InputIterator, typename _Tp>
04199 inline _InputIterator
04200 find(_InputIterator __first, _InputIterator __last,
04201 const _Tp& __val)
04202 {
04203
04204 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04205 __glibcxx_function_requires(_EqualOpConcept<
04206 typename iterator_traits<_InputIterator>::value_type, _Tp>)
04207 __glibcxx_requires_valid_range(__first, __last);
04208 return std::__find(__first, __last, __val,
04209 std::__iterator_category(__first));
04210 }
04211
04212
04213
04214
04215
04216
04217
04218
04219
04220
04221
04222 template<typename _InputIterator, typename _Predicate>
04223 inline _InputIterator
04224 find_if(_InputIterator __first, _InputIterator __last,
04225 _Predicate __pred)
04226 {
04227
04228 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04229 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
04230 typename iterator_traits<_InputIterator>::value_type>)
04231 __glibcxx_requires_valid_range(__first, __last);
04232 return std::__find_if(__first, __last, __pred,
04233 std::__iterator_category(__first));
04234 }
04235
04236
04237
04238
04239
04240
04241
04242
04243
04244
04245
04246
04247
04248
04249
04250
04251 template<typename _InputIterator, typename _ForwardIterator>
04252 _InputIterator
04253 find_first_of(_InputIterator __first1, _InputIterator __last1,
04254 _ForwardIterator __first2, _ForwardIterator __last2)
04255 {
04256
04257 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04258 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04259 __glibcxx_function_requires(_EqualOpConcept<
04260 typename iterator_traits<_InputIterator>::value_type,
04261 typename iterator_traits<_ForwardIterator>::value_type>)
04262 __glibcxx_requires_valid_range(__first1, __last1);
04263 __glibcxx_requires_valid_range(__first2, __last2);
04264
04265 for (; __first1 != __last1; ++__first1)
04266 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
04267 if (*__first1 == *__iter)
04268 return __first1;
04269 return __last1;
04270 }
04271
04272
04273
04274
04275
04276
04277
04278
04279
04280
04281
04282
04283
04284
04285
04286
04287
04288
04289
04290 template<typename _InputIterator, typename _ForwardIterator,
04291 typename _BinaryPredicate>
04292 _InputIterator
04293 find_first_of(_InputIterator __first1, _InputIterator __last1,
04294 _ForwardIterator __first2, _ForwardIterator __last2,
04295 _BinaryPredicate __comp)
04296 {
04297
04298 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04299 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04300 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
04301 typename iterator_traits<_InputIterator>::value_type,
04302 typename iterator_traits<_ForwardIterator>::value_type>)
04303 __glibcxx_requires_valid_range(__first1, __last1);
04304 __glibcxx_requires_valid_range(__first2, __last2);
04305
04306 for (; __first1 != __last1; ++__first1)
04307 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
04308 if (__comp(*__first1, *__iter))
04309 return __first1;
04310 return __last1;
04311 }
04312
04313
04314
04315
04316
04317
04318
04319
04320
04321
04322 template<typename _ForwardIterator>
04323 _ForwardIterator
04324 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
04325 {
04326
04327 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04328 __glibcxx_function_requires(_EqualityComparableConcept<
04329 typename iterator_traits<_ForwardIterator>::value_type>)
04330 __glibcxx_requires_valid_range(__first, __last);
04331 if (__first == __last)
04332 return __last;
04333 _ForwardIterator __next = __first;
04334 while(++__next != __last)
04335 {
04336 if (*__first == *__next)
04337 return __first;
04338 __first = __next;
04339 }
04340 return __last;
04341 }
04342
04343
04344
04345
04346
04347
04348
04349
04350
04351
04352
04353
04354 template<typename _ForwardIterator, typename _BinaryPredicate>
04355 _ForwardIterator
04356 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
04357 _BinaryPredicate __binary_pred)
04358 {
04359
04360 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04361 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
04362 typename iterator_traits<_ForwardIterator>::value_type,
04363 typename iterator_traits<_ForwardIterator>::value_type>)
04364 __glibcxx_requires_valid_range(__first, __last);
04365 if (__first == __last)
04366 return __last;
04367 _ForwardIterator __next = __first;
04368 while(++__next != __last)
04369 {
04370 if (__binary_pred(*__first, *__next))
04371 return __first;
04372 __first = __next;
04373 }
04374 return __last;
04375 }
04376
04377
04378
04379
04380
04381
04382
04383
04384
04385
04386 template<typename _InputIterator, typename _Tp>
04387 typename iterator_traits<_InputIterator>::difference_type
04388 count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
04389 {
04390
04391 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04392 __glibcxx_function_requires(_EqualOpConcept<
04393 typename iterator_traits<_InputIterator>::value_type, _Tp>)
04394 __glibcxx_requires_valid_range(__first, __last);
04395 typename iterator_traits<_InputIterator>::difference_type __n = 0;
04396 for (; __first != __last; ++__first)
04397 if (*__first == __value)
04398 ++__n;
04399 return __n;
04400 }
04401
04402
04403
04404
04405
04406
04407
04408
04409
04410
04411 template<typename _InputIterator, typename _Predicate>
04412 typename iterator_traits<_InputIterator>::difference_type
04413 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
04414 {
04415
04416 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04417 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
04418 typename iterator_traits<_InputIterator>::value_type>)
04419 __glibcxx_requires_valid_range(__first, __last);
04420 typename iterator_traits<_InputIterator>::difference_type __n = 0;
04421 for (; __first != __last; ++__first)
04422 if (__pred(*__first))
04423 ++__n;
04424 return __n;
04425 }
04426
04427
04428
04429
04430
04431
04432
04433
04434
04435
04436
04437
04438
04439
04440
04441
04442
04443
04444
04445
04446
04447
04448
04449
04450
04451 template<typename _ForwardIterator1, typename _ForwardIterator2>
04452 _ForwardIterator1
04453 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
04454 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
04455 {
04456
04457 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
04458 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
04459 __glibcxx_function_requires(_EqualOpConcept<
04460 typename iterator_traits<_ForwardIterator1>::value_type,
04461 typename iterator_traits<_ForwardIterator2>::value_type>)
04462 __glibcxx_requires_valid_range(__first1, __last1);
04463 __glibcxx_requires_valid_range(__first2, __last2);
04464
04465
04466 if (__first1 == __last1 || __first2 == __last2)
04467 return __first1;
04468
04469
04470 _ForwardIterator2 __p1(__first2);
04471 if (++__p1 == __last2)
04472 return _GLIBCXX_STD_P::find(__first1, __last1, *__first2);
04473
04474
04475 _ForwardIterator2 __p;
04476 _ForwardIterator1 __current = __first1;
04477
04478 for (;;)
04479 {
04480 __first1 = _GLIBCXX_STD_P::find(__first1, __last1, *__first2);
04481 if (__first1 == __last1)
04482 return __last1;
04483
04484 __p = __p1;
04485 __current = __first1;
04486 if (++__current == __last1)
04487 return __last1;
04488
04489 while (*__current == *__p)
04490 {
04491 if (++__p == __last2)
04492 return __first1;
04493 if (++__current == __last1)
04494 return __last1;
04495 }
04496 ++__first1;
04497 }
04498 return __first1;
04499 }
04500
04501
04502
04503
04504
04505
04506
04507
04508
04509
04510
04511
04512
04513
04514
04515
04516
04517
04518
04519
04520
04521
04522 template<typename _ForwardIterator1, typename _ForwardIterator2,
04523 typename _BinaryPredicate>
04524 _ForwardIterator1
04525 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
04526 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
04527 _BinaryPredicate __predicate)
04528 {
04529
04530 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
04531 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
04532 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
04533 typename iterator_traits<_ForwardIterator1>::value_type,
04534 typename iterator_traits<_ForwardIterator2>::value_type>)
04535 __glibcxx_requires_valid_range(__first1, __last1);
04536 __glibcxx_requires_valid_range(__first2, __last2);
04537
04538
04539 if (__first1 == __last1 || __first2 == __last2)
04540 return __first1;
04541
04542
04543 _ForwardIterator2 __p1(__first2);
04544 if (++__p1 == __last2)
04545 {
04546 while (__first1 != __last1
04547 && !bool(__predicate(*__first1, *__first2)))
04548 ++__first1;
04549 return __first1;
04550 }
04551
04552
04553 _ForwardIterator2 __p;
04554 _ForwardIterator1 __current = __first1;
04555
04556 for (;;)
04557 {
04558 while (__first1 != __last1
04559 && !bool(__predicate(*__first1, *__first2)))
04560 ++__first1;
04561 if (__first1 == __last1)
04562 return __last1;
04563
04564 __p = __p1;
04565 __current = __first1;
04566 if (++__current == __last1)
04567 return __last1;
04568
04569 while (__predicate(*__current, *__p))
04570 {
04571 if (++__p == __last2)
04572 return __first1;
04573 if (++__current == __last1)
04574 return __last1;
04575 }
04576 ++__first1;
04577 }
04578 return __first1;
04579 }
04580
04581
04582
04583
04584
04585
04586
04587
04588
04589
04590
04591
04592
04593
04594
04595
04596 template<typename _ForwardIterator, typename _Integer, typename _Tp>
04597 _ForwardIterator
04598 search_n(_ForwardIterator __first, _ForwardIterator __last,
04599 _Integer __count, const _Tp& __val)
04600 {
04601
04602 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04603 __glibcxx_function_requires(_EqualOpConcept<
04604 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
04605 __glibcxx_requires_valid_range(__first, __last);
04606
04607 if (__count <= 0)
04608 return __first;
04609 if (__count == 1)
04610 return _GLIBCXX_STD_P::find(__first, __last, __val);
04611 return std::__search_n(__first, __last, __count, __val,
04612 std::__iterator_category(__first));
04613 }
04614
04615
04616
04617
04618
04619
04620
04621
04622
04623
04624
04625
04626
04627
04628
04629
04630
04631
04632 template<typename _ForwardIterator, typename _Integer, typename _Tp,
04633 typename _BinaryPredicate>
04634 _ForwardIterator
04635 search_n(_ForwardIterator __first, _ForwardIterator __last,
04636 _Integer __count, const _Tp& __val,
04637 _BinaryPredicate __binary_pred)
04638 {
04639
04640 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04641 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
04642 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
04643 __glibcxx_requires_valid_range(__first, __last);
04644
04645 if (__count <= 0)
04646 return __first;
04647 if (__count == 1)
04648 {
04649 while (__first != __last && !bool(__binary_pred(*__first, __val)))
04650 ++__first;
04651 return __first;
04652 }
04653 return std::__search_n(__first, __last, __count, __val, __binary_pred,
04654 std::__iterator_category(__first));
04655 }
04656
04657
04658
04659
04660
04661
04662
04663
04664
04665
04666
04667
04668
04669
04670
04671
04672
04673
04674 template<typename _InputIterator, typename _OutputIterator,
04675 typename _UnaryOperation>
04676 _OutputIterator
04677 transform(_InputIterator __first, _InputIterator __last,
04678 _OutputIterator __result, _UnaryOperation __unary_op)
04679 {
04680
04681 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04682 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04683
04684 __typeof__(__unary_op(*__first))>)
04685 __glibcxx_requires_valid_range(__first, __last);
04686
04687 for (; __first != __last; ++__first, ++__result)
04688 *__result = __unary_op(*__first);
04689 return __result;
04690 }
04691
04692
04693
04694
04695
04696
04697
04698
04699
04700
04701
04702
04703
04704
04705
04706
04707
04708
04709
04710 template<typename _InputIterator1, typename _InputIterator2,
04711 typename _OutputIterator, typename _BinaryOperation>
04712 _OutputIterator
04713 transform(_InputIterator1 __first1, _InputIterator1 __last1,
04714 _InputIterator2 __first2, _OutputIterator __result,
04715 _BinaryOperation __binary_op)
04716 {
04717
04718 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
04719 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
04720 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04721
04722 __typeof__(__binary_op(*__first1,*__first2))>)
04723 __glibcxx_requires_valid_range(__first1, __last1);
04724
04725 for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
04726 *__result = __binary_op(*__first1, *__first2);
04727 return __result;
04728 }
04729
04730
04731
04732
04733
04734
04735
04736
04737
04738
04739
04740
04741
04742
04743 template<typename _ForwardIterator, typename _Tp>
04744 void
04745 replace(_ForwardIterator __first, _ForwardIterator __last,
04746 const _Tp& __old_value, const _Tp& __new_value)
04747 {
04748
04749 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
04750 _ForwardIterator>)
04751 __glibcxx_function_requires(_EqualOpConcept<
04752 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
04753 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
04754 typename iterator_traits<_ForwardIterator>::value_type>)
04755 __glibcxx_requires_valid_range(__first, __last);
04756
04757 for (; __first != __last; ++__first)
04758 if (*__first == __old_value)
04759 *__first = __new_value;
04760 }
04761
04762
04763
04764
04765
04766
04767
04768
04769
04770
04771
04772
04773
04774
04775 template<typename _ForwardIterator, typename _Predicate, typename _Tp>
04776 void
04777 replace_if(_ForwardIterator __first, _ForwardIterator __last,
04778 _Predicate __pred, const _Tp& __new_value)
04779 {
04780
04781 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
04782 _ForwardIterator>)
04783 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
04784 typename iterator_traits<_ForwardIterator>::value_type>)
04785 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
04786 typename iterator_traits<_ForwardIterator>::value_type>)
04787 __glibcxx_requires_valid_range(__first, __last);
04788
04789 for (; __first != __last; ++__first)
04790 if (__pred(*__first))
04791 *__first = __new_value;
04792 }
04793
04794
04795
04796
04797
04798
04799
04800
04801
04802
04803
04804
04805
04806
04807 template<typename _ForwardIterator, typename _Generator>
04808 void
04809 generate(_ForwardIterator __first, _ForwardIterator __last,
04810 _Generator __gen)
04811 {
04812
04813 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
04814 __glibcxx_function_requires(_GeneratorConcept<_Generator,
04815 typename iterator_traits<_ForwardIterator>::value_type>)
04816 __glibcxx_requires_valid_range(__first, __last);
04817
04818 for (; __first != __last; ++__first)
04819 *__first = __gen();
04820 }
04821
04822
04823
04824
04825
04826
04827
04828
04829
04830
04831
04832
04833
04834
04835
04836
04837
04838 template<typename _OutputIterator, typename _Size, typename _Generator>
04839 _OutputIterator
04840 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
04841 {
04842
04843 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04844
04845 __typeof__(__gen())>)
04846
04847 for (; __n > 0; --__n, ++__first)
04848 *__first = __gen();
04849 return __first;
04850 }
04851
04852
04853
04854
04855
04856
04857
04858
04859
04860
04861
04862
04863
04864
04865
04866
04867
04868
04869
04870
04871
04872
04873
04874 template<typename _InputIterator, typename _OutputIterator>
04875 inline _OutputIterator
04876 unique_copy(_InputIterator __first, _InputIterator __last,
04877 _OutputIterator __result)
04878 {
04879
04880 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04881 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04882 typename iterator_traits<_InputIterator>::value_type>)
04883 __glibcxx_function_requires(_EqualityComparableConcept<
04884 typename iterator_traits<_InputIterator>::value_type>)
04885 __glibcxx_requires_valid_range(__first, __last);
04886
04887 if (__first == __last)
04888 return __result;
04889 return std::__unique_copy(__first, __last, __result,
04890 std::__iterator_category(__first),
04891 std::__iterator_category(__result));
04892 }
04893
04894
04895
04896
04897
04898
04899
04900
04901
04902
04903
04904
04905
04906
04907
04908
04909
04910
04911
04912
04913 template<typename _InputIterator, typename _OutputIterator,
04914 typename _BinaryPredicate>
04915 inline _OutputIterator
04916 unique_copy(_InputIterator __first, _InputIterator __last,
04917 _OutputIterator __result,
04918 _BinaryPredicate __binary_pred)
04919 {
04920
04921 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
04922 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
04923 typename iterator_traits<_InputIterator>::value_type>)
04924 __glibcxx_requires_valid_range(__first, __last);
04925
04926 if (__first == __last)
04927 return __result;
04928 return std::__unique_copy(__first, __last, __result, __binary_pred,
04929 std::__iterator_category(__first),
04930 std::__iterator_category(__result));
04931 }
04932
04933
04934
04935
04936
04937
04938
04939
04940
04941
04942
04943
04944
04945 template<typename _RandomAccessIterator>
04946 inline void
04947 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
04948 {
04949
04950 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
04951 _RandomAccessIterator>)
04952 __glibcxx_requires_valid_range(__first, __last);
04953
04954 if (__first != __last)
04955 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
04956 std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
04957 }
04958
04959
04960
04961
04962
04963
04964
04965
04966
04967
04968
04969
04970
04971
04972
04973 template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
04974 void
04975 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
04976 #ifdef __GXX_EXPERIMENTAL_CXX0X__
04977 _RandomNumberGenerator&& __rand)
04978 #else
04979 _RandomNumberGenerator& __rand)
04980 #endif
04981 {
04982
04983 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
04984 _RandomAccessIterator>)
04985 __glibcxx_requires_valid_range(__first, __last);
04986
04987 if (__first == __last)
04988 return;
04989 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
04990 std::iter_swap(__i, __first + __rand((__i - __first) + 1));
04991 }
04992
04993
04994
04995
04996
04997
04998
04999
05000
05001
05002
05003
05004
05005
05006
05007
05008
05009 template<typename _ForwardIterator, typename _Predicate>
05010 inline _ForwardIterator
05011 partition(_ForwardIterator __first, _ForwardIterator __last,
05012 _Predicate __pred)
05013 {
05014
05015 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
05016 _ForwardIterator>)
05017 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
05018 typename iterator_traits<_ForwardIterator>::value_type>)
05019 __glibcxx_requires_valid_range(__first, __last);
05020
05021 return std::__partition(__first, __last, __pred,
05022 std::__iterator_category(__first));
05023 }
05024
05025
05026
05027
05028
05029
05030
05031
05032
05033
05034
05035
05036
05037
05038
05039
05040
05041
05042
05043 template<typename _RandomAccessIterator>
05044 inline void
05045 partial_sort(_RandomAccessIterator __first,
05046 _RandomAccessIterator __middle,
05047 _RandomAccessIterator __last)
05048 {
05049 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05050 _ValueType;
05051
05052
05053 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05054 _RandomAccessIterator>)
05055 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
05056 __glibcxx_requires_valid_range(__first, __middle);
05057 __glibcxx_requires_valid_range(__middle, __last);
05058
05059 std::__heap_select(__first, __middle, __last);
05060 std::sort_heap(__first, __middle);
05061 }
05062
05063
05064
05065
05066
05067
05068
05069
05070
05071
05072
05073
05074
05075
05076
05077
05078
05079
05080
05081
05082 template<typename _RandomAccessIterator, typename _Compare>
05083 inline void
05084 partial_sort(_RandomAccessIterator __first,
05085 _RandomAccessIterator __middle,
05086 _RandomAccessIterator __last,
05087 _Compare __comp)
05088 {
05089 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05090 _ValueType;
05091
05092
05093 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05094 _RandomAccessIterator>)
05095 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05096 _ValueType, _ValueType>)
05097 __glibcxx_requires_valid_range(__first, __middle);
05098 __glibcxx_requires_valid_range(__middle, __last);
05099
05100 std::__heap_select(__first, __middle, __last, __comp);
05101 std::sort_heap(__first, __middle, __comp);
05102 }
05103
05104
05105
05106
05107
05108
05109
05110
05111
05112
05113
05114
05115
05116
05117
05118
05119
05120 template<typename _RandomAccessIterator>
05121 inline void
05122 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
05123 _RandomAccessIterator __last)
05124 {
05125 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05126 _ValueType;
05127
05128
05129 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05130 _RandomAccessIterator>)
05131 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
05132 __glibcxx_requires_valid_range(__first, __nth);
05133 __glibcxx_requires_valid_range(__nth, __last);
05134
05135 if (__first == __last || __nth == __last)
05136 return;
05137
05138 std::__introselect(__first, __nth, __last,
05139 std::__lg(__last - __first) * 2);
05140 }
05141
05142
05143
05144
05145
05146
05147
05148
05149
05150
05151
05152
05153
05154
05155
05156
05157
05158
05159 template<typename _RandomAccessIterator, typename _Compare>
05160 inline void
05161 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
05162 _RandomAccessIterator __last, _Compare __comp)
05163 {
05164 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05165 _ValueType;
05166
05167
05168 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05169 _RandomAccessIterator>)
05170 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05171 _ValueType, _ValueType>)
05172 __glibcxx_requires_valid_range(__first, __nth);
05173 __glibcxx_requires_valid_range(__nth, __last);
05174
05175 if (__first == __last || __nth == __last)
05176 return;
05177
05178 std::__introselect(__first, __nth, __last,
05179 std::__lg(__last - __first) * 2, __comp);
05180 }
05181
05182
05183
05184
05185
05186
05187
05188
05189
05190
05191
05192
05193
05194
05195
05196
05197 template<typename _RandomAccessIterator>
05198 inline void
05199 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
05200 {
05201 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05202 _ValueType;
05203
05204
05205 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05206 _RandomAccessIterator>)
05207 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
05208 __glibcxx_requires_valid_range(__first, __last);
05209
05210 if (__first != __last)
05211 {
05212 std::__introsort_loop(__first, __last,
05213 std::__lg(__last - __first) * 2);
05214 std::__final_insertion_sort(__first, __last);
05215 }
05216 }
05217
05218
05219
05220
05221
05222
05223
05224
05225
05226
05227
05228
05229
05230
05231
05232
05233 template<typename _RandomAccessIterator, typename _Compare>
05234 inline void
05235 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
05236 _Compare __comp)
05237 {
05238 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05239 _ValueType;
05240
05241
05242 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05243 _RandomAccessIterator>)
05244 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
05245 _ValueType>)
05246 __glibcxx_requires_valid_range(__first, __last);
05247
05248 if (__first != __last)
05249 {
05250 std::__introsort_loop(__first, __last,
05251 std::__lg(__last - __first) * 2, __comp);
05252 std::__final_insertion_sort(__first, __last, __comp);
05253 }
05254 }
05255
05256
05257
05258
05259
05260
05261
05262
05263
05264
05265
05266
05267
05268
05269
05270
05271
05272
05273
05274 template<typename _InputIterator1, typename _InputIterator2,
05275 typename _OutputIterator>
05276 _OutputIterator
05277 merge(_InputIterator1 __first1, _InputIterator1 __last1,
05278 _InputIterator2 __first2, _InputIterator2 __last2,
05279 _OutputIterator __result)
05280 {
05281 typedef typename iterator_traits<_InputIterator1>::value_type
05282 _ValueType1;
05283 typedef typename iterator_traits<_InputIterator2>::value_type
05284 _ValueType2;
05285
05286
05287 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05288 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05289 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05290 _ValueType1>)
05291 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05292 _ValueType2>)
05293 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
05294 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
05295 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
05296
05297 while (__first1 != __last1 && __first2 != __last2)
05298 {
05299 if (*__first2 < *__first1)
05300 {
05301 *__result = *__first2;
05302 ++__first2;
05303 }
05304 else
05305 {
05306 *__result = *__first1;
05307 ++__first1;
05308 }
05309 ++__result;
05310 }
05311 return std::copy(__first2, __last2, std::copy(__first1, __last1,
05312 __result));
05313 }
05314
05315
05316
05317
05318
05319
05320
05321
05322
05323
05324
05325
05326
05327
05328
05329
05330
05331
05332
05333
05334
05335
05336
05337 template<typename _InputIterator1, typename _InputIterator2,
05338 typename _OutputIterator, typename _Compare>
05339 _OutputIterator
05340 merge(_InputIterator1 __first1, _InputIterator1 __last1,
05341 _InputIterator2 __first2, _InputIterator2 __last2,
05342 _OutputIterator __result, _Compare __comp)
05343 {
05344 typedef typename iterator_traits<_InputIterator1>::value_type
05345 _ValueType1;
05346 typedef typename iterator_traits<_InputIterator2>::value_type
05347 _ValueType2;
05348
05349
05350 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05351 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05352 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05353 _ValueType1>)
05354 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05355 _ValueType2>)
05356 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05357 _ValueType2, _ValueType1>)
05358 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
05359 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
05360
05361 while (__first1 != __last1 && __first2 != __last2)
05362 {
05363 if (__comp(*__first2, *__first1))
05364 {
05365 *__result = *__first2;
05366 ++__first2;
05367 }
05368 else
05369 {
05370 *__result = *__first1;
05371 ++__first1;
05372 }
05373 ++__result;
05374 }
05375 return std::copy(__first2, __last2, std::copy(__first1, __last1,
05376 __result));
05377 }
05378
05379
05380
05381
05382
05383
05384
05385
05386
05387
05388
05389
05390
05391
05392
05393
05394
05395
05396
05397 template<typename _RandomAccessIterator>
05398 inline void
05399 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
05400 {
05401 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05402 _ValueType;
05403 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
05404 _DistanceType;
05405
05406
05407 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05408 _RandomAccessIterator>)
05409 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
05410 __glibcxx_requires_valid_range(__first, __last);
05411
05412 _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
05413 __last);
05414 if (__buf.begin() == 0)
05415 std::__inplace_stable_sort(__first, __last);
05416 else
05417 std::__stable_sort_adaptive(__first, __last, __buf.begin(),
05418 _DistanceType(__buf.size()));
05419 }
05420
05421
05422
05423
05424
05425
05426
05427
05428
05429
05430
05431
05432
05433
05434
05435
05436
05437
05438
05439 template<typename _RandomAccessIterator, typename _Compare>
05440 inline void
05441 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
05442 _Compare __comp)
05443 {
05444 typedef typename iterator_traits<_RandomAccessIterator>::value_type
05445 _ValueType;
05446 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
05447 _DistanceType;
05448
05449
05450 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
05451 _RandomAccessIterator>)
05452 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05453 _ValueType,
05454 _ValueType>)
05455 __glibcxx_requires_valid_range(__first, __last);
05456
05457 _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
05458 __last);
05459 if (__buf.begin() == 0)
05460 std::__inplace_stable_sort(__first, __last, __comp);
05461 else
05462 std::__stable_sort_adaptive(__first, __last, __buf.begin(),
05463 _DistanceType(__buf.size()), __comp);
05464 }
05465
05466
05467
05468
05469
05470
05471
05472
05473
05474
05475
05476
05477
05478
05479
05480
05481
05482
05483
05484
05485 template<typename _InputIterator1, typename _InputIterator2,
05486 typename _OutputIterator>
05487 _OutputIterator
05488 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
05489 _InputIterator2 __first2, _InputIterator2 __last2,
05490 _OutputIterator __result)
05491 {
05492 typedef typename iterator_traits<_InputIterator1>::value_type
05493 _ValueType1;
05494 typedef typename iterator_traits<_InputIterator2>::value_type
05495 _ValueType2;
05496
05497
05498 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05499 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05500 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05501 _ValueType1>)
05502 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05503 _ValueType2>)
05504 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
05505 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
05506 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
05507 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
05508
05509 while (__first1 != __last1 && __first2 != __last2)
05510 {
05511 if (*__first1 < *__first2)
05512 {
05513 *__result = *__first1;
05514 ++__first1;
05515 }
05516 else if (*__first2 < *__first1)
05517 {
05518 *__result = *__first2;
05519 ++__first2;
05520 }
05521 else
05522 {
05523 *__result = *__first1;
05524 ++__first1;
05525 ++__first2;
05526 }
05527 ++__result;
05528 }
05529 return std::copy(__first2, __last2, std::copy(__first1, __last1,
05530 __result));
05531 }
05532
05533
05534
05535
05536
05537
05538
05539
05540
05541
05542
05543
05544
05545
05546
05547
05548
05549
05550
05551
05552 template<typename _InputIterator1, typename _InputIterator2,
05553 typename _OutputIterator, typename _Compare>
05554 _OutputIterator
05555 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
05556 _InputIterator2 __first2, _InputIterator2 __last2,
05557 _OutputIterator __result, _Compare __comp)
05558 {
05559 typedef typename iterator_traits<_InputIterator1>::value_type
05560 _ValueType1;
05561 typedef typename iterator_traits<_InputIterator2>::value_type
05562 _ValueType2;
05563
05564
05565 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05566 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05567 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05568 _ValueType1>)
05569 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05570 _ValueType2>)
05571 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05572 _ValueType1, _ValueType2>)
05573 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05574 _ValueType2, _ValueType1>)
05575 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
05576 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
05577
05578 while (__first1 != __last1 && __first2 != __last2)
05579 {
05580 if (__comp(*__first1, *__first2))
05581 {
05582 *__result = *__first1;
05583 ++__first1;
05584 }
05585 else if (__comp(*__first2, *__first1))
05586 {
05587 *__result = *__first2;
05588 ++__first2;
05589 }
05590 else
05591 {
05592 *__result = *__first1;
05593 ++__first1;
05594 ++__first2;
05595 }
05596 ++__result;
05597 }
05598 return std::copy(__first2, __last2, std::copy(__first1, __last1,
05599 __result));
05600 }
05601
05602
05603
05604
05605
05606
05607
05608
05609
05610
05611
05612
05613
05614
05615
05616
05617
05618
05619 template<typename _InputIterator1, typename _InputIterator2,
05620 typename _OutputIterator>
05621 _OutputIterator
05622 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
05623 _InputIterator2 __first2, _InputIterator2 __last2,
05624 _OutputIterator __result)
05625 {
05626 typedef typename iterator_traits<_InputIterator1>::value_type
05627 _ValueType1;
05628 typedef typename iterator_traits<_InputIterator2>::value_type
05629 _ValueType2;
05630
05631
05632 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05633 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05634 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05635 _ValueType1>)
05636 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
05637 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
05638 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
05639 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
05640
05641 while (__first1 != __last1 && __first2 != __last2)
05642 if (*__first1 < *__first2)
05643 ++__first1;
05644 else if (*__first2 < *__first1)
05645 ++__first2;
05646 else
05647 {
05648 *__result = *__first1;
05649 ++__first1;
05650 ++__first2;
05651 ++__result;
05652 }
05653 return __result;
05654 }
05655
05656
05657
05658
05659
05660
05661
05662
05663
05664
05665
05666
05667
05668
05669
05670
05671
05672
05673
05674
05675
05676 template<typename _InputIterator1, typename _InputIterator2,
05677 typename _OutputIterator, typename _Compare>
05678 _OutputIterator
05679 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
05680 _InputIterator2 __first2, _InputIterator2 __last2,
05681 _OutputIterator __result, _Compare __comp)
05682 {
05683 typedef typename iterator_traits<_InputIterator1>::value_type
05684 _ValueType1;
05685 typedef typename iterator_traits<_InputIterator2>::value_type
05686 _ValueType2;
05687
05688
05689 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05690 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05691 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05692 _ValueType1>)
05693 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05694 _ValueType1, _ValueType2>)
05695 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05696 _ValueType2, _ValueType1>)
05697 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
05698 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
05699
05700 while (__first1 != __last1 && __first2 != __last2)
05701 if (__comp(*__first1, *__first2))
05702 ++__first1;
05703 else if (__comp(*__first2, *__first1))
05704 ++__first2;
05705 else
05706 {
05707 *__result = *__first1;
05708 ++__first1;
05709 ++__first2;
05710 ++__result;
05711 }
05712 return __result;
05713 }
05714
05715
05716
05717
05718
05719
05720
05721
05722
05723
05724
05725
05726
05727
05728
05729
05730
05731
05732
05733
05734 template<typename _InputIterator1, typename _InputIterator2,
05735 typename _OutputIterator>
05736 _OutputIterator
05737 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
05738 _InputIterator2 __first2, _InputIterator2 __last2,
05739 _OutputIterator __result)
05740 {
05741 typedef typename iterator_traits<_InputIterator1>::value_type
05742 _ValueType1;
05743 typedef typename iterator_traits<_InputIterator2>::value_type
05744 _ValueType2;
05745
05746
05747 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05748 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05749 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05750 _ValueType1>)
05751 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
05752 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
05753 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
05754 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
05755
05756 while (__first1 != __last1 && __first2 != __last2)
05757 if (*__first1 < *__first2)
05758 {
05759 *__result = *__first1;
05760 ++__first1;
05761 ++__result;
05762 }
05763 else if (*__first2 < *__first1)
05764 ++__first2;
05765 else
05766 {
05767 ++__first1;
05768 ++__first2;
05769 }
05770 return std::copy(__first1, __last1, __result);
05771 }
05772
05773
05774
05775
05776
05777
05778
05779
05780
05781
05782
05783
05784
05785
05786
05787
05788
05789
05790
05791
05792
05793
05794
05795 template<typename _InputIterator1, typename _InputIterator2,
05796 typename _OutputIterator, typename _Compare>
05797 _OutputIterator
05798 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
05799 _InputIterator2 __first2, _InputIterator2 __last2,
05800 _OutputIterator __result, _Compare __comp)
05801 {
05802 typedef typename iterator_traits<_InputIterator1>::value_type
05803 _ValueType1;
05804 typedef typename iterator_traits<_InputIterator2>::value_type
05805 _ValueType2;
05806
05807
05808 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05809 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05810 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05811 _ValueType1>)
05812 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05813 _ValueType1, _ValueType2>)
05814 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05815 _ValueType2, _ValueType1>)
05816 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
05817 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
05818
05819 while (__first1 != __last1 && __first2 != __last2)
05820 if (__comp(*__first1, *__first2))
05821 {
05822 *__result = *__first1;
05823 ++__first1;
05824 ++__result;
05825 }
05826 else if (__comp(*__first2, *__first1))
05827 ++__first2;
05828 else
05829 {
05830 ++__first1;
05831 ++__first2;
05832 }
05833 return std::copy(__first1, __last1, __result);
05834 }
05835
05836
05837
05838
05839
05840
05841
05842
05843
05844
05845
05846
05847
05848
05849
05850
05851
05852
05853 template<typename _InputIterator1, typename _InputIterator2,
05854 typename _OutputIterator>
05855 _OutputIterator
05856 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
05857 _InputIterator2 __first2, _InputIterator2 __last2,
05858 _OutputIterator __result)
05859 {
05860 typedef typename iterator_traits<_InputIterator1>::value_type
05861 _ValueType1;
05862 typedef typename iterator_traits<_InputIterator2>::value_type
05863 _ValueType2;
05864
05865
05866 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05867 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05868 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05869 _ValueType1>)
05870 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05871 _ValueType2>)
05872 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
05873 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
05874 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
05875 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
05876
05877 while (__first1 != __last1 && __first2 != __last2)
05878 if (*__first1 < *__first2)
05879 {
05880 *__result = *__first1;
05881 ++__first1;
05882 ++__result;
05883 }
05884 else if (*__first2 < *__first1)
05885 {
05886 *__result = *__first2;
05887 ++__first2;
05888 ++__result;
05889 }
05890 else
05891 {
05892 ++__first1;
05893 ++__first2;
05894 }
05895 return std::copy(__first2, __last2, std::copy(__first1,
05896 __last1, __result));
05897 }
05898
05899
05900
05901
05902
05903
05904
05905
05906
05907
05908
05909
05910
05911
05912
05913
05914
05915
05916
05917
05918
05919 template<typename _InputIterator1, typename _InputIterator2,
05920 typename _OutputIterator, typename _Compare>
05921 _OutputIterator
05922 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
05923 _InputIterator2 __first2, _InputIterator2 __last2,
05924 _OutputIterator __result,
05925 _Compare __comp)
05926 {
05927 typedef typename iterator_traits<_InputIterator1>::value_type
05928 _ValueType1;
05929 typedef typename iterator_traits<_InputIterator2>::value_type
05930 _ValueType2;
05931
05932
05933 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
05934 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
05935 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05936 _ValueType1>)
05937 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
05938 _ValueType2>)
05939 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05940 _ValueType1, _ValueType2>)
05941 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
05942 _ValueType2, _ValueType1>)
05943 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
05944 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
05945
05946 while (__first1 != __last1 && __first2 != __last2)
05947 if (__comp(*__first1, *__first2))
05948 {
05949 *__result = *__first1;
05950 ++__first1;
05951 ++__result;
05952 }
05953 else if (__comp(*__first2, *__first1))
05954 {
05955 *__result = *__first2;
05956 ++__first2;
05957 ++__result;
05958 }
05959 else
05960 {
05961 ++__first1;
05962 ++__first2;
05963 }
05964 return std::copy(__first2, __last2,
05965 std::copy(__first1, __last1, __result));
05966 }
05967
05968
05969
05970
05971
05972
05973
05974
05975
05976 template<typename _ForwardIterator>
05977 _ForwardIterator
05978 min_element(_ForwardIterator __first, _ForwardIterator __last)
05979 {
05980
05981 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
05982 __glibcxx_function_requires(_LessThanComparableConcept<
05983 typename iterator_traits<_ForwardIterator>::value_type>)
05984 __glibcxx_requires_valid_range(__first, __last);
05985
05986 if (__first == __last)
05987 return __first;
05988 _ForwardIterator __result = __first;
05989 while (++__first != __last)
05990 if (*__first < *__result)
05991 __result = __first;
05992 return __result;
05993 }
05994
05995
05996
05997
05998
05999
06000
06001
06002
06003
06004 template<typename _ForwardIterator, typename _Compare>
06005 _ForwardIterator
06006 min_element(_ForwardIterator __first, _ForwardIterator __last,
06007 _Compare __comp)
06008 {
06009
06010 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
06011 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
06012 typename iterator_traits<_ForwardIterator>::value_type,
06013 typename iterator_traits<_ForwardIterator>::value_type>)
06014 __glibcxx_requires_valid_range(__first, __last);
06015
06016 if (__first == __last)
06017 return __first;
06018 _ForwardIterator __result = __first;
06019 while (++__first != __last)
06020 if (__comp(*__first, *__result))
06021 __result = __first;
06022 return __result;
06023 }
06024
06025
06026
06027
06028
06029
06030
06031
06032 template<typename _ForwardIterator>
06033 _ForwardIterator
06034 max_element(_ForwardIterator __first, _ForwardIterator __last)
06035 {
06036
06037 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
06038 __glibcxx_function_requires(_LessThanComparableConcept<
06039 typename iterator_traits<_ForwardIterator>::value_type>)
06040 __glibcxx_requires_valid_range(__first, __last);
06041
06042 if (__first == __last)
06043 return __first;
06044 _ForwardIterator __result = __first;
06045 while (++__first != __last)
06046 if (*__result < *__first)
06047 __result = __first;
06048 return __result;
06049 }
06050
06051
06052
06053
06054
06055
06056
06057
06058
06059
06060 template<typename _ForwardIterator, typename _Compare>
06061 _ForwardIterator
06062 max_element(_ForwardIterator __first, _ForwardIterator __last,
06063 _Compare __comp)
06064 {
06065
06066 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
06067 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
06068 typename iterator_traits<_ForwardIterator>::value_type,
06069 typename iterator_traits<_ForwardIterator>::value_type>)
06070 __glibcxx_requires_valid_range(__first, __last);
06071
06072 if (__first == __last) return __first;
06073 _ForwardIterator __result = __first;
06074 while (++__first != __last)
06075 if (__comp(*__result, *__first))
06076 __result = __first;
06077 return __result;
06078 }
06079
06080 _GLIBCXX_END_NESTED_NAMESPACE
06081
06082 #endif