annotate DEPENDENCIES/generic/include/boost/bimap/detail/map_view_base.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
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