epoc32/include/stdapis/stlport/stl/_iterator_base.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-1998
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_ITERATOR_BASE_H
williamr@4
    31
#define _STLP_INTERNAL_ITERATOR_BASE_H
williamr@4
    32
williamr@4
    33
#ifndef _STLP_CSTDDEF
williamr@4
    34
# include <cstddef>
williamr@4
    35
#endif
williamr@4
    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@4
    42
williamr@4
    43
#ifndef __TYPE_TRAITS_H
williamr@4
    44
# include <stl/type_traits.h>
williamr@4
    45
#endif
williamr@4
    46
williamr@4
    47
_STLP_BEGIN_NAMESPACE
williamr@4
    48
williamr@4
    49
struct input_iterator_tag {};
williamr@4
    50
struct output_iterator_tag {};
williamr@4
    51
struct forward_iterator_tag : public input_iterator_tag {};
williamr@4
    52
struct bidirectional_iterator_tag : public forward_iterator_tag {};
williamr@4
    53
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
williamr@4
    54
williamr@4
    55
williamr@4
    56
template <class _Category, class _Tp, __DFL_TMPL_PARAM(_Distance,ptrdiff_t),
williamr@4
    57
          __DFL_TMPL_PARAM(_Pointer,_Tp*), __DFL_TMPL_PARAM(_Reference,_Tp&) >
williamr@4
    58
struct iterator {
williamr@4
    59
  typedef _Category  iterator_category;
williamr@4
    60
  typedef _Tp        value_type;
williamr@4
    61
  typedef _Distance  difference_type;
williamr@4
    62
  typedef _Pointer   pointer;
williamr@4
    63
  typedef _Reference reference;
williamr@4
    64
};
williamr@4
    65
_STLP_TEMPLATE_NULL
williamr@4
    66
struct iterator<output_iterator_tag, void, void, void, void> {
williamr@4
    67
  typedef output_iterator_tag  iterator_category;
williamr@4
    68
#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@4
    69
  typedef void                value_type;
williamr@4
    70
  typedef void                difference_type;
williamr@4
    71
  typedef void                pointer;
williamr@4
    72
  typedef void                reference;
williamr@4
    73
#endif
williamr@4
    74
};
williamr@4
    75
williamr@4
    76
# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
williamr@4
    77
#  define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_category(_It)
williamr@4
    78
#  define _STLP_DISTANCE_TYPE(_It, _Tp)     distance_type(_It)
williamr@4
    79
#  define _STLP_VALUE_TYPE(_It, _Tp)        value_type(_It)
williamr@4
    80
# else
williamr@4
    81
#  ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@4
    82
#   define _STLP_VALUE_TYPE(_It, _Tp)        (typename iterator_traits< _Tp >::value_type*)0
williamr@4
    83
#   define _STLP_DISTANCE_TYPE(_It, _Tp)     (typename iterator_traits< _Tp >::difference_type*)0
williamr@4
    84
#   if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
williamr@4
    85
#    define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_traits< _Tp >::iterator_category()
williamr@4
    86
#   else
williamr@4
    87
#    define _STLP_ITERATOR_CATEGORY(_It, _Tp) typename iterator_traits< _Tp >::iterator_category()
williamr@4
    88
#   endif
williamr@4
    89
#  else
williamr@4
    90
#   define _STLP_ITERATOR_CATEGORY(_It, _Tp) __iterator_category(_It, _IsPtrType<_Tp>::_Ret())
williamr@4
    91
#   define _STLP_DISTANCE_TYPE(_It, _Tp)     (ptrdiff_t*)0
williamr@4
    92
#   define _STLP_VALUE_TYPE(_It, _Tp)        __value_type(_It, _IsPtrType<_Tp>::_Ret() )
williamr@4
    93
#  endif
williamr@4
    94
# endif
williamr@4
    95
williamr@4
    96
template <class _Iterator>
williamr@4
    97
struct iterator_traits {
williamr@4
    98
  typedef typename _Iterator::iterator_category iterator_category;
williamr@4
    99
  typedef typename _Iterator::value_type        value_type;
williamr@4
   100
  typedef typename _Iterator::difference_type   difference_type;
williamr@4
   101
  typedef typename _Iterator::pointer           pointer;
williamr@4
   102
  typedef typename _Iterator::reference         reference;
williamr@4
   103
};
williamr@4
   104
williamr@4
   105
williamr@4
   106
# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (__SUNPRO_CC)
williamr@4
   107
