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 views/unordered_map_view.hpp 10 /// \brief View of a side of a bimap that is signature compatible with tr1::unordered_map. 11 12 #ifndef BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP 13 #define BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP 14 15 #if defined(_MSC_VER) 16 #pragma once 17 #endif 18 19 #include <boost/config.hpp> 20 21 #include <utility> 22 23 #include <boost/bimap/container_adaptor/unordered_map_adaptor.hpp> 24 #include <boost/bimap/detail/map_view_base.hpp> 25 26 namespace boost { 27 namespace bimaps { 28 namespace views { 29 30 /// \brief Map View of a bimap, signature compatible with tr1::unordered_map. 31 /** 32 33 This class uses container_adaptor and iterator_adaptor to wrapped a index of the 34 multi_index bimap core so it can be used as a tr1::unordered_map. 35 36 See also const_unordered_map_view. 37 **/ 38 39 40 template< class Tag, class BimapType > 41 class unordered_map_view 42 : 43 public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( 44 unordered_map_adaptor, 45 Tag,BimapType, 46 local_map_view_iterator,const_local_map_view_iterator 47 ), 48 49 public ::boost::bimaps::detail::map_view_base< 50 unordered_map_view<Tag,BimapType>,Tag,BimapType >, 51 public ::boost::bimaps::detail:: 52 unique_map_view_access< 53 unordered_map_view<Tag,BimapType>, Tag, BimapType>::type 54 55 { 56 typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( 57 unordered_map_adaptor, 58 Tag,BimapType, 59 local_map_view_iterator,const_local_map_view_iterator 60 61 ) base_; 62 63 BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(unordered_map_view,Tag,BimapType) 64 65 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: 66 unique_map_view_access< 67 unordered_map_view<Tag,BimapType>, Tag, BimapType 68 69 >::type unique_map_view_access_; 70 71 public: 72 73 typedef std::pair< 74 BOOST_DEDUCED_TYPENAME base_::iterator, 75 BOOST_DEDUCED_TYPENAME base_::iterator 76 > range_type; 77 78 typedef std::pair< 79 BOOST_DEDUCED_TYPENAME base_::const_iterator, 80 BOOST_DEDUCED_TYPENAME base_::const_iterator 81 > const_range_type; 82 83 typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; 84 unordered_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c)85 unordered_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) 86 : base_(c) {} 87 88 using unique_map_view_access_::at; 89 using unique_map_view_access_::operator[]; 90 operator =(const unordered_map_view & v)91 unordered_map_view & operator=(const unordered_map_view & v) 92 { 93 this->base() = v.base(); 94 return *this; 95 } 96 97 // It can be used enable_if here but the error message when there 98 // is no info is very clear like this 99 100 template< class CompatibleKey > info_at(const CompatibleKey & k) const101 const info_type & info_at(const CompatibleKey& k) const 102 { 103 BOOST_DEDUCED_TYPENAME base_::const_iterator iter = this->find(k); 104 if( iter == this->end() ) 105 { 106 ::boost::throw_exception( 107 std::out_of_range("bimap<>: invalid key") 108 ); 109 } 110 return iter->info; 111 } 112 113 template< class CompatibleKey > info_at(const CompatibleKey & k)114 info_type & info_at(const CompatibleKey& k) 115 { 116 BOOST_DEDUCED_TYPENAME base_::iterator iter = this->find(k); 117 if( iter == this->end() ) 118 { 119 ::boost::throw_exception( 120 std::out_of_range("bimap<>: invalid key") 121 ); 122 } 123 return iter->info; 124 } 125 }; 126 127 128 } // namespace views 129 130 /*===========================================================================*/ 131 #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ 132 typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ 133 BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); 134 /*===========================================================================*/ 135 136 /*===========================================================================*/ 137 #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ 138 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,local_iterator) \ 139 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_local_iterator) \ 140 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,range_type) \ 141 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_range_type) \ 142 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,hasher) \ 143 BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,key_equal) 144 /*===========================================================================*/ 145 146 namespace detail { 147 148 template< class Tag, class BimapType > 149 struct left_map_view_extra_typedefs< ::boost::bimaps::views::unordered_map_view<Tag,BimapType> > 150 { 151 private: typedef ::boost::bimaps::views::unordered_map_view<Tag,BimapType> map_view_; 152 public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) 153 }; 154 155 template< class Tag, class BimapType > 156 struct right_map_view_extra_typedefs< ::boost::bimaps::views::unordered_map_view<Tag,BimapType> > 157 { 158 private: typedef ::boost::bimaps::views::unordered_map_view<Tag,BimapType> map_view_; 159 public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) 160 }; 161 162 } // namespace detail 163 164 /*===========================================================================*/ 165 #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF 166 #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY 167 /*===========================================================================*/ 168 169 } // namespace bimaps 170 } // namespace boost 171 172 #endif // BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP 173 174 175