williamr@2: /* williamr@2: * williamr@2: * Copyright (c) 1994 williamr@2: * Hewlett-Packard Company williamr@2: * williamr@2: * Copyright (c) 1996,1997 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1997 williamr@2: * Moscow Center for SPARC Technology williamr@2: * williamr@4: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: /* NOTE: This is an internal header file, included by other STL headers. williamr@2: * You should not attempt to use it directly. williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ALGO_H williamr@2: #define _STLP_INTERNAL_ALGO_H williamr@2: williamr@4: #ifndef _STLP_INTERNAL_ALGOBASE_H williamr@2: # include williamr@4: #endif williamr@2: williamr@4: #ifndef _STLP_INTERNAL_HEAP_H williamr@4: # include williamr@4: #endif williamr@2: williamr@4: #ifndef _STLP_INTERNAL_ITERATOR_H williamr@4: # include williamr@4: #endif williamr@2: williamr@4: #ifndef _STLP_INTERNAL_FUNCTION_BASE_H williamr@4: # include williamr@4: #endif williamr@2: williamr@4: #if defined (__SUNPRO_CC) && !defined (_STLP_INTERNAL_CSTDIO) williamr@2: // remove() conflict williamr@4: # include williamr@4: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: // for_each. Apply a function to every element of a range. williamr@2: template williamr@4: _STLP_INLINE_LOOP _Function williamr@2: for_each(_InputIter __first, _InputIter __last, _Function __f) { williamr@2: for ( ; __first != __last; ++__first) williamr@2: __f(*__first); williamr@2: return __f; williamr@2: } williamr@2: williamr@2: // count_if williamr@2: template williamr@2: _STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter) williamr@2: count_if(_InputIter __first, _InputIter __last, _Predicate __pred) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: _STLP_DIFFERENCE_TYPE(_InputIter) __n = 0; williamr@4: for ( ; __first != __last; ++__first) { williamr@2: if (__pred(*__first)) williamr@2: ++__n; williamr@4: } williamr@2: return __n; williamr@2: } williamr@2: williamr@2: // adjacent_find. williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _ForwardIter williamr@2: adjacent_find(_ForwardIter __first, _ForwardIter __last, williamr@2: _BinaryPredicate __binary_pred) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: if (__first == __last) williamr@2: return __last; williamr@2: _ForwardIter __next = __first; williamr@2: while(++__next != __last) { williamr@2: if (__binary_pred(*__first, *__next)) williamr@2: return __first; williamr@2: __first = __next; williamr@2: } williamr@2: return __last; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _ForwardIter williamr@2: adjacent_find(_ForwardIter __first, _ForwardIter __last) { williamr@2: return adjacent_find(__first, __last, williamr@4: _STLP_PRIV __equal_to(_STLP_VALUE_TYPE(__first, _ForwardIter))); williamr@2: } williamr@2: williamr@4: #if !defined (_STLP_NO_ANACHRONISMS) williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: count(_InputIter __first, _InputIter __last, const _Tp& __val, _Size& __n) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first) williamr@2: if (*__first == __val) williamr@2: ++__n; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: count_if(_InputIter __first, _InputIter __last, _Predicate __pred, _Size& __n) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first) williamr@2: if (__pred(*__first)) williamr@2: ++__n; williamr@2: } williamr@4: #endif williamr@2: williamr@2: template williamr@2: _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1, williamr@2: _ForwardIter2 __first2, _ForwardIter2 __last2); williamr@2: williamr@2: // search_n. Search for __count consecutive copies of __val. williamr@2: template williamr@2: _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last, williamr@2: _Integer __count, const _Tp& __val); williamr@2: template williamr@2: _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last, williamr@2: _Integer __count, const _Tp& __val, _BinaryPred __binary_pred); williamr@2: williamr@2: template williamr@2: inline _InputIter find_first_of(_InputIter __first1, _InputIter __last1, williamr@2: _ForwardIter __first2, _ForwardIter __last2) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2)) williamr@4: return _STLP_PRIV __find_first_of(__first1, __last1, __first2, __last2, williamr@4: _STLP_PRIV __equal_to(_STLP_VALUE_TYPE(__first1, _InputIter))); williamr@2: } williamr@2: williamr@2: template williamr@4: inline _InputIter williamr@2: find_first_of(_InputIter __first1, _InputIter __last1, williamr@4: _ForwardIter __first2, _ForwardIter __last2, _BinaryPredicate __comp) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2)) williamr@4: return _STLP_PRIV __find_first_of(__first1, __last1, __first2, __last2, __comp); williamr@2: } williamr@2: williamr@2: template williamr@4: _ForwardIter1 williamr@4: find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, williamr@2: _ForwardIter2 __first2, _ForwardIter2 __last2); williamr@2: williamr@2: // swap_ranges williamr@2: template williamr@4: _STLP_INLINE_LOOP _ForwardIter2 williamr@2: swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1, _ForwardIter2 __first2) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) williamr@2: for ( ; __first1 != __last1; ++__first1, ++__first2) williamr@2: iter_swap(__first1, __first2); williamr@2: return __first2; williamr@2: } williamr@2: williamr@2: // transform williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@2: transform(_InputIter __first, _InputIter __last, _OutputIter __result, _UnaryOperation __opr) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first, ++__result) williamr@2: *__result = __opr(*__first); williamr@2: return __result; williamr@2: } williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@4: transform(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _OutputIter __result,_BinaryOperation __binary_op) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) williamr@2: for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result) williamr@2: *__result = __binary_op(*__first1, *__first2); williamr@2: return __result; williamr@2: } williamr@2: williamr@2: // replace_if, replace_copy, replace_copy_if williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: replace_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred, const _Tp& __new_value) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first) williamr@2: if (__pred(*__first)) williamr@2: *__first = __new_value; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@2: replace_copy(_InputIter __first, _InputIter __last,_OutputIter __result, williamr@2: const _Tp& __old_value, const _Tp& __new_value) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first, ++__result) williamr@2: *__result = *__first == __old_value ? __new_value : *__first; williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@2: replace_copy_if(_Iterator __first, _Iterator __last, williamr@2: _OutputIter __result, williamr@2: _Predicate __pred, const _Tp& __new_value) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first, ++__result) williamr@2: *__result = __pred(*__first) ? __new_value : *__first; williamr@2: return __result; williamr@2: } williamr@2: williamr@2: // generate and generate_n williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: for ( ; __first != __last; ++__first) williamr@2: *__first = __gen(); williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: generate_n(_OutputIter __first, _Size __n, _Generator __gen) { williamr@2: for ( ; __n > 0; --__n, ++__first) williamr@2: *__first = __gen(); williamr@2: } williamr@2: williamr@2: // remove, remove_if, remove_copy, remove_copy_if williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@2: remove_copy(_InputIter __first, _InputIter __last,_OutputIter __result, const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: for ( ; __first != __last; ++__first) { williamr@2: if (!(*__first == __val)) { williamr@2: *__result = *__first; williamr@2: ++__result; williamr@2: } williamr@4: } williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _OutputIter williamr@2: remove_copy_if(_InputIter __first, _InputIter __last, _OutputIter __result, _Predicate __pred) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: for ( ; __first != __last; ++__first) { williamr@2: if (!__pred(*__first)) { williamr@2: *__result = *__first; williamr@2: ++__result; williamr@2: } williamr@4: } williamr@2: return __result; williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _ForwardIter williamr@2: remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: __first = find(__first, __last, __val); williamr@2: if (__first == __last) williamr@2: return __first; williamr@4: else { williamr@2: _ForwardIter __next = __first; williamr@2: return remove_copy(++__next, __last, __first, __val); williamr@2: } williamr@2: } williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP _ForwardIter williamr@2: remove_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: __first = find_if(__first, __last, __pred); williamr@2: if ( __first == __last ) williamr@2: return __first; williamr@2: else { williamr@2: _ForwardIter __next = __first; williamr@2: return remove_copy_if(++__next, __last, __first, __pred); williamr@2: } williamr@2: } williamr@2: williamr@2: // unique and unique_copy williamr@2: template williamr@2: _OutputIter unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result); williamr@2: williamr@2: template williamr@2: _OutputIter unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result, williamr@2: _BinaryPredicate __binary_pred); williamr@2: williamr@2: template williamr@2: inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) { williamr@2: __first = adjacent_find(__first, __last); williamr@2: return unique_copy(__first, __last, __first); williamr@2: } williamr@2: williamr@2: template williamr@2: inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last, williamr@4: _BinaryPredicate __binary_pred) { williamr@2: __first = adjacent_find(__first, __last, __binary_pred); williamr@2: return unique_copy(__first, __last, __first, __binary_pred); williamr@2: } williamr@2: williamr@2: // reverse and reverse_copy, and their auxiliary functions williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: __reverse(_BidirectionalIter __first, _BidirectionalIter __last, const bidirectional_iterator_tag &) { williamr@4: for (; __first != __last && __first != --__last; ++__first) williamr@2: iter_swap(__first,__last); williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@4: _STLP_INLINE_LOOP void williamr@2: __reverse(_RandomAccessIter __first, _RandomAccessIter __last, const random_access_iterator_tag &) { williamr@4: for (; __first < __last; ++__first) williamr@4: iter_swap(__first, --__last); williamr@2: } williamr@2: williamr@2: template williamr@4: inline void williamr@2: reverse(_BidirectionalIter __first, _BidirectionalIter __last) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: __reverse(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _BidirectionalIter)); williamr@2: } williamr@2: williamr@2: template williamr@2: _STLP_INLINE_LOOP williamr@2: _OutputIter reverse_copy(_BidirectionalIter __first, williamr@4: _BidirectionalIter __last, williamr@4: _OutputIter __result) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@2: while (__first != __last) { williamr@2: --__last; williamr@2: *__result = *__last; williamr@2: ++__result; williamr@2: } williamr@2: return __result; williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@2: // rotate and rotate_copy, and their auxiliary functions williamr@2: template williamr@2: _STLP_INLINE_LOOP williamr@2: _EuclideanRingElement __gcd(_EuclideanRingElement __m, williamr@4: _EuclideanRingElement __n) { williamr@2: while (__n != 0) { williamr@2: _EuclideanRingElement __t = __m % __n; williamr@2: __m = __n; williamr@2: __n = __t; williamr@2: } williamr@2: return __m; williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: template williamr@4: void rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last); williamr@2: williamr@2: template williamr@2: inline _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle, williamr@2: _ForwardIter __last, _OutputIter __result) { williamr@2: return copy(__first, __middle, copy(__middle, __last, __result)); williamr@2: } williamr@2: williamr@2: // random_shuffle williamr@2: williamr@2: template williamr@2: void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last); williamr@2: williamr@2: template williamr@2: void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last, williamr@2: _RandomNumberGenerator& __rand); williamr@2: williamr@4: #if !defined (_STLP_NO_EXTENSIONS) williamr@2: // random_sample and random_sample_n (extensions, not part of the standard). williamr@2: williamr@2: template williamr@2: _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last, williamr@4: _OutputIter __out_ite, const _Distance __n); williamr@2: williamr@2: template williamr@2: _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last, williamr@4: _OutputIter __out_ite, const _Distance __n, williamr@2: _RandomNumberGenerator& __rand); williamr@2: williamr@2: template williamr@2: _RandomAccessIter williamr@2: random_sample(_InputIter __first, _InputIter __last, williamr@2: _RandomAccessIter __out_first, _RandomAccessIter __out_last); williamr@2: williamr@4: template williamr@2: _RandomAccessIter williamr@2: random_sample(_InputIter __first, _InputIter __last, williamr@2: _RandomAccessIter __out_first, _RandomAccessIter __out_last, williamr@2: _RandomNumberGenerator& __rand); williamr@2: williamr@4: #endif /* _STLP_NO_EXTENSIONS */ williamr@2: williamr@2: // partition, stable_partition, and their auxiliary functions williamr@2: williamr@2: template williamr@2: _ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred); williamr@2: williamr@2: template williamr@4: _ForwardIter williamr@2: stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred); williamr@2: williamr@4: // sort() and its auxiliary functions. williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@2: williamr@2: template williamr@2: inline _Size __lg(_Size __n) { williamr@2: _Size __k; williamr@2: for (__k = 0; __n != 1; __n >>= 1) ++__k; williamr@2: return __k; williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: template williamr@2: void sort(_RandomAccessIter __first, _RandomAccessIter __last); williamr@2: template williamr@2: void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp); williamr@2: williamr@2: // stable_sort() and its auxiliary functions. williamr@2: template williamr@2: void stable_sort(_RandomAccessIter __first, williamr@4: _RandomAccessIter __last); williamr@2: williamr@2: template williamr@2: void stable_sort(_RandomAccessIter __first, williamr@4: _RandomAccessIter __last, _Compare __comp); williamr@2: williamr@2: // partial_sort, partial_sort_copy, and auxiliary functions. williamr@2: williamr@2: template williamr@4: void partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle, williamr@4: _RandomAccessIter __last); williamr@2: williamr@2: template williamr@4: void partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, williamr@4: _RandomAccessIter __last, _Compare __comp); williamr@2: williamr@2: template williamr@2: _RandomAccessIter williamr@2: partial_sort_copy(_InputIter __first, _InputIter __last, williamr@2: _RandomAccessIter __result_first, _RandomAccessIter __result_last); williamr@2: williamr@2: template williamr@2: _RandomAccessIter williamr@2: partial_sort_copy(_InputIter __first, _InputIter __last, williamr@2: _RandomAccessIter __result_first, williamr@2: _RandomAccessIter __result_last, _Compare __comp); williamr@2: williamr@4: // nth_element() and its auxiliary functions. williamr@2: template williamr@2: void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, williamr@2: _RandomAccessIter __last); williamr@2: williamr@2: template williamr@2: void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth, williamr@2: _RandomAccessIter __last, _Compare __comp); williamr@2: williamr@2: // auxiliary class for lower_bound, etc. williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@2: template williamr@2: struct __less_2 { williamr@4: bool operator() (const _T1& __x, const _T2& __y) const { return __x < __y ; } williamr@2: }; williamr@2: williamr@2: template williamr@2: __less_2<_T1,_T2> __less2(_T1*, _T2* ) { return __less_2<_T1, _T2>(); } williamr@2: williamr@4: #if defined (_STLP_FUNCTION_PARTIAL_ORDER) williamr@2: template williamr@2: less<_Tp> __less2(_Tp*, _Tp* ) { return less<_Tp>(); } williamr@2: #endif williamr@2: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@4: williamr@2: // Binary search (lower_bound, upper_bound, equal_range, binary_search). williamr@2: template williamr@2: inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, williamr@2: const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __lower_bound(__first, __last, __val, williamr@4: _STLP_PRIV __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0), williamr@4: _STLP_PRIV __less2((_Tp*)0, _STLP_VALUE_TYPE(__first, _ForwardIter)), williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: } williamr@2: williamr@2: template williamr@2: inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last, williamr@2: const _Tp& __val, _Compare __comp) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __lower_bound(__first, __last, __val, __comp, __comp, williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@4: template williamr@4: _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, williamr@4: _Compare1 __comp1, _Compare2 __comp2, _Distance*); williamr@4: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@2: williamr@2: template williamr@2: inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, williamr@2: const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __upper_bound(__first, __last, __val, williamr@4: _STLP_PRIV __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0), williamr@4: _STLP_PRIV __less2((_Tp*)0, _STLP_VALUE_TYPE(__first, _ForwardIter)), williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: } williamr@2: williamr@2: template williamr@2: inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last, williamr@2: const _Tp& __val, _Compare __comp) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __upper_bound(__first, __last, __val, __comp, __comp, williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: } williamr@2: williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@4: template williamr@2: pair<_ForwardIter, _ForwardIter> williamr@2: __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, williamr@4: _Compare1 __comp1, _Compare2 __comp2, _Distance*); williamr@4: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@2: williamr@2: template williamr@2: inline pair<_ForwardIter, _ForwardIter> williamr@2: equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __equal_range(__first, __last, __val, williamr@4: _STLP_PRIV __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0), williamr@4: _STLP_PRIV __less2((_Tp*)0, _STLP_VALUE_TYPE(__first, _ForwardIter)), williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: } williamr@2: williamr@2: template williamr@2: inline pair<_ForwardIter, _ForwardIter> williamr@2: equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, williamr@2: _Compare __comp) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: return _STLP_PRIV __equal_range(__first, __last, __val, __comp, __comp, williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@4: } williamr@2: williamr@2: template williamr@2: inline bool binary_search(_ForwardIter __first, _ForwardIter __last, williamr@2: const _Tp& __val) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: _ForwardIter __i = _STLP_PRIV __lower_bound(__first, __last, __val, williamr@4: _STLP_PRIV __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0), williamr@4: _STLP_PRIV __less2((_Tp*)0, _STLP_VALUE_TYPE(__first, _ForwardIter)), williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: return __i != __last && !(__val < *__i); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool binary_search(_ForwardIter __first, _ForwardIter __last, williamr@4: const _Tp& __val, williamr@4: _Compare __comp) { williamr@4: _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) williamr@4: _ForwardIter __i = _STLP_PRIV __lower_bound(__first, __last, __val, __comp, __comp, williamr@4: _STLP_DISTANCE_TYPE(__first, _ForwardIter)); williamr@2: return __i != __last && !__comp(__val, *__i); williamr@2: } williamr@2: williamr@2: // merge, with and without an explicitly supplied comparison function. williamr@2: williamr@2: template williamr@2: _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result); williamr@4: williamr@2: template williamr@2: _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result, _Compare __comp); williamr@2: williamr@2: williamr@4: // inplace_merge and its auxiliary functions. williamr@2: williamr@2: williamr@2: template williamr@2: void inplace_merge(_BidirectionalIter __first, williamr@4: _BidirectionalIter __middle, williamr@4: _BidirectionalIter __last) ; williamr@2: williamr@2: template williamr@2: void inplace_merge(_BidirectionalIter __first, williamr@4: _BidirectionalIter __middle, williamr@4: _BidirectionalIter __last, _Compare __comp); williamr@2: williamr@2: // Set algorithms: includes, set_union, set_intersection, set_difference, williamr@2: // set_symmetric_difference. All of these algorithms have the precondition williamr@2: // that their input ranges are sorted and the postcondition that their output williamr@2: // ranges are sorted. williamr@2: williamr@2: template williamr@2: bool includes(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2); williamr@2: williamr@2: template williamr@2: bool includes(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, _Compare __comp); williamr@4: williamr@2: template williamr@2: _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result); williamr@2: williamr@2: template williamr@2: _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result, _Compare __comp); williamr@2: williamr@2: template williamr@2: _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result); williamr@2: williamr@2: template williamr@2: _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result, _Compare __comp); williamr@2: williamr@2: williamr@2: williamr@2: template williamr@2: _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result); williamr@2: williamr@4: template williamr@2: _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1, williamr@4: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result, _Compare __comp); williamr@2: williamr@2: template williamr@4: _OutputIter williamr@2: set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result); williamr@2: williamr@2: williamr@2: template williamr@4: _OutputIter williamr@2: set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1, williamr@2: _InputIter2 __first2, _InputIter2 __last2, williamr@2: _OutputIter __result, williamr@2: _Compare __comp); williamr@2: williamr@2: williamr@2: // min_element and max_element, with and without an explicitly supplied williamr@2: // comparison function. williamr@2: williamr@2: template williamr@2: _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last); williamr@2: template williamr@2: _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last, williamr@2: _Compare __comp); williamr@2: williamr@2: template williamr@2: _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last); williamr@2: williamr@2: template williamr@2: _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last, williamr@2: _Compare __comp); williamr@2: williamr@4: // next_permutation and prev_permutation, with and without an explicitly williamr@2: // supplied comparison function. williamr@2: williamr@2: template williamr@2: bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last); williamr@2: williamr@2: template williamr@2: bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last, williamr@2: _Compare __comp); williamr@2: williamr@2: williamr@2: template williamr@2: bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last); williamr@2: williamr@2: williamr@2: template williamr@2: bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last, williamr@2: _Compare __comp); williamr@2: williamr@4: #if !defined (_STLP_NO_EXTENSIONS) williamr@2: // is_heap, a predicate testing whether or not a range is williamr@2: // a heap. This function is an extension, not part of the C++ williamr@2: // standard. williamr@2: williamr@2: template williamr@2: bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last); williamr@2: williamr@2: template williamr@2: bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last, williamr@4: _StrictWeakOrdering __comp); williamr@2: williamr@2: // is_sorted, a predicated testing whether a range is sorted in williamr@2: // nondescending order. This is an extension, not part of the C++ williamr@2: // standard. williamr@4: _STLP_MOVE_TO_PRIV_NAMESPACE williamr@4: williamr@2: template williamr@2: bool __is_sorted(_ForwardIter __first, _ForwardIter __last, williamr@2: _StrictWeakOrdering __comp); williamr@2: williamr@4: _STLP_MOVE_TO_STD_NAMESPACE williamr@2: template williamr@2: inline bool is_sorted(_ForwardIter __first, _ForwardIter __last) { williamr@4: return _STLP_PRIV __is_sorted(__first, __last, williamr@4: _STLP_PRIV __less(_STLP_VALUE_TYPE(__first, _ForwardIter))); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool is_sorted(_ForwardIter __first, _ForwardIter __last, williamr@2: _StrictWeakOrdering __comp) { williamr@4: return _STLP_PRIV __is_sorted(__first, __last, __comp); williamr@2: } williamr@4: #endif williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@4: #if !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@4: #endif williamr@2: williamr@2: #endif /* _STLP_INTERNAL_ALGO_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: