epoc32/include/stdapis/stlportv5/stl/_algo.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/stdapis/stlport/stl/_algo.h@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/*
williamr@2
     2
 *
williamr@2
     3
 * Copyright (c) 1994
williamr@2
     4
 * Hewlett-Packard Company
williamr@2
     5
 *
williamr@2
     6
 * Copyright (c) 1996,1997
williamr@2
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     8
 *
williamr@2
     9
 * Copyright (c) 1997
williamr@2
    10
 * Moscow Center for SPARC Technology
williamr@2
    11
 *
williamr@2
    12
 * Copyright (c) 1999 
williamr@2
    13
 * Boris Fomitchev
williamr@2
    14
 *
williamr@2
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    16
 * or implied. Any use is at your own risk.
williamr@2
    17
 *
williamr@2
    18
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@2
    19
 * without fee, provided the above notices are retained on all copies.
williamr@2
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    21
 * provided the above notices are retained, and a notice that the code was
williamr@2
    22
 * modified is included with the above copyright notice.
williamr@2
    23
 *
williamr@2
    24
 */
williamr@2
    25
williamr@2
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@2
    27
 *   You should not attempt to use it directly.
williamr@2
    28
 */
williamr@2
    29
williamr@2
    30
#ifndef _STLP_INTERNAL_ALGO_H
williamr@2
    31
#define _STLP_INTERNAL_ALGO_H
williamr@2
    32
williamr@2
    33
# ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@2
    34
#  include <stl/_algobase.h>
williamr@2
    35
# endif
williamr@2
    36
williamr@2
    37
# ifndef _STLP_INTERNAL_TEMPBUF_H
williamr@2
    38
#  include <stl/_tempbuf.h>
williamr@2
    39
# endif
williamr@2
    40
williamr@2
    41
# ifndef _STLP_INTERNAL_HEAP_H
williamr@2
    42
#  include <stl/_heap.h>
williamr@2
    43
# endif
williamr@2
    44
williamr@2
    45
# ifndef _STLP_INTERNAL_ITERATOR_H
williamr@2
    46
#  include <stl/_iterator.h>
williamr@2
    47
# endif
williamr@2
    48
williamr@2
    49
# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
williamr@2
    50
#  include <stl/_function_base.h>
williamr@2
    51
# endif
williamr@2
    52
williamr@2
    53
# ifdef __SUNPRO_CC
williamr@2
    54
// remove() conflict
williamr@2
    55
#  include <cstdio>
williamr@2
    56
# endif
williamr@2
    57
williamr@2
    58
_STLP_BEGIN_NAMESPACE
williamr@2
    59
williamr@2
    60
// for_each.  Apply a function to every element of a range.
williamr@2
    61
template <class _InputIter, class _Function>
williamr@2
    62
_STLP_INLINE_LOOP _Function 
williamr@2
    63
for_each(_InputIter __first, _InputIter __last, _Function __f) {
williamr@2
    64
  for ( ; __first != __last; ++__first)
williamr@2
    65
    __f(*__first);
williamr@2
    66
  return __f;
williamr@2
    67
}
williamr@2
    68
williamr@2
    69
// count_if
williamr@2
    70
template <class _InputIter, class _Predicate>
williamr@2
    71
_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
williamr@2
    72
count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
williamr@2
    73
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
    74
_STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
williamr@2
    75
  for ( ; __first != __last; ++__first)
williamr@2
    76
    if (__pred(*__first))
williamr@2
    77
      ++__n;
williamr@2
    78
  return __n;
williamr@2
    79
}
williamr@2
    80
williamr@2
    81
// adjacent_find.
williamr@2
    82
williamr@2
    83
template <class _ForwardIter, class _BinaryPredicate>
williamr@2
    84
_STLP_INLINE_LOOP _ForwardIter 
williamr@2
    85
adjacent_find(_ForwardIter __first, _ForwardIter __last,
williamr@2
    86
              _BinaryPredicate __binary_pred) {
williamr@2
    87
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
    88
  if (__first == __last)
williamr@2
    89
    return __last;
williamr@2
    90
  _ForwardIter __next = __first;
williamr@2
    91
  while(++__next != __last) {
williamr@2
    92
    if (__binary_pred(*__first, *__next))
williamr@2
    93
      return __first;
williamr@2
    94
    __first = __next;
williamr@2
    95
  }
williamr@2
    96
  return __last;
williamr@2
    97
}
williamr@2
    98
williamr@2
    99
template <class _ForwardIter>
williamr@2
   100
