3 // Copyright (c) 2006-2007 Matias Capeletto
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)
9 /// \file detail/map_view_iterator.hpp
10 /// \brief Iterator adaptors from multi-index to bimap.
12 #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
13 #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
19 #include <boost/config.hpp>
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
28 #include <boost/iterator/detail/enable_if.hpp>
29 #include <boost/iterator/iterator_adaptor.hpp>
30 #include <boost/bimap/relation/support/pair_by.hpp>
33 #include <boost/bimap/relation/detail/metadata_access_builder.hpp>
34 #include <boost/bimap/relation/detail/static_access_builder.hpp>
40 /** \brief Map View Iterator adaptors from multi index to bimap.
42 These classes are based on transform iterators from Boost.Iterator.
45 template< class Tag, class BimapCore > struct map_view_iterator ;
46 template< class Tag, class BimapCore > struct const_map_view_iterator ;
48 template< class Tag, class BimapCore > struct reverse_map_view_iterator ;
49 template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ;
51 template< class Tag, class BimapCore > struct local_map_view_iterator ;
52 template< class Tag, class BimapCore > struct const_local_map_view_iterator ;
55 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
57 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
58 /*===========================================================================*/
59 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \
60 BOOST_SERIALIZATION_SPLIT_MEMBER() \
62 friend class ::boost::serialization::access; \
64 template< class Archive > \
65 void save(Archive & ar, const unsigned int) const \
67 ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \
70 template< class Archive > \
71 void load(Archive & ar, const unsigned int) \
73 BOOST_DEDUCED_TYPENAME base_::base_type iter; \
74 ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \
75 this->base_reference() = iter; \
77 /*===========================================================================*/
79 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None
80 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
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 \
92 /*===========================================================================*/
95 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by
98 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by
101 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by
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
116 template< class Tag, class BimapCore >
117 struct map_view_iterator :
118 public map_view_iterator_adaptor<Tag,BimapCore>::type
120 typedef BOOST_DEDUCED_TYPENAME
121 map_view_iterator_adaptor<Tag,BimapCore>::type base_;
124 map_view_iterator() {}
125 map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
127 map_view_iterator(map_view_iterator const & iter)
128 : base_(iter.base()) {}
130 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
132 return ::boost::bimaps::relation::support::pair_by<Tag>(
133 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
139 friend class iterator_core_access;
140 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
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
153 template< class Tag, class BimapCore >
154 struct const_map_view_iterator :
155 public const_map_view_iterator_adaptor<Tag,BimapCore>::type
157 typedef BOOST_DEDUCED_TYPENAME
158 const_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
161 const_map_view_iterator() {}
162 const_map_view_iterator(
163 BOOST_DEDUCED_TYPENAME base_::base_type const& 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)
170 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
172 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
175 friend class iterator_core_access;
176 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
180 // reverse_map_view_iterator
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
192 template< class Tag, class BimapCore >
193 struct reverse_map_view_iterator :
194 public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
196 typedef BOOST_DEDUCED_TYPENAME
197 reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
200 reverse_map_view_iterator() {}
201 reverse_map_view_iterator(
202 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
204 reverse_map_view_iterator(reverse_map_view_iterator const & iter)
205 : base_(iter.base()) {}
207 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
209 return ::boost::bimaps::relation::support::pair_by<Tag>(
210 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
216 friend class iterator_core_access;
217 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
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
230 template< class Tag, class BimapCore >
231 struct const_reverse_map_view_iterator :
232 public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
234 typedef BOOST_DEDUCED_TYPENAME
235 const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
239 const_reverse_map_view_iterator() {}
240 const_reverse_map_view_iterator(
241 BOOST_DEDUCED_TYPENAME base_::base_type const& 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)
248 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
250 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
253 friend class iterator_core_access;
254 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
258 // local_map_view_iterator
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
270 template< class Tag, class BimapCore >
271 struct local_map_view_iterator :
272 public local_map_view_iterator_adaptor<Tag,BimapCore>::type
274 typedef BOOST_DEDUCED_TYPENAME
275 local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
278 local_map_view_iterator() {}
279 local_map_view_iterator(
280 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
282 local_map_view_iterator(local_map_view_iterator const & iter)
283 : base_(iter.base()) {}
285 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
287 return ::boost::bimaps::relation::support::pair_by<Tag>(
288 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
294 friend class iterator_core_access;
295 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
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
308 template< class Tag, class BimapCore >
309 struct const_local_map_view_iterator :
310 public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type
312 typedef BOOST_DEDUCED_TYPENAME
313 const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
316 const_local_map_view_iterator() {}
317 const_local_map_view_iterator(
318 BOOST_DEDUCED_TYPENAME base_::base_type const& 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)
325 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
327 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
330 friend class iterator_core_access;
331 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
334 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
336 } // namespace detail
337 } // namespace bimaps
340 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP