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/map_view_base.hpp
|
Chris@16
|
10 /// \brief Helper base for the construction of the bimap views types.
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_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 <stdexcept>
|
Chris@16
|
22 #include <utility>
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/throw_exception.hpp>
|
Chris@16
|
25 #include <boost/type_traits/is_const.hpp>
|
Chris@16
|
26 #include <boost/mpl/if.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 #include <boost/bimap/relation/support/get_pair_functor.hpp>
|
Chris@16
|
29 #include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp>
|
Chris@16
|
30 #include <boost/bimap/container_adaptor/support/iterator_facade_converters.hpp>
|
Chris@16
|
31 #include <boost/bimap/relation/support/data_extractor.hpp>
|
Chris@16
|
32 #include <boost/bimap/relation/support/opposite_tag.hpp>
|
Chris@16
|
33 #include <boost/bimap/relation/support/pair_type_by.hpp>
|
Chris@16
|
34 //#include <boost/bimap/support/iterator_type_by.hpp>
|
Chris@16
|
35 #include <boost/bimap/support/key_type_by.hpp>
|
Chris@16
|
36 #include <boost/bimap/support/data_type_by.hpp>
|
Chris@16
|
37 #include <boost/bimap/support/value_type_by.hpp>
|
Chris@16
|
38 #include <boost/bimap/detail/modifier_adaptor.hpp>
|
Chris@16
|
39 #include <boost/bimap/detail/debug/static_error.hpp>
|
Chris@16
|
40 #include <boost/bimap/detail/map_view_iterator.hpp>
|
Chris@16
|
41
|
Chris@16
|
42 namespace boost {
|
Chris@16
|
43 namespace bimaps {
|
Chris@16
|
44
|
Chris@16
|
45 namespace detail {
|
Chris@16
|
46
|
Chris@16
|
47
|
Chris@16
|
48 // The next macro can be converted in a metafunctor to gain code robustness.
|
Chris@16
|
49 /*===========================================================================*/
|
Chris@16
|
50 #define BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( \
|
Chris@16
|
51 CONTAINER_ADAPTOR, TAG, BIMAP, OTHER_ITER, CONST_OTHER_ITER \
|
Chris@16
|
52 ) \
|
Chris@16
|
53 ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \
|
Chris@16
|
54 < \
|
Chris@16
|
55 BOOST_DEDUCED_TYPENAME BIMAP::core_type:: \
|
Chris@16
|
56 BOOST_NESTED_TEMPLATE index<TAG>::type, \
|
Chris@16
|
57 ::boost::bimaps::detail:: map_view_iterator<TAG,BIMAP>, \
|
Chris@16
|
58 ::boost::bimaps::detail::const_map_view_iterator<TAG,BIMAP>, \
|
Chris@16
|
59 ::boost::bimaps::detail:: OTHER_ITER<TAG,BIMAP>, \
|
Chris@16
|
60 ::boost::bimaps::detail::CONST_OTHER_ITER<TAG,BIMAP>, \
|
Chris@16
|
61 ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \
|
Chris@16
|
62 < \
|
Chris@16
|
63 ::boost::bimaps::detail:: map_view_iterator<TAG,BIMAP>, \
|
Chris@16
|
64 ::boost::bimaps::detail::const_map_view_iterator<TAG,BIMAP> \
|
Chris@16
|
65 >, \
|
Chris@16
|
66 ::boost::mpl::na, \
|
Chris@16
|
67 ::boost::mpl::na, \
|
Chris@16
|
68 ::boost::bimaps::relation::detail:: \
|
Chris@16
|
69 pair_to_relation_functor<TAG,BOOST_DEDUCED_TYPENAME BIMAP::relation>, \
|
Chris@16
|
70 ::boost::bimaps::relation::support:: \
|
Chris@16
|
71 get_pair_functor<TAG, BOOST_DEDUCED_TYPENAME BIMAP::relation > \
|
Chris@16
|
72 >
|
Chris@16
|
73 /*===========================================================================*/
|
Chris@16
|
74
|
Chris@16
|
75
|
Chris@16
|
76 #if defined(BOOST_MSVC)
|
Chris@16
|
77 /*===========================================================================*/
|
Chris@16
|
78 #define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP) \
|
Chris@16
|
79 typedef ::boost::bimaps::detail::map_view_base< \
|
Chris@16
|
80 TYPE<TAG,BIMAP>,TAG,BIMAP > friend_map_view_base; \
|
Chris@16
|
81 friend class friend_map_view_base;
|
Chris@16
|
82 /*===========================================================================*/
|
Chris@16
|
83 #else
|
Chris@16
|
84 /*===========================================================================*/
|
Chris@16
|
85 #define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP) \
|
Chris@16
|
86 friend class ::boost::bimaps::detail::map_view_base< \
|
Chris@16
|
87 TYPE<TAG,BIMAP>,TAG,BIMAP >;
|
Chris@16
|
88 /*===========================================================================*/
|
Chris@16
|
89 #endif
|
Chris@16
|
90
|
Chris@16
|
91
|
Chris@16
|
92 /// \brief Common base for map views.
|
Chris@16
|
93
|
Chris@16
|
94 template< class Derived, class Tag, class BimapType>
|
Chris@16
|
95 class map_view_base
|
Chris@16
|
96 {
|
Chris@16
|
97 typedef ::boost::bimaps::container_adaptor::support::
|
Chris@16
|
98 iterator_facade_to_base<
|
Chris@16
|
99 ::boost::bimaps::detail:: map_view_iterator<Tag,BimapType>,
|
Chris@16
|
100 ::boost::bimaps::detail::const_map_view_iterator<Tag,BimapType>
|
Chris@16
|
101 > iterator_to_base_;
|
Chris@16
|
102
|
Chris@16
|
103 typedef ::boost::bimaps::relation::detail::
|
Chris@16
|
104 pair_to_relation_functor<Tag,
|
Chris@16
|
105 BOOST_DEDUCED_TYPENAME BimapType::relation> value_to_base_;
|
Chris@16
|
106
|
Chris@16
|
107 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
108 key_type_by<Tag,BimapType>::type key_type_;
|
Chris@16
|
109
|
Chris@16
|
110 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
111 data_type_by<Tag,BimapType>::type data_type_;
|
Chris@16
|
112
|
Chris@16
|
113 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
114 pair_type_by<Tag,
|
Chris@16
|
115 BOOST_DEDUCED_TYPENAME BimapType::relation>::type value_type_;
|
Chris@16
|
116
|
Chris@16
|
117 typedef
|
Chris@16
|
118 ::boost::bimaps::detail::map_view_iterator<Tag,BimapType> iterator_;
|
Chris@16
|
119
|
Chris@16
|
120 public:
|
Chris@16
|
121
|
Chris@16
|
122 bool replace(iterator_ position, const value_type_ & x)
|
Chris@16
|
123 {
|
Chris@16
|
124 return derived().base().replace(
|
Chris@16
|
125 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
126 derived().template functor<value_to_base_>()(x)
|
Chris@16
|
127 );
|
Chris@16
|
128 }
|
Chris@16
|
129
|
Chris@16
|
130 template< class CompatibleKey >
|
Chris@16
|
131 bool replace_key(iterator_ position, const CompatibleKey & k)
|
Chris@16
|
132 {
|
Chris@16
|
133 return derived().base().replace(
|
Chris@16
|
134 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
135 derived().template functor<value_to_base_>()(
|
Chris@16
|
136 ::boost::bimaps::relation::detail::
|
Chris@16
|
137 copy_with_first_replaced(*position,k)
|
Chris@16
|
138 )
|
Chris@16
|
139 );
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@16
|
142 template< class CompatibleData >
|
Chris@16
|
143 bool replace_data(iterator_ position, const CompatibleData & d)
|
Chris@16
|
144 {
|
Chris@16
|
145 return derived().base().replace(
|
Chris@16
|
146 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
147 derived().template functor<value_to_base_>()(
|
Chris@16
|
148 ::boost::bimaps::relation::detail::
|
Chris@16
|
149 copy_with_second_replaced(*position,d)
|
Chris@16
|
150 )
|
Chris@16
|
151 );
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 /* This function may be provided in the future
|
Chris@16
|
155
|
Chris@16
|
156 template< class Modifier >
|
Chris@16
|
157 bool modify(iterator_ position, Modifier mod)
|
Chris@16
|
158 {
|
Chris@16
|
159 return derived().base().modify(
|
Chris@16
|
160
|
Chris@16
|
161 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
162
|
Chris@16
|
163 ::boost::bimaps::detail::relation_modifier_adaptor
|
Chris@16
|
164 <
|
Chris@16
|
165 Modifier,
|
Chris@16
|
166 BOOST_DEDUCED_TYPENAME BimapType::relation,
|
Chris@16
|
167 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
168 data_extractor
|
Chris@16
|
169 <
|
Chris@16
|
170 Tag, BOOST_DEDUCED_TYPENAME BimapType::relation
|
Chris@16
|
171
|
Chris@16
|
172 >::type,
|
Chris@16
|
173 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
174 data_extractor
|
Chris@16
|
175 <
|
Chris@16
|
176 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
177 opossite_tag<Tag,BimapType>::type,
|
Chris@16
|
178 BOOST_DEDUCED_TYPENAME BimapType::relation
|
Chris@16
|
179
|
Chris@16
|
180 >::type
|
Chris@16
|
181
|
Chris@16
|
182 >(mod)
|
Chris@16
|
183 );
|
Chris@16
|
184 }
|
Chris@16
|
185 */
|
Chris@16
|
186
|
Chris@16
|
187 template< class Modifier >
|
Chris@16
|
188 bool modify_key(iterator_ position, Modifier mod)
|
Chris@16
|
189 {
|
Chris@16
|
190 return derived().base().modify_key(
|
Chris@16
|
191 derived().template functor<iterator_to_base_>()(position), mod
|
Chris@16
|
192 );
|
Chris@16
|
193 }
|
Chris@16
|
194
|
Chris@16
|
195 template< class Modifier >
|
Chris@16
|
196 bool modify_data(iterator_ position, Modifier mod)
|
Chris@16
|
197 {
|
Chris@16
|
198 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
199 data_extractor
|
Chris@16
|
200 <
|
Chris@16
|
201 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
202 opossite_tag<Tag,BimapType>::type,
|
Chris@16
|
203 BOOST_DEDUCED_TYPENAME BimapType::relation
|
Chris@16
|
204
|
Chris@16
|
205 >::type data_extractor_;
|
Chris@16
|
206
|
Chris@16
|
207 return derived().base().modify(
|
Chris@16
|
208
|
Chris@16
|
209 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
210
|
Chris@16
|
211 // this may be replaced later by
|
Chris@16
|
212 // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) )
|
Chris@16
|
213
|
Chris@16
|
214 ::boost::bimaps::detail::unary_modifier_adaptor
|
Chris@16
|
215 <
|
Chris@16
|
216 Modifier,
|
Chris@16
|
217 BOOST_DEDUCED_TYPENAME BimapType::relation,
|
Chris@16
|
218 data_extractor_
|
Chris@16
|
219
|
Chris@16
|
220 >(mod)
|
Chris@16
|
221 );
|
Chris@16
|
222 }
|
Chris@16
|
223
|
Chris@16
|
224 protected:
|
Chris@16
|
225
|
Chris@16
|
226 typedef map_view_base map_view_base_;
|
Chris@16
|
227
|
Chris@16
|
228 private:
|
Chris@16
|
229
|
Chris@16
|
230 // Curiously Recurring Template interface.
|
Chris@16
|
231
|
Chris@16
|
232 Derived& derived()
|
Chris@16
|
233 {
|
Chris@16
|
234 return *static_cast<Derived*>(this);
|
Chris@16
|
235 }
|
Chris@16
|
236
|
Chris@16
|
237 Derived const& derived() const
|
Chris@16
|
238 {
|
Chris@16
|
239 return *static_cast<Derived const*>(this);
|
Chris@16
|
240 }
|
Chris@16
|
241 };
|
Chris@16
|
242
|
Chris@16
|
243
|
Chris@16
|
244
|
Chris@16
|
245
|
Chris@16
|
246 template< class Derived, class Tag, class BimapType>
|
Chris@16
|
247 class mutable_data_unique_map_view_access
|
Chris@16
|
248 {
|
Chris@16
|
249 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
250 data_type_by<Tag,BimapType>::type data_type_;
|
Chris@16
|
251
|
Chris@16
|
252 public:
|
Chris@16
|
253
|
Chris@16
|
254 template< class CompatibleKey >
|
Chris@16
|
255 data_type_ & at(const CompatibleKey& k)
|
Chris@16
|
256 {
|
Chris@16
|
257 typedef ::boost::bimaps::detail::
|
Chris@16
|
258 map_view_iterator<Tag,BimapType> iterator;
|
Chris@16
|
259
|
Chris@16
|
260 iterator iter = derived().find(k);
|
Chris@16
|
261 if( iter == derived().end() )
|
Chris@16
|
262 {
|
Chris@16
|
263 ::boost::throw_exception(
|
Chris@16
|
264 std::out_of_range("bimap<>: invalid key")
|
Chris@16
|
265 );
|
Chris@16
|
266 }
|
Chris@16
|
267 return iter->second;
|
Chris@16
|
268 }
|
Chris@16
|
269
|
Chris@16
|
270 template< class CompatibleKey >
|
Chris@16
|
271 const data_type_ & at(const CompatibleKey& k) const
|
Chris@16
|
272 {
|
Chris@16
|
273 typedef ::boost::bimaps::detail::
|
Chris@16
|
274 const_map_view_iterator<Tag,BimapType> const_iterator;
|
Chris@16
|
275
|
Chris@16
|
276 const_iterator iter = derived().find(k);
|
Chris@16
|
277 if( iter == derived().end() )
|
Chris@16
|
278 {
|
Chris@16
|
279 ::boost::throw_exception(
|
Chris@16
|
280 std::out_of_range("bimap<>: invalid key")
|
Chris@16
|
281 );
|
Chris@16
|
282 }
|
Chris@16
|
283 return iter->second;
|
Chris@16
|
284 }
|
Chris@16
|
285
|
Chris@16
|
286 template< class CompatibleKey >
|
Chris@16
|
287 data_type_ & operator[](const CompatibleKey& k)
|
Chris@16
|
288 {
|
Chris@16
|
289 typedef ::boost::bimaps::detail::
|
Chris@16
|
290 map_view_iterator<Tag,BimapType> iterator;
|
Chris@16
|
291
|
Chris@16
|
292 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
293 value_type_by<Tag,BimapType>::type value_type;
|
Chris@16
|
294
|
Chris@16
|
295 iterator iter = derived().find(k);
|
Chris@16
|
296 if( iter == derived().end() )
|
Chris@16
|
297 {
|
Chris@16
|
298 iter = derived().insert( value_type(k,data_type_()) ).first;
|
Chris@16
|
299 }
|
Chris@16
|
300 return iter->second;
|
Chris@16
|
301 }
|
Chris@16
|
302
|
Chris@16
|
303 protected:
|
Chris@16
|
304
|
Chris@16
|
305 typedef mutable_data_unique_map_view_access
|
Chris@16
|
306 mutable_data_unique_map_view_access_;
|
Chris@16
|
307
|
Chris@16
|
308 private:
|
Chris@16
|
309
|
Chris@16
|
310 // Curiously Recurring Template interface.
|
Chris@16
|
311
|
Chris@16
|
312 Derived& derived()
|
Chris@16
|
313 {
|
Chris@16
|
314 return *static_cast<Derived*>(this);
|
Chris@16
|
315 }
|
Chris@16
|
316
|
Chris@16
|
317 Derived const& derived() const
|
Chris@16
|
318 {
|
Chris@16
|
319 return *static_cast<Derived const*>(this);
|
Chris@16
|
320 }
|
Chris@16
|
321 };
|
Chris@16
|
322
|
Chris@16
|
323
|
Chris@16
|
324 template< class Derived, class Tag, class BimapType>
|
Chris@16
|
325 class non_mutable_data_unique_map_view_access
|
Chris@16
|
326 {
|
Chris@16
|
327 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
328 data_type_by<Tag,BimapType>::type data_type_;
|
Chris@16
|
329
|
Chris@16
|
330 public:
|
Chris@16
|
331
|
Chris@16
|
332 template< class CompatibleKey >
|
Chris@16
|
333 const data_type_ & at(const CompatibleKey& k) const
|
Chris@16
|
334 {
|
Chris@16
|
335 typedef ::boost::bimaps::detail::
|
Chris@16
|
336 const_map_view_iterator<Tag,BimapType> const_iterator;
|
Chris@16
|
337
|
Chris@16
|
338 const_iterator iter = derived().find(k);
|
Chris@16
|
339 if( iter == derived().end() )
|
Chris@16
|
340 {
|
Chris@16
|
341 ::boost::throw_exception(
|
Chris@16
|
342 std::out_of_range("bimap<>: invalid key")
|
Chris@16
|
343 );
|
Chris@16
|
344 }
|
Chris@16
|
345 return iter->second;
|
Chris@16
|
346 }
|
Chris@16
|
347
|
Chris@16
|
348 template< class CompatibleKey >
|
Chris@16
|
349 data_type_ & operator[](const CompatibleKey&)
|
Chris@16
|
350 {
|
Chris@16
|
351 BOOST_BIMAP_STATIC_ERROR( OPERATOR_BRACKET_IS_NOT_SUPPORTED, (Derived));
|
Chris@16
|
352 }
|
Chris@16
|
353
|
Chris@16
|
354 protected:
|
Chris@16
|
355
|
Chris@16
|
356 typedef non_mutable_data_unique_map_view_access
|
Chris@16
|
357 non_mutable_data_unique_map_view_access_;
|
Chris@16
|
358
|
Chris@16
|
359 private:
|
Chris@16
|
360
|
Chris@16
|
361 // Curiously Recurring Template interface.
|
Chris@16
|
362
|
Chris@16
|
363 Derived& derived()
|
Chris@16
|
364 {
|
Chris@16
|
365 return *static_cast<Derived*>(this);
|
Chris@16
|
366 }
|
Chris@16
|
367
|
Chris@16
|
368 Derived const& derived() const
|
Chris@16
|
369 {
|
Chris@16
|
370 return *static_cast<Derived const*>(this);
|
Chris@16
|
371 }
|
Chris@16
|
372 };
|
Chris@16
|
373
|
Chris@16
|
374
|
Chris@16
|
375 template< class Derived, class Tag, class BimapType>
|
Chris@16
|
376 struct unique_map_view_access
|
Chris@16
|
377 {
|
Chris@16
|
378 private:
|
Chris@16
|
379 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
|
Chris@16
|
380 value_type_by<Tag,BimapType>::type value_type;
|
Chris@16
|
381
|
Chris@16
|
382 public:
|
Chris@16
|
383 typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_
|
Chris@16
|
384 <
|
Chris@16
|
385 typename ::boost::is_const<
|
Chris@16
|
386 BOOST_DEDUCED_TYPENAME value_type::second_type >::type,
|
Chris@16
|
387
|
Chris@16
|
388 non_mutable_data_unique_map_view_access<Derived,Tag,BimapType>,
|
Chris@16
|
389 mutable_data_unique_map_view_access<Derived,Tag,BimapType>
|
Chris@16
|
390
|
Chris@16
|
391 >::type type;
|
Chris@16
|
392 };
|
Chris@16
|
393
|
Chris@16
|
394 // Map views specialize the following structs to provide to the bimap class
|
Chris@16
|
395 // the extra side typedefs (i.e. left_local_iterator for unordered_maps,
|
Chris@16
|
396 // right_range_type for maps)
|
Chris@16
|
397
|
Chris@16
|
398 template< class MapView >
|
Chris@16
|
399 struct left_map_view_extra_typedefs {};
|
Chris@16
|
400
|
Chris@16
|
401 template< class MapView >
|
Chris@16
|
402 struct right_map_view_extra_typedefs {};
|
Chris@16
|
403
|
Chris@16
|
404 } // namespace detail
|
Chris@16
|
405
|
Chris@16
|
406 // This function is already part of Boost.Lambda.
|
Chris@16
|
407 // They may be moved to Boost.Utility.
|
Chris@16
|
408
|
Chris@16
|
409 template <class T> inline const T& make_const(const T& t) { return t; }
|
Chris@16
|
410
|
Chris@16
|
411 } // namespace bimaps
|
Chris@16
|
412 } // namespace boost
|
Chris@16
|
413
|
Chris@16
|
414
|
Chris@16
|
415 // The following macros avoids code duplication in map views
|
Chris@16
|
416 // Maybe this can be changed in the future using a scheme similar to
|
Chris@16
|
417 // the one used with map_view_base.
|
Chris@16
|
418
|
Chris@16
|
419 /*===========================================================================*/
|
Chris@16
|
420 #define BOOST_BIMAP_MAP_VIEW_RANGE_IMPLEMENTATION(BASE) \
|
Chris@16
|
421 \
|
Chris@16
|
422 typedef std::pair< \
|
Chris@16
|
423 BOOST_DEDUCED_TYPENAME base_::iterator, \
|
Chris@16
|
424 BOOST_DEDUCED_TYPENAME base_::iterator> range_type; \
|
Chris@16
|
425 \
|
Chris@16
|
426 typedef std::pair< \
|
Chris@16
|
427 BOOST_DEDUCED_TYPENAME base_::const_iterator, \
|
Chris@16
|
428 BOOST_DEDUCED_TYPENAME base_::const_iterator> const_range_type; \
|
Chris@16
|
429 \
|
Chris@16
|
430 \
|
Chris@16
|
431 template< class LowerBounder, class UpperBounder> \
|
Chris@16
|
432 range_type range(LowerBounder lower,UpperBounder upper) \
|
Chris@16
|
433 { \
|
Chris@16
|
434 std::pair< \
|
Chris@16
|
435 \
|
Chris@16
|
436 BOOST_DEDUCED_TYPENAME BASE::base_type::iterator, \
|
Chris@16
|
437 BOOST_DEDUCED_TYPENAME BASE::base_type::iterator \
|
Chris@16
|
438 \
|
Chris@16
|
439 > r( this->base().range(lower,upper) ); \
|
Chris@16
|
440 \
|
Chris@16
|
441 return range_type( \
|
Chris@16
|
442 this->template functor< \
|
Chris@16
|
443 BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \
|
Chris@16
|
444 >() ( r.first ), \
|
Chris@16
|
445 this->template functor< \
|
Chris@16
|
446 BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \
|
Chris@16
|
447 >() ( r.second ) \
|
Chris@16
|
448 ); \
|
Chris@16
|
449 } \
|
Chris@16
|
450 \
|
Chris@16
|
451 template< class LowerBounder, class UpperBounder> \
|
Chris@16
|
452 const_range_type range(LowerBounder lower,UpperBounder upper) const \
|
Chris@16
|
453 { \
|
Chris@16
|
454 std::pair< \
|
Chris@16
|
455 \
|
Chris@16
|
456 BOOST_DEDUCED_TYPENAME BASE::base_type::const_iterator, \
|
Chris@16
|
457 BOOST_DEDUCED_TYPENAME BASE::base_type::const_iterator \
|
Chris@16
|
458 \
|
Chris@16
|
459 > r( this->base().range(lower,upper) ); \
|
Chris@16
|
460 \
|
Chris@16
|
461 return const_range_type( \
|
Chris@16
|
462 this->template functor< \
|
Chris@16
|
463 BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \
|
Chris@16
|
464 >() ( r.first ), \
|
Chris@16
|
465 this->template functor< \
|
Chris@16
|
466 BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \
|
Chris@16
|
467 >() ( r.second ) \
|
Chris@16
|
468 ); \
|
Chris@16
|
469 }
|
Chris@16
|
470 /*===========================================================================*/
|
Chris@16
|
471
|
Chris@16
|
472
|
Chris@16
|
473 /*===========================================================================*/
|
Chris@16
|
474 #define BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(BASE) \
|
Chris@16
|
475 \
|
Chris@16
|
476 template< class InputIterator > \
|
Chris@16
|
477 void assign(InputIterator first,InputIterator last) \
|
Chris@16
|
478 { \
|
Chris@16
|
479 this->clear(); \
|
Chris@16
|
480 this->insert(this->end(),first,last); \
|
Chris@16
|
481 } \
|
Chris@16
|
482 \
|
Chris@16
|
483 void assign(BOOST_DEDUCED_TYPENAME BASE::size_type n, \
|
Chris@16
|
484 const BOOST_DEDUCED_TYPENAME BASE::value_type& v) \
|
Chris@16
|
485 { \
|
Chris@16
|
486 this->clear(); \
|
Chris@16
|
487 for(BOOST_DEDUCED_TYPENAME BASE::size_type i = 0 ; i < n ; ++i) \
|
Chris@16
|
488 { \
|
Chris@16
|
489 this->push_back(v); \
|
Chris@16
|
490 } \
|
Chris@16
|
491 }
|
Chris@16
|
492 /*===========================================================================*/
|
Chris@16
|
493
|
Chris@16
|
494
|
Chris@16
|
495 /*===========================================================================*/
|
Chris@16
|
496 #define BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(BASE) \
|
Chris@16
|
497 \
|
Chris@16
|
498 BOOST_DEDUCED_TYPENAME BASE::reference front() \
|
Chris@16
|
499 { \
|
Chris@16
|
500 return this->template functor< \
|
Chris@16
|
501 BOOST_DEDUCED_TYPENAME base_::value_from_base>() \
|
Chris@16
|
502 ( \
|
Chris@16
|
503 const_cast \
|
Chris@16
|
504 < \
|
Chris@16
|
505 BOOST_DEDUCED_TYPENAME BASE::base_type::value_type & \
|
Chris@16
|
506 \
|
Chris@16
|
507 > ( this->base().front() ) \
|
Chris@16
|
508 ); \
|
Chris@16
|
509 } \
|
Chris@16
|
510 \
|
Chris@16
|
511 BOOST_DEDUCED_TYPENAME BASE::reference back() \
|
Chris@16
|
512 { \
|
Chris@16
|
513 return this->template functor< \
|
Chris@16
|
514 BOOST_DEDUCED_TYPENAME base_::value_from_base>() \
|
Chris@16
|
515 ( \
|
Chris@16
|
516 const_cast \
|
Chris@16
|
517 < \
|
Chris@16
|
518 BOOST_DEDUCED_TYPENAME BASE::base_type::value_type & \
|
Chris@16
|
519 \
|
Chris@16
|
520 >( this->base().back() ) \
|
Chris@16
|
521 ); \
|
Chris@16
|
522 } \
|
Chris@16
|
523 \
|
Chris@16
|
524 BOOST_DEDUCED_TYPENAME BASE::const_reference front() const \
|
Chris@16
|
525 { \
|
Chris@16
|
526 return this->template functor< \
|
Chris@16
|
527 BOOST_DEDUCED_TYPENAME BASE::value_from_base>() \
|
Chris@16
|
528 ( \
|
Chris@16
|
529 this->base().front() \
|
Chris@16
|
530 ); \
|
Chris@16
|
531 } \
|
Chris@16
|
532 \
|
Chris@16
|
533 BOOST_DEDUCED_TYPENAME BASE::const_reference back() const \
|
Chris@16
|
534 { \
|
Chris@16
|
535 return this->template functor< \
|
Chris@16
|
536 BOOST_DEDUCED_TYPENAME BASE::value_from_base>() \
|
Chris@16
|
537 ( \
|
Chris@16
|
538 this->base().back() \
|
Chris@16
|
539 ); \
|
Chris@16
|
540 }
|
Chris@16
|
541 /*===========================================================================*/
|
Chris@16
|
542
|
Chris@16
|
543
|
Chris@16
|
544 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_HPP
|