epoc32/include/stdapis/stlportv5/stl/_iterator_base.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
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@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-1998
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@4
    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@4
    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_ITERATOR_BASE_H
williamr@2
    31
#define _STLP_INTERNAL_ITERATOR_BASE_H
williamr@2
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_CSTDDEF
williamr@4
    34
#  include <stl/_cstddef.h>
williamr@2
    35
#endif
williamr@2
    36
williamr@4
    37
//# if defined  (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
williamr@4
    38
//_STLP_BEGIN_NAMESPACE
williamr@4
    39
//using namespace _STLP_VENDOR_CSTD;
williamr@4
    40
//_STLP_END_NAMESPACE
williamr@4
    41
//#endif /* _STLP_IMPORT_VENDOR_CSTD */
williamr@2
    42
williamr@4
    43
#if !defined(_STLP_USE_OLD_HP_ITERATOR_QUERIES) && !defined(_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
    44
#  ifndef _STLP_TYPE_TRAITS_H
williamr@4
    45
#    include <stl/type_traits.h>
williamr@4
    46
#  endif
williamr@2
    47
#endif
williamr@2
    48
williamr@2
    49
_STLP_BEGIN_NAMESPACE
williamr@2
    50
williamr@2
    51
struct input_iterator_tag {};
williamr@2
    52
struct output_iterator_tag {};
williamr@2
    53
struct forward_iterator_tag : public input_iterator_tag {};
williamr@2
    54
struct bidirectional_iterator_tag : public forward_iterator_tag {};
williamr@2
    55
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
williamr@2
    56
williamr@2
    57
williamr@4
    58
template <class _Category, class _Tp, _STLP_DFL_TMPL_PARAM(_Distance,ptrdiff_t),
williamr@4
    59
          _STLP_DFL_TMPL_PARAM(_Pointer,_Tp*), _STLP_DFL_TMPL_PARAM(_Reference,_Tp&) >
williamr@2
    60
struct iterator {
williamr@2
    61
  typedef _Category  iterator_category;
williamr@2
    62
  typedef _Tp        value_type;
williamr@2
    63
  typedef _Distance  difference_type;
williamr@2
    64
  typedef _Pointer   pointer;
williamr@2
    65
  typedef _Reference reference;
williamr@2
    66
};
williamr@2
    67
_STLP_TEMPLATE_NULL
williamr@2
    68
struct iterator<output_iterator_tag, void, void, void, void> {
williamr@2
    69
  typedef output_iterator_tag  iterator_category;
williamr@2
    70
#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@2
    71
  typedef void                value_type;
williamr@2
    72
  typedef void                difference_type;
williamr@2
    73
  typedef void                pointer;
williamr@2
    74
  typedef void                reference;
williamr@2
    75
#endif
williamr@2
    76
};
williamr@2
    77
williamr@4
    78
#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@2
    79
#  define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_category(_It)
williamr@2
    80
#  define _STLP_DISTANCE_TYPE(_It, _Tp)     distance_type(_It)
williamr@2
    81
#  define _STLP_VALUE_TYPE(_It, _Tp)        value_type(_It)
williamr@4
    82
//Old HP iterator queries do not give information about the iterator
williamr@4
    83
//associated reference type so we consider that it is not a real reference.
williamr@4
    84
#  define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) __false_type()
williamr@4
    85
#else
williamr@4
    86
#  if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
    87
#    define _STLP_VALUE_TYPE(_It, _Tp)        (typename iterator_traits< _Tp >::value_type*)0
williamr@4
    88
#    define _STLP_DISTANCE_TYPE(_It, _Tp)     (typename iterator_traits< _Tp >::difference_type*)0
williamr@4
    89
#    if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
williamr@4
    90
#      define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_traits< _Tp >::iterator_category()
williamr@4
    91
#    else
williamr@4
    92
#      define _STLP_ITERATOR_CATEGORY(_It, _Tp) typename iterator_traits< _Tp >::iterator_category()
williamr@4
    93