#  define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
williamr@4
   108
# else
williamr@4
   109
#  define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
williamr@4
   110
# endif
williamr@4
   111
williamr@4
   112
# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@4
   113
williamr@4
   114
// fbp : this order keeps gcc happy
williamr@4
   115
template <class _Tp>
williamr@4
   116
struct iterator_traits<const _Tp*> {
williamr@4
   117
  typedef random_access_iterator_tag iterator_category;
williamr@4
   118
  typedef _Tp                         value_type;
williamr@4
   119
  typedef ptrdiff_t                   difference_type;
williamr@4
   120
  typedef const _Tp*                  pointer;
williamr@4
   121
  typedef const _Tp&                  reference;
williamr@4
   122
};
williamr@4
   123
williamr@4
   124
template <class _Tp>
williamr@4
   125
struct iterator_traits<_Tp*> {
williamr@4
   126
  typedef random_access_iterator_tag iterator_category;
williamr@4
   127
  typedef _Tp                         value_type;
williamr@4
   128
  typedef ptrdiff_t                   difference_type;
williamr@4
   129
  typedef _Tp*                        pointer;
williamr@4
   130
  typedef _Tp&                        reference;
williamr@4
   131
};
williamr@4
   132
williamr@4
   133
#  if defined (__BORLANDC__)
williamr@4
   134
template <class _Tp>
williamr@4
   135
struct iterator_traits<_Tp* const> {
williamr@4
   136
  typedef random_access_iterator_tag iterator_category;
williamr@4
   137
  typedef _Tp                         value_type;
williamr@4
   138
  typedef ptrdiff_t                   difference_type;
williamr@4
   139
  typedef const _Tp*                  pointer;
williamr@4
   140
  typedef const _Tp&                  reference;
williamr@4
   141
};
williamr@4
   142
#  endif
williamr@4
   143
williamr@4
   144
# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@4
   145
williamr@4
   146
williamr@4
   147
# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) \
williamr@4
   148
  || (defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) && ! defined (_STLP_NO_ARROW_OPERATOR))
williamr@4
   149
#  define _STLP_POINTERS_SPECIALIZE( _TpP )
williamr@4
   150
#  define _STLP_DEFINE_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }
williamr@4
   151
# else 
williamr@4
   152
#  include <stl/_ptrs_specialize.h>
williamr@4
   153
# endif
williamr@4
   154
williamr@4
   155
# ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
williamr@4
   156
// The overloaded functions iterator_category, distance_type, and
williamr@4
   157
// value_type are not part of the C++ standard.  (They have been
williamr@4
   158
// replaced by struct iterator_traits.)  They are included for
williamr@4
   159
// backward compatibility with the HP STL.
williamr@4
   160
// We introduce internal names for these functions.
williamr@4
   161
williamr@4
   162
#  ifdef  _STLP_CLASS_PARTIAL_SPECIALIZATION
williamr@4
   163
williamr@4
   164
template <class _Iter>
williamr@4
   165
inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
williamr@4
   166
  typedef typename iterator_traits<_Iter>::iterator_category _Category;
williamr@4
   167
  return _Category();
williamr@4
   168
}
williamr@4
   169
williamr@4
   170
template <class _Iter>
williamr@4
   171
inline typename iterator_traits<_Iter>::difference_type* __distance_type(const _Iter&) {
williamr@4
   172
  typedef typename iterator_traits<_Iter>::difference_type _diff_type;
williamr@4
   173
  return __STATIC_CAST(_diff_type*,0);
williamr@4
   174
}
williamr@4
   175
williamr@4
   176
template <class _Iter>
williamr@4
   177
inline typename iterator_traits<_Iter>::value_type* __value_type(const _Iter&) {
williamr@4
   178
  typedef typename iterator_traits<_Iter>::value_type _value_type;
williamr@4
   179
  return __STATIC_CAST(_value_type*,0);
williamr@4
   180
}
williamr@4
   181
williamr@4
   182
# else
williamr@4
   183
williamr@4
   184
template <class _Iter>
williamr@4
   185
inline random_access_iterator_tag 
williamr@4
   186
__iterator_category(const _Iter&, const __true_type&) {
williamr@4
   187
  return random_access_iterator_tag();
williamr@4
   188
}
williamr@4
   189
williamr@4
   190
template <class _Iter>
williamr@4
   191
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::iterator_category
williamr@4
   192
