47template <
class _FwdIter1,
class _FwdIter2,
class _Dist>
48_FwdIter1 __find_end (_FwdIter1 __first1, _FwdIter1 __last1,
49 _FwdIter2 __first2, _FwdIter2 __last2,
55 const _Dist __dist1 =
_DISTANCE (__first2, __last2, _Dist);
60 _Dist __dist2 =
_DISTANCE (__first1, __last1, _Dist);
62 _FwdIter1 __res = __last1;
64 while (__dist2 >= __dist1) {
65 if (
equal (__first2, __last2, __first1))
68 __dist2 =
_DISTANCE (++__first1, __last1, _Dist);
76template <
class _FwdIter1,
class _FwdIter2,
77 class _BinaryPredicate,
class _Dist>
78_FwdIter1 __find_end (_FwdIter1 __first1, _FwdIter1 __last1,
79 _FwdIter2 __first2, _FwdIter2 __last2,
80 _BinaryPredicate __pred, _Dist*)
85 const _Dist __dist1 =
_DISTANCE (__first2, __last2, _Dist);
90 _Dist __dist2 =
_DISTANCE (__first1, __last1, _Dist);
92 _FwdIter1 __res = __last1;
94 while (__dist2 >= __dist1) {
95 if (_STD::equal (__first2, __last2, __first1, __pred))
98 __dist2 =
_DISTANCE (++__first1, __last1, _Dist);
105template <
class _FwdIter1,
class _FwdIter2>
106_FwdIter1 find_first_of (_FwdIter1 __first1, _FwdIter1 __last1,
107 _FwdIter2 __first2, _FwdIter2 __last2)
112 if (__first2 == __last2)
115 for (_FwdIter1 __next = __first1; !(__next == __last1); ++__next)
116 if (!(_STD::find (__first2, __last2, *__next) == __last2))
124template <
class _FwdIter1,
class _FwdIter2,
125 class _BinaryPredicate>
126_FwdIter1 find_first_of (_FwdIter1 __first1, _FwdIter1 __last1,
127 _FwdIter2 __first2, _FwdIter2 __last2,
128 _BinaryPredicate __pred)
133 if (__first2 == __last2)
136 for (_FwdIter1 __next = __first1; !(__next == __last1); ++__next)
137 for (_FwdIter2 __iter = __first2; !(__iter == __last2); ++__iter)
138 if (!(__pred (*__next, *__iter) ==
false))
146template <
class _FwdIter>
147_FwdIter adjacent_find (_FwdIter __first, _FwdIter __last)
151 if (__first == __last)
154 for (_FwdIter __next = __first; !(++__next == __last); __first = __next)
155 if (*__first == *__next)
163template <
class _FwdIter,
class _BinaryPredicate>
164_FwdIter adjacent_find (_FwdIter __first, _FwdIter __last,
165 _BinaryPredicate __pred)
169 if (__first == __last)
172 for (_FwdIter __next = __first; !(++__next == __last); __first = __next)
173 if (!(__pred (*__first, *__next) ==
false))
181template <
class _FwdIter1,
class _FwdIter2,
class _Dist1,
class _Dist2>
182_FwdIter1 __search (_FwdIter1 __first1, _FwdIter1 __last1,
183 _FwdIter2 __first2, _FwdIter2 __last2,
189 _Dist1 __dist1 =
_DISTANCE (__first1, __last1, _Dist1);
190 _Dist2 __dist2 =
_DISTANCE (__first2, __last2, _Dist2);
192 if (__dist1 < __dist2)
195 _FwdIter1 __cur1 = __first1;
196 _FwdIter2 __cur2 = __first2;
198 while (!(__cur2 == __last2)) {
199 if (!(*__cur1 == *__cur2)) {
202 if (__dist1-- == __dist2)
214 return (__cur2 == __last2) ? __first1 : __last1;
219template <
class _FwdIter1,
class _FwdIter2,
220 class _BinaryPredicate,
class _Dist1,
class _Dist2>
221_FwdIter1 __search (_FwdIter1 __first1, _FwdIter1 __last1,
222 _FwdIter2 __first2, _FwdIter2 __last2,
223 _BinaryPredicate __pred, _Dist1*, _Dist2*)
228 _Dist1 __dist1 =
_DISTANCE (__first1, __last1, _Dist1);
229 _Dist2 __dist2 =
_DISTANCE (__first2, __last2, _Dist2);
231 if (__dist1 < __dist2)
return __last1;
233 _FwdIter1 __cur1 = __first1;
234 _FwdIter2 __cur2 = __first2;
236 while (!(__cur2 == __last2)) {
237 if (__pred (*__cur1, *__cur2) ==
false) {
240 if (__dist1-- == __dist2)
252 return (__cur2 == __last2) ? __first1 : __last1;
257template <
class _FwdIter,
class _Dist,
class _Size,
class _TypeT>
258_FwdIter __search_n (_FwdIter __first, _FwdIter __last,
259 _Dist*, _Size __count,
const _TypeT& __val)
266 const _Dist __dist =
_DISTANCE (__first, __last, _Dist);
268 if (__dist < _Dist (__count))
271 _Dist __span = __dist - _Dist (__count);
274 _FwdIter __current = __first;
276 while (!(__current == __last)) {
277 if (!(*__current == __val)) {
278 if (__span < __matches + 1)
280 __span -= __matches + 1;
282 __first = ++__current;
285 if (++__matches == _Dist (__count))
296template <
class _FwdIter,
class _Dist,
class _Size,
class _TypeT,
297 class _BinaryPredicate>
298_FwdIter __search_n (_FwdIter __first, _FwdIter __last,
299 _Dist*, _Size __count,
const _TypeT& __val,
300 _BinaryPredicate __pred)
304 const _Dist __dist =
_DISTANCE (__first, __last, _Dist);
306 const _RWSTD_PTRDIFF_T __int_count = __count;
308 if (__dist < __int_count || __int_count <= 0)
311 _Dist __span = __dist - __int_count;
313 _FwdIter __current = __first;
315 while (!(__current == __last)) {
316 if (__pred (*__current, __val) ==
false) {
317 if (__span < __matches + 1)
319 __span -= __matches + 1;
321 __first = ++__current;
324 if (++__matches == __count)
338template <
class _Iter,
class _OutputIter,
class _Predicate,
class _TypeT>
339_OutputIter replace_copy_if (_Iter __first, _Iter __last,
340 _OutputIter __res, _Predicate __pred,
341 const _TypeT& __new_value)
345 for (; !(__first == __last); ++__res, ++__first)
346 *__res = __pred (*__first) ==
false ? *__first : __new_value;
353template <
class _InputIter,
class _OutputIter,
class _TypeT>
354_OutputIter remove_copy (_InputIter __first, _InputIter __last,
355 _OutputIter __res,
const _TypeT& __val)
359 for (; !(__first == __last); ++__first)
360 if (!(*__first == __val)) {
369template <
class _InputIter,
class _OutputIter,
class _Predicate>
370_OutputIter remove_copy_if (_InputIter __first, _InputIter __last,
371 _OutputIter __res, _Predicate __pred)
375 for (; !(__first == __last); ++__first)
376 if (__pred (*__first) ==
false) {
385template <
class _FwdIter>
387unique (_FwdIter __first, _FwdIter __last)
390 __first = _STD::adjacent_find (__first, __last);
392 if (__first == __last)
396 _FwdIter __next = ++__first;
399 while (!(++__next == __last))
400 if (!(*__next == *__first))
405 return __unique_copy (__next, __last, __first,
411template <
class _FwdIter,
class _BinaryPredicate>
413unique (_FwdIter __first, _FwdIter __last, _BinaryPredicate __pred)
415 __first = _STD::adjacent_find (__first, __last, __pred);
417 if (__first == __last)
420 _FwdIter __next = ++__first;
422 while (!(++__next == __last))
423 if (__pred (*__next, *__first) ==
false)
426 return __unique_copy (__next, __last, __first, __pred,
432template <
class _InputIter,
class _FwdIter>
433_FwdIter __unique_copy (_InputIter __first, _InputIter __last,
434 _FwdIter __res, forward_iterator_tag)
438 if (__first == __last)
442 while (!(++__first == __last))
443 if (!(*__res == *__first))
450template <
class _InputIter,
class _OutputIter,
class _TypeT>
451_OutputIter __unique_copy (_InputIter __first, _InputIter __last,
452 _OutputIter __res, _TypeT*)
456 if (__first == __last)
459 _TypeT __val = *__first;
461 for (*__res = __val; !(++__first == __last); )
462 if (!(__val == *__first)) {
472template <
class _InputIter,
class _FwdIter,
class _BinaryPredicate>
473_FwdIter __unique_copy (_InputIter __first, _InputIter __last,
475 _BinaryPredicate __pred,
476 forward_iterator_tag)
480 if (__first == __last)
483 for (*__res = *__first; !(++__first == __last); )
484 if (__pred (*__res, *__first) ==
false)
492template <
class _InputIter,
class _OutputIter,
class _BinaryPredicate,
494_OutputIter __unique_copy (_InputIter __first, _InputIter __last,
496 _BinaryPredicate __pred, _TypeT*)
500 if (__first == __last)
503 _TypeT __val = *__first;
505 for (*__res = __val; !(++__first == __last); )
506 if (__pred (__val, *__first) ==
false) {
516template <
class _FwdIter,
class _Dist>
517void __rotate (_FwdIter __first, _FwdIter __middle,
518 _FwdIter __last, _Dist*, forward_iterator_tag)
522 for (_FwdIter __i = __middle; ; ) {
523 _STD::iter_swap (__first, __i);
525 if (++__first == __middle) {
530 else if (__i == __last)
537template <
class _Eucl
ideanRingElement>
538_EuclideanRingElement __gcd (_EuclideanRingElement __m,
539 _EuclideanRingElement __n)
541 while (!(__n == _EuclideanRingElement ())) {
542 const _EuclideanRingElement __r = __m % __n;
551template <
class _RandomAccessIter,
class _Dist,
class _TypeT>
552void __rotate_cycle (_RandomAccessIter __first, _RandomAccessIter __last,
553 _RandomAccessIter __first2, _Dist __shift, _TypeT*)
557 const _TypeT __val = *__first2;
559 _RandomAccessIter __it1 = __first2;
561 for (_RandomAccessIter __it2 = __it1 + __shift; !(__it2 == __first2); ) {
565 if (__last - __it2 > __shift)
568 __it2 = __first + (__shift - (__last - __it2));
576template <
class _RandomAccessIter,
class _Dist>
577void __rotate (_RandomAccessIter __first, _RandomAccessIter __middle,
578 _RandomAccessIter __last, _Dist*,
579 random_access_iterator_tag)
583 for (_Dist __n = __gcd (__last - __first, __middle - __first); __n--; )
584 __rotate_cycle (__first, __last, __first + __n, __middle - __first,
590template <
class _RandomAccessIter,
class _RandomNumberGenerator>
591void random_shuffle (_RandomAccessIter __first, _RandomAccessIter __last,
592 _RandomNumberGenerator &__rand)
596 if (!(__first == __last)) {
598#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
600 iterator_traits<_RandomAccessIter>::difference_type _DiffT;
602 typedef _RWSTD_PTRDIFF_T _DiffT;
607 for (_RandomAccessIter __i = __first; !(++__i == __last); ++__limit) {
612 const _DiffT __rndoff (__rand (__limit));
617 _STD::iter_swap (__i, __first + __rndoff);
624template <
class _B
idirIter,
class _Predicate>
625_BidirIter partition (_BidirIter __first, _BidirIter __last, _Predicate __pred)
629 for ( ; ; ++__first) {
631 if (__first == __last)
633 if (!(__pred (*__first) ==
false))
640 if (__first == __last)
642 if (__pred (*__last) ==
false)
647 _STD::iter_swap (__first, __last);
652template <
class _B
idirIter,
class _Predicate,
class _Dist>
653_BidirIter __inplace_stable_partition (_BidirIter __first, _BidirIter __last,
654 _Predicate __pred, _Dist __dist)
659 return !(__pred (*__first) ==
false) ? __last : __first;
661 _BidirIter __middle = __first;
662 _STD::advance (__middle, __dist / 2);
664 __first_cut = __inplace_stable_partition (__first, __middle, __pred,
667 __second_cut = __inplace_stable_partition (__middle, __last, __pred,
668 __dist - __dist / 2);
669 _STD::rotate (__first_cut, __middle, __second_cut);
670 __dist =
_DISTANCE (__middle, __second_cut, _Dist);
671 _STD::advance (__first_cut, __dist);
677template <
class _BidirIter,
class _Pointer,
class _Predicate,
678 class _Dist,
class _TypeT>
679_BidirIter __stable_partition_adaptive (_BidirIter __first, _BidirIter __last,
680 _Predicate __pred, _Dist __dist,
683 _Dist& __fill_pointer, _TypeT*)
687 if (__dist <= __buf_size)
690 _BidirIter __res1 = __first;
691 _Pointer __res2 = __buf;
692 for (; !(__first == __last) && __dist < __fill_pointer; ++__first)
694 if (!(__pred (*__first) ==
false)) {
704 if (!(__first == __last))
706 raw_storage_iterator<_Pointer, _TypeT> __res3 (__res2);
707 for (; !(__first == __last); ++__first)
709 if (!(__pred (*__first) ==
false)) {
719 __fill_pointer = __dist;
721 _STD::copy (__buf, __buf + __dist, __res1);
724 _BidirIter __middle = __first;
725 _STD::advance (__middle, __dist / 2);
729 _BidirIter __first_cut =
730 __stable_partition_adaptive (__first, __middle, __pred,
733 __fill_pointer, (_TypeT*)0);
734 _BidirIter __second_cut =
735 __stable_partition_adaptive (__middle, __last, __pred,
736 _Dist (__dist - __dist / 2),
738 __fill_pointer, (_TypeT*)0);
740 _STD::rotate (__first_cut, __middle, __second_cut);
741 __dist =
_DISTANCE (__middle, __second_cut, _Dist);
742 _STD::advance (__first_cut, __dist);
748template <
class _B
idirIter,
class _Predicate,
class _TypeT,
class _Dist>
749_BidirIter __stable_partition (_BidirIter __first, _BidirIter __last,
750 _Predicate __pred, _TypeT*, _Dist*)
754 const _Dist __dist =
_DISTANCE (__first, __last, _Dist);
761 pair<_TypeT*, _Dist> __pair =
762 _STD::get_temporary_buffer (__dist, (_TypeT*)0);
764 if (__pair.first == 0)
765 return __inplace_stable_partition (__first, __last, __pred, __dist);
769 const _BidirIter __res =
770 __stable_partition_adaptive (__first, __last, __pred, __dist,
771 __pair.first, __pair.second,
774 for (_TypeT *__ptr = __pair.first + __fill; !(__pair.first == __ptr--); )
777 _STD::return_temporary_buffer (__pair.first);
786template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
787_RandomAccessIter __unguarded_partition (_RandomAccessIter __first,
788 _RandomAccessIter __last,
789 _TypeT __pivot, _Compare __comp)
793 for ( ; ; ++__first) {
794 for (; __comp (*__first, __pivot); ++__first);
796 while (__comp (__pivot, *--__last));
798 if (!(__first < __last))
801 _STD::iter_swap (__first, __last);
806template <
class _TypeT,
class _Compare>
807inline const _TypeT& __median (
const _TypeT& __a,
const _TypeT& __b,
808 const _TypeT& __c, _Compare __comp)
810 return __comp (__a, __b)
811 ? __comp (__b, __c) ? __b : __comp (__a, __c) ? __c : __a
812 : __comp (__a, __c) ? __a : __comp (__b, __c) ? __c : __b;
816enum { __rw_threshold = 16 };
818template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
819void __quick_sort_loop_aux (_RandomAccessIter __first,
820 _RandomAccessIter __last, _TypeT*,
825 while (__last - __first > __rw_threshold) {
826 _RandomAccessIter __cut =
827 __unguarded_partition (__first, __last,
828 _TypeT (__median (*__first,
830 (__last - __first)/2),
834 if (__cut - __first >= __last - __cut) {
835 __quick_sort_loop_aux (__cut, __last,
841 __quick_sort_loop_aux (__first, __cut,
850template <
class _RandomAccessIter,
class _TypeT>
851inline void __linear_insert (_RandomAccessIter __first,
852 _RandomAccessIter __last, _TypeT*)
854 const _TypeT __val = *__last;
856 if (__val < *__first) {
857 _STD::copy_backward (__first, __last, __last + 1);
861 __unguarded_linear_insert (__last, __val);
865template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
867__linear_insert (_RandomAccessIter __first, _RandomAccessIter __last, _TypeT*,
870 const _TypeT __val = *__last;
872 if (__comp (__val, *__first)) {
873 _STD::copy_backward (__first, __last, __last + 1);
877 __unguarded_linear_insert (__last, __val, __comp);
882template <
class _RandomAccessIter,
class _Compare>
883void __insertion_sort (_RandomAccessIter __first,
884 _RandomAccessIter __last, _Compare __comp)
888 if (! (__first == __last))
889 for (_RandomAccessIter __i = __first + 1; !(__i == __last); ++__i)
890 __linear_insert (__first, __i,
895template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
896void __unguarded_linear_insert (_RandomAccessIter __last, _TypeT __val,
899 for (_RandomAccessIter __next = __last; __comp (__val, *--__next); ) {
908template <
class _RandomAccessIter,
class _Compare>
909void __final_insertion_sort (_RandomAccessIter __first,
910 _RandomAccessIter __last, _Compare __comp)
914 if (__last - __first > __rw_threshold) {
915 __insertion_sort (__first, __first + __rw_threshold, __comp);
916 __unguarded_insertion_sort (__first + __rw_threshold, __last, __comp);
919 __insertion_sort (__first, __last, __comp);
923template <
class _RandomAccessIter1,
class _RandomAccessIter2,
924 class _Dist,
class _Compare>
925void __merge_sort_loop (_RandomAccessIter1 __first,
926 _RandomAccessIter1 __last,
927 _RandomAccessIter2 __res, _Dist __step,
932 const _Dist __two_step = 2 * __step;
934 while (__last - __first >= __two_step) {
935 __res = _STD::merge (__first, __first + __step,
936 __first + __step, __first + __two_step, __res,
938 __first += __two_step;
940 __step = (_STD::min)(_Dist (__last - __first), __step);
942 _STD::merge (__first, __first + __step, __first + __step, __last,
947template <
class _RandomAccessIter,
class _Dist,
class _Compare>
948void __chunk_insertion_sort (_RandomAccessIter __first,
949 _RandomAccessIter __last,
950 _Dist __chunk_size, _Compare __comp)
954 while (__last - __first >= __chunk_size)
956 __insertion_sort (__first, __first + __chunk_size, __comp);
957 __first += __chunk_size;
959 __insertion_sort (__first, __last, __comp);
964template <
class _RandomAccessIter,
class _Pointer,
class _Dist,
966void __merge_sort_with_buffer (_RandomAccessIter __first,
967 _RandomAccessIter __last, _Pointer __buf,
968 _Dist*, _Compare __comp)
972 const _Dist __dist = __last - __first;
973 const _Pointer __bufend = __buf + __dist;
977 __chunk_insertion_sort (__first, __last, __step, __comp);
979 while (__step < __dist) {
980 __merge_sort_loop (__first, __last, __buf, __step, __comp);
982 __merge_sort_loop (__buf, __bufend, __first, __step, __comp);
988template <
class _B
idirIter,
class _Dist,
class _Po
inter,
class _Compare>
989void __merge_adaptive (_BidirIter, _BidirIter, _BidirIter,
990 _Dist, _Dist, _Pointer, _Dist, _Compare);
993template <
class _RandomAccessIter,
class _Pointer,
class _Dist,
994 class _TypeT,
class _Compare>
995void __stable_sort_adaptive (_RandomAccessIter __first,
996 _RandomAccessIter __last, _Pointer __buf,
997 _Dist __buf_size, _TypeT*,
1002 const _Dist __dist = (__last - __first + 1) / 2;
1003 const _RandomAccessIter __middle = __first + __dist;
1005 if (__dist > __buf_size) {
1006 __stable_sort_adaptive (__first, __middle, __buf, __buf_size,
1007 (_TypeT*)0, __comp);
1008 __stable_sort_adaptive (__middle, __last, __buf, __buf_size,
1009 (_TypeT*)0, __comp);
1012 __merge_sort_with_buffer (__first, __middle, __buf,
1014 __merge_sort_with_buffer (__middle, __last, __buf,
1017 __merge_adaptive (__first, __middle, __last,
1018 _Dist (__middle - __first),
1019 _Dist (__last - __middle), __buf, __buf_size, __comp);
1024template <
class _RandomAccessIter,
class _TypeT,
class _Dist,
class _Compare>
1026__stable_sort (_RandomAccessIter __first, _RandomAccessIter __last,
1027 _TypeT*, _Dist*, _Compare __comp)
1031 pair<_TypeT*, _Dist> __p =
1032 _STD::get_temporary_buffer (_Dist (__last - __first), (_TypeT*)0);
1035 __inplace_stable_sort (__first, __last, __comp);
1037 _Dist __len = (_STD::min)(_Dist (__p.second),
1038 _Dist (__last - __first));
1039 _STD::copy (__first, __first + __len,
1040 raw_storage_iterator<_TypeT*, _TypeT>(__p.first));
1042 __stable_sort_adaptive (__first, __last, __p.first, __p.second,
1043 (_TypeT*)0, __comp);
1045 for (_TypeT *__ptr = __p.first + __len; !(__p.first == --__ptr); )
1046 (*__ptr).~_TypeT ();
1048 _STD::return_temporary_buffer (__p.first);
1054template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
1055void __partial_sort (_RandomAccessIter __first, _RandomAccessIter __middle,
1056 _RandomAccessIter __last, _TypeT*, _Compare __comp)
1060 _STD::make_heap (__first, __middle, __comp);
1062 for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
1063 if (__comp (*__i, *__first))
1064 __pop_heap (__first, __middle, __i, *__i, __comp,
1067 _STD::sort_heap (__first, __middle, __comp);
1072template <
class _InputIter,
class _RandomAccessIter,
class _Compare,
1073 class _Dist,
class _TypeT>
1074_RandomAccessIter __partial_sort_copy (_InputIter __first,
1076 _RandomAccessIter __first2,
1077 _RandomAccessIter __last2,
1084 if (__first2 == __last2)
1087 _RandomAccessIter __res = __first2;
1089 for (; !(__first == __last) && !(__res == __last2); ++__first, ++__res)
1092 _STD::make_heap (__first2, __res, __comp);
1094 for (; !(__first == __last); ++__first) {
1095 if (__comp (*__first, *__first2))
1096 __adjust_heap (__first2, _Dist (), _Dist (__res - __first2),
1100 _STD::sort_heap (__first2, __res, __comp);
1110template <
class _RandomAccessIter,
class _Dist,
class _Compare>
1111void __introsort_loop (_RandomAccessIter __first, _RandomAccessIter __last,
1112 _Dist __max_depth, _Compare __comp)
1114 for ( ; __rw_threshold < __last - __first; ) {
1115 if (0 == __max_depth) {
1116 __partial_sort (__first, __last, __last,
1121 _RandomAccessIter __cut =
1122 __unguarded_partition (__first, __last,
1124 *(__first + (__last - __first) /2),
1125 *(__last - 1), __comp), __comp);
1129 __introsort_loop (__cut, __last, __max_depth /= 2, __comp);
1136template <
class _RandomAccessIter,
class _TypeT,
class _Compare>
1137void __nth_element (_RandomAccessIter __first, _RandomAccessIter __nth,
1138 _RandomAccessIter __last, _TypeT*, _Compare __comp)
1142 while (__last - __first > 3) {
1143 const _RandomAccessIter __cut =
1144 __unguarded_partition (__first, __last,
1145 _TypeT (__median (*__first,
1147 (__last - __first)/2),
1151 if (!(__nth < __cut))
1156 __insertion_sort (__first, __last, __comp);
1164template <
class _FwdIter,
class _TypeT,
class _Compare,
class _Dist>
1165_FwdIter __lower_bound (_FwdIter __first, _FwdIter __last,
1166 const _TypeT& __val, _Compare __comp,
1167 _Dist*, forward_iterator_tag)
1171 for (_Dist __dist =
_DISTANCE (__first, __last, _Dist); __dist; ) {
1173 const _Dist __half = __dist / 2;
1174 _FwdIter __middle = __first;
1176 _STD::advance (__middle, __half);
1178 if (__comp (*__middle, __val)) {
1181 __dist = __dist - __half - 1;
1191template <
class _RandomAccessIter,
class _TypeT,
class _Compare,
1193_RandomAccessIter __lower_bound (_RandomAccessIter __first,
1194 _RandomAccessIter __last,
1195 const _TypeT& __val,
1198 random_access_iterator_tag)
1202 for (_Dist __dist = __last - __first; __dist > 0; ) {
1204 const _Dist __half = __dist / 2;
1205 const _RandomAccessIter __middle = __first + __half;
1207 if (__comp (*__middle, __val)) {
1208 __first = __middle + 1;
1209 __dist = __dist - __half - 1;
1220template <
class _FwdIter,
class _TypeT,
class _Compare,
class _Dist>
1221_FwdIter __upper_bound (_FwdIter __first, _FwdIter __last,
1222 const _TypeT& __val, _Compare __comp,
1223 _Dist*, forward_iterator_tag)
1227 for (_Dist __dist =
_DISTANCE (__first, __last, _Dist); __dist; ) {
1229 const _Dist __half = __dist / 2;
1230 _FwdIter __middle = __first;
1232 _STD::advance (__middle, __half);
1234 if (__comp (__val, *__middle))
1239 __dist = __dist - __half - 1;
1248template <
class _RandomAccessIter,
class _TypeT,
class _Compare,
class _Dist>
1249_RandomAccessIter __upper_bound (_RandomAccessIter __first,
1250 _RandomAccessIter __last,
1251 const _TypeT& __val,
1252 _Compare __comp, _Dist*,
1253 random_access_iterator_tag)
1257 for (_Dist __dist = __last - __first; __dist; ) {
1259 const _Dist __half = __dist / 2;
1260 const _RandomAccessIter __middle = __first + __half;
1262 if (__comp (__val, *__middle))
1265 __first = __middle + 1;
1266 __dist = __dist - __half - 1;
1275template <
class _FwdIter,
class _TypeT,
class _Compare,
class _Dist>
1276pair<_FwdIter, _FwdIter>
1277__equal_range (_FwdIter __first, _FwdIter __last,
const _TypeT& __val,
1278 _Compare __comp, _Dist*, forward_iterator_tag)
1282 for (_Dist __dist =
_DISTANCE (__first, __last, _Dist); __dist; ) {
1284 const _Dist __half = __dist / 2;
1285 _FwdIter __middle = __first;
1287 _STD::advance (__middle, __half);
1289 if (__comp (*__middle, __val)) {
1292 __dist = __dist - __half - 1;
1294 else if (__comp (__val, *__middle))
1297 const _FwdIter __left =
1298 _STD::lower_bound (__first, __middle, __val, __comp);
1300 _STD::advance (__first, __dist);
1302 const _FwdIter __right =
1303 _STD::upper_bound (++__middle, __first, __val, __comp);
1305 return pair<_FwdIter, _FwdIter>(__left, __right);
1309 return pair<_FwdIter, _FwdIter>(__first, __first);
1314template <
class _RandomAccessIter,
class _TypeT,
class _Compare,
1316pair<_RandomAccessIter, _RandomAccessIter>
1317__equal_range (_RandomAccessIter __first, _RandomAccessIter __last,
1318 const _TypeT& __val, _Compare __comp, _Dist*,
1319 random_access_iterator_tag)
1323 for (_Dist __dist = __last - __first; __dist; ) {
1325 const _Dist __half = __dist / 2;
1326 const _RandomAccessIter __middle = __first + __half;
1328 if (__comp (*__middle, __val)) {
1329 __first = __middle + 1;
1330 __dist = __dist - __half - 1;
1332 else if (__comp (__val, *__middle))
1335 const _RandomAccessIter __left =
1336 _STD::lower_bound (__first, __middle, __val, __comp);
1338 const _RandomAccessIter __right =
1339 _STD::upper_bound (__middle + 1, __first + __dist,
1342 return pair<_RandomAccessIter, _RandomAccessIter>(__left, __right);
1346 return pair<_RandomAccessIter, _RandomAccessIter>(__first, __first);
1354template <
class _InputIter1,
class _InputIter2,
class _OutputIter,
1356_OutputIter merge (_InputIter1 __first1, _InputIter1 __last1,
1357 _InputIter2 __first2, _InputIter2 __last2,
1358 _OutputIter __res, _Compare __comp)
1363 for (; !(__first1 == __last1) && !(__first2 == __last2); ++__res) {
1364 if (__comp (*__first2, *__first1)) {
1373 return _STD::copy (__first2, __last2, _STD::copy(__first1, __last1, __res));
1378template <
class _B
idirIter,
class _Dist,
class _Compare>
1379void __merge_without_buffer (_BidirIter __first,
1380 _BidirIter __middle,
1382 _Dist __dist1, _Dist __dist2,
1387 if (__dist1 == 0 || __dist2 == 0)
1390 if (__dist1 + __dist2 == 2) {
1391 if (__comp (*__middle, *__first))
1392 _STD::iter_swap (__first, __middle);
1396 _BidirIter __first_cut = __first;
1397 _BidirIter __second_cut = __middle;
1401 if (__dist1 > __dist2) {
1402 __dist11 = __dist1 / 2;
1403 _STD::advance (__first_cut, __dist11);
1404 __second_cut = _STD::lower_bound (__middle, __last,
1405 *__first_cut, __comp);
1406 __dist22 =
_DISTANCE (__middle, __second_cut, _Dist);
1409 __dist22 = __dist2 / 2;
1410 _STD::advance (__second_cut, __dist22);
1411 __first_cut = _STD::upper_bound (__first, __middle,
1412 *__second_cut, __comp);
1413 __dist11 =
_DISTANCE (__first, __first_cut, _Dist);
1415 _STD::rotate (__first_cut, __middle, __second_cut);
1417 _BidirIter __middle2 = __first_cut;
1419 _STD::advance (__middle2, __dist22);
1421 __merge_without_buffer (__first, __first_cut, __middle2,
1422 __dist11, __dist22, __comp);
1423 __merge_without_buffer (__middle2, __second_cut, __last,
1424 __dist1 - __dist11, __dist2 - __dist22, __comp);
1428template <
class _B
idirIter1,
class _B
idirIter2,
class _Dist>
1429_BidirIter1 __rotate_adaptive (_BidirIter1 __first,
1430 _BidirIter1 __middle,
1432 _Dist __dist1, _Dist __dist2,
1438 if (__dist1 > __dist2 && __dist2 <= __buf_size) {
1439 _BidirIter2 __buf_end = _STD::copy (__middle, __last, __buf);
1440 _STD::copy_backward (__first, __middle, __last);
1441 return _STD::copy (__buf, __buf_end, __first);
1444 if (__dist1 <= __buf_size) {
1445 _BidirIter2 __buf_end = _STD::copy (__first, __middle, __buf);
1446 _STD::copy (__middle, __last, __first);
1447 return _STD::copy_backward (__buf, __buf_end, __last);
1450 _STD::rotate (__first, __middle, __last);
1451 _STD::advance (__first, __dist2);
1456template <
class _BidirIter1,
class _BidirIter2,
1458_BidirIter3 __merge_backward (_BidirIter1 __first1,
1459 _BidirIter1 __last1,
1460 _BidirIter2 __first2,
1461 _BidirIter2 __last2,
1467 if (__first1 == __last1)
1468 return _STD::copy_backward (__first2, __last2, __res);
1470 if (__first2 == __last2)
1471 return _STD::copy_backward (__first1, __last1, __res);
1473 for (--__last1, --__last2; ; ) {
1474 if (*__last2 < *__last1) {
1475 *--__res = *__last1;
1476 if (__first1 == __last1)
1477 return _STD::copy_backward (__first2, ++__last2, __res);
1481 *--__res = *__last2;
1482 if (__first2 == __last2)
1483 return _STD::copy_backward (__first1, ++__last1, __res);
1491template <
class _BidirIter1,
class _BidirIter2,
1492 class _BidirIter3,
class _Compare>
1493_BidirIter3 __merge_backward (_BidirIter1 __first1,
1494 _BidirIter1 __last1,
1495 _BidirIter2 __first2,
1496 _BidirIter2 __last2,
1503 if (__first1 == __last1)
1504 return _STD::copy_backward (__first2, __last2, __res);
1505 if (__first2 == __last2)
1506 return _STD::copy_backward (__first1, __last1, __res);
1508 for (--__last1, --__last2; ; ) {
1509 if (__comp (*__last2, *__last1)) {
1510 *--__res = *__last1;
1511 if (__first1 == __last1)
1512 return _STD::copy_backward (__first2, ++__last2, __res);
1516 *--__res = *__last2;
1517 if (__first2 == __last2)
1518 return _STD::copy_backward (__first1, ++__last1, __res);
1525template <
class _B
idirIter,
class _Dist,
class _Po
inter,
class _Compare>
1526void __merge_adaptive (_BidirIter __first, _BidirIter __middle,
1528 _Dist __dist1, _Dist __dist2,
1529 _Pointer __buf, _Dist __buf_size,
1534 if (__dist1 <= __dist2 && __dist1 <= __buf_size)
1536 _Pointer __buf_end = _STD::copy (__first, __middle, __buf);
1537 _STD::merge (__buf, __buf_end, __middle, __last, __first, __comp);
1539 else if (__dist2 <= __buf_size)
1541 _Pointer __buf_end = _STD::copy (__middle, __last, __buf);
1542 __merge_backward (__first, __middle, __buf, __buf_end, __last,
1547 _BidirIter __first_cut = __first;
1548 _BidirIter __second_cut = __middle;
1551 if (__dist1 > __dist2)
1553 __dist11 = __dist1 / 2;
1554 _STD::advance (__first_cut, __dist11);
1555 __second_cut = _STD::lower_bound (__middle, __last, *__first_cut,
1557 __dist22 =
_DISTANCE (__middle, __second_cut, _Dist);
1561 __dist22 = __dist2 / 2;
1562 _STD::advance (__second_cut, __dist22);
1563 __first_cut = _STD::upper_bound (__first, __middle, *__second_cut,
1565 __dist11 =
_DISTANCE (__first, __first_cut, _Dist);
1567 _BidirIter __middle2 =
1568 __rotate_adaptive (__first_cut, __middle, __second_cut,
1569 __dist1 - __dist11, __dist22,
1571 __merge_adaptive (__first, __first_cut, __middle2,
1573 __buf, __buf_size, __comp);
1574 __merge_adaptive (__middle2, __second_cut, __last,
1575 __dist1 - __dist11, __dist2 - __dist22,
1576 __buf, __buf_size, __comp);
1582template <
class _B
idirIter,
class _Dist,
class _TypeT,
class _Compare>
1583void __inplace_merge (_BidirIter __first, _BidirIter __middle,
1584 _BidirIter __last, _Dist*, _TypeT*, _Compare __comp)
1586 _Dist __dist1 =
_DISTANCE (__first, __middle, _Dist);
1587 _Dist __dist2 =
_DISTANCE (__middle, __last, _Dist);
1591 pair<_TypeT*, _Dist> __pair =
1592 _STD::get_temporary_buffer (__dist1 + __dist2, (_TypeT*)0);
1594 if (__pair.first == 0) {
1595 __merge_without_buffer (__first, __middle, __last, __dist1, __dist2,
1599 _Dist __dist = (_STD::min)(__pair.second, __dist1 + __dist2);
1601 _STD::fill_n (raw_storage_iterator<_TypeT*, _TypeT> (__pair.first),
1603 __merge_adaptive (__first, __middle, __last, __dist1, __dist2,
1604 __pair.first, __pair.second, __comp);
1606 for (_TypeT *__ptr = __pair.first + __dist;
1607 !(__pair.first == --__ptr); )
1608 (*__ptr).~_TypeT ();
1610 _STD::return_temporary_buffer (__pair.first);
1622template <
class _InputIter1,
class _InputIter2,
class _Compare>
1623bool includes (_InputIter1 __first1, _InputIter1 __last1,
1624 _InputIter2 __first2, _InputIter2 __last2,
1630 for (; !(__first1 == __last1) && !(__first2 == __last2); ++__first1) {
1631 if (__comp (*__first2, *__first1))
1634 if (__comp (*__first1, *__first2) ==
false)
1638 return __first2 == __last2;
1643template <
class _InputIter1,
class _InputIter2,
class _OutputIter,
1645_OutputIter set_union (_InputIter1 __first1, _InputIter1 __last1,
1646 _InputIter2 __first2, _InputIter2 __last2,
1647 _OutputIter __res, _Compare __comp)
1652 for (; !(__first1 == __last1) && !(__first2 == __last2); ++__res) {
1653 if (__comp (*__first1, *__first2)) {
1657 else if (__comp (*__first2, *__first1)) {
1667 return _STD::copy (__first2, __last2,
1668 _STD::copy (__first1, __last1, __res));
1673template <
class _InputIter1,
class _InputIter2,
class _OutputIter,
1675_OutputIter set_intersection (_InputIter1 __first1, _InputIter1 __last1,
1676 _InputIter2 __first2, _InputIter2 __last2,
1677 _OutputIter __res, _Compare __comp)
1682 while (!(__first1 == __last1) && !(__first2 == __last2)) {
1683 if (__comp (*__first1, *__first2))
1685 else if (__comp (*__first2, *__first1))
1700template <
class _InputIter1,
class _InputIter2,
class _OutputIter,
1702_OutputIter set_difference (_InputIter1 __first1, _InputIter1 __last1,
1703 _InputIter2 __first2, _InputIter2 __last2,
1704 _OutputIter __res, _Compare __comp)
1709 while (!(__first1 == __last1) && !(__first2 == __last2)) {
1710 if (__comp (*__first1, *__first2)) {
1715 else if (__comp (*__first2, *__first1))
1723 return _STD::copy (__first1, __last1, __res);
1728template <
class _InputIter1,
class _InputIter2,
class _OutputIter,
1730_OutputIter set_symmetric_difference (_InputIter1 __first1,
1731 _InputIter1 __last1,
1732 _InputIter2 __first2,
1733 _InputIter2 __last2,
1740 while (!(__first1 == __last1) && !(__first2 == __last2)) {
1741 if (__comp (*__first1, *__first2)) {
1746 else if (__comp (*__first2, *__first1)) {
1757 return _STD::copy (__first2, __last2, _STD::copy(__first1, __last1, __res));
1766template <
class _FwdIter,
class _Compare>
1767_FwdIter min_element (_FwdIter __first, _FwdIter __last, _Compare __comp)
1771 _FwdIter __res = __first;
1773 if (!(__first == __last)) {
1774 while (!(++__first == __last)) {
1775 if (__comp (*__first, *__res))
1785template <
class _FwdIter,
class _Compare>
1786_FwdIter max_element (_FwdIter __first, _FwdIter __last, _Compare __comp)
1790 _FwdIter __res = __first;
1792 if (!(__first == __last)) {
1793 while (!(++__first == __last)) {
1794 if (__comp (*__res, *__first))
1807template <
class _B
idirIter,
class _Compare>
1808bool next_permutation (_BidirIter __first, _BidirIter __last, _Compare __comp)
1812 if (__first == __last)
1815 _BidirIter __i = __first;
1817 if (++__i == __last)
1822 for (__i = __last, --__i; ; ) {
1823 const _BidirIter __ii = __i;
1825 if (__comp (*--__i, *__ii)) {
1827 _BidirIter __j = __last;
1829 while (__comp (*__i, *--__j) ==
false);
1831 _STD::iter_swap (__i, __j);
1838 if (__i == __first) {
1844 _STD::reverse (__first, __last);
1851template <
class _B
idirIter,
class _Compare>
1852bool prev_permutation (_BidirIter __first, _BidirIter __last, _Compare __comp)
1856 if (__first == __last)
1859 _BidirIter __i = __first;
1861 if (++__i == __last)
1866 for (__i = __last, --__i; ; ) {
1867 const _BidirIter __ii = __i;
1869 if (__comp (*__ii, *--__i)) {
1871 _BidirIter __j = __last;
1873 while (__comp (*--__j, *__i) ==
false);
1875 _STD::iter_swap (__i, __j);
1882 if (__i == __first) {
1888 _STD::reverse (__first, __last);
bool equal(const T &x, const U &y)
#define _RWSTD_VALUE_TYPE(iterT)
#define _RWSTD_ASSERT_IN_RANGE(ign1, ign2, ign3)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ASSERT(ignore)
#define _DISTANCE(first, last, ignore)
#define _RWSTD_ASSERT_RANGE(ign1, ign2)
#define _RWSTD_DIFFERENCE_TYPE(iterT)
#define _RWSTD_ITERATOR_CATEGORY(iterT, ignore)