#    endif
williamr@4
    94
#    define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) _IsRefType< typename iterator_traits< _Tp >::reference >::_Ret()
williamr@2
    95
#  else
williamr@4
    96
#    define _STLP_ITERATOR_CATEGORY(_It, _Tp)   __iterator_category(_It, _IsPtrType<_Tp>::_Ret())
williamr@4
    97
#    define _STLP_DISTANCE_TYPE(_It, _Tp)       (ptrdiff_t*)0
williamr@4
    98
#    define _STLP_VALUE_TYPE(_It, _Tp)          __value_type(_It, _IsPtrType<_Tp>::_Ret() )
williamr@4
    99
#    define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) __false_type()
williamr@2
   100
#  endif
williamr@4
   101
#endif
williamr@2
   102
williamr@2
   103
template <class _Iterator>
williamr@2
   104
struct iterator_traits {
williamr@2
   105
  typedef typename _Iterator::iterator_category iterator_category;
williamr@2
   106
  typedef typename _Iterator::value_type        value_type;
williamr@2
   107
  typedef typename _Iterator::difference_type   difference_type;
williamr@2
   108
  typedef typename _Iterator::pointer           pointer;
williamr@2
   109
  typedef typename _Iterator::reference         reference;
williamr@2
   110
};
williamr@2
   111
williamr@2
   112
williamr@4
   113
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (__SUNPRO_CC)
williamr@2
   114
#  define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
williamr@4
   115
#else
williamr@2
   116
#  define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
williamr@4
   117
#endif
williamr@2
   118
williamr@4
   119
#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@2
   120
williamr@2
   121
// fbp : this order keeps gcc happy
williamr@2
   122
template <class _Tp>
williamr@2
   123
struct iterator_traits<const _Tp*> {
williamr@4
   124
  typedef random_access_iterator_tag  iterator_category;
williamr@2
   125
  typedef _Tp                         value_type;
williamr@2
   126
  typedef ptrdiff_t                   difference_type;
williamr@2
   127
  typedef const _Tp*                  pointer;
williamr@2
   128
  typedef const _Tp&                  reference;
williamr@2
   129
};
williamr@2
   130
williamr@2
   131
template <class _Tp>
williamr@2
   132
struct iterator_traits<_Tp*> {
williamr@4
   133
  typedef random_access_iterator_tag  iterator_category;
williamr@2
   134
  typedef _Tp                         value_type;
williamr@2
   135
  typedef ptrdiff_t                   difference_type;
williamr@2
   136
  typedef _Tp*                        pointer;
williamr@2
   137
  typedef _Tp&                        reference;
williamr@2
   138
};
williamr@2
   139
williamr@2
   140
#  if defined (__BORLANDC__)
williamr@2
   141
template <class _Tp>
williamr@2
   142
struct iterator_traits<_Tp* const> {
williamr@4
   143
  typedef random_access_iterator_tag  iterator_category;
williamr@2
   144
  typedef _Tp                         value_type;
williamr@2
   145
  typedef ptrdiff_t                   difference_type;
williamr@2
   146
  typedef const _Tp*                  pointer;
williamr@2
   147
  typedef const _Tp&                  reference;
williamr@2
   148
};
williamr@2
   149
#  endif
williamr@2
   150
williamr@4
   151
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@2
   152
williamr@2
   153
williamr@4
   154
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) || \
williamr@4
   155
   (defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) && ! defined (_STLP_NO_ARROW_OPERATOR))
williamr@2
   156
#  define _STLP_POINTERS_SPECIALIZE( _TpP )
williamr@2
   157
#  define _STLP_DEFINE_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }
williamr@4
   158
#else
williamr@2
   159
#  include <stl/_ptrs_specialize.h>
williamr@4
   160
#endif
williamr@2
   161
williamr@4
   162
#ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
williamr@2
   163
// The overloaded functions iterator_category, distance_type, and
williamr@2
   164
