epoc32/include/stdapis/stlport/stl/_iterator.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
permissions -rw-r--r--
Final list of Symbian^2 public API header files
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@2
    12
 * Copyright (c) 1999 
williamr@2
    13
 * Boris Fomitchev
williamr@2
    14
 *
williamr@2
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    16
 * or implied. Any use is at your own risk.
williamr@2
    17
 *
williamr@2
    18
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@2
    19
 * without fee, provided the above notices are retained on all copies.
williamr@2
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    21
 * provided the above notices are retained, and a notice that the code was
williamr@2
    22
 * modified is included with the above copyright notice.
williamr@2
    23
 *
williamr@2
    24
 */
williamr@2
    25
williamr@2
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@2
    27
 *   You should not attempt to use it directly.
williamr@2
    28
 */
williamr@2
    29
williamr@2
    30
#ifndef _STLP_INTERNAL_ITERATOR_H
williamr@2
    31
#define _STLP_INTERNAL_ITERATOR_H
williamr@2
    32
williamr@2
    33
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
williamr@2
    34
# include <stl/_iterator_base.h>
williamr@2
    35
#endif
williamr@2
    36
williamr@2
    37
_STLP_BEGIN_NAMESPACE
williamr@2
    38
williamr@2
    39
#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
williamr@2
    40
// This is the new version of reverse_iterator, as defined in the
williamr@2
    41
//  draft C++ standard.  It relies on the iterator_traits template,
williamr@2
    42
//  which in turn relies on partial specialization.  The class
williamr@2
    43
//  reverse_bidirectional_iterator is no longer part of the draft
williamr@2
    44
//  standard, but it is retained for backward compatibility.
williamr@2
    45
williamr@2
    46
template <class _Iterator>
williamr@2
    47
class reverse_iterator : 
williamr@2
    48
  public iterator<typename iterator_traits<_Iterator>::iterator_category,
williamr@2
    49
                  typename iterator_traits<_Iterator>::value_type,
williamr@2
    50
                  typename iterator_traits<_Iterator>::difference_type,
williamr@2
    51
                  typename iterator_traits<_Iterator>::pointer,
williamr@2
    52
                  typename iterator_traits<_Iterator>::reference>
williamr@2
    53
{
williamr@2
    54
protected:
williamr@2
    55
  _Iterator current;
williamr@2
    56
  typedef reverse_iterator<_Iterator> _Self;
williamr@2
    57
public:
williamr@2
    58
  typedef typename iterator_traits<_Iterator>::iterator_category  iterator_category;
williamr@2
    59
  typedef typename iterator_traits<_Iterator>::value_type value_type;
williamr@2
    60
  typedef typename iterator_traits<_Iterator>::difference_type difference_type;
williamr@2
    61
  typedef typename iterator_traits<_Iterator>::pointer pointer;
williamr@2
    62
  typedef typename iterator_traits<_Iterator>::reference reference;
williamr@2
    63
  typedef _Iterator iterator_type;
williamr@2
    64
public:
williamr@2
    65
  reverse_iterator() {}
williamr@2
    66
  explicit reverse_iterator(iterator_type __x) : current(__x) {}
williamr@2
    67
  reverse_iterator(const _Self& __x) : current(__x.current) {}
williamr@2
    68
  _Self& operator = (const _Self& __x) { current = __x.base(); return *this; } 
williamr@2
    69
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
    70
  template <class _Iter>
williamr@2
    71
  reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {}
williamr@2
    72
  template <class _Iter>
williamr@2
    73
  _Self& operator = (const reverse_iterator<_Iter>& __x) { current = __x.base(); return *this; } 
williamr@2
    74
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
    75
    
williamr@2
    76
  iterator_type base() const { return current; }
williamr@2
    77
  reference operator*() const {
williamr@2
    78
    _Iterator __tmp = current;
williamr@2
    79
    return *--__tmp;
williamr@2
    80
  }
williamr@2
    81
  _STLP_DEFINE_ARROW_OPERATOR
williamr@2
    82
  _Self& operator++() {
williamr@2
    83
    --current;
williamr@2
    84
    return *this;
williamr@2
    85
  }
williamr@2
    86
  _Self operator++(int) {
williamr@2
    87
    _Self __tmp = *this;
williamr@2
    88
    --current;
williamr@2
    89
    return __tmp;
williamr@2
    90
  }
williamr@2
    91
  _Self& operator--() {
williamr@2
    92
    ++current;
williamr@2
    93
    return *this;
williamr@2
    94
  }
williamr@2
    95
  _Self operator--(int) {
williamr@2
    96
    _Self __tmp = *this;
williamr@2
    97
    ++current;
williamr@2
    98
    return __tmp;
williamr@2
    99
  }
williamr@2
   100
williamr@2
   101
  _Self operator+(difference_type __n) const {
williamr@2
   102
    return _Self(current - __n);
williamr@2
   103
  }
williamr@2
   104
  _Self& operator+=(difference_type __n) {
williamr@2
   105
    current -= __n;
williamr@2
   106
    return *this;
williamr@2
   107
  }
williamr@2
   108
  _Self operator-(difference_type __n) const {
williamr@2
   109
    return _Self(current + __n);
williamr@2
   110
  }
williamr@2
   111
  _Self& operator-=(difference_type __n) {
williamr@2
   112
    current += __n;
williamr@2
   113
    return *this;
williamr@2
   114
  }
williamr@2
   115
  reference operator[](difference_type __n) const { return *(*this + __n); }  
williamr@2
   116
}; 
williamr@2
   117
 
williamr@2
   118
template <class _Iterator>
williamr@2
   119
inline bool  _STLP_CALL operator==(const reverse_iterator<_Iterator>& __x, 
williamr@2
   120
                       const reverse_iterator<_Iterator>& __y) {
williamr@2
   121
  return __x.base() == __y.base();
williamr@2
   122
}
williamr@2
   123
williamr@2
   124
template <class _Iterator>
williamr@2
   125
inline bool _STLP_CALL operator<(const reverse_iterator<_Iterator>& __x, 
williamr@2
   126
                      const reverse_iterator<_Iterator>& __y) {
williamr@2
   127
  return __y.base() < __x.base();
williamr@2
   128
}
williamr@2
   129
williamr@2
   130
#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
williamr@2
   131
williamr@2
   132
template <class _Iterator>
williamr@2
   133
inline bool _STLP_CALL operator!=(const reverse_iterator<_Iterator>& __x, 
williamr@2
   134
                       const reverse_iterator<_Iterator>& __y) {
williamr@2
   135
  return !(__x == __y);
williamr@2
   136
}
williamr@2
   137
williamr@2
   138
template <class _Iterator>
williamr@2
   139
inline bool _STLP_CALL operator>(const reverse_iterator<_Iterator>& __x, 
williamr@2
   140
                      const reverse_iterator<_Iterator>& __y) {
williamr@2
   141
  return __y < __x;
williamr@2
   142
}
williamr@2
   143
williamr@2
   144
template <class _Iterator>
williamr@2
   145
inline bool _STLP_CALL operator<=(const reverse_iterator<_Iterator>& __x, 
williamr@2
   146
                       const reverse_iterator<_Iterator>& __y) {
williamr@2
   147
  return !(__y < __x);
williamr@2
   148
}
williamr@2
   149
williamr@2
   150
template <class _Iterator>
williamr@2
   151
inline bool _STLP_CALL operator>=(const reverse_iterator<_Iterator>& __x, 
williamr@2
   152
                      const reverse_iterator<_Iterator>& __y) {
williamr@2
   153
  return !(__x < __y);
williamr@2
   154
}
williamr@2
   155
williamr@2
   156
#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
williamr@2
   157
williamr@2
   158
template <class _Iterator>
williamr@2
   159
# ifdef __SUNPRO_CC
williamr@2
   160
inline ptrdiff_t _STLP_CALL
williamr@2
   161
# else
williamr@2
   162
inline typename reverse_iterator<_Iterator>::difference_type _STLP_CALL
williamr@2
   163
# endif
williamr@2
   164
operator-(const reverse_iterator<_Iterator>& __x, 
williamr@2
   165
          const reverse_iterator<_Iterator>& __y) {
williamr@2
   166
  return __y.base() - __x.base();
williamr@2
   167
}
williamr@2
   168
williamr@2
   169
template <class _Iterator, class _DifferenceType>
williamr@2
   170
inline reverse_iterator<_Iterator>  _STLP_CALL
williamr@2
   171
operator+(_DifferenceType n,const reverse_iterator<_Iterator>& x) {
williamr@2
   172
  return x.operator+(n);
williamr@2
   173
}
williamr@2
   174
williamr@2
   175
# endif
williamr@2
   176
williamr@2
   177
template <class _Container>
williamr@2
   178
class back_insert_iterator 
williamr@2
   179
  : public iterator<output_iterator_tag,void,void,void,void>
