]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/range/detail/any_iterator_interface.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / range / detail / any_iterator_interface.hpp
CommitLineData
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
20namespace 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