• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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