15de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//===----------------------------------------------------------------------===//
25de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//
35de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//                     The LLVM Compiler Infrastructure
45de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//
55de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh// This file is dual licensed under the MIT and the University of Illinois Open
65de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh// Source Licenses. See LICENSE.TXT for details.
75de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//
85de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh//===----------------------------------------------------------------------===//
95de42e6621b3d0131472c3f8838b7f0ccf3e8963Andrew Hsieh
10b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#ifndef ITERATORS_H
11b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#define ITERATORS_H
12b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
13b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <iterator>
14b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
15b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class It>
16b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass output_iterator
17b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
18b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It it_;
19b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
20b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U> friend class output_iterator;
21b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
22b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef          std::output_iterator_tag                  iterator_category;
23b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef void                                               value_type;
24b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::difference_type difference_type;
25b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef It                                                 pointer;
26b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::reference       reference;
27b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
28b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It base() const {return it_;}
29b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
30b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    output_iterator () {}
31b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit output_iterator(It it) : it_(it) {}
32b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U>
33b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        output_iterator(const output_iterator<U>& u) :it_(u.it_) {}
34b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
35b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator*() const {return *it_;}
36b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
37b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    output_iterator& operator++() {++it_; return *this;}
38b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    output_iterator operator++(int)
39b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {output_iterator tmp(*this); ++(*this); return tmp;}
40b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
41b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
42b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class It>
43b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass input_iterator
44b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
45b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It it_;
46b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
47b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U> friend class input_iterator;
48b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
49b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef          std::input_iterator_tag                   iterator_category;
50b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::value_type      value_type;
51b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::difference_type difference_type;
52b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef It                                                 pointer;
53b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::reference       reference;
54b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
55b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It base() const {return it_;}
56b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
57b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    input_iterator() : it_() {}
58b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit input_iterator(It it) : it_(it) {}
59b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U>
60b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
61b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
62b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator*() const {return *it_;}
63b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    pointer operator->() const {return it_;}
64b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
65b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    input_iterator& operator++() {++it_; return *this;}
66b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    input_iterator operator++(int)
67b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {input_iterator tmp(*this); ++(*this); return tmp;}
68b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
69b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    friend bool operator==(const input_iterator& x, const input_iterator& y)
70b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {return x.it_ == y.it_;}
71b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    friend bool operator!=(const input_iterator& x, const input_iterator& y)
72b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {return !(x == y);}
73b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
74b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
75b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
76b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
77b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
78b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator==(const input_iterator<T>& x, const input_iterator<U>& y)
79b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
80b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() == y.base();
81b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
82b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
83b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
84b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
85b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
86b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator!=(const input_iterator<T>& x, const input_iterator<U>& y)
87b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
88b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(x == y);
89b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
90b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
91b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class It>
92b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass forward_iterator
93b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
94b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It it_;
95b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
96b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U> friend class forward_iterator;
97b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
98b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef          std::forward_iterator_tag                 iterator_category;
99b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::value_type      value_type;
100b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::difference_type difference_type;
101b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef It                                                 pointer;
102b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::reference       reference;
103b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
104b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It base() const {return it_;}
105b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
106b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    forward_iterator() : it_() {}
107b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit forward_iterator(It it) : it_(it) {}
108b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U>
109b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
110b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
111b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator*() const {return *it_;}
112b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    pointer operator->() const {return it_;}
113b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
114b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    forward_iterator& operator++() {++it_; return *this;}
115b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    forward_iterator operator++(int)
116b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {forward_iterator tmp(*this); ++(*this); return tmp;}
117b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
118b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    friend bool operator==(const forward_iterator& x, const forward_iterator& y)
119b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {return x.it_ == y.it_;}
120b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
121b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {return !(x == y);}
122b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
123b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
124b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
125b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
126b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
127b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
128b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
129b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() == y.base();
130b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
131b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
132b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
133b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
134b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
135b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
136b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
137b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(x == y);
138b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
139b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
140b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class It>
141b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass bidirectional_iterator
142b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
143b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It it_;
144b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
145b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U> friend class bidirectional_iterator;
146b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
147b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef          std::bidirectional_iterator_tag           iterator_category;
148b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::value_type      value_type;
149b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::difference_type difference_type;
150b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef It                                                 pointer;
151b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::reference       reference;
152b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
153b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It base() const {return it_;}
154b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
155b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    bidirectional_iterator() : it_() {}
156b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit bidirectional_iterator(It it) : it_(it) {}
157b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U>
158b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
159b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
160b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator*() const {return *it_;}
161b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    pointer operator->() const {return it_;}
162b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
163b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    bidirectional_iterator& operator++() {++it_; return *this;}
164b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    bidirectional_iterator operator++(int)
165b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {bidirectional_iterator tmp(*this); ++(*this); return tmp;}
166b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
167b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    bidirectional_iterator& operator--() {--it_; return *this;}
168b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    bidirectional_iterator operator--(int)
169b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {bidirectional_iterator tmp(*this); --(*this); return tmp;}
170b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
171b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
172b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
173b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
174b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
175b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
176b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
177b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() == y.base();
178b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
179b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
180b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
181b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
182b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
183b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
184b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
185b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(x == y);
186b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
187b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
188b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class It>
189b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass random_access_iterator
190b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
191b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It it_;
192b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
193b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    template <class U> friend class random_access_iterator;
194b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
195b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef          std::random_access_iterator_tag           iterator_category;
196b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::value_type      value_type;
197b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::difference_type difference_type;
198b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef It                                                 pointer;
199b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    typedef typename std::iterator_traits<It>::reference       reference;
200b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
201b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    It base() const {return it_;}
202b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
203b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator() : it_() {}
204b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit random_access_iterator(It it) : it_(it) {}
205b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner   template <class U>
206b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
207b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
208b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator*() const {return *it_;}
209b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    pointer operator->() const {return it_;}
210b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
211b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator& operator++() {++it_; return *this;}
212b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator operator++(int)
213b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {random_access_iterator tmp(*this); ++(*this); return tmp;}
214b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
215b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator& operator--() {--it_; return *this;}
216b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator operator--(int)
217b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {random_access_iterator tmp(*this); --(*this); return tmp;}
218b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
219b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;}
220b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator operator+(difference_type n) const
221b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {random_access_iterator tmp(*this); tmp += n; return tmp;}
222b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    friend random_access_iterator operator+(difference_type n, random_access_iterator x)
223b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {x += n; return x;}
224b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator& operator-=(difference_type n) {return *this += -n;}
225b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    random_access_iterator operator-(difference_type n) const
226b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        {random_access_iterator tmp(*this); tmp -= n; return tmp;}
227b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
228b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    reference operator[](difference_type n) const {return it_[n];}
229b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
230b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
231b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
232b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
233b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
234b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
235b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
236b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() == y.base();
237b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
238b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
239b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
240b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
241b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
242b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
243b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
244b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(x == y);
245b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
246b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
247b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
248b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
249b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
250b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
251b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
252b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() < y.base();
253b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
254b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
255b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
256b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
257b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
258b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
259b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
260b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(y < x);
261b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
262b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
263b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
264b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
265b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
266b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
267b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
268b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return y < x;
269b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
270b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
271b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
272b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
273b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerbool
274b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
275b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
276b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return !(x < y);
277b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
278b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
279b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, class U>
280b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline
281b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertypename std::iterator_traits<T>::difference_type
282b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turneroperator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
283b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
284b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    return x.base() - y.base();
285b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
286b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
287b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class Iter>
288b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(output_iterator<Iter> i) { return i.base(); }
289b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
290b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class Iter>
291b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(input_iterator<Iter> i) { return i.base(); }
292b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
293b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class Iter>
294b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(forward_iterator<Iter> i) { return i.base(); }
295b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
296b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class Iter>
297b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(bidirectional_iterator<Iter> i) { return i.base(); }
298b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
299b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class Iter>
300b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(random_access_iterator<Iter> i) { return i.base(); }
301b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
302ad46d2248426e810edc5878c7cb086b7093f3cf5David 'Digit' Turnertemplate <class Iter>    // everything else
303b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerinline Iter base(Iter i) { return i; }
304b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
305b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#endif  // ITERATORS_H
306