test_iterators.h revision 27405f91a83821e659963bec5f3e71be7e4c08e6
1#ifndef ITERATORS_H
2#define ITERATORS_H
3
4#include <iterator>
5
6template <class It>
7class output_iterator
8{
9    It it_;
10
11    template <class U> friend class output_iterator;
12public:
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;
16    typedef It                                                 pointer;
17    typedef typename std::iterator_traits<It>::reference       reference;
18
19    It base() const {return it_;}
20
21    explicit output_iterator(It it) : it_(it) {}
22    template <class U>
23        output_iterator(const output_iterator<U>& u) :it_(u.it_) {}
24
25    reference operator*() const {return *it_;}
26
27    output_iterator& operator++() {++it_; return *this;}
28    output_iterator operator++(int)
29        {output_iterator tmp(*this); ++(*this); return tmp;}
30};
31
32template <class It>
33class input_iterator
34{
35    It it_;
36
37    template <class U> friend class input_iterator;
38public:
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;
42    typedef It                                                 pointer;
43    typedef typename std::iterator_traits<It>::reference       reference;
44
45    It base() const {return it_;}
46
47    input_iterator() : it_() {}
48    explicit input_iterator(It it) : it_(it) {}
49    template <class U>
50        input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
51
52    reference operator*() const {return *it_;}
53    pointer operator->() const {return it_;}
54
55    input_iterator& operator++() {++it_; return *this;}
56    input_iterator operator++(int)
57        {input_iterator tmp(*this); ++(*this); return tmp;}
58
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)
62        {return !(x == y);}
63};
64
65template <class T, class U>
66inline
67bool
68operator==(const input_iterator<T>& x, const input_iterator<U>& y)
69{
70    return x.base() == y.base();
71}
72
73template <class T, class U>
74inline
75bool
76operator!=(const input_iterator<T>& x, const input_iterator<U>& y)
77{
78    return !(x == y);
79}
80
81template <class It>
82class forward_iterator
83{
84    It it_;
85
86    template <class U> friend class forward_iterator;
87public:
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;
91    typedef It                                                 pointer;
92    typedef typename std::iterator_traits<It>::reference       reference;
93
94    It base() const {return it_;}
95
96    forward_iterator() : it_() {}
97    explicit forward_iterator(It it) : it_(it) {}
98    template <class U>
99        forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
100
101    reference operator*() const {return *it_;}
102    pointer operator->() const {return it_;}
103
104    forward_iterator& operator++() {++it_; return *this;}
105    forward_iterator operator++(int)
106        {forward_iterator tmp(*this); ++(*this); return tmp;}
107
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)
111        {return !(x == y);}
112};
113
114template <class T, class U>
115inline
116bool
117operator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
118{
119    return x.base() == y.base();
120}
121
122template <class T, class U>
123inline
124bool
125operator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
126{
127    return !(x == y);
128}
129
130template <class It>
131class bidirectional_iterator
132{
133    It it_;
134
135    template <class U> friend class bidirectional_iterator;
136public:
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;
140    typedef It                                                 pointer;
141    typedef typename std::iterator_traits<It>::reference       reference;
142
143    It base() const {return it_;}
144
145    bidirectional_iterator() : it_() {}
146    explicit bidirectional_iterator(It it) : it_(it) {}
147    template <class U>
148        bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
149
150    reference operator*() const {return *it_;}
151    pointer operator->() const {return it_;}
152
153    bidirectional_iterator& operator++() {++it_; return *this;}
154    bidirectional_iterator operator++(int)
155        {bidirectional_iterator tmp(*this); ++(*this); return tmp;}
156
157    bidirectional_iterator& operator--() {--it_; return *this;}
158    bidirectional_iterator operator--(int)
159        {bidirectional_iterator tmp(*this); --(*this); return tmp;}
160};
161
162template <class T, class U>
163inline
164bool
165operator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
166{
167    return x.base() == y.base();
168}
169
170template <class T, class U>
171inline
172bool
173operator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
174{
175    return !(x == y);
176}
177
178template <class It>
179class random_access_iterator
180{
181    It it_;
182
183    template <class U> friend class random_access_iterator;
184public:
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;
188    typedef It                                                 pointer;
189    typedef typename std::iterator_traits<It>::reference       reference;
190
191    It base() const {return it_;}
192
193    random_access_iterator() : it_() {}
194    explicit random_access_iterator(It it) : it_(it) {}
195   template <class U>
196        random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
197
198    reference operator*() const {return *it_;}
199    pointer operator->() const {return it_;}
200
201    random_access_iterator& operator++() {++it_; return *this;}
202    random_access_iterator operator++(int)
203        {random_access_iterator tmp(*this); ++(*this); return tmp;}
204
205    random_access_iterator& operator--() {--it_; return *this;}
206    random_access_iterator operator--(int)
207        {random_access_iterator tmp(*this); --(*this); return tmp;}
208
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)
213        {x += n; return 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;}
217
218    reference operator[](difference_type n) const {return it_[n];}
219};
220
221template <class T, class U>
222inline
223bool
224operator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
225{
226    return x.base() == y.base();
227}
228
229template <class T, class U>
230inline
231bool
232operator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
233{
234    return !(x == y);
235}
236
237template <class T, class U>
238inline
239bool
240operator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
241{
242    return x.base() < y.base();
243}
244
245template <class T, class U>
246inline
247bool
248operator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
249{
250    return !(y < x);
251}
252
253template <class T, class U>
254inline
255bool
256operator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
257{
258    return y < x;
259}
260
261template <class T, class U>
262inline
263bool
264operator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
265{
266    return !(x < y);
267}
268
269template <class T, class U>
270inline
271typename std::iterator_traits<T>::difference_type
272operator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
273{
274    return x.base() - y.base();
275}
276
277#endif
278