1 // unordered_map implementation -*- C++ -*-
3 // Copyright (C) 2010, 2011 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file bits/unordered_map.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{unordered_map}
30 #ifndef _UNORDERED_MAP_H
31 #define _UNORDERED_MAP_H
33 namespace std
_GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
37 // NB: When we get typedef templates these class definitions
38 // will be unnecessary.
39 template<class _Key
, class _Tp
,
40 class _Hash
= hash
<_Key
>,
41 class _Pred
= std::equal_to
<_Key
>,
42 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> >,
43 bool __cache_hash_code
= false>
45 : public _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>, _Alloc
,
46 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
47 _Hash
, __detail::_Mod_range_hashing
,
48 __detail::_Default_ranged_hash
,
49 __detail::_Prime_rehash_policy
,
50 __cache_hash_code
, false, true>
52 typedef _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>, _Alloc
,
53 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
54 _Hash
, __detail::_Mod_range_hashing
,
55 __detail::_Default_ranged_hash
,
56 __detail::_Prime_rehash_policy
,
57 __cache_hash_code
, false, true>
61 typedef typename
_Base::value_type value_type
;
62 typedef typename
_Base::size_type size_type
;
63 typedef typename
_Base::hasher hasher
;
64 typedef typename
_Base::key_equal key_equal
;
65 typedef typename
_Base::allocator_type allocator_type
;
68 __unordered_map(size_type __n
= 10,
69 const hasher
& __hf
= hasher(),
70 const key_equal
& __eql
= key_equal(),
71 const allocator_type
& __a
= allocator_type())
72 : _Base(__n
, __hf
, __detail::_Mod_range_hashing(),
73 __detail::_Default_ranged_hash(),
74 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
77 template<typename _InputIterator
>
78 __unordered_map(_InputIterator __f
, _InputIterator __l
,
80 const hasher
& __hf
= hasher(),
81 const key_equal
& __eql
= key_equal(),
82 const allocator_type
& __a
= allocator_type())
83 : _Base(__f
, __l
, __n
, __hf
, __detail::_Mod_range_hashing(),
84 __detail::_Default_ranged_hash(),
85 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
88 __unordered_map(initializer_list
<value_type
> __l
,
90 const hasher
& __hf
= hasher(),
91 const key_equal
& __eql
= key_equal(),
92 const allocator_type
& __a
= allocator_type())
93 : _Base(__l
.begin(), __l
.end(), __n
, __hf
,
94 __detail::_Mod_range_hashing(),
95 __detail::_Default_ranged_hash(),
96 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
100 operator=(initializer_list
<value_type
> __l
)
103 this->insert(__l
.begin(), __l
.end());
108 template<class _Key
, class _Tp
,
109 class _Hash
= hash
<_Key
>,
110 class _Pred
= std::equal_to
<_Key
>,
111 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> >,
112 bool __cache_hash_code
= false>
113 class __unordered_multimap
114 : public _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>,
116 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
117 _Hash
, __detail::_Mod_range_hashing
,
118 __detail::_Default_ranged_hash
,
119 __detail::_Prime_rehash_policy
,
120 __cache_hash_code
, false, false>
122 typedef _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>,
124 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
125 _Hash
, __detail::_Mod_range_hashing
,
126 __detail::_Default_ranged_hash
,
127 __detail::_Prime_rehash_policy
,
128 __cache_hash_code
, false, false>
132 typedef typename
_Base::value_type value_type
;
133 typedef typename
_Base::size_type size_type
;
134 typedef typename
_Base::hasher hasher
;
135 typedef typename
_Base::key_equal key_equal
;
136 typedef typename
_Base::allocator_type allocator_type
;
139 __unordered_multimap(size_type __n
= 10,
140 const hasher
& __hf
= hasher(),
141 const key_equal
& __eql
= key_equal(),
142 const allocator_type
& __a
= allocator_type())
143 : _Base(__n
, __hf
, __detail::_Mod_range_hashing(),
144 __detail::_Default_ranged_hash(),
145 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
149 template<typename _InputIterator
>
150 __unordered_multimap(_InputIterator __f
, _InputIterator __l
,
152 const hasher
& __hf
= hasher(),
153 const key_equal
& __eql
= key_equal(),
154 const allocator_type
& __a
= allocator_type())
155 : _Base(__f
, __l
, __n
, __hf
, __detail::_Mod_range_hashing(),
156 __detail::_Default_ranged_hash(),
157 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
160 __unordered_multimap(initializer_list
<value_type
> __l
,
162 const hasher
& __hf
= hasher(),
163 const key_equal
& __eql
= key_equal(),
164 const allocator_type
& __a
= allocator_type())
165 : _Base(__l
.begin(), __l
.end(), __n
, __hf
,
166 __detail::_Mod_range_hashing(),
167 __detail::_Default_ranged_hash(),
168 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
171 __unordered_multimap
&
172 operator=(initializer_list
<value_type
> __l
)
175 this->insert(__l
.begin(), __l
.end());
180 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
181 bool __cache_hash_code
>
183 swap(__unordered_map
<_Key
, _Tp
, _Hash
, _Pred
,
184 _Alloc
, __cache_hash_code
>& __x
,
185 __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
,
186 _Alloc
, __cache_hash_code
>& __y
)
189 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
190 bool __cache_hash_code
>
192 swap(__unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
,
193 _Alloc
, __cache_hash_code
>& __x
,
194 __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
,
195 _Alloc
, __cache_hash_code
>& __y
)
198 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
199 bool __cache_hash_code
>
201 operator==(const __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
202 __cache_hash_code
>& __x
,
203 const __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
204 __cache_hash_code
>& __y
)
205 { return __x
._M_equal(__y
); }
207 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
208 bool __cache_hash_code
>
210 operator!=(const __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
211 __cache_hash_code
>& __x
,
212 const __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
213 __cache_hash_code
>& __y
)
214 { return !(__x
== __y
); }
216 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
217 bool __cache_hash_code
>
219 operator==(const __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
220 __cache_hash_code
>& __x
,
221 const __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
222 __cache_hash_code
>& __y
)
223 { return __x
._M_equal(__y
); }
225 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
226 bool __cache_hash_code
>
228 operator!=(const __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
229 __cache_hash_code
>& __x
,
230 const __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
,
231 __cache_hash_code
>& __y
)
232 { return !(__x
== __y
); }
235 * @brief A standard container composed of unique keys (containing
236 * at most one of each key value) that associates values of another type
239 * @ingroup unordered_associative_containers
241 * Meets the requirements of a <a href="tables.html#65">container</a>, and
242 * <a href="tables.html#xx">unordered associative container</a>
244 * @param Key Type of key objects.
245 * @param Tp Type of mapped objects.
246 * @param Hash Hashing function object type, defaults to hash<Value>.
247 * @param Pred Predicate function object type, defaults to equal_to<Value>.
248 * @param Alloc Allocator type, defaults to allocator<Key>.
250 * The resulting value type of the container is std::pair<const Key, Tp>.
252 template<class _Key
, class _Tp
,
253 class _Hash
= hash
<_Key
>,
254 class _Pred
= std::equal_to
<_Key
>,
255 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> > >
257 : public __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>
259 typedef __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
> _Base
;
262 typedef typename
_Base::value_type value_type
;
263 typedef typename
_Base::size_type size_type
;
264 typedef typename
_Base::hasher hasher
;
265 typedef typename
_Base::key_equal key_equal
;
266 typedef typename
_Base::allocator_type allocator_type
;
269 unordered_map(size_type __n
= 10,
270 const hasher
& __hf
= hasher(),
271 const key_equal
& __eql
= key_equal(),
272 const allocator_type
& __a
= allocator_type())
273 : _Base(__n
, __hf
, __eql
, __a
)
276 template<typename _InputIterator
>
277 unordered_map(_InputIterator __f
, _InputIterator __l
,
279 const hasher
& __hf
= hasher(),
280 const key_equal
& __eql
= key_equal(),
281 const allocator_type
& __a
= allocator_type())
282 : _Base(__f
, __l
, __n
, __hf
, __eql
, __a
)
285 unordered_map(initializer_list
<value_type
> __l
,
287 const hasher
& __hf
= hasher(),
288 const key_equal
& __eql
= key_equal(),
289 const allocator_type
& __a
= allocator_type())
290 : _Base(__l
.begin(), __l
.end(), __n
, __hf
, __eql
, __a
)
294 operator=(initializer_list
<value_type
> __l
)
297 this->insert(__l
.begin(), __l
.end());
303 * @brief A standard container composed of equivalent keys
304 * (possibly containing multiple of each key value) that associates
305 * values of another type with the keys.
307 * @ingroup unordered_associative_containers
309 * Meets the requirements of a <a href="tables.html#65">container</a>, and
310 * <a href="tables.html#xx">unordered associative container</a>
312 * @param Key Type of key objects.
313 * @param Tp Type of mapped objects.
314 * @param Hash Hashing function object type, defaults to hash<Value>.
315 * @param Pred Predicate function object type, defaults to equal_to<Value>.
316 * @param Alloc Allocator type, defaults to allocator<Key>.
318 * The resulting value type of the container is std::pair<const Key, Tp>.
320 template<class _Key
, class _Tp
,
321 class _Hash
= hash
<_Key
>,
322 class _Pred
= std::equal_to
<_Key
>,
323 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> > >
324 class unordered_multimap
325 : public __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>
327 typedef __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
> _Base
;
330 typedef typename
_Base::value_type value_type
;
331 typedef typename
_Base::size_type size_type
;
332 typedef typename
_Base::hasher hasher
;
333 typedef typename
_Base::key_equal key_equal
;
334 typedef typename
_Base::allocator_type allocator_type
;
337 unordered_multimap(size_type __n
= 10,
338 const hasher
& __hf
= hasher(),
339 const key_equal
& __eql
= key_equal(),
340 const allocator_type
& __a
= allocator_type())
341 : _Base(__n
, __hf
, __eql
, __a
)
344 template<typename _InputIterator
>
345 unordered_multimap(_InputIterator __f
, _InputIterator __l
,
347 const hasher
& __hf
= hasher(),
348 const key_equal
& __eql
= key_equal(),
349 const allocator_type
& __a
= allocator_type())
350 : _Base(__f
, __l
, __n
, __hf
, __eql
, __a
)
353 unordered_multimap(initializer_list
<value_type
> __l
,
355 const hasher
& __hf
= hasher(),
356 const key_equal
& __eql
= key_equal(),
357 const allocator_type
& __a
= allocator_type())
358 : _Base(__l
.begin(), __l
.end(), __n
, __hf
, __eql
, __a
)
362 operator=(initializer_list
<value_type
> __l
)
365 this->insert(__l
.begin(), __l
.end());
370 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
372 swap(unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
373 unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
376 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
378 swap(unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
379 unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
382 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
384 operator==(const unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
385 const unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
386 { return __x
._M_equal(__y
); }
388 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
390 operator!=(const unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
391 const unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
392 { return !(__x
== __y
); }
394 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
396 operator==(const unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
397 const unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
398 { return __x
._M_equal(__y
); }
400 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
402 operator!=(const unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
403 const unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
404 { return !(__x
== __y
); }
406 _GLIBCXX_END_NAMESPACE_CONTAINER
409 #endif /* _UNORDERED_MAP_H */