blob: cf70ab62f69ed920b76347621e9e0ed4e98dff64 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===-------------------------- unordered_map -----------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-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 Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Clow6dff6182013-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 Hinnantbc8d3f92010-05-11 19:42:1688 ~unordered_map();
89 unordered_map& operator=(const unordered_map&);
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-05-11 19:42:1696 unordered_map& operator=(initializer_list<value_type>);
97
Howard Hinnant5f2f14c2011-06-04 18:54:2498 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1699
Howard Hinnant5f2f14c2011-06-04 18:54:24100 bool empty() const noexcept;
101 size_type size() const noexcept;
102 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16103
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Clow0ce05a92015-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 Hinnantbc8d3f92010-05-11 19:42:16142 iterator erase(const_iterator position);
Marshall Clow488025c2015-05-10 13:35:00143 iterator erase(iterator position); // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16144 size_type erase(const key_type& k);
145 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant5f2f14c2011-06-04 18:54:24146 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16147
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24170 size_type bucket_count() const noexcept;
171 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24183 float load_factor() const noexcept;
184 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24192 unordered_map<Key, T, Hash, Pred, Alloc>& y)
193 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Clow6dff6182013-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 Hinnantbc8d3f92010-05-11 19:42:16270 ~unordered_multimap();
271 unordered_multimap& operator=(const unordered_multimap&);
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-05-11 19:42:16278 unordered_multimap& operator=(initializer_list<value_type>);
279
Howard Hinnant5f2f14c2011-06-04 18:54:24280 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16281
Howard Hinnant5f2f14c2011-06-04 18:54:24282 bool empty() const noexcept;
283 size_type size() const noexcept;
284 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16285
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Clow488025c2015-05-10 13:35:00308 iterator erase(iterator position); // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16309 size_type erase(const key_type& k);
310 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant5f2f14c2011-06-04 18:54:24311 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16312
Howard Hinnant5f2f14c2011-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 Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24329 size_type bucket_count() const noexcept;
330 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24342 float load_factor() const noexcept;
343 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-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 Hinnant5f2f14c2011-06-04 18:54:24351 unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
352 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-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>
372
Eric Fiselierb9536102014-08-10 23:53:08373#include <__debug>
374
Howard Hinnant08e17472011-10-17 20:05:10375#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16376#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10377#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16378
379_LIBCPP_BEGIN_NAMESPACE_STD
380
Eric Fiselier3a0e4302015-06-13 07:08:02381template <class _Key, class _Cp, class _Hash,
382 bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
Howard Hinnantd4cf2152011-12-11 20:31:33383 >
Howard Hinnantbc8d3f92010-05-11 19:42:16384class __unordered_map_hasher
385 : private _Hash
386{
387public:
Howard Hinnantee6ccd02010-09-23 18:58:28388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24389 __unordered_map_hasher()
390 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
391 : _Hash() {}
Howard Hinnantee6ccd02010-09-23 18:58:28392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24393 __unordered_map_hasher(const _Hash& __h)
394 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
395 : _Hash(__h) {}
Howard Hinnantee6ccd02010-09-23 18:58:28396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24397 const _Hash& hash_function() const _NOEXCEPT {return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28398 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24399 size_t operator()(const _Cp& __x) const
Howard Hinnant9b128e02013-07-05 18:06:00400 {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24401 _LIBCPP_INLINE_VISIBILITY
402 size_t operator()(const _Key& __x) const
Howard Hinnantbc8d3f92010-05-11 19:42:16403 {return static_cast<const _Hash&>(*this)(__x);}
Marshall Clow7d914d12015-07-13 20:04:56404 void swap(__unordered_map_hasher&__y)
405 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
406 {
407 using _VSTD::swap;
408 swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y));
409 }
Howard Hinnantbc8d3f92010-05-11 19:42:16410};
411
Howard Hinnant9b128e02013-07-05 18:06:00412template <class _Key, class _Cp, class _Hash>
413class __unordered_map_hasher<_Key, _Cp, _Hash, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16414{
415 _Hash __hash_;
Howard Hinnantf8880d02011-12-12 17:26:24416
Howard Hinnantbc8d3f92010-05-11 19:42:16417public:
Howard Hinnantee6ccd02010-09-23 18:58:28418 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24419 __unordered_map_hasher()
420 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
421 : __hash_() {}
Howard Hinnantee6ccd02010-09-23 18:58:28422 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24423 __unordered_map_hasher(const _Hash& __h)
424 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
425 : __hash_(__h) {}
Howard Hinnantee6ccd02010-09-23 18:58:28426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24427 const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
Howard Hinnantee6ccd02010-09-23 18:58:28428 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24429 size_t operator()(const _Cp& __x) const
Howard Hinnant9b128e02013-07-05 18:06:00430 {return __hash_(__x.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24431 _LIBCPP_INLINE_VISIBILITY
432 size_t operator()(const _Key& __x) const
Howard Hinnantbc8d3f92010-05-11 19:42:16433 {return __hash_(__x);}
Marshall Clow7d914d12015-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 Hinnantbc8d3f92010-05-11 19:42:16440};
441
Marshall Clow7d914d12015-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 Fiselier3a0e4302015-06-13 07:08:02452template <class _Key, class _Cp, class _Pred,
453 bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value
Howard Hinnantd4cf2152011-12-11 20:31:33454 >
Howard Hinnantbc8d3f92010-05-11 19:42:16455class __unordered_map_equal
456 : private _Pred
457{
458public:
Howard Hinnantee6ccd02010-09-23 18:58:28459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24460 __unordered_map_equal()
461 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
462 : _Pred() {}
Howard Hinnantee6ccd02010-09-23 18:58:28463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24464 __unordered_map_equal(const _Pred& __p)
465 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
466 : _Pred(__p) {}
Howard Hinnantee6ccd02010-09-23 18:58:28467 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24468 const _Pred& key_eq() const _NOEXCEPT {return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28469 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24470 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00471 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24472 _LIBCPP_INLINE_VISIBILITY
473 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00474 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
Howard Hinnantf8880d02011-12-12 17:26:24475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24476 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00477 {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
Marshall Clow7d914d12015-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 Hinnantbc8d3f92010-05-11 19:42:16484};
485
Howard Hinnant9b128e02013-07-05 18:06:00486template <class _Key, class _Cp, class _Pred>
487class __unordered_map_equal<_Key, _Cp, _Pred, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16488{
489 _Pred __pred_;
Howard Hinnantf8880d02011-12-12 17:26:24490
Howard Hinnantbc8d3f92010-05-11 19:42:16491public:
Howard Hinnantee6ccd02010-09-23 18:58:28492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24493 __unordered_map_equal()
494 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
495 : __pred_() {}
Howard Hinnantee6ccd02010-09-23 18:58:28496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24497 __unordered_map_equal(const _Pred& __p)
498 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
499 : __pred_(__p) {}
Howard Hinnantee6ccd02010-09-23 18:58:28500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24501 const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
Howard Hinnantee6ccd02010-09-23 18:58:28502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24503 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00504 {return __pred_(__x.__cc.first, __y.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24505 _LIBCPP_INLINE_VISIBILITY
506 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00507 {return __pred_(__x.__cc.first, __y);}
Howard Hinnantf8880d02011-12-12 17:26:24508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24509 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00510 {return __pred_(__x, __y.__cc.first);}
Marshall Clow7d914d12015-07-13 20:04:56511 void swap(__unordered_map_equal&__y)
512 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
513 {
514 using _VSTD::swap;
515 swap(__pred_, __y.__pred_);
516 }
Howard Hinnantbc8d3f92010-05-11 19:42:16517};
518
Marshall Clow7d914d12015-07-13 20:04:56519template <class _Key, class _Cp, class _Pred, bool __b>
520inline _LIBCPP_INLINE_VISIBILITY
521void
522swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
523 __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
524 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
525{
526 __x.swap(__y);
527}
528
Howard Hinnantbc8d3f92010-05-11 19:42:16529template <class _Alloc>
530class __hash_map_node_destructor
531{
532 typedef _Alloc allocator_type;
533 typedef allocator_traits<allocator_type> __alloc_traits;
534 typedef typename __alloc_traits::value_type::value_type value_type;
535public:
536 typedef typename __alloc_traits::pointer pointer;
537private:
Howard Hinnant7a6b7ce2013-06-22 15:21:29538 typedef typename value_type::value_type::first_type first_type;
539 typedef typename value_type::value_type::second_type second_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16540
541 allocator_type& __na_;
542
543 __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
544
545public:
546 bool __first_constructed;
547 bool __second_constructed;
548
Howard Hinnantee6ccd02010-09-23 18:58:28549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24550 explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16551 : __na_(__na),
552 __first_constructed(false),
553 __second_constructed(false)
554 {}
555
Howard Hinnant73d21a42010-09-04 23:28:19556#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28557 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16558 __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
Howard Hinnant5f2f14c2011-06-04 18:54:24559 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16560 : __na_(__x.__na_),
561 __first_constructed(__x.__value_constructed),
562 __second_constructed(__x.__value_constructed)
563 {
564 __x.__value_constructed = false;
565 }
Howard Hinnant73d21a42010-09-04 23:28:19566#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16568 __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
569 : __na_(__x.__na_),
570 __first_constructed(__x.__value_constructed),
571 __second_constructed(__x.__value_constructed)
572 {
573 const_cast<bool&>(__x.__value_constructed) = false;
574 }
Howard Hinnant73d21a42010-09-04 23:28:19575#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16576
Howard Hinnantee6ccd02010-09-23 18:58:28577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24578 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16579 {
580 if (__second_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29581 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
Howard Hinnantbc8d3f92010-05-11 19:42:16582 if (__first_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29583 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
Howard Hinnantbc8d3f92010-05-11 19:42:16584 if (__p)
585 __alloc_traits::deallocate(__na_, __p, 1);
586 }
587};
588
Howard Hinnantff7546e2013-09-30 19:08:22589#if __cplusplus >= 201103L
590
591template <class _Key, class _Tp>
592union __hash_value_type
593{
594 typedef _Key key_type;
595 typedef _Tp mapped_type;
596 typedef pair<const key_type, mapped_type> value_type;
597 typedef pair<key_type, mapped_type> __nc_value_type;
598
599 value_type __cc;
600 __nc_value_type __nc;
601
602 template <class ..._Args>
603 _LIBCPP_INLINE_VISIBILITY
604 __hash_value_type(_Args&& ...__args)
605 : __cc(std::forward<_Args>(__args)...) {}
606
607 _LIBCPP_INLINE_VISIBILITY
608 __hash_value_type(const __hash_value_type& __v)
609 : __cc(__v.__cc) {}
610
611 _LIBCPP_INLINE_VISIBILITY
612 __hash_value_type(__hash_value_type&& __v)
Marshall Clowcd137822015-05-06 12:11:22613 : __nc(_VSTD::move(__v.__nc)) {}
Howard Hinnantff7546e2013-09-30 19:08:22614
615 _LIBCPP_INLINE_VISIBILITY
616 __hash_value_type& operator=(const __hash_value_type& __v)
617 {__nc = __v.__cc; return *this;}
618
619 _LIBCPP_INLINE_VISIBILITY
620 __hash_value_type& operator=(__hash_value_type&& __v)
Marshall Clowcd137822015-05-06 12:11:22621 {__nc = _VSTD::move(__v.__nc); return *this;}
Howard Hinnantff7546e2013-09-30 19:08:22622
623 _LIBCPP_INLINE_VISIBILITY
624 ~__hash_value_type() {__cc.~value_type();}
625};
626
627#else
628
629template <class _Key, class _Tp>
630struct __hash_value_type
631{
632 typedef _Key key_type;
633 typedef _Tp mapped_type;
634 typedef pair<const key_type, mapped_type> value_type;
635
636 value_type __cc;
637
638 _LIBCPP_INLINE_VISIBILITY
639 __hash_value_type() {}
640
641 template <class _A0>
642 _LIBCPP_INLINE_VISIBILITY
643 __hash_value_type(const _A0& __a0)
644 : __cc(__a0) {}
645
646 template <class _A0, class _A1>
647 _LIBCPP_INLINE_VISIBILITY
648 __hash_value_type(const _A0& __a0, const _A1& __a1)
649 : __cc(__a0, __a1) {}
650};
651
652#endif
653
Howard Hinnantbc8d3f92010-05-11 19:42:16654template <class _HashIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34655class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16656{
657 _HashIterator __i_;
658
659 typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
Howard Hinnant7a6b7ce2013-06-22 15:21:29660 typedef const typename _HashIterator::value_type::value_type::first_type key_type;
661 typedef typename _HashIterator::value_type::value_type::second_type mapped_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16662public:
663 typedef forward_iterator_tag iterator_category;
664 typedef pair<key_type, mapped_type> value_type;
665 typedef typename _HashIterator::difference_type difference_type;
666 typedef value_type& reference;
667 typedef typename __pointer_traits::template
668#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
669 rebind<value_type>
670#else
671 rebind<value_type>::other
672#endif
673 pointer;
674
Howard Hinnantee6ccd02010-09-23 18:58:28675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24676 __hash_map_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16677
Howard Hinnantee6ccd02010-09-23 18:58:28678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24679 __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16680
Howard Hinnantee6ccd02010-09-23 18:58:28681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29682 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28683 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29684 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16685
Howard Hinnantee6ccd02010-09-23 18:58:28686 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16687 __hash_map_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16689 __hash_map_iterator operator++(int)
690 {
691 __hash_map_iterator __t(*this);
692 ++(*this);
693 return __t;
694 }
695
Howard Hinnantee6ccd02010-09-23 18:58:28696 friend _LIBCPP_INLINE_VISIBILITY
697 bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16698 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28699 friend _LIBCPP_INLINE_VISIBILITY
700 bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16701 {return __x.__i_ != __y.__i_;}
702
Howard Hinnant0f678bd2013-08-12 18:38:34703 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
704 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
705 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
706 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
707 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16708};
709
710template <class _HashIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34711class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16712{
713 _HashIterator __i_;
714
715 typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
Howard Hinnant7a6b7ce2013-06-22 15:21:29716 typedef const typename _HashIterator::value_type::value_type::first_type key_type;
717 typedef typename _HashIterator::value_type::value_type::second_type mapped_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16718public:
719 typedef forward_iterator_tag iterator_category;
720 typedef pair<key_type, mapped_type> value_type;
721 typedef typename _HashIterator::difference_type difference_type;
722 typedef const value_type& reference;
723 typedef typename __pointer_traits::template
724#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
Howard Hinnant099084d2011-07-23 16:14:35725 rebind<const value_type>
Howard Hinnantbc8d3f92010-05-11 19:42:16726#else
Howard Hinnant099084d2011-07-23 16:14:35727 rebind<const value_type>::other
Howard Hinnantbc8d3f92010-05-11 19:42:16728#endif
729 pointer;
730
Howard Hinnantee6ccd02010-09-23 18:58:28731 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24732 __hash_map_const_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16733
Howard Hinnantee6ccd02010-09-23 18:58:28734 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24735 __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantee6ccd02010-09-23 18:58:28736 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16737 __hash_map_const_iterator(
738 __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
Howard Hinnant5f2f14c2011-06-04 18:54:24739 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16740 : __i_(__i.__i_) {}
741
Howard Hinnantee6ccd02010-09-23 18:58:28742 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29743 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28744 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29745 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16746
Howard Hinnantee6ccd02010-09-23 18:58:28747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16748 __hash_map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28749 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16750 __hash_map_const_iterator operator++(int)
751 {
752 __hash_map_const_iterator __t(*this);
753 ++(*this);
754 return __t;
755 }
756
Howard Hinnantee6ccd02010-09-23 18:58:28757 friend _LIBCPP_INLINE_VISIBILITY
758 bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16759 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28760 friend _LIBCPP_INLINE_VISIBILITY
761 bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16762 {return __x.__i_ != __y.__i_;}
763
Howard Hinnant0f678bd2013-08-12 18:38:34764 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
765 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
766 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
767 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16768};
769
770template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
771 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnant0f678bd2013-08-12 18:38:34772class _LIBCPP_TYPE_VIS_ONLY unordered_map
Howard Hinnantbc8d3f92010-05-11 19:42:16773{
774public:
775 // types
776 typedef _Key key_type;
777 typedef _Tp mapped_type;
778 typedef _Hash hasher;
779 typedef _Pred key_equal;
780 typedef _Alloc allocator_type;
781 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:29782 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16783 typedef value_type& reference;
784 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:58785 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
786 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16787
788private:
Howard Hinnantff7546e2013-09-30 19:08:22789 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:00790 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
791 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:38792 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
793 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16794
795 typedef __hash_table<__value_type, __hasher,
796 __key_equal, __allocator_type> __table;
797
798 __table __table_;
799
800 typedef typename __table::__node_pointer __node_pointer;
801 typedef typename __table::__node_const_pointer __node_const_pointer;
802 typedef typename __table::__node_traits __node_traits;
803 typedef typename __table::__node_allocator __node_allocator;
804 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:50805 typedef __hash_map_node_destructor<__node_allocator> _Dp;
806 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:16807 typedef allocator_traits<allocator_type> __alloc_traits;
808public:
809 typedef typename __alloc_traits::pointer pointer;
810 typedef typename __alloc_traits::const_pointer const_pointer;
811 typedef typename __alloc_traits::size_type size_type;
812 typedef typename __alloc_traits::difference_type difference_type;
813
814 typedef __hash_map_iterator<typename __table::iterator> iterator;
815 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
816 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
817 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
818
Howard Hinnantee6ccd02010-09-23 18:58:28819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24820 unordered_map()
821 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58822 {
823#if _LIBCPP_DEBUG_LEVEL >= 2
824 __get_db()->__insert_c(this);
825#endif
826 }
Howard Hinnantbc8d3f92010-05-11 19:42:16827 explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
828 const key_equal& __eql = key_equal());
829 unordered_map(size_type __n, const hasher& __hf,
830 const key_equal& __eql,
831 const allocator_type& __a);
832 template <class _InputIterator>
833 unordered_map(_InputIterator __first, _InputIterator __last);
834 template <class _InputIterator>
835 unordered_map(_InputIterator __first, _InputIterator __last,
836 size_type __n, const hasher& __hf = hasher(),
837 const key_equal& __eql = key_equal());
838 template <class _InputIterator>
839 unordered_map(_InputIterator __first, _InputIterator __last,
840 size_type __n, const hasher& __hf,
841 const key_equal& __eql,
842 const allocator_type& __a);
843 explicit unordered_map(const allocator_type& __a);
844 unordered_map(const unordered_map& __u);
845 unordered_map(const unordered_map& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19846#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:24847 unordered_map(unordered_map&& __u)
848 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16849 unordered_map(unordered_map&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19850#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02851#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16852 unordered_map(initializer_list<value_type> __il);
853 unordered_map(initializer_list<value_type> __il, size_type __n,
854 const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
855 unordered_map(initializer_list<value_type> __il, size_type __n,
856 const hasher& __hf, const key_equal& __eql,
857 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02858#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow6dff6182013-09-12 03:00:31859#if _LIBCPP_STD_VER > 11
860 _LIBCPP_INLINE_VISIBILITY
861 unordered_map(size_type __n, const allocator_type& __a)
862 : unordered_map(__n, hasher(), key_equal(), __a) {}
863 _LIBCPP_INLINE_VISIBILITY
864 unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
865 : unordered_map(__n, __hf, key_equal(), __a) {}
866 template <class _InputIterator>
867 _LIBCPP_INLINE_VISIBILITY
868 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
869 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
870 template <class _InputIterator>
871 _LIBCPP_INLINE_VISIBILITY
872 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
873 const allocator_type& __a)
874 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
875 _LIBCPP_INLINE_VISIBILITY
876 unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
877 : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
878 _LIBCPP_INLINE_VISIBILITY
879 unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
880 const allocator_type& __a)
881 : unordered_map(__il, __n, __hf, key_equal(), __a) {}
882#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16883 // ~unordered_map() = default;
Howard Hinnant61aa6012011-07-01 19:24:36884 _LIBCPP_INLINE_VISIBILITY
885 unordered_map& operator=(const unordered_map& __u)
886 {
Howard Hinnant7a6b7ce2013-06-22 15:21:29887#if __cplusplus >= 201103L
Howard Hinnant61aa6012011-07-01 19:24:36888 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:29889#else
Marshall Clowebfc50e2014-02-08 04:03:14890 if (this != &__u) {
891 __table_.clear();
892 __table_.hash_function() = __u.__table_.hash_function();
893 __table_.key_eq() = __u.__table_.key_eq();
894 __table_.max_load_factor() = __u.__table_.max_load_factor();
895 __table_.__copy_assign_alloc(__u.__table_);
896 insert(__u.begin(), __u.end());
897 }
Howard Hinnant7a6b7ce2013-06-22 15:21:29898#endif
Howard Hinnant61aa6012011-07-01 19:24:36899 return *this;
900 }
Howard Hinnant73d21a42010-09-04 23:28:19901#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:24902 unordered_map& operator=(unordered_map&& __u)
903 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16904#endif
Howard Hinnante3e32912011-08-12 21:56:02905#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16906 unordered_map& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02907#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16908
Howard Hinnantee6ccd02010-09-23 18:58:28909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24910 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16911 {return allocator_type(__table_.__node_alloc());}
912
Howard Hinnantee6ccd02010-09-23 18:58:28913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24914 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24916 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28917 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24918 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16919
Howard Hinnantee6ccd02010-09-23 18:58:28920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24921 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24923 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28924 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24925 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28926 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24927 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28928 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24929 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28930 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24931 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16932
Howard Hinnant73d21a42010-09-04 23:28:19933#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant73d21a42010-09-04 23:28:19934#ifndef _LIBCPP_HAS_NO_VARIADICS
935
Howard Hinnant635ce1d2012-05-25 22:04:21936 template <class... _Args>
937 pair<iterator, bool> emplace(_Args&&... __args);
Howard Hinnantbc8d3f92010-05-11 19:42:16938
Howard Hinnant635ce1d2012-05-25 22:04:21939 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf890d9b2013-07-30 21:04:42941#if _LIBCPP_DEBUG_LEVEL >= 2
942 iterator emplace_hint(const_iterator __p, _Args&&... __args)
943 {
944 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
945 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
946 " referring to this unordered_map");
947 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
948 }
949#else
Howard Hinnant635ce1d2012-05-25 22:04:21950 iterator emplace_hint(const_iterator, _Args&&... __args)
951 {return emplace(_VSTD::forward<_Args>(__args)...).first;}
Howard Hinnantf890d9b2013-07-30 21:04:42952#endif
Howard Hinnant73d21a42010-09-04 23:28:19953#endif // _LIBCPP_HAS_NO_VARIADICS
954#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16956 pair<iterator, bool> insert(const value_type& __x)
957 {return __table_.__insert_unique(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19958#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:50959 template <class _Pp,
960 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:28961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50962 pair<iterator, bool> insert(_Pp&& __x)
963 {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19964#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf890d9b2013-07-30 21:04:42966#if _LIBCPP_DEBUG_LEVEL >= 2
967 iterator insert(const_iterator __p, const value_type& __x)
968 {
969 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
970 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
971 " referring to this unordered_map");
972 return insert(__x).first;
973 }
974#else
Howard Hinnantbc8d3f92010-05-11 19:42:16975 iterator insert(const_iterator, const value_type& __x)
976 {return insert(__x).first;}
Howard Hinnantf890d9b2013-07-30 21:04:42977#endif
Howard Hinnant73d21a42010-09-04 23:28:19978#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:50979 template <class _Pp,
980 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:28981 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf890d9b2013-07-30 21:04:42982#if _LIBCPP_DEBUG_LEVEL >= 2
983 iterator insert(const_iterator __p, _Pp&& __x)
984 {
985 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
986 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
987 " referring to this unordered_map");
988 return insert(_VSTD::forward<_Pp>(__x)).first;
989 }
990#else
Howard Hinnant99968442011-11-29 18:15:50991 iterator insert(const_iterator, _Pp&& __x)
992 {return insert(_VSTD::forward<_Pp>(__x)).first;}
Howard Hinnantf890d9b2013-07-30 21:04:42993#endif
Howard Hinnant73d21a42010-09-04 23:28:19994#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16995 template <class _InputIterator>
996 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02997#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16999 void insert(initializer_list<value_type> __il)
1000 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021001#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161002
Marshall Clow0ce05a92015-07-07 05:45:351003#if _LIBCPP_STD_VER > 14
1004#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1005#ifndef _LIBCPP_HAS_NO_VARIADICS
1006 template <class... _Args>
1007 _LIBCPP_INLINE_VISIBILITY
1008 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1009 {
1010 iterator __p = __table_.find(__k);
1011 if ( __p != end())
1012 return _VSTD::make_pair(__p, false);
1013 else
1014 return _VSTD::make_pair(
1015 emplace_hint(__p,
1016 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
1017 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
1018 true);
1019 }
1020
1021 template <class... _Args>
1022 _LIBCPP_INLINE_VISIBILITY
1023 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1024 {
1025 iterator __p = __table_.find(__k);
1026 if ( __p != end())
1027 return _VSTD::make_pair(__p, false);
1028 else
1029 return _VSTD::make_pair(
1030 emplace_hint(__p,
1031 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1032 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
1033 true);
1034 }
1035
1036 template <class... _Args>
1037 _LIBCPP_INLINE_VISIBILITY
1038 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1039 {
1040 iterator __p = __table_.find(__k);
1041 if ( __p != end())
1042 return __p;
1043 else
1044 return emplace_hint(__h,
1045 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
1046 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1047 }
1048
1049 template <class... _Args>
1050 _LIBCPP_INLINE_VISIBILITY
1051 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1052 {
1053 iterator __p = __table_.find(__k);
1054 if ( __p != end())
1055 return __p;
1056 else
1057 return emplace_hint(__h,
1058 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1059 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1060 }
1061
1062 template <class _Vp>
1063 _LIBCPP_INLINE_VISIBILITY
1064 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1065 {
1066 iterator __p = __table_.find(__k);
1067 if ( __p != end())
1068 {
1069 __p->second = _VSTD::move(__v);
1070 return _VSTD::make_pair(__p, false);
1071 }
1072 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1073 }
1074
1075 template <class _Vp>
1076 _LIBCPP_INLINE_VISIBILITY
1077 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1078 {
1079 iterator __p = __table_.find(__k);
1080 if ( __p != end())
1081 {
1082 __p->second = _VSTD::move(__v);
1083 return _VSTD::make_pair(__p, false);
1084 }
1085 return _VSTD::make_pair(emplace_hint(__p, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v)), true);
1086 }
1087
1088 template <class _Vp>
1089 _LIBCPP_INLINE_VISIBILITY
1090 iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1091 {
1092 iterator __p = __table_.find(__k);
1093 if ( __p != end())
1094 {
1095 __p->second = _VSTD::move(__v);
1096 return __p;
1097 }
1098 return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1099 }
1100
1101 template <class _Vp>
1102 _LIBCPP_INLINE_VISIBILITY
1103 iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1104 {
1105 iterator __p = __table_.find(__k);
1106 if ( __p != end())
1107 {
1108 __p->second = _VSTD::move(__v);
1109 return __p;
1110 }
1111 return emplace_hint(__h, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v));
1112 }
1113#endif
1114#endif
1115#endif
1116
Howard Hinnantee6ccd02010-09-23 18:58:281117 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161118 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281119 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001120 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1121 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161122 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281123 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161124 iterator erase(const_iterator __first, const_iterator __last)
1125 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281126 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241127 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161128
Howard Hinnantee6ccd02010-09-23 18:58:281129 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241130 void swap(unordered_map& __u)
1131 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1132 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161133
Howard Hinnantee6ccd02010-09-23 18:58:281134 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161135 hasher hash_function() const
1136 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161138 key_equal key_eq() const
1139 {return __table_.key_eq().key_eq();}
1140
Howard Hinnantee6ccd02010-09-23 18:58:281141 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161142 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161144 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281145 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161146 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281147 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161148 pair<iterator, iterator> equal_range(const key_type& __k)
1149 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281150 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161151 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1152 {return __table_.__equal_range_unique(__k);}
1153
1154 mapped_type& operator[](const key_type& __k);
Howard Hinnant73d21a42010-09-04 23:28:191155#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161156 mapped_type& operator[](key_type&& __k);
1157#endif
1158
1159 mapped_type& at(const key_type& __k);
1160 const mapped_type& at(const key_type& __k) const;
1161
Howard Hinnantee6ccd02010-09-23 18:58:281162 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241163 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281164 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241165 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161166
Howard Hinnantee6ccd02010-09-23 18:58:281167 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161168 size_type bucket_size(size_type __n) const
1169 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281170 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161171 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1172
Howard Hinnantee6ccd02010-09-23 18:58:281173 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161174 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281175 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161176 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161178 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281179 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161180 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281181 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161182 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281183 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161184 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1185
Howard Hinnantee6ccd02010-09-23 18:58:281186 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241187 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281188 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241189 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161191 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281192 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161193 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281194 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161195 void reserve(size_type __n) {__table_.reserve(__n);}
1196
Howard Hinnant39213642013-07-23 22:01:581197#if _LIBCPP_DEBUG_LEVEL >= 2
1198
1199 bool __dereferenceable(const const_iterator* __i) const
1200 {return __table_.__dereferenceable(&__i->__i_);}
1201 bool __decrementable(const const_iterator* __i) const
1202 {return __table_.__decrementable(&__i->__i_);}
1203 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1204 {return __table_.__addable(&__i->__i_, __n);}
1205 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1206 {return __table_.__addable(&__i->__i_, __n);}
1207
1208#endif // _LIBCPP_DEBUG_LEVEL >= 2
1209
Howard Hinnantbc8d3f92010-05-11 19:42:161210private:
Howard Hinnant73d21a42010-09-04 23:28:191211#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant635ce1d2012-05-25 22:04:211212 __node_holder __construct_node();
1213 template <class _A0>
Howard Hinnantb66e1c32013-07-04 20:59:161214 __node_holder
Howard Hinnant635ce1d2012-05-25 22:04:211215 __construct_node(_A0&& __a0);
Howard Hinnantb66e1c32013-07-04 20:59:161216 __node_holder __construct_node_with_key(key_type&& __k);
Howard Hinnant73d21a42010-09-04 23:28:191217#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnant635ce1d2012-05-25 22:04:211218 template <class _A0, class _A1, class ..._Args>
1219 __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
Howard Hinnant73d21a42010-09-04 23:28:191220#endif // _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantb66e1c32013-07-04 20:59:161221#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1222 __node_holder __construct_node_with_key(const key_type& __k);
Howard Hinnantbc8d3f92010-05-11 19:42:161223};
1224
1225template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1226unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1227 size_type __n, const hasher& __hf, const key_equal& __eql)
1228 : __table_(__hf, __eql)
1229{
Howard Hinnant39213642013-07-23 22:01:581230#if _LIBCPP_DEBUG_LEVEL >= 2
1231 __get_db()->__insert_c(this);
1232#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161233 __table_.rehash(__n);
1234}
1235
1236template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1237unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1238 size_type __n, const hasher& __hf, const key_equal& __eql,
1239 const allocator_type& __a)
1240 : __table_(__hf, __eql, __a)
1241{
Howard Hinnant39213642013-07-23 22:01:581242#if _LIBCPP_DEBUG_LEVEL >= 2
1243 __get_db()->__insert_c(this);
1244#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161245 __table_.rehash(__n);
1246}
1247
1248template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281249inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161250unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1251 const allocator_type& __a)
1252 : __table_(__a)
1253{
Howard Hinnant39213642013-07-23 22:01:581254#if _LIBCPP_DEBUG_LEVEL >= 2
1255 __get_db()->__insert_c(this);
1256#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161257}
1258
1259template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1260template <class _InputIterator>
1261unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1262 _InputIterator __first, _InputIterator __last)
1263{
Howard Hinnant39213642013-07-23 22:01:581264#if _LIBCPP_DEBUG_LEVEL >= 2
1265 __get_db()->__insert_c(this);
1266#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161267 insert(__first, __last);
1268}
1269
1270template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1271template <class _InputIterator>
1272unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1273 _InputIterator __first, _InputIterator __last, size_type __n,
1274 const hasher& __hf, const key_equal& __eql)
1275 : __table_(__hf, __eql)
1276{
Howard Hinnant39213642013-07-23 22:01:581277#if _LIBCPP_DEBUG_LEVEL >= 2
1278 __get_db()->__insert_c(this);
1279#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161280 __table_.rehash(__n);
1281 insert(__first, __last);
1282}
1283
1284template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1285template <class _InputIterator>
1286unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1287 _InputIterator __first, _InputIterator __last, size_type __n,
1288 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1289 : __table_(__hf, __eql, __a)
1290{
Howard Hinnant39213642013-07-23 22:01:581291#if _LIBCPP_DEBUG_LEVEL >= 2
1292 __get_db()->__insert_c(this);
1293#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161294 __table_.rehash(__n);
1295 insert(__first, __last);
1296}
1297
1298template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1299unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1300 const unordered_map& __u)
1301 : __table_(__u.__table_)
1302{
Howard Hinnant39213642013-07-23 22:01:581303#if _LIBCPP_DEBUG_LEVEL >= 2
1304 __get_db()->__insert_c(this);
1305#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161306 __table_.rehash(__u.bucket_count());
1307 insert(__u.begin(), __u.end());
1308}
1309
1310template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1311unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1312 const unordered_map& __u, const allocator_type& __a)
1313 : __table_(__u.__table_, __a)
1314{
Howard Hinnant39213642013-07-23 22:01:581315#if _LIBCPP_DEBUG_LEVEL >= 2
1316 __get_db()->__insert_c(this);
1317#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161318 __table_.rehash(__u.bucket_count());
1319 insert(__u.begin(), __u.end());
1320}
1321
Howard Hinnant73d21a42010-09-04 23:28:191322#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161323
1324template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281325inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161326unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1327 unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241328 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191329 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161330{
Howard Hinnant39213642013-07-23 22:01:581331#if _LIBCPP_DEBUG_LEVEL >= 2
1332 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:421333 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:581334#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161335}
1336
1337template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1338unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1339 unordered_map&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:191340 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161341{
Howard Hinnant39213642013-07-23 22:01:581342#if _LIBCPP_DEBUG_LEVEL >= 2
1343 __get_db()->__insert_c(this);
1344#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161345 if (__a != __u.get_allocator())
1346 {
1347 iterator __i = __u.begin();
1348 while (__u.size() != 0)
1349 __table_.__insert_unique(
Howard Hinnant0949eed2011-06-30 21:18:191350 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
Howard Hinnantbc8d3f92010-05-11 19:42:161351 );
1352 }
Howard Hinnantf890d9b2013-07-30 21:04:421353#if _LIBCPP_DEBUG_LEVEL >= 2
1354 else
1355 __get_db()->swap(this, &__u);
1356#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161357}
1358
Howard Hinnant73d21a42010-09-04 23:28:191359#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161360
Howard Hinnante3e32912011-08-12 21:56:021361#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1362
Howard Hinnantbc8d3f92010-05-11 19:42:161363template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1364unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1365 initializer_list<value_type> __il)
1366{
Howard Hinnant39213642013-07-23 22:01:581367#if _LIBCPP_DEBUG_LEVEL >= 2
1368 __get_db()->__insert_c(this);
1369#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161370 insert(__il.begin(), __il.end());
1371}
1372
1373template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1374unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1375 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1376 const key_equal& __eql)
1377 : __table_(__hf, __eql)
1378{
Howard Hinnant39213642013-07-23 22:01:581379#if _LIBCPP_DEBUG_LEVEL >= 2
1380 __get_db()->__insert_c(this);
1381#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161382 __table_.rehash(__n);
1383 insert(__il.begin(), __il.end());
1384}
1385
1386template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1387unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1388 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1389 const key_equal& __eql, const allocator_type& __a)
1390 : __table_(__hf, __eql, __a)
1391{
Howard Hinnant39213642013-07-23 22:01:581392#if _LIBCPP_DEBUG_LEVEL >= 2
1393 __get_db()->__insert_c(this);
1394#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161395 __table_.rehash(__n);
1396 insert(__il.begin(), __il.end());
1397}
1398
Howard Hinnante3e32912011-08-12 21:56:021399#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1400
Howard Hinnant73d21a42010-09-04 23:28:191401#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161402
1403template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281404inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161405unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1406unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241407 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161408{
Howard Hinnant0949eed2011-06-30 21:18:191409 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161410 return *this;
1411}
1412
Howard Hinnant73d21a42010-09-04 23:28:191413#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161414
Howard Hinnante3e32912011-08-12 21:56:021415#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1416
Howard Hinnantbc8d3f92010-05-11 19:42:161417template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281418inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161419unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1420unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1421 initializer_list<value_type> __il)
1422{
1423 __table_.__assign_unique(__il.begin(), __il.end());
1424 return *this;
1425}
1426
Howard Hinnante3e32912011-08-12 21:56:021427#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1428
Howard Hinnant73d21a42010-09-04 23:28:191429#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161430
1431template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantbc8d3f92010-05-11 19:42:161432typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnant635ce1d2012-05-25 22:04:211433unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
Howard Hinnantbc8d3f92010-05-11 19:42:161434{
1435 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501436 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant635ce1d2012-05-25 22:04:211437 __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:161438 __h.get_deleter().__first_constructed = true;
Howard Hinnantbc8d3f92010-05-11 19:42:161439 __h.get_deleter().__second_constructed = true;
1440 return __h;
1441}
1442
1443template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant635ce1d2012-05-25 22:04:211444template <class _A0>
Howard Hinnantb66e1c32013-07-04 20:59:161445typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnantbc8d3f92010-05-11 19:42:161446unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
1447{
1448 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501449 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant0949eed2011-06-30 21:18:191450 __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1451 _VSTD::forward<_A0>(__a0));
Howard Hinnantbc8d3f92010-05-11 19:42:161452 __h.get_deleter().__first_constructed = true;
1453 __h.get_deleter().__second_constructed = true;
1454 return __h;
1455}
1456
Howard Hinnant635ce1d2012-05-25 22:04:211457template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantb66e1c32013-07-04 20:59:161458typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1459unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(key_type&& __k)
Howard Hinnant635ce1d2012-05-25 22:04:211460{
1461 __node_allocator& __na = __table_.__node_alloc();
1462 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnantb66e1c32013-07-04 20:59:161463 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
Howard Hinnant635ce1d2012-05-25 22:04:211464 __h.get_deleter().__first_constructed = true;
Howard Hinnant7a6b7ce2013-06-22 15:21:291465 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
Howard Hinnant635ce1d2012-05-25 22:04:211466 __h.get_deleter().__second_constructed = true;
Howard Hinnant9a894d92013-08-22 18:29:501467 return __h;
Howard Hinnant635ce1d2012-05-25 22:04:211468}
1469
Howard Hinnant73d21a42010-09-04 23:28:191470#ifndef _LIBCPP_HAS_NO_VARIADICS
1471
Howard Hinnantbc8d3f92010-05-11 19:42:161472template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant635ce1d2012-05-25 22:04:211473template <class _A0, class _A1, class ..._Args>
1474typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1475unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0,
1476 _A1&& __a1,
1477 _Args&&... __args)
Howard Hinnantbc8d3f92010-05-11 19:42:161478{
Howard Hinnant635ce1d2012-05-25 22:04:211479 __node_allocator& __na = __table_.__node_alloc();
1480 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1481 __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1482 _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
1483 _VSTD::forward<_Args>(__args)...);
1484 __h.get_deleter().__first_constructed = true;
1485 __h.get_deleter().__second_constructed = true;
1486 return __h;
1487}
1488
1489template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1490template <class... _Args>
1491pair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool>
1492unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
1493{
1494 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:161495 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1496 if (__r.second)
1497 __h.release();
1498 return __r;
1499}
1500
Howard Hinnant73d21a42010-09-04 23:28:191501#endif // _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantb66e1c32013-07-04 20:59:161502#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161503
1504template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1505typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnantb66e1c32013-07-04 20:59:161506unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
Howard Hinnantbc8d3f92010-05-11 19:42:161507{
1508 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501509 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant7a6b7ce2013-06-22 15:21:291510 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
Howard Hinnantbc8d3f92010-05-11 19:42:161511 __h.get_deleter().__first_constructed = true;
Howard Hinnant7a6b7ce2013-06-22 15:21:291512 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
Howard Hinnantbc8d3f92010-05-11 19:42:161513 __h.get_deleter().__second_constructed = true;
Howard Hinnant9a894d92013-08-22 18:29:501514 return _VSTD::move(__h); // explicitly moved for C++03
Howard Hinnantbc8d3f92010-05-11 19:42:161515}
1516
Howard Hinnantbc8d3f92010-05-11 19:42:161517template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1518template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:281519inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161520void
1521unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1522 _InputIterator __last)
1523{
1524 for (; __first != __last; ++__first)
1525 __table_.__insert_unique(*__first);
1526}
1527
1528template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1529_Tp&
1530unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1531{
1532 iterator __i = find(__k);
1533 if (__i != end())
1534 return __i->second;
Howard Hinnantb66e1c32013-07-04 20:59:161535 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnantbc8d3f92010-05-11 19:42:161536 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1537 __h.release();
1538 return __r.first->second;
1539}
1540
Howard Hinnant73d21a42010-09-04 23:28:191541#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161542
1543template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1544_Tp&
1545unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1546{
1547 iterator __i = find(__k);
1548 if (__i != end())
1549 return __i->second;
Howard Hinnantb66e1c32013-07-04 20:59:161550 __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
Howard Hinnantbc8d3f92010-05-11 19:42:161551 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1552 __h.release();
1553 return __r.first->second;
1554}
1555
Howard Hinnant73d21a42010-09-04 23:28:191556#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161557
1558template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1559_Tp&
1560unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1561{
1562 iterator __i = find(__k);
1563#ifndef _LIBCPP_NO_EXCEPTIONS
1564 if (__i == end())
1565 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431566#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161567 return __i->second;
1568}
1569
1570template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1571const _Tp&
1572unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1573{
1574 const_iterator __i = find(__k);
1575#ifndef _LIBCPP_NO_EXCEPTIONS
1576 if (__i == end())
1577 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431578#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161579 return __i->second;
1580}
1581
1582template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281583inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161584void
1585swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1586 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:241587 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161588{
1589 __x.swap(__y);
1590}
1591
1592template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1593bool
1594operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1595 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1596{
1597 if (__x.size() != __y.size())
1598 return false;
1599 typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1600 const_iterator;
1601 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1602 __i != __ex; ++__i)
1603 {
1604 const_iterator __j = __y.find(__i->first);
1605 if (__j == __ey || !(*__i == *__j))
1606 return false;
1607 }
1608 return true;
1609}
1610
1611template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281612inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161613bool
1614operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1615 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1616{
1617 return !(__x == __y);
1618}
1619
1620template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1621 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnant0f678bd2013-08-12 18:38:341622class _LIBCPP_TYPE_VIS_ONLY unordered_multimap
Howard Hinnantbc8d3f92010-05-11 19:42:161623{
1624public:
1625 // types
1626 typedef _Key key_type;
1627 typedef _Tp mapped_type;
1628 typedef _Hash hasher;
1629 typedef _Pred key_equal;
1630 typedef _Alloc allocator_type;
1631 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:291632 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161633 typedef value_type& reference;
1634 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:581635 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1636 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:161637
1638private:
Howard Hinnantff7546e2013-09-30 19:08:221639 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:001640 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
1641 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:381642 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1643 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161644
1645 typedef __hash_table<__value_type, __hasher,
1646 __key_equal, __allocator_type> __table;
1647
1648 __table __table_;
1649
1650 typedef typename __table::__node_traits __node_traits;
1651 typedef typename __table::__node_allocator __node_allocator;
1652 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:501653 typedef __hash_map_node_destructor<__node_allocator> _Dp;
1654 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:161655 typedef allocator_traits<allocator_type> __alloc_traits;
1656public:
1657 typedef typename __alloc_traits::pointer pointer;
1658 typedef typename __alloc_traits::const_pointer const_pointer;
1659 typedef typename __alloc_traits::size_type size_type;
1660 typedef typename __alloc_traits::difference_type difference_type;
1661
1662 typedef __hash_map_iterator<typename __table::iterator> iterator;
1663 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1664 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1665 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1666
Howard Hinnantee6ccd02010-09-23 18:58:281667 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241668 unordered_multimap()
1669 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:581670 {
1671#if _LIBCPP_DEBUG_LEVEL >= 2
1672 __get_db()->__insert_c(this);
1673#endif
1674 }
Howard Hinnantbc8d3f92010-05-11 19:42:161675 explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1676 const key_equal& __eql = key_equal());
1677 unordered_multimap(size_type __n, const hasher& __hf,
1678 const key_equal& __eql,
1679 const allocator_type& __a);
1680 template <class _InputIterator>
1681 unordered_multimap(_InputIterator __first, _InputIterator __last);
1682 template <class _InputIterator>
1683 unordered_multimap(_InputIterator __first, _InputIterator __last,
1684 size_type __n, const hasher& __hf = hasher(),
1685 const key_equal& __eql = key_equal());
1686 template <class _InputIterator>
1687 unordered_multimap(_InputIterator __first, _InputIterator __last,
1688 size_type __n, const hasher& __hf,
1689 const key_equal& __eql,
1690 const allocator_type& __a);
1691 explicit unordered_multimap(const allocator_type& __a);
1692 unordered_multimap(const unordered_multimap& __u);
1693 unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:191694#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:241695 unordered_multimap(unordered_multimap&& __u)
1696 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161697 unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:191698#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:021699#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161700 unordered_multimap(initializer_list<value_type> __il);
1701 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1702 const hasher& __hf = hasher(),
1703 const key_equal& __eql = key_equal());
1704 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1705 const hasher& __hf, const key_equal& __eql,
1706 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:021707#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow6dff6182013-09-12 03:00:311708#if _LIBCPP_STD_VER > 11
1709 _LIBCPP_INLINE_VISIBILITY
1710 unordered_multimap(size_type __n, const allocator_type& __a)
1711 : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1712 _LIBCPP_INLINE_VISIBILITY
1713 unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1714 : unordered_multimap(__n, __hf, key_equal(), __a) {}
1715 template <class _InputIterator>
1716 _LIBCPP_INLINE_VISIBILITY
1717 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1718 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1719 template <class _InputIterator>
1720 _LIBCPP_INLINE_VISIBILITY
1721 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
1722 const allocator_type& __a)
1723 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1724 _LIBCPP_INLINE_VISIBILITY
1725 unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1726 : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1727 _LIBCPP_INLINE_VISIBILITY
1728 unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1729 const allocator_type& __a)
1730 : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1731#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161732 // ~unordered_multimap() = default;
Howard Hinnant61aa6012011-07-01 19:24:361733 _LIBCPP_INLINE_VISIBILITY
1734 unordered_multimap& operator=(const unordered_multimap& __u)
1735 {
Howard Hinnant7a6b7ce2013-06-22 15:21:291736#if __cplusplus >= 201103L
Howard Hinnant61aa6012011-07-01 19:24:361737 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:291738#else
Marshall Clowebfc50e2014-02-08 04:03:141739 if (this != &__u) {
1740 __table_.clear();
1741 __table_.hash_function() = __u.__table_.hash_function();
1742 __table_.key_eq() = __u.__table_.key_eq();
1743 __table_.max_load_factor() = __u.__table_.max_load_factor();
1744 __table_.__copy_assign_alloc(__u.__table_);
1745 insert(__u.begin(), __u.end());
1746 }
Howard Hinnant7a6b7ce2013-06-22 15:21:291747#endif
Howard Hinnant61aa6012011-07-01 19:24:361748 return *this;
1749 }
Howard Hinnant73d21a42010-09-04 23:28:191750#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:241751 unordered_multimap& operator=(unordered_multimap&& __u)
1752 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161753#endif
Howard Hinnante3e32912011-08-12 21:56:021754#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161755 unordered_multimap& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:021756#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161757
Howard Hinnantee6ccd02010-09-23 18:58:281758 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241759 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161760 {return allocator_type(__table_.__node_alloc());}
1761
Howard Hinnantee6ccd02010-09-23 18:58:281762 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241763 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:281764 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241765 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:281766 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241767 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:161768
Howard Hinnantee6ccd02010-09-23 18:58:281769 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241770 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241772 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241774 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281775 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241776 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281777 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241778 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281779 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241780 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:161781
Howard Hinnant73d21a42010-09-04 23:28:191782#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant73d21a42010-09-04 23:28:191783#ifndef _LIBCPP_HAS_NO_VARIADICS
1784
Howard Hinnant635ce1d2012-05-25 22:04:211785 template <class... _Args>
1786 iterator emplace(_Args&&... __args);
Howard Hinnantbc8d3f92010-05-11 19:42:161787
Howard Hinnant635ce1d2012-05-25 22:04:211788 template <class... _Args>
1789 iterator emplace_hint(const_iterator __p, _Args&&... __args);
Howard Hinnant73d21a42010-09-04 23:28:191790#endif // _LIBCPP_HAS_NO_VARIADICS
1791#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:281792 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161793 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Howard Hinnant73d21a42010-09-04 23:28:191794#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:501795 template <class _Pp,
1796 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:281797 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:501798 iterator insert(_Pp&& __x)
1799 {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:191800#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:281801 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161802 iterator insert(const_iterator __p, const value_type& __x)
1803 {return __table_.__insert_multi(__p.__i_, __x);}
Howard Hinnant73d21a42010-09-04 23:28:191804#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:501805 template <class _Pp,
1806 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:281807 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:501808 iterator insert(const_iterator __p, _Pp&& __x)
1809 {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:191810#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161811 template <class _InputIterator>
1812 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021813#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:281814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161815 void insert(initializer_list<value_type> __il)
1816 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021817#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161818
Howard Hinnantee6ccd02010-09-23 18:58:281819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161820 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281821 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001822 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161824 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281825 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161826 iterator erase(const_iterator __first, const_iterator __last)
1827 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281828 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241829 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161830
Howard Hinnantee6ccd02010-09-23 18:58:281831 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241832 void swap(unordered_multimap& __u)
1833 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1834 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161835
Howard Hinnantee6ccd02010-09-23 18:58:281836 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161837 hasher hash_function() const
1838 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281839 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161840 key_equal key_eq() const
1841 {return __table_.key_eq().key_eq();}
1842
Howard Hinnantee6ccd02010-09-23 18:58:281843 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161844 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281845 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161846 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281847 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161848 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281849 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161850 pair<iterator, iterator> equal_range(const key_type& __k)
1851 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281852 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161853 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1854 {return __table_.__equal_range_multi(__k);}
1855
Howard Hinnantee6ccd02010-09-23 18:58:281856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241857 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241859 size_type max_bucket_count() const _NOEXCEPT
1860 {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161861
Howard Hinnantee6ccd02010-09-23 18:58:281862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161863 size_type bucket_size(size_type __n) const
1864 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161866 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1867
Howard Hinnantee6ccd02010-09-23 18:58:281868 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161869 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281870 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161871 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161873 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161875 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161877 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161879 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1880
Howard Hinnantee6ccd02010-09-23 18:58:281881 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241882 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241884 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161886 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161888 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281889 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161890 void reserve(size_type __n) {__table_.reserve(__n);}
1891
Howard Hinnant39213642013-07-23 22:01:581892#if _LIBCPP_DEBUG_LEVEL >= 2
1893
1894 bool __dereferenceable(const const_iterator* __i) const
1895 {return __table_.__dereferenceable(&__i->__i_);}
1896 bool __decrementable(const const_iterator* __i) const
1897 {return __table_.__decrementable(&__i->__i_);}
1898 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1899 {return __table_.__addable(&__i->__i_, __n);}
1900 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1901 {return __table_.__addable(&__i->__i_, __n);}
1902
1903#endif // _LIBCPP_DEBUG_LEVEL >= 2
1904
Howard Hinnantbc8d3f92010-05-11 19:42:161905private:
Howard Hinnant635ce1d2012-05-25 22:04:211906#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1907 __node_holder __construct_node();
1908 template <class _A0>
Howard Hinnantb66e1c32013-07-04 20:59:161909 __node_holder
Howard Hinnant635ce1d2012-05-25 22:04:211910 __construct_node(_A0&& __a0);
1911#ifndef _LIBCPP_HAS_NO_VARIADICS
1912 template <class _A0, class _A1, class ..._Args>
1913 __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
1914#endif // _LIBCPP_HAS_NO_VARIADICS
1915#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161916};
1917
1918template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1919unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1920 size_type __n, const hasher& __hf, const key_equal& __eql)
1921 : __table_(__hf, __eql)
1922{
Howard Hinnant39213642013-07-23 22:01:581923#if _LIBCPP_DEBUG_LEVEL >= 2
1924 __get_db()->__insert_c(this);
1925#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161926 __table_.rehash(__n);
1927}
1928
1929template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1930unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1931 size_type __n, const hasher& __hf, const key_equal& __eql,
1932 const allocator_type& __a)
1933 : __table_(__hf, __eql, __a)
1934{
Howard Hinnant39213642013-07-23 22:01:581935#if _LIBCPP_DEBUG_LEVEL >= 2
1936 __get_db()->__insert_c(this);
1937#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161938 __table_.rehash(__n);
1939}
1940
1941template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1942template <class _InputIterator>
1943unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1944 _InputIterator __first, _InputIterator __last)
1945{
Howard Hinnant39213642013-07-23 22:01:581946#if _LIBCPP_DEBUG_LEVEL >= 2
1947 __get_db()->__insert_c(this);
1948#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161949 insert(__first, __last);
1950}
1951
1952template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1953template <class _InputIterator>
1954unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1955 _InputIterator __first, _InputIterator __last, size_type __n,
1956 const hasher& __hf, const key_equal& __eql)
1957 : __table_(__hf, __eql)
1958{
Howard Hinnant39213642013-07-23 22:01:581959#if _LIBCPP_DEBUG_LEVEL >= 2
1960 __get_db()->__insert_c(this);
1961#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161962 __table_.rehash(__n);
1963 insert(__first, __last);
1964}
1965
1966template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1967template <class _InputIterator>
1968unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1969 _InputIterator __first, _InputIterator __last, size_type __n,
1970 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1971 : __table_(__hf, __eql, __a)
1972{
Howard Hinnant39213642013-07-23 22:01:581973#if _LIBCPP_DEBUG_LEVEL >= 2
1974 __get_db()->__insert_c(this);
1975#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161976 __table_.rehash(__n);
1977 insert(__first, __last);
1978}
1979
Howard Hinnantbc8d3f92010-05-11 19:42:161980template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281981inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161982unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1983 const allocator_type& __a)
1984 : __table_(__a)
1985{
Howard Hinnant39213642013-07-23 22:01:581986#if _LIBCPP_DEBUG_LEVEL >= 2
1987 __get_db()->__insert_c(this);
1988#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161989}
1990
1991template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1992unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1993 const unordered_multimap& __u)
1994 : __table_(__u.__table_)
1995{
Howard Hinnant39213642013-07-23 22:01:581996#if _LIBCPP_DEBUG_LEVEL >= 2
1997 __get_db()->__insert_c(this);
1998#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161999 __table_.rehash(__u.bucket_count());
2000 insert(__u.begin(), __u.end());
2001}
2002
2003template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2004unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2005 const unordered_multimap& __u, const allocator_type& __a)
2006 : __table_(__u.__table_, __a)
2007{
Howard Hinnant39213642013-07-23 22:01:582008#if _LIBCPP_DEBUG_LEVEL >= 2
2009 __get_db()->__insert_c(this);
2010#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162011 __table_.rehash(__u.bucket_count());
2012 insert(__u.begin(), __u.end());
2013}
2014
Howard Hinnant73d21a42010-09-04 23:28:192015#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162016
2017template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282018inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162019unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2020 unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:242021 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:192022 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:162023{
Howard Hinnant39213642013-07-23 22:01:582024#if _LIBCPP_DEBUG_LEVEL >= 2
2025 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:422026 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:582027#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162028}
2029
2030template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2031unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2032 unordered_multimap&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:192033 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:162034{
Howard Hinnant39213642013-07-23 22:01:582035#if _LIBCPP_DEBUG_LEVEL >= 2
2036 __get_db()->__insert_c(this);
2037#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162038 if (__a != __u.get_allocator())
2039 {
2040 iterator __i = __u.begin();
2041 while (__u.size() != 0)
Howard Hinnant39213642013-07-23 22:01:582042 {
Howard Hinnantbc8d3f92010-05-11 19:42:162043 __table_.__insert_multi(
Howard Hinnant0949eed2011-06-30 21:18:192044 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
Howard Hinnantbc8d3f92010-05-11 19:42:162045 );
Howard Hinnant39213642013-07-23 22:01:582046 }
Howard Hinnantbc8d3f92010-05-11 19:42:162047 }
Howard Hinnantf890d9b2013-07-30 21:04:422048#if _LIBCPP_DEBUG_LEVEL >= 2
2049 else
2050 __get_db()->swap(this, &__u);
2051#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162052}
2053
Howard Hinnant73d21a42010-09-04 23:28:192054#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162055
Howard Hinnante3e32912011-08-12 21:56:022056#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2057
Howard Hinnantbc8d3f92010-05-11 19:42:162058template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2059unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2060 initializer_list<value_type> __il)
2061{
Howard Hinnant39213642013-07-23 22:01:582062#if _LIBCPP_DEBUG_LEVEL >= 2
2063 __get_db()->__insert_c(this);
2064#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162065 insert(__il.begin(), __il.end());
2066}
2067
2068template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2069unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2070 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
2071 const key_equal& __eql)
2072 : __table_(__hf, __eql)
2073{
Howard Hinnant39213642013-07-23 22:01:582074#if _LIBCPP_DEBUG_LEVEL >= 2
2075 __get_db()->__insert_c(this);
2076#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162077 __table_.rehash(__n);
2078 insert(__il.begin(), __il.end());
2079}
2080
2081template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2082unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2083 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
2084 const key_equal& __eql, const allocator_type& __a)
2085 : __table_(__hf, __eql, __a)
2086{
Howard Hinnant39213642013-07-23 22:01:582087#if _LIBCPP_DEBUG_LEVEL >= 2
2088 __get_db()->__insert_c(this);
2089#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162090 __table_.rehash(__n);
2091 insert(__il.begin(), __il.end());
2092}
2093
Howard Hinnante3e32912011-08-12 21:56:022094#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2095
Howard Hinnant73d21a42010-09-04 23:28:192096#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162097
2098template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282099inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162100unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2101unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:242102 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:162103{
Howard Hinnant0949eed2011-06-30 21:18:192104 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:162105 return *this;
2106}
2107
Howard Hinnant73d21a42010-09-04 23:28:192108#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162109
Howard Hinnante3e32912011-08-12 21:56:022110#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2111
Howard Hinnantbc8d3f92010-05-11 19:42:162112template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282113inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162114unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2115unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
2116 initializer_list<value_type> __il)
2117{
2118 __table_.__assign_multi(__il.begin(), __il.end());
2119 return *this;
2120}
2121
Howard Hinnante3e32912011-08-12 21:56:022122#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2123
Howard Hinnant73d21a42010-09-04 23:28:192124#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162125
2126template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantbc8d3f92010-05-11 19:42:162127typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnant635ce1d2012-05-25 22:04:212128unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
Howard Hinnantbc8d3f92010-05-11 19:42:162129{
2130 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:502131 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant635ce1d2012-05-25 22:04:212132 __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:162133 __h.get_deleter().__first_constructed = true;
Howard Hinnantbc8d3f92010-05-11 19:42:162134 __h.get_deleter().__second_constructed = true;
2135 return __h;
2136}
2137
2138template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant635ce1d2012-05-25 22:04:212139template <class _A0>
Howard Hinnantb66e1c32013-07-04 20:59:162140typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnantbc8d3f92010-05-11 19:42:162141unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
2142{
2143 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:502144 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant0949eed2011-06-30 21:18:192145 __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
2146 _VSTD::forward<_A0>(__a0));
Howard Hinnantbc8d3f92010-05-11 19:42:162147 __h.get_deleter().__first_constructed = true;
2148 __h.get_deleter().__second_constructed = true;
2149 return __h;
2150}
2151
Howard Hinnant73d21a42010-09-04 23:28:192152#ifndef _LIBCPP_HAS_NO_VARIADICS
2153
Howard Hinnantbc8d3f92010-05-11 19:42:162154template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant635ce1d2012-05-25 22:04:212155template <class _A0, class _A1, class ..._Args>
2156typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
2157unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(
2158 _A0&& __a0, _A1&& __a1, _Args&&... __args)
Howard Hinnantbc8d3f92010-05-11 19:42:162159{
Howard Hinnant635ce1d2012-05-25 22:04:212160 __node_allocator& __na = __table_.__node_alloc();
2161 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2162 __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
2163 _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
2164 _VSTD::forward<_Args>(__args)...);
2165 __h.get_deleter().__first_constructed = true;
2166 __h.get_deleter().__second_constructed = true;
2167 return __h;
2168}
2169
2170template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2171template <class... _Args>
2172typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
2173unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
2174{
2175 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:162176 iterator __r = __table_.__node_insert_multi(__h.get());
2177 __h.release();
2178 return __r;
2179}
2180
2181template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnant635ce1d2012-05-25 22:04:212182template <class... _Args>
Howard Hinnantbc8d3f92010-05-11 19:42:162183typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
2184unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace_hint(
Howard Hinnant635ce1d2012-05-25 22:04:212185 const_iterator __p, _Args&&... __args)
Howard Hinnantbc8d3f92010-05-11 19:42:162186{
Howard Hinnant635ce1d2012-05-25 22:04:212187 __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:162188 iterator __r = __table_.__node_insert_multi(__p.__i_, __h.get());
2189 __h.release();
2190 return __r;
2191}
2192
Howard Hinnant73d21a42010-09-04 23:28:192193#endif // _LIBCPP_HAS_NO_VARIADICS
2194#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162195
2196template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2197template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:282198inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162199void
2200unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
2201 _InputIterator __last)
2202{
2203 for (; __first != __last; ++__first)
2204 __table_.__insert_multi(*__first);
2205}
2206
2207template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282208inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162209void
2210swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2211 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:242212 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:162213{
2214 __x.swap(__y);
2215}
2216
2217template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2218bool
2219operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2220 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2221{
2222 if (__x.size() != __y.size())
2223 return false;
2224 typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2225 const_iterator;
2226 typedef pair<const_iterator, const_iterator> _EqRng;
2227 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2228 {
2229 _EqRng __xeq = __x.equal_range(__i->first);
2230 _EqRng __yeq = __y.equal_range(__i->first);
Howard Hinnant0949eed2011-06-30 21:18:192231 if (_VSTD::distance(__xeq.first, __xeq.second) !=
2232 _VSTD::distance(__yeq.first, __yeq.second) ||
2233 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:162234 return false;
2235 __i = __xeq.second;
2236 }
2237 return true;
2238}
2239
2240template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282241inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162242bool
2243operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2244 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2245{
2246 return !(__x == __y);
2247}
2248
2249_LIBCPP_END_NAMESPACE_STD
2250
2251#endif // _LIBCPP_UNORDERED_MAP