Chris@16
|
1 // Boost.Range library
|
Chris@16
|
2 //
|
Chris@16
|
3 // Copyright Neil Groves 2010. Use, modification and
|
Chris@16
|
4 // distribution is subject to the Boost Software License, Version
|
Chris@16
|
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //
|
Chris@16
|
8 // For more information, see http://www.boost.org/libs/range/
|
Chris@16
|
9 //
|
Chris@16
|
10 #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED
|
Chris@16
|
11 #define BOOST_RANGE_DETAIL_ANY_ITERATOR_WRAPPER_HPP_INCLUDED
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/cast.hpp>
|
Chris@16
|
14 #include <boost/range/config.hpp>
|
Chris@16
|
15 #include <boost/range/detail/any_iterator_interface.hpp>
|
Chris@16
|
16 #include <boost/range/concepts.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost
|
Chris@16
|
19 {
|
Chris@16
|
20 namespace range_detail
|
Chris@16
|
21 {
|
Chris@101
|
22 template<typename TargetT, typename SourceT>
|
Chris@101
|
23 TargetT& polymorphic_ref_downcast(SourceT& source)
|
Chris@101
|
24 {
|
Chris@101
|
25 #ifdef BOOST_NO_RTTI
|
Chris@101
|
26 return static_cast<TargetT&>(source);
|
Chris@101
|
27 #else
|
Chris@101
|
28 return *boost::polymorphic_downcast<TargetT*>(&source);
|
Chris@101
|
29 #endif
|
Chris@101
|
30 }
|
Chris@101
|
31
|
Chris@101
|
32 template<class Reference, class T>
|
Chris@101
|
33 Reference dereference_cast(T& x)
|
Chris@101
|
34 {
|
Chris@101
|
35 return static_cast<Reference>(x);
|
Chris@101
|
36 }
|
Chris@101
|
37 template<class Reference, class T>
|
Chris@101
|
38 Reference dereference_cast(const T& x)
|
Chris@101
|
39 {
|
Chris@101
|
40 return static_cast<Reference>(const_cast<T&>(x));
|
Chris@101
|
41 }
|
Chris@101
|
42
|
Chris@16
|
43 template<
|
Chris@16
|
44 class WrappedIterator
|
Chris@16
|
45 , class Reference
|
Chris@16
|
46 , class Buffer
|
Chris@16
|
47 >
|
Chris@16
|
48 class any_incrementable_iterator_wrapper
|
Chris@16
|
49 : public any_incrementable_iterator_interface<
|
Chris@16
|
50 Reference
|
Chris@16
|
51 , Buffer
|
Chris@16
|
52 >
|
Chris@16
|
53 {
|
Chris@16
|
54 BOOST_RANGE_CONCEPT_ASSERT(( IncrementableIteratorConcept<WrappedIterator> ));
|
Chris@16
|
55 public:
|
Chris@16
|
56 typedef WrappedIterator wrapped_type;
|
Chris@16
|
57
|
Chris@16
|
58 BOOST_STATIC_ASSERT(( is_convertible<
|
Chris@16
|
59 typename iterator_reference<WrappedIterator>::type
|
Chris@16
|
60 , Reference
|
Chris@16
|
61 >::value ));
|
Chris@16
|
62
|
Chris@16
|
63 any_incrementable_iterator_wrapper()
|
Chris@16
|
64 : m_it()
|
Chris@16
|
65 {}
|
Chris@16
|
66
|
Chris@16
|
67 explicit any_incrementable_iterator_wrapper(wrapped_type it)
|
Chris@16
|
68 : m_it(it)
|
Chris@16
|
69 {}
|
Chris@16
|
70
|
Chris@16
|
71 // any_incrementable_iterator implementation
|
Chris@16
|
72 virtual any_incrementable_iterator_wrapper* clone(
|
Chris@16
|
73 typename any_incrementable_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
74 ) const
|
Chris@16
|
75 {
|
Chris@16
|
76 return new (buffer.allocate(sizeof(*this)))
|
Chris@16
|
77 any_incrementable_iterator_wrapper(m_it);
|
Chris@16
|
78 }
|
Chris@16
|
79
|
Chris@16
|
80 virtual any_incrementable_iterator_wrapper<
|
Chris@16
|
81 WrappedIterator
|
Chris@16
|
82 , typename any_incrementable_iterator_wrapper::const_reference
|
Chris@16
|
83 , Buffer
|
Chris@16
|
84 >* clone_const_ref(
|
Chris@16
|
85 typename any_incrementable_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
86 ) const
|
Chris@16
|
87 {
|
Chris@16
|
88 typedef any_incrementable_iterator_wrapper<
|
Chris@16
|
89 WrappedIterator
|
Chris@16
|
90 , typename any_incrementable_iterator_wrapper::const_reference
|
Chris@16
|
91 , Buffer
|
Chris@16
|
92 > result_type;
|
Chris@16
|
93
|
Chris@16
|
94 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
95 result_type(m_it);
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 virtual any_incrementable_iterator_wrapper<
|
Chris@16
|
99 WrappedIterator
|
Chris@16
|
100 , typename any_incrementable_iterator_wrapper::reference_as_value_type
|
Chris@16
|
101 , Buffer
|
Chris@16
|
102 >* clone_reference_as_value(
|
Chris@16
|
103 typename any_incrementable_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
104 ) const
|
Chris@16
|
105 {
|
Chris@16
|
106 typedef any_incrementable_iterator_wrapper<
|
Chris@16
|
107 WrappedIterator
|
Chris@16
|
108 , typename any_incrementable_iterator_wrapper::reference_as_value_type
|
Chris@16
|
109 , Buffer
|
Chris@16
|
110 > result_type;
|
Chris@16
|
111
|
Chris@16
|
112 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
113 result_type(m_it);
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 virtual void increment()
|
Chris@16
|
117 {
|
Chris@16
|
118 ++m_it;
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 private:
|
Chris@16
|
122 wrapped_type m_it;
|
Chris@16
|
123 };
|
Chris@16
|
124
|
Chris@16
|
125 template<
|
Chris@16
|
126 class WrappedIterator
|
Chris@16
|
127 , class Reference
|
Chris@16
|
128 , class Buffer
|
Chris@16
|
129 >
|
Chris@16
|
130 class any_single_pass_iterator_wrapper
|
Chris@16
|
131 : public any_single_pass_iterator_interface<
|
Chris@16
|
132 Reference
|
Chris@16
|
133 , Buffer
|
Chris@16
|
134 >
|
Chris@16
|
135 {
|
Chris@16
|
136 struct disabler {};
|
Chris@16
|
137 BOOST_RANGE_CONCEPT_ASSERT(( SinglePassIteratorConcept<WrappedIterator> ));
|
Chris@101
|
138 typedef any_single_pass_iterator_interface<
|
Chris@101
|
139 Reference,
|
Chris@101
|
140 Buffer
|
Chris@101
|
141 > base_type;
|
Chris@101
|
142
|
Chris@16
|
143 public:
|
Chris@101
|
144 typedef typename base_type::reference reference;
|
Chris@16
|
145
|
Chris@16
|
146 any_single_pass_iterator_wrapper()
|
Chris@16
|
147 : m_it()
|
Chris@16
|
148 {}
|
Chris@16
|
149
|
Chris@16
|
150 explicit any_single_pass_iterator_wrapper(const WrappedIterator& it)
|
Chris@16
|
151 : m_it(it)
|
Chris@16
|
152 {}
|
Chris@16
|
153 // any_single_pass_iterator_interface<Reference> implementation
|
Chris@16
|
154 virtual any_single_pass_iterator_wrapper* clone(
|
Chris@16
|
155 typename any_single_pass_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
156 ) const
|
Chris@16
|
157 {
|
Chris@16
|
158 return new (buffer.allocate(sizeof(*this)))
|
Chris@16
|
159 any_single_pass_iterator_wrapper(m_it);
|
Chris@16
|
160 }
|
Chris@16
|
161
|
Chris@16
|
162 virtual any_single_pass_iterator_wrapper<
|
Chris@16
|
163 WrappedIterator
|
Chris@16
|
164 , typename any_single_pass_iterator_wrapper::const_reference
|
Chris@16
|
165 , Buffer
|
Chris@16
|
166 >* clone_const_ref(
|
Chris@16
|
167 typename any_single_pass_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
168 ) const
|
Chris@16
|
169 {
|
Chris@16
|
170 typedef any_single_pass_iterator_wrapper<
|
Chris@16
|
171 WrappedIterator
|
Chris@16
|
172 , typename any_single_pass_iterator_wrapper::const_reference
|
Chris@16
|
173 , Buffer
|
Chris@16
|
174 > result_type;
|
Chris@16
|
175
|
Chris@16
|
176 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
177 result_type(m_it);
|
Chris@16
|
178 }
|
Chris@16
|
179
|
Chris@16
|
180 virtual any_single_pass_iterator_wrapper<
|
Chris@16
|
181 WrappedIterator
|
Chris@16
|
182 , typename any_single_pass_iterator_wrapper::reference_as_value_type
|
Chris@16
|
183 , Buffer
|
Chris@16
|
184 >* clone_reference_as_value(
|
Chris@16
|
185 typename any_single_pass_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
186 ) const
|
Chris@16
|
187 {
|
Chris@16
|
188 typedef any_single_pass_iterator_wrapper<
|
Chris@16
|
189 WrappedIterator
|
Chris@16
|
190 , typename any_single_pass_iterator_wrapper::reference_as_value_type
|
Chris@16
|
191 , Buffer
|
Chris@16
|
192 > result_type;
|
Chris@16
|
193
|
Chris@16
|
194 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
195 result_type(m_it);
|
Chris@16
|
196 }
|
Chris@16
|
197
|
Chris@16
|
198 virtual void increment()
|
Chris@16
|
199 {
|
Chris@16
|
200 ++m_it;
|
Chris@16
|
201 }
|
Chris@16
|
202
|
Chris@16
|
203 virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
|
Chris@16
|
204 {
|
Chris@101
|
205 return m_it == range_detail::polymorphic_ref_downcast<const any_single_pass_iterator_wrapper>(other).m_it;
|
Chris@16
|
206 }
|
Chris@16
|
207
|
Chris@101
|
208 virtual reference dereference() const
|
Chris@16
|
209 {
|
Chris@101
|
210 return dereference_cast<reference>(*m_it);
|
Chris@16
|
211 }
|
Chris@16
|
212
|
Chris@16
|
213 private:
|
Chris@16
|
214 WrappedIterator m_it;
|
Chris@16
|
215 };
|
Chris@16
|
216
|
Chris@16
|
217 template<
|
Chris@16
|
218 class WrappedIterator
|
Chris@16
|
219 , class Reference
|
Chris@16
|
220 , class Buffer
|
Chris@16
|
221 >
|
Chris@16
|
222 class any_forward_iterator_wrapper
|
Chris@16
|
223 : public any_forward_iterator_interface<
|
Chris@16
|
224 Reference
|
Chris@16
|
225 , Buffer
|
Chris@16
|
226 >
|
Chris@16
|
227 {
|
Chris@16
|
228 BOOST_RANGE_CONCEPT_ASSERT(( ForwardIteratorConcept<WrappedIterator> ));
|
Chris@101
|
229 typedef any_forward_iterator_interface<
|
Chris@101
|
230 Reference,
|
Chris@101
|
231 Buffer
|
Chris@101
|
232 > base_type;
|
Chris@101
|
233
|
Chris@16
|
234 public:
|
Chris@101
|
235 typedef typename base_type::reference reference;
|
Chris@101
|
236
|
Chris@16
|
237 any_forward_iterator_wrapper()
|
Chris@16
|
238 : m_it()
|
Chris@16
|
239 {}
|
Chris@16
|
240
|
Chris@16
|
241 explicit any_forward_iterator_wrapper(const WrappedIterator& it)
|
Chris@16
|
242 : m_it(it)
|
Chris@16
|
243 {}
|
Chris@16
|
244
|
Chris@16
|
245 // any_forward_iterator_interface<Reference> implementation
|
Chris@16
|
246 virtual any_forward_iterator_wrapper* clone(
|
Chris@16
|
247 typename any_forward_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
248 ) const
|
Chris@16
|
249 {
|
Chris@16
|
250 return new (buffer.allocate(sizeof(*this)))
|
Chris@16
|
251 any_forward_iterator_wrapper(m_it);
|
Chris@16
|
252 }
|
Chris@16
|
253
|
Chris@16
|
254 virtual any_forward_iterator_wrapper<
|
Chris@16
|
255 WrappedIterator
|
Chris@16
|
256 , typename any_forward_iterator_wrapper::const_reference
|
Chris@16
|
257 , Buffer
|
Chris@16
|
258 >* clone_const_ref(
|
Chris@16
|
259 typename any_forward_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
260 ) const
|
Chris@16
|
261 {
|
Chris@16
|
262 typedef any_forward_iterator_wrapper<
|
Chris@16
|
263 WrappedIterator
|
Chris@16
|
264 , typename any_forward_iterator_wrapper::const_reference
|
Chris@16
|
265 , Buffer
|
Chris@16
|
266 > result_type;
|
Chris@16
|
267
|
Chris@16
|
268 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
269 result_type(m_it);
|
Chris@16
|
270 }
|
Chris@16
|
271
|
Chris@16
|
272 virtual any_forward_iterator_wrapper<
|
Chris@16
|
273 WrappedIterator
|
Chris@16
|
274 , typename any_forward_iterator_wrapper::reference_as_value_type
|
Chris@16
|
275 , Buffer
|
Chris@16
|
276 >* clone_reference_as_value(
|
Chris@16
|
277 typename any_forward_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
278 ) const
|
Chris@16
|
279 {
|
Chris@16
|
280 typedef any_forward_iterator_wrapper<
|
Chris@16
|
281 WrappedIterator
|
Chris@16
|
282 , typename any_forward_iterator_wrapper::reference_as_value_type
|
Chris@16
|
283 , Buffer
|
Chris@16
|
284 > result_type;
|
Chris@16
|
285
|
Chris@16
|
286 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
287 result_type(m_it);
|
Chris@16
|
288 }
|
Chris@16
|
289
|
Chris@16
|
290 virtual void increment()
|
Chris@16
|
291 {
|
Chris@16
|
292 ++m_it;
|
Chris@16
|
293 }
|
Chris@16
|
294
|
Chris@16
|
295 virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
|
Chris@16
|
296 {
|
Chris@101
|
297 return m_it == range_detail::polymorphic_ref_downcast<const any_forward_iterator_wrapper>(other).m_it;
|
Chris@16
|
298 }
|
Chris@16
|
299
|
Chris@101
|
300 virtual reference dereference() const
|
Chris@16
|
301 {
|
Chris@101
|
302 return dereference_cast<reference>(*m_it);
|
Chris@16
|
303 }
|
Chris@16
|
304 private:
|
Chris@16
|
305 WrappedIterator m_it;
|
Chris@16
|
306 };
|
Chris@16
|
307
|
Chris@16
|
308 template<
|
Chris@16
|
309 class WrappedIterator
|
Chris@16
|
310 , class Reference
|
Chris@16
|
311 , class Buffer
|
Chris@16
|
312 >
|
Chris@16
|
313 class any_bidirectional_iterator_wrapper
|
Chris@16
|
314 : public any_bidirectional_iterator_interface<
|
Chris@16
|
315 Reference
|
Chris@16
|
316 , Buffer
|
Chris@16
|
317 >
|
Chris@16
|
318 {
|
Chris@16
|
319 BOOST_RANGE_CONCEPT_ASSERT(( BidirectionalIteratorConcept<WrappedIterator> ));
|
Chris@101
|
320 typedef any_bidirectional_iterator_interface<
|
Chris@101
|
321 Reference,
|
Chris@101
|
322 Buffer
|
Chris@101
|
323 > base_type;
|
Chris@101
|
324
|
Chris@16
|
325 public:
|
Chris@101
|
326 typedef typename base_type::reference reference;
|
Chris@101
|
327
|
Chris@16
|
328 any_bidirectional_iterator_wrapper()
|
Chris@16
|
329 : m_it()
|
Chris@16
|
330 {
|
Chris@16
|
331 }
|
Chris@16
|
332
|
Chris@16
|
333 explicit any_bidirectional_iterator_wrapper(const WrappedIterator& it)
|
Chris@16
|
334 : m_it(it)
|
Chris@16
|
335 {
|
Chris@16
|
336 }
|
Chris@16
|
337
|
Chris@16
|
338 virtual any_bidirectional_iterator_wrapper* clone(
|
Chris@16
|
339 typename any_bidirectional_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
340 ) const
|
Chris@16
|
341 {
|
Chris@16
|
342 return new (buffer.allocate(sizeof(*this)))
|
Chris@16
|
343 any_bidirectional_iterator_wrapper(*this);
|
Chris@16
|
344 }
|
Chris@16
|
345
|
Chris@16
|
346 virtual any_bidirectional_iterator_wrapper<
|
Chris@16
|
347 WrappedIterator
|
Chris@16
|
348 , typename any_bidirectional_iterator_wrapper::const_reference
|
Chris@16
|
349 , Buffer
|
Chris@16
|
350 >* clone_const_ref(
|
Chris@16
|
351 typename any_bidirectional_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
352 ) const
|
Chris@16
|
353 {
|
Chris@16
|
354 typedef any_bidirectional_iterator_wrapper<
|
Chris@16
|
355 WrappedIterator
|
Chris@16
|
356 , typename any_bidirectional_iterator_wrapper::const_reference
|
Chris@16
|
357 , Buffer
|
Chris@16
|
358 > result_type;
|
Chris@16
|
359
|
Chris@16
|
360 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
361 result_type(m_it);
|
Chris@16
|
362 }
|
Chris@16
|
363
|
Chris@16
|
364 virtual any_bidirectional_iterator_wrapper<
|
Chris@16
|
365 WrappedIterator
|
Chris@16
|
366 , typename any_bidirectional_iterator_wrapper::reference_as_value_type
|
Chris@16
|
367 , Buffer
|
Chris@16
|
368 >* clone_reference_as_value(
|
Chris@16
|
369 typename any_bidirectional_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
370 ) const
|
Chris@16
|
371 {
|
Chris@16
|
372 typedef any_bidirectional_iterator_wrapper<
|
Chris@16
|
373 WrappedIterator
|
Chris@16
|
374 , typename any_bidirectional_iterator_wrapper::reference_as_value_type
|
Chris@16
|
375 , Buffer
|
Chris@16
|
376 > result_type;
|
Chris@16
|
377
|
Chris@16
|
378 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
379 result_type(m_it);
|
Chris@16
|
380 }
|
Chris@16
|
381
|
Chris@16
|
382 virtual void increment()
|
Chris@16
|
383 {
|
Chris@16
|
384 ++m_it;
|
Chris@16
|
385 }
|
Chris@16
|
386
|
Chris@16
|
387 virtual void decrement()
|
Chris@16
|
388 {
|
Chris@16
|
389 --m_it;
|
Chris@16
|
390 }
|
Chris@16
|
391
|
Chris@16
|
392 virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
|
Chris@16
|
393 {
|
Chris@101
|
394 return m_it == range_detail::polymorphic_ref_downcast<const any_bidirectional_iterator_wrapper>(other).m_it;
|
Chris@16
|
395 }
|
Chris@16
|
396
|
Chris@101
|
397 virtual reference dereference() const
|
Chris@16
|
398 {
|
Chris@101
|
399 return dereference_cast<reference>(*m_it);
|
Chris@16
|
400 }
|
Chris@16
|
401
|
Chris@16
|
402 private:
|
Chris@16
|
403 WrappedIterator m_it;
|
Chris@16
|
404 };
|
Chris@16
|
405
|
Chris@16
|
406 template<
|
Chris@16
|
407 class WrappedIterator
|
Chris@16
|
408 , class Reference
|
Chris@16
|
409 , class Difference
|
Chris@16
|
410 , class Buffer
|
Chris@16
|
411 >
|
Chris@16
|
412 class any_random_access_iterator_wrapper
|
Chris@16
|
413 : public any_random_access_iterator_interface<
|
Chris@16
|
414 Reference
|
Chris@16
|
415 , Difference
|
Chris@16
|
416 , Buffer
|
Chris@16
|
417 >
|
Chris@16
|
418 {
|
Chris@16
|
419 BOOST_RANGE_CONCEPT_ASSERT(( RandomAccessIteratorConcept<WrappedIterator> ));
|
Chris@101
|
420 typedef any_random_access_iterator_interface<
|
Chris@101
|
421 Reference,
|
Chris@101
|
422 Difference,
|
Chris@101
|
423 Buffer
|
Chris@101
|
424 > base_type;
|
Chris@101
|
425
|
Chris@16
|
426 public:
|
Chris@101
|
427 typedef typename base_type::reference reference;
|
Chris@16
|
428 typedef Difference difference_type;
|
Chris@16
|
429
|
Chris@16
|
430 any_random_access_iterator_wrapper()
|
Chris@16
|
431 : m_it()
|
Chris@16
|
432 {
|
Chris@16
|
433 }
|
Chris@16
|
434
|
Chris@16
|
435 explicit any_random_access_iterator_wrapper(const WrappedIterator& other)
|
Chris@16
|
436 : m_it(other)
|
Chris@16
|
437 {
|
Chris@16
|
438 }
|
Chris@16
|
439
|
Chris@16
|
440 virtual any_random_access_iterator_wrapper* clone(
|
Chris@16
|
441 typename any_random_access_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
442 ) const
|
Chris@16
|
443 {
|
Chris@16
|
444 return new (buffer.allocate(sizeof(*this)))
|
Chris@16
|
445 any_random_access_iterator_wrapper(*this);
|
Chris@16
|
446 }
|
Chris@16
|
447
|
Chris@16
|
448 virtual any_random_access_iterator_wrapper<
|
Chris@16
|
449 WrappedIterator
|
Chris@16
|
450 , typename any_random_access_iterator_wrapper::const_reference
|
Chris@16
|
451 , Difference
|
Chris@16
|
452 , Buffer
|
Chris@16
|
453 >* clone_const_ref(
|
Chris@16
|
454 typename any_random_access_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
455 ) const
|
Chris@16
|
456 {
|
Chris@16
|
457 typedef any_random_access_iterator_wrapper<
|
Chris@16
|
458 WrappedIterator
|
Chris@16
|
459 , typename any_random_access_iterator_wrapper::const_reference
|
Chris@16
|
460 , Difference
|
Chris@16
|
461 , Buffer
|
Chris@16
|
462 > result_type;
|
Chris@16
|
463
|
Chris@16
|
464 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
465 result_type(m_it);
|
Chris@16
|
466 }
|
Chris@16
|
467
|
Chris@16
|
468 virtual any_random_access_iterator_wrapper<
|
Chris@16
|
469 WrappedIterator
|
Chris@16
|
470 , typename any_random_access_iterator_wrapper::reference_as_value_type
|
Chris@16
|
471 , Difference
|
Chris@16
|
472 , Buffer
|
Chris@16
|
473 >* clone_reference_as_value(
|
Chris@16
|
474 typename any_random_access_iterator_wrapper::buffer_type& buffer
|
Chris@16
|
475 ) const
|
Chris@16
|
476 {
|
Chris@16
|
477 typedef any_random_access_iterator_wrapper<
|
Chris@16
|
478 WrappedIterator
|
Chris@16
|
479 , typename any_random_access_iterator_wrapper::reference_as_value_type
|
Chris@16
|
480 , Difference
|
Chris@16
|
481 , Buffer
|
Chris@16
|
482 > result_type;
|
Chris@16
|
483
|
Chris@16
|
484 return new (buffer.allocate(sizeof(result_type)))
|
Chris@16
|
485 result_type(m_it);
|
Chris@16
|
486 }
|
Chris@16
|
487
|
Chris@16
|
488 virtual void increment()
|
Chris@16
|
489 {
|
Chris@16
|
490 ++m_it;
|
Chris@16
|
491 }
|
Chris@16
|
492
|
Chris@16
|
493 virtual bool equal(const any_single_pass_iterator_interface<Reference, Buffer>& other) const
|
Chris@16
|
494 {
|
Chris@101
|
495 return m_it == range_detail::polymorphic_ref_downcast<const any_random_access_iterator_wrapper>(other).m_it;
|
Chris@16
|
496 }
|
Chris@16
|
497
|
Chris@16
|
498 virtual void decrement()
|
Chris@16
|
499 {
|
Chris@16
|
500 --m_it;
|
Chris@16
|
501 }
|
Chris@16
|
502
|
Chris@16
|
503 virtual void advance(Difference offset)
|
Chris@16
|
504 {
|
Chris@16
|
505 m_it += offset;
|
Chris@16
|
506 }
|
Chris@16
|
507
|
Chris@101
|
508 virtual reference dereference() const
|
Chris@16
|
509 {
|
Chris@101
|
510 return dereference_cast<reference>(*m_it);
|
Chris@16
|
511 }
|
Chris@16
|
512
|
Chris@16
|
513 virtual Difference distance_to(const any_random_access_iterator_interface<Reference, Difference, Buffer>& other) const
|
Chris@16
|
514 {
|
Chris@101
|
515 return range_detail::polymorphic_ref_downcast<const any_random_access_iterator_wrapper>(other).m_it - m_it;
|
Chris@16
|
516 }
|
Chris@16
|
517
|
Chris@16
|
518 private:
|
Chris@16
|
519 WrappedIterator m_it;
|
Chris@16
|
520 };
|
Chris@16
|
521
|
Chris@16
|
522 template<
|
Chris@16
|
523 class WrappedIterator
|
Chris@16
|
524 , class Traversal
|
Chris@16
|
525 , class Reference
|
Chris@16
|
526 , class Difference
|
Chris@16
|
527 , class Buffer
|
Chris@16
|
528 >
|
Chris@16
|
529 struct any_iterator_wrapper_type_generator;
|
Chris@16
|
530
|
Chris@16
|
531 template<
|
Chris@16
|
532 class WrappedIterator
|
Chris@16
|
533 , class Reference
|
Chris@16
|
534 , class Difference
|
Chris@16
|
535 , class Buffer
|
Chris@16
|
536 >
|
Chris@16
|
537 struct any_iterator_wrapper_type_generator<
|
Chris@16
|
538 WrappedIterator
|
Chris@16
|
539 , incrementable_traversal_tag
|
Chris@16
|
540 , Reference
|
Chris@16
|
541 , Difference
|
Chris@16
|
542 , Buffer
|
Chris@16
|
543 >
|
Chris@16
|
544 {
|
Chris@16
|
545 typedef any_incrementable_iterator_wrapper<
|
Chris@16
|
546 WrappedIterator
|
Chris@16
|
547 , Reference
|
Chris@16
|
548 , Buffer
|
Chris@16
|
549 > type;
|
Chris@16
|
550 };
|
Chris@16
|
551
|
Chris@16
|
552 template<
|
Chris@16
|
553 class WrappedIterator
|
Chris@16
|
554 , class Reference
|
Chris@16
|
555 , class Difference
|
Chris@16
|
556 , class Buffer
|
Chris@16
|
557 >
|
Chris@16
|
558 struct any_iterator_wrapper_type_generator<
|
Chris@16
|
559 WrappedIterator
|
Chris@16
|
560 , single_pass_traversal_tag
|
Chris@16
|
561 , Reference
|
Chris@16
|
562 , Difference
|
Chris@16
|
563 , Buffer
|
Chris@16
|
564 >
|
Chris@16
|
565 {
|
Chris@16
|
566 typedef any_single_pass_iterator_wrapper<
|
Chris@16
|
567 WrappedIterator
|
Chris@16
|
568 , Reference
|
Chris@16
|
569 , Buffer
|
Chris@16
|
570 > type;
|
Chris@16
|
571 };
|
Chris@16
|
572
|
Chris@16
|
573 template<
|
Chris@16
|
574 class WrappedIterator
|
Chris@16
|
575 , class Reference
|
Chris@16
|
576 , class Difference
|
Chris@16
|
577 , class Buffer
|
Chris@16
|
578 >
|
Chris@16
|
579 struct any_iterator_wrapper_type_generator<
|
Chris@16
|
580 WrappedIterator
|
Chris@16
|
581 , forward_traversal_tag
|
Chris@16
|
582 , Reference
|
Chris@16
|
583 , Difference
|
Chris@16
|
584 , Buffer
|
Chris@16
|
585 >
|
Chris@16
|
586 {
|
Chris@16
|
587 typedef any_forward_iterator_wrapper<
|
Chris@16
|
588 WrappedIterator
|
Chris@16
|
589 , Reference
|
Chris@16
|
590 , Buffer
|
Chris@16
|
591 > type;
|
Chris@16
|
592 };
|
Chris@16
|
593
|
Chris@16
|
594 template<
|
Chris@16
|
595 class WrappedIterator
|
Chris@16
|
596 , class Reference
|
Chris@16
|
597 , class Difference
|
Chris@16
|
598 , class Buffer
|
Chris@16
|
599 >
|
Chris@16
|
600 struct any_iterator_wrapper_type_generator<
|
Chris@16
|
601 WrappedIterator
|
Chris@16
|
602 , bidirectional_traversal_tag
|
Chris@16
|
603 , Reference
|
Chris@16
|
604 , Difference
|
Chris@16
|
605 , Buffer
|
Chris@16
|
606 >
|
Chris@16
|
607 {
|
Chris@16
|
608 typedef any_bidirectional_iterator_wrapper<
|
Chris@16
|
609 WrappedIterator
|
Chris@16
|
610 , Reference
|
Chris@16
|
611 , Buffer
|
Chris@16
|
612 > type;
|
Chris@16
|
613 };
|
Chris@16
|
614
|
Chris@16
|
615 template<
|
Chris@16
|
616 class WrappedIterator
|
Chris@16
|
617 , class Reference
|
Chris@16
|
618 , class Difference
|
Chris@16
|
619 , class Buffer
|
Chris@16
|
620 >
|
Chris@16
|
621 struct any_iterator_wrapper_type_generator<
|
Chris@16
|
622 WrappedIterator
|
Chris@16
|
623 , random_access_traversal_tag
|
Chris@16
|
624 , Reference
|
Chris@16
|
625 , Difference
|
Chris@16
|
626 , Buffer
|
Chris@16
|
627 >
|
Chris@16
|
628 {
|
Chris@16
|
629 typedef any_random_access_iterator_wrapper<
|
Chris@16
|
630 WrappedIterator
|
Chris@16
|
631 , Reference
|
Chris@16
|
632 , Difference
|
Chris@16
|
633 , Buffer
|
Chris@16
|
634 > type;
|
Chris@16
|
635 };
|
Chris@16
|
636
|
Chris@16
|
637 } // namespace range_detail
|
Chris@16
|
638 } // namespace boost
|
Chris@16
|
639
|
Chris@16
|
640 #endif // include guard
|