_STLP_INLINE_LOOP _ForwardIter 
williamr@2
   101
adjacent_find(_ForwardIter __first, _ForwardIter __last) {
williamr@2
   102
  return adjacent_find(__first, __last,
williamr@2
   103
		       __equal_to(_STLP_VALUE_TYPE(__first, _ForwardIter)));
williamr@2
   104
}
williamr@2
   105
williamr@2
   106
# ifndef _STLP_NO_ANACHRONISMS
williamr@2
   107
template <class _InputIter, class _Tp, class _Size>
williamr@2
   108
_STLP_INLINE_LOOP void 
williamr@2
   109
count(_InputIter __first, _InputIter __last, const _Tp& __val, _Size& __n) {
williamr@2
   110
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   111
    for ( ; __first != __last; ++__first)
williamr@2
   112
      if (*__first == __val)
williamr@2
   113
        ++__n;
williamr@2
   114
}
williamr@2
   115
williamr@2
   116
template <class _InputIter, class _Predicate, class _Size>
williamr@2
   117
_STLP_INLINE_LOOP void 
williamr@2
   118
count_if(_InputIter __first, _InputIter __last, _Predicate __pred, _Size& __n) {
williamr@2
   119
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   120
  for ( ; __first != __last; ++__first)
williamr@2
   121
    if (__pred(*__first))
williamr@2
   122
      ++__n;
williamr@2
   123
}
williamr@2
   124
# endif
williamr@2
   125
williamr@2
   126
template <class _ForwardIter1, class _ForwardIter2>
williamr@2
   127
_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
williamr@2
   128
                     _ForwardIter2 __first2, _ForwardIter2 __last2);
williamr@2
   129
williamr@2
   130
// search_n.  Search for __count consecutive copies of __val.
williamr@2
   131
template <class _ForwardIter, class _Integer, class _Tp>
williamr@2
   132
_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
williamr@2
   133
                      _Integer __count, const _Tp& __val);
williamr@2
   134
template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
williamr@2
   135
_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
williamr@2
   136
                      _Integer __count, const _Tp& __val, _BinaryPred __binary_pred);
williamr@2
   137
williamr@2
   138
template <class _InputIter, class _ForwardIter>
williamr@2
   139
inline _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
williamr@2
   140
                                _ForwardIter __first2, _ForwardIter __last2) {
williamr@2
   141
  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
williamr@2
   142
  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
williamr@2
   143
  return __find_first_of(__first1, __last1, __first2, __last2,__equal_to(_STLP_VALUE_TYPE(__first1, _InputIter)));
williamr@2
   144
}
williamr@2
   145
williamr@2
   146
template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
williamr@2
   147
inline _InputIter 
williamr@2
   148
find_first_of(_InputIter __first1, _InputIter __last1,
williamr@2
   149
              _ForwardIter __first2, _ForwardIter __last2,_BinaryPredicate __comp) {
williamr@2
   150
  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
williamr@2
   151
  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
williamr@2
   152
  return __find_first_of(__first1, __last1, __first2, __last2,__comp);
williamr@2
   153
}
williamr@2
   154
williamr@2
   155
template <class _ForwardIter1, class _ForwardIter2>
williamr@2
   156
_ForwardIter1 
williamr@2
   157
find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
williamr@2
   158
         _ForwardIter2 __first2, _ForwardIter2 __last2);
williamr@2
   159
williamr@2
   160
// swap_ranges
williamr@2
   161
template <class _ForwardIter1, class _ForwardIter2>
williamr@2
   162
_STLP_INLINE_LOOP _ForwardIter2 
williamr@2
   163
swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1, _ForwardIter2 __first2) {
williamr@2
   164
  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
williamr@2
   165
  for ( ; __first1 != __last1; ++__first1, ++__first2)
williamr@2
   166
    iter_swap(__first1, __first2);
williamr@2
   167
  return __first2;
williamr@2
   168
}
williamr@2
   169
williamr@2
   170
// transform
williamr@2
   171
template <class _InputIter, class _OutputIter, class _UnaryOperation>
williamr@2
   172
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   173
transform(_InputIter __first, _InputIter __last, _OutputIter __result, _UnaryOperation __opr) {
williamr@2
   174
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   175
  for ( ; __first != __last; ++__first, ++__result)
williamr@2
   176
    *__result = __opr(*__first);
williamr@2
   177
  return __result;
williamr@2
   178
}
williamr@2
   179
