epoc32/include/tools/stlport/stl/_algobase.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 *
williamr@4
     3
 * Copyright (c) 1994
williamr@4
     4
 * Hewlett-Packard Company
williamr@4
     5
 *
williamr@4
     6
 * Copyright (c) 1996,1997
williamr@4
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     8
 *
williamr@4
     9
 * Copyright (c) 1997
williamr@4
    10
 * Moscow Center for SPARC Technology
williamr@4
    11
 *
williamr@4
    12
 * Copyright (c) 1999
williamr@4
    13
 * Boris Fomitchev
williamr@4
    14
 *
williamr@4
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    16
 * or implied. Any use is at your own risk.
williamr@4
    17
 *
williamr@4
    18
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    19
 * without fee, provided the above notices are retained on all copies.
williamr@4
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    21
 * provided the above notices are retained, and a notice that the code was
williamr@4
    22
 * modified is included with the above copyright notice.
williamr@4
    23
 *
williamr@4
    24
 */
williamr@4
    25
williamr@4
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@4
    27
 *   You should not attempt to use it directly.
williamr@4
    28
 */
williamr@4
    29
williamr@4
    30
#ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@4
    31
#define _STLP_INTERNAL_ALGOBASE_H
williamr@4
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_CSTDDEF
williamr@4
    34
#  include <stl/_cstddef.h>
williamr@4
    35
#endif
williamr@4
    36
williamr@4
    37
#ifndef _STLP_INTERNAL_CSTRING
williamr@4
    38
#  include <stl/_cstring.h>
williamr@4
    39
#endif
williamr@4
    40
williamr@4
    41
#ifndef _STLP_CLIMITS
williamr@4
    42
#  include <climits>
williamr@4
    43
#endif
williamr@4
    44
williamr@4
    45
#ifndef _STLP_INTERNAL_CSTDLIB
williamr@4
    46
#  include <stl/_cstdlib.h>
williamr@4
    47
#endif
williamr@4
    48
williamr@4
    49
#ifndef _STLP_INTERNAL_PAIR_H
williamr@4
    50
#  include <stl/_pair.h>
williamr@4
    51
#endif
williamr@4
    52
williamr@4
    53
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
williamr@4
    54
#  include <stl/_iterator_base.h>
williamr@4
    55
#endif
williamr@4
    56
williamr@4
    57
#ifndef _STLP_TYPE_TRAITS_H
williamr@4
    58
#  include <stl/type_traits.h>
williamr@4
    59
#endif
williamr@4
    60
williamr@4
    61
_STLP_BEGIN_NAMESPACE
williamr@4
    62
williamr@4
    63
#if defined(_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined(_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
    64
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    65
template <class _Tp>
williamr@4
    66
inline void __swap_aux(_Tp& __a, _Tp& __b, const __true_type& /*SwapImplemented*/) {
williamr@4
    67
  __a.swap(__b);
williamr@4
    68
}
williamr@4
    69
williamr@4
    70
template <class _Tp>
williamr@4
    71
inline void __swap_aux(_Tp& __a, _Tp& __b, const __false_type& /*SwapImplemented*/) {
williamr@4
    72
  _Tp __tmp = __a;
williamr@4
    73
  __a = __b;
williamr@4
    74
  __b = __tmp;
williamr@4
    75
}
williamr@4
    76
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
    77
#endif /* _STLP_USE_PARTIAL_SPEC_WORKAROUND */
williamr@4
    78
williamr@4
    79
// swap and iter_swap
williamr@4
    80
template <class _Tp>
williamr@4
    81
inline void swap(_Tp& __a, _Tp& __b) {
williamr@4
    82
#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
    83
#  if !defined(__BORLANDC__)
williamr@4
    84
  typedef typename _SwapImplemented<_Tp>::_Ret _Implemented;
williamr@4
    85
#  else
williamr@4
    86
  enum { _Is = _SwapImplemented<_Tp>::_Is };
williamr@4
    87
  typedef typename __bool2type<_Is>::_Ret _Implemented;
williamr@4
    88
#  endif
williamr@4
    89
  _STLP_PRIV __swap_aux(__a, __b, _Implemented());
williamr@4
    90
#else
williamr@4
    91
  _Tp __tmp = __a;
williamr@4
    92
  __a = __b;
williamr@4
    93
  __b = __tmp;
williamr@4
    94
#endif /* _STLP_USE_PARTIAL_SPEC_WORKAROUND */
williamr@4
    95
}
williamr@4
    96
