198760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//===----------------------------------------------------------------------===//
298760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//
398760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//                     The LLVM Compiler Infrastructure
498760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//
598760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
698760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// Source Licenses. See LICENSE.TXT for details.
798760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//
898760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//===----------------------------------------------------------------------===//
998760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow
10aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#ifndef ITERATORS_H
11aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#define ITERATORS_H
12aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
13aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant#include <iterator>
14aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
15aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
1627405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnantclass output_iterator
1727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant{
1827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    It it_;
1927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
2027405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    template <class U> friend class output_iterator;
2127405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnantpublic:
2227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef          std::output_iterator_tag                  iterator_category;
23304c31b355bc3f74a614535104e63abc3824d891Marshall Clow    typedef void                                               value_type;
2427405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
2527405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef It                                                 pointer;
2627405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
2727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
2827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    It base() const {return it_;}
2927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
30ba1920fe4b98e61fe47b432689c98b999f5139e3Marshall Clow    output_iterator () {}
3127405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    explicit output_iterator(It it) : it_(it) {}
3227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    template <class U>
3327405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant        output_iterator(const output_iterator<U>& u) :it_(u.it_) {}
3427405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
3527405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    reference operator*() const {return *it_;}
3627405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
3727405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    output_iterator& operator++() {++it_; return *this;}
3827405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant    output_iterator operator++(int)
3927405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant        {output_iterator tmp(*this); ++(*this); return tmp;}
4027405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant};
4127405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnant
4227405f91a83821e659963bec5f3e71be7e4c08e6Howard Hinnanttemplate <class It>
43aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass input_iterator
44aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
45aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
46aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
47aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class input_iterator;
48aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
49aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::input_iterator_tag                   iterator_category;
50aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
51aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
52aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
53aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
54aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
55aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
56aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
57aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator() : it_() {}
58aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit input_iterator(It it) : it_(it) {}
59aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
60aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
61aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
62aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
63aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
64aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
65aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator& operator++() {++it_; return *this;}
66aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    input_iterator operator++(int)
67aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {input_iterator tmp(*this); ++(*this); return tmp;}
68aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
69aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator==(const input_iterator& x, const input_iterator& y)
70aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return x.it_ == y.it_;}
71aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator!=(const input_iterator& x, const input_iterator& y)
72aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return !(x == y);}
73aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
74aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
75aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
76aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
77aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
78aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const input_iterator<T>& x, const input_iterator<U>& y)
79aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
80aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
81aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
82aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
83aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
84aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
85aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
86aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const input_iterator<T>& x, const input_iterator<U>& y)
87aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
88aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
89aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
90aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
91aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
92aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass forward_iterator
93aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
94aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
95aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
96aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class forward_iterator;
97aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
98aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::forward_iterator_tag                 iterator_category;
99aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
100aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
101aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
102aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
103aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
104aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
105aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
106aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator() : it_() {}
107aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit forward_iterator(It it) : it_(it) {}
108aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
109aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
110aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
111aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
112aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
113aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
114aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator& operator++() {++it_; return *this;}
115aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    forward_iterator operator++(int)
116aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {forward_iterator tmp(*this); ++(*this); return tmp;}
117aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
118aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator==(const forward_iterator& x, const forward_iterator& y)
119aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return x.it_ == y.it_;}
120aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
121aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {return !(x == y);}
122aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
123aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
124aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
125aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
126aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
127aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
128aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
129aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
130aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
131aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
132aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
133aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
134aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
135aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
136aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
137aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
138aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
139aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
140aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
141aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass bidirectional_iterator
142aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
143aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
144aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
145aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class bidirectional_iterator;
146aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
147aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::bidirectional_iterator_tag           iterator_category;
148aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
149aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
150aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
151aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
152aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
153aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
154aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
155aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator() : it_() {}
156aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit bidirectional_iterator(It it) : it_(it) {}
157aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U>
158aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
159aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
160aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
161aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
162aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
163aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator& operator++() {++it_; return *this;}
164aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator operator++(int)
165aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {bidirectional_iterator tmp(*this); ++(*this); return tmp;}
166aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
167aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator& operator--() {--it_; return *this;}
168aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    bidirectional_iterator operator--(int)
169aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {bidirectional_iterator tmp(*this); --(*this); return tmp;}
170aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
171aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
172aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
173aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
174aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
175aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
176aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
177aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
178aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
179aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
180aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
181aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
182aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
183aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
184aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
185aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
186aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
187aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
188aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class It>
189aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantclass random_access_iterator
190aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
191aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It it_;
192aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
193aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    template <class U> friend class random_access_iterator;
194aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantpublic:
195aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef          std::random_access_iterator_tag           iterator_category;
196aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::value_type      value_type;
197aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::difference_type difference_type;
198aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef It                                                 pointer;
199aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    typedef typename std::iterator_traits<It>::reference       reference;
200aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
201aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    It base() const {return it_;}
202aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
203aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator() : it_() {}
204aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    explicit random_access_iterator(It it) : it_(it) {}
205aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant   template <class U>
206aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
207aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
208aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator*() const {return *it_;}
209aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    pointer operator->() const {return it_;}
210aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
211aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator++() {++it_; return *this;}
212aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator++(int)
213aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); ++(*this); return tmp;}
214aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
215aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator--() {--it_; return *this;}
216aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator--(int)
217aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); --(*this); return tmp;}
218aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
219aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;}
220aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator+(difference_type n) const
221aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); tmp += n; return tmp;}
222aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    friend random_access_iterator operator+(difference_type n, random_access_iterator x)
223aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {x += n; return x;}
224aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator& operator-=(difference_type n) {return *this += -n;}
225aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    random_access_iterator operator-(difference_type n) const
226aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant        {random_access_iterator tmp(*this); tmp -= n; return tmp;}
227aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
228aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    reference operator[](difference_type n) const {return it_[n];}
229aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant};
230aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
231aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
232aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
233aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
234aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
235aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
236aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() == y.base();
237aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
238aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
239aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
240aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
241aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
242aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
243aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
244aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x == y);
245aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
246aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
247aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
248aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
249aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
250aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
251aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
252aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() < y.base();
253aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
254aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
255aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
256aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
257aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
258aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
259aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
260aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(y < x);
261aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
262aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
263aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
264aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
265aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
266aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
267aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
268aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return y < x;
269aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
270aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
271aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
272aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
273aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantbool
274aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
275aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
276aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return !(x < y);
277aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
278aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
279aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttemplate <class T, class U>
280aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantinline
281aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnanttypename std::iterator_traits<T>::difference_type
282aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnantoperator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
283aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant{
284aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant    return x.base() - y.base();
285aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant}
286aa69808da909e2b041b4b3a095da5a4c2944593cHoward Hinnant
2878226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2888226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(output_iterator<Iter> i) { return i.base(); }
2898226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2908226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2918226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(input_iterator<Iter> i) { return i.base(); }
2928226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2938226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2948226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(forward_iterator<Iter> i) { return i.base(); }
2958226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2968226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
2978226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(bidirectional_iterator<Iter> i) { return i.base(); }
2988226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
2998226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowtemplate <class Iter>
3008226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(random_access_iterator<Iter> i) { return i.base(); }
3018226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
302171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnanttemplate <class Iter>    // everything else
3038226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clowinline Iter base(Iter i) { return i; }
3048226d0b7c5f9e3a4d4a2b94179234085d973841fMarshall Clow
305bbd8086ee3448f38026219777112e787fde8504dHoward Hinnant#endif  // ITERATORS_H
306