template <class _InputIter1, class _InputIter2, class _OutputIter, class _BinaryOperation>
williamr@2
   180
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   181
transform(_InputIter1 __first1, _InputIter1 __last1, 
williamr@2
   182
          _InputIter2 __first2, _OutputIter __result,_BinaryOperation __binary_op) {
williamr@2
   183
  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
williamr@2
   184
  for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
williamr@2
   185
    *__result = __binary_op(*__first1, *__first2);
williamr@2
   186
  return __result;
williamr@2
   187
}
williamr@2
   188
williamr@2
   189
// replace_if, replace_copy, replace_copy_if
williamr@2
   190
williamr@2
   191
template <class _ForwardIter, class _Predicate, class _Tp>
williamr@2
   192
_STLP_INLINE_LOOP void 
williamr@2
   193
replace_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred, const _Tp& __new_value) {
williamr@2
   194
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   195
  for ( ; __first != __last; ++__first)
williamr@2
   196
    if (__pred(*__first))
williamr@2
   197
      *__first = __new_value;
williamr@2
   198
}
williamr@2
   199
williamr@2
   200
template <class _InputIter, class _OutputIter, class _Tp>
williamr@2
   201
_STLP_INLINE_LOOP  _OutputIter 
williamr@2
   202
replace_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
williamr@2
   203
             const _Tp& __old_value, const _Tp& __new_value) {
williamr@2
   204
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   205
  for ( ; __first != __last; ++__first, ++__result)
williamr@2
   206
    *__result = *__first == __old_value ? __new_value : *__first;
williamr@2
   207
  return __result;
williamr@2
   208
}
williamr@2
   209
williamr@2
   210
template <class _Iterator, class _OutputIter, class _Predicate, class _Tp>
williamr@2
   211
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   212
replace_copy_if(_Iterator __first, _Iterator __last,
williamr@2
   213
                _OutputIter __result,
williamr@2
   214
                _Predicate __pred, const _Tp& __new_value) {
williamr@2
   215
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   216
  for ( ; __first != __last; ++__first, ++__result)
williamr@2
   217
    *__result = __pred(*__first) ? __new_value : *__first;
williamr@2
   218
  return __result;
williamr@2
   219
}
williamr@2
   220
williamr@2
   221
// generate and generate_n
williamr@2
   222
williamr@2
   223
template <class _ForwardIter, class _Generator>
williamr@2
   224
_STLP_INLINE_LOOP void 
williamr@2
   225
generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
williamr@2
   226
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   227
  for ( ; __first != __last; ++__first)
williamr@2
   228
    *__first = __gen();
williamr@2
   229
}
williamr@2
   230
williamr@2
   231
template <class _OutputIter, class _Size, class _Generator>
williamr@2
   232
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   233
generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
williamr@2
   234
  for ( ; __n > 0; --__n, ++__first)
williamr@2
   235
    *__first = __gen();
williamr@2
   236
  return __first;
williamr@2
   237
}
williamr@2
   238
williamr@2
   239
// remove, remove_if, remove_copy, remove_copy_if
williamr@2
   240
williamr@2
   241
template <class _InputIter, class _OutputIter, class _Tp>
williamr@2
   242
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   243
remove_copy(_InputIter __first, _InputIter __last,_OutputIter __result, const _Tp& __val) {
williamr@2
   244
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   245
  for ( ; __first != __last; ++__first)
williamr@2
   246
    if (!(*__first == __val)) {
williamr@2
   247
      *__result = *__first;
williamr@2
   248
      ++__result;
williamr@2
   249
    }
williamr@2
   250
  return __result;
williamr@2
   251
}
williamr@2
   252
williamr@2
   253
template <class _InputIter, class _OutputIter, class _Predicate>
williamr@2
   254
_STLP_INLINE_LOOP _OutputIter 
williamr@2
   255
remove_copy_if(_InputIter __first, _InputIter __last, _OutputIter __result, _Predicate __pred) {
williamr@2
   256
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   257
  for ( ; __first != __last; ++__first)
williamr@2
   258
    if (!__pred(*__first)) {
williamr@2
   259
      *__result = *__first;
williamr@2
   260
      ++__result;
williamr@2
   261
    }
williamr@2
   262
  return __result;
williamr@2
   263
}
williamr@2
   264
williamr@2
   265
template <class _ForwardIter, class _Tp>
williamr@2
   266
_STLP_INLINE_LOOP _ForwardIter 
williamr@2
   267
remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
williamr@2
   268
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   269
  __first = find(__first, __last, __val);
williamr@2
   270
  if (__first == __last)
williamr@2
   271
    return __first;
