]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/bimap/detail/map_view_iterator.hpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / boost / bimap / detail / map_view_iterator.hpp
1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8
9 /// \file detail/map_view_iterator.hpp
10 /// \brief Iterator adaptors from multi-index to bimap.
11
12 #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
13 #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
14
15 #if defined(_MSC_VER)
16 #pragma once
17 #endif
18
19 #include <boost/config.hpp>
20
21 // Boost
22
23 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
24 #include <boost/serialization/nvp.hpp>
25 #include <boost/serialization/split_member.hpp>
26 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
27
28 #include <boost/iterator/detail/enable_if.hpp>
29 #include <boost/iterator/iterator_adaptor.hpp>
30 #include <boost/bimap/relation/support/pair_by.hpp>
31
32 // check
33 #include <boost/bimap/relation/detail/metadata_access_builder.hpp>
34 #include <boost/bimap/relation/detail/static_access_builder.hpp>
35
36 namespace boost {
37 namespace bimaps {
38 namespace detail {
39
40 /** \brief Map View Iterator adaptors from multi index to bimap.
41
42 These classes are based on transform iterators from Boost.Iterator.
43 **/
44
45 template< class Tag, class BimapCore > struct map_view_iterator ;
46 template< class Tag, class BimapCore > struct const_map_view_iterator ;
47
48 template< class Tag, class BimapCore > struct reverse_map_view_iterator ;
49 template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ;
50
51 template< class Tag, class BimapCore > struct local_map_view_iterator ;
52 template< class Tag, class BimapCore > struct const_local_map_view_iterator ;
53
54
55 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
56
57 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
58 /*===========================================================================*/
59 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \
60 BOOST_SERIALIZATION_SPLIT_MEMBER() \
61 \
62 friend class ::boost::serialization::access; \
63 \
64 template< class Archive > \
65 void save(Archive & ar, const unsigned int) const \
66 { \
67 ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \
68 } \
69 \
70 template< class Archive > \
71 void load(Archive & ar, const unsigned int) \
72 { \
73 BOOST_DEDUCED_TYPENAME base_::base_type iter; \
74 ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \
75 this->base_reference() = iter; \
76 }
77 /*===========================================================================*/
78 #else
79 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None
80 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
81
82 /*===========================================================================*/
83 #define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \
84 BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \
85 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
86 index<BOOST_DEDUCED_TYPENAME BimapCore::left_tag> \
87 ::type::ITERATOR type, \
88 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
89 index<BOOST_DEDUCED_TYPENAME BimapCore::right_tag> \
90 ::type::ITERATOR type \
91 )
92 /*===========================================================================*/
93
94
95 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by
96 , iterator )
97
98 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by
99 , reverse_iterator )
100
101 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by
102 , local_iterator )
103
104
105 // map_view_iterator
106
107 template< class Tag, class BimapCore >
108 struct map_view_iterator_adaptor {
109 typedef iterator_adaptor<
110 map_view_iterator<Tag,BimapCore>,
111 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
112 BOOST_DEDUCED_TYPENAME
113 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
114 > type;
115 };
116 template< class Tag, class BimapCore >
117 struct map_view_iterator :
118 public map_view_iterator_adaptor<Tag,BimapCore>::type
119 {
120 typedef BOOST_DEDUCED_TYPENAME
121 map_view_iterator_adaptor<Tag,BimapCore>::type base_;
122 public:
123
124 map_view_iterator() {}
125 map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
126 : base_(iter) {}
127 map_view_iterator(map_view_iterator const & iter)
128 : base_(iter.base()) {}
129
130 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
131 {
132 return ::boost::bimaps::relation::support::pair_by<Tag>(
133 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
134 &(*this->base())
135 )
136 );
137 }
138 private:
139 friend class iterator_core_access;
140 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
141 };
142
143
144 template< class Tag, class BimapCore >
145 struct const_map_view_iterator_adaptor {
146 typedef iterator_adaptor<
147 const_map_view_iterator<Tag,BimapCore>,
148 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
149 const BOOST_DEDUCED_TYPENAME
150 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
151 > type;
152 };
153 template< class Tag, class BimapCore >
154 struct const_map_view_iterator :
155 public const_map_view_iterator_adaptor<Tag,BimapCore>::type
156 {
157 typedef BOOST_DEDUCED_TYPENAME
158 const_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
159 public:
160
161 const_map_view_iterator() {}
162 const_map_view_iterator(
163 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
164 : base_(iter) {}
165 const_map_view_iterator(const_map_view_iterator const & iter)
166 : base_(iter.base()) {}
167 const_map_view_iterator(map_view_iterator<Tag,BimapCore> i)
168 : base_(i.base()) {}
169
170 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
171 {
172 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
173 }
174 private:
175 friend class iterator_core_access;
176 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
177 };
178
179
180 // reverse_map_view_iterator
181
182 template< class Tag, class BimapCore >
183 struct reverse_map_view_iterator_adaptor {
184 typedef iterator_adaptor<
185 reverse_map_view_iterator<Tag,BimapCore>,
186 BOOST_DEDUCED_TYPENAME
187 reverse_core_iterator_type_by<Tag,BimapCore>::type,
188 BOOST_DEDUCED_TYPENAME
189 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
190 > type;
191 };
192 template< class Tag, class BimapCore >
193 struct reverse_map_view_iterator :
194 public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
195 {
196 typedef BOOST_DEDUCED_TYPENAME
197 reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
198 public:
199
200 reverse_map_view_iterator() {}
201 reverse_map_view_iterator(
202 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
203 : base_(iter) {}
204 reverse_map_view_iterator(reverse_map_view_iterator const & iter)
205 : base_(iter.base()) {}
206
207 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
208 {
209 return ::boost::bimaps::relation::support::pair_by<Tag>(
210 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
211 &(*this->base())
212 )
213 );
214 }
215 private:
216 friend class iterator_core_access;
217 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
218 };
219
220 template< class Tag, class BimapCore >
221 struct const_reverse_map_view_iterator_adaptor {
222 typedef iterator_adaptor<
223 const_reverse_map_view_iterator<Tag,BimapCore>,
224 BOOST_DEDUCED_TYPENAME
225 reverse_core_iterator_type_by<Tag,BimapCore>::type,
226 const BOOST_DEDUCED_TYPENAME
227 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
228 > type;
229 };
230 template< class Tag, class BimapCore >
231 struct const_reverse_map_view_iterator :
232 public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
233 {
234 typedef BOOST_DEDUCED_TYPENAME
235 const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
236
237 public:
238
239 const_reverse_map_view_iterator() {}
240 const_reverse_map_view_iterator(
241 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
242 : base_(iter) {}
243 const_reverse_map_view_iterator(const_reverse_map_view_iterator const & iter)
244 : base_(iter.base()) {}
245 const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i)
246 : base_(i.base()) {}
247
248 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
249 {
250 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
251 }
252 private:
253 friend class iterator_core_access;
254 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
255 };
256
257
258 // local_map_view_iterator
259
260 template< class Tag, class BimapCore >
261 struct local_map_view_iterator_adaptor {
262 typedef iterator_adaptor<
263 local_map_view_iterator<Tag,BimapCore>,
264 BOOST_DEDUCED_TYPENAME
265 local_core_iterator_type_by<Tag,BimapCore>::type,
266 BOOST_DEDUCED_TYPENAME
267 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
268 > type;
269 };
270 template< class Tag, class BimapCore >
271 struct local_map_view_iterator :
272 public local_map_view_iterator_adaptor<Tag,BimapCore>::type
273 {
274 typedef BOOST_DEDUCED_TYPENAME
275 local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
276 public:
277
278 local_map_view_iterator() {}
279 local_map_view_iterator(
280 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
281 : base_(iter) {}
282 local_map_view_iterator(local_map_view_iterator const & iter)
283 : base_(iter.base()) {}
284
285 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
286 {
287 return ::boost::bimaps::relation::support::pair_by<Tag>(
288 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
289 &(*this->base())
290 )
291 );
292 }
293 private:
294 friend class iterator_core_access;
295 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
296 };
297
298 template< class Tag, class BimapCore >
299 struct const_local_map_view_iterator_adaptor {
300 typedef iterator_adaptor<
301 const_local_map_view_iterator<Tag,BimapCore>,
302 BOOST_DEDUCED_TYPENAME
303 local_core_iterator_type_by<Tag,BimapCore>::type,
304 const BOOST_DEDUCED_TYPENAME
305 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
306 > type;
307 };
308 template< class Tag, class BimapCore >
309 struct const_local_map_view_iterator :
310 public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type
311 {
312 typedef BOOST_DEDUCED_TYPENAME
313 const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
314 public:
315
316 const_local_map_view_iterator() {}
317 const_local_map_view_iterator(
318 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
319 : base_(iter) {}
320 const_local_map_view_iterator(const_local_map_view_iterator const & iter)
321 : base_(iter.base()) {}
322 const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i)
323 : base_(i.base()) {}
324
325 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
326 {
327 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
328 }
329 private:
330 friend class iterator_core_access;
331 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
332 };
333
334 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
335
336 } // namespace detail
337 } // namespace bimaps
338 } // namespace boost
339
340 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
341
342