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