]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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> | |
20effc67 | 15 | #include <boost/type_traits/is_convertible.hpp> |
7c673cae FG |
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> | |
20effc67 | 37 | struct reference_as_value_type_generator |
7c673cae | 38 | { |
20effc67 TL |
39 | typedef typename remove_reference< |
40 | typename remove_const<T>::type | |
41 | >::type value_type; | |
42 | ||
7c673cae | 43 | typedef typename mpl::if_< |
20effc67 TL |
44 | typename is_convertible<const value_type&, value_type>::type, |
45 | value_type, | |
46 | T | |
7c673cae FG |
47 | >::type type; |
48 | }; | |
49 | ||
50 | template< | |
51 | class Reference | |
52 | , class Buffer | |
53 | > | |
54 | struct any_incrementable_iterator_interface | |
55 | { | |
20effc67 | 56 | typedef Reference reference; |
7c673cae FG |
57 | typedef typename const_reference_type_generator< |
58 | Reference | |
59 | >::type const_reference; | |
20effc67 TL |
60 | typedef typename reference_as_value_type_generator< |
61 | Reference | |
7c673cae FG |
62 | >::type reference_as_value_type; |
63 | ||
64 | typedef Buffer buffer_type; | |
65 | ||
66 | 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 |