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)
8 // For more information, see http://www.boost.org/libs/range/
10 #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
11 #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
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>
22 namespace range_detail
25 struct const_reference_type_generator
27 typedef typename mpl::if_<
28 typename is_reference<T>::type,
30 typename remove_reference<T>::type
37 struct reference_as_value_type_generator
39 typedef typename remove_reference<
40 typename remove_const<T>::type
43 typedef typename mpl::if_<
44 typename is_convertible<const value_type&, value_type>::type,
54 struct any_incrementable_iterator_interface
56 typedef Reference reference;
57 typedef typename const_reference_type_generator<
59 >::type const_reference;
60 typedef typename reference_as_value_type_generator<
62 >::type reference_as_value_type;
64 typedef Buffer buffer_type;
66 virtual ~any_incrementable_iterator_interface() {}
68 virtual any_incrementable_iterator_interface*
69 clone(buffer_type& buffer) const = 0;
71 virtual any_incrementable_iterator_interface<const_reference, Buffer>*
72 clone_const_ref(buffer_type& buffer) const = 0;
74 virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>*
75 clone_reference_as_value(buffer_type& buffer) const = 0;
77 virtual void increment() = 0;
84 struct any_single_pass_iterator_interface
85 : any_incrementable_iterator_interface<Reference, Buffer>
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;
92 virtual any_single_pass_iterator_interface*
93 clone(buffer_type& buffer) const = 0;
95 virtual any_single_pass_iterator_interface<const_reference, Buffer>*
96 clone_const_ref(buffer_type& buffer) const = 0;
98 virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>*
99 clone_reference_as_value(buffer_type& buffer) const = 0;
101 virtual reference dereference() const = 0;
103 virtual bool equal(const any_single_pass_iterator_interface& other) const = 0;
110 struct any_forward_iterator_interface
111 : any_single_pass_iterator_interface<Reference, Buffer>
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;
118 virtual any_forward_iterator_interface*
119 clone(buffer_type& buffer) const = 0;
121 virtual any_forward_iterator_interface<const_reference, Buffer>*
122 clone_const_ref(buffer_type& buffer) const = 0;
124 virtual any_forward_iterator_interface<reference_as_value_type, Buffer>*
125 clone_reference_as_value(buffer_type& buffer) const = 0;
132 struct any_bidirectional_iterator_interface
133 : any_forward_iterator_interface<Reference, Buffer>
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;
140 virtual any_bidirectional_iterator_interface*
141 clone(buffer_type& buffer) const = 0;
143 virtual any_bidirectional_iterator_interface<const_reference, Buffer>*
144 clone_const_ref(buffer_type& buffer) const = 0;
146 virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>*
147 clone_reference_as_value(buffer_type& buffer) const = 0;
149 virtual void decrement() = 0;
157 struct any_random_access_iterator_interface
158 : any_bidirectional_iterator_interface<
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;
169 virtual any_random_access_iterator_interface*
170 clone(buffer_type& buffer) const = 0;
172 virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>*
173 clone_const_ref(buffer_type& buffer) const = 0;
175 virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>*
176 clone_reference_as_value(buffer_type& buffer) const = 0;
178 virtual void advance(Difference offset) = 0;
180 virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0;
189 struct any_iterator_interface_type_generator;
196 struct any_iterator_interface_type_generator<
197 incrementable_traversal_tag
203 typedef any_incrementable_iterator_interface<Reference, Buffer> type;
211 struct any_iterator_interface_type_generator<
212 single_pass_traversal_tag
218 typedef any_single_pass_iterator_interface<Reference, Buffer> type;
226 struct any_iterator_interface_type_generator<
227 forward_traversal_tag
233 typedef any_forward_iterator_interface<Reference, Buffer> type;
241 struct any_iterator_interface_type_generator<
242 bidirectional_traversal_tag
248 typedef any_bidirectional_iterator_interface<Reference, Buffer> type;
256 struct any_iterator_interface_type_generator<
257 random_access_traversal_tag
263 typedef any_random_access_iterator_interface<
270 } // namespace range_detail
273 #endif // include guard