williamr@4
    97
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    98
williamr@4
    99
template <class _ForwardIter1, class _ForwardIter2, class _Value>
williamr@4
   100
inline void __iter_swap_aux_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, _Value *) {
williamr@4
   101
  _Value tmp = *__i1;
williamr@4
   102
  *__i1 = *__i2;
williamr@4
   103
  *__i2 = tmp;
williamr@4
   104
}
williamr@4
   105
williamr@4
   106
template <class _ForwardIter1, class _ForwardIter2>
williamr@4
   107
inline void __iter_swap_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, const __true_type& /*OKToSwap*/) {
williamr@4
   108
  swap(*__i1, *__i2);
williamr@4
   109
}
williamr@4
   110
williamr@4
   111
template <class _ForwardIter1, class _ForwardIter2>
williamr@4
   112
inline void __iter_swap_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, const __false_type& /*OKToSwap*/) {
williamr@4
   113
  __iter_swap_aux_aux( __i1, __i2, _STLP_VALUE_TYPE(__i1,_ForwardIter1) );
williamr@4
   114
}
williamr@4
   115
williamr@4
   116
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   117
williamr@4
   118
template <class _ForwardIter1, class _ForwardIter2>
williamr@4
   119
inline void iter_swap(_ForwardIter1 __i1, _ForwardIter2 __i2) {
williamr@4
   120
  // swap(*__i1, *__i2);
williamr@4
   121
  _STLP_PRIV __iter_swap_aux( __i1, __i2, _IsOKToSwap(_STLP_VALUE_TYPE(__i1, _ForwardIter1), _STLP_VALUE_TYPE(__i2, _ForwardIter2),
williamr@4
   122
                                                      _STLP_IS_REF_TYPE_REAL_REF(__i1, _ForwardIter1),
williamr@4
   123
                                                      _STLP_IS_REF_TYPE_REAL_REF(__i2, _ForwardIter2))._Answer());
williamr@4
   124
}
williamr@4
   125
williamr@4
   126
//--------------------------------------------------
williamr@4
   127
// min and max
williamr@4
   128
williamr@4
   129
#if !defined (__BORLANDC__) || defined (_STLP_USE_OWN_NAMESPACE)
williamr@4
   130
#  if (defined (__BORLANDC__) && (__BORLANDC__ < 0x580)) && !defined (__STDC__)
williamr@4
   131
//In not ANSI mode Borland import min/max in global namespace which conflict
williamr@4
   132
//with STLport min/max when user does a 'using namespace std' in its code
williamr@4
   133
//(see test/unit/alg_test.cpp). To avoid this clash we simply import Borland min/max
williamr@4
   134
//in STLport namespace.
williamr@4
   135
using _STLP_VENDOR_STD::min;
williamr@4
   136
using _STLP_VENDOR_STD::max;
williamr@4
   137
#  else
williamr@4
   138
template <class _Tp>
williamr@4
   139
inline const _Tp& (min)(const _Tp& __a, const _Tp& __b) { return __b < __a ? __b : __a; }
williamr@4
   140
template <class _Tp>
williamr@4
   141
inline const _Tp& (max)(const _Tp& __a, const _Tp& __b) {  return  __a < __b ? __b : __a; }
williamr@4
   142
#  endif
williamr@4
   143
#endif
williamr@4
   144
williamr@4
   145
# if defined (__BORLANDC__) && defined (_STLP_USE_OWN_NAMESPACE)
williamr@4
   146
inline unsigned long (min) (unsigned long __a, unsigned long __b) { return __b < __a ? __b : __a; }
williamr@4
   147
inline unsigned long (max) (unsigned long __a, unsigned long __b) {  return  __a < __b ? __b : __a; }
williamr@4
   148
# endif
williamr@4
   149
williamr@4
   150
template <class _Tp, class _Compare>
williamr@4
   151
inline const _Tp& (min)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
williamr@4
   152
  return __comp(__b, __a) ? __b : __a;
williamr@4
   153
}
williamr@4
   154
williamr@4
   155
template <class _Tp, class _Compare>
williamr@4
   156
inline const _Tp& (max)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
williamr@4
   157
  return __comp(__a, __b) ? __b : __a;
williamr@4
   158
}
williamr@4
   159
williamr@4
   160
//--------------------------------------------------
williamr@4
   161
// copy
williamr@4
   162
williamr@4
   163
// All of these auxiliary functions serve two purposes.  (1) Replace
williamr@4
   164
