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 container_adaptor/map_adaptor.hpp 10 /// \brief Container adaptor to easily build a std::map signature compatible container. 11 12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP 13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP 14 15 #if defined(_MSC_VER) 16 #pragma once 17 #endif 18 19 #include <boost/config.hpp> 20 21 #include <boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp> 22 #include <boost/mpl/vector.hpp> 23 #include <boost/mpl/aux_/na.hpp> 24 #include <boost/call_traits.hpp> 25 26 namespace boost { 27 namespace bimaps { 28 namespace container_adaptor { 29 30 /// \brief Container adaptor to easily build a std::map signature compatible container. 31 32 template 33 < 34 class Base, 35 36 class Iterator, 37 class ConstIterator, 38 class ReverseIterator, 39 class ConstReverseIterator, 40 41 class IteratorToBaseConverter = ::boost::mpl::na, 42 class IteratorFromBaseConverter = ::boost::mpl::na, 43 class ReverseIteratorFromBaseConverter = ::boost::mpl::na, 44 class ValueToBaseConverter = ::boost::mpl::na, 45 class ValueFromBaseConverter = ::boost::mpl::na, 46 class KeyToBaseConverter = ::boost::mpl::na, 47 48 class FunctorsFromDerivedClasses = mpl::vector<> 49 > 50 class map_adaptor : 51 52 public ::boost::bimaps::container_adaptor:: 53 ordered_associative_container_adaptor 54 < 55 Base, 56 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, 57 BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, 58 IteratorToBaseConverter, IteratorFromBaseConverter, 59 ReverseIteratorFromBaseConverter, 60 ValueToBaseConverter, ValueFromBaseConverter, 61 KeyToBaseConverter, 62 FunctorsFromDerivedClasses 63 > 64 { 65 66 typedef ::boost::bimaps::container_adaptor:: 67 ordered_associative_container_adaptor 68 < 69 Base, 70 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, 71 BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, 72 IteratorToBaseConverter, IteratorFromBaseConverter, 73 ReverseIteratorFromBaseConverter, 74 ValueToBaseConverter, ValueFromBaseConverter, 75 KeyToBaseConverter, 76 FunctorsFromDerivedClasses 77 78 > base_; 79 80 // MetaData ------------------------------------------------------------- 81 82 public: 83 84 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; 85 typedef data_type mapped_type; 86 87 // Access ----------------------------------------------------------------- 88 89 public: 90 map_adaptor(Base & c)91 explicit map_adaptor(Base & c) : 92 base_(c) {} 93 94 protected: 95 96 typedef map_adaptor map_adaptor_; 97 98 // Interface -------------------------------------------------------------- 99 100 public: 101 102 template< class CompatibleKey > operator [](const CompatibleKey & k)103 data_type& operator[](const CompatibleKey & k) 104 { 105 return this->base() 106 [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)]; 107 } 108 109 template< class CompatibleKey > at(const CompatibleKey & k)110 data_type& at(const CompatibleKey & k) 111 { 112 return this->base(). 113 at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); 114 } 115 116 template< class CompatibleKey > at(const CompatibleKey & k) const117 const data_type& at(const CompatibleKey & k) const 118 { 119 return this->base(). 120 at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); 121 } 122 123 }; 124 125 126 } // namespace container_adaptor 127 } // namespace bimaps 128 } // namespace boost 129 130 131 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP 132 133