1 // Boost.Range library 2 // 3 // Copyright Neil Groves 2010. Use, modification and 4 // distribution is subject to the Boost Software License, Version 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 // For more information, see http://www.boost.org/libs/range/ 9 // 10 #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED 11 #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED 12 13 #include <boost/range/detail/any_iterator_buffer.hpp> 14 #include <boost/iterator/iterator_categories.hpp> 15 #include <boost/type_traits/is_convertible.hpp> 16 #include <boost/type_traits/is_reference.hpp> 17 #include <boost/type_traits/remove_const.hpp> 18 #include <boost/type_traits/remove_reference.hpp> 19 20 namespace boost 21 { 22 namespace range_detail 23 { 24 template<class T> 25 struct const_reference_type_generator 26 { 27 typedef typename mpl::if_< 28 typename is_reference<T>::type, 29 typename add_const< 30 typename remove_reference<T>::type 31 >::type&, 32 T 33 >::type type; 34 }; 35 36 template<class T> 37 struct reference_as_value_type_generator 38 { 39 typedef typename remove_reference< 40 typename remove_const<T>::type 41 >::type value_type; 42 43 typedef typename mpl::if_< 44 typename is_convertible<const value_type&, value_type>::type, 45 value_type, 46 T 47 >::type type; 48 }; 49 50 template< 51 class Reference 52 , class Buffer 53 > 54 struct any_incrementable_iterator_interface 55 { 56 typedef Reference reference; 57 typedef typename const_reference_type_generator< 58 Reference 59 >::type const_reference; 60 typedef typename reference_as_value_type_generator< 61 Reference 62 >::type reference_as_value_type; 63 64 typedef Buffer buffer_type; 65 ~any_incrementable_iterator_interfaceboost::range_detail::any_incrementable_iterator_interface66 virtual ~any_incrementable_iterator_interface() {} 67 68 virtual any_incrementable_iterator_interface* 69 clone(buffer_type& buffer) const = 0; 70 71 virtual any_incrementable_iterator_interface<const_reference, Buffer>* 72 clone_const_ref(buffer_type& buffer) const = 0; 73 74 virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>* 75 clone_reference_as_value(buffer_type& buffer) const = 0; 76 77 virtual void increment() = 0; 78 }; 79 80 template< 81 class Reference 82 , class Buffer 83 > 84 struct any_single_pass_iterator_interface 85 : any_incrementable_iterator_interface<Reference, Buffer> 86 { 87 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference reference; 88 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::const_reference const_reference; 89 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::buffer_type buffer_type; 90 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; 91 92 virtual any_single_pass_iterator_interface* 93 clone(buffer_type& buffer) const = 0; 94 95 virtual any_single_pass_iterator_interface<const_reference, Buffer>* 96 clone_const_ref(buffer_type& buffer) const = 0; 97 98 virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>* 99 clone_reference_as_value(buffer_type& buffer) const = 0; 100 101 virtual reference dereference() const = 0; 102 103 virtual bool equal(const any_single_pass_iterator_interface& other) const = 0; 104 }; 105 106 template< 107 class Reference 108 , class Buffer 109 > 110 struct any_forward_iterator_interface 111 : any_single_pass_iterator_interface<Reference, Buffer> 112 { 113 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference reference; 114 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::const_reference const_reference; 115 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::buffer_type buffer_type; 116 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; 117 118 virtual any_forward_iterator_interface* 119 clone(buffer_type& buffer) const = 0; 120 121 virtual any_forward_iterator_interface<const_reference, Buffer>* 122 clone_const_ref(buffer_type& buffer) const = 0; 123 124 virtual any_forward_iterator_interface<reference_as_value_type, Buffer>* 125 clone_reference_as_value(buffer_type& buffer) const = 0; 126 }; 127 128 template< 129 class Reference 130 , class Buffer 131 > 132 struct any_bidirectional_iterator_interface 133 : any_forward_iterator_interface<Reference, Buffer> 134 { 135 typedef typename any_forward_iterator_interface<Reference, Buffer>::reference reference; 136 typedef typename any_forward_iterator_interface<Reference, Buffer>::const_reference const_reference; 137 typedef typename any_forward_iterator_interface<Reference, Buffer>::buffer_type buffer_type; 138 typedef typename any_forward_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; 139 140 virtual any_bidirectional_iterator_interface* 141 clone(buffer_type& buffer) const = 0; 142 143 virtual any_bidirectional_iterator_interface<const_reference, Buffer>* 144 clone_const_ref(buffer_type& buffer) const = 0; 145 146 virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>* 147 clone_reference_as_value(buffer_type& buffer) const = 0; 148 149 virtual void decrement() = 0; 150 }; 151 152 template< 153 class Reference 154 , class Difference 155 , class Buffer 156 > 157 struct any_random_access_iterator_interface 158 : any_bidirectional_iterator_interface< 159 Reference 160 , Buffer 161 > 162 { 163 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference reference; 164 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::const_reference const_reference; 165 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::buffer_type buffer_type; 166 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type; 167 typedef Difference difference_type; 168 169 virtual any_random_access_iterator_interface* 170 clone(buffer_type& buffer) const = 0; 171 172 virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>* 173 clone_const_ref(buffer_type& buffer) const = 0; 174 175 virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>* 176 clone_reference_as_value(buffer_type& buffer) const = 0; 177 178 virtual void advance(Difference offset) = 0; 179 180 virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0; 181 }; 182 183 template< 184 class Traversal 185 , class Reference 186 , class Difference 187 , class Buffer 188 > 189 struct any_iterator_interface_type_generator; 190 191 template< 192 class Reference 193 , class Difference 194 , class Buffer 195 > 196 struct any_iterator_interface_type_generator< 197 incrementable_traversal_tag 198 , Reference 199 , Difference 200 , Buffer 201 > 202 { 203 typedef any_incrementable_iterator_interface<Reference, Buffer> type; 204 }; 205 206 template< 207 class Reference 208 , class Difference 209 , class Buffer 210 > 211 struct any_iterator_interface_type_generator< 212 single_pass_traversal_tag 213 , Reference 214 , Difference 215 , Buffer 216 > 217 { 218 typedef any_single_pass_iterator_interface<Reference, Buffer> type; 219 }; 220 221 template< 222 class Reference 223 , class Difference 224 , class Buffer 225 > 226 struct any_iterator_interface_type_generator< 227 forward_traversal_tag 228 , Reference 229 , Difference 230 , Buffer 231 > 232 { 233 typedef any_forward_iterator_interface<Reference, Buffer> type; 234 }; 235 236 template< 237 class Reference 238 , class Difference 239 , class Buffer 240 > 241 struct any_iterator_interface_type_generator< 242 bidirectional_traversal_tag 243 , Reference 244 , Difference 245 , Buffer 246 > 247 { 248 typedef any_bidirectional_iterator_interface<Reference, Buffer> type; 249 }; 250 251 template< 252 class Reference 253 , class Difference 254 , class Buffer 255 > 256 struct any_iterator_interface_type_generator< 257 random_access_traversal_tag 258 , Reference 259 , Difference 260 , Buffer 261 > 262 { 263 typedef any_random_access_iterator_interface< 264 Reference 265 , Difference 266 , Buffer 267 > type; 268 }; 269 270 } // namespace range_detail 271 } // namespace boost 272 273 #endif // include guard 274