// calls to copy with memmove whenever possible.  (Memmove, not memcpy,
williamr@4
   165
// because the input and output ranges are permitted to overlap.)
williamr@4
   166
// (2) If we're using random access iterators, then write the loop as
williamr@4
   167
// a for loop with an explicit count.
williamr@4
   168
williamr@4
   169
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   170
williamr@4
   171
template <class _InputIter, class _OutputIter, class _Distance>
williamr@4
   172
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
williamr@4
   173
                          _OutputIter __result, const input_iterator_tag &, _Distance*) {
williamr@4
   174
  for ( ; __first != __last; ++__result, ++__first)
williamr@4
   175
    *__result = *__first;
williamr@4
   176
  return __result;
williamr@4
   177
}
williamr@4
   178
williamr@4
   179
#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
williamr@4
   180
template <class _InputIter, class _OutputIter, class _Distance>
williamr@4
   181
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
williamr@4
   182
                          _OutputIter __result, const forward_iterator_tag &, _Distance* ) {
williamr@4
   183
  for ( ; __first != __last; ++__result, ++__first)
williamr@4
   184
    *__result = *__first;
williamr@4
   185
  return __result;
williamr@4
   186
}
williamr@4
   187
williamr@4
   188
template <class _InputIter, class _OutputIter, class _Distance>
williamr@4
   189
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
williamr@4
   190
                          _OutputIter __result, const bidirectional_iterator_tag &, _Distance* ) {
williamr@4
   191
  for ( ; __first != __last; ++__result, ++__first)
williamr@4
   192
    *__result = *__first;
williamr@4
   193
  return __result;
williamr@4
   194
}
williamr@4
   195
#endif
williamr@4
   196
williamr@4
   197
template <class _RandomAccessIter, class _OutputIter, class _Distance>
williamr@4
   198
inline _OutputIter
williamr@4
   199
__copy(_RandomAccessIter __first, _RandomAccessIter __last,
williamr@4
   200
       _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
williamr@4
   201
  for (_Distance __n = __last - __first; __n > 0; --__n) {
williamr@4
   202
    *__result = *__first;
williamr@4
   203
    ++__first;
williamr@4
   204
    ++__result;
williamr@4
   205
  }
williamr@4
   206
  return __result;
williamr@4
   207
}
williamr@4
   208
williamr@4
   209
inline void*
williamr@4
   210
__copy_trivial(const void* __first, const void* __last, void* __result) {
williamr@4
   211
  size_t __n = (const char*)__last - (const char*)__first;
williamr@4
   212
  return __n ? (void *)((char*)memmove(__result, __first, __n) + __n) : __result;
williamr@4
   213
}
williamr@4
   214
williamr@4
   215
//--------------------------------------------------
williamr@4
   216
// copy_backward auxiliary functions
williamr@4
   217
williamr@4
   218
template <class _BidirectionalIter1, class _BidirectionalIter2,
williamr@4
   219
          class _Distance>
williamr@4
   220
inline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first,
williamr@4
   221
                                           _BidirectionalIter1 __last,
williamr@4
   222
                                           _BidirectionalIter2 __result,
williamr@4
   223
                                           const bidirectional_iterator_tag &,
williamr@4
   224
                                           _Distance*) {
williamr@4
   225
  while (__first != __last)
williamr@4
   226
    *--__result = *--__last;
williamr@4
   227
  return __result;
williamr@4
   228
}
williamr@4
   229
williamr@4
   230
template <class _RandomAccessIter, class _BidirectionalIter, class _Distance>
williamr@4
   231
inline _BidirectionalIter __copy_backward(_RandomAccessIter __first,
williamr@4
   232
                                          _RandomAccessIter __last,
williamr@4
   233
                                          _BidirectionalIter __result,
williamr@4
   234
                                          const random_access_iterator_tag &,
williamr@4
   235
                                          _Distance*) {
williamr@4
   236
  for (_Distance __n = __last - __first; __n > 0; --__n)
williamr@4
   237
    *--__result = *--__last;
williamr@4
   238
  return __result;
williamr@4
   239
}
williamr@4
   240
williamr@4
   241
inline void*
williamr@4
   242
__copy_trivial_backward(const void* __first, const void* __last, void* __result) {
williamr@4
   243
  const ptrdiff_t _Num = (const char*)__last - (const char*)__first;
williamr@4
   244
  return (_Num > 0) ? memmove((char*)__result - _Num, __first, _Num) : __result ;
williamr@4
   245
}
williamr@4
   246
