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