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 views/vector_map_view.hpp
|
Chris@16
|
10 /// \brief View of a side of a bimap.
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_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 #include <boost/bimap/container_adaptor/vector_map_adaptor.hpp>
|
Chris@16
|
22 #include <boost/bimap/support/iterator_type_by.hpp>
|
Chris@16
|
23 #include <boost/bimap/detail/map_view_base.hpp>
|
Chris@16
|
24 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 namespace boost {
|
Chris@16
|
27 namespace bimaps {
|
Chris@16
|
28 namespace views {
|
Chris@16
|
29
|
Chris@16
|
30 /// \brief View of a side of a bimap.
|
Chris@16
|
31 /**
|
Chris@16
|
32
|
Chris@16
|
33 This class uses container_adaptor and iterator_adaptor to wrapped a index of the
|
Chris@16
|
34 multi_index bimap core.
|
Chris@16
|
35
|
Chris@16
|
36 See also const_map_view.
|
Chris@16
|
37 **/
|
Chris@16
|
38 template< class Tag, class BimapType >
|
Chris@16
|
39 class vector_map_view
|
Chris@16
|
40 :
|
Chris@16
|
41 public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR(
|
Chris@16
|
42 vector_map_adaptor,
|
Chris@16
|
43 Tag,BimapType,
|
Chris@16
|
44 reverse_map_view_iterator, const_reverse_map_view_iterator
|
Chris@16
|
45 ),
|
Chris@16
|
46
|
Chris@16
|
47 public ::boost::bimaps::detail::
|
Chris@16
|
48 map_view_base< vector_map_view<Tag,BimapType>,Tag,BimapType >
|
Chris@16
|
49 {
|
Chris@16
|
50 typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR(
|
Chris@16
|
51 vector_map_adaptor,
|
Chris@16
|
52 Tag,BimapType,
|
Chris@16
|
53 reverse_map_view_iterator, const_reverse_map_view_iterator
|
Chris@16
|
54
|
Chris@16
|
55 ) base_;
|
Chris@16
|
56
|
Chris@16
|
57 BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(vector_map_view,Tag,BimapType)
|
Chris@16
|
58
|
Chris@16
|
59 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::data_extractor
|
Chris@16
|
60 <
|
Chris@16
|
61 Tag,
|
Chris@16
|
62 BOOST_DEDUCED_TYPENAME BimapType::relation
|
Chris@16
|
63
|
Chris@16
|
64 >::type key_from_base_value;
|
Chris@16
|
65
|
Chris@16
|
66 public:
|
Chris@16
|
67
|
Chris@16
|
68 typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type;
|
Chris@16
|
69
|
Chris@16
|
70 vector_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) :
|
Chris@16
|
71 base_(c) {}
|
Chris@16
|
72
|
Chris@16
|
73 vector_map_view & operator=(const vector_map_view & v)
|
Chris@16
|
74 {
|
Chris@16
|
75 this->base() = v.base();
|
Chris@16
|
76 return *this;
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 BOOST_DEDUCED_TYPENAME base_::const_reference
|
Chris@16
|
80 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const
|
Chris@16
|
81 {
|
Chris@16
|
82 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
|
Chris@16
|
83 this->base().operator[](n)
|
Chris@16
|
84 );
|
Chris@16
|
85 }
|
Chris@16
|
86
|
Chris@16
|
87 BOOST_DEDUCED_TYPENAME base_::const_reference
|
Chris@16
|
88 at(BOOST_DEDUCED_TYPENAME base_::size_type n) const
|
Chris@16
|
89 {
|
Chris@16
|
90 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
|
Chris@16
|
91 this->base().at(n)
|
Chris@16
|
92 );
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 BOOST_DEDUCED_TYPENAME base_::reference
|
Chris@16
|
96 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n)
|
Chris@16
|
97 {
|
Chris@16
|
98 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
|
Chris@16
|
99 const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>(
|
Chris@16
|
100 this->base().operator[](n)
|
Chris@16
|
101 ));
|
Chris@16
|
102 }
|
Chris@16
|
103
|
Chris@16
|
104 BOOST_DEDUCED_TYPENAME base_::reference
|
Chris@16
|
105 at(BOOST_DEDUCED_TYPENAME base_::size_type n)
|
Chris@16
|
106 {
|
Chris@16
|
107 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
|
Chris@16
|
108 const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>(
|
Chris@16
|
109 this->base().at(n)
|
Chris@16
|
110 ));
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_)
|
Chris@16
|
114
|
Chris@16
|
115 BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_)
|
Chris@16
|
116
|
Chris@16
|
117 // Lists operations
|
Chris@16
|
118
|
Chris@16
|
119 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, vector_map_view & x)
|
Chris@16
|
120 {
|
Chris@16
|
121 this->base().splice(
|
Chris@16
|
122 this->template functor<
|
Chris@16
|
123 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
|
Chris@16
|
124 x.base()
|
Chris@16
|
125 );
|
Chris@16
|
126 }
|
Chris@16
|
127
|
Chris@16
|
128 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position,
|
Chris@16
|
129 vector_map_view & x,
|
Chris@16
|
130 BOOST_DEDUCED_TYPENAME base_::iterator i)
|
Chris@16
|
131 {
|
Chris@16
|
132 this->base().splice(
|
Chris@16
|
133 this->template functor<
|
Chris@16
|
134 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
|
Chris@16
|
135 x.base(),
|
Chris@16
|
136 this->template functor<
|
Chris@16
|
137 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
|
Chris@16
|
138 );
|
Chris@16
|
139 }
|
Chris@16
|
140
|
Chris@16
|
141 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position,
|
Chris@16
|
142 vector_map_view & x,
|
Chris@16
|
143 BOOST_DEDUCED_TYPENAME base_::iterator first,
|
Chris@16
|
144 BOOST_DEDUCED_TYPENAME base_::iterator last)
|
Chris@16
|
145 {
|
Chris@16
|
146 this->base().splice(
|
Chris@16
|
147 this->template functor<
|
Chris@16
|
148 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
|
Chris@16
|
149 x.base(),
|
Chris@16
|
150 this->template functor<
|
Chris@16
|
151 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
|
Chris@16
|
152 this->template functor<
|
Chris@16
|
153 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
|
Chris@16
|
154 );
|
Chris@16
|
155 }
|
Chris@16
|
156
|
Chris@16
|
157 void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
158 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value)
|
Chris@16
|
159 {
|
Chris@16
|
160 this->base().remove(
|
Chris@16
|
161 this->template functor<
|
Chris@16
|
162 BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value)
|
Chris@16
|
163 );
|
Chris@16
|
164 }
|
Chris@16
|
165
|
Chris@16
|
166 template< class Predicate >
|
Chris@16
|
167 void remove_if(Predicate pred)
|
Chris@16
|
168 {
|
Chris@16
|
169 this->base().remove_if(
|
Chris@16
|
170 ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
|
Chris@16
|
171 <
|
Chris@16
|
172 Predicate,
|
Chris@16
|
173 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
174 key_from_base_value
|
Chris@16
|
175
|
Chris@16
|
176 >( pred, key_from_base_value() )
|
Chris@16
|
177 );
|
Chris@16
|
178 }
|
Chris@16
|
179
|
Chris@16
|
180 void unique()
|
Chris@16
|
181 {
|
Chris@16
|
182 this->base().unique(
|
Chris@16
|
183 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
184 <
|
Chris@16
|
185 std::equal_to<BOOST_DEDUCED_TYPENAME base_::key_type>,
|
Chris@16
|
186 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
187 key_from_base_value
|
Chris@16
|
188
|
Chris@16
|
189 >(std::equal_to<BOOST_DEDUCED_TYPENAME base_::key_type>(),
|
Chris@16
|
190 key_from_base_value() )
|
Chris@16
|
191 );
|
Chris@16
|
192 }
|
Chris@16
|
193
|
Chris@16
|
194 template< class BinaryPredicate >
|
Chris@16
|
195 void unique(BinaryPredicate binary_pred)
|
Chris@16
|
196 {
|
Chris@16
|
197 this->base().unique(
|
Chris@16
|
198 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
199 <
|
Chris@16
|
200 BinaryPredicate,
|
Chris@16
|
201 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
202 key_from_base_value
|
Chris@16
|
203
|
Chris@16
|
204 >( binary_pred, key_from_base_value() )
|
Chris@16
|
205 );
|
Chris@16
|
206 }
|
Chris@16
|
207
|
Chris@16
|
208 void merge(vector_map_view & x)
|
Chris@16
|
209 {
|
Chris@16
|
210 this->base().merge(x.base(),
|
Chris@16
|
211 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
212 <
|
Chris@16
|
213 std::less<BOOST_DEDUCED_TYPENAME base_::key_type>,
|
Chris@16
|
214 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
215 key_from_base_value
|
Chris@16
|
216
|
Chris@16
|
217 >( std::less<BOOST_DEDUCED_TYPENAME base_::key_type>(),
|
Chris@16
|
218 key_from_base_value() )
|
Chris@16
|
219 );
|
Chris@16
|
220 }
|
Chris@16
|
221
|
Chris@16
|
222 template< class Compare >
|
Chris@16
|
223 void merge(vector_map_view & x, Compare comp)
|
Chris@16
|
224 {
|
Chris@16
|
225 this->base().merge(x.base(),
|
Chris@16
|
226 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
227 <
|
Chris@16
|
228 Compare,
|
Chris@16
|
229 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
230 key_from_base_value
|
Chris@16
|
231
|
Chris@16
|
232 >( comp, key_from_base_value() )
|
Chris@16
|
233 );
|
Chris@16
|
234 }
|
Chris@16
|
235
|
Chris@16
|
236 void sort()
|
Chris@16
|
237 {
|
Chris@16
|
238 this->base().sort(
|
Chris@16
|
239 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
240 <
|
Chris@16
|
241 std::less<BOOST_DEDUCED_TYPENAME base_::key_type>,
|
Chris@16
|
242 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
243 key_from_base_value
|
Chris@16
|
244
|
Chris@16
|
245 >( std::less<BOOST_DEDUCED_TYPENAME base_::key_type>(),
|
Chris@16
|
246 key_from_base_value() )
|
Chris@16
|
247 );
|
Chris@16
|
248 }
|
Chris@16
|
249
|
Chris@16
|
250 template< class Compare >
|
Chris@16
|
251 void sort(Compare comp)
|
Chris@16
|
252 {
|
Chris@16
|
253 this->base().sort(
|
Chris@16
|
254 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
255 <
|
Chris@16
|
256 Compare,
|
Chris@16
|
257 BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
|
Chris@16
|
258 key_from_base_value
|
Chris@16
|
259
|
Chris@16
|
260 >( comp, key_from_base_value() )
|
Chris@16
|
261 );
|
Chris@16
|
262 }
|
Chris@16
|
263
|
Chris@16
|
264 void reverse()
|
Chris@16
|
265 {
|
Chris@16
|
266 this->base().reverse();
|
Chris@16
|
267 }
|
Chris@16
|
268
|
Chris@16
|
269 // Rearrange Operations
|
Chris@16
|
270
|
Chris@16
|
271 void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,
|
Chris@16
|
272 BOOST_DEDUCED_TYPENAME base_::iterator i)
|
Chris@16
|
273 {
|
Chris@16
|
274 this->base().relocate(
|
Chris@16
|
275 this->template functor<
|
Chris@16
|
276 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
|
Chris@16
|
277 this->template functor<
|
Chris@16
|
278 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
|
Chris@16
|
279 );
|
Chris@16
|
280 }
|
Chris@16
|
281
|
Chris@16
|
282 void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,
|
Chris@16
|
283 BOOST_DEDUCED_TYPENAME base_::iterator first,
|
Chris@16
|
284 BOOST_DEDUCED_TYPENAME base_::iterator last)
|
Chris@16
|
285 {
|
Chris@16
|
286 this->base().relocate(
|
Chris@16
|
287 this->template functor<
|
Chris@16
|
288 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
|
Chris@16
|
289 this->template functor<
|
Chris@16
|
290 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
|
Chris@16
|
291 this->template functor<
|
Chris@16
|
292 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
|
Chris@16
|
293 );
|
Chris@16
|
294 }
|
Chris@16
|
295
|
Chris@16
|
296 };
|
Chris@16
|
297
|
Chris@16
|
298
|
Chris@16
|
299 } // namespace views
|
Chris@16
|
300
|
Chris@16
|
301 /*===========================================================================*/
|
Chris@16
|
302 #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \
|
Chris@16
|
303 typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \
|
Chris@16
|
304 BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME));
|
Chris@16
|
305 /*===========================================================================*/
|
Chris@16
|
306
|
Chris@16
|
307 /*===========================================================================*/
|
Chris@16
|
308 #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \
|
Chris@16
|
309 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \
|
Chris@16
|
310 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator)
|
Chris@16
|
311 /*===========================================================================*/
|
Chris@16
|
312
|
Chris@16
|
313 namespace detail {
|
Chris@16
|
314
|
Chris@16
|
315 template< class Tag, class BimapType >
|
Chris@16
|
316 struct left_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view<Tag,BimapType> >
|
Chris@16
|
317 {
|
Chris@16
|
318 private: typedef ::boost::bimaps::views::vector_map_view<Tag,BimapType> map_view_;
|
Chris@16
|
319 public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left)
|
Chris@16
|
320 };
|
Chris@16
|
321
|
Chris@16
|
322 template< class Tag, class BimapType >
|
Chris@16
|
323 struct right_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view<Tag,BimapType> >
|
Chris@16
|
324 {
|
Chris@16
|
325 private: typedef ::boost::bimaps::views::vector_map_view<Tag,BimapType> map_view_;
|
Chris@16
|
326 public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right)
|
Chris@16
|
327 };
|
Chris@16
|
328
|
Chris@16
|
329 } // namespace detail
|
Chris@16
|
330
|
Chris@16
|
331 /*===========================================================================*/
|
Chris@16
|
332 #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF
|
Chris@16
|
333 #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY
|
Chris@16
|
334 /*===========================================================================*/
|
Chris@16
|
335
|
Chris@16
|
336 } // namespace bimaps
|
Chris@16
|
337 } // namespace boost
|
Chris@16
|
338
|
Chris@16
|
339 #endif // BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP
|
Chris@16
|
340
|