williamr@4
   247
template <class _InputIter, class _OutputIter>
williamr@4
   248
inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
williamr@4
   249
                               const __false_type& /*IsOKToMemCpy*/) {
williamr@4
   250
  return __copy(__first, __last, __result, random_access_iterator_tag(), (ptrdiff_t*)0);
williamr@4
   251
}
williamr@4
   252
template <class _InputIter, class _OutputIter>
williamr@4
   253
inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
williamr@4
   254
                               const __true_type& /*IsOKToMemCpy*/) {
williamr@4
   255
  // we know they all pointers, so this cast is OK
williamr@4
   256
  //  return (_OutputIter)__copy_trivial(&(*__first), &(*__last), &(*__result));
williamr@4
   257
  return (_OutputIter)__copy_trivial(__first, __last, __result);
williamr@4
   258
}
williamr@4
   259
williamr@4
   260
template <class _InputIter, class _OutputIter>
williamr@4
   261
inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
williamr@4
   262
                              const __true_type& /*BothPtrType*/) {
williamr@4
   263
  return __copy_ptrs(__first, __last, __result,
williamr@4
   264
                     _UseTrivialCopy(_STLP_VALUE_TYPE(__first, _InputIter),
williamr@4
   265
                                     _STLP_VALUE_TYPE(__result, _OutputIter))._Answer());
williamr@4
   266
}
williamr@4
   267
williamr@4
   268
template <class _InputIter, class _OutputIter>
williamr@4
   269
inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
williamr@4
   270
                              const __false_type& /*BothPtrType*/) {
williamr@4
   271
  return __copy(__first, __last, __result,
williamr@4
   272
                _STLP_ITERATOR_CATEGORY(__first, _InputIter),
williamr@4
   273
                _STLP_DISTANCE_TYPE(__first, _InputIter));
williamr@4
   274
}
williamr@4
   275
williamr@4
   276
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   277
williamr@4
   278
template <class _InputIter, class _OutputIter>
williamr@4
   279
inline _OutputIter copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
williamr@4
   280
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
williamr@4
   281
  return _STLP_PRIV __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter>::_Answer());
williamr@4
   282
}
williamr@4
   283
williamr@4
   284
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   285
williamr@4
   286
template <class _InputIter, class _OutputIter>
williamr@4
   287
inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last,
williamr@4
   288
                                        _OutputIter __result, const __false_type& /*TrivialAssignment*/) {
williamr@4
   289
  return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
williamr@4
   290
}
williamr@4
   291
template <class _InputIter, class _OutputIter>
williamr@4
   292
inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last,
williamr@4
   293
                                        _OutputIter __result, const __true_type& /*TrivialAssignment*/) {
williamr@4
   294
  return (_OutputIter)__copy_trivial_backward(__first, __last, __result);
williamr@4
   295
}
williamr@4
   296
williamr@4
   297
template <class _InputIter, class _OutputIter>
williamr@4
   298
inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
williamr@4
   299
  return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first,_InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
williamr@4
   300
}
williamr@4
   301
williamr@4
   302
template <class _InputIter, class _OutputIter>
williamr@4
   303
inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
williamr@4
   304
  return __copy_backward_ptrs(__first, __last, __result,
williamr@4
   305
                              _UseTrivialCopy(_STLP_VALUE_TYPE(__first, _InputIter),
williamr@4
   306
                                              _STLP_VALUE_TYPE(__result, _OutputIter))._Answer());
williamr@4
   307
}
williamr@4
   308
williamr@4
   309
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   310
williamr@4
   311
template <class _InputIter, class _OutputIter>
williamr@4
   312
inline _OutputIter copy_backward(_InputIter __first, _InputIter __last, _OutputIter __result) {
williamr@4
   313
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
williamr@4
   314
  return _STLP_PRIV __copy_backward_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter>::_Answer() );
williamr@4
   315
}
williamr@4
   316
williamr@4
   317
#if !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS)
williamr@4
   318
#  define _STLP_DECLARE_COPY_TRIVIAL(_Tp)                                       \
williamr@4
   319
inline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result)          \
williamr@4
   320
{ return (_Tp*)__copy_trivial(__first, __last, __result); }                     \
williamr@4
   321
inline _Tp* copy_backward(const _Tp* __first, const _Tp* __last, _Tp* __result) \
williamr@4
   322
{ return (_Tp*)__copy_trivial_backward(__first, __last, __result); }
williamr@4
   323
williamr@4
   324