// value_type are not part of the C++ standard.  (They have been
williamr@2
   165
// replaced by struct iterator_traits.)  They are included for
williamr@2
   166
// backward compatibility with the HP STL.
williamr@2
   167
// We introduce internal names for these functions.
williamr@2
   168
williamr@4
   169
#  ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@2
   170
williamr@2
   171
template <class _Iter>
williamr@2
   172
inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
williamr@2
   173
  typedef typename iterator_traits<_Iter>::iterator_category _Category;
williamr@2
   174
  return _Category();
williamr@2
   175
}
williamr@2
   176
williamr@2
   177
template <class _Iter>
williamr@2
   178
inline typename iterator_traits<_Iter>::difference_type* __distance_type(const _Iter&) {
williamr@2
   179
  typedef typename iterator_traits<_Iter>::difference_type _diff_type;
williamr@2
   180
  return __STATIC_CAST(_diff_type*,0);
williamr@2
   181
}
williamr@2
   182
williamr@2
   183
template <class _Iter>
williamr@2
   184
inline typename iterator_traits<_Iter>::value_type* __value_type(const _Iter&) {
williamr@2
   185
  typedef typename iterator_traits<_Iter>::value_type _value_type;
williamr@2
   186
  return __STATIC_CAST(_value_type*,0);
williamr@2
   187
}
williamr@2
   188
williamr@4
   189
#  else /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@2
   190
williamr@2
   191
template <class _Iter>
williamr@4
   192
inline random_access_iterator_tag
williamr@2
   193
__iterator_category(const _Iter&, const __true_type&) {
williamr@2
   194
  return random_access_iterator_tag();
williamr@2
   195
}
williamr@2
   196
williamr@2
   197
template <class _Iter>
williamr@2
   198
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::iterator_category
williamr@2
   199
__iterator_category(const _Iter&, const __false_type&) {
williamr@2
   200
  typedef typename iterator_traits<_Iter>::iterator_category _Category;
williamr@2
   201
  return _Category();
williamr@2
   202
}
williamr@2
   203
williamr@2
   204
williamr@2
   205
template <class _Iter>
williamr@4
   206
inline ptrdiff_t* _STLP_CALL __distance_type(const _Iter&) { return __STATIC_CAST(ptrdiff_t*, 0); }
williamr@2
   207
williamr@2
   208
template <class _Iter>
williamr@4
   209
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::value_type*
williamr@2
   210
__value_type(const _Iter&, const __false_type&) {
williamr@2
   211
  typedef typename iterator_traits<_Iter>::value_type _value_type;
williamr@2
   212
  return __STATIC_CAST(_value_type*,0);
williamr@2
   213
}
williamr@2
   214
williamr@2
   215
template <class _Tp>
williamr@4
   216
inline _Tp*
williamr@2
   217
__value_type(const _Tp*, const __true_type&) {
williamr@2
   218
  return __STATIC_CAST(_Tp*, 0);
williamr@2
   219
}
williamr@2
   220
williamr@4
   221
#  endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@2
   222
williamr@4
   223
#else /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
williamr@2
   224
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@2
   225
inline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
williamr@2
   226
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@4
   227
inline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return __STATIC_CAST(_Tp*, 0); }
williamr@2
   228
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@4
   229
inline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return __STATIC_CAST(_Distance*, 0); }
williamr@2
   230
template <class _Tp>
williamr@2
   231
inline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
williamr@2
   232
template <class _Tp>
williamr@4
   233
inline _Tp* _STLP_CALL value_type(const _Tp*) { return __STATIC_CAST(_Tp*, 0); }
williamr@2
   234
template <class _Tp>
williamr@4
   235
inline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return __STATIC_CAST(ptrdiff_t*, 0); }
williamr@2
   236
#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
williamr@2
   237
williamr@2
   238
# if ! defined (_STLP_NO_ANACHRONISMS)
williamr@2
   239
