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