_STLP_DECLARE_COPY_TRIVIAL(char)
williamr@4
   325
#  if !defined (_STLP_NO_SIGNED_BUILTINS)
williamr@4
   326
_STLP_DECLARE_COPY_TRIVIAL(signed char)
williamr@4
   327
#  endif
williamr@4
   328
_STLP_DECLARE_COPY_TRIVIAL(unsigned char)
williamr@4
   329
_STLP_DECLARE_COPY_TRIVIAL(short)
williamr@4
   330
_STLP_DECLARE_COPY_TRIVIAL(unsigned short)
williamr@4
   331
_STLP_DECLARE_COPY_TRIVIAL(int)
williamr@4
   332
_STLP_DECLARE_COPY_TRIVIAL(unsigned int)
williamr@4
   333
_STLP_DECLARE_COPY_TRIVIAL(long)
williamr@4
   334
_STLP_DECLARE_COPY_TRIVIAL(unsigned long)
williamr@4
   335
#  if !defined(_STLP_NO_WCHAR_T) && !defined (_STLP_WCHAR_T_IS_USHORT)
williamr@4
   336
_STLP_DECLARE_COPY_TRIVIAL(wchar_t)
williamr@4
   337
#  endif
williamr@4
   338
#  if defined (_STLP_LONG_LONG)
williamr@4
   339
_STLP_DECLARE_COPY_TRIVIAL(_STLP_LONG_LONG)
williamr@4
   340
_STLP_DECLARE_COPY_TRIVIAL(unsigned _STLP_LONG_LONG)
williamr@4
   341
#  endif
williamr@4
   342
_STLP_DECLARE_COPY_TRIVIAL(float)
williamr@4
   343
_STLP_DECLARE_COPY_TRIVIAL(double)
williamr@4
   344
#  if !defined (_STLP_NO_LONG_DOUBLE)
williamr@4
   345
_STLP_DECLARE_COPY_TRIVIAL(long double)
williamr@4
   346
#  endif
williamr@4
   347
#  undef _STLP_DECLARE_COPY_TRIVIAL
williamr@4
   348
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@4
   349
williamr@4
   350
//--------------------------------------------------
williamr@4
   351
// copy_n (not part of the C++ standard)
williamr@4
   352
williamr@4
   353
#if !defined (_STLP_NO_EXTENSIONS)
williamr@4
   354
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   355
williamr@4
   356
template <class _InputIter, class _Size, class _OutputIter>
williamr@4
   357
_STLP_INLINE_LOOP pair<_InputIter, _OutputIter>
williamr@4
   358
__copy_n(_InputIter __first, _Size __count,
williamr@4
   359
         _OutputIter __result,
williamr@4
   360
         const input_iterator_tag &) {
williamr@4
   361
  for ( ; __count > 0; --__count) {
williamr@4
   362
    *__result = *__first;
williamr@4
   363
    ++__first;
williamr@4
   364
    ++__result;
williamr@4
   365
  }
williamr@4
   366
  return pair<_InputIter, _OutputIter>(__first, __result);
williamr@4
   367
}
williamr@4
   368
williamr@4
   369
template <class _RAIter, class _Size, class _OutputIter>
williamr@4
   370
inline pair<_RAIter, _OutputIter>
williamr@4
   371
__copy_n(_RAIter __first, _Size __count,
williamr@4
   372
         _OutputIter __result,
williamr@4
   373
         const random_access_iterator_tag &) {
williamr@4
   374
  _RAIter __last = __first + __count;
williamr@4
   375
  return pair<_RAIter, _OutputIter>(__last, copy(__first, __last, __result));
williamr@4
   376
}
williamr@4
   377
williamr@4
   378
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   379
williamr@4
   380
template <class _InputIter, class _Size, class _OutputIter>
williamr@4
   381
inline pair<_InputIter, _OutputIter>
williamr@4
   382
copy_n(_InputIter __first, _Size __count, _OutputIter __result) {
williamr@4
   383
  _STLP_FIX_LITERAL_BUG(__first)
williamr@4
   384
  return _STLP_PRIV __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
williamr@4
   385
}
williamr@4
   386
#endif
williamr@4
   387
williamr@4
   388
//--------------------------------------------------
williamr@4
   389
// fill and fill_n
williamr@4
   390
template <class _ForwardIter, class _Tp>
williamr@4
   391
_STLP_INLINE_LOOP
williamr@4
   392
void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
williamr@4
   393
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
williamr@4
   394
  for ( ; __first != __last; ++__first)
