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