epoc32/include/stdapis/stlportv5/stl/_iterator.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_H
williamr@4
    31
#define _STLP_INTERNAL_ITERATOR_H
williamr@4
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
williamr@4
    34
#  include <stl/_iterator_base.h>
williamr@4
    35
#endif
williamr@4
    36
williamr@4
    37
_STLP_BEGIN_NAMESPACE
williamr@4
    38
williamr@4
    39
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
    40
// This is the new version of reverse_iterator, as defined in the
williamr@4
    41
//  draft C++ standard.  It relies on the iterator_traits template,
williamr@4
    42
//  which in turn relies on partial specialization.  The class
williamr@4
    43
//  reverse_bidirectional_iterator is no longer part of the draft
williamr@4
    44
//  standard, but it is retained for backward compatibility.
williamr@4
    45
williamr@4
    46
template <class _Iterator>
williamr@4
    47
class reverse_iterator :
williamr@4
    48
  public iterator<typename iterator_traits<_Iterator>::iterator_category,
williamr@4
    49
                  typename iterator_traits<_Iterator>::value_type,
williamr@4
    50
                  typename iterator_traits<_Iterator>::difference_type,
williamr@4
    51
                  typename iterator_traits<_Iterator>::pointer,
williamr@4
    52
                  typename iterator_traits<_Iterator>::reference> {
williamr@4
    53
protected:
williamr@4
    54
  _Iterator current;
williamr@4
    55
  typedef reverse_iterator<_Iterator> _Self;
williamr@4
    56
public:
williamr@4
    57
  typedef typename iterator_traits<_Iterator>::iterator_category  iterator_category;
williamr@4
    58
  typedef typename iterator_traits<_Iterator>::value_type value_type;
williamr@4
    59
  typedef typename iterator_traits<_Iterator>::difference_type difference_type;
williamr@4
    60
  typedef typename iterator_traits<_Iterator>::pointer pointer;
williamr@4
    61
  typedef typename iterator_traits<_Iterator>::reference reference;
williamr@4
    62
  typedef _Iterator iterator_type;
williamr@4
    63
public:
williamr@4
    64
  reverse_iterator() {}
williamr@4
    65
  explicit reverse_iterator(iterator_type __x) : current(__x) {}
williamr@4
    66
  reverse_iterator(const _Self& __x) : current(__x.current) {}
williamr@4
    67
  _Self& operator = (const _Self& __x) { current = __x.base(); return *this; }
williamr@4
    68
#  if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
    69
  template <class _Iter>
williamr@4
    70
  reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {}
williamr@4
    71
  template <class _Iter>
williamr@4
    72
  _Self& operator = (const reverse_iterator<_Iter>& __x) { current = __x.base(); return *this; }
williamr@4
    73
#  endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
    74
williamr@4
    75
  iterator_type base() const { return current; }
williamr@4
    76
  reference operator*() const {
williamr@4
    77
    _Iterator __tmp = current;
williamr@4
    78
    return *--__tmp;
williamr@4
    79
  }
williamr@4
    80
  _STLP_DEFINE_ARROW_OPERATOR
williamr@4
    81
  _Self& operator++() {
williamr@4
    82
    --current;
williamr@4
    83
    return *this;
williamr@4
    84
  }
williamr@4
    85
  _Self operator++(int) {
williamr@4
    86
    _Self __tmp = *this;
williamr@4
    87
    --current;
williamr@4
    88
    return __tmp;
williamr@4
    89
  }
williamr@4
    90
  _Self& operator--() {
williamr@4
    91
    ++current;
williamr@4
    92
    return *this;
williamr@4
    93
  }
williamr@4
    94
  _Self operator--(int) {
williamr@4
    95
    _Self __tmp = *this;
williamr@4
    96
    ++current;
williamr@4
    97
    return __tmp;
williamr@4
    98
  }
williamr@4
    99
williamr@4
   100
  _Self operator+(difference_type __n) const { return _Self(current - __n); }
williamr@4
   101
  _Self& operator+=(difference_type __n) {
williamr@4
   102
    current -= __n;
williamr@4
   103
    return *this;
williamr@4
   104
  }
williamr@4
   105
  _Self operator-(difference_type __n) const { return _Self(current + __n); }
williamr@4
   106
  _Self& operator-=(difference_type __n) {
williamr@4
   107
    current += __n;
williamr@4
   108
    return *this;
williamr@4
   109
  }
williamr@4
   110
  reference operator[](difference_type __n) const { return *(*this + __n); }
williamr@4
   111
};
williamr@4
   112
williamr@4
   113
template <class _Iterator>
williamr@4
   114
inline bool  _STLP_CALL operator==(const reverse_iterator<_Iterator>& __x,
williamr@4
   115
                                   const reverse_iterator<_Iterator>& __y)
williamr@4
   116
{ return __x.base() == __y.base(); }
williamr@4
   117
williamr@4
   118
template <class _Iterator>
williamr@4
   119
inline bool _STLP_CALL operator<(const reverse_iterator<_Iterator>& __x,
williamr@4
   120
                                 const reverse_iterator<_Iterator>& __y)
williamr@4
   121
{ return __y.base() < __x.base(); }
williamr@4
   122
williamr@4
   123
#  if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE)
williamr@4
   124
template <class _Iterator>
williamr@4
   125
inline bool _STLP_CALL operator!=(const reverse_iterator<_Iterator>& __x,
williamr@4
   126
                                  const reverse_iterator<_Iterator>& __y)
williamr@4
   127
{ return !(__x == __y); }
williamr@4
   128
williamr@4
   129
template <class _Iterator>
williamr@4
   130
inline bool _STLP_CALL operator>(const reverse_iterator<_Iterator>& __x,
williamr@4
   131
                                 const reverse_iterator<_Iterator>& __y)
williamr@4
   132
{ return __y < __x; }
williamr@4
   133
williamr@4
   134
template <class _Iterator>
williamr@4
   135
inline bool _STLP_CALL operator<=(const reverse_iterator<_Iterator>& __x,
williamr@4
   136
                                  const reverse_iterator<_Iterator>& __y)
williamr@4
   137
{ return !(__y < __x); }
williamr@4
   138
williamr@4
   139
template <class _Iterator>
williamr@4
   140
inline bool _STLP_CALL operator>=(const reverse_iterator<_Iterator>& __x,
williamr@4
   141
                                  const reverse_iterator<_Iterator>& __y)
williamr@4
   142
{ return !(__x < __y); }
williamr@4
   143
#  endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
williamr@4
   144
williamr@4
   145
template <class _Iterator>
williamr@4
   146
#  if defined (__SUNPRO_CC)
williamr@4
   147
inline ptrdiff_t _STLP_CALL
williamr@4
   148
#  else
williamr@4
   149
inline typename reverse_iterator<_Iterator>::difference_type _STLP_CALL
williamr@4
   150
#  endif
williamr@4
   151
operator-(const reverse_iterator<_Iterator>& __x,
williamr@4
   152
          const reverse_iterator<_Iterator>& __y)
williamr@4
   153
{ return __y.base() - __x.base(); }
williamr@4
   154
williamr@4
   155
template <class _Iterator, class _DifferenceType>
williamr@4
   156
inline reverse_iterator<_Iterator>  _STLP_CALL
williamr@4
   157
operator+(_DifferenceType n,const reverse_iterator<_Iterator>& x)
williamr@4
   158
{ return x.operator+(n); }
williamr@4
   159
#endif
williamr@4
   160
williamr@4
   161
template <class _Container>
williamr@4
   162
class back_insert_iterator
williamr@4
   163
  : public iterator<output_iterator_tag, void, void, void, void> {
williamr@4
   164
  typedef back_insert_iterator<_Container> _Self;
williamr@4
   165
protected:
williamr@4
   166
  //c is a Standard name (24.4.2.1), do no make it STLport naming convention compliant.
williamr@4
   167
  _Container *container;
williamr@4
   168
public:
williamr@4
   169
  typedef _Container          container_type;
williamr@4
   170
  typedef output_iterator_tag iterator_category;
williamr@4
   171
williamr@4
   172
  explicit back_insert_iterator(_Container& __x) : container(&__x) {}
williamr@4
   173
williamr@4
   174
  _Self& operator=(const _Self& __other) {
williamr@4
   175
    container = __other.container;
williamr@4
   176
    return *this;
williamr@4
   177
  }
williamr@4
   178
  _Self& operator=(const typename _Container::value_type& __val) {
williamr@4
   179
    container->push_back(__val);
williamr@4
   180
    return *this;
williamr@4
   181
  }
williamr@4
   182
  _Self& operator*() { return *this; }
williamr@4
   183
  _Self& operator++() { return *this; }
williamr@4
   184
  _Self  operator++(int) { return *this; }
williamr@4
   185
};
williamr@4
   186