williamr@4
   395
    *__first = __val;
williamr@4
   396
}
williamr@4
   397
williamr@4
   398
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   399
williamr@4
   400
template <class _OutputIter, class _Size, class _Tp>
williamr@4
   401
_STLP_INLINE_LOOP
williamr@4
   402
_OutputIter __fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
williamr@4
   403
  _STLP_FIX_LITERAL_BUG(__first)
williamr@4
   404
  for ( ; __n > 0; --__n, ++__first)
williamr@4
   405
    *__first = __val;
williamr@4
   406
  return __first;
williamr@4
   407
}
williamr@4
   408
williamr@4
   409
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   410
williamr@4
   411
template <class _OutputIter, class _Size, class _Tp>
williamr@4
   412
_STLP_INLINE_LOOP
williamr@4
   413
void fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
williamr@4
   414
  _STLP_FIX_LITERAL_BUG(__first)
williamr@4
   415
  _STLP_PRIV __fill_n(__first, __n, __val);
williamr@4
   416
}
williamr@4
   417
williamr@4
   418
// Specialization: for one-byte types we can use memset.
williamr@4
   419
inline void fill(unsigned char* __first, unsigned char* __last,
williamr@4
   420
                 const unsigned char& __val) {
williamr@4
   421
  unsigned char __tmp = __val;
williamr@4
   422
  memset(__first, __tmp, __last - __first);
williamr@4
   423
}
williamr@4
   424
#if !defined (_STLP_NO_SIGNED_BUILTINS)
williamr@4
   425
inline void fill(signed char* __first, signed char* __last,
williamr@4
   426
                 const signed char& __val) {
williamr@4
   427
  signed char __tmp = __val;
williamr@4
   428
  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
williamr@4
   429
}
williamr@4
   430
#endif
williamr@4
   431
inline void fill(char* __first, char* __last, const char& __val) {
williamr@4
   432
  char __tmp = __val;
williamr@4
   433
  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
williamr@4
   434
}
williamr@4
   435
williamr@4
   436
#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
   437
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   438
williamr@4
   439
template <class _Size>
williamr@4
   440
inline unsigned char* __fill_n(unsigned char* __first, _Size __n,
williamr@4
   441
                             const unsigned char& __val) {
williamr@4
   442
  fill(__first, __first + __n, __val);
williamr@4
   443
  return __first + __n;
williamr@4
   444
}
williamr@4
   445
williamr@4
   446
template <class _Size>
williamr@4
   447
inline signed char* __fill_n(char* __first, _Size __n,
williamr@4
   448
                           const signed char& __val) {
williamr@4
   449
  fill(__first, __first + __n, __val);
williamr@4
   450
  return __first + __n;
williamr@4
   451
}
williamr@4
   452
williamr@4
   453
template <class _Size>
williamr@4
   454
inline char* __fill_n(char* __first, _Size __n, const char& __val) {
williamr@4
   455
  fill(__first, __first + __n, __val);
williamr@4
   456
  return __first + __n;
williamr@4
   457
}
williamr@4
   458
williamr@4
   459
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   460
#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
williamr@4
   461
williamr@4
   462
williamr@4
   463
//--------------------------------------------------
williamr@4
   464
// equal and mismatch
williamr@4
   465
williamr@4
   466
template <class _InputIter1, class _InputIter2>
williamr@4
   467
_STLP_INLINE_LOOP
williamr@4
   468
pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
williamr@4
   469
                                        _InputIter1 __last1,
williamr@4
   470
                                        _InputIter2 __first2) {
williamr@4
   471
  _STLP_FIX_LITERAL_BUG(__first2)
williamr@4
   472
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   473
  while (__first1 != __last1 && *__first1 == *__first2) {
williamr@4
   474
    ++__first1;
williamr@4
   475
    ++__first2;
williamr@4
   476
  }
williamr@4
   477
  return pair<_InputIter1, _InputIter2>(__first1, __first2);
williamr@4
   478
}
williamr@4
   479
williamr@4
   480
template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
williamr@4
   481
_STLP_INLINE_LOOP
williamr@4
   482
pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
williamr@4
   483
                                        _InputIter1 __last1,
williamr@4
   484
                                        _InputIter2 __first2,
williamr@4
   485
                                        _BinaryPredicate __binary_pred) {
williamr@4
   486
  _STLP_FIX_LITERAL_BUG(__first2)
williamr@4
   487
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   488
  while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
williamr@4
   489
    ++__first1;
williamr@4
   490
    ++__first2;
williamr@4
   491
  }