williamr@2
   180
{
williamr@2
   181
protected:
williamr@2
   182
  _Container* container;
williamr@2
   183
public:
williamr@2
   184
  typedef _Container          container_type;
williamr@2
   185
  typedef output_iterator_tag iterator_category;
williamr@2
   186
williamr@2
   187
  explicit back_insert_iterator(_Container& __x) : container(&__x) {}
williamr@2
   188
  back_insert_iterator<_Container>&
williamr@2
   189
  operator=(const typename _Container::value_type& __val) { 
williamr@2
   190
    container->push_back(__val);
williamr@2
   191
    return *this;
williamr@2
   192
  }
williamr@2
   193
  back_insert_iterator<_Container>& operator*() { return *this; }
williamr@2
   194
  back_insert_iterator<_Container>& operator++() { return *this; }
williamr@2
   195
  back_insert_iterator<_Container>  operator++(int) { return *this; }
williamr@2
   196
};
williamr@2
   197
williamr@2
   198
template <class _Container>
williamr@2
   199
inline back_insert_iterator<_Container>  _STLP_CALL back_inserter(_Container& __x) {
williamr@2
   200
  return back_insert_iterator<_Container>(__x);
williamr@2
   201
}
williamr@2
   202
williamr@2
   203
template <class _Container>
williamr@2
   204
class front_insert_iterator 
williamr@2
   205
  : public iterator<output_iterator_tag,void,void,void,void>
williamr@2
   206
{
williamr@2
   207
protected:
williamr@2
   208
  _Container* container;
williamr@2
   209
public:
williamr@2
   210
  typedef _Container          container_type;
williamr@2
   211
  typedef output_iterator_tag iterator_category;
williamr@2
   212
  explicit front_insert_iterator(_Container& __x) : container(&__x) {}
williamr@2
   213
  front_insert_iterator<_Container>&
williamr@2
   214
  operator=(const typename _Container::value_type& __val) { 
williamr@2
   215
    container->push_front(__val);
williamr@2
   216
    return *this;
williamr@2
   217
  }
williamr@2
   218
  front_insert_iterator<_Container>& operator*() { return *this; }
williamr@2
   219
  front_insert_iterator<_Container>& operator++() { return *this; }
williamr@2
   220
  front_insert_iterator<_Container>& operator++(int) { return *this; }
williamr@2
   221
};
williamr@2
   222
williamr@2
   223
template <class _Container>
williamr@2
   224
inline front_insert_iterator<_Container>  _STLP_CALL front_inserter(_Container& __x) {
williamr@2
   225
  return front_insert_iterator<_Container>(__x);
williamr@2
   226
}
williamr@2
   227
williamr@2
   228
template <class _Container>
williamr@2
   229
class insert_iterator 
williamr@2
   230
  : public iterator<output_iterator_tag,void,void,void,void>
williamr@2
   231
{
williamr@2
   232
protected:
williamr@2
   233
  _Container* container;
williamr@2
   234
  typename _Container::iterator iter;
williamr@2
   235
public:
williamr@2
   236
  typedef _Container          container_type;
williamr@2
   237
  typedef output_iterator_tag iterator_category;
williamr@2
   238
  insert_iterator(_Container& __x, typename _Container::iterator __i) 
williamr@2
   239
    : container(&__x), iter(__i) {}
williamr@2
   240
  insert_iterator<_Container>&
williamr@2
   241
  operator=(const typename _Container::value_type& __val) { 
williamr@2
   242
    iter = container->insert(iter, __val);
williamr@2
   243
    ++iter;
williamr@2
   244
    return *this;
williamr@2
   245
  }
williamr@2
   246
  insert_iterator<_Container>& operator*() { return *this; }
williamr@2
   247
  insert_iterator<_Container>& operator++() { return *this; }
williamr@2
   248
  insert_iterator<_Container>& operator++(int) { return *this; }
williamr@2
   249
};
williamr@2
   250
williamr@2
   251
template <class _Container, class _Iterator>
williamr@2
   252
inline insert_iterator<_Container>  _STLP_CALL
williamr@2
   253
inserter(_Container& __x, _Iterator __i)
williamr@2
   254
{
williamr@2
   255
  typedef typename _Container::iterator __iter;
williamr@2
   256
  return insert_iterator<_Container>(__x, __iter(__i));
williamr@2
   257
}
williamr@2
   258
williamr@2
   259
_STLP_END_NAMESPACE
williamr@2
   260
williamr@2
   261
#if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@2
   262
# include <stl/_iterator_old.h>
williamr@2
   263
#endif /* __NO_PARTIAL_SPEC || ANACHRONISMS */
williamr@2
   264
williamr@2
   265
#endif /* _STLP_INTERNAL_ITERATOR_H */
williamr@2
   266
williamr@2
   267
// Local Variables:
williamr@2
   268
// mode:C++
williamr@2
   269
// End: