test_iterators.h revision 171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155
1aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#ifndef ITERATORS_H
2aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#define ITERATORS_H
3aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
4aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#include <iterator>
5aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
6aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnantclass output_iterator
827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant{
927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    It it_;
1027405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
1127405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    template <class U> friend class output_iterator;
1227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnantpublic:
1327405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef          std::output_iterator_tag                  iterator_category;
14304c31b355bc3f74a614535104e63abc3824d891Marshall Clow    typedef void                                               value_type;
1527405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
1627405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef It                                                 pointer;
1727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
1827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
1927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    It base() const {return it_;}
2027405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
21ba1920fe4b98e61fe47b432689c98b999f5139e3Marshall Clow    output_iterator () {}
2227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    explicit output_iterator(It it) : it_(it) {}
2327405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    template <class U>
2427405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant        output_iterator(const output_iterator<U>& u) :it_(u.it_) {}
2527405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
2627405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    reference operator*() const {return *it_;}
2727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
2827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    output_iterator& operator++() {++it_; return *this;}
2927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    output_iterator operator++(int)
3027405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant        {output_iterator tmp(*this); ++(*this); return tmp;}
3127405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant};
3227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
3327405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnanttemplate <class It>
34aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass input_iterator
35aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
36aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
37aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
38aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class input_iterator;
39aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
40aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::input_iterator_tag                   iterator_category;
41aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
42aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
43aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
44aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
45aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
46aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
47aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
48aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator() : it_() {}
49aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit input_iterator(It it) : it_(it) {}
50aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
51aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
52aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
53aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
54aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
55aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
56aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator& operator++() {++it_; return *this;}
57aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator operator++(int)
58aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {input_iterator tmp(*this); ++(*this); return tmp;}
59aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
60aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator==(const input_iterator& x, const input_iterator& y)
61aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return x.it_ == y.it_;}
62aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator!=(const input_iterator& x, const input_iterator& y)
63aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return !(x == y);}
64aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
65aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
66aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
67aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
68aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
69aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const input_iterator<T>& x, const input_iterator<U>& y)
70aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
71aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
72aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
73aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
74aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
75aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
76aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
77aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const input_iterator<T>& x, const input_iterator<U>& y)
78aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
79aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
80aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
81aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
82aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
83aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass forward_iterator
84aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
85aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
86aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
87aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class forward_iterator;
88aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
89aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::forward_iterator_tag                 iterator_category;
90aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
91aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
92aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
93aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
94aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
95aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
96aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
97aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator() : it_() {}
98aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit forward_iterator(It it) : it_(it) {}
99aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
100aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
101aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
102aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
103aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
104aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
105aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator& operator++() {++it_; return *this;}
106aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator operator++(int)
107aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {forward_iterator tmp(*this); ++(*this); return tmp;}
108aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
109aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator==(const forward_iterator& x, const forward_iterator& y)
110aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return x.it_ == y.it_;}
111aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
112aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return !(x == y);}
113aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
114aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
115aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
116aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
117aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
118aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
119aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
120aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
121aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
122aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
123aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
124aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
125aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
126aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
127aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
128aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
129aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
130aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
131aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
132aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass bidirectional_iterator
133aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
134aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
135aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
136aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class bidirectional_iterator;
137aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
138aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::bidirectional_iterator_tag           iterator_category;
139aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
140aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
141aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
142aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
143aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
144aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
145aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
146aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator() : it_() {}
147aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit bidirectional_iterator(It it) : it_(it) {}
148aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
149aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
150aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
151aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
152aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
153aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
154aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator& operator++() {++it_; return *this;}
155aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator operator++(int)
156aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {bidirectional_iterator tmp(*this); ++(*this); return tmp;}
157aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
158aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator& operator--() {--it_; return *this;}
159aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator operator--(int)
160aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {bidirectional_iterator tmp(*this); --(*this); return tmp;}
161aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
162aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
163aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
164aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
165aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
166aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
167aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
168aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
169aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
170aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
171aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
172aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
173aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
174aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
175aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
176aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
177aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
178aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
179aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
180aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass random_access_iterator
181aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
182aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
183aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
184aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class random_access_iterator;
185aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
186aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::random_access_iterator_tag           iterator_category;
187aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
188aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
189aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
190aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
191aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
192aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
193aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
194aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator() : it_() {}
195aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit random_access_iterator(It it) : it_(it) {}
196aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant   template <class U>
197aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
198aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
199aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
200aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
201aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
202aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator++() {++it_; return *this;}
203aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator++(int)
204aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); ++(*this); return tmp;}
205aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
206aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator--() {--it_; return *this;}
207aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator--(int)
208aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); --(*this); return tmp;}
209aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
210aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;}
211aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator+(difference_type n) const
212aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); tmp += n; return tmp;}
213aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend random_access_iterator operator+(difference_type n, random_access_iterator x)
214aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {x += n; return x;}
215aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator-=(difference_type n) {return *this += -n;}
216aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator-(difference_type n) const
217aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); tmp -= n; return tmp;}
218aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
219aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator[](difference_type n) const {return it_[n];}
220aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
221aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
222aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
223aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
224aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
225aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
226aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
227aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
228aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
229aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
230aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
231aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
232aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
233aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
234aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
235aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
236aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
237aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
238aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
239aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
240aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
241aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
242aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
243aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() < y.base();
244aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
245aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
246aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
247aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
248aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
249aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
250aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
251aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(y < x);
252aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
253aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
254aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
255aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
256aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
257aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
258aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
259aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return y < x;
260aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
261aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
262aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
263aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
264aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
265aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
266aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
267aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x < y);
268aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
269aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
270aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
271aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
272aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttypename std::iterator_traits<T>::difference_type
273aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
274aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
275aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() - y.base();
276aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
277aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
2788226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2798226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(output_iterator<Iter> i) { return i.base(); }
2808226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2818226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2828226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(input_iterator<Iter> i) { return i.base(); }
2838226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2848226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2858226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(forward_iterator<Iter> i) { return i.base(); }
2868226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2878226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2888226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(bidirectional_iterator<Iter> i) { return i.base(); }
2898226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2908226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2918226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(random_access_iterator<Iter> i) { return i.base(); }
2928226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
293171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnanttemplate <class Iter>    // everything else
2948226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(Iter i) { return i; }
2958226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
296bbd8086ee3448f38026219777112e787fde8504dHoward Hinnant#endif  // ITERATORS_H
297