williamr@4
   492
  return pair<_InputIter1, _InputIter2>(__first1, __first2);
williamr@4
   493
}
williamr@4
   494
williamr@4
   495
template <class _InputIter1, class _InputIter2>
williamr@4
   496
_STLP_INLINE_LOOP
williamr@4
   497
bool equal(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   498
                  _InputIter2 __first2) {
williamr@4
   499
  _STLP_FIX_LITERAL_BUG(__first1) _STLP_FIX_LITERAL_BUG(__last1)  _STLP_FIX_LITERAL_BUG(__first2)
williamr@4
   500
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   501
  for ( ; __first1 != __last1; ++__first1, ++__first2)
williamr@4
   502
    if (!(*__first1 == *__first2))
williamr@4
   503
      return false;
williamr@4
   504
  return true;
williamr@4
   505
}
williamr@4
   506
williamr@4
   507
template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
williamr@4
   508
_STLP_INLINE_LOOP
williamr@4
   509
bool equal(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   510
                  _InputIter2 __first2, _BinaryPredicate __binary_pred) {
williamr@4
   511
  _STLP_FIX_LITERAL_BUG(__first2)
williamr@4
   512
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   513
  for ( ; __first1 != __last1; ++__first1, ++__first2)
williamr@4
   514
    if (!__binary_pred(*__first1, *__first2))
williamr@4
   515
      return false;
williamr@4
   516
  return true;
williamr@4
   517
}
williamr@4
   518
williamr@4
   519
//--------------------------------------------------
williamr@4
   520
// lexicographical_compare and lexicographical_compare_3way.
williamr@4
   521
// (the latter is not part of the C++ standard.)
williamr@4
   522
williamr@4
   523
template <class _InputIter1, class _InputIter2>
williamr@4
   524
bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   525
                             _InputIter2 __first2, _InputIter2 __last2);
williamr@4
   526
williamr@4
   527
template <class _InputIter1, class _InputIter2, class _Compare>
williamr@4
   528
bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   529
                             _InputIter2 __first2, _InputIter2 __last2,
williamr@4
   530
                             _Compare __comp);
williamr@4
   531
williamr@4
   532
inline bool
williamr@4
   533
lexicographical_compare(const unsigned char* __first1,
williamr@4
   534
                        const unsigned char* __last1,
williamr@4
   535
                        const unsigned char* __first2,
williamr@4
   536
                        const unsigned char* __last2) {
williamr@4
   537
  const size_t __len1 = __last1 - __first1;
williamr@4
   538
  const size_t __len2 = __last2 - __first2;
williamr@4
   539
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   540
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))
williamr@4
   541
williamr@4
   542
  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
williamr@4
   543
  return __result != 0 ? (__result < 0) : (__len1 < __len2);
williamr@4
   544
}
williamr@4
   545
williamr@4
   546
williamr@4
   547
#if !(CHAR_MAX == SCHAR_MAX)
williamr@4
   548
inline bool lexicographical_compare(const char* __first1, const char* __last1,
williamr@4
   549
                                    const char* __first2, const char* __last2) {
williamr@4
   550
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
williamr@4
   551
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))
williamr@4
   552
williamr@4
   553
  return lexicographical_compare((const unsigned char*) __first1,
williamr@4
   554
                                 (const unsigned char*) __last1,
williamr@4
   555
                                 (const unsigned char*) __first2,
williamr@4
   556
                                 (const unsigned char*) __last2);
williamr@4
   557
}
williamr@4
   558
#endif /* CHAR_MAX == SCHAR_MAX */
williamr@4
   559
williamr@4
   560
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   561
williamr@4
   562
template <class _InputIter1, class _InputIter2>
williamr@4
   563
int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   564
                                   _InputIter2 __first2, _InputIter2 __last2);
williamr@4
   565
williamr@4
   566
inline int
williamr@4
   567
__lexicographical_compare_3way(const unsigned char* __first1,
williamr@4
   568
                               const unsigned char* __last1,
williamr@4
   569
                               const unsigned char* __first2,
williamr@4
   570
                               const unsigned char* __last2) {
williamr@4
   571
  const ptrdiff_t __len1 = __last1 - __first1;
williamr@4
   572
  const ptrdiff_t __len2 = __last2 - __first2;
williamr@4
   573
  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
williamr@4
   574
  return __result != 0 ? __result
williamr@4
   575
                       : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1));
