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