test_iterators.h revision 98760c18f85bafd98dde7a309e1b0e677abd47d8
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