williamr@2
   272
  else { 
williamr@2
   273
    _ForwardIter __next = __first;
williamr@2
   274
    return remove_copy(++__next, __last, __first, __val);
williamr@2
   275
  }
williamr@2
   276
}
williamr@2
   277
williamr@2
   278
template <class _ForwardIter, class _Predicate>
williamr@2
   279
_STLP_INLINE_LOOP _ForwardIter 
williamr@2
   280
remove_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
williamr@2
   281
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   282
  __first = find_if(__first, __last, __pred);
williamr@2
   283
  if ( __first == __last )
williamr@2
   284
    return __first;
williamr@2
   285
  else {
williamr@2
   286
    _ForwardIter __next = __first;
williamr@2
   287
    return remove_copy_if(++__next, __last, __first, __pred);
williamr@2
   288
  }
williamr@2
   289
}
williamr@2
   290
williamr@2
   291
// unique and unique_copy
williamr@2
   292
template <class _InputIter, class _OutputIter>
williamr@2
   293
_OutputIter unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result);
williamr@2
   294
williamr@2
   295
template <class _InputIter, class _OutputIter, class _BinaryPredicate>
williamr@2
   296
_OutputIter unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
williamr@2
   297
                        _BinaryPredicate __binary_pred);
williamr@2
   298
williamr@2
   299
template <class _ForwardIter>
williamr@2
   300
inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
williamr@2
   301
  __first = adjacent_find(__first, __last);
williamr@2
   302
  return unique_copy(__first, __last, __first);
williamr@2
   303
}
williamr@2
   304
williamr@2
   305
template <class _ForwardIter, class _BinaryPredicate>
williamr@2
   306
inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
williamr@2
   307
                    _BinaryPredicate __binary_pred) {
williamr@2
   308
  __first = adjacent_find(__first, __last, __binary_pred);
williamr@2
   309
  return unique_copy(__first, __last, __first, __binary_pred);
williamr@2
   310
}
williamr@2
   311
williamr@2
   312
// reverse and reverse_copy, and their auxiliary functions
williamr@2
   313
williamr@2
   314
template <class _BidirectionalIter>
williamr@2
   315
_STLP_INLINE_LOOP void 
williamr@2
   316
__reverse(_BidirectionalIter __first, _BidirectionalIter __last, const bidirectional_iterator_tag &) {
williamr@2
   317
  for(; __first != __last && __first != --__last; ++__first)
williamr@2
   318
    iter_swap(__first,__last);
williamr@2
   319
}
williamr@2
   320
williamr@2
   321
williamr@2
   322
template <class _RandomAccessIter>
williamr@2
   323
_STLP_INLINE_LOOP void 
williamr@2
   324
__reverse(_RandomAccessIter __first, _RandomAccessIter __last, const random_access_iterator_tag &) {
williamr@2
   325
  for (; __first < __last; ++__first) iter_swap(__first, --__last);
williamr@2
   326
}
williamr@2
   327
williamr@2
   328
template <class _BidirectionalIter>
williamr@2
   329
inline void 
williamr@2
   330
reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
williamr@2
   331
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   332
  __reverse(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _BidirectionalIter));
williamr@2
   333
}
williamr@2
   334
williamr@2
   335
template <class _BidirectionalIter, class _OutputIter>
williamr@2
   336
_STLP_INLINE_LOOP
williamr@2
   337
_OutputIter reverse_copy(_BidirectionalIter __first,
williamr@2
   338
                            _BidirectionalIter __last,
williamr@2
   339
                            _OutputIter __result) {
williamr@2
   340
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   341
  while (__first != __last) {
williamr@2
   342
    --__last;
williamr@2
   343
    *__result = *__last;
williamr@2
   344
    ++__result;
williamr@2
   345
  }
williamr@2
   346
  return __result;
williamr@2
   347
}
williamr@2
   348
williamr@2
   349
// rotate and rotate_copy, and their auxiliary functions
williamr@2
   350
williamr@2
   351
template <class _EuclideanRingElement>
williamr@2
   352
_STLP_INLINE_LOOP
williamr@2
   353
_EuclideanRingElement __gcd(_EuclideanRingElement __m,
williamr@2
   354
                            _EuclideanRingElement __n)
williamr@2
   355
{
williamr@2
   356
  while (__n != 0) {
williamr@2
   357
    _EuclideanRingElement __t = __m % __n;
williamr@2
   358
    __m = __n;
williamr@2
   359
    __n = __t;
williamr@2
   360
  }
williamr@2
   361
  return __m;
williamr@2
   362
}
williamr@2
   363
williamr@2
   364
template <class _ForwardIter>
williamr@2
   365
_ForwardIter 
williamr@2
   366
rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last);
williamr@2
   367
williamr@2
   368
template <class _ForwardIter, class _OutputIter>
williamr@2
   369
inline _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
williamr@2
   370
                               _ForwardIter __last, _OutputIter __result) {
williamr@2
   371
  return copy(__first, __middle, copy(__middle, __last, __result));
williamr@2
   372
}
williamr@2
   373
williamr@2
   374
// random_shuffle
williamr@2
   375
williamr@2
   376
template <class _RandomAccessIter>
williamr@2
   377
void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last);
williamr@2
   378
williamr@2
   379
template <class _RandomAccessIter, class _RandomNumberGenerator>
williamr@2
   380
void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
williamr@2
   381
                    _RandomNumberGenerator& __rand);
williamr@2
   382
williamr@2
   383
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   384
// random_sample and random_sample_n (extensions, not part of the standard).
williamr@2
   385
williamr@2
   386
template <class _ForwardIter, class _OutputIter, class _Distance>
williamr@2
   387
_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
williamr@2
   388
                            _OutputIter __stl_out, const _Distance __n);
williamr@2
   389
williamr@2
   390
template <class _ForwardIter, class _OutputIter, class _Distance,
williamr@2
   391
          class _RandomNumberGenerator>
williamr@2
   392
_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
williamr@2
   393
                            _OutputIter __stl_out, const _Distance __n,
williamr@2
   394
                            _RandomNumberGenerator& __rand);
williamr@2
   395
williamr@2
   396
template <class _InputIter, class _RandomAccessIter>
williamr@2
   397
_RandomAccessIter
williamr@2
   398
random_sample(_InputIter __first, _InputIter __last,
williamr@2
   399
              _RandomAccessIter __out_first, _RandomAccessIter __out_last);
williamr@2
   400
williamr@2
   401
template <class _InputIter, class _RandomAccessIter, 
williamr@2
   402
          class _RandomNumberGenerator>
williamr@2
   403
_RandomAccessIter
williamr@2
   404
random_sample(_InputIter __first, _InputIter __last,
williamr@2
   405
              _RandomAccessIter __out_first, _RandomAccessIter __out_last,
williamr@2
   406
              _RandomNumberGenerator& __rand);
williamr@2
   407
williamr@2
   408
# endif /* _STLP_NO_EXTENSIONS */
williamr@2
   409
williamr@2
   410
// partition, stable_partition, and their auxiliary functions
williamr@2
   411
williamr@2
   412
template <class _ForwardIter, class _Predicate>
williamr@2
   413
_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate   __pred);
williamr@2
   414
williamr@2
   415
williamr@2
   416
template <class _ForwardIter, class _Predicate>
williamr@2
   417
_ForwardIter 
williamr@2
   418
stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred);
williamr@2
   419
williamr@2
   420
// sort() and its auxiliary functions. 
williamr@2
   421
williamr@2
   422
template <class _Size>
williamr@2
   423
inline _Size __lg(_Size __n) {
williamr@2
   424
  _Size __k;
williamr@2
   425
  for (__k = 0; __n != 1; __n >>= 1) ++__k;
williamr@2
   426
  return __k;
williamr@2
   427
}
williamr@2
   428
williamr@2
   429
template <class _RandomAccessIter>
williamr@2
   430
void sort(_RandomAccessIter __first, _RandomAccessIter __last);
williamr@2
   431
template <class _RandomAccessIter, class _Compare>
williamr@2
   432
void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp);
williamr@2
   433
williamr@2
   434
// stable_sort() and its auxiliary functions.
williamr@2
   435
template <class _RandomAccessIter>
williamr@2
   436
void stable_sort(_RandomAccessIter __first,
williamr@2
   437
		 _RandomAccessIter __last);
williamr@2
   438
williamr@2
   439
template <class _RandomAccessIter, class _Compare>
williamr@2
   440
void stable_sort(_RandomAccessIter __first,
williamr@2
   441
		 _RandomAccessIter __last, _Compare __comp);
williamr@2
   442
williamr@2
   443
// partial_sort, partial_sort_copy, and auxiliary functions.
williamr@2
   444
williamr@2
   445
template <class _RandomAccessIter>
williamr@2
   446
void 
williamr@2
   447
partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last);
williamr@2
   448
williamr@2
   449
template <class _RandomAccessIter, class _Compare>
williamr@2
   450
void 
williamr@2
   451
partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, 
williamr@2
   452
             _RandomAccessIter __last, _Compare __comp);