__iterator_category(const _Iter&, const __false_type&) {
williamr@4
   193
  typedef typename iterator_traits<_Iter>::iterator_category _Category;
williamr@4
   194
  return _Category();
williamr@4
   195
}
williamr@4
   196
williamr@4
   197
williamr@4
   198
template <class _Iter>
williamr@4
   199
inline ptrdiff_t* _STLP_CALL __distance_type(const _Iter&) { return (ptrdiff_t*)(0); }
williamr@4
   200
williamr@4
   201
template <class _Iter>
williamr@4
   202
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::value_type* 
williamr@4
   203
__value_type(const _Iter&, const __false_type&) {
williamr@4
   204
  typedef typename iterator_traits<_Iter>::value_type _value_type;
williamr@4
   205
  return __STATIC_CAST(_value_type*,0);
williamr@4
   206
}
williamr@4
   207
williamr@4
   208
template <class _Tp>
williamr@4
   209
inline _Tp*  
williamr@4
   210
__value_type(const _Tp*, const __true_type&) {
williamr@4
   211
  return __STATIC_CAST(_Tp*, 0);
williamr@4
   212
}
williamr@4
   213
williamr@4
   214
# endif
williamr@4
   215
williamr@4
   216
#else /* old queries */
williamr@4
   217
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@4
   218
inline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
williamr@4
   219
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@4
   220
inline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Tp*)(0); }
williamr@4
   221
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
williamr@4
   222
inline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Distance*)(0); }
williamr@4
   223
template <class _Tp>
williamr@4
   224
inline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
williamr@4
   225
template <class _Tp>
williamr@4
   226
inline _Tp* _STLP_CALL value_type(const _Tp*) { return (_Tp*)(0); }
williamr@4
   227
template <class _Tp>
williamr@4
   228
inline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return (ptrdiff_t*)(0); }
williamr@4
   229
#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
williamr@4
   230
williamr@4
   231
# if ! defined (_STLP_NO_ANACHRONISMS)
williamr@4
   232
// The base classes input_iterator, output_iterator, forward_iterator,
williamr@4
   233
// bidirectional_iterator, and random_access_iterator are not part of
williamr@4
   234
// the C++ standard.  (They have been replaced by struct iterator.)
williamr@4
   235
// They are included for backward compatibility with the HP STL.
williamr@4
   236
template <class _Tp, class _Distance> struct input_iterator : 
williamr@4
   237
  public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@4
   238
struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
williamr@4
   239
template <class _Tp, class _Distance> struct forward_iterator :
williamr@4
   240
  public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@4
   241
template <class _Tp, class _Distance> struct bidirectional_iterator :
williamr@4
   242
  public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@4
   243
template <class _Tp, class _Distance> struct random_access_iterator :
williamr@4
   244
  public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
williamr@4
   245
williamr@4
   246
# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@4
   247
template <class _Tp, class _Distance> 
williamr@4
   248
inline input_iterator_tag _STLP_CALL 
williamr@4
   249
iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
williamr@4
   250
inline output_iterator_tag _STLP_CALL
williamr@4
   251
iterator_category(const output_iterator&) { return output_iterator_tag(); }
williamr@4
   252
template <class _Tp, class _Distance> 
williamr@4
   253
inline forward_iterator_tag _STLP_CALL
williamr@4
   254
iterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
williamr@4
   255
template <class _Tp, class _Distance> 
williamr@4
   256
inline bidirectional_iterator_tag _STLP_CALL 
williamr@4
   257
iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
williamr@4
   258
template <class _Tp, class _Distance> 
williamr@4
   259
inline random_access_iterator_tag _STLP_CALL
williamr@4
   260
iterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
williamr@4
   261
template <class _Tp, class _Distance> 
williamr@4
   262
inline _Tp*  _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
williamr@4
   263
template <class _Tp, class _Distance> 
williamr@4
   264
inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
williamr@4
   265
template <class _Tp, class _Distance> 
williamr@4
   266
inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
williamr@4
   267
template <class _Tp, class _Distance> 
williamr@4
   268
inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
williamr@4
   269
template <class _Tp, class _Distance> 
williamr@4
   270
inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
williamr@4
   271
template <class _Tp, class _Distance> 
williamr@4
   272
inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
williamr@4
   273
template <class _Tp, class _Distance> 
williamr@4
   274
inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Distance*)(0);}
williamr@4
   275
template <class _Tp, class _Distance> 
williamr@4
   276
inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
williamr@4
   277
# endif /* BASE_MATCH */
williamr@4
   278
williamr@4
   279