williamr@4
   576
}
williamr@4
   577
williamr@4
   578
williamr@4
   579
#if !(CHAR_MAX == SCHAR_MAX)
williamr@4
   580
inline int
williamr@4
   581
__lexicographical_compare_3way(const char* __first1, const char* __last1,
williamr@4
   582
                               const char* __first2, const char* __last2) {
williamr@4
   583
  return __lexicographical_compare_3way((const unsigned char*) __first1,
williamr@4
   584
                                        (const unsigned char*) __last1,
williamr@4
   585
                                        (const unsigned char*) __first2,
williamr@4
   586
                                        (const unsigned char*) __last2);
williamr@4
   587
}
williamr@4
   588
#endif
williamr@4
   589
williamr@4
   590
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   591
williamr@4
   592
#if !defined (_STLP_NO_EXTENSIONS)
williamr@4
   593
template <class _InputIter1, class _InputIter2>
williamr@4
   594
int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   595
                                 _InputIter2 __first2, _InputIter2 __last2);
williamr@4
   596
williamr@4
   597
#endif /* EXTENSIONS */
williamr@4
   598
williamr@4
   599
// count
williamr@4
   600
template <class _InputIter, class _Tp>
williamr@4
   601
_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
williamr@4
   602
count(_InputIter __first, _InputIter __last, const _Tp& __val) {
williamr@4
   603
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
williamr@4
   604
  _STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
williamr@4
   605
  for ( ; __first != __last; ++__first)
williamr@4
   606
    if (*__first == __val)
williamr@4
   607
      ++__n;
williamr@4
   608
  return __n;
williamr@4
   609
}
williamr@4
   610
williamr@4
   611
// find and find_if. Note find may be expressed in terms of find_if if appropriate binder was available.
williamr@4
   612
template <class _InputIter, class _Tp>
williamr@4
   613
_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val);
williamr@4
   614
williamr@4
   615
template <class _InputIter, class _Predicate>
williamr@4
   616
_InputIter find_if(_InputIter __first, _InputIter __last, _Predicate __pred);
williamr@4
   617
williamr@4
   618
// search.
williamr@4
   619
template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
williamr@4
   620
_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
williamr@4
   621
                     _ForwardIter2 __first2, _ForwardIter2 __last2, _BinaryPred  __predicate);
williamr@4
   622
williamr@4
   623
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   624
williamr@4
   625
// find_first_of
williamr@4
   626
template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
williamr@4
   627
_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
williamr@4
   628
                           _ForwardIter __first2, _ForwardIter __last2,
williamr@4
   629
                           _BinaryPredicate __comp);
williamr@4
   630
williamr@4
   631
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   632
williamr@4
   633
template <class _ForwardIter1, class _ForwardIter2,
williamr@4
   634
          class _BinaryPredicate>
williamr@4
   635
_ForwardIter1
williamr@4
   636
find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
williamr@4
   637
         _ForwardIter2 __first2, _ForwardIter2 __last2,
williamr@4
   638
         _BinaryPredicate __comp);
williamr@4
   639
williamr@4
   640
// replace
williamr@4
   641
template <class _ForwardIter, class _Tp>
williamr@4
   642
_STLP_INLINE_LOOP void
williamr@4
   643
replace(_ForwardIter __first, _ForwardIter __last,
williamr@4
   644
        const _Tp& __old_value, const _Tp& __new_value) {
williamr@4
   645
  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
williamr@4
   646
  for ( ; __first != __last; ++__first)
williamr@4
   647
    if (*__first == __old_value)
williamr@4
   648
      *__first = __new_value;
williamr@4
   649
}
williamr@4
   650
williamr@4
   651
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   652
williamr@4
   653
template <class _ForwardIter, class _Tp, class _Compare1, class _Compare2, class _Distance>
williamr@4
   654
_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
williamr@4
   655
                           const _Tp& __val, _Compare1 __comp1, _Compare2 __comp2, _Distance*);
williamr@4
   656
williamr@4
   657
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   658
williamr@4
   659
_STLP_END_NAMESPACE
williamr@4
   660
williamr@4
   661
#if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@4
   662
#  include <stl/_algobase.c>
williamr@4
   663
#endif
williamr@4
   664
williamr@4
   665
#endif /* _STLP_INTERNAL_ALGOBASE_H */
williamr@4
   666
williamr@4
   667
// Local Variables:
williamr@4
   668
// mode:C++
williamr@4
   669
// End:
williamr@4
   670