// The base classes input_iterator, output_iterator, forward_iterator,
williamr@2
   240
// bidirectional_iterator, and random_access_iterator are not part of
williamr@2
   241
// the C++ standard.  (They have been replaced by struct iterator.)
williamr@2
   242
// They are included for backward compatibility with the HP STL.
williamr@4
   243
template <class _Tp, class _Distance> struct input_iterator :
williamr@2
   244
  public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@2
   245
struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
williamr@2
   246
template <class _Tp, class _Distance> struct forward_iterator :
williamr@2
   247
  public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@2
   248
template <class _Tp, class _Distance> struct bidirectional_iterator :
williamr@2
   249
  public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@2
   250
template <class _Tp, class _Distance> struct random_access_iterator :
williamr@2
   251
  public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@2
   252
williamr@2
   253
# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@4
   254
template <class _Tp, class _Distance>
williamr@4
   255
inline input_iterator_tag _STLP_CALL
williamr@2
   256
iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
williamr@2
   257
inline output_iterator_tag _STLP_CALL
williamr@2
   258
iterator_category(const output_iterator&) { return output_iterator_tag(); }
williamr@4
   259
template <class _Tp, class _Distance>
williamr@2
   260
inline forward_iterator_tag _STLP_CALL
williamr@2
   261
iterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
williamr@4
   262
template <class _Tp, class _Distance>
williamr@4
   263
inline bidirectional_iterator_tag _STLP_CALL
williamr@2
   264
iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
williamr@4
   265
template <class _Tp, class _Distance>
williamr@2
   266
inline random_access_iterator_tag _STLP_CALL
williamr@2
   267
iterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
williamr@4
   268
template <class _Tp, class _Distance>
williamr@4
   269
inline _Tp*  _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
williamr@4
   270
template <class _Tp, class _Distance>
williamr@4
   271
inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
williamr@4
   272
template <class _Tp, class _Distance>
williamr@4
   273
inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
williamr@4
   274
template <class _Tp, class _Distance>
williamr@4
   275
inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
williamr@4
   276
template <class _Tp, class _Distance>
williamr@4
   277
inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
williamr@4
   278
template <class _Tp, class _Distance>
williamr@4
   279
inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
williamr@4
   280
template <class _Tp, class _Distance>
williamr@4
   281
inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0);}
williamr@4
   282
template <class _Tp, class _Distance>
williamr@4
   283
inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
williamr@2
   284
# endif /* BASE_MATCH */
williamr@2
   285
williamr@2
   286
#endif /* _STLP_NO_ANACHRONISMS */
williamr@2
   287
williamr@2
   288
template <class _InputIterator, class _Distance>
williamr@2
   289
inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last,
williamr@4
   290
                                  _Distance& __n, const input_iterator_tag &) {
williamr@2
   291
  _InputIterator __it(__first);
williamr@2
   292
  while (__it != __last) { ++__it; ++__n; }
williamr@2
   293
}
williamr@2
   294
williamr@4
   295
williamr@4
   296
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
williamr@2
   297
template <class _ForwardIterator, class _Distance>
williamr@2
   298
inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
williamr@4
   299
                                  _Distance& __n, const forward_iterator_tag &) {
williamr@2
   300
  _ForwardIterator __it(__first);
williamr@2
   301
  while (__it != __last) { ++__first; ++__n; }
williamr@2
   302
}
williamr@2
   303
williamr@2
   304
template <class _BidirectionalIterator, class _Distance>
williamr@4
   305
_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first,
williamr@4
   306
                                             const _BidirectionalIterator& __last,
williamr@4
   307
                                             _Distance& __n, const bidirectional_iterator_tag &) {
williamr@2
   308
  _BidirectionalIterator __it(__first);
williamr@2
   309
  while (__it != __last) { ++__it; ++__n; }
williamr@2
   310
}
williamr@2
   311
# endif
williamr@2
   312
williamr@2
   313