williamr@2
   453
williamr@2
   454
template <class _InputIter, class _RandomAccessIter>
williamr@2
   455
_RandomAccessIter
williamr@2
   456
partial_sort_copy(_InputIter __first, _InputIter __last,
williamr@2
   457
                  _RandomAccessIter __result_first, _RandomAccessIter __result_last);
williamr@2
   458
williamr@2
   459
template <class _InputIter, class _RandomAccessIter, class _Compare>
williamr@2
   460
_RandomAccessIter
williamr@2
   461
partial_sort_copy(_InputIter __first, _InputIter __last,
williamr@2
   462
                  _RandomAccessIter __result_first,
williamr@2
   463
                  _RandomAccessIter __result_last, _Compare __comp);
williamr@2
   464
williamr@2
   465
// nth_element() and its auxiliary functions.  
williamr@2
   466
williamr@2
   467
template <class _RandomAccessIter>
williamr@2
   468
void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
williamr@2
   469
                 _RandomAccessIter __last);
williamr@2
   470
williamr@2
   471
template <class _RandomAccessIter, class _Compare>
williamr@2
   472
void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
williamr@2
   473
                 _RandomAccessIter __last, _Compare __comp);
williamr@2
   474
williamr@2
   475
// auxiliary class for lower_bound, etc.
williamr@2
   476
template <class _T1, class _T2>
williamr@2
   477
struct __less_2 {
williamr@2
   478
  bool operator() (const _T1& __x, const _T2 __y) const { return __x < __y ; } 
williamr@2
   479
};
williamr@2
   480
williamr@2
   481
template <class _T1, class _T2>
williamr@2
   482
__less_2<_T1,_T2> __less2(_T1*, _T2* ) { return __less_2<_T1, _T2>(); }
williamr@2
   483
williamr@2
   484
#ifdef _STLP_FUNCTION_PARTIAL_ORDER
williamr@2
   485
template <class _Tp>
williamr@2
   486
less<_Tp> __less2(_Tp*, _Tp* ) { return less<_Tp>(); }
williamr@2
   487
#endif
williamr@2
   488
williamr@2
   489
// Binary search (lower_bound, upper_bound, equal_range, binary_search).
williamr@2
   490
williamr@2
   491
template <class _ForwardIter, class _Tp>
williamr@2
   492
inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
williamr@2
   493
                                   const _Tp& __val) {
williamr@2
   494
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   495
    return __lower_bound(__first, __last, __val, 
williamr@2
   496
			 __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
williamr@2
   497
			 _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   498
}
williamr@2
   499
williamr@2
   500
template <class _ForwardIter, class _Tp, class _Compare>
williamr@2
   501
inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
williamr@2
   502
                                const _Tp& __val, _Compare __comp) {
williamr@2
   503
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   504
  return __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   505
}
williamr@2
   506
williamr@2
   507
template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
williamr@2
   508
_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
williamr@2
   509
                           const _Tp& __val, _Compare __comp, _Distance*);
williamr@2
   510
williamr@2
   511
template <class _ForwardIter, class _Tp>
williamr@2
   512
inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
williamr@2
   513
                                const _Tp& __val) {
williamr@2
   514
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   515
  return __upper_bound(__first, __last, __val, 
williamr@2
   516
		       __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
williamr@2
   517
                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   518
}
williamr@2
   519
williamr@2
   520
template <class _ForwardIter, class _Tp, class _Compare>
williamr@2
   521
inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
williamr@2
   522
                                const _Tp& __val, _Compare __comp) {
williamr@2
   523
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   524
  return __upper_bound(__first, __last, __val, __comp,
williamr@2
   525
                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   526
}
williamr@2
   527
williamr@2
   528
template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
williamr@2
   529
pair<_ForwardIter, _ForwardIter>
williamr@2
   530
__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
williamr@2
   531
              _Compare __comp, _Distance*);
williamr@2
   532
williamr@2
   533
template <class _ForwardIter, class _Tp>
williamr@2
   534
inline pair<_ForwardIter, _ForwardIter>
williamr@2
   535
equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
williamr@2
   536
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   537
  return __equal_range(__first, __last, __val,  
williamr@2
   538
		       __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
williamr@2
   539
                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   540
}
williamr@2
   541
williamr@2
   542
template <class _ForwardIter, class _Tp, class _Compare>
williamr@2
   543
inline pair<_ForwardIter, _ForwardIter>
williamr@2
   544
equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
williamr@2
   545
            _Compare __comp) {
williamr@2
   546
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   547
  return __equal_range(__first, __last, __val, __comp,
williamr@2
   548
                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   549
} 
williamr@2
   550
williamr@2
   551
template <class _ForwardIter, class _Tp>
williamr@2
   552
inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
williamr@2
   553
                   const _Tp& __val) {
williamr@2
   554
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   555
  _ForwardIter __i = __lower_bound(__first, __last, __val, 
williamr@2
   556
                                   __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
williamr@2
   557
                                   _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   558
  return __i != __last && !(__val < *__i);
williamr@2
   559
}
williamr@2
   560
williamr@2
   561
template <class _ForwardIter, class _Tp, class _Compare>
williamr@2
   562
inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
williamr@2
   563
                   const _Tp& __val,
williamr@2
   564
                   _Compare __comp) {
williamr@2
   565
  _STLP_DEBUG_CHECK(__check_range(__first, __last))
williamr@2
   566
  _ForwardIter __i = __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
williamr@2
   567
  return __i != __last && !__comp(__val, *__i);
williamr@2
   568
}
williamr@2
   569
williamr@2
   570
// merge, with and without an explicitly supplied comparison function.
williamr@2
   571
williamr@2
   572
template <class _InputIter1, class _InputIter2, class _OutputIter>
williamr@2
   573
_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   574
                  _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   575
                  _OutputIter __result);
williamr@2
   576
 
williamr@2
   577
template <class _InputIter1, class _InputIter2, class _OutputIter,
williamr@2
   578
          class _Compare>
williamr@2
   579
_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   580
                  _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   581
                  _OutputIter __result, _Compare __comp);
williamr@2
   582
williamr@2
   583
williamr@2
   584
// inplace_merge and its auxiliary functions. 
williamr@2
   585
williamr@2
   586
williamr@2
   587
template <class _BidirectionalIter>
williamr@2
   588
void inplace_merge(_BidirectionalIter __first,
williamr@2
   589
		   _BidirectionalIter __middle,
williamr@2
   590
		   _BidirectionalIter __last) ;
williamr@2
   591
williamr@2
   592
template <class _BidirectionalIter, class _Compare>
williamr@2
   593
void inplace_merge(_BidirectionalIter __first,
williamr@2
   594
		   _BidirectionalIter __middle,
williamr@2
   595
		   _BidirectionalIter __last, _Compare __comp);
williamr@2
   596
williamr@2
   597
// Set algorithms: includes, set_union, set_intersection, set_difference,
williamr@2
   598
// set_symmetric_difference.  All of these algorithms have the precondition
williamr@2
   599
// that their input ranges are sorted and the postcondition that their output
williamr@2
   600
// ranges are sorted.
williamr@2
   601
williamr@2
   602
template <class _InputIter1, class _InputIter2>
williamr@2
   603
bool includes(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   604
              _InputIter2 __first2, _InputIter2 __last2);
williamr@2
   605
williamr@2
   606
template <class _InputIter1, class _InputIter2, class _Compare>
williamr@2
   607
bool includes(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   608
              _InputIter2 __first2, _InputIter2 __last2, _Compare __comp);
williamr@2
   609
 
williamr@2
   610
template <class _InputIter1, class _InputIter2, class _OutputIter>
williamr@2
   611
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   612
                      _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   613
                      _OutputIter __result);
williamr@2
   614
williamr@2
   615
template <class _InputIter1, class _InputIter2, class _OutputIter,
williamr@2
   616
          class _Compare>
williamr@2
   617
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   618
                      _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   619
                      _OutputIter __result, _Compare __comp);
williamr@2
   620
williamr@2
   621
template <class _InputIter1, class _InputIter2, class _OutputIter>
williamr@2
   622
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   623
                             _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   624
                             _OutputIter __result);
williamr@2
   625
williamr@2
   626
template <class _InputIter1, class _InputIter2, class _OutputIter,
williamr@2
   627
          class _Compare>
williamr@2
   628
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   629
                             _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   630
                             _OutputIter __result, _Compare __comp);
williamr@2
   631
williamr@2
   632
williamr@2
   633
williamr@2
   634
template <class _InputIter1, class _InputIter2, class _OutputIter>
williamr@2
   635
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   636
                           _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   637
                           _OutputIter __result);
williamr@2
   638
williamr@2
   639
template <class _InputIter1, class _InputIter2, class _OutputIter, 
williamr@2
   640
          class _Compare>
williamr@2
   641
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   642
                           _InputIter2 __first2, _InputIter2 __last2, 
williamr@2
   643
                           _OutputIter __result, _Compare __comp);
