1 // TR1 unordered_map implementation -*- C++ -*-
3 // Copyright (C) 2010-2018 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 tr1/unordered_map.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{tr1/unordered_map}
30 namespace std
_GLIBCXX_VISIBILITY(default)
32 _GLIBCXX_BEGIN_NAMESPACE_VERSION
36 // NB: When we get typedef templates these class definitions
37 // will be unnecessary.
38 template<class _Key
, class _Tp
,
39 class _Hash
= hash
<_Key
>,
40 class _Pred
= std::equal_to
<_Key
>,
41 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> >,
42 bool __cache_hash_code
= false>
44 : public _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>, _Alloc
,
45 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
46 _Hash
, __detail::_Mod_range_hashing
,
47 __detail::_Default_ranged_hash
,
48 __detail::_Prime_rehash_policy
,
49 __cache_hash_code
, false, true>
51 typedef _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>, _Alloc
,
52 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
53 _Hash
, __detail::_Mod_range_hashing
,
54 __detail::_Default_ranged_hash
,
55 __detail::_Prime_rehash_policy
,
56 __cache_hash_code
, false, true>
60 typedef typename
_Base::size_type size_type
;
61 typedef typename
_Base::hasher hasher
;
62 typedef typename
_Base::key_equal key_equal
;
63 typedef typename
_Base::allocator_type allocator_type
;
66 __unordered_map(size_type __n
= 10,
67 const hasher
& __hf
= hasher(),
68 const key_equal
& __eql
= key_equal(),
69 const allocator_type
& __a
= allocator_type())
70 : _Base(__n
, __hf
, __detail::_Mod_range_hashing(),
71 __detail::_Default_ranged_hash(),
72 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
75 template<typename _InputIterator
>
76 __unordered_map(_InputIterator __f
, _InputIterator __l
,
78 const hasher
& __hf
= hasher(),
79 const key_equal
& __eql
= key_equal(),
80 const allocator_type
& __a
= allocator_type())
81 : _Base(__f
, __l
, __n
, __hf
, __detail::_Mod_range_hashing(),
82 __detail::_Default_ranged_hash(),
83 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
87 template<class _Key
, class _Tp
,
88 class _Hash
= hash
<_Key
>,
89 class _Pred
= std::equal_to
<_Key
>,
90 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> >,
91 bool __cache_hash_code
= false>
92 class __unordered_multimap
93 : public _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>,
95 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
96 _Hash
, __detail::_Mod_range_hashing
,
97 __detail::_Default_ranged_hash
,
98 __detail::_Prime_rehash_policy
,
99 __cache_hash_code
, false, false>
101 typedef _Hashtable
<_Key
, std::pair
<const _Key
, _Tp
>,
103 std::_Select1st
<std::pair
<const _Key
, _Tp
> >, _Pred
,
104 _Hash
, __detail::_Mod_range_hashing
,
105 __detail::_Default_ranged_hash
,
106 __detail::_Prime_rehash_policy
,
107 __cache_hash_code
, false, false>
111 typedef typename
_Base::size_type size_type
;
112 typedef typename
_Base::hasher hasher
;
113 typedef typename
_Base::key_equal key_equal
;
114 typedef typename
_Base::allocator_type allocator_type
;
117 __unordered_multimap(size_type __n
= 10,
118 const hasher
& __hf
= hasher(),
119 const key_equal
& __eql
= key_equal(),
120 const allocator_type
& __a
= allocator_type())
121 : _Base(__n
, __hf
, __detail::_Mod_range_hashing(),
122 __detail::_Default_ranged_hash(),
123 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
127 template<typename _InputIterator
>
128 __unordered_multimap(_InputIterator __f
, _InputIterator __l
,
129 typename
_Base::size_type __n
= 0,
130 const hasher
& __hf
= hasher(),
131 const key_equal
& __eql
= key_equal(),
132 const allocator_type
& __a
= allocator_type())
133 : _Base(__f
, __l
, __n
, __hf
, __detail::_Mod_range_hashing(),
134 __detail::_Default_ranged_hash(),
135 __eql
, std::_Select1st
<std::pair
<const _Key
, _Tp
> >(), __a
)
139 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
140 bool __cache_hash_code
>
142 swap(__unordered_map
<_Key
, _Tp
, _Hash
, _Pred
,
143 _Alloc
, __cache_hash_code
>& __x
,
144 __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
,
145 _Alloc
, __cache_hash_code
>& __y
)
148 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
,
149 bool __cache_hash_code
>
151 swap(__unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
,
152 _Alloc
, __cache_hash_code
>& __x
,
153 __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
,
154 _Alloc
, __cache_hash_code
>& __y
)
159 * @brief A standard container composed of unique keys (containing
160 * at most one of each key value) that associates values of another type
163 * @ingroup unordered_associative_containers
165 * Meets the requirements of a <a href="tables.html#65">container</a>, and
166 * <a href="tables.html#xx">unordered associative container</a>
168 * @param Key Type of key objects.
169 * @param Tp Type of mapped objects.
170 * @param Hash Hashing function object type, defaults to hash<Value>.
171 * @param Pred Predicate function object type, defaults to equal_to<Value>.
172 * @param Alloc Allocator type, defaults to allocator<Key>.
174 * The resulting value type of the container is std::pair<const Key, Tp>.
176 template<class _Key
, class _Tp
,
177 class _Hash
= hash
<_Key
>,
178 class _Pred
= std::equal_to
<_Key
>,
179 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> > >
181 : public __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>
183 typedef __unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
> _Base
;
186 typedef typename
_Base::value_type value_type
;
187 typedef typename
_Base::size_type size_type
;
188 typedef typename
_Base::hasher hasher
;
189 typedef typename
_Base::key_equal key_equal
;
190 typedef typename
_Base::allocator_type allocator_type
;
193 unordered_map(size_type __n
= 10,
194 const hasher
& __hf
= hasher(),
195 const key_equal
& __eql
= key_equal(),
196 const allocator_type
& __a
= allocator_type())
197 : _Base(__n
, __hf
, __eql
, __a
)
200 template<typename _InputIterator
>
201 unordered_map(_InputIterator __f
, _InputIterator __l
,
203 const hasher
& __hf
= hasher(),
204 const key_equal
& __eql
= key_equal(),
205 const allocator_type
& __a
= allocator_type())
206 : _Base(__f
, __l
, __n
, __hf
, __eql
, __a
)
211 * @brief A standard container composed of equivalent keys
212 * (possibly containing multiple of each key value) that associates
213 * values of another type with the keys.
215 * @ingroup unordered_associative_containers
217 * Meets the requirements of a <a href="tables.html#65">container</a>, and
218 * <a href="tables.html#xx">unordered associative container</a>
220 * @param Key Type of key objects.
221 * @param Tp Type of mapped objects.
222 * @param Hash Hashing function object type, defaults to hash<Value>.
223 * @param Pred Predicate function object type, defaults to equal_to<Value>.
224 * @param Alloc Allocator type, defaults to allocator<Key>.
226 * The resulting value type of the container is std::pair<const Key, Tp>.
228 template<class _Key
, class _Tp
,
229 class _Hash
= hash
<_Key
>,
230 class _Pred
= std::equal_to
<_Key
>,
231 class _Alloc
= std::allocator
<std::pair
<const _Key
, _Tp
> > >
232 class unordered_multimap
233 : public __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>
235 typedef __unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
> _Base
;
238 typedef typename
_Base::value_type value_type
;
239 typedef typename
_Base::size_type size_type
;
240 typedef typename
_Base::hasher hasher
;
241 typedef typename
_Base::key_equal key_equal
;
242 typedef typename
_Base::allocator_type allocator_type
;
245 unordered_multimap(size_type __n
= 10,
246 const hasher
& __hf
= hasher(),
247 const key_equal
& __eql
= key_equal(),
248 const allocator_type
& __a
= allocator_type())
249 : _Base(__n
, __hf
, __eql
, __a
)
253 template<typename _InputIterator
>
254 unordered_multimap(_InputIterator __f
, _InputIterator __l
,
255 typename
_Base::size_type __n
= 0,
256 const hasher
& __hf
= hasher(),
257 const key_equal
& __eql
= key_equal(),
258 const allocator_type
& __a
= allocator_type())
259 : _Base(__f
, __l
, __n
, __hf
, __eql
, __a
)
264 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
266 swap(unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
267 unordered_map
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
270 template<class _Key
, class _Tp
, class _Hash
, class _Pred
, class _Alloc
>
272 swap(unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __x
,
273 unordered_multimap
<_Key
, _Tp
, _Hash
, _Pred
, _Alloc
>& __y
)
277 _GLIBCXX_END_NAMESPACE_VERSION