template <class _RandomAccessIterator, class _Distance>
williamr@4
   314
inline void _STLP_CALL __distance(const _RandomAccessIterator& __first,
williamr@4
   315
                                  const _RandomAccessIterator& __last,
williamr@4
   316
                                  _Distance& __n, const random_access_iterator_tag &) {
williamr@2
   317
  __n += __last - __first;
williamr@2
   318
}
williamr@2
   319
williamr@4
   320
#ifndef _STLP_NO_ANACHRONISMS
williamr@2
   321
template <class _InputIterator, class _Distance>
williamr@4
   322
inline void _STLP_CALL distance(const _InputIterator& __first,
williamr@4
   323
        const _InputIterator& __last, _Distance& __n) {
williamr@2
   324
  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@2
   325
}
williamr@2
   326
#endif
williamr@2
   327
williamr@2
   328
template <class _InputIterator>
williamr@2
   329
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
williamr@2
   330
__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) {
williamr@2
   331
  _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
williamr@4
   332
  _InputIterator __it(__first);
williamr@2
   333
  while (__it != __last) {
williamr@2
   334
    ++__it; ++__n;
williamr@2
   335
  }
williamr@2
   336
  return __n;
williamr@2
   337
}
williamr@2
   338
williamr@4
   339
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
williamr@2
   340
template <class _ForwardIterator>
williamr@4
   341
inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL
williamr@2
   342
__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
williamr@2
   343
           const forward_iterator_tag &)
williamr@2
   344
{
williamr@2
   345
  _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
williamr@2
   346
  _ForwardIterator __it(__first);
williamr@2
   347
  while (__it != __last) {
williamr@2
   348
    ++__it; ++__n;
williamr@2
   349
  }
williamr@2
   350
  return __n;
williamr@4
   351
williamr@2
   352
}
williamr@2
   353
williamr@2
   354
template <class _BidirectionalIterator>
williamr@4
   355
_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL
williamr@4
   356
__distance(const _BidirectionalIterator& __first,
williamr@2
   357
           const _BidirectionalIterator& __last,
williamr@2
   358
           const bidirectional_iterator_tag &) {
williamr@2
   359
  _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
williamr@2
   360
  _BidirectionalIterator __it(__first);
williamr@2
   361
  while (__it != __last) {
williamr@2
   362
    ++__it; ++__n;
williamr@2
   363
  }
williamr@2
   364
  return __n;
williamr@2
   365
}
williamr@2
   366
# endif
williamr@2
   367
williamr@2
   368
template <class _RandomAccessIterator>
williamr@2
   369
inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
williamr@2
   370
__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
williamr@2
   371
           const random_access_iterator_tag &) {
williamr@2
   372
  return __last - __first;
williamr@2
   373
}
williamr@2
   374
williamr@2
   375
template <class _InputIterator>
williamr@2
   376
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
williamr@4
   377
distance(_InputIterator __first, _InputIterator __last) {
williamr@4
   378
  return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@2
   379
}
williamr@2
   380
williamr@2
   381
// fbp: those are being used for iterator/const_iterator definitions everywhere
williamr@2
   382
template <class _Tp>
williamr@2
   383
struct _Nonconst_traits;
williamr@2
   384
williamr@2
   385
template <class _Tp>
williamr@2
   386
struct _Const_traits {
williamr@2
   387
  typedef _Tp value_type;
williamr@2
   388
  typedef const _Tp&  reference;
williamr@2
   389
  typedef const _Tp*  pointer;
williamr@4
   390
  typedef _Const_traits<_Tp> _ConstTraits;
williamr@4
   391
  typedef _Nonconst_traits<_Tp> _NonConstTraits;
williamr@2
   392
};
williamr@2
   393
williamr@2
   394
template <class _Tp>
williamr@2
   395
