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