williamr@2
   644
williamr@2
   645
template <class _InputIter1, class _InputIter2, class _OutputIter>
williamr@2
   646
_OutputIter 
williamr@2
   647
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   648
                         _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   649
                         _OutputIter __result);
williamr@2
   650
williamr@2
   651
williamr@2
   652
template <class _InputIter1, class _InputIter2, class _OutputIter,
williamr@2
   653
          class _Compare>
williamr@2
   654
_OutputIter 
williamr@2
   655
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
williamr@2
   656
                         _InputIter2 __first2, _InputIter2 __last2,
williamr@2
   657
                         _OutputIter __result,
williamr@2
   658
                         _Compare __comp);
williamr@2
   659
williamr@2
   660
williamr@2
   661
// min_element and max_element, with and without an explicitly supplied
williamr@2
   662
// comparison function.
williamr@2
   663
williamr@2
   664
template <class _ForwardIter>
williamr@2
   665
_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last);
williamr@2
   666
template <class _ForwardIter, class _Compare>
williamr@2
   667
_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
williamr@2
   668
                            _Compare __comp);
williamr@2
   669
williamr@2
   670
template <class _ForwardIter>
williamr@2
   671
_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last);
williamr@2
   672
williamr@2
   673
template <class _ForwardIter, class _Compare>
williamr@2
   674
_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
williamr@2
   675
                            _Compare __comp);
williamr@2
   676
williamr@2
   677
// next_permutation and prev_permutation, with and without an explicitly 
williamr@2
   678
// supplied comparison function.
williamr@2
   679
williamr@2
   680
template <class _BidirectionalIter>
williamr@2
   681
bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
williamr@2
   682
williamr@2
   683
template <class _BidirectionalIter, class _Compare>
williamr@2
   684
bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
williamr@2
   685
                      _Compare __comp);
williamr@2
   686
williamr@2
   687
williamr@2
   688
template <class _BidirectionalIter>
williamr@2
   689
bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
williamr@2
   690
williamr@2
   691
williamr@2
   692
template <class _BidirectionalIter, class _Compare>
williamr@2
   693
bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
williamr@2
   694
                      _Compare __comp);
williamr@2
   695
williamr@2
   696
# ifndef _STLP_NO_EXTENSIONS
williamr@2
   697
williamr@2
   698
// is_heap, a predicate testing whether or not a range is
williamr@2
   699
// a heap.  This function is an extension, not part of the C++
williamr@2
   700
// standard.
williamr@2
   701
williamr@2
   702
template <class _RandomAccessIter>
williamr@2
   703
bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last);
williamr@2
   704
williamr@2
   705
template <class _RandomAccessIter, class _StrictWeakOrdering>
williamr@2
   706
bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
williamr@2
   707
	     _StrictWeakOrdering __comp);
williamr@2
   708
williamr@2
   709
williamr@2
   710
// is_sorted, a predicated testing whether a range is sorted in
williamr@2
   711
// nondescending order.  This is an extension, not part of the C++
williamr@2
   712
// standard.
williamr@2
   713
template <class _ForwardIter, class _StrictWeakOrdering>
williamr@2
   714
bool __is_sorted(_ForwardIter __first, _ForwardIter __last,
williamr@2
   715
                 _StrictWeakOrdering __comp);
williamr@2
   716
williamr@2
   717
template <class _ForwardIter>
williamr@2
   718
inline bool is_sorted(_ForwardIter __first, _ForwardIter __last) {
williamr@2
   719
  return __is_sorted(__first, __last, __less(_STLP_VALUE_TYPE(__first, _ForwardIter)));
williamr@2
   720
}
williamr@2
   721
williamr@2
   722
template <class _ForwardIter, class _StrictWeakOrdering>
williamr@2
   723
inline bool is_sorted(_ForwardIter __first, _ForwardIter __last,
williamr@2
   724
                      _StrictWeakOrdering __comp) {
williamr@2
   725
  return __is_sorted(__first, __last, __comp);
williamr@2
   726
}
williamr@2
   727
# endif
williamr@2
   728
williamr@2
   729
_STLP_END_NAMESPACE
williamr@2
   730
williamr@2
   731
# if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@2
   732
#  include <stl/_algo.c>
williamr@2
   733
# endif
williamr@2
   734
williamr@2
   735
#endif /* _STLP_INTERNAL_ALGO_H */
williamr@2
   736
williamr@2
   737
// Local Variables:
williamr@2
   738
// mode:C++
williamr@2
   739
// End:
williamr@2
   740