blob: dc8db80851975adbb5af2917ef0784019d2972e9 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:161// -*- C++ -*-
2//===-------------------------- unordered_map -----------------------------===//
3//
Howard Hinnant5b08a8a2010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:165//
Howard Hinnant412dbeb2010-11-16 22:09:026// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3e519522010-05-11 19:42:168//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_UNORDERED_MAP
12#define _LIBCPP_UNORDERED_MAP
13
14/*
15
16 unordered_map synopsis
17
18#include <initializer_list>
19
20namespace std
21{
22
23template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
24 class Alloc = allocator<pair<const Key, T>>>
25class unordered_map
26{
27public:
28 // types
29 typedef Key key_type;
30 typedef T mapped_type;
31 typedef Hash hasher;
32 typedef Pred key_equal;
33 typedef Alloc allocator_type;
34 typedef pair<const key_type, mapped_type> value_type;
35 typedef value_type& reference;
36 typedef const value_type& const_reference;
37 typedef typename allocator_traits<allocator_type>::pointer pointer;
38 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
39 typedef typename allocator_traits<allocator_type>::size_type size_type;
40 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
41
42 typedef /unspecified/ iterator;
43 typedef /unspecified/ const_iterator;
44 typedef /unspecified/ local_iterator;
45 typedef /unspecified/ const_local_iterator;
46
Howard Hinnant37141072011-06-04 18:54:2447 unordered_map()
48 noexcept(
49 is_nothrow_default_constructible<hasher>::value &&
50 is_nothrow_default_constructible<key_equal>::value &&
51 is_nothrow_default_constructible<allocator_type>::value);
52 explicit unordered_map(size_type n, const hasher& hf = hasher(),
Howard Hinnant3e519522010-05-11 19:42:1653 const key_equal& eql = key_equal(),
54 const allocator_type& a = allocator_type());
55 template <class InputIterator>
56 unordered_map(InputIterator f, InputIterator l,
57 size_type n = 0, const hasher& hf = hasher(),
58 const key_equal& eql = key_equal(),
59 const allocator_type& a = allocator_type());
60 explicit unordered_map(const allocator_type&);
61 unordered_map(const unordered_map&);
62 unordered_map(const unordered_map&, const Allocator&);
Howard Hinnant37141072011-06-04 18:54:2463 unordered_map(unordered_map&&)
64 noexcept(
65 is_nothrow_move_constructible<hasher>::value &&
66 is_nothrow_move_constructible<key_equal>::value &&
67 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant3e519522010-05-11 19:42:1668 unordered_map(unordered_map&&, const Allocator&);
69 unordered_map(initializer_list<value_type>, size_type n = 0,
70 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
71 const allocator_type& a = allocator_type());
Marshall Clow3cd37e62013-09-12 03:00:3172 unordered_map(size_type n, const allocator_type& a)
73 : unordered_map(n, hasher(), key_equal(), a) {} // C++14
74 unordered_map(size_type n, const hasher& hf, const allocator_type& a)
75 : unordered_map(n, hf, key_equal(), a) {} // C++14
76 template <class InputIterator>
77 unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
78 : unordered_map(f, l, n, hasher(), key_equal(), a) {} // C++14
79 template <class InputIterator>
80 unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
81 const allocator_type& a)
82 : unordered_map(f, l, n, hf, key_equal(), a) {} // C++14
83 unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
84 : unordered_map(il, n, hasher(), key_equal(), a) {} // C++14
85 unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
86 const allocator_type& a)
87 : unordered_map(il, n, hf, key_equal(), a) {} // C++14
Howard Hinnant3e519522010-05-11 19:42:1688 ~unordered_map();
89 unordered_map& operator=(const unordered_map&);
Howard Hinnant37141072011-06-04 18:54:2490 unordered_map& operator=(unordered_map&&)
91 noexcept(
92 allocator_type::propagate_on_container_move_assignment::value &&
93 is_nothrow_move_assignable<allocator_type>::value &&
94 is_nothrow_move_assignable<hasher>::value &&
95 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:1696 unordered_map& operator=(initializer_list<value_type>);
97
Howard Hinnant37141072011-06-04 18:54:2498 allocator_type get_allocator() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:1699
Howard Hinnant37141072011-06-04 18:54:24100 bool empty() const noexcept;
101 size_type size() const noexcept;
102 size_type max_size() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16103
Howard Hinnant37141072011-06-04 18:54:24104 iterator begin() noexcept;
105 iterator end() noexcept;
106 const_iterator begin() const noexcept;
107 const_iterator end() const noexcept;
108 const_iterator cbegin() const noexcept;
109 const_iterator cend() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16110
111 template <class... Args>
112 pair<iterator, bool> emplace(Args&&... args);
113 template <class... Args>
114 iterator emplace_hint(const_iterator position, Args&&... args);
115 pair<iterator, bool> insert(const value_type& obj);
116 template <class P>
117 pair<iterator, bool> insert(P&& obj);
118 iterator insert(const_iterator hint, const value_type& obj);
119 template <class P>
120 iterator insert(const_iterator hint, P&& obj);
121 template <class InputIterator>
122 void insert(InputIterator first, InputIterator last);
123 void insert(initializer_list<value_type>);
124
Marshall Clowbc4c89a2015-07-07 05:45:35125 template <class... Args>
126 pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
127 template <class... Args>
128 pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
129 template <class... Args>
130 iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
131 template <class... Args>
132 iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
133 template <class M>
134 pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
135 template <class M>
136 pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
137 template <class M>
138 iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
139 template <class M>
140 iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
141
Howard Hinnant3e519522010-05-11 19:42:16142 iterator erase(const_iterator position);
Marshall Clowec392962015-05-10 13:35:00143 iterator erase(iterator position); // C++14
Howard Hinnant3e519522010-05-11 19:42:16144 size_type erase(const key_type& k);
145 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant37141072011-06-04 18:54:24146 void clear() noexcept;
Howard Hinnant3e519522010-05-11 19:42:16147
Howard Hinnant37141072011-06-04 18:54:24148 void swap(unordered_map&)
149 noexcept(
150 (!allocator_type::propagate_on_container_swap::value ||
151 __is_nothrow_swappable<allocator_type>::value) &&
152 __is_nothrow_swappable<hasher>::value &&
153 __is_nothrow_swappable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:16154
155 hasher hash_function() const;
156 key_equal key_eq() const;
157
158 iterator find(const key_type& k);
159 const_iterator find(const key_type& k) const;
160 size_type count(const key_type& k) const;
161 pair<iterator, iterator> equal_range(const key_type& k);
162 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
163
164 mapped_type& operator[](const key_type& k);
165 mapped_type& operator[](key_type&& k);
166
167 mapped_type& at(const key_type& k);
168 const mapped_type& at(const key_type& k) const;
169
Howard Hinnant37141072011-06-04 18:54:24170 size_type bucket_count() const noexcept;
171 size_type max_bucket_count() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16172
173 size_type bucket_size(size_type n) const;
174 size_type bucket(const key_type& k) const;
175
176 local_iterator begin(size_type n);
177 local_iterator end(size_type n);
178 const_local_iterator begin(size_type n) const;
179 const_local_iterator end(size_type n) const;
180 const_local_iterator cbegin(size_type n) const;
181 const_local_iterator cend(size_type n) const;
182
Howard Hinnant37141072011-06-04 18:54:24183 float load_factor() const noexcept;
184 float max_load_factor() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16185 void max_load_factor(float z);
186 void rehash(size_type n);
187 void reserve(size_type n);
188};
189
190template <class Key, class T, class Hash, class Pred, class Alloc>
191 void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
Howard Hinnant37141072011-06-04 18:54:24192 unordered_map<Key, T, Hash, Pred, Alloc>& y)
193 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16194
195template <class Key, class T, class Hash, class Pred, class Alloc>
196 bool
197 operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
198 const unordered_map<Key, T, Hash, Pred, Alloc>& y);
199
200template <class Key, class T, class Hash, class Pred, class Alloc>
201 bool
202 operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
203 const unordered_map<Key, T, Hash, Pred, Alloc>& y);
204
205template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
206 class Alloc = allocator<pair<const Key, T>>>
207class unordered_multimap
208{
209public:
210 // types
211 typedef Key key_type;
212 typedef T mapped_type;
213 typedef Hash hasher;
214 typedef Pred key_equal;
215 typedef Alloc allocator_type;
216 typedef pair<const key_type, mapped_type> value_type;
217 typedef value_type& reference;
218 typedef const value_type& const_reference;
219 typedef typename allocator_traits<allocator_type>::pointer pointer;
220 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
221 typedef typename allocator_traits<allocator_type>::size_type size_type;
222 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
223
224 typedef /unspecified/ iterator;
225 typedef /unspecified/ const_iterator;
226 typedef /unspecified/ local_iterator;
227 typedef /unspecified/ const_local_iterator;
228
Howard Hinnant37141072011-06-04 18:54:24229 unordered_multimap()
230 noexcept(
231 is_nothrow_default_constructible<hasher>::value &&
232 is_nothrow_default_constructible<key_equal>::value &&
233 is_nothrow_default_constructible<allocator_type>::value);
234 explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
Howard Hinnant3e519522010-05-11 19:42:16235 const key_equal& eql = key_equal(),
236 const allocator_type& a = allocator_type());
237 template <class InputIterator>
238 unordered_multimap(InputIterator f, InputIterator l,
239 size_type n = 0, const hasher& hf = hasher(),
240 const key_equal& eql = key_equal(),
241 const allocator_type& a = allocator_type());
242 explicit unordered_multimap(const allocator_type&);
243 unordered_multimap(const unordered_multimap&);
244 unordered_multimap(const unordered_multimap&, const Allocator&);
Howard Hinnant37141072011-06-04 18:54:24245 unordered_multimap(unordered_multimap&&)
246 noexcept(
247 is_nothrow_move_constructible<hasher>::value &&
248 is_nothrow_move_constructible<key_equal>::value &&
249 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant3e519522010-05-11 19:42:16250 unordered_multimap(unordered_multimap&&, const Allocator&);
251 unordered_multimap(initializer_list<value_type>, size_type n = 0,
252 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
253 const allocator_type& a = allocator_type());
Marshall Clow3cd37e62013-09-12 03:00:31254 unordered_multimap(size_type n, const allocator_type& a)
255 : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14
256 unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
257 : unordered_multimap(n, hf, key_equal(), a) {} // C++14
258 template <class InputIterator>
259 unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
260 : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14
261 template <class InputIterator>
262 unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
263 const allocator_type& a)
264 : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14
265 unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
266 : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14
267 unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
268 const allocator_type& a)
269 : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14
Howard Hinnant3e519522010-05-11 19:42:16270 ~unordered_multimap();
271 unordered_multimap& operator=(const unordered_multimap&);
Howard Hinnant37141072011-06-04 18:54:24272 unordered_multimap& operator=(unordered_multimap&&)
273 noexcept(
274 allocator_type::propagate_on_container_move_assignment::value &&
275 is_nothrow_move_assignable<allocator_type>::value &&
276 is_nothrow_move_assignable<hasher>::value &&
277 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:16278 unordered_multimap& operator=(initializer_list<value_type>);
279
Howard Hinnant37141072011-06-04 18:54:24280 allocator_type get_allocator() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16281
Howard Hinnant37141072011-06-04 18:54:24282 bool empty() const noexcept;
283 size_type size() const noexcept;
284 size_type max_size() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16285
Howard Hinnant37141072011-06-04 18:54:24286 iterator begin() noexcept;
287 iterator end() noexcept;
288 const_iterator begin() const noexcept;
289 const_iterator end() const noexcept;
290 const_iterator cbegin() const noexcept;
291 const_iterator cend() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16292
293 template <class... Args>
294 iterator emplace(Args&&... args);
295 template <class... Args>
296 iterator emplace_hint(const_iterator position, Args&&... args);
297 iterator insert(const value_type& obj);
298 template <class P>
299 iterator insert(P&& obj);
300 iterator insert(const_iterator hint, const value_type& obj);
301 template <class P>
302 iterator insert(const_iterator hint, P&& obj);
303 template <class InputIterator>
304 void insert(InputIterator first, InputIterator last);
305 void insert(initializer_list<value_type>);
306
307 iterator erase(const_iterator position);
Marshall Clowec392962015-05-10 13:35:00308 iterator erase(iterator position); // C++14
Howard Hinnant3e519522010-05-11 19:42:16309 size_type erase(const key_type& k);
310 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant37141072011-06-04 18:54:24311 void clear() noexcept;
Howard Hinnant3e519522010-05-11 19:42:16312
Howard Hinnant37141072011-06-04 18:54:24313 void swap(unordered_multimap&)
314 noexcept(
315 (!allocator_type::propagate_on_container_swap::value ||
316 __is_nothrow_swappable<allocator_type>::value) &&
317 __is_nothrow_swappable<hasher>::value &&
318 __is_nothrow_swappable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:16319
320 hasher hash_function() const;
321 key_equal key_eq() const;
322
323 iterator find(const key_type& k);
324 const_iterator find(const key_type& k) const;
325 size_type count(const key_type& k) const;
326 pair<iterator, iterator> equal_range(const key_type& k);
327 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
328
Howard Hinnant37141072011-06-04 18:54:24329 size_type bucket_count() const noexcept;
330 size_type max_bucket_count() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16331
332 size_type bucket_size(size_type n) const;
333 size_type bucket(const key_type& k) const;
334
335 local_iterator begin(size_type n);
336 local_iterator end(size_type n);
337 const_local_iterator begin(size_type n) const;
338 const_local_iterator end(size_type n) const;
339 const_local_iterator cbegin(size_type n) const;
340 const_local_iterator cend(size_type n) const;
341
Howard Hinnant37141072011-06-04 18:54:24342 float load_factor() const noexcept;
343 float max_load_factor() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16344 void max_load_factor(float z);
345 void rehash(size_type n);
346 void reserve(size_type n);
347};
348
349template <class Key, class T, class Hash, class Pred, class Alloc>
350 void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
Howard Hinnant37141072011-06-04 18:54:24351 unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
352 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16353
354template <class Key, class T, class Hash, class Pred, class Alloc>
355 bool
356 operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
357 const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
358
359template <class Key, class T, class Hash, class Pred, class Alloc>
360 bool
361 operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
362 const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
363
364} // std
365
366*/
367
368#include <__config>
369#include <__hash_table>
370#include <functional>
371#include <stdexcept>
Eric Fiselier0f905672016-02-11 21:45:53372#include <tuple>
Howard Hinnant3e519522010-05-11 19:42:16373
Eric Fiselierc1bd9192014-08-10 23:53:08374#include <__debug>
375
Howard Hinnant073458b2011-10-17 20:05:10376#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3e519522010-05-11 19:42:16377#pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10378#endif
Howard Hinnant3e519522010-05-11 19:42:16379
380_LIBCPP_BEGIN_NAMESPACE_STD
381
Eric Fiselieree187e22015-06-13 07:08:02382template <class _Key, class _Cp, class _Hash,
383 bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
Howard Hinnant42b8bb52011-12-11 20:31:33384 >
Howard Hinnant3e519522010-05-11 19:42:16385class __unordered_map_hasher
386 : private _Hash
387{
388public:
Howard Hinnant789847d2010-09-23 18:58:28389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24390 __unordered_map_hasher()
391 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
392 : _Hash() {}
Howard Hinnant789847d2010-09-23 18:58:28393 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24394 __unordered_map_hasher(const _Hash& __h)
395 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
396 : _Hash(__h) {}
Howard Hinnant789847d2010-09-23 18:58:28397 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24398 const _Hash& hash_function() const _NOEXCEPT {return *this;}
Howard Hinnant789847d2010-09-23 18:58:28399 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24400 size_t operator()(const _Cp& __x) const
Howard Hinnantabb160e2013-07-05 18:06:00401 {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
Howard Hinnanta1a9e772011-12-12 17:26:24402 _LIBCPP_INLINE_VISIBILITY
403 size_t operator()(const _Key& __x) const
Howard Hinnant3e519522010-05-11 19:42:16404 {return static_cast<const _Hash&>(*this)(__x);}
Marshall Clowe3fbe142015-07-13 20:04:56405 void swap(__unordered_map_hasher&__y)
406 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
407 {
408 using _VSTD::swap;
409 swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y));
410 }
Howard Hinnant3e519522010-05-11 19:42:16411};
412
Howard Hinnantabb160e2013-07-05 18:06:00413template <class _Key, class _Cp, class _Hash>
414class __unordered_map_hasher<_Key, _Cp, _Hash, false>
Howard Hinnant3e519522010-05-11 19:42:16415{
416 _Hash __hash_;
Howard Hinnant3e519522010-05-11 19:42:16417public:
Howard Hinnant789847d2010-09-23 18:58:28418 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24419 __unordered_map_hasher()
420 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
421 : __hash_() {}
Howard Hinnant789847d2010-09-23 18:58:28422 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24423 __unordered_map_hasher(const _Hash& __h)
424 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
425 : __hash_(__h) {}
Howard Hinnant789847d2010-09-23 18:58:28426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24427 const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
Howard Hinnant789847d2010-09-23 18:58:28428 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24429 size_t operator()(const _Cp& __x) const
Howard Hinnantabb160e2013-07-05 18:06:00430 {return __hash_(__x.__cc.first);}
Howard Hinnanta1a9e772011-12-12 17:26:24431 _LIBCPP_INLINE_VISIBILITY
432 size_t operator()(const _Key& __x) const
Howard Hinnant3e519522010-05-11 19:42:16433 {return __hash_(__x);}
Marshall Clowe3fbe142015-07-13 20:04:56434 void swap(__unordered_map_hasher&__y)
435 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
436 {
437 using _VSTD::swap;
438 swap(__hash_, __y.__hash_);
439 }
Howard Hinnant3e519522010-05-11 19:42:16440};
441
Marshall Clowe3fbe142015-07-13 20:04:56442template <class _Key, class _Cp, class _Hash, bool __b>
443inline _LIBCPP_INLINE_VISIBILITY
444void
445swap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
446 __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
447 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
448{
449 __x.swap(__y);
450}
451
Eric Fiselieree187e22015-06-13 07:08:02452template <class _Key, class _Cp, class _Pred,
453 bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value
Howard Hinnant42b8bb52011-12-11 20:31:33454 >
Howard Hinnant3e519522010-05-11 19:42:16455class __unordered_map_equal
456 : private _Pred
457{
458public:
Howard Hinnant789847d2010-09-23 18:58:28459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24460 __unordered_map_equal()
461 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
462 : _Pred() {}
Howard Hinnant789847d2010-09-23 18:58:28463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24464 __unordered_map_equal(const _Pred& __p)
465 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
466 : _Pred(__p) {}
Howard Hinnant789847d2010-09-23 18:58:28467 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24468 const _Pred& key_eq() const _NOEXCEPT {return *this;}
Howard Hinnant789847d2010-09-23 18:58:28469 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24470 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00471 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
Howard Hinnanta1a9e772011-12-12 17:26:24472 _LIBCPP_INLINE_VISIBILITY
473 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00474 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
Howard Hinnanta1a9e772011-12-12 17:26:24475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24476 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00477 {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
Marshall Clowe3fbe142015-07-13 20:04:56478 void swap(__unordered_map_equal&__y)
479 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
480 {
481 using _VSTD::swap;
482 swap(static_cast<const _Pred&>(*this), static_cast<const _Pred&>(__y));
483 }
Howard Hinnant3e519522010-05-11 19:42:16484};
485
Howard Hinnantabb160e2013-07-05 18:06:00486template <class _Key, class _Cp, class _Pred>
487class __unordered_map_equal<_Key, _Cp, _Pred, false>
Howard Hinnant3e519522010-05-11 19:42:16488{
489 _Pred __pred_;
Howard Hinnant3e519522010-05-11 19:42:16490public:
Howard Hinnant789847d2010-09-23 18:58:28491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24492 __unordered_map_equal()
493 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
494 : __pred_() {}
Howard Hinnant789847d2010-09-23 18:58:28495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24496 __unordered_map_equal(const _Pred& __p)
497 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
498 : __pred_(__p) {}
Howard Hinnant789847d2010-09-23 18:58:28499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24500 const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
Howard Hinnant789847d2010-09-23 18:58:28501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24502 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00503 {return __pred_(__x.__cc.first, __y.__cc.first);}
Howard Hinnanta1a9e772011-12-12 17:26:24504 _LIBCPP_INLINE_VISIBILITY
505 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00506 {return __pred_(__x.__cc.first, __y);}
Howard Hinnanta1a9e772011-12-12 17:26:24507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta1a9e772011-12-12 17:26:24508 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnantabb160e2013-07-05 18:06:00509 {return __pred_(__x, __y.__cc.first);}
Marshall Clowe3fbe142015-07-13 20:04:56510 void swap(__unordered_map_equal&__y)
511 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
512 {
513 using _VSTD::swap;
514 swap(__pred_, __y.__pred_);
515 }
Howard Hinnant3e519522010-05-11 19:42:16516};
517
Marshall Clowe3fbe142015-07-13 20:04:56518template <class _Key, class _Cp, class _Pred, bool __b>
519inline _LIBCPP_INLINE_VISIBILITY
520void
521swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
522 __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
523 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
524{
525 __x.swap(__y);
526}
527
Howard Hinnant3e519522010-05-11 19:42:16528template <class _Alloc>
529class __hash_map_node_destructor
530{
531 typedef _Alloc allocator_type;
532 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier75d0dcf2016-02-10 20:46:23533
Howard Hinnant3e519522010-05-11 19:42:16534public:
Eric Fiselier75d0dcf2016-02-10 20:46:23535
536 typedef typename __alloc_traits::pointer pointer;
Howard Hinnant3e519522010-05-11 19:42:16537private:
Howard Hinnant3e519522010-05-11 19:42:16538
539 allocator_type& __na_;
540
541 __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
542
543public:
544 bool __first_constructed;
545 bool __second_constructed;
546
Howard Hinnant789847d2010-09-23 18:58:28547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24548 explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16549 : __na_(__na),
550 __first_constructed(false),
551 __second_constructed(false)
552 {}
553
Howard Hinnant7609c9b2010-09-04 23:28:19554#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant789847d2010-09-23 18:58:28555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16556 __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
Howard Hinnant37141072011-06-04 18:54:24557 _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16558 : __na_(__x.__na_),
559 __first_constructed(__x.__value_constructed),
560 __second_constructed(__x.__value_constructed)
561 {
562 __x.__value_constructed = false;
563 }
Howard Hinnant7609c9b2010-09-04 23:28:19564#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant789847d2010-09-23 18:58:28565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16566 __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
567 : __na_(__x.__na_),
568 __first_constructed(__x.__value_constructed),
569 __second_constructed(__x.__value_constructed)
570 {
571 const_cast<bool&>(__x.__value_constructed) = false;
572 }
Howard Hinnant7609c9b2010-09-04 23:28:19573#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:16574
Howard Hinnant789847d2010-09-23 18:58:28575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24576 void operator()(pointer __p) _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16577 {
578 if (__second_constructed)
Howard Hinnant307f8142013-06-22 15:21:29579 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
Howard Hinnant3e519522010-05-11 19:42:16580 if (__first_constructed)
Howard Hinnant307f8142013-06-22 15:21:29581 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
Howard Hinnant3e519522010-05-11 19:42:16582 if (__p)
583 __alloc_traits::deallocate(__na_, __p, 1);
584 }
585};
586
Eric Fiselierfcd02212016-02-11 11:59:44587#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant9fd9f842013-09-30 19:08:22588template <class _Key, class _Tp>
589union __hash_value_type
590{
591 typedef _Key key_type;
592 typedef _Tp mapped_type;
593 typedef pair<const key_type, mapped_type> value_type;
594 typedef pair<key_type, mapped_type> __nc_value_type;
595
596 value_type __cc;
597 __nc_value_type __nc;
598
Howard Hinnant9fd9f842013-09-30 19:08:22599 _LIBCPP_INLINE_VISIBILITY
600 __hash_value_type& operator=(const __hash_value_type& __v)
601 {__nc = __v.__cc; return *this;}
602
603 _LIBCPP_INLINE_VISIBILITY
604 __hash_value_type& operator=(__hash_value_type&& __v)
Marshall Clow27647992015-05-06 12:11:22605 {__nc = _VSTD::move(__v.__nc); return *this;}
Howard Hinnant9fd9f842013-09-30 19:08:22606
Eric Fiselierfcd02212016-02-11 11:59:44607 template <class _ValueTp,
608 class = typename enable_if<
609 __is_same_uncvref<_ValueTp, value_type>::value
610 >::type
611 >
Howard Hinnant9fd9f842013-09-30 19:08:22612 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfcd02212016-02-11 11:59:44613 __hash_value_type& operator=(_ValueTp&& __v) {
614 __nc = _VSTD::forward<_ValueTp>(__v); return *this;
615 }
616
617private:
618 __hash_value_type(const __hash_value_type& __v) = delete;
619 __hash_value_type(__hash_value_type&& __v) = delete;
620 template <class ..._Args>
621 explicit __hash_value_type(_Args&& ...__args) = delete;
622
623 ~__hash_value_type() = delete;
Howard Hinnant9fd9f842013-09-30 19:08:22624};
625
626#else
627
628template <class _Key, class _Tp>
629struct __hash_value_type
630{
631 typedef _Key key_type;
632 typedef _Tp mapped_type;
633 typedef pair<const key_type, mapped_type> value_type;
634
635 value_type __cc;
636
Eric Fiselierfcd02212016-02-11 11:59:44637private:
638 ~__hash_value_type();
Howard Hinnant9fd9f842013-09-30 19:08:22639};
640
641#endif
642
Howard Hinnant3e519522010-05-11 19:42:16643template <class _HashIterator>
Howard Hinnantf0544c22013-08-12 18:38:34644class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
Howard Hinnant3e519522010-05-11 19:42:16645{
646 _HashIterator __i_;
647
Eric Fiselier75d0dcf2016-02-10 20:46:23648 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
649
Howard Hinnant3e519522010-05-11 19:42:16650public:
651 typedef forward_iterator_tag iterator_category;
Eric Fiselier75d0dcf2016-02-10 20:46:23652 typedef typename _NodeTypes::__map_value_type value_type;
653 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:16654 typedef value_type& reference;
Eric Fiselier75d0dcf2016-02-10 20:46:23655 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnant3e519522010-05-11 19:42:16656
Howard Hinnant789847d2010-09-23 18:58:28657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24658 __hash_map_iterator() _NOEXCEPT {}
Howard Hinnant3e519522010-05-11 19:42:16659
Howard Hinnant789847d2010-09-23 18:58:28660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24661 __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant3e519522010-05-11 19:42:16662
Howard Hinnant789847d2010-09-23 18:58:28663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant307f8142013-06-22 15:21:29664 reference operator*() const {return __i_->__cc;}
Howard Hinnant789847d2010-09-23 18:58:28665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant307f8142013-06-22 15:21:29666 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnant3e519522010-05-11 19:42:16667
Howard Hinnant789847d2010-09-23 18:58:28668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16669 __hash_map_iterator& operator++() {++__i_; return *this;}
Howard Hinnant789847d2010-09-23 18:58:28670 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16671 __hash_map_iterator operator++(int)
672 {
673 __hash_map_iterator __t(*this);
674 ++(*this);
675 return __t;
676 }
677
Howard Hinnant789847d2010-09-23 18:58:28678 friend _LIBCPP_INLINE_VISIBILITY
679 bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnant3e519522010-05-11 19:42:16680 {return __x.__i_ == __y.__i_;}
Howard Hinnant789847d2010-09-23 18:58:28681 friend _LIBCPP_INLINE_VISIBILITY
682 bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnant3e519522010-05-11 19:42:16683 {return __x.__i_ != __y.__i_;}
684
Howard Hinnantf0544c22013-08-12 18:38:34685 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
686 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
687 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
688 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
689 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
Howard Hinnant3e519522010-05-11 19:42:16690};
691
692template <class _HashIterator>
Howard Hinnantf0544c22013-08-12 18:38:34693class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
Howard Hinnant3e519522010-05-11 19:42:16694{
695 _HashIterator __i_;
696
Eric Fiselier75d0dcf2016-02-10 20:46:23697 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
698
Howard Hinnant3e519522010-05-11 19:42:16699public:
700 typedef forward_iterator_tag iterator_category;
Eric Fiselier75d0dcf2016-02-10 20:46:23701 typedef typename _NodeTypes::__map_value_type value_type;
702 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:16703 typedef const value_type& reference;
Eric Fiselier75d0dcf2016-02-10 20:46:23704 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnant3e519522010-05-11 19:42:16705
Howard Hinnant789847d2010-09-23 18:58:28706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24707 __hash_map_const_iterator() _NOEXCEPT {}
Howard Hinnant3e519522010-05-11 19:42:16708
Howard Hinnant789847d2010-09-23 18:58:28709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24710 __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant789847d2010-09-23 18:58:28711 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16712 __hash_map_const_iterator(
713 __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
Howard Hinnant37141072011-06-04 18:54:24714 _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16715 : __i_(__i.__i_) {}
716
Howard Hinnant789847d2010-09-23 18:58:28717 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant307f8142013-06-22 15:21:29718 reference operator*() const {return __i_->__cc;}
Howard Hinnant789847d2010-09-23 18:58:28719 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant307f8142013-06-22 15:21:29720 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnant3e519522010-05-11 19:42:16721
Howard Hinnant789847d2010-09-23 18:58:28722 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16723 __hash_map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnant789847d2010-09-23 18:58:28724 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16725 __hash_map_const_iterator operator++(int)
726 {
727 __hash_map_const_iterator __t(*this);
728 ++(*this);
729 return __t;
730 }
731
Howard Hinnant789847d2010-09-23 18:58:28732 friend _LIBCPP_INLINE_VISIBILITY
733 bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnant3e519522010-05-11 19:42:16734 {return __x.__i_ == __y.__i_;}
Howard Hinnant789847d2010-09-23 18:58:28735 friend _LIBCPP_INLINE_VISIBILITY
736 bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnant3e519522010-05-11 19:42:16737 {return __x.__i_ != __y.__i_;}
738
Howard Hinnantf0544c22013-08-12 18:38:34739 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
740 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
741 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
742 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
Howard Hinnant3e519522010-05-11 19:42:16743};
744
745template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
746 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnantf0544c22013-08-12 18:38:34747class _LIBCPP_TYPE_VIS_ONLY unordered_map
Howard Hinnant3e519522010-05-11 19:42:16748{
749public:
750 // types
751 typedef _Key key_type;
752 typedef _Tp mapped_type;
753 typedef _Hash hasher;
754 typedef _Pred key_equal;
755 typedef _Alloc allocator_type;
756 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant307f8142013-06-22 15:21:29757 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnant3e519522010-05-11 19:42:16758 typedef value_type& reference;
759 typedef const value_type& const_reference;
Howard Hinnantb24c8022013-07-23 22:01:58760 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
761 "Invalid allocator::value_type");
Howard Hinnant3e519522010-05-11 19:42:16762
763private:
Howard Hinnant9fd9f842013-09-30 19:08:22764 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnantabb160e2013-07-05 18:06:00765 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
766 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow1f508012015-04-07 05:21:38767 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
768 __value_type>::type __allocator_type;
Howard Hinnant3e519522010-05-11 19:42:16769
770 typedef __hash_table<__value_type, __hasher,
771 __key_equal, __allocator_type> __table;
772
773 __table __table_;
774
Eric Fiselierfcd02212016-02-11 11:59:44775 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnant3e519522010-05-11 19:42:16776 typedef typename __table::__node_pointer __node_pointer;
777 typedef typename __table::__node_const_pointer __node_const_pointer;
778 typedef typename __table::__node_traits __node_traits;
779 typedef typename __table::__node_allocator __node_allocator;
780 typedef typename __table::__node __node;
Howard Hinnantc003db12011-11-29 18:15:50781 typedef __hash_map_node_destructor<__node_allocator> _Dp;
782 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnant3e519522010-05-11 19:42:16783 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselierfcd02212016-02-11 11:59:44784
785 static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
786 static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
Howard Hinnant3e519522010-05-11 19:42:16787public:
788 typedef typename __alloc_traits::pointer pointer;
789 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier75d0dcf2016-02-10 20:46:23790 typedef typename __table::size_type size_type;
791 typedef typename __table::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:16792
793 typedef __hash_map_iterator<typename __table::iterator> iterator;
794 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
795 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
796 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
797
Howard Hinnant789847d2010-09-23 18:58:28798 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24799 unordered_map()
800 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnantb24c8022013-07-23 22:01:58801 {
802#if _LIBCPP_DEBUG_LEVEL >= 2
803 __get_db()->__insert_c(this);
804#endif
805 }
Howard Hinnant3e519522010-05-11 19:42:16806 explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
807 const key_equal& __eql = key_equal());
808 unordered_map(size_type __n, const hasher& __hf,
809 const key_equal& __eql,
810 const allocator_type& __a);
811 template <class _InputIterator>
812 unordered_map(_InputIterator __first, _InputIterator __last);
813 template <class _InputIterator>
814 unordered_map(_InputIterator __first, _InputIterator __last,
815 size_type __n, const hasher& __hf = hasher(),
816 const key_equal& __eql = key_equal());
817 template <class _InputIterator>
818 unordered_map(_InputIterator __first, _InputIterator __last,
819 size_type __n, const hasher& __hf,
820 const key_equal& __eql,
821 const allocator_type& __a);
Evgeniy Stepanovcd31b432016-04-22 01:04:55822 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16823 explicit unordered_map(const allocator_type& __a);
824 unordered_map(const unordered_map& __u);
825 unordered_map(const unordered_map& __u, const allocator_type& __a);
Howard Hinnant7609c9b2010-09-04 23:28:19826#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanovcd31b432016-04-22 01:04:55827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24828 unordered_map(unordered_map&& __u)
829 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:16830 unordered_map(unordered_map&& __u, const allocator_type& __a);
Howard Hinnant7609c9b2010-09-04 23:28:19831#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant54976f22011-08-12 21:56:02832#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant3e519522010-05-11 19:42:16833 unordered_map(initializer_list<value_type> __il);
834 unordered_map(initializer_list<value_type> __il, size_type __n,
835 const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
836 unordered_map(initializer_list<value_type> __il, size_type __n,
837 const hasher& __hf, const key_equal& __eql,
838 const allocator_type& __a);
Howard Hinnant54976f22011-08-12 21:56:02839#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow3cd37e62013-09-12 03:00:31840#if _LIBCPP_STD_VER > 11
841 _LIBCPP_INLINE_VISIBILITY
842 unordered_map(size_type __n, const allocator_type& __a)
843 : unordered_map(__n, hasher(), key_equal(), __a) {}
844 _LIBCPP_INLINE_VISIBILITY
845 unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
846 : unordered_map(__n, __hf, key_equal(), __a) {}
847 template <class _InputIterator>
848 _LIBCPP_INLINE_VISIBILITY
849 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
850 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
851 template <class _InputIterator>
852 _LIBCPP_INLINE_VISIBILITY
853 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
854 const allocator_type& __a)
855 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
856 _LIBCPP_INLINE_VISIBILITY
857 unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
858 : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
859 _LIBCPP_INLINE_VISIBILITY
860 unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
861 const allocator_type& __a)
862 : unordered_map(__il, __n, __hf, key_equal(), __a) {}
863#endif
Howard Hinnant3e519522010-05-11 19:42:16864 // ~unordered_map() = default;
Howard Hinnant5a336872011-07-01 19:24:36865 _LIBCPP_INLINE_VISIBILITY
866 unordered_map& operator=(const unordered_map& __u)
867 {
Marshall Clow2ee83722016-07-18 13:19:00868#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant5a336872011-07-01 19:24:36869 __table_ = __u.__table_;
Howard Hinnant307f8142013-06-22 15:21:29870#else
Marshall Clow74cf6ff2014-02-08 04:03:14871 if (this != &__u) {
872 __table_.clear();
873 __table_.hash_function() = __u.__table_.hash_function();
874 __table_.key_eq() = __u.__table_.key_eq();
875 __table_.max_load_factor() = __u.__table_.max_load_factor();
876 __table_.__copy_assign_alloc(__u.__table_);
877 insert(__u.begin(), __u.end());
878 }
Howard Hinnant307f8142013-06-22 15:21:29879#endif
Howard Hinnant5a336872011-07-01 19:24:36880 return *this;
881 }
Howard Hinnant7609c9b2010-09-04 23:28:19882#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanovcd31b432016-04-22 01:04:55883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24884 unordered_map& operator=(unordered_map&& __u)
885 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:16886#endif
Howard Hinnant54976f22011-08-12 21:56:02887#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Evgeniy Stepanovcd31b432016-04-22 01:04:55888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16889 unordered_map& operator=(initializer_list<value_type> __il);
Howard Hinnant54976f22011-08-12 21:56:02890#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant3e519522010-05-11 19:42:16891
Howard Hinnant789847d2010-09-23 18:58:28892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24893 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16894 {return allocator_type(__table_.__node_alloc());}
895
Howard Hinnant789847d2010-09-23 18:58:28896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24897 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnant789847d2010-09-23 18:58:28898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24899 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnant789847d2010-09-23 18:58:28900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24901 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnant3e519522010-05-11 19:42:16902
Howard Hinnant789847d2010-09-23 18:58:28903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24904 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24906 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24908 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24910 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24912 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:24914 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnant3e519522010-05-11 19:42:16915
Eric Fiselier7a9f5002016-04-18 01:40:45916 _LIBCPP_INLINE_VISIBILITY
917 pair<iterator, bool> insert(const value_type& __x)
918 {return __table_.__insert_unique(__x);}
919
920 iterator insert(const_iterator __p, const value_type& __x) {
921#if _LIBCPP_DEBUG_LEVEL >= 2
922 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
923 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
924 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:52925#else
926 ((void)__p);
Eric Fiselier7a9f5002016-04-18 01:40:45927#endif
928 return insert(__x).first;
929 }
930
931 template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:55932 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier7a9f5002016-04-18 01:40:45933 void insert(_InputIterator __first, _InputIterator __last);
934
935#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
936 _LIBCPP_INLINE_VISIBILITY
937 void insert(initializer_list<value_type> __il)
938 {insert(__il.begin(), __il.end());}
939#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
940
Eric Fiselierfcd02212016-02-11 11:59:44941#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier7a9f5002016-04-18 01:40:45942 _LIBCPP_INLINE_VISIBILITY
943 pair<iterator, bool> insert(value_type&& __x)
944 {return __table_.__insert_unique(_VSTD::move(__x));}
945
946 iterator insert(const_iterator __p, value_type&& __x) {
947#if _LIBCPP_DEBUG_LEVEL >= 2
948 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
949 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
950 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:52951#else
952 ((void)__p);
Eric Fiselier7a9f5002016-04-18 01:40:45953#endif
954 return __table_.__insert_unique(_VSTD::move(__x)).first;
955 }
956
957 template <class _Pp,
958 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
959 _LIBCPP_INLINE_VISIBILITY
960 pair<iterator, bool> insert(_Pp&& __x)
961 {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
962
963 template <class _Pp,
964 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
965 _LIBCPP_INLINE_VISIBILITY
966 iterator insert(const_iterator __p, _Pp&& __x)
967 {
968#if _LIBCPP_DEBUG_LEVEL >= 2
969 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
970 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
971 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:52972#else
973 ((void)__p);
Eric Fiselier7a9f5002016-04-18 01:40:45974#endif
975 return insert(_VSTD::forward<_Pp>(__x)).first;
976 }
977
Eric Fiselierfcd02212016-02-11 11:59:44978 template <class... _Args>
979 _LIBCPP_INLINE_VISIBILITY
980 pair<iterator, bool> emplace(_Args&&... __args) {
981 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
982 }
Howard Hinnant7609c9b2010-09-04 23:28:19983
Howard Hinnant8b805c92012-05-25 22:04:21984 template <class... _Args>
Eric Fiselierfcd02212016-02-11 11:59:44985 _LIBCPP_INLINE_VISIBILITY
986 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
Howard Hinnant4c80bfb2013-07-30 21:04:42987#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselierfcd02212016-02-11 11:59:44988 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
989 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
990 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:52991#else
992 ((void)__p);
Howard Hinnant4c80bfb2013-07-30 21:04:42993#endif
Eric Fiselierfcd02212016-02-11 11:59:44994 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
995 }
996
Eric Fiselier7a9f5002016-04-18 01:40:45997#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16998
Marshall Clowbc4c89a2015-07-07 05:45:35999#if _LIBCPP_STD_VER > 14
Marshall Clowbc4c89a2015-07-07 05:45:351000 template <class... _Args>
1001 _LIBCPP_INLINE_VISIBILITY
1002 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1003 {
Eric Fiselier87c41042016-04-18 06:51:331004 return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
1005 _VSTD::forward_as_tuple(__k),
1006 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clowbc4c89a2015-07-07 05:45:351007 }
1008
1009 template <class... _Args>
1010 _LIBCPP_INLINE_VISIBILITY
1011 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1012 {
Eric Fiselier87c41042016-04-18 06:51:331013 return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
1014 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1015 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clowbc4c89a2015-07-07 05:45:351016 }
1017
1018 template <class... _Args>
1019 _LIBCPP_INLINE_VISIBILITY
1020 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1021 {
Eric Fiselier87c41042016-04-18 06:51:331022#if _LIBCPP_DEBUG_LEVEL >= 2
Oleg Ranevskyyeef9b352016-09-26 21:39:381023 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
Eric Fiselier87c41042016-04-18 06:51:331024 "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1025 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:521026#else
1027 ((void)__h);
Eric Fiselier87c41042016-04-18 06:51:331028#endif
Eric Fiselierfd838222016-12-23 23:37:521029 return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
Marshall Clowbc4c89a2015-07-07 05:45:351030 }
1031
1032 template <class... _Args>
1033 _LIBCPP_INLINE_VISIBILITY
1034 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1035 {
Eric Fiselier87c41042016-04-18 06:51:331036#if _LIBCPP_DEBUG_LEVEL >= 2
Oleg Ranevskyyeef9b352016-09-26 21:39:381037 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
Eric Fiselier87c41042016-04-18 06:51:331038 "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1039 " referring to this unordered_map");
Eric Fiselierfd838222016-12-23 23:37:521040#else
1041 ((void)__h);
Eric Fiselier87c41042016-04-18 06:51:331042#endif
1043 return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
Marshall Clowbc4c89a2015-07-07 05:45:351044 }
1045
1046 template <class _Vp>
1047 _LIBCPP_INLINE_VISIBILITY
1048 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1049 {
Eric Fiselier87c41042016-04-18 06:51:331050 pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1051 __k, _VSTD::forward<_Vp>(__v));
1052 if (!__res.second) {
1053 __res.first->second = _VSTD::forward<_Vp>(__v);
Marshall Clowbc4c89a2015-07-07 05:45:351054 }
Eric Fiselier87c41042016-04-18 06:51:331055 return __res;
Marshall Clowbc4c89a2015-07-07 05:45:351056 }
Eric Fiselier87c41042016-04-18 06:51:331057
Marshall Clowbc4c89a2015-07-07 05:45:351058 template <class _Vp>
1059 _LIBCPP_INLINE_VISIBILITY
1060 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1061 {
Eric Fiselier87c41042016-04-18 06:51:331062 pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1063 _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1064 if (!__res.second) {
1065 __res.first->second = _VSTD::forward<_Vp>(__v);
Marshall Clowbc4c89a2015-07-07 05:45:351066 }
Eric Fiselier87c41042016-04-18 06:51:331067 return __res;
Marshall Clowbc4c89a2015-07-07 05:45:351068 }
1069
1070 template <class _Vp>
1071 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfd838222016-12-23 23:37:521072 iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
Marshall Clowbc4c89a2015-07-07 05:45:351073 {
Eric Fiselierfd838222016-12-23 23:37:521074 // FIXME: Add debug mode checking for the iterator input
Eric Fiselier87c41042016-04-18 06:51:331075 return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
Marshall Clowbc4c89a2015-07-07 05:45:351076 }
1077
1078 template <class _Vp>
1079 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierfd838222016-12-23 23:37:521080 iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
Marshall Clowbc4c89a2015-07-07 05:45:351081 {
Eric Fiselierfd838222016-12-23 23:37:521082 // FIXME: Add debug mode checking for the iterator input
Eric Fiselier87c41042016-04-18 06:51:331083 return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
Marshall Clowbc4c89a2015-07-07 05:45:351084 }
1085#endif
Marshall Clowbc4c89a2015-07-07 05:45:351086
Howard Hinnant789847d2010-09-23 18:58:281087 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161088 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnant789847d2010-09-23 18:58:281089 _LIBCPP_INLINE_VISIBILITY
Marshall Clowec392962015-05-10 13:35:001090 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1091 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161092 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:281093 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161094 iterator erase(const_iterator __first, const_iterator __last)
1095 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnant789847d2010-09-23 18:58:281096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241097 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnant3e519522010-05-11 19:42:161098
Howard Hinnant789847d2010-09-23 18:58:281099 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241100 void swap(unordered_map& __u)
1101 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
Eric Fiselier780b51d2016-12-28 05:53:011102 { __table_.swap(__u.__table_);}
Howard Hinnant3e519522010-05-11 19:42:161103
Howard Hinnant789847d2010-09-23 18:58:281104 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161105 hasher hash_function() const
1106 {return __table_.hash_function().hash_function();}
Howard Hinnant789847d2010-09-23 18:58:281107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161108 key_equal key_eq() const
1109 {return __table_.key_eq().key_eq();}
1110
Howard Hinnant789847d2010-09-23 18:58:281111 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161112 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:281113 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161114 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:281115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161116 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:281117 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161118 pair<iterator, iterator> equal_range(const key_type& __k)
1119 {return __table_.__equal_range_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:281120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161121 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1122 {return __table_.__equal_range_unique(__k);}
1123
1124 mapped_type& operator[](const key_type& __k);
Eric Fiselier0f905672016-02-11 21:45:531125#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:161126 mapped_type& operator[](key_type&& __k);
1127#endif
1128
1129 mapped_type& at(const key_type& __k);
1130 const mapped_type& at(const key_type& __k) const;
1131
Howard Hinnant789847d2010-09-23 18:58:281132 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241133 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnant789847d2010-09-23 18:58:281134 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241135 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnant3e519522010-05-11 19:42:161136
Howard Hinnant789847d2010-09-23 18:58:281137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161138 size_type bucket_size(size_type __n) const
1139 {return __table_.bucket_size(__n);}
Howard Hinnant789847d2010-09-23 18:58:281140 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161141 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1142
Howard Hinnant789847d2010-09-23 18:58:281143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161144 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281145 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161146 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnant789847d2010-09-23 18:58:281147 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161148 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281149 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161150 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnant789847d2010-09-23 18:58:281151 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161152 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281153 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161154 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1155
Howard Hinnant789847d2010-09-23 18:58:281156 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241157 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnant789847d2010-09-23 18:58:281158 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241159 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnant789847d2010-09-23 18:58:281160 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161161 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnant789847d2010-09-23 18:58:281162 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161163 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnant789847d2010-09-23 18:58:281164 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161165 void reserve(size_type __n) {__table_.reserve(__n);}
1166
Howard Hinnantb24c8022013-07-23 22:01:581167#if _LIBCPP_DEBUG_LEVEL >= 2
1168
1169 bool __dereferenceable(const const_iterator* __i) const
1170 {return __table_.__dereferenceable(&__i->__i_);}
1171 bool __decrementable(const const_iterator* __i) const
1172 {return __table_.__decrementable(&__i->__i_);}
1173 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1174 {return __table_.__addable(&__i->__i_, __n);}
1175 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1176 {return __table_.__addable(&__i->__i_, __n);}
1177
1178#endif // _LIBCPP_DEBUG_LEVEL >= 2
1179
Howard Hinnant3e519522010-05-11 19:42:161180private:
Eric Fiselier0f905672016-02-11 21:45:531181
1182#ifdef _LIBCPP_CXX03_LANG
Howard Hinnant4a95f9e2013-07-04 20:59:161183 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselier0f905672016-02-11 21:45:531184#endif
Howard Hinnant3e519522010-05-11 19:42:161185};
1186
1187template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1188unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1189 size_type __n, const hasher& __hf, const key_equal& __eql)
1190 : __table_(__hf, __eql)
1191{
Howard Hinnantb24c8022013-07-23 22:01:581192#if _LIBCPP_DEBUG_LEVEL >= 2
1193 __get_db()->__insert_c(this);
1194#endif
Howard Hinnant3e519522010-05-11 19:42:161195 __table_.rehash(__n);
1196}
1197
1198template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1199unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1200 size_type __n, const hasher& __hf, const key_equal& __eql,
1201 const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401202 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161203{
Howard Hinnantb24c8022013-07-23 22:01:581204#if _LIBCPP_DEBUG_LEVEL >= 2
1205 __get_db()->__insert_c(this);
1206#endif
Howard Hinnant3e519522010-05-11 19:42:161207 __table_.rehash(__n);
1208}
1209
1210template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551211inline
Howard Hinnant3e519522010-05-11 19:42:161212unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1213 const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401214 : __table_(typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161215{
Howard Hinnantb24c8022013-07-23 22:01:581216#if _LIBCPP_DEBUG_LEVEL >= 2
1217 __get_db()->__insert_c(this);
1218#endif
Howard Hinnant3e519522010-05-11 19:42:161219}
1220
1221template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1222template <class _InputIterator>
1223unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1224 _InputIterator __first, _InputIterator __last)
1225{
Howard Hinnantb24c8022013-07-23 22:01:581226#if _LIBCPP_DEBUG_LEVEL >= 2
1227 __get_db()->__insert_c(this);
1228#endif
Howard Hinnant3e519522010-05-11 19:42:161229 insert(__first, __last);
1230}
1231
1232template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1233template <class _InputIterator>
1234unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1235 _InputIterator __first, _InputIterator __last, size_type __n,
1236 const hasher& __hf, const key_equal& __eql)
1237 : __table_(__hf, __eql)
1238{
Howard Hinnantb24c8022013-07-23 22:01:581239#if _LIBCPP_DEBUG_LEVEL >= 2
1240 __get_db()->__insert_c(this);
1241#endif
Howard Hinnant3e519522010-05-11 19:42:161242 __table_.rehash(__n);
1243 insert(__first, __last);
1244}
1245
1246template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1247template <class _InputIterator>
1248unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1249 _InputIterator __first, _InputIterator __last, size_type __n,
1250 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401251 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161252{
Howard Hinnantb24c8022013-07-23 22:01:581253#if _LIBCPP_DEBUG_LEVEL >= 2
1254 __get_db()->__insert_c(this);
1255#endif
Howard Hinnant3e519522010-05-11 19:42:161256 __table_.rehash(__n);
1257 insert(__first, __last);
1258}
1259
1260template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1261unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1262 const unordered_map& __u)
1263 : __table_(__u.__table_)
1264{
Howard Hinnantb24c8022013-07-23 22:01:581265#if _LIBCPP_DEBUG_LEVEL >= 2
1266 __get_db()->__insert_c(this);
1267#endif
Howard Hinnant3e519522010-05-11 19:42:161268 __table_.rehash(__u.bucket_count());
1269 insert(__u.begin(), __u.end());
1270}
1271
1272template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1273unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1274 const unordered_map& __u, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401275 : __table_(__u.__table_, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161276{
Howard Hinnantb24c8022013-07-23 22:01:581277#if _LIBCPP_DEBUG_LEVEL >= 2
1278 __get_db()->__insert_c(this);
1279#endif
Howard Hinnant3e519522010-05-11 19:42:161280 __table_.rehash(__u.bucket_count());
1281 insert(__u.begin(), __u.end());
1282}
1283
Howard Hinnant7609c9b2010-09-04 23:28:191284#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161285
1286template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551287inline
Howard Hinnant3e519522010-05-11 19:42:161288unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1289 unordered_map&& __u)
Howard Hinnant37141072011-06-04 18:54:241290 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnantce48a112011-06-30 21:18:191291 : __table_(_VSTD::move(__u.__table_))
Howard Hinnant3e519522010-05-11 19:42:161292{
Howard Hinnantb24c8022013-07-23 22:01:581293#if _LIBCPP_DEBUG_LEVEL >= 2
1294 __get_db()->__insert_c(this);
Howard Hinnant4c80bfb2013-07-30 21:04:421295 __get_db()->swap(this, &__u);
Howard Hinnantb24c8022013-07-23 22:01:581296#endif
Howard Hinnant3e519522010-05-11 19:42:161297}
1298
1299template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1300unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1301 unordered_map&& __u, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401302 : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161303{
Howard Hinnantb24c8022013-07-23 22:01:581304#if _LIBCPP_DEBUG_LEVEL >= 2
1305 __get_db()->__insert_c(this);
1306#endif
Howard Hinnant3e519522010-05-11 19:42:161307 if (__a != __u.get_allocator())
1308 {
1309 iterator __i = __u.begin();
Eric Fiselierfcd02212016-02-11 11:59:441310 while (__u.size() != 0) {
1311 __table_.__emplace_unique(_VSTD::move(
1312 __u.__table_.remove((__i++).__i_)->__value_.__nc));
1313 }
Howard Hinnant3e519522010-05-11 19:42:161314 }
Howard Hinnant4c80bfb2013-07-30 21:04:421315#if _LIBCPP_DEBUG_LEVEL >= 2
1316 else
1317 __get_db()->swap(this, &__u);
1318#endif
Howard Hinnant3e519522010-05-11 19:42:161319}
1320
Howard Hinnant7609c9b2010-09-04 23:28:191321#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161322
Howard Hinnant54976f22011-08-12 21:56:021323#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1324
Howard Hinnant3e519522010-05-11 19:42:161325template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1326unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1327 initializer_list<value_type> __il)
1328{
Howard Hinnantb24c8022013-07-23 22:01:581329#if _LIBCPP_DEBUG_LEVEL >= 2
1330 __get_db()->__insert_c(this);
1331#endif
Howard Hinnant3e519522010-05-11 19:42:161332 insert(__il.begin(), __il.end());
1333}
1334
1335template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1336unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1337 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1338 const key_equal& __eql)
1339 : __table_(__hf, __eql)
1340{
Howard Hinnantb24c8022013-07-23 22:01:581341#if _LIBCPP_DEBUG_LEVEL >= 2
1342 __get_db()->__insert_c(this);
1343#endif
Howard Hinnant3e519522010-05-11 19:42:161344 __table_.rehash(__n);
1345 insert(__il.begin(), __il.end());
1346}
1347
1348template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1349unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1350 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1351 const key_equal& __eql, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401352 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161353{
Howard Hinnantb24c8022013-07-23 22:01:581354#if _LIBCPP_DEBUG_LEVEL >= 2
1355 __get_db()->__insert_c(this);
1356#endif
Howard Hinnant3e519522010-05-11 19:42:161357 __table_.rehash(__n);
1358 insert(__il.begin(), __il.end());
1359}
1360
Howard Hinnant54976f22011-08-12 21:56:021361#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1362
Howard Hinnant7609c9b2010-09-04 23:28:191363#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161364
1365template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551366inline
Howard Hinnant3e519522010-05-11 19:42:161367unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1368unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
Howard Hinnant37141072011-06-04 18:54:241369 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnant3e519522010-05-11 19:42:161370{
Howard Hinnantce48a112011-06-30 21:18:191371 __table_ = _VSTD::move(__u.__table_);
Howard Hinnant3e519522010-05-11 19:42:161372 return *this;
1373}
1374
Howard Hinnant7609c9b2010-09-04 23:28:191375#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161376
Howard Hinnant54976f22011-08-12 21:56:021377#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1378
Howard Hinnant3e519522010-05-11 19:42:161379template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551380inline
Howard Hinnant3e519522010-05-11 19:42:161381unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1382unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1383 initializer_list<value_type> __il)
1384{
1385 __table_.__assign_unique(__il.begin(), __il.end());
1386 return *this;
1387}
1388
Howard Hinnant54976f22011-08-12 21:56:021389#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1390
Eric Fiselier0f905672016-02-11 21:45:531391#ifdef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:161392template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1393typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnant4a95f9e2013-07-04 20:59:161394unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
Howard Hinnant3e519522010-05-11 19:42:161395{
1396 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnantc003db12011-11-29 18:15:501397 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant307f8142013-06-22 15:21:291398 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
Howard Hinnant3e519522010-05-11 19:42:161399 __h.get_deleter().__first_constructed = true;
Howard Hinnant307f8142013-06-22 15:21:291400 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
Howard Hinnant3e519522010-05-11 19:42:161401 __h.get_deleter().__second_constructed = true;
Dimitry Andric251c6292015-08-19 06:43:331402 return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
Howard Hinnant3e519522010-05-11 19:42:161403}
Eric Fiselier0f905672016-02-11 21:45:531404#endif
Howard Hinnant3e519522010-05-11 19:42:161405
Howard Hinnant3e519522010-05-11 19:42:161406template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1407template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:551408inline
Howard Hinnant3e519522010-05-11 19:42:161409void
1410unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1411 _InputIterator __last)
1412{
1413 for (; __first != __last; ++__first)
1414 __table_.__insert_unique(*__first);
1415}
1416
Eric Fiselier0f905672016-02-11 21:45:531417#ifdef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:161418template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1419_Tp&
1420unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1421{
1422 iterator __i = find(__k);
1423 if (__i != end())
1424 return __i->second;
Howard Hinnant4a95f9e2013-07-04 20:59:161425 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnant3e519522010-05-11 19:42:161426 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1427 __h.release();
1428 return __r.first->second;
1429}
Eric Fiselier0f905672016-02-11 21:45:531430#else
Howard Hinnant3e519522010-05-11 19:42:161431
Eric Fiselier0f905672016-02-11 21:45:531432template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1433_Tp&
1434unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1435{
1436 return __table_.__emplace_unique_key_args(__k,
1437 std::piecewise_construct, std::forward_as_tuple(__k),
1438 std::forward_as_tuple()).first->__cc.second;
1439}
Howard Hinnant3e519522010-05-11 19:42:161440
1441template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1442_Tp&
1443unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1444{
Eric Fiselier0f905672016-02-11 21:45:531445 return __table_.__emplace_unique_key_args(__k,
1446 std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1447 std::forward_as_tuple()).first->__cc.second;
Howard Hinnant3e519522010-05-11 19:42:161448}
1449
Eric Fiselier0f905672016-02-11 21:45:531450#endif // !_LIBCPP_CXX03_MODE
Howard Hinnant3e519522010-05-11 19:42:161451
1452template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1453_Tp&
1454unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1455{
1456 iterator __i = find(__k);
1457#ifndef _LIBCPP_NO_EXCEPTIONS
1458 if (__i == end())
1459 throw out_of_range("unordered_map::at: key not found");
Howard Hinnantb3371f62010-08-22 00:02:431460#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant3e519522010-05-11 19:42:161461 return __i->second;
1462}
1463
1464template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1465const _Tp&
1466unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1467{
1468 const_iterator __i = find(__k);
1469#ifndef _LIBCPP_NO_EXCEPTIONS
1470 if (__i == end())
1471 throw out_of_range("unordered_map::at: key not found");
Howard Hinnantb3371f62010-08-22 00:02:431472#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant3e519522010-05-11 19:42:161473 return __i->second;
1474}
1475
1476template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:281477inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161478void
1479swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1480 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant37141072011-06-04 18:54:241481 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnant3e519522010-05-11 19:42:161482{
1483 __x.swap(__y);
1484}
1485
1486template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1487bool
1488operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1489 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1490{
1491 if (__x.size() != __y.size())
1492 return false;
1493 typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1494 const_iterator;
1495 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1496 __i != __ex; ++__i)
1497 {
1498 const_iterator __j = __y.find(__i->first);
1499 if (__j == __ey || !(*__i == *__j))
1500 return false;
1501 }
1502 return true;
1503}
1504
1505template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:281506inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161507bool
1508operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1509 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1510{
1511 return !(__x == __y);
1512}
1513
1514template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1515 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnantf0544c22013-08-12 18:38:341516class _LIBCPP_TYPE_VIS_ONLY unordered_multimap
Howard Hinnant3e519522010-05-11 19:42:161517{
1518public:
1519 // types
1520 typedef _Key key_type;
1521 typedef _Tp mapped_type;
1522 typedef _Hash hasher;
1523 typedef _Pred key_equal;
1524 typedef _Alloc allocator_type;
1525 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant307f8142013-06-22 15:21:291526 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnant3e519522010-05-11 19:42:161527 typedef value_type& reference;
1528 typedef const value_type& const_reference;
Howard Hinnantb24c8022013-07-23 22:01:581529 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1530 "Invalid allocator::value_type");
Howard Hinnant3e519522010-05-11 19:42:161531
1532private:
Howard Hinnant9fd9f842013-09-30 19:08:221533 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnantabb160e2013-07-05 18:06:001534 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
1535 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow1f508012015-04-07 05:21:381536 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1537 __value_type>::type __allocator_type;
Howard Hinnant3e519522010-05-11 19:42:161538
1539 typedef __hash_table<__value_type, __hasher,
1540 __key_equal, __allocator_type> __table;
1541
1542 __table __table_;
1543
Eric Fiselierfcd02212016-02-11 11:59:441544 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnant3e519522010-05-11 19:42:161545 typedef typename __table::__node_traits __node_traits;
1546 typedef typename __table::__node_allocator __node_allocator;
1547 typedef typename __table::__node __node;
Howard Hinnantc003db12011-11-29 18:15:501548 typedef __hash_map_node_destructor<__node_allocator> _Dp;
1549 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnant3e519522010-05-11 19:42:161550 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier75d0dcf2016-02-10 20:46:231551 static_assert((is_same<typename __node_traits::size_type,
1552 typename __alloc_traits::size_type>::value),
1553 "Allocator uses different size_type for different types");
Howard Hinnant3e519522010-05-11 19:42:161554public:
1555 typedef typename __alloc_traits::pointer pointer;
1556 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier75d0dcf2016-02-10 20:46:231557 typedef typename __table::size_type size_type;
1558 typedef typename __table::difference_type difference_type;
Howard Hinnant3e519522010-05-11 19:42:161559
1560 typedef __hash_map_iterator<typename __table::iterator> iterator;
1561 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1562 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1563 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1564
Howard Hinnant789847d2010-09-23 18:58:281565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241566 unordered_multimap()
1567 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnantb24c8022013-07-23 22:01:581568 {
1569#if _LIBCPP_DEBUG_LEVEL >= 2
1570 __get_db()->__insert_c(this);
1571#endif
1572 }
Howard Hinnant3e519522010-05-11 19:42:161573 explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1574 const key_equal& __eql = key_equal());
1575 unordered_multimap(size_type __n, const hasher& __hf,
1576 const key_equal& __eql,
1577 const allocator_type& __a);
1578 template <class _InputIterator>
1579 unordered_multimap(_InputIterator __first, _InputIterator __last);
1580 template <class _InputIterator>
1581 unordered_multimap(_InputIterator __first, _InputIterator __last,
1582 size_type __n, const hasher& __hf = hasher(),
1583 const key_equal& __eql = key_equal());
1584 template <class _InputIterator>
1585 unordered_multimap(_InputIterator __first, _InputIterator __last,
1586 size_type __n, const hasher& __hf,
1587 const key_equal& __eql,
1588 const allocator_type& __a);
Evgeniy Stepanovcd31b432016-04-22 01:04:551589 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161590 explicit unordered_multimap(const allocator_type& __a);
1591 unordered_multimap(const unordered_multimap& __u);
1592 unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
Howard Hinnant7609c9b2010-09-04 23:28:191593#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanovcd31b432016-04-22 01:04:551594 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241595 unordered_multimap(unordered_multimap&& __u)
1596 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:161597 unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
Howard Hinnant7609c9b2010-09-04 23:28:191598#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant54976f22011-08-12 21:56:021599#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant3e519522010-05-11 19:42:161600 unordered_multimap(initializer_list<value_type> __il);
1601 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1602 const hasher& __hf = hasher(),
1603 const key_equal& __eql = key_equal());
1604 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1605 const hasher& __hf, const key_equal& __eql,
1606 const allocator_type& __a);
Howard Hinnant54976f22011-08-12 21:56:021607#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow3cd37e62013-09-12 03:00:311608#if _LIBCPP_STD_VER > 11
1609 _LIBCPP_INLINE_VISIBILITY
1610 unordered_multimap(size_type __n, const allocator_type& __a)
1611 : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1612 _LIBCPP_INLINE_VISIBILITY
1613 unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1614 : unordered_multimap(__n, __hf, key_equal(), __a) {}
1615 template <class _InputIterator>
1616 _LIBCPP_INLINE_VISIBILITY
1617 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1618 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1619 template <class _InputIterator>
1620 _LIBCPP_INLINE_VISIBILITY
1621 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
1622 const allocator_type& __a)
1623 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1624 _LIBCPP_INLINE_VISIBILITY
1625 unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1626 : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1627 _LIBCPP_INLINE_VISIBILITY
1628 unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1629 const allocator_type& __a)
1630 : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1631#endif
Howard Hinnant3e519522010-05-11 19:42:161632 // ~unordered_multimap() = default;
Howard Hinnant5a336872011-07-01 19:24:361633 _LIBCPP_INLINE_VISIBILITY
1634 unordered_multimap& operator=(const unordered_multimap& __u)
1635 {
Marshall Clow2ee83722016-07-18 13:19:001636#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant5a336872011-07-01 19:24:361637 __table_ = __u.__table_;
Howard Hinnant307f8142013-06-22 15:21:291638#else
Marshall Clow74cf6ff2014-02-08 04:03:141639 if (this != &__u) {
1640 __table_.clear();
1641 __table_.hash_function() = __u.__table_.hash_function();
1642 __table_.key_eq() = __u.__table_.key_eq();
1643 __table_.max_load_factor() = __u.__table_.max_load_factor();
1644 __table_.__copy_assign_alloc(__u.__table_);
1645 insert(__u.begin(), __u.end());
1646 }
Howard Hinnant307f8142013-06-22 15:21:291647#endif
Howard Hinnant5a336872011-07-01 19:24:361648 return *this;
1649 }
Howard Hinnant7609c9b2010-09-04 23:28:191650#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Evgeniy Stepanovcd31b432016-04-22 01:04:551651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241652 unordered_multimap& operator=(unordered_multimap&& __u)
1653 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:161654#endif
Howard Hinnant54976f22011-08-12 21:56:021655#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Evgeniy Stepanovcd31b432016-04-22 01:04:551656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161657 unordered_multimap& operator=(initializer_list<value_type> __il);
Howard Hinnant54976f22011-08-12 21:56:021658#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant3e519522010-05-11 19:42:161659
Howard Hinnant789847d2010-09-23 18:58:281660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241661 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:161662 {return allocator_type(__table_.__node_alloc());}
1663
Howard Hinnant789847d2010-09-23 18:58:281664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241665 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnant789847d2010-09-23 18:58:281666 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241667 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnant789847d2010-09-23 18:58:281668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241669 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnant3e519522010-05-11 19:42:161670
Howard Hinnant789847d2010-09-23 18:58:281671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241672 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:281673 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241674 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:281675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241676 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:281677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241678 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:281679 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241680 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:281681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241682 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnant3e519522010-05-11 19:42:161683
Eric Fiselier7a9f5002016-04-18 01:40:451684 _LIBCPP_INLINE_VISIBILITY
1685 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1686
1687 _LIBCPP_INLINE_VISIBILITY
1688 iterator insert(const_iterator __p, const value_type& __x)
1689 {return __table_.__insert_multi(__p.__i_, __x);}
1690
1691 template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:551692 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier7a9f5002016-04-18 01:40:451693 void insert(_InputIterator __first, _InputIterator __last);
1694
1695#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1696 _LIBCPP_INLINE_VISIBILITY
1697 void insert(initializer_list<value_type> __il)
1698 {insert(__il.begin(), __il.end());}
1699#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1700
Eric Fiselierfcd02212016-02-11 11:59:441701#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier7a9f5002016-04-18 01:40:451702 _LIBCPP_INLINE_VISIBILITY
1703 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
1704
1705 _LIBCPP_INLINE_VISIBILITY
1706 iterator insert(const_iterator __p, value_type&& __x)
1707 {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
1708
1709 template <class _Pp,
1710 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1711 _LIBCPP_INLINE_VISIBILITY
1712 iterator insert(_Pp&& __x)
1713 {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
1714
1715 template <class _Pp,
1716 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1717 _LIBCPP_INLINE_VISIBILITY
1718 iterator insert(const_iterator __p, _Pp&& __x)
1719 {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
1720
Eric Fiselierfcd02212016-02-11 11:59:441721 template <class... _Args>
1722 iterator emplace(_Args&&... __args) {
1723 return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1724 }
Howard Hinnant7609c9b2010-09-04 23:28:191725
Howard Hinnant8b805c92012-05-25 22:04:211726 template <class... _Args>
Eric Fiselierfcd02212016-02-11 11:59:441727 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1728 return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1729 }
1730#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:161731
Howard Hinnant3e519522010-05-11 19:42:161732
Howard Hinnant789847d2010-09-23 18:58:281733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161734 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnant789847d2010-09-23 18:58:281735 _LIBCPP_INLINE_VISIBILITY
Marshall Clowec392962015-05-10 13:35:001736 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1737 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161738 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:281739 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161740 iterator erase(const_iterator __first, const_iterator __last)
1741 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnant789847d2010-09-23 18:58:281742 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241743 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnant3e519522010-05-11 19:42:161744
Howard Hinnant789847d2010-09-23 18:58:281745 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241746 void swap(unordered_multimap& __u)
1747 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1748 {__table_.swap(__u.__table_);}
Howard Hinnant3e519522010-05-11 19:42:161749
Howard Hinnant789847d2010-09-23 18:58:281750 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161751 hasher hash_function() const
1752 {return __table_.hash_function().hash_function();}
Howard Hinnant789847d2010-09-23 18:58:281753 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161754 key_equal key_eq() const
1755 {return __table_.key_eq().key_eq();}
1756
Howard Hinnant789847d2010-09-23 18:58:281757 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161758 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:281759 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161760 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:281761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161762 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:281763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161764 pair<iterator, iterator> equal_range(const key_type& __k)
1765 {return __table_.__equal_range_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:281766 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161767 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1768 {return __table_.__equal_range_multi(__k);}
1769
Howard Hinnant789847d2010-09-23 18:58:281770 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241771 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnant789847d2010-09-23 18:58:281772 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241773 size_type max_bucket_count() const _NOEXCEPT
1774 {return __table_.max_bucket_count();}
Howard Hinnant3e519522010-05-11 19:42:161775
Howard Hinnant789847d2010-09-23 18:58:281776 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161777 size_type bucket_size(size_type __n) const
1778 {return __table_.bucket_size(__n);}
Howard Hinnant789847d2010-09-23 18:58:281779 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161780 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1781
Howard Hinnant789847d2010-09-23 18:58:281782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161783 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281784 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161785 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnant789847d2010-09-23 18:58:281786 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161787 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281788 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161789 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnant789847d2010-09-23 18:58:281790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161791 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:281792 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161793 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1794
Howard Hinnant789847d2010-09-23 18:58:281795 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241796 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnant789847d2010-09-23 18:58:281797 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant37141072011-06-04 18:54:241798 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnant789847d2010-09-23 18:58:281799 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161800 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnant789847d2010-09-23 18:58:281801 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161802 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnant789847d2010-09-23 18:58:281803 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:161804 void reserve(size_type __n) {__table_.reserve(__n);}
1805
Howard Hinnantb24c8022013-07-23 22:01:581806#if _LIBCPP_DEBUG_LEVEL >= 2
1807
1808 bool __dereferenceable(const const_iterator* __i) const
1809 {return __table_.__dereferenceable(&__i->__i_);}
1810 bool __decrementable(const const_iterator* __i) const
1811 {return __table_.__decrementable(&__i->__i_);}
1812 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1813 {return __table_.__addable(&__i->__i_, __n);}
1814 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1815 {return __table_.__addable(&__i->__i_, __n);}
1816
1817#endif // _LIBCPP_DEBUG_LEVEL >= 2
1818
Eric Fiselierfcd02212016-02-11 11:59:441819
Howard Hinnant3e519522010-05-11 19:42:161820};
1821
1822template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1823unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1824 size_type __n, const hasher& __hf, const key_equal& __eql)
1825 : __table_(__hf, __eql)
1826{
Howard Hinnantb24c8022013-07-23 22:01:581827#if _LIBCPP_DEBUG_LEVEL >= 2
1828 __get_db()->__insert_c(this);
1829#endif
Howard Hinnant3e519522010-05-11 19:42:161830 __table_.rehash(__n);
1831}
1832
1833template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1834unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1835 size_type __n, const hasher& __hf, const key_equal& __eql,
1836 const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401837 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161838{
Howard Hinnantb24c8022013-07-23 22:01:581839#if _LIBCPP_DEBUG_LEVEL >= 2
1840 __get_db()->__insert_c(this);
1841#endif
Howard Hinnant3e519522010-05-11 19:42:161842 __table_.rehash(__n);
1843}
1844
1845template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1846template <class _InputIterator>
1847unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1848 _InputIterator __first, _InputIterator __last)
1849{
Howard Hinnantb24c8022013-07-23 22:01:581850#if _LIBCPP_DEBUG_LEVEL >= 2
1851 __get_db()->__insert_c(this);
1852#endif
Howard Hinnant3e519522010-05-11 19:42:161853 insert(__first, __last);
1854}
1855
1856template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1857template <class _InputIterator>
1858unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1859 _InputIterator __first, _InputIterator __last, size_type __n,
1860 const hasher& __hf, const key_equal& __eql)
1861 : __table_(__hf, __eql)
1862{
Howard Hinnantb24c8022013-07-23 22:01:581863#if _LIBCPP_DEBUG_LEVEL >= 2
1864 __get_db()->__insert_c(this);
1865#endif
Howard Hinnant3e519522010-05-11 19:42:161866 __table_.rehash(__n);
1867 insert(__first, __last);
1868}
1869
1870template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1871template <class _InputIterator>
1872unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1873 _InputIterator __first, _InputIterator __last, size_type __n,
1874 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401875 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161876{
Howard Hinnantb24c8022013-07-23 22:01:581877#if _LIBCPP_DEBUG_LEVEL >= 2
1878 __get_db()->__insert_c(this);
1879#endif
Howard Hinnant3e519522010-05-11 19:42:161880 __table_.rehash(__n);
1881 insert(__first, __last);
1882}
1883
Howard Hinnant3e519522010-05-11 19:42:161884template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551885inline
Howard Hinnant3e519522010-05-11 19:42:161886unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1887 const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401888 : __table_(typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161889{
Howard Hinnantb24c8022013-07-23 22:01:581890#if _LIBCPP_DEBUG_LEVEL >= 2
1891 __get_db()->__insert_c(this);
1892#endif
Howard Hinnant3e519522010-05-11 19:42:161893}
1894
1895template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1896unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1897 const unordered_multimap& __u)
1898 : __table_(__u.__table_)
1899{
Howard Hinnantb24c8022013-07-23 22:01:581900#if _LIBCPP_DEBUG_LEVEL >= 2
1901 __get_db()->__insert_c(this);
1902#endif
Howard Hinnant3e519522010-05-11 19:42:161903 __table_.rehash(__u.bucket_count());
1904 insert(__u.begin(), __u.end());
1905}
1906
1907template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1908unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1909 const unordered_multimap& __u, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401910 : __table_(__u.__table_, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161911{
Howard Hinnantb24c8022013-07-23 22:01:581912#if _LIBCPP_DEBUG_LEVEL >= 2
1913 __get_db()->__insert_c(this);
1914#endif
Howard Hinnant3e519522010-05-11 19:42:161915 __table_.rehash(__u.bucket_count());
1916 insert(__u.begin(), __u.end());
1917}
1918
Howard Hinnant7609c9b2010-09-04 23:28:191919#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161920
1921template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:551922inline
Howard Hinnant3e519522010-05-11 19:42:161923unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1924 unordered_multimap&& __u)
Howard Hinnant37141072011-06-04 18:54:241925 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnantce48a112011-06-30 21:18:191926 : __table_(_VSTD::move(__u.__table_))
Howard Hinnant3e519522010-05-11 19:42:161927{
Howard Hinnantb24c8022013-07-23 22:01:581928#if _LIBCPP_DEBUG_LEVEL >= 2
1929 __get_db()->__insert_c(this);
Howard Hinnant4c80bfb2013-07-30 21:04:421930 __get_db()->swap(this, &__u);
Howard Hinnantb24c8022013-07-23 22:01:581931#endif
Howard Hinnant3e519522010-05-11 19:42:161932}
1933
1934template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1935unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1936 unordered_multimap&& __u, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401937 : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161938{
Howard Hinnantb24c8022013-07-23 22:01:581939#if _LIBCPP_DEBUG_LEVEL >= 2
1940 __get_db()->__insert_c(this);
1941#endif
Howard Hinnant3e519522010-05-11 19:42:161942 if (__a != __u.get_allocator())
1943 {
1944 iterator __i = __u.begin();
1945 while (__u.size() != 0)
Howard Hinnantb24c8022013-07-23 22:01:581946 {
Howard Hinnant3e519522010-05-11 19:42:161947 __table_.__insert_multi(
Eric Fiselierfcd02212016-02-11 11:59:441948 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_.__nc)
Howard Hinnant3e519522010-05-11 19:42:161949 );
Howard Hinnantb24c8022013-07-23 22:01:581950 }
Howard Hinnant3e519522010-05-11 19:42:161951 }
Howard Hinnant4c80bfb2013-07-30 21:04:421952#if _LIBCPP_DEBUG_LEVEL >= 2
1953 else
1954 __get_db()->swap(this, &__u);
1955#endif
Howard Hinnant3e519522010-05-11 19:42:161956}
1957
Howard Hinnant7609c9b2010-09-04 23:28:191958#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:161959
Howard Hinnant54976f22011-08-12 21:56:021960#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1961
Howard Hinnant3e519522010-05-11 19:42:161962template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1963unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1964 initializer_list<value_type> __il)
1965{
Howard Hinnantb24c8022013-07-23 22:01:581966#if _LIBCPP_DEBUG_LEVEL >= 2
1967 __get_db()->__insert_c(this);
1968#endif
Howard Hinnant3e519522010-05-11 19:42:161969 insert(__il.begin(), __il.end());
1970}
1971
1972template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1973unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1974 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1975 const key_equal& __eql)
1976 : __table_(__hf, __eql)
1977{
Howard Hinnantb24c8022013-07-23 22:01:581978#if _LIBCPP_DEBUG_LEVEL >= 2
1979 __get_db()->__insert_c(this);
1980#endif
Howard Hinnant3e519522010-05-11 19:42:161981 __table_.rehash(__n);
1982 insert(__il.begin(), __il.end());
1983}
1984
1985template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1986unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1987 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1988 const key_equal& __eql, const allocator_type& __a)
Marshall Clow2a10c962016-08-17 05:58:401989 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnant3e519522010-05-11 19:42:161990{
Howard Hinnantb24c8022013-07-23 22:01:581991#if _LIBCPP_DEBUG_LEVEL >= 2
1992 __get_db()->__insert_c(this);
1993#endif
Howard Hinnant3e519522010-05-11 19:42:161994 __table_.rehash(__n);
1995 insert(__il.begin(), __il.end());
1996}
1997
Howard Hinnant54976f22011-08-12 21:56:021998#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1999
Howard Hinnant7609c9b2010-09-04 23:28:192000#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:162001
2002template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:552003inline
Howard Hinnant3e519522010-05-11 19:42:162004unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2005unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
Howard Hinnant37141072011-06-04 18:54:242006 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnant3e519522010-05-11 19:42:162007{
Howard Hinnantce48a112011-06-30 21:18:192008 __table_ = _VSTD::move(__u.__table_);
Howard Hinnant3e519522010-05-11 19:42:162009 return *this;
2010}
2011
Howard Hinnant7609c9b2010-09-04 23:28:192012#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant3e519522010-05-11 19:42:162013
Howard Hinnant54976f22011-08-12 21:56:022014#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2015
Howard Hinnant3e519522010-05-11 19:42:162016template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:552017inline
Howard Hinnant3e519522010-05-11 19:42:162018unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2019unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
2020 initializer_list<value_type> __il)
2021{
2022 __table_.__assign_multi(__il.begin(), __il.end());
2023 return *this;
2024}
2025
Howard Hinnant54976f22011-08-12 21:56:022026#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2027
Howard Hinnant3e519522010-05-11 19:42:162028
Howard Hinnant3e519522010-05-11 19:42:162029
2030template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2031template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:552032inline
Howard Hinnant3e519522010-05-11 19:42:162033void
2034unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
2035 _InputIterator __last)
2036{
2037 for (; __first != __last; ++__first)
2038 __table_.__insert_multi(*__first);
2039}
2040
2041template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:282042inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:162043void
2044swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2045 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant37141072011-06-04 18:54:242046 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnant3e519522010-05-11 19:42:162047{
2048 __x.swap(__y);
2049}
2050
2051template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2052bool
2053operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2054 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2055{
2056 if (__x.size() != __y.size())
2057 return false;
2058 typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2059 const_iterator;
2060 typedef pair<const_iterator, const_iterator> _EqRng;
2061 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2062 {
2063 _EqRng __xeq = __x.equal_range(__i->first);
2064 _EqRng __yeq = __y.equal_range(__i->first);
Howard Hinnantce48a112011-06-30 21:18:192065 if (_VSTD::distance(__xeq.first, __xeq.second) !=
2066 _VSTD::distance(__yeq.first, __yeq.second) ||
2067 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnant3e519522010-05-11 19:42:162068 return false;
2069 __i = __xeq.second;
2070 }
2071 return true;
2072}
2073
2074template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:282075inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:162076bool
2077operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2078 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2079{
2080 return !(__x == __y);
2081}
2082
2083_LIBCPP_END_NAMESPACE_STD
2084
2085#endif // _LIBCPP_UNORDERED_MAP