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 
map_view_iteratorboost::bimaps::detail::map_view_iterator124     map_view_iterator() {}
map_view_iteratorboost::bimaps::detail::map_view_iterator125     map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
126       : base_(iter) {}
127 
dereferenceboost::bimaps::detail::map_view_iterator128     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
129     {
130         return ::boost::bimaps::relation::support::pair_by<Tag>(
131             *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
132                 &(*this->base())
133             )
134         );
135     }
136     private:
137     friend class iterator_core_access;
138     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
139 };
140 
141 
142 template< class Tag, class BimapCore >
143 struct const_map_view_iterator_adaptor {
144     typedef iterator_adaptor<
145         const_map_view_iterator<Tag,BimapCore>,
146         BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
147         const BOOST_DEDUCED_TYPENAME
148             ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
149     > type;
150 };
151 template< class Tag, class BimapCore >
152 struct const_map_view_iterator :
153     public const_map_view_iterator_adaptor<Tag,BimapCore>::type
154 {
155     typedef BOOST_DEDUCED_TYPENAME
156         const_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
157     public:
158 
const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator159     const_map_view_iterator() {}
const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator160     const_map_view_iterator(
161             BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
162       : base_(iter) {}
const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator163 	const_map_view_iterator(map_view_iterator<Tag,BimapCore> i)
164       : base_(i.base()) {}
165 
dereferenceboost::bimaps::detail::const_map_view_iterator166     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
167     {
168         return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
169     }
170     private:
171     friend class iterator_core_access;
172     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
173 };
174 
175 
176 // reverse_map_view_iterator
177 
178 template< class Tag, class BimapCore >
179 struct reverse_map_view_iterator_adaptor {
180     typedef iterator_adaptor<
181         reverse_map_view_iterator<Tag,BimapCore>,
182         BOOST_DEDUCED_TYPENAME
183             reverse_core_iterator_type_by<Tag,BimapCore>::type,
184         BOOST_DEDUCED_TYPENAME
185             ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
186     > type;
187 };
188 template< class Tag, class BimapCore >
189 struct reverse_map_view_iterator :
190     public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
191 {
192     typedef BOOST_DEDUCED_TYPENAME
193         reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
194     public:
195 
reverse_map_view_iteratorboost::bimaps::detail::reverse_map_view_iterator196     reverse_map_view_iterator() {}
reverse_map_view_iteratorboost::bimaps::detail::reverse_map_view_iterator197     reverse_map_view_iterator(
198             BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
199       : base_(iter) {}
200 
dereferenceboost::bimaps::detail::reverse_map_view_iterator201     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
202     {
203         return ::boost::bimaps::relation::support::pair_by<Tag>(
204             *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
205                 &(*this->base())
206             )
207         );
208     }
209     private:
210     friend class iterator_core_access;
211     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
212 };
213 
214 template< class Tag, class BimapCore >
215 struct const_reverse_map_view_iterator_adaptor {
216     typedef iterator_adaptor<
217         const_reverse_map_view_iterator<Tag,BimapCore>,
218         BOOST_DEDUCED_TYPENAME
219             reverse_core_iterator_type_by<Tag,BimapCore>::type,
220         const BOOST_DEDUCED_TYPENAME
221             ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
222     > type;
223 };
224 template< class Tag, class BimapCore >
225 struct const_reverse_map_view_iterator :
226     public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
227 {
228     typedef BOOST_DEDUCED_TYPENAME
229         const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
230 
231     public:
232 
const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator233     const_reverse_map_view_iterator() {}
const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator234     const_reverse_map_view_iterator(
235             BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
236       : base_(iter) {}
const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator237 	const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i)
238       : base_(i.base()) {}
239 
dereferenceboost::bimaps::detail::const_reverse_map_view_iterator240     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
241     {
242         return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
243     }
244     private:
245     friend class iterator_core_access;
246     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
247 };
248 
249 
250 // local_map_view_iterator
251 
252 template< class Tag, class BimapCore >
253 struct local_map_view_iterator_adaptor {
254     typedef iterator_adaptor<
255         local_map_view_iterator<Tag,BimapCore>,
256         BOOST_DEDUCED_TYPENAME
257             local_core_iterator_type_by<Tag,BimapCore>::type,
258         BOOST_DEDUCED_TYPENAME
259             ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
260     > type;
261 };
262 template< class Tag, class BimapCore >
263 struct local_map_view_iterator :
264     public local_map_view_iterator_adaptor<Tag,BimapCore>::type
265 {
266     typedef BOOST_DEDUCED_TYPENAME
267         local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
268     public:
269 
local_map_view_iteratorboost::bimaps::detail::local_map_view_iterator270     local_map_view_iterator() {}
local_map_view_iteratorboost::bimaps::detail::local_map_view_iterator271     local_map_view_iterator(
272             BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
273       : base_(iter) {}
274 
dereferenceboost::bimaps::detail::local_map_view_iterator275     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
276     {
277         return ::boost::bimaps::relation::support::pair_by<Tag>(
278             *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
279                 &(*this->base())
280             )
281         );
282     }
283     private:
284     friend class iterator_core_access;
285     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
286 };
287 
288 template< class Tag, class BimapCore >
289 struct const_local_map_view_iterator_adaptor {
290     typedef iterator_adaptor<
291         const_local_map_view_iterator<Tag,BimapCore>,
292         BOOST_DEDUCED_TYPENAME
293             local_core_iterator_type_by<Tag,BimapCore>::type,
294         const BOOST_DEDUCED_TYPENAME
295             ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
296     > type;
297 };
298 template< class Tag, class BimapCore >
299 struct const_local_map_view_iterator :
300     public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type
301 {
302     typedef BOOST_DEDUCED_TYPENAME
303         const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
304     public:
305 
const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator306     const_local_map_view_iterator() {}
const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator307     const_local_map_view_iterator(
308             BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
309       : base_(iter) {}
const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator310 	const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i)
311       : base_(i.base()) {}
312 
dereferenceboost::bimaps::detail::const_local_map_view_iterator313     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
314     {
315         return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
316     }
317     private:
318     friend class iterator_core_access;
319     BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
320 };
321 
322 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
323 
324 } // namespace detail
325 } // namespace bimaps
326 } // namespace boost
327 
328 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
329 
330 
331