struct _Nonconst_traits {
williamr@2
   396
  typedef _Tp value_type;
williamr@2
   397
  typedef _Tp& reference;
williamr@2
   398
  typedef _Tp* pointer;
williamr@4
   399
  typedef _Const_traits<_Tp> _ConstTraits;
williamr@4
   400
  typedef _Nonconst_traits<_Tp> _NonConstTraits;
williamr@2
   401
};
williamr@2
   402
williamr@4
   403
/*
williamr@4
   404
 * dums: A special iterator/const_iterator traits for set and multiset for which even
williamr@4
   405
 * the iterator is not mutable
williamr@4
   406
 */
williamr@4
   407
template <class _Tp>
williamr@4
   408
struct _Nonconst_Const_traits;
williamr@4
   409
williamr@4
   410
template <class _Tp>
williamr@4
   411
struct _Const_Const_traits {
williamr@4
   412
  typedef _Tp value_type;
williamr@4
   413
  typedef const _Tp&  reference;
williamr@4
   414
  typedef const _Tp*  pointer;
williamr@4
   415
  typedef _Const_Const_traits<_Tp> _ConstTraits;
williamr@4
   416
  typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;
williamr@4
   417
};
williamr@4
   418
williamr@4
   419
template <class _Tp>
williamr@4
   420
struct _Nonconst_Const_traits {
williamr@4
   421
  typedef _Tp value_type;
williamr@4
   422
  typedef const _Tp& reference;
williamr@4
   423
  typedef const _Tp* pointer;
williamr@4
   424
  typedef _Const_Const_traits<_Tp> _ConstTraits;
williamr@4
   425
  typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;
williamr@4
   426
};
williamr@4
   427
williamr@4
   428
/*
williamr@4
   429
 * A macro to generate a new iterator traits from one of the
williamr@4
   430
 * previous one. Changing the iterator traits type make iterators
williamr@4
   431
 * from different containers not comparable.
williamr@4
   432
 */
williamr@4
   433
#define _STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits)        \
williamr@4
   434
template <class _Tp>                                            \
williamr@4
   435
struct _##Motif;                                                \
williamr@4
   436
template <class _Tp>                                            \
williamr@4
   437
struct _Const##Motif : public _STLP_STD::_Const_##Traits<_Tp> {  \
williamr@4
   438
  typedef _Const##Motif<_Tp> _ConstTraits;                      \
williamr@4
   439
  typedef _##Motif<_Tp> _NonConstTraits;                        \
williamr@4
   440
};                                                              \
williamr@4
   441
template <class _Tp>                                            \
williamr@4
   442
struct _##Motif : public _STLP_STD::_Nonconst_##Traits<_Tp> {    \
williamr@4
   443
  typedef _Const##Motif<_Tp> _ConstTraits;                      \
williamr@4
   444
  typedef _##Motif<_Tp> _NonConstTraits;                        \
williamr@4
   445
};
williamr@4
   446
williamr@4
   447
#define _STLP_CREATE_ITERATOR_TRAITS(Motif, Traits)             \
williamr@4
   448
_STLP_MOVE_TO_PRIV_NAMESPACE                                    \
williamr@4
   449
_STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits)                \
williamr@4
   450
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   451
williamr@4
   452
#define _STLP_CREATE_HASH_ITERATOR_TRAITS(Motif, Traits)        \
williamr@4
   453
_STLP_MOVE_TO_PRIV_NAMESPACE                                    \
williamr@4
   454
_STLP_CREATE_ITERATOR_TRAITS_BASE(NonLocal##Motif, Traits)      \
williamr@4
   455
_STLP_CREATE_ITERATOR_TRAITS_BASE(Local##Motif, Traits)         \
williamr@4
   456
template <class _Tp>                                            \
williamr@4
   457
struct _##Motif {                                               \
williamr@4
   458
  typedef _ConstNonLocal##Motif<_Tp> _ConstTraits;              \
williamr@4
   459
  typedef _NonLocal##Motif<_Tp> _NonConstTraits;                \
williamr@4
   460
  typedef _ConstLocal##Motif<_Tp> _ConstLocalTraits;            \
williamr@4
   461
  typedef _Local##Motif<_Tp> _NonConstLocalTraits;              \
williamr@4
   462
};                                                              \
williamr@4
   463
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   464
williamr@4
   465
/*
williamr@2
   466
#  if defined (_STLP_BASE_TYPEDEF_BUG)
williamr@2
   467
// this workaround is needed for SunPro 4.0.1
williamr@2
   468
template <class _Traits>
williamr@4
   469
struct __cnst_traits_aux : private _Traits {
williamr@2
   470
  typedef typename _Traits::value_type value_type;
williamr@2
   471
};
williamr@2
   472
#  define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
williamr@2
   473
#  else
williamr@2
   474
#  define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
williamr@2
   475
#  endif
williamr@4
   476
*/
williamr@2
   477
williamr@4
   478
#if defined (_STLP_MSVC)
williamr@2
   479
// MSVC specific
williamr@2
   480
template <class _InputIterator, class _Dist>
williamr@4
   481
inline void  _STLP_CALL _Distance(_InputIterator __first,
williamr@4
   482
                                  _InputIterator __last, _Dist& __n) {
williamr@2
   483
  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@2
   484
}
williamr@4
   485
#endif
williamr@2
   486
williamr@2
   487
template <class _InputIter, class _Distance>
williamr@4
   488
_STLP_INLINE_LOOP void  _STLP_CALL
williamr@4
   489
__advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) {
williamr@2
   490
  while (__n--) ++__i;
williamr@2
   491
}
williamr@2
   492
williamr@2
   493
// fbp : added output iterator tag variant
williamr@2
   494
template <class _InputIter, class _Distance>
williamr@4
   495
_STLP_INLINE_LOOP void  _STLP_CALL
williamr@4
   496
__advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) {
williamr@2
   497
  while (__n--) ++__i;
williamr@2
   498
}
williamr@2
   499
williamr@4
   500
#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
williamr@2
   501
template <class _ForwardIterator, class _Distance>
williamr@4
   502
_STLP_INLINE_LOOP void _STLP_CALL
williamr@4
   503
__advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) {
williamr@4
   504
  while (n--) ++i;
williamr@2
   505
}
williamr@4
   506
#endif
williamr@2
   507
williamr@2
   508
template <class _BidirectionalIterator, class _Distance>
williamr@4
   509
_STLP_INLINE_LOOP void _STLP_CALL
williamr@4
   510
__advance(_BidirectionalIterator& __i, _Distance __n,
williamr@4
   511
          const bidirectional_iterator_tag &) {
williamr@2
   512
  if (__n > 0)
williamr@2
   513
    while (__n--) ++__i;
williamr@2
   514
  else
williamr@2
   515
    while (__n++) --__i;
williamr@2
   516
}
williamr@2
   517
williamr@2
   518
template <class _RandomAccessIterator, class _Distance>
williamr@4
   519
inline void _STLP_CALL
williamr@4
   520
__advance(_RandomAccessIterator& __i, _Distance __n,
williamr@4
   521
          const random_access_iterator_tag &) {
williamr@2
   522
  __i += __n;
williamr@2
   523
}
williamr@2
   524
williamr@2
   525
template <class _InputIterator, class _Distance>
williamr@2
   526
inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) {
williamr@2
   527
  __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));
williamr@2
   528
}
williamr@2
   529
williamr@2
   530
_STLP_END_NAMESPACE
williamr@2
   531
williamr@4
   532
#if defined (_STLP_DEBUG) && !defined (_STLP_DEBUG_H)
williamr@2
   533
#  include <stl/debug/_debug.h>
williamr@4
   534
#endif
williamr@2
   535
williamr@2
   536
#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
williamr@2
   537
williamr@2
   538
williamr@2
   539
// Local Variables:
williamr@2
   540
// mode:C++
williamr@2
   541
// End: