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