williamr@4
   187
template <class _Container>
williamr@4
   188
inline back_insert_iterator<_Container>  _STLP_CALL back_inserter(_Container& __x)
williamr@4
   189
{ return back_insert_iterator<_Container>(__x); }
williamr@4
   190
williamr@4
   191
template <class _Container>
williamr@4
   192
class front_insert_iterator
williamr@4
   193
  : public iterator<output_iterator_tag, void, void, void, void> {
williamr@4
   194
  typedef front_insert_iterator<_Container> _Self;
williamr@4
   195
protected:
williamr@4
   196
  //c is a Standard name (24.4.2.3), do no make it STLport naming convention compliant.
williamr@4
   197
  _Container *container;
williamr@4
   198
public:
williamr@4
   199
  typedef _Container          container_type;
williamr@4
   200
  typedef output_iterator_tag iterator_category;
williamr@4
   201
  explicit front_insert_iterator(_Container& __x) : container(&__x) {}
williamr@4
   202
williamr@4
   203
  _Self& operator=(const _Self& __other) {
williamr@4
   204
    container = __other.container;
williamr@4
   205
    return *this;
williamr@4
   206
  }
williamr@4
   207
  _Self& operator=(const typename _Container::value_type& __val) {
williamr@4
   208
    container->push_front(__val);
williamr@4
   209
    return *this;
williamr@4
   210
  }
williamr@4
   211
  _Self& operator*() { return *this; }
williamr@4
   212
  _Self& operator++() { return *this; }
williamr@4
   213
  _Self  operator++(int) { return *this; }
williamr@4
   214
};
williamr@4
   215
williamr@4
   216
template <class _Container>
williamr@4
   217
inline front_insert_iterator<_Container>  _STLP_CALL front_inserter(_Container& __x)
williamr@4
   218
{ return front_insert_iterator<_Container>(__x); }
williamr@4
   219
williamr@4
   220
template <class _Container>
williamr@4
   221
class insert_iterator
williamr@4
   222
  : public iterator<output_iterator_tag, void, void, void, void> {
williamr@4
   223
  typedef insert_iterator<_Container> _Self;
williamr@4
   224
protected:
williamr@4
   225
  //container is a Standard name (24.4.2.5), do no make it STLport naming convention compliant.
williamr@4
   226
  _Container *container;
williamr@4
   227
  typename _Container::iterator _M_iter;
williamr@4
   228
public:
williamr@4
   229
  typedef _Container          container_type;
williamr@4
   230
  typedef output_iterator_tag iterator_category;
williamr@4
   231
  insert_iterator(_Container& __x, typename _Container::iterator __i)
williamr@4
   232
    : container(&__x), _M_iter(__i) {}
williamr@4
   233
williamr@4
   234
  _Self& operator=(_Self const& __other) {
williamr@4
   235
    container = __other.container;
williamr@4
   236
    _M_iter = __other._M_iter;
williamr@4
   237
    return *this;
williamr@4
   238
  }
williamr@4
   239
  _Self& operator=(const typename _Container::value_type& __val) {
williamr@4
   240
    _M_iter = container->insert(_M_iter, __val);
williamr@4
   241
    ++_M_iter;
williamr@4
   242
    return *this;
williamr@4
   243
  }
williamr@4
   244
  _Self& operator*() { return *this; }
williamr@4
   245
  _Self& operator++() { return *this; }
williamr@4
   246
  _Self& operator++(int) { return *this; }
williamr@4
   247
};
williamr@4
   248
williamr@4
   249
template <class _Container, class _Iterator>
williamr@4
   250
inline insert_iterator<_Container>  _STLP_CALL
williamr@4
   251
inserter(_Container& __x, _Iterator __i) {
williamr@4
   252
  typedef typename _Container::iterator __iter;
williamr@4
   253
  return insert_iterator<_Container>(__x, __iter(__i));
williamr@4
   254
}
williamr@4
   255
williamr@4
   256
_STLP_END_NAMESPACE
williamr@4
   257
williamr@4
   258
#if ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@4
   259
#  include <stl/_iterator_old.h>
williamr@4
   260
#endif
williamr@4
   261
williamr@4
   262
#endif /* _STLP_INTERNAL_ITERATOR_H */
williamr@4
   263
williamr@4
   264
// Local Variables:
williamr@4
   265
// mode:C++
williamr@4
   266
// End: