blob: 372868a0df591d3e7b2a02358b5e9417daae392e [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>
Eric Fiselier410ed302016-02-11 21:45:53372#include <tuple>
Howard Hinnantbc8d3f92010-05-11 19:42:16373
Eric Fiselierb9536102014-08-10 23:53:08374#include <__debug>
375
Howard Hinnant08e17472011-10-17 20:05:10376#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16377#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10378#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16379
380_LIBCPP_BEGIN_NAMESPACE_STD
381
Eric Fiselier3a0e4302015-06-13 07:08:02382template <class _Key, class _Cp, class _Hash,
383 bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
Howard Hinnantd4cf2152011-12-11 20:31:33384 >
Howard Hinnantbc8d3f92010-05-11 19:42:16385class __unordered_map_hasher
386 : private _Hash
387{
Howard Hinnantbc8d3f92010-05-11 19:42:16388public:
Howard Hinnantee6ccd02010-09-23 18:58:28389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24390 __unordered_map_hasher()
391 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
392 : _Hash() {}
Howard Hinnantee6ccd02010-09-23 18:58:28393 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24394 __unordered_map_hasher(const _Hash& __h)
395 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
396 : _Hash(__h) {}
Howard Hinnantee6ccd02010-09-23 18:58:28397 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24398 const _Hash& hash_function() const _NOEXCEPT {return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28399 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24400 size_t operator()(const _Cp& __x) const
Howard Hinnant9b128e02013-07-05 18:06:00401 {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24402 _LIBCPP_INLINE_VISIBILITY
403 size_t operator()(const _Key& __x) const
Howard Hinnantbc8d3f92010-05-11 19:42:16404 {return static_cast<const _Hash&>(*this)(__x);}
Marshall Clow7d914d12015-07-13 20:04:56405 void swap(__unordered_map_hasher&__y)
406 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
407 {
408 using _VSTD::swap;
409 swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y));
410 }
Howard Hinnantbc8d3f92010-05-11 19:42:16411};
412
Howard Hinnant9b128e02013-07-05 18:06:00413template <class _Key, class _Cp, class _Hash>
414class __unordered_map_hasher<_Key, _Cp, _Hash, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16415{
416 _Hash __hash_;
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{
Howard Hinnantbc8d3f92010-05-11 19:42:16458public:
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 Hinnantbc8d3f92010-05-11 19:42:16490public:
Howard Hinnantee6ccd02010-09-23 18:58:28491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24492 __unordered_map_equal()
493 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
494 : __pred_() {}
Howard Hinnantee6ccd02010-09-23 18:58:28495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24496 __unordered_map_equal(const _Pred& __p)
497 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
498 : __pred_(__p) {}
Howard Hinnantee6ccd02010-09-23 18:58:28499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24500 const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
Howard Hinnantee6ccd02010-09-23 18:58:28501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24502 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00503 {return __pred_(__x.__cc.first, __y.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24504 _LIBCPP_INLINE_VISIBILITY
505 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00506 {return __pred_(__x.__cc.first, __y);}
Howard Hinnantf8880d02011-12-12 17:26:24507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24508 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00509 {return __pred_(__x, __y.__cc.first);}
Marshall Clow7d914d12015-07-13 20:04:56510 void swap(__unordered_map_equal&__y)
511 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
512 {
513 using _VSTD::swap;
514 swap(__pred_, __y.__pred_);
515 }
Howard Hinnantbc8d3f92010-05-11 19:42:16516};
517
Marshall Clow7d914d12015-07-13 20:04:56518template <class _Key, class _Cp, class _Pred, bool __b>
519inline _LIBCPP_INLINE_VISIBILITY
520void
521swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
522 __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
523 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
524{
525 __x.swap(__y);
526}
527
Howard Hinnantbc8d3f92010-05-11 19:42:16528template <class _Alloc>
529class __hash_map_node_destructor
530{
531 typedef _Alloc allocator_type;
532 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier774c7c52016-02-10 20:46:23533
Howard Hinnantbc8d3f92010-05-11 19:42:16534public:
Eric Fiselier774c7c52016-02-10 20:46:23535
536 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16537private:
Howard Hinnantbc8d3f92010-05-11 19:42:16538
539 allocator_type& __na_;
540
541 __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
542
543public:
544 bool __first_constructed;
545 bool __second_constructed;
546
Howard Hinnantee6ccd02010-09-23 18:58:28547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24548 explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16549 : __na_(__na),
550 __first_constructed(false),
551 __second_constructed(false)
552 {}
553
Howard Hinnant73d21a42010-09-04 23:28:19554#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16556 __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
Howard Hinnant5f2f14c2011-06-04 18:54:24557 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16558 : __na_(__x.__na_),
559 __first_constructed(__x.__value_constructed),
560 __second_constructed(__x.__value_constructed)
561 {
562 __x.__value_constructed = false;
563 }
Howard Hinnant73d21a42010-09-04 23:28:19564#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16566 __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
567 : __na_(__x.__na_),
568 __first_constructed(__x.__value_constructed),
569 __second_constructed(__x.__value_constructed)
570 {
571 const_cast<bool&>(__x.__value_constructed) = false;
572 }
Howard Hinnant73d21a42010-09-04 23:28:19573#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16574
Howard Hinnantee6ccd02010-09-23 18:58:28575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24576 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16577 {
578 if (__second_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29579 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
Howard Hinnantbc8d3f92010-05-11 19:42:16580 if (__first_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29581 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
Howard Hinnantbc8d3f92010-05-11 19:42:16582 if (__p)
583 __alloc_traits::deallocate(__na_, __p, 1);
584 }
585};
586
Eric Fiselier2960ae22016-02-11 11:59:44587#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantff7546e2013-09-30 19:08:22588template <class _Key, class _Tp>
589union __hash_value_type
590{
591 typedef _Key key_type;
592 typedef _Tp mapped_type;
593 typedef pair<const key_type, mapped_type> value_type;
594 typedef pair<key_type, mapped_type> __nc_value_type;
595
596 value_type __cc;
597 __nc_value_type __nc;
598
Howard Hinnantff7546e2013-09-30 19:08:22599 _LIBCPP_INLINE_VISIBILITY
600 __hash_value_type& operator=(const __hash_value_type& __v)
601 {__nc = __v.__cc; return *this;}
602
603 _LIBCPP_INLINE_VISIBILITY
604 __hash_value_type& operator=(__hash_value_type&& __v)
Marshall Clowcd137822015-05-06 12:11:22605 {__nc = _VSTD::move(__v.__nc); return *this;}
Howard Hinnantff7546e2013-09-30 19:08:22606
Eric Fiselier2960ae22016-02-11 11:59:44607 template <class _ValueTp,
608 class = typename enable_if<
609 __is_same_uncvref<_ValueTp, value_type>::value
610 >::type
611 >
Howard Hinnantff7546e2013-09-30 19:08:22612 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2960ae22016-02-11 11:59:44613 __hash_value_type& operator=(_ValueTp&& __v) {
614 __nc = _VSTD::forward<_ValueTp>(__v); return *this;
615 }
616
617private:
618 __hash_value_type(const __hash_value_type& __v) = delete;
619 __hash_value_type(__hash_value_type&& __v) = delete;
620 template <class ..._Args>
621 explicit __hash_value_type(_Args&& ...__args) = delete;
622
623 ~__hash_value_type() = delete;
Howard Hinnantff7546e2013-09-30 19:08:22624};
625
626#else
627
628template <class _Key, class _Tp>
629struct __hash_value_type
630{
631 typedef _Key key_type;
632 typedef _Tp mapped_type;
633 typedef pair<const key_type, mapped_type> value_type;
634
635 value_type __cc;
636
Eric Fiselier2960ae22016-02-11 11:59:44637private:
638 ~__hash_value_type();
Howard Hinnantff7546e2013-09-30 19:08:22639};
640
641#endif
642
Howard Hinnantbc8d3f92010-05-11 19:42:16643template <class _HashIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34644class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16645{
646 _HashIterator __i_;
647
Eric Fiselier774c7c52016-02-10 20:46:23648 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
649
Howard Hinnantbc8d3f92010-05-11 19:42:16650public:
651 typedef forward_iterator_tag iterator_category;
Eric Fiselier774c7c52016-02-10 20:46:23652 typedef typename _NodeTypes::__map_value_type value_type;
653 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16654 typedef value_type& reference;
Eric Fiselier774c7c52016-02-10 20:46:23655 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16656
Howard Hinnantee6ccd02010-09-23 18:58:28657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24658 __hash_map_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16659
Howard Hinnantee6ccd02010-09-23 18:58:28660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24661 __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16662
Howard Hinnantee6ccd02010-09-23 18:58:28663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29664 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29666 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16667
Howard Hinnantee6ccd02010-09-23 18:58:28668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16669 __hash_map_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28670 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16671 __hash_map_iterator operator++(int)
672 {
673 __hash_map_iterator __t(*this);
674 ++(*this);
675 return __t;
676 }
677
Howard Hinnantee6ccd02010-09-23 18:58:28678 friend _LIBCPP_INLINE_VISIBILITY
679 bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16680 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28681 friend _LIBCPP_INLINE_VISIBILITY
682 bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16683 {return __x.__i_ != __y.__i_;}
684
Howard Hinnant0f678bd2013-08-12 18:38:34685 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
686 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
687 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
688 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
689 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16690};
691
692template <class _HashIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34693class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16694{
695 _HashIterator __i_;
696
Eric Fiselier774c7c52016-02-10 20:46:23697 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
698
Howard Hinnantbc8d3f92010-05-11 19:42:16699public:
700 typedef forward_iterator_tag iterator_category;
Eric Fiselier774c7c52016-02-10 20:46:23701 typedef typename _NodeTypes::__map_value_type value_type;
702 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16703 typedef const value_type& reference;
Eric Fiselier774c7c52016-02-10 20:46:23704 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16705
Howard Hinnantee6ccd02010-09-23 18:58:28706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24707 __hash_map_const_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16708
Howard Hinnantee6ccd02010-09-23 18:58:28709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24710 __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantee6ccd02010-09-23 18:58:28711 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16712 __hash_map_const_iterator(
713 __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
Howard Hinnant5f2f14c2011-06-04 18:54:24714 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16715 : __i_(__i.__i_) {}
716
Howard Hinnantee6ccd02010-09-23 18:58:28717 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29718 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28719 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29720 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16721
Howard Hinnantee6ccd02010-09-23 18:58:28722 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16723 __hash_map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28724 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16725 __hash_map_const_iterator operator++(int)
726 {
727 __hash_map_const_iterator __t(*this);
728 ++(*this);
729 return __t;
730 }
731
Howard Hinnantee6ccd02010-09-23 18:58:28732 friend _LIBCPP_INLINE_VISIBILITY
733 bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16734 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28735 friend _LIBCPP_INLINE_VISIBILITY
736 bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16737 {return __x.__i_ != __y.__i_;}
738
Howard Hinnant0f678bd2013-08-12 18:38:34739 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
740 template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
741 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
742 template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16743};
744
745template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
746 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnant0f678bd2013-08-12 18:38:34747class _LIBCPP_TYPE_VIS_ONLY unordered_map
Howard Hinnantbc8d3f92010-05-11 19:42:16748{
749public:
750 // types
751 typedef _Key key_type;
752 typedef _Tp mapped_type;
753 typedef _Hash hasher;
754 typedef _Pred key_equal;
755 typedef _Alloc allocator_type;
756 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:29757 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16758 typedef value_type& reference;
759 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:58760 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
761 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16762
763private:
Howard Hinnantff7546e2013-09-30 19:08:22764 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:00765 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
766 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:38767 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
768 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16769
770 typedef __hash_table<__value_type, __hasher,
771 __key_equal, __allocator_type> __table;
772
773 __table __table_;
774
Eric Fiselier2960ae22016-02-11 11:59:44775 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnantbc8d3f92010-05-11 19:42:16776 typedef typename __table::__node_pointer __node_pointer;
777 typedef typename __table::__node_const_pointer __node_const_pointer;
778 typedef typename __table::__node_traits __node_traits;
779 typedef typename __table::__node_allocator __node_allocator;
780 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:50781 typedef __hash_map_node_destructor<__node_allocator> _Dp;
782 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:16783 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier2960ae22016-02-11 11:59:44784
785 static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
786 static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
Howard Hinnantbc8d3f92010-05-11 19:42:16787public:
788 typedef typename __alloc_traits::pointer pointer;
789 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier774c7c52016-02-10 20:46:23790 typedef typename __table::size_type size_type;
791 typedef typename __table::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16792
793 typedef __hash_map_iterator<typename __table::iterator> iterator;
794 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
795 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
796 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
797
Howard Hinnantee6ccd02010-09-23 18:58:28798 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24799 unordered_map()
800 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58801 {
802#if _LIBCPP_DEBUG_LEVEL >= 2
803 __get_db()->__insert_c(this);
804#endif
805 }
Howard Hinnantbc8d3f92010-05-11 19:42:16806 explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
807 const key_equal& __eql = key_equal());
808 unordered_map(size_type __n, const hasher& __hf,
809 const key_equal& __eql,
810 const allocator_type& __a);
811 template <class _InputIterator>
812 unordered_map(_InputIterator __first, _InputIterator __last);
813 template <class _InputIterator>
814 unordered_map(_InputIterator __first, _InputIterator __last,
815 size_type __n, const hasher& __hf = hasher(),
816 const key_equal& __eql = key_equal());
817 template <class _InputIterator>
818 unordered_map(_InputIterator __first, _InputIterator __last,
819 size_type __n, const hasher& __hf,
820 const key_equal& __eql,
821 const allocator_type& __a);
822 explicit unordered_map(const allocator_type& __a);
823 unordered_map(const unordered_map& __u);
824 unordered_map(const unordered_map& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19825#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:24826 unordered_map(unordered_map&& __u)
827 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16828 unordered_map(unordered_map&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19829#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02830#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16831 unordered_map(initializer_list<value_type> __il);
832 unordered_map(initializer_list<value_type> __il, size_type __n,
833 const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
834 unordered_map(initializer_list<value_type> __il, size_type __n,
835 const hasher& __hf, const key_equal& __eql,
836 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02837#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow6dff6182013-09-12 03:00:31838#if _LIBCPP_STD_VER > 11
839 _LIBCPP_INLINE_VISIBILITY
840 unordered_map(size_type __n, const allocator_type& __a)
841 : unordered_map(__n, hasher(), key_equal(), __a) {}
842 _LIBCPP_INLINE_VISIBILITY
843 unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
844 : unordered_map(__n, __hf, key_equal(), __a) {}
845 template <class _InputIterator>
846 _LIBCPP_INLINE_VISIBILITY
847 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
848 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
849 template <class _InputIterator>
850 _LIBCPP_INLINE_VISIBILITY
851 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
852 const allocator_type& __a)
853 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
854 _LIBCPP_INLINE_VISIBILITY
855 unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
856 : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
857 _LIBCPP_INLINE_VISIBILITY
858 unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
859 const allocator_type& __a)
860 : unordered_map(__il, __n, __hf, key_equal(), __a) {}
861#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16862 // ~unordered_map() = default;
Howard Hinnant61aa6012011-07-01 19:24:36863 _LIBCPP_INLINE_VISIBILITY
864 unordered_map& operator=(const unordered_map& __u)
865 {
Howard Hinnant7a6b7ce2013-06-22 15:21:29866#if __cplusplus >= 201103L
Howard Hinnant61aa6012011-07-01 19:24:36867 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:29868#else
Marshall Clowebfc50e2014-02-08 04:03:14869 if (this != &__u) {
870 __table_.clear();
871 __table_.hash_function() = __u.__table_.hash_function();
872 __table_.key_eq() = __u.__table_.key_eq();
873 __table_.max_load_factor() = __u.__table_.max_load_factor();
874 __table_.__copy_assign_alloc(__u.__table_);
875 insert(__u.begin(), __u.end());
876 }
Howard Hinnant7a6b7ce2013-06-22 15:21:29877#endif
Howard Hinnant61aa6012011-07-01 19:24:36878 return *this;
879 }
Howard Hinnant73d21a42010-09-04 23:28:19880#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:24881 unordered_map& operator=(unordered_map&& __u)
882 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16883#endif
Howard Hinnante3e32912011-08-12 21:56:02884#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16885 unordered_map& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02886#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16887
Howard Hinnantee6ccd02010-09-23 18:58:28888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24889 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16890 {return allocator_type(__table_.__node_alloc());}
891
Howard Hinnantee6ccd02010-09-23 18:58:28892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24893 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24895 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24897 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16898
Howard Hinnantee6ccd02010-09-23 18:58:28899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24900 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24902 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24904 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24906 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24908 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24910 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16911
Eric Fiselier2960ae22016-02-11 11:59:44912#ifndef _LIBCPP_CXX03_LANG
913 template <class... _Args>
914 _LIBCPP_INLINE_VISIBILITY
915 pair<iterator, bool> emplace(_Args&&... __args) {
916 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
917 }
Howard Hinnant73d21a42010-09-04 23:28:19918
Howard Hinnant635ce1d2012-05-25 22:04:21919 template <class... _Args>
Eric Fiselier2960ae22016-02-11 11:59:44920 _LIBCPP_INLINE_VISIBILITY
921 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
Howard Hinnantf890d9b2013-07-30 21:04:42922#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier2960ae22016-02-11 11:59:44923 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
924 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
925 " referring to this unordered_map");
Howard Hinnantf890d9b2013-07-30 21:04:42926#endif
Eric Fiselier2960ae22016-02-11 11:59:44927 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
928 }
929
930#endif // _LIBCPP_CXX03_LANG
931
Howard Hinnantee6ccd02010-09-23 18:58:28932 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16933 pair<iterator, bool> insert(const value_type& __x)
934 {return __table_.__insert_unique(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19935#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:50936 template <class _Pp,
937 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:28938 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:50939 pair<iterator, bool> insert(_Pp&& __x)
940 {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19941#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf890d9b2013-07-30 21:04:42943#if _LIBCPP_DEBUG_LEVEL >= 2
944 iterator insert(const_iterator __p, const value_type& __x)
945 {
946 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
947 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
948 " referring to this unordered_map");
949 return insert(__x).first;
950 }
951#else
Howard Hinnantbc8d3f92010-05-11 19:42:16952 iterator insert(const_iterator, const value_type& __x)
953 {return insert(__x).first;}
Howard Hinnantf890d9b2013-07-30 21:04:42954#endif
Howard Hinnant73d21a42010-09-04 23:28:19955#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:50956 template <class _Pp,
957 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:28958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf890d9b2013-07-30 21:04:42959#if _LIBCPP_DEBUG_LEVEL >= 2
960 iterator insert(const_iterator __p, _Pp&& __x)
961 {
962 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
963 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
964 " referring to this unordered_map");
965 return insert(_VSTD::forward<_Pp>(__x)).first;
966 }
967#else
Howard Hinnant99968442011-11-29 18:15:50968 iterator insert(const_iterator, _Pp&& __x)
969 {return insert(_VSTD::forward<_Pp>(__x)).first;}
Howard Hinnantf890d9b2013-07-30 21:04:42970#endif
Howard Hinnant73d21a42010-09-04 23:28:19971#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16972 template <class _InputIterator>
973 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02974#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28975 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16976 void insert(initializer_list<value_type> __il)
977 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02978#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16979
Marshall Clow0ce05a92015-07-07 05:45:35980#if _LIBCPP_STD_VER > 14
981#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
982#ifndef _LIBCPP_HAS_NO_VARIADICS
983 template <class... _Args>
984 _LIBCPP_INLINE_VISIBILITY
985 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
986 {
987 iterator __p = __table_.find(__k);
988 if ( __p != end())
989 return _VSTD::make_pair(__p, false);
990 else
991 return _VSTD::make_pair(
992 emplace_hint(__p,
993 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
994 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
995 true);
996 }
997
998 template <class... _Args>
999 _LIBCPP_INLINE_VISIBILITY
1000 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1001 {
1002 iterator __p = __table_.find(__k);
1003 if ( __p != end())
1004 return _VSTD::make_pair(__p, false);
1005 else
1006 return _VSTD::make_pair(
1007 emplace_hint(__p,
1008 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1009 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
1010 true);
1011 }
1012
1013 template <class... _Args>
1014 _LIBCPP_INLINE_VISIBILITY
1015 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1016 {
1017 iterator __p = __table_.find(__k);
1018 if ( __p != end())
1019 return __p;
1020 else
1021 return emplace_hint(__h,
1022 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
1023 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1024 }
1025
1026 template <class... _Args>
1027 _LIBCPP_INLINE_VISIBILITY
1028 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1029 {
1030 iterator __p = __table_.find(__k);
1031 if ( __p != end())
1032 return __p;
1033 else
1034 return emplace_hint(__h,
1035 _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1036 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1037 }
1038
1039 template <class _Vp>
1040 _LIBCPP_INLINE_VISIBILITY
1041 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1042 {
1043 iterator __p = __table_.find(__k);
1044 if ( __p != end())
1045 {
1046 __p->second = _VSTD::move(__v);
1047 return _VSTD::make_pair(__p, false);
1048 }
1049 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1050 }
1051
1052 template <class _Vp>
1053 _LIBCPP_INLINE_VISIBILITY
1054 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1055 {
1056 iterator __p = __table_.find(__k);
1057 if ( __p != end())
1058 {
1059 __p->second = _VSTD::move(__v);
1060 return _VSTD::make_pair(__p, false);
1061 }
1062 return _VSTD::make_pair(emplace_hint(__p, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v)), true);
1063 }
1064
1065 template <class _Vp>
1066 _LIBCPP_INLINE_VISIBILITY
1067 iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1068 {
1069 iterator __p = __table_.find(__k);
1070 if ( __p != end())
1071 {
1072 __p->second = _VSTD::move(__v);
1073 return __p;
1074 }
1075 return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1076 }
1077
1078 template <class _Vp>
1079 _LIBCPP_INLINE_VISIBILITY
1080 iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1081 {
1082 iterator __p = __table_.find(__k);
1083 if ( __p != end())
1084 {
1085 __p->second = _VSTD::move(__v);
1086 return __p;
1087 }
1088 return emplace_hint(__h, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v));
1089 }
1090#endif
1091#endif
1092#endif
1093
Howard Hinnantee6ccd02010-09-23 18:58:281094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161095 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281096 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001097 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1098 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161099 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281100 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161101 iterator erase(const_iterator __first, const_iterator __last)
1102 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241104 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161105
Howard Hinnantee6ccd02010-09-23 18:58:281106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241107 void swap(unordered_map& __u)
1108 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1109 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161110
Howard Hinnantee6ccd02010-09-23 18:58:281111 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161112 hasher hash_function() const
1113 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281114 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161115 key_equal key_eq() const
1116 {return __table_.key_eq().key_eq();}
1117
Howard Hinnantee6ccd02010-09-23 18:58:281118 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161119 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161121 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281122 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161123 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161125 pair<iterator, iterator> equal_range(const key_type& __k)
1126 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281127 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161128 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1129 {return __table_.__equal_range_unique(__k);}
1130
1131 mapped_type& operator[](const key_type& __k);
Eric Fiselier410ed302016-02-11 21:45:531132#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161133 mapped_type& operator[](key_type&& __k);
1134#endif
1135
1136 mapped_type& at(const key_type& __k);
1137 const mapped_type& at(const key_type& __k) const;
1138
Howard Hinnantee6ccd02010-09-23 18:58:281139 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241140 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281141 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241142 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161143
Howard Hinnantee6ccd02010-09-23 18:58:281144 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161145 size_type bucket_size(size_type __n) const
1146 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281147 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161148 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1149
Howard Hinnantee6ccd02010-09-23 18:58:281150 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161151 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281152 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161153 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281154 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161155 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281156 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161157 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281158 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161159 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281160 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161161 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1162
Howard Hinnantee6ccd02010-09-23 18:58:281163 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241164 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281165 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241166 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281167 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161168 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281169 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161170 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281171 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161172 void reserve(size_type __n) {__table_.reserve(__n);}
1173
Howard Hinnant39213642013-07-23 22:01:581174#if _LIBCPP_DEBUG_LEVEL >= 2
1175
1176 bool __dereferenceable(const const_iterator* __i) const
1177 {return __table_.__dereferenceable(&__i->__i_);}
1178 bool __decrementable(const const_iterator* __i) const
1179 {return __table_.__decrementable(&__i->__i_);}
1180 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1181 {return __table_.__addable(&__i->__i_, __n);}
1182 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1183 {return __table_.__addable(&__i->__i_, __n);}
1184
1185#endif // _LIBCPP_DEBUG_LEVEL >= 2
1186
Howard Hinnantbc8d3f92010-05-11 19:42:161187private:
Eric Fiselier410ed302016-02-11 21:45:531188
1189#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantb66e1c32013-07-04 20:59:161190 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselier410ed302016-02-11 21:45:531191#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161192};
1193
1194template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1195unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1196 size_type __n, const hasher& __hf, const key_equal& __eql)
1197 : __table_(__hf, __eql)
1198{
Howard Hinnant39213642013-07-23 22:01:581199#if _LIBCPP_DEBUG_LEVEL >= 2
1200 __get_db()->__insert_c(this);
1201#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161202 __table_.rehash(__n);
1203}
1204
1205template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1206unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1207 size_type __n, const hasher& __hf, const key_equal& __eql,
1208 const allocator_type& __a)
1209 : __table_(__hf, __eql, __a)
1210{
Howard Hinnant39213642013-07-23 22:01:581211#if _LIBCPP_DEBUG_LEVEL >= 2
1212 __get_db()->__insert_c(this);
1213#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161214 __table_.rehash(__n);
1215}
1216
1217template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281218inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161219unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1220 const allocator_type& __a)
1221 : __table_(__a)
1222{
Howard Hinnant39213642013-07-23 22:01:581223#if _LIBCPP_DEBUG_LEVEL >= 2
1224 __get_db()->__insert_c(this);
1225#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161226}
1227
1228template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1229template <class _InputIterator>
1230unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1231 _InputIterator __first, _InputIterator __last)
1232{
Howard Hinnant39213642013-07-23 22:01:581233#if _LIBCPP_DEBUG_LEVEL >= 2
1234 __get_db()->__insert_c(this);
1235#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161236 insert(__first, __last);
1237}
1238
1239template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1240template <class _InputIterator>
1241unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1242 _InputIterator __first, _InputIterator __last, size_type __n,
1243 const hasher& __hf, const key_equal& __eql)
1244 : __table_(__hf, __eql)
1245{
Howard Hinnant39213642013-07-23 22:01:581246#if _LIBCPP_DEBUG_LEVEL >= 2
1247 __get_db()->__insert_c(this);
1248#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161249 __table_.rehash(__n);
1250 insert(__first, __last);
1251}
1252
1253template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1254template <class _InputIterator>
1255unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1256 _InputIterator __first, _InputIterator __last, size_type __n,
1257 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1258 : __table_(__hf, __eql, __a)
1259{
Howard Hinnant39213642013-07-23 22:01:581260#if _LIBCPP_DEBUG_LEVEL >= 2
1261 __get_db()->__insert_c(this);
1262#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161263 __table_.rehash(__n);
1264 insert(__first, __last);
1265}
1266
1267template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1268unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1269 const unordered_map& __u)
1270 : __table_(__u.__table_)
1271{
Howard Hinnant39213642013-07-23 22:01:581272#if _LIBCPP_DEBUG_LEVEL >= 2
1273 __get_db()->__insert_c(this);
1274#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161275 __table_.rehash(__u.bucket_count());
1276 insert(__u.begin(), __u.end());
1277}
1278
1279template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1280unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1281 const unordered_map& __u, const allocator_type& __a)
1282 : __table_(__u.__table_, __a)
1283{
Howard Hinnant39213642013-07-23 22:01:581284#if _LIBCPP_DEBUG_LEVEL >= 2
1285 __get_db()->__insert_c(this);
1286#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161287 __table_.rehash(__u.bucket_count());
1288 insert(__u.begin(), __u.end());
1289}
1290
Howard Hinnant73d21a42010-09-04 23:28:191291#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161292
1293template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281294inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161295unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1296 unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241297 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191298 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161299{
Howard Hinnant39213642013-07-23 22:01:581300#if _LIBCPP_DEBUG_LEVEL >= 2
1301 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:421302 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:581303#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161304}
1305
1306template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1307unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1308 unordered_map&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:191309 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161310{
Howard Hinnant39213642013-07-23 22:01:581311#if _LIBCPP_DEBUG_LEVEL >= 2
1312 __get_db()->__insert_c(this);
1313#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161314 if (__a != __u.get_allocator())
1315 {
1316 iterator __i = __u.begin();
Eric Fiselier2960ae22016-02-11 11:59:441317 while (__u.size() != 0) {
1318 __table_.__emplace_unique(_VSTD::move(
1319 __u.__table_.remove((__i++).__i_)->__value_.__nc));
1320 }
Howard Hinnantbc8d3f92010-05-11 19:42:161321 }
Howard Hinnantf890d9b2013-07-30 21:04:421322#if _LIBCPP_DEBUG_LEVEL >= 2
1323 else
1324 __get_db()->swap(this, &__u);
1325#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161326}
1327
Howard Hinnant73d21a42010-09-04 23:28:191328#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161329
Howard Hinnante3e32912011-08-12 21:56:021330#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1331
Howard Hinnantbc8d3f92010-05-11 19:42:161332template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1333unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1334 initializer_list<value_type> __il)
1335{
Howard Hinnant39213642013-07-23 22:01:581336#if _LIBCPP_DEBUG_LEVEL >= 2
1337 __get_db()->__insert_c(this);
1338#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161339 insert(__il.begin(), __il.end());
1340}
1341
1342template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1343unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1344 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1345 const key_equal& __eql)
1346 : __table_(__hf, __eql)
1347{
Howard Hinnant39213642013-07-23 22:01:581348#if _LIBCPP_DEBUG_LEVEL >= 2
1349 __get_db()->__insert_c(this);
1350#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161351 __table_.rehash(__n);
1352 insert(__il.begin(), __il.end());
1353}
1354
1355template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1356unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1357 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1358 const key_equal& __eql, const allocator_type& __a)
1359 : __table_(__hf, __eql, __a)
1360{
Howard Hinnant39213642013-07-23 22:01:581361#if _LIBCPP_DEBUG_LEVEL >= 2
1362 __get_db()->__insert_c(this);
1363#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161364 __table_.rehash(__n);
1365 insert(__il.begin(), __il.end());
1366}
1367
Howard Hinnante3e32912011-08-12 21:56:021368#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1369
Howard Hinnant73d21a42010-09-04 23:28:191370#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161371
1372template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281373inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161374unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1375unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241376 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161377{
Howard Hinnant0949eed2011-06-30 21:18:191378 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161379 return *this;
1380}
1381
Howard Hinnant73d21a42010-09-04 23:28:191382#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161383
Howard Hinnante3e32912011-08-12 21:56:021384#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1385
Howard Hinnantbc8d3f92010-05-11 19:42:161386template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281387inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161388unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1389unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1390 initializer_list<value_type> __il)
1391{
1392 __table_.__assign_unique(__il.begin(), __il.end());
1393 return *this;
1394}
1395
Howard Hinnante3e32912011-08-12 21:56:021396#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1397
Eric Fiselier410ed302016-02-11 21:45:531398#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161399template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1400typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
Howard Hinnantb66e1c32013-07-04 20:59:161401unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
Howard Hinnantbc8d3f92010-05-11 19:42:161402{
1403 __node_allocator& __na = __table_.__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501404 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Howard Hinnant7a6b7ce2013-06-22 15:21:291405 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
Howard Hinnantbc8d3f92010-05-11 19:42:161406 __h.get_deleter().__first_constructed = true;
Howard Hinnant7a6b7ce2013-06-22 15:21:291407 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
Howard Hinnantbc8d3f92010-05-11 19:42:161408 __h.get_deleter().__second_constructed = true;
Dimitry Andric89663502015-08-19 06:43:331409 return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
Howard Hinnantbc8d3f92010-05-11 19:42:161410}
Eric Fiselier410ed302016-02-11 21:45:531411#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161412
Howard Hinnantbc8d3f92010-05-11 19:42:161413template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1414template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:281415inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161416void
1417unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1418 _InputIterator __last)
1419{
1420 for (; __first != __last; ++__first)
1421 __table_.__insert_unique(*__first);
1422}
1423
Eric Fiselier410ed302016-02-11 21:45:531424#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161425template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1426_Tp&
1427unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1428{
1429 iterator __i = find(__k);
1430 if (__i != end())
1431 return __i->second;
Howard Hinnantb66e1c32013-07-04 20:59:161432 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnantbc8d3f92010-05-11 19:42:161433 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1434 __h.release();
1435 return __r.first->second;
1436}
Eric Fiselier410ed302016-02-11 21:45:531437#else
Howard Hinnantbc8d3f92010-05-11 19:42:161438
Eric Fiselier410ed302016-02-11 21:45:531439template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1440_Tp&
1441unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1442{
1443 return __table_.__emplace_unique_key_args(__k,
1444 std::piecewise_construct, std::forward_as_tuple(__k),
1445 std::forward_as_tuple()).first->__cc.second;
1446}
Howard Hinnantbc8d3f92010-05-11 19:42:161447
1448template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1449_Tp&
1450unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1451{
Eric Fiselier410ed302016-02-11 21:45:531452 return __table_.__emplace_unique_key_args(__k,
1453 std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1454 std::forward_as_tuple()).first->__cc.second;
Howard Hinnantbc8d3f92010-05-11 19:42:161455}
1456
Eric Fiselier410ed302016-02-11 21:45:531457#endif // !_LIBCPP_CXX03_MODE
Howard Hinnantbc8d3f92010-05-11 19:42:161458
1459template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1460_Tp&
1461unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1462{
1463 iterator __i = find(__k);
1464#ifndef _LIBCPP_NO_EXCEPTIONS
1465 if (__i == end())
1466 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431467#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161468 return __i->second;
1469}
1470
1471template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1472const _Tp&
1473unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1474{
1475 const_iterator __i = find(__k);
1476#ifndef _LIBCPP_NO_EXCEPTIONS
1477 if (__i == end())
1478 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431479#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161480 return __i->second;
1481}
1482
1483template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281484inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161485void
1486swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1487 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:241488 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161489{
1490 __x.swap(__y);
1491}
1492
1493template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1494bool
1495operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1496 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1497{
1498 if (__x.size() != __y.size())
1499 return false;
1500 typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1501 const_iterator;
1502 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1503 __i != __ex; ++__i)
1504 {
1505 const_iterator __j = __y.find(__i->first);
1506 if (__j == __ey || !(*__i == *__j))
1507 return false;
1508 }
1509 return true;
1510}
1511
1512template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281513inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161514bool
1515operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1516 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1517{
1518 return !(__x == __y);
1519}
1520
1521template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1522 class _Alloc = allocator<pair<const _Key, _Tp> > >
Howard Hinnant0f678bd2013-08-12 18:38:341523class _LIBCPP_TYPE_VIS_ONLY unordered_multimap
Howard Hinnantbc8d3f92010-05-11 19:42:161524{
1525public:
1526 // types
1527 typedef _Key key_type;
1528 typedef _Tp mapped_type;
1529 typedef _Hash hasher;
1530 typedef _Pred key_equal;
1531 typedef _Alloc allocator_type;
1532 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:291533 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161534 typedef value_type& reference;
1535 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:581536 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1537 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:161538
1539private:
Howard Hinnantff7546e2013-09-30 19:08:221540 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:001541 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
1542 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:381543 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1544 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161545
1546 typedef __hash_table<__value_type, __hasher,
1547 __key_equal, __allocator_type> __table;
1548
1549 __table __table_;
1550
Eric Fiselier2960ae22016-02-11 11:59:441551 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnantbc8d3f92010-05-11 19:42:161552 typedef typename __table::__node_traits __node_traits;
1553 typedef typename __table::__node_allocator __node_allocator;
1554 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:501555 typedef __hash_map_node_destructor<__node_allocator> _Dp;
1556 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:161557 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier774c7c52016-02-10 20:46:231558 static_assert((is_same<typename __node_traits::size_type,
1559 typename __alloc_traits::size_type>::value),
1560 "Allocator uses different size_type for different types");
Howard Hinnantbc8d3f92010-05-11 19:42:161561public:
1562 typedef typename __alloc_traits::pointer pointer;
1563 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier774c7c52016-02-10 20:46:231564 typedef typename __table::size_type size_type;
1565 typedef typename __table::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161566
1567 typedef __hash_map_iterator<typename __table::iterator> iterator;
1568 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1569 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1570 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1571
Howard Hinnantee6ccd02010-09-23 18:58:281572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241573 unordered_multimap()
1574 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:581575 {
1576#if _LIBCPP_DEBUG_LEVEL >= 2
1577 __get_db()->__insert_c(this);
1578#endif
1579 }
Howard Hinnantbc8d3f92010-05-11 19:42:161580 explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1581 const key_equal& __eql = key_equal());
1582 unordered_multimap(size_type __n, const hasher& __hf,
1583 const key_equal& __eql,
1584 const allocator_type& __a);
1585 template <class _InputIterator>
1586 unordered_multimap(_InputIterator __first, _InputIterator __last);
1587 template <class _InputIterator>
1588 unordered_multimap(_InputIterator __first, _InputIterator __last,
1589 size_type __n, const hasher& __hf = hasher(),
1590 const key_equal& __eql = key_equal());
1591 template <class _InputIterator>
1592 unordered_multimap(_InputIterator __first, _InputIterator __last,
1593 size_type __n, const hasher& __hf,
1594 const key_equal& __eql,
1595 const allocator_type& __a);
1596 explicit unordered_multimap(const allocator_type& __a);
1597 unordered_multimap(const unordered_multimap& __u);
1598 unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:191599#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:241600 unordered_multimap(unordered_multimap&& __u)
1601 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161602 unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:191603#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:021604#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161605 unordered_multimap(initializer_list<value_type> __il);
1606 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1607 const hasher& __hf = hasher(),
1608 const key_equal& __eql = key_equal());
1609 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1610 const hasher& __hf, const key_equal& __eql,
1611 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:021612#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow6dff6182013-09-12 03:00:311613#if _LIBCPP_STD_VER > 11
1614 _LIBCPP_INLINE_VISIBILITY
1615 unordered_multimap(size_type __n, const allocator_type& __a)
1616 : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1617 _LIBCPP_INLINE_VISIBILITY
1618 unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1619 : unordered_multimap(__n, __hf, key_equal(), __a) {}
1620 template <class _InputIterator>
1621 _LIBCPP_INLINE_VISIBILITY
1622 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1623 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1624 template <class _InputIterator>
1625 _LIBCPP_INLINE_VISIBILITY
1626 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
1627 const allocator_type& __a)
1628 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1629 _LIBCPP_INLINE_VISIBILITY
1630 unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1631 : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1632 _LIBCPP_INLINE_VISIBILITY
1633 unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1634 const allocator_type& __a)
1635 : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1636#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161637 // ~unordered_multimap() = default;
Howard Hinnant61aa6012011-07-01 19:24:361638 _LIBCPP_INLINE_VISIBILITY
1639 unordered_multimap& operator=(const unordered_multimap& __u)
1640 {
Howard Hinnant7a6b7ce2013-06-22 15:21:291641#if __cplusplus >= 201103L
Howard Hinnant61aa6012011-07-01 19:24:361642 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:291643#else
Marshall Clowebfc50e2014-02-08 04:03:141644 if (this != &__u) {
1645 __table_.clear();
1646 __table_.hash_function() = __u.__table_.hash_function();
1647 __table_.key_eq() = __u.__table_.key_eq();
1648 __table_.max_load_factor() = __u.__table_.max_load_factor();
1649 __table_.__copy_assign_alloc(__u.__table_);
1650 insert(__u.begin(), __u.end());
1651 }
Howard Hinnant7a6b7ce2013-06-22 15:21:291652#endif
Howard Hinnant61aa6012011-07-01 19:24:361653 return *this;
1654 }
Howard Hinnant73d21a42010-09-04 23:28:191655#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant5f2f14c2011-06-04 18:54:241656 unordered_multimap& operator=(unordered_multimap&& __u)
1657 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161658#endif
Howard Hinnante3e32912011-08-12 21:56:021659#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161660 unordered_multimap& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:021661#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161662
Howard Hinnantee6ccd02010-09-23 18:58:281663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241664 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161665 {return allocator_type(__table_.__node_alloc());}
1666
Howard Hinnantee6ccd02010-09-23 18:58:281667 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241668 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:281669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241670 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:281671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241672 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:161673
Howard Hinnantee6ccd02010-09-23 18:58:281674 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241675 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281676 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241677 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241679 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241681 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281682 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241683 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241685 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:161686
Eric Fiselier2960ae22016-02-11 11:59:441687#ifndef _LIBCPP_CXX03_LANG
1688 template <class... _Args>
1689 iterator emplace(_Args&&... __args) {
1690 return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1691 }
Howard Hinnant73d21a42010-09-04 23:28:191692
Howard Hinnant635ce1d2012-05-25 22:04:211693 template <class... _Args>
Eric Fiselier2960ae22016-02-11 11:59:441694 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1695 return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1696 }
1697#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161698
Howard Hinnantee6ccd02010-09-23 18:58:281699 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161700 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Howard Hinnant73d21a42010-09-04 23:28:191701#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:501702 template <class _Pp,
1703 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:281704 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:501705 iterator insert(_Pp&& __x)
1706 {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:191707#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:281708 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161709 iterator insert(const_iterator __p, const value_type& __x)
1710 {return __table_.__insert_multi(__p.__i_, __x);}
Howard Hinnant73d21a42010-09-04 23:28:191711#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant99968442011-11-29 18:15:501712 template <class _Pp,
1713 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnantee6ccd02010-09-23 18:58:281714 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant99968442011-11-29 18:15:501715 iterator insert(const_iterator __p, _Pp&& __x)
1716 {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
Howard Hinnant73d21a42010-09-04 23:28:191717#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161718 template <class _InputIterator>
1719 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021720#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:281721 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161722 void insert(initializer_list<value_type> __il)
1723 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021724#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161725
Howard Hinnantee6ccd02010-09-23 18:58:281726 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161727 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281728 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001729 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1730 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161731 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281732 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161733 iterator erase(const_iterator __first, const_iterator __last)
1734 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281735 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241736 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161737
Howard Hinnantee6ccd02010-09-23 18:58:281738 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241739 void swap(unordered_multimap& __u)
1740 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1741 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161742
Howard Hinnantee6ccd02010-09-23 18:58:281743 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161744 hasher hash_function() const
1745 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281746 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161747 key_equal key_eq() const
1748 {return __table_.key_eq().key_eq();}
1749
Howard Hinnantee6ccd02010-09-23 18:58:281750 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161751 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281752 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161753 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281754 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161755 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281756 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161757 pair<iterator, iterator> equal_range(const key_type& __k)
1758 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281759 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161760 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1761 {return __table_.__equal_range_multi(__k);}
1762
Howard Hinnantee6ccd02010-09-23 18:58:281763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241764 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241766 size_type max_bucket_count() const _NOEXCEPT
1767 {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161768
Howard Hinnantee6ccd02010-09-23 18:58:281769 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161770 size_type bucket_size(size_type __n) const
1771 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281772 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161773 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1774
Howard Hinnantee6ccd02010-09-23 18:58:281775 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161776 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281777 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161778 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281779 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161780 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281781 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161782 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281783 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161784 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161786 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1787
Howard Hinnantee6ccd02010-09-23 18:58:281788 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241789 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241791 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281792 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161793 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281794 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161795 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281796 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161797 void reserve(size_type __n) {__table_.reserve(__n);}
1798
Howard Hinnant39213642013-07-23 22:01:581799#if _LIBCPP_DEBUG_LEVEL >= 2
1800
1801 bool __dereferenceable(const const_iterator* __i) const
1802 {return __table_.__dereferenceable(&__i->__i_);}
1803 bool __decrementable(const const_iterator* __i) const
1804 {return __table_.__decrementable(&__i->__i_);}
1805 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1806 {return __table_.__addable(&__i->__i_, __n);}
1807 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1808 {return __table_.__addable(&__i->__i_, __n);}
1809
1810#endif // _LIBCPP_DEBUG_LEVEL >= 2
1811
Eric Fiselier2960ae22016-02-11 11:59:441812
Howard Hinnantbc8d3f92010-05-11 19:42:161813};
1814
1815template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1816unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1817 size_type __n, const hasher& __hf, const key_equal& __eql)
1818 : __table_(__hf, __eql)
1819{
Howard Hinnant39213642013-07-23 22:01:581820#if _LIBCPP_DEBUG_LEVEL >= 2
1821 __get_db()->__insert_c(this);
1822#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161823 __table_.rehash(__n);
1824}
1825
1826template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1827unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1828 size_type __n, const hasher& __hf, const key_equal& __eql,
1829 const allocator_type& __a)
1830 : __table_(__hf, __eql, __a)
1831{
Howard Hinnant39213642013-07-23 22:01:581832#if _LIBCPP_DEBUG_LEVEL >= 2
1833 __get_db()->__insert_c(this);
1834#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161835 __table_.rehash(__n);
1836}
1837
1838template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1839template <class _InputIterator>
1840unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1841 _InputIterator __first, _InputIterator __last)
1842{
Howard Hinnant39213642013-07-23 22:01:581843#if _LIBCPP_DEBUG_LEVEL >= 2
1844 __get_db()->__insert_c(this);
1845#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161846 insert(__first, __last);
1847}
1848
1849template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1850template <class _InputIterator>
1851unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1852 _InputIterator __first, _InputIterator __last, size_type __n,
1853 const hasher& __hf, const key_equal& __eql)
1854 : __table_(__hf, __eql)
1855{
Howard Hinnant39213642013-07-23 22:01:581856#if _LIBCPP_DEBUG_LEVEL >= 2
1857 __get_db()->__insert_c(this);
1858#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161859 __table_.rehash(__n);
1860 insert(__first, __last);
1861}
1862
1863template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1864template <class _InputIterator>
1865unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1866 _InputIterator __first, _InputIterator __last, size_type __n,
1867 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1868 : __table_(__hf, __eql, __a)
1869{
Howard Hinnant39213642013-07-23 22:01:581870#if _LIBCPP_DEBUG_LEVEL >= 2
1871 __get_db()->__insert_c(this);
1872#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161873 __table_.rehash(__n);
1874 insert(__first, __last);
1875}
1876
Howard Hinnantbc8d3f92010-05-11 19:42:161877template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281878inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161879unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1880 const allocator_type& __a)
1881 : __table_(__a)
1882{
Howard Hinnant39213642013-07-23 22:01:581883#if _LIBCPP_DEBUG_LEVEL >= 2
1884 __get_db()->__insert_c(this);
1885#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161886}
1887
1888template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1889unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1890 const unordered_multimap& __u)
1891 : __table_(__u.__table_)
1892{
Howard Hinnant39213642013-07-23 22:01:581893#if _LIBCPP_DEBUG_LEVEL >= 2
1894 __get_db()->__insert_c(this);
1895#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161896 __table_.rehash(__u.bucket_count());
1897 insert(__u.begin(), __u.end());
1898}
1899
1900template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1901unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1902 const unordered_multimap& __u, const allocator_type& __a)
1903 : __table_(__u.__table_, __a)
1904{
Howard Hinnant39213642013-07-23 22:01:581905#if _LIBCPP_DEBUG_LEVEL >= 2
1906 __get_db()->__insert_c(this);
1907#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161908 __table_.rehash(__u.bucket_count());
1909 insert(__u.begin(), __u.end());
1910}
1911
Howard Hinnant73d21a42010-09-04 23:28:191912#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161913
1914template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281915inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161916unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1917 unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241918 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191919 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161920{
Howard Hinnant39213642013-07-23 22:01:581921#if _LIBCPP_DEBUG_LEVEL >= 2
1922 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:421923 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:581924#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161925}
1926
1927template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1928unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1929 unordered_multimap&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:191930 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161931{
Howard Hinnant39213642013-07-23 22:01:581932#if _LIBCPP_DEBUG_LEVEL >= 2
1933 __get_db()->__insert_c(this);
1934#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161935 if (__a != __u.get_allocator())
1936 {
1937 iterator __i = __u.begin();
1938 while (__u.size() != 0)
Howard Hinnant39213642013-07-23 22:01:581939 {
Howard Hinnantbc8d3f92010-05-11 19:42:161940 __table_.__insert_multi(
Eric Fiselier2960ae22016-02-11 11:59:441941 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_.__nc)
Howard Hinnantbc8d3f92010-05-11 19:42:161942 );
Howard Hinnant39213642013-07-23 22:01:581943 }
Howard Hinnantbc8d3f92010-05-11 19:42:161944 }
Howard Hinnantf890d9b2013-07-30 21:04:421945#if _LIBCPP_DEBUG_LEVEL >= 2
1946 else
1947 __get_db()->swap(this, &__u);
1948#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161949}
1950
Howard Hinnant73d21a42010-09-04 23:28:191951#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161952
Howard Hinnante3e32912011-08-12 21:56:021953#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1954
Howard Hinnantbc8d3f92010-05-11 19:42:161955template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1956unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1957 initializer_list<value_type> __il)
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 insert(__il.begin(), __il.end());
1963}
1964
1965template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1966unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1967 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1968 const key_equal& __eql)
1969 : __table_(__hf, __eql)
1970{
Howard Hinnant39213642013-07-23 22:01:581971#if _LIBCPP_DEBUG_LEVEL >= 2
1972 __get_db()->__insert_c(this);
1973#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161974 __table_.rehash(__n);
1975 insert(__il.begin(), __il.end());
1976}
1977
1978template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1979unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1980 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1981 const key_equal& __eql, const allocator_type& __a)
1982 : __table_(__hf, __eql, __a)
1983{
Howard Hinnant39213642013-07-23 22:01:581984#if _LIBCPP_DEBUG_LEVEL >= 2
1985 __get_db()->__insert_c(this);
1986#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161987 __table_.rehash(__n);
1988 insert(__il.begin(), __il.end());
1989}
1990
Howard Hinnante3e32912011-08-12 21:56:021991#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1992
Howard Hinnant73d21a42010-09-04 23:28:191993#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161994
1995template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281996inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161997unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
1998unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241999 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:162000{
Howard Hinnant0949eed2011-06-30 21:18:192001 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:162002 return *this;
2003}
2004
Howard Hinnant73d21a42010-09-04 23:28:192005#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162006
Howard Hinnante3e32912011-08-12 21:56:022007#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2008
Howard Hinnantbc8d3f92010-05-11 19:42:162009template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282010inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162011unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2012unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
2013 initializer_list<value_type> __il)
2014{
2015 __table_.__assign_multi(__il.begin(), __il.end());
2016 return *this;
2017}
2018
Howard Hinnante3e32912011-08-12 21:56:022019#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2020
Howard Hinnantbc8d3f92010-05-11 19:42:162021
Howard Hinnantbc8d3f92010-05-11 19:42:162022
2023template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2024template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:282025inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162026void
2027unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
2028 _InputIterator __last)
2029{
2030 for (; __first != __last; ++__first)
2031 __table_.__insert_multi(*__first);
2032}
2033
2034template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282035inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162036void
2037swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2038 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:242039 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:162040{
2041 __x.swap(__y);
2042}
2043
2044template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2045bool
2046operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2047 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2048{
2049 if (__x.size() != __y.size())
2050 return false;
2051 typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2052 const_iterator;
2053 typedef pair<const_iterator, const_iterator> _EqRng;
2054 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2055 {
2056 _EqRng __xeq = __x.equal_range(__i->first);
2057 _EqRng __yeq = __y.equal_range(__i->first);
Howard Hinnant0949eed2011-06-30 21:18:192058 if (_VSTD::distance(__xeq.first, __xeq.second) !=
2059 _VSTD::distance(__yeq.first, __yeq.second) ||
2060 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:162061 return false;
2062 __i = __xeq.second;
2063 }
2064 return true;
2065}
2066
2067template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282068inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162069bool
2070operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2071 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2072{
2073 return !(__x == __y);
2074}
2075
2076_LIBCPP_END_NAMESPACE_STD
2077
2078#endif // _LIBCPP_UNORDERED_MAP