897cbe6ac8773ed28fe03221333bd1ef1efb7734
[senf.git] / 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) && (_MSC_VER>=1200)
16 #pragma once
17 #endif
18
19 #include <boost/config.hpp>
20
21 // Boost
22 // #include <boost/serialization/nvp.hpp>
23 #include <boost/iterator/detail/enable_if.hpp>
24 #include <boost/iterator/iterator_adaptor.hpp>
25 #include <boost/bimap/relation/support/pair_by.hpp>
26
27 namespace boost {
28 namespace bimaps {
29 namespace detail {
30
31 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
32
33 template< class Tag, class Relation, class CoreIterator > struct map_view_iterator;
34
35 template< class Tag, class Relation, class CoreIterator >
36 struct map_view_iterator_base
37 {
38     typedef iterator_adaptor
39     <
40         map_view_iterator< Tag, Relation, CoreIterator >,
41         CoreIterator,
42         BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
43             pair_type_by<Tag,Relation>::type
44
45     > type;
46 };
47
48 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
49
50 /** \brief Map View Iterator adaptor from multi index to bimap.
51
52 This is class is based on transform iterator from Boost.Iterator that is
53 modified to allow serialization. It has been specialized for this
54 library, and EBO optimization was applied to the functor.
55
56                                                                       **/
57
58 template< class Tag, class Relation, class CoreIterator >
59 struct map_view_iterator : public map_view_iterator_base<Tag,Relation,CoreIterator>::type
60 {
61     typedef BOOST_DEDUCED_TYPENAME
62         map_view_iterator_base<Tag,Relation,CoreIterator>::type base_;
63
64     public:
65
66     map_view_iterator() {}
67
68     map_view_iterator(CoreIterator const& iter)
69       : base_(iter) {}
70
71     map_view_iterator(map_view_iterator const & iter)
72       : base_(iter.base()) {}
73
74     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
75     {
76         return ::boost::bimaps::relation::support::pair_by<Tag>(
77             *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
78                 &(*this->base())
79             )
80         );
81     }
82
83     private:
84
85     friend class iterator_core_access;
86
87     #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
88
89     // Serialization support
90
91     BOOST_SERIALIZATION_SPLIT_MEMBER()
92
93     friend class ::boost::serialization::access;
94
95     template< class Archive >
96     void save(Archive & ar, const unsigned int version) const
97     {
98         ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
99     }
100
101     template< class Archive >
102     void load(Archive & ar, const unsigned int version)
103     {
104         CoreIterator iter;
105         ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
106         this->base_reference() = iter;
107     }
108
109     #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
110 };
111
112
113 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
114
115 template< class Tag, class Relation, class CoreIterator > struct const_map_view_iterator;
116
117 template< class Tag, class Relation, class CoreIterator >
118 struct const_map_view_iterator_base
119 {
120     typedef iterator_adaptor
121     <
122         const_map_view_iterator< Tag, Relation, CoreIterator >,
123         CoreIterator,
124         const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
125              pair_type_by<Tag,Relation>::type
126
127     > type;
128 };
129
130 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
131
132
133 /** \brief Const Map View Iterator adaptor from multi index to bimap.
134
135 See also map_view_iterator.
136                                                                       **/
137
138 template< class Tag, class Relation, class CoreIterator >
139 struct const_map_view_iterator :
140
141     public const_map_view_iterator_base<Tag,Relation,CoreIterator>::type
142 {
143     typedef BOOST_DEDUCED_TYPENAME
144         const_map_view_iterator_base<Tag,Relation,CoreIterator>::type base_;
145
146     public:
147
148     const_map_view_iterator() {}
149
150     const_map_view_iterator(CoreIterator const& iter)
151       : base_(iter) {}
152
153     const_map_view_iterator(const_map_view_iterator const & iter)
154       : base_(iter.base()) {}
155
156     const_map_view_iterator(map_view_iterator<Tag,Relation,CoreIterator> i)
157       : base_(i.base()) {}
158
159     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
160     {
161         return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
162     }
163
164     private:
165
166     friend class iterator_core_access;
167
168     #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
169
170     // Serialization support
171
172     BOOST_SERIALIZATION_SPLIT_MEMBER()
173
174     friend class ::boost::serialization::access;
175
176     template< class Archive >
177     void save(Archive & ar, const unsigned int version) const
178     {
179         ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
180     }
181
182     template< class Archive >
183     void load(Archive & ar, const unsigned int version)
184     {
185         CoreIterator iter;
186         ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
187         this->base_reference() = iter;
188     }
189
190     #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
191 };
192
193
194 } // namespace detail
195 } // namespace bimaps
196 } // namespace boost
197
198 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
199
200