11
template <class U> friend class output_iterator;
13
typedef std::output_iterator_tag iterator_category;
14
typedef typename std::iterator_traits<It>::value_type value_type;
15
typedef typename std::iterator_traits<It>::difference_type difference_type;
17
typedef typename std::iterator_traits<It>::reference reference;
19
It base() const {return it_;}
21
explicit output_iterator(It it) : it_(it) {}
23
output_iterator(const output_iterator<U>& u) :it_(u.it_) {}
25
reference operator*() const {return *it_;}
27
output_iterator& operator++() {++it_; return *this;}
28
output_iterator operator++(int)
29
{output_iterator tmp(*this); ++(*this); return tmp;}
37
template <class U> friend class input_iterator;
39
typedef std::input_iterator_tag iterator_category;
40
typedef typename std::iterator_traits<It>::value_type value_type;
41
typedef typename std::iterator_traits<It>::difference_type difference_type;
43
typedef typename std::iterator_traits<It>::reference reference;
45
It base() const {return it_;}
47
input_iterator() : it_() {}
48
explicit input_iterator(It it) : it_(it) {}
50
input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
52
reference operator*() const {return *it_;}
53
pointer operator->() const {return it_;}
55
input_iterator& operator++() {++it_; return *this;}
56
input_iterator operator++(int)
57
{input_iterator tmp(*this); ++(*this); return tmp;}
59
friend bool operator==(const input_iterator& x, const input_iterator& y)
60
{return x.it_ == y.it_;}
61
friend bool operator!=(const input_iterator& x, const input_iterator& y)
65
template <class T, class U>
68
operator==(const input_iterator<T>& x, const input_iterator<U>& y)
70
return x.base() == y.base();
73
template <class T, class U>
76
operator!=(const input_iterator<T>& x, const input_iterator<U>& y)
82
class forward_iterator
86
template <class U> friend class forward_iterator;
88
typedef std::forward_iterator_tag iterator_category;
89
typedef typename std::iterator_traits<It>::value_type value_type;
90
typedef typename std::iterator_traits<It>::difference_type difference_type;
92
typedef typename std::iterator_traits<It>::reference reference;
94
It base() const {return it_;}
96
forward_iterator() : it_() {}
97
explicit forward_iterator(It it) : it_(it) {}
99
forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
101
reference operator*() const {return *it_;}
102
pointer operator->() const {return it_;}
104
forward_iterator& operator++() {++it_; return *this;}
105
forward_iterator operator++(int)
106
{forward_iterator tmp(*this); ++(*this); return tmp;}
108
friend bool operator==(const forward_iterator& x, const forward_iterator& y)
109
{return x.it_ == y.it_;}
110
friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
114
template <class T, class U>
117
operator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
119
return x.base() == y.base();
122
template <class T, class U>
125
operator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
131
class bidirectional_iterator
135
template <class U> friend class bidirectional_iterator;
137
typedef std::bidirectional_iterator_tag iterator_category;
138
typedef typename std::iterator_traits<It>::value_type value_type;
139
typedef typename std::iterator_traits<It>::difference_type difference_type;
141
typedef typename std::iterator_traits<It>::reference reference;
143
It base() const {return it_;}
145
bidirectional_iterator() : it_() {}
146
explicit bidirectional_iterator(It it) : it_(it) {}
148
bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
150
reference operator*() const {return *it_;}
151
pointer operator->() const {return it_;}
153
bidirectional_iterator& operator++() {++it_; return *this;}
154
bidirectional_iterator operator++(int)
155
{bidirectional_iterator tmp(*this); ++(*this); return tmp;}
157
bidirectional_iterator& operator--() {--it_; return *this;}
158
bidirectional_iterator operator--(int)
159
{bidirectional_iterator tmp(*this); --(*this); return tmp;}
162
template <class T, class U>
165
operator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
167
return x.base() == y.base();
170
template <class T, class U>
173
operator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
179
class random_access_iterator
183
template <class U> friend class random_access_iterator;
185
typedef std::random_access_iterator_tag iterator_category;
186
typedef typename std::iterator_traits<It>::value_type value_type;
187
typedef typename std::iterator_traits<It>::difference_type difference_type;
189
typedef typename std::iterator_traits<It>::reference reference;
191
It base() const {return it_;}
193
random_access_iterator() : it_() {}
194
explicit random_access_iterator(It it) : it_(it) {}
196
random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
198
reference operator*() const {return *it_;}
199
pointer operator->() const {return it_;}
201
random_access_iterator& operator++() {++it_; return *this;}
202
random_access_iterator operator++(int)
203
{random_access_iterator tmp(*this); ++(*this); return tmp;}
205
random_access_iterator& operator--() {--it_; return *this;}
206
random_access_iterator operator--(int)
207
{random_access_iterator tmp(*this); --(*this); return tmp;}
209
random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;}
210
random_access_iterator operator+(difference_type n) const
211
{random_access_iterator tmp(*this); tmp += n; return tmp;}
212
friend random_access_iterator operator+(difference_type n, random_access_iterator x)
214
random_access_iterator& operator-=(difference_type n) {return *this += -n;}
215
random_access_iterator operator-(difference_type n) const
216
{random_access_iterator tmp(*this); tmp -= n; return tmp;}
218
reference operator[](difference_type n) const {return it_[n];}
221
template <class T, class U>
224
operator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
226
return x.base() == y.base();
229
template <class T, class U>
232
operator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
237
template <class T, class U>
240
operator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
242
return x.base() < y.base();
245
template <class T, class U>
248
operator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
253
template <class T, class U>
256
operator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
261
template <class T, class U>
264
operator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
269
template <class T, class U>
271
typename std::iterator_traits<T>::difference_type
272
operator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
274
return x.base() - y.base();
277
#endif // ITERATORS_H