#endif /* _STLP_NO_ANACHRONISMS */
williamr@4
   280
williamr@4
   281
template <class _InputIterator, class _Distance>
williamr@4
   282
inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last,
williamr@4
   283
				  _Distance& __n, const input_iterator_tag &) {
williamr@4
   284
  _InputIterator __it(__first);
williamr@4
   285
  while (__it != __last) { ++__it; ++__n; }
williamr@4
   286
}
williamr@4
   287
williamr@4
   288
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) 
williamr@4
   289
template <class _ForwardIterator, class _Distance>
williamr@4
   290
inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
williamr@4
   291
				  _Distance& __n, const forward_iterator_tag &) {
williamr@4
   292
  _ForwardIterator __it(__first);
williamr@4
   293
  while (__it != __last) { ++__first; ++__n; }
williamr@4
   294
}
williamr@4
   295
williamr@4
   296
template <class _BidirectionalIterator, class _Distance>
williamr@4
   297
_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first, 
williamr@4
   298
					     const _BidirectionalIterator& __last,
williamr@4
   299
					     _Distance& __n, const bidirectional_iterator_tag &) {
williamr@4
   300
  _BidirectionalIterator __it(__first);
williamr@4
   301
  while (__it != __last) { ++__it; ++__n; }
williamr@4
   302
}
williamr@4
   303
# endif
williamr@4
   304
williamr@4
   305
template <class _RandomAccessIterator, class _Distance>
williamr@4
   306
inline void _STLP_CALL __distance(const _RandomAccessIterator& __first, 
williamr@4
   307
				  const _RandomAccessIterator& __last, 
williamr@4
   308
				  _Distance& __n, const random_access_iterator_tag &) {
williamr@4
   309
  __n += __last - __first;
williamr@4
   310
}
williamr@4
   311
williamr@4
   312
#ifndef _STLP_NO_ANACHRONISMS 
williamr@4
   313
template <class _InputIterator, class _Distance>
williamr@4
   314
inline void _STLP_CALL distance(const _InputIterator& __first, 
williamr@4
   315
				const _InputIterator& __last, _Distance& __n) {
williamr@4
   316
  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@4
   317
}
williamr@4
   318
#endif
williamr@4
   319
williamr@4
   320
template <class _InputIterator>
williamr@4
   321
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
williamr@4
   322
__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) {
williamr@4
   323
  _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
williamr@4
   324
  _InputIterator __it(__first);  
williamr@4
   325
  while (__it != __last) {
williamr@4
   326
    ++__it; ++__n;
williamr@4
   327
  }
williamr@4
   328
  return __n;
williamr@4
   329
}
williamr@4
   330
williamr@4
   331
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) 
williamr@4
   332
template <class _ForwardIterator>
williamr@4
   333
inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL 
williamr@4
   334
__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
williamr@4
   335
           const forward_iterator_tag &)
williamr@4
   336
{
williamr@4
   337
  _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
williamr@4
   338
  _ForwardIterator __it(__first);
williamr@4
   339
  while (__it != __last) {
williamr@4
   340
    ++__it; ++__n;
williamr@4
   341
  }
williamr@4
   342
  return __n;
williamr@4
   343
}
williamr@4
   344
williamr@4
   345
template <class _BidirectionalIterator>
williamr@4
   346
_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL 
williamr@4
   347
__distance(const _BidirectionalIterator& __first, 
williamr@4
   348
           const _BidirectionalIterator& __last,
williamr@4
   349
           const bidirectional_iterator_tag &) {
williamr@4
   350
  _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
williamr@4
   351
  _BidirectionalIterator __it(__first);
williamr@4
   352
  while (__it != __last) {
williamr@4
   353
    ++__it; ++__n;
williamr@4
   354
  }
williamr@4
   355
  return __n;
williamr@4
   356
}
williamr@4
   357
# endif
williamr@4
   358
williamr@4
   359
template <class _RandomAccessIterator>
williamr@4
   360
inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
williamr@4
   361
__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
williamr@4
   362
           const random_access_iterator_tag &) {
williamr@4
   363
  return __last - __first;
williamr@4
   364
}
williamr@4
   365
williamr@4
   366
template <class _InputIterator>
williamr@4
   367
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
williamr@4
   368
distance(const _InputIterator& __first, const _InputIterator& __last) {
williamr@4
   369
  return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));  
williamr@4
   370
}
williamr@4
   371
williamr@4
   372
williamr@4
   373
// fbp: those are being used for iterator/const_iterator definitions everywhere
williamr@4
   374
template <class _Tp>
williamr@4
   375
struct _Nonconst_traits;
williamr@4
   376
williamr@4
   377
template <class _Tp>
williamr@4
   378
struct _Const_traits {
williamr@4
   379
  typedef _Tp value_type;
williamr@4
   380
  typedef const _Tp&  reference;
williamr@4
   381
  typedef const _Tp*  pointer;
williamr@4
   382
  typedef _Nonconst_traits<_Tp> _Non_const_traits;
williamr@4
   383
};
williamr@4
   384
williamr@4
   385
template <class _Tp>
williamr@4
   386
struct _Nonconst_traits {
williamr@4
   387
  typedef _Tp value_type;
williamr@4
   388
  typedef _Tp& reference;
williamr@4
   389
  typedef _Tp* pointer;
williamr@4
   390
  typedef _Nonconst_traits<_Tp> _Non_const_traits;
williamr@4
   391
};
williamr@4
   392
williamr@4
   393
#  if defined (_STLP_BASE_TYPEDEF_BUG)
williamr@4
   394
// this workaround is needed for SunPro 4.0.1
williamr@4
   395
template <class _Traits>
williamr@4
   396
struct __cnst_traits_aux : private _Traits
williamr@4
   397
{
williamr@4
   398
  typedef typename _Traits::value_type value_type;
williamr@4
   399
};
williamr@4
   400
#  define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
williamr@4
   401
#  else
williamr@4
   402
#  define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
williamr@4
   403
#  endif
williamr@4
   404
williamr@4
   405
# if defined (_STLP_MSVC)
williamr@4
   406
// MSVC specific
williamr@4
   407
template <class _InputIterator, class _Dist>
williamr@4
   408
inline void  _STLP_CALL _Distance(_InputIterator __first, 
williamr@4
   409
		      _InputIterator __last, _Dist& __n) {
williamr@4
   410
  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@4
   411
}
williamr@4
   412
# endif
williamr@4
   413
williamr@4
   414
template <class _InputIter, class _Distance>
williamr@4
   415
_STLP_INLINE_LOOP void  _STLP_CALL __advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) {
williamr@4
   416
  while (__n--) ++__i;
williamr@4
   417
}
williamr@4
   418
williamr@4
   419
// fbp : added output iterator tag variant
williamr@4
   420
template <class _InputIter, class _Distance>
williamr@4
   421
_STLP_INLINE_LOOP void  _STLP_CALL __advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) {
williamr@4
   422
  while (__n--) ++__i;
williamr@4
   423
}
williamr@4
   424
williamr@4
   425
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
williamr@4
   426
template <class _ForwardIterator, class _Distance>
williamr@4
   427
_STLP_INLINE_LOOP void _STLP_CALL __advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) {
williamr@4
   428
    while (n--) ++i;
williamr@4
   429
}
williamr@4
   430
# endif
williamr@4
   431
williamr@4
   432
template <class _BidirectionalIterator, class _Distance>
williamr@4
   433
_STLP_INLINE_LOOP void _STLP_CALL __advance(_BidirectionalIterator& __i, _Distance __n, 
williamr@4
   434
                      const bidirectional_iterator_tag &) {
williamr@4
   435
  if (__n > 0)
williamr@4
   436
    while (__n--) ++__i;
williamr@4
   437
  else
williamr@4
   438
    while (__n++) --__i;
williamr@4
   439
}
williamr@4
   440
williamr@4
   441
template <class _RandomAccessIterator, class _Distance>
williamr@4
   442
inline void _STLP_CALL __advance(_RandomAccessIterator& __i, _Distance __n, 
williamr@4
   443
                      const random_access_iterator_tag &) {
williamr@4
   444
  __i += __n;
williamr@4
   445
}
williamr@4
   446
williamr@4
   447
template <class _InputIterator, class _Distance>
williamr@4
   448
inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) {
williamr@4
   449
  __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));
williamr@4
   450
}
williamr@4
   451
williamr@4
   452
_STLP_END_NAMESPACE
williamr@4
   453
williamr@4
   454
# if defined (_STLP_DEBUG) && ! defined (_STLP_DEBUG_H)
williamr@4
   455
#  include <stl/debug/_debug.h>
williamr@4
   456
# endif
williamr@4
   457
williamr@4
   458
#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
williamr@4
   459
williamr@4
   460
williamr@4
   461
// Local Variables:
williamr@4
   462
// mode:C++
williamr@4
   463
// End: