blob: 0546c0e2f9f29c5f93880395fc6ef60e151e68ae [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 Fiseliereaf29202017-01-13 22:42:53382template <class _Key, class _Cp, class _Hash, bool _IsEmpty>
Howard Hinnantbc8d3f92010-05-11 19:42:16383class __unordered_map_hasher
384 : private _Hash
385{
Howard Hinnantbc8d3f92010-05-11 19:42:16386public:
Howard Hinnantee6ccd02010-09-23 18:58:28387 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24388 __unordered_map_hasher()
389 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
390 : _Hash() {}
Howard Hinnantee6ccd02010-09-23 18:58:28391 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24392 __unordered_map_hasher(const _Hash& __h)
393 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
394 : _Hash(__h) {}
Howard Hinnantee6ccd02010-09-23 18:58:28395 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24396 const _Hash& hash_function() const _NOEXCEPT {return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28397 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24398 size_t operator()(const _Cp& __x) const
Howard Hinnant9b128e02013-07-05 18:06:00399 {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24400 _LIBCPP_INLINE_VISIBILITY
401 size_t operator()(const _Key& __x) const
Howard Hinnantbc8d3f92010-05-11 19:42:16402 {return static_cast<const _Hash&>(*this)(__x);}
Marshall Clow7d914d12015-07-13 20:04:56403 void swap(__unordered_map_hasher&__y)
404 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
405 {
406 using _VSTD::swap;
Eric Fiselierdca3bcd2017-04-13 01:02:41407 swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
Marshall Clow7d914d12015-07-13 20:04:56408 }
Howard Hinnantbc8d3f92010-05-11 19:42:16409};
410
Howard Hinnant9b128e02013-07-05 18:06:00411template <class _Key, class _Cp, class _Hash>
412class __unordered_map_hasher<_Key, _Cp, _Hash, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16413{
414 _Hash __hash_;
Howard Hinnantbc8d3f92010-05-11 19:42:16415public:
Howard Hinnantee6ccd02010-09-23 18:58:28416 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24417 __unordered_map_hasher()
418 _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
419 : __hash_() {}
Howard Hinnantee6ccd02010-09-23 18:58:28420 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24421 __unordered_map_hasher(const _Hash& __h)
422 _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
423 : __hash_(__h) {}
Howard Hinnantee6ccd02010-09-23 18:58:28424 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24425 const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
Howard Hinnantee6ccd02010-09-23 18:58:28426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24427 size_t operator()(const _Cp& __x) const
Howard Hinnant9b128e02013-07-05 18:06:00428 {return __hash_(__x.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24429 _LIBCPP_INLINE_VISIBILITY
430 size_t operator()(const _Key& __x) const
Howard Hinnantbc8d3f92010-05-11 19:42:16431 {return __hash_(__x);}
Marshall Clow7d914d12015-07-13 20:04:56432 void swap(__unordered_map_hasher&__y)
433 _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
434 {
435 using _VSTD::swap;
436 swap(__hash_, __y.__hash_);
437 }
Howard Hinnantbc8d3f92010-05-11 19:42:16438};
439
Marshall Clow7d914d12015-07-13 20:04:56440template <class _Key, class _Cp, class _Hash, bool __b>
441inline _LIBCPP_INLINE_VISIBILITY
442void
443swap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
444 __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
445 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
446{
447 __x.swap(__y);
448}
449
Eric Fiseliereaf29202017-01-13 22:42:53450template <class _Key, class _Cp, class _Pred, bool _IsEmpty>
Howard Hinnantbc8d3f92010-05-11 19:42:16451class __unordered_map_equal
452 : private _Pred
453{
Howard Hinnantbc8d3f92010-05-11 19:42:16454public:
Howard Hinnantee6ccd02010-09-23 18:58:28455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24456 __unordered_map_equal()
457 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
458 : _Pred() {}
Howard Hinnantee6ccd02010-09-23 18:58:28459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24460 __unordered_map_equal(const _Pred& __p)
461 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
462 : _Pred(__p) {}
Howard Hinnantee6ccd02010-09-23 18:58:28463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24464 const _Pred& key_eq() const _NOEXCEPT {return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28465 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24466 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00467 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24468 _LIBCPP_INLINE_VISIBILITY
469 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00470 {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
Howard Hinnantf8880d02011-12-12 17:26:24471 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24472 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00473 {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
Marshall Clow7d914d12015-07-13 20:04:56474 void swap(__unordered_map_equal&__y)
475 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
476 {
477 using _VSTD::swap;
Eric Fiselierdca3bcd2017-04-13 01:02:41478 swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
Marshall Clow7d914d12015-07-13 20:04:56479 }
Howard Hinnantbc8d3f92010-05-11 19:42:16480};
481
Howard Hinnant9b128e02013-07-05 18:06:00482template <class _Key, class _Cp, class _Pred>
483class __unordered_map_equal<_Key, _Cp, _Pred, false>
Howard Hinnantbc8d3f92010-05-11 19:42:16484{
485 _Pred __pred_;
Howard Hinnantbc8d3f92010-05-11 19:42:16486public:
Howard Hinnantee6ccd02010-09-23 18:58:28487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24488 __unordered_map_equal()
489 _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
490 : __pred_() {}
Howard Hinnantee6ccd02010-09-23 18:58:28491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24492 __unordered_map_equal(const _Pred& __p)
493 _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
494 : __pred_(__p) {}
Howard Hinnantee6ccd02010-09-23 18:58:28495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24496 const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
Howard Hinnantee6ccd02010-09-23 18:58:28497 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24498 bool operator()(const _Cp& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00499 {return __pred_(__x.__cc.first, __y.__cc.first);}
Howard Hinnantf8880d02011-12-12 17:26:24500 _LIBCPP_INLINE_VISIBILITY
501 bool operator()(const _Cp& __x, const _Key& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00502 {return __pred_(__x.__cc.first, __y);}
Howard Hinnantf8880d02011-12-12 17:26:24503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8880d02011-12-12 17:26:24504 bool operator()(const _Key& __x, const _Cp& __y) const
Howard Hinnant9b128e02013-07-05 18:06:00505 {return __pred_(__x, __y.__cc.first);}
Marshall Clow7d914d12015-07-13 20:04:56506 void swap(__unordered_map_equal&__y)
507 _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
508 {
509 using _VSTD::swap;
510 swap(__pred_, __y.__pred_);
511 }
Howard Hinnantbc8d3f92010-05-11 19:42:16512};
513
Marshall Clow7d914d12015-07-13 20:04:56514template <class _Key, class _Cp, class _Pred, bool __b>
515inline _LIBCPP_INLINE_VISIBILITY
516void
517swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
518 __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
519 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
520{
521 __x.swap(__y);
522}
523
Howard Hinnantbc8d3f92010-05-11 19:42:16524template <class _Alloc>
525class __hash_map_node_destructor
526{
527 typedef _Alloc allocator_type;
528 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier774c7c52016-02-10 20:46:23529
Howard Hinnantbc8d3f92010-05-11 19:42:16530public:
Eric Fiselier774c7c52016-02-10 20:46:23531
532 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16533private:
Howard Hinnantbc8d3f92010-05-11 19:42:16534
535 allocator_type& __na_;
536
537 __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
538
539public:
540 bool __first_constructed;
541 bool __second_constructed;
542
Howard Hinnantee6ccd02010-09-23 18:58:28543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24544 explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16545 : __na_(__na),
546 __first_constructed(false),
547 __second_constructed(false)
548 {}
549
Eric Fiselier1ae14a32017-04-18 22:50:56550#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantee6ccd02010-09-23 18:58:28551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16552 __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
Howard Hinnant5f2f14c2011-06-04 18:54:24553 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16554 : __na_(__x.__na_),
555 __first_constructed(__x.__value_constructed),
556 __second_constructed(__x.__value_constructed)
557 {
558 __x.__value_constructed = false;
559 }
Eric Fiselier1ae14a32017-04-18 22:50:56560#else // _LIBCPP_CXX03_LANG
Howard Hinnantee6ccd02010-09-23 18:58:28561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16562 __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
563 : __na_(__x.__na_),
564 __first_constructed(__x.__value_constructed),
565 __second_constructed(__x.__value_constructed)
566 {
567 const_cast<bool&>(__x.__value_constructed) = false;
568 }
Eric Fiselier1ae14a32017-04-18 22:50:56569#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16570
Howard Hinnantee6ccd02010-09-23 18:58:28571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24572 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16573 {
574 if (__second_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29575 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
Howard Hinnantbc8d3f92010-05-11 19:42:16576 if (__first_constructed)
Howard Hinnant7a6b7ce2013-06-22 15:21:29577 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
Howard Hinnantbc8d3f92010-05-11 19:42:16578 if (__p)
579 __alloc_traits::deallocate(__na_, __p, 1);
580 }
581};
582
Eric Fiselier2960ae22016-02-11 11:59:44583#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantff7546e2013-09-30 19:08:22584template <class _Key, class _Tp>
585union __hash_value_type
586{
587 typedef _Key key_type;
588 typedef _Tp mapped_type;
589 typedef pair<const key_type, mapped_type> value_type;
590 typedef pair<key_type, mapped_type> __nc_value_type;
591
592 value_type __cc;
593 __nc_value_type __nc;
594
Howard Hinnantff7546e2013-09-30 19:08:22595 _LIBCPP_INLINE_VISIBILITY
596 __hash_value_type& operator=(const __hash_value_type& __v)
597 {__nc = __v.__cc; return *this;}
598
599 _LIBCPP_INLINE_VISIBILITY
600 __hash_value_type& operator=(__hash_value_type&& __v)
Marshall Clowcd137822015-05-06 12:11:22601 {__nc = _VSTD::move(__v.__nc); return *this;}
Howard Hinnantff7546e2013-09-30 19:08:22602
Eric Fiselier2960ae22016-02-11 11:59:44603 template <class _ValueTp,
604 class = typename enable_if<
605 __is_same_uncvref<_ValueTp, value_type>::value
606 >::type
607 >
Howard Hinnantff7546e2013-09-30 19:08:22608 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2960ae22016-02-11 11:59:44609 __hash_value_type& operator=(_ValueTp&& __v) {
610 __nc = _VSTD::forward<_ValueTp>(__v); return *this;
611 }
612
613private:
614 __hash_value_type(const __hash_value_type& __v) = delete;
615 __hash_value_type(__hash_value_type&& __v) = delete;
616 template <class ..._Args>
617 explicit __hash_value_type(_Args&& ...__args) = delete;
618
619 ~__hash_value_type() = delete;
Howard Hinnantff7546e2013-09-30 19:08:22620};
621
622#else
623
624template <class _Key, class _Tp>
625struct __hash_value_type
626{
627 typedef _Key key_type;
628 typedef _Tp mapped_type;
629 typedef pair<const key_type, mapped_type> value_type;
630
631 value_type __cc;
632
Eric Fiselier2960ae22016-02-11 11:59:44633private:
634 ~__hash_value_type();
Howard Hinnantff7546e2013-09-30 19:08:22635};
636
637#endif
638
Howard Hinnantbc8d3f92010-05-11 19:42:16639template <class _HashIterator>
Eric Fiselierc3589a82017-01-04 23:56:00640class _LIBCPP_TEMPLATE_VIS __hash_map_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16641{
642 _HashIterator __i_;
643
Eric Fiselier774c7c52016-02-10 20:46:23644 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
645
Howard Hinnantbc8d3f92010-05-11 19:42:16646public:
647 typedef forward_iterator_tag iterator_category;
Eric Fiselier774c7c52016-02-10 20:46:23648 typedef typename _NodeTypes::__map_value_type value_type;
649 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16650 typedef value_type& reference;
Eric Fiselier774c7c52016-02-10 20:46:23651 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16652
Howard Hinnantee6ccd02010-09-23 18:58:28653 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24654 __hash_map_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16655
Howard Hinnantee6ccd02010-09-23 18:58:28656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24657 __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16658
Howard Hinnantee6ccd02010-09-23 18:58:28659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29660 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29662 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16663
Howard Hinnantee6ccd02010-09-23 18:58:28664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16665 __hash_map_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28666 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16667 __hash_map_iterator operator++(int)
668 {
669 __hash_map_iterator __t(*this);
670 ++(*this);
671 return __t;
672 }
673
Howard Hinnantee6ccd02010-09-23 18:58:28674 friend _LIBCPP_INLINE_VISIBILITY
675 bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16676 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28677 friend _LIBCPP_INLINE_VISIBILITY
678 bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16679 {return __x.__i_ != __y.__i_;}
680
Eric Fiselierc3589a82017-01-04 23:56:00681 template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
682 template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
683 template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
684 template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
685 template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16686};
687
688template <class _HashIterator>
Eric Fiselierc3589a82017-01-04 23:56:00689class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16690{
691 _HashIterator __i_;
692
Eric Fiselier774c7c52016-02-10 20:46:23693 typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
694
Howard Hinnantbc8d3f92010-05-11 19:42:16695public:
696 typedef forward_iterator_tag iterator_category;
Eric Fiselier774c7c52016-02-10 20:46:23697 typedef typename _NodeTypes::__map_value_type value_type;
698 typedef typename _NodeTypes::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16699 typedef const value_type& reference;
Eric Fiselier774c7c52016-02-10 20:46:23700 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16701
Howard Hinnantee6ccd02010-09-23 18:58:28702 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24703 __hash_map_const_iterator() _NOEXCEPT {}
Howard Hinnantbc8d3f92010-05-11 19:42:16704
Howard Hinnantee6ccd02010-09-23 18:58:28705 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24706 __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantee6ccd02010-09-23 18:58:28707 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16708 __hash_map_const_iterator(
709 __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
Howard Hinnant5f2f14c2011-06-04 18:54:24710 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16711 : __i_(__i.__i_) {}
712
Howard Hinnantee6ccd02010-09-23 18:58:28713 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29714 reference operator*() const {return __i_->__cc;}
Howard Hinnantee6ccd02010-09-23 18:58:28715 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a6b7ce2013-06-22 15:21:29716 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
Howard Hinnantbc8d3f92010-05-11 19:42:16717
Howard Hinnantee6ccd02010-09-23 18:58:28718 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16719 __hash_map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnantee6ccd02010-09-23 18:58:28720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16721 __hash_map_const_iterator operator++(int)
722 {
723 __hash_map_const_iterator __t(*this);
724 ++(*this);
725 return __t;
726 }
727
Howard Hinnantee6ccd02010-09-23 18:58:28728 friend _LIBCPP_INLINE_VISIBILITY
729 bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16730 {return __x.__i_ == __y.__i_;}
Howard Hinnantee6ccd02010-09-23 18:58:28731 friend _LIBCPP_INLINE_VISIBILITY
732 bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16733 {return __x.__i_ != __y.__i_;}
734
Eric Fiselierc3589a82017-01-04 23:56:00735 template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
736 template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
737 template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
738 template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16739};
740
741template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
742 class _Alloc = allocator<pair<const _Key, _Tp> > >
Eric Fiselierc3589a82017-01-04 23:56:00743class _LIBCPP_TEMPLATE_VIS unordered_map
Howard Hinnantbc8d3f92010-05-11 19:42:16744{
745public:
746 // types
747 typedef _Key key_type;
748 typedef _Tp mapped_type;
749 typedef _Hash hasher;
750 typedef _Pred key_equal;
751 typedef _Alloc allocator_type;
752 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:29753 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16754 typedef value_type& reference;
755 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:58756 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
757 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16758
759private:
Howard Hinnantff7546e2013-09-30 19:08:22760 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:00761 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
762 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:38763 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
764 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16765
766 typedef __hash_table<__value_type, __hasher,
767 __key_equal, __allocator_type> __table;
768
769 __table __table_;
770
Eric Fiselier2960ae22016-02-11 11:59:44771 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnantbc8d3f92010-05-11 19:42:16772 typedef typename __table::__node_pointer __node_pointer;
773 typedef typename __table::__node_const_pointer __node_const_pointer;
774 typedef typename __table::__node_traits __node_traits;
775 typedef typename __table::__node_allocator __node_allocator;
776 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:50777 typedef __hash_map_node_destructor<__node_allocator> _Dp;
778 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:16779 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier2960ae22016-02-11 11:59:44780
781 static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
782 static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
Howard Hinnantbc8d3f92010-05-11 19:42:16783public:
784 typedef typename __alloc_traits::pointer pointer;
785 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier774c7c52016-02-10 20:46:23786 typedef typename __table::size_type size_type;
787 typedef typename __table::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16788
789 typedef __hash_map_iterator<typename __table::iterator> iterator;
790 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
791 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
792 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
793
Howard Hinnantee6ccd02010-09-23 18:58:28794 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24795 unordered_map()
796 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58797 {
798#if _LIBCPP_DEBUG_LEVEL >= 2
799 __get_db()->__insert_c(this);
800#endif
801 }
Howard Hinnantbc8d3f92010-05-11 19:42:16802 explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
803 const key_equal& __eql = key_equal());
804 unordered_map(size_type __n, const hasher& __hf,
805 const key_equal& __eql,
806 const allocator_type& __a);
807 template <class _InputIterator>
808 unordered_map(_InputIterator __first, _InputIterator __last);
809 template <class _InputIterator>
810 unordered_map(_InputIterator __first, _InputIterator __last,
811 size_type __n, const hasher& __hf = hasher(),
812 const key_equal& __eql = key_equal());
813 template <class _InputIterator>
814 unordered_map(_InputIterator __first, _InputIterator __last,
815 size_type __n, const hasher& __hf,
816 const key_equal& __eql,
817 const allocator_type& __a);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55818 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16819 explicit unordered_map(const allocator_type& __a);
820 unordered_map(const unordered_map& __u);
821 unordered_map(const unordered_map& __u, const allocator_type& __a);
Eric Fiselier1ae14a32017-04-18 22:50:56822#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov9341a8a2016-04-22 01:04:55823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24824 unordered_map(unordered_map&& __u)
825 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16826 unordered_map(unordered_map&& __u, const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16827 unordered_map(initializer_list<value_type> __il);
828 unordered_map(initializer_list<value_type> __il, size_type __n,
829 const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
830 unordered_map(initializer_list<value_type> __il, size_type __n,
831 const hasher& __hf, const key_equal& __eql,
832 const allocator_type& __a);
Eric Fiselier1ae14a32017-04-18 22:50:56833#endif // _LIBCPP_CXX03_LANG
Marshall Clow6dff6182013-09-12 03:00:31834#if _LIBCPP_STD_VER > 11
835 _LIBCPP_INLINE_VISIBILITY
836 unordered_map(size_type __n, const allocator_type& __a)
837 : unordered_map(__n, hasher(), key_equal(), __a) {}
838 _LIBCPP_INLINE_VISIBILITY
839 unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
840 : unordered_map(__n, __hf, key_equal(), __a) {}
841 template <class _InputIterator>
842 _LIBCPP_INLINE_VISIBILITY
843 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
844 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
845 template <class _InputIterator>
846 _LIBCPP_INLINE_VISIBILITY
847 unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
848 const allocator_type& __a)
849 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
850 _LIBCPP_INLINE_VISIBILITY
851 unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
852 : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
853 _LIBCPP_INLINE_VISIBILITY
854 unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
855 const allocator_type& __a)
856 : unordered_map(__il, __n, __hf, key_equal(), __a) {}
857#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16858 // ~unordered_map() = default;
Howard Hinnant61aa6012011-07-01 19:24:36859 _LIBCPP_INLINE_VISIBILITY
860 unordered_map& operator=(const unordered_map& __u)
861 {
Marshall Clow3f013892016-07-18 13:19:00862#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant61aa6012011-07-01 19:24:36863 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:29864#else
Marshall Clowebfc50e2014-02-08 04:03:14865 if (this != &__u) {
866 __table_.clear();
867 __table_.hash_function() = __u.__table_.hash_function();
868 __table_.key_eq() = __u.__table_.key_eq();
869 __table_.max_load_factor() = __u.__table_.max_load_factor();
870 __table_.__copy_assign_alloc(__u.__table_);
871 insert(__u.begin(), __u.end());
872 }
Howard Hinnant7a6b7ce2013-06-22 15:21:29873#endif
Howard Hinnant61aa6012011-07-01 19:24:36874 return *this;
875 }
Eric Fiselier1ae14a32017-04-18 22:50:56876#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov9341a8a2016-04-22 01:04:55877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24878 unordered_map& operator=(unordered_map&& __u)
879 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16881 unordered_map& operator=(initializer_list<value_type> __il);
Eric Fiselier1ae14a32017-04-18 22:50:56882#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16883
Howard Hinnantee6ccd02010-09-23 18:58:28884 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24885 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16886 {return allocator_type(__table_.__node_alloc());}
887
Howard Hinnantee6ccd02010-09-23 18:58:28888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24889 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24891 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24893 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16894
Howard Hinnantee6ccd02010-09-23 18:58:28895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24896 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24898 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24900 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24902 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24904 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:24906 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16907
Eric Fiselier91a15652016-04-18 01:40:45908 _LIBCPP_INLINE_VISIBILITY
909 pair<iterator, bool> insert(const value_type& __x)
910 {return __table_.__insert_unique(__x);}
911
912 iterator insert(const_iterator __p, const value_type& __x) {
913#if _LIBCPP_DEBUG_LEVEL >= 2
914 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
915 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
916 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:52917#else
918 ((void)__p);
Eric Fiselier91a15652016-04-18 01:40:45919#endif
920 return insert(__x).first;
921 }
922
923 template <class _InputIterator>
Evgeniy Stepanov9341a8a2016-04-22 01:04:55924 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier91a15652016-04-18 01:40:45925 void insert(_InputIterator __first, _InputIterator __last);
926
Eric Fiselier1ae14a32017-04-18 22:50:56927#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier91a15652016-04-18 01:40:45928 _LIBCPP_INLINE_VISIBILITY
929 void insert(initializer_list<value_type> __il)
930 {insert(__il.begin(), __il.end());}
Eric Fiselier91a15652016-04-18 01:40:45931
Eric Fiselier91a15652016-04-18 01:40:45932 _LIBCPP_INLINE_VISIBILITY
933 pair<iterator, bool> insert(value_type&& __x)
934 {return __table_.__insert_unique(_VSTD::move(__x));}
935
936 iterator insert(const_iterator __p, value_type&& __x) {
937#if _LIBCPP_DEBUG_LEVEL >= 2
938 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
939 "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
940 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:52941#else
942 ((void)__p);
Eric Fiselier91a15652016-04-18 01:40:45943#endif
944 return __table_.__insert_unique(_VSTD::move(__x)).first;
945 }
946
947 template <class _Pp,
948 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
949 _LIBCPP_INLINE_VISIBILITY
950 pair<iterator, bool> insert(_Pp&& __x)
951 {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
952
953 template <class _Pp,
954 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
955 _LIBCPP_INLINE_VISIBILITY
956 iterator insert(const_iterator __p, _Pp&& __x)
957 {
958#if _LIBCPP_DEBUG_LEVEL >= 2
959 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
960 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
961 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:52962#else
963 ((void)__p);
Eric Fiselier91a15652016-04-18 01:40:45964#endif
965 return insert(_VSTD::forward<_Pp>(__x)).first;
966 }
967
Eric Fiselier2960ae22016-02-11 11:59:44968 template <class... _Args>
969 _LIBCPP_INLINE_VISIBILITY
970 pair<iterator, bool> emplace(_Args&&... __args) {
971 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
972 }
Howard Hinnant73d21a42010-09-04 23:28:19973
Howard Hinnant635ce1d2012-05-25 22:04:21974 template <class... _Args>
Eric Fiselier2960ae22016-02-11 11:59:44975 _LIBCPP_INLINE_VISIBILITY
976 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
Howard Hinnantf890d9b2013-07-30 21:04:42977#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier2960ae22016-02-11 11:59:44978 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
979 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
980 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:52981#else
982 ((void)__p);
Howard Hinnantf890d9b2013-07-30 21:04:42983#endif
Eric Fiselier2960ae22016-02-11 11:59:44984 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
985 }
986
Eric Fiselier91a15652016-04-18 01:40:45987#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16988
Marshall Clow0ce05a92015-07-07 05:45:35989#if _LIBCPP_STD_VER > 14
Marshall Clow0ce05a92015-07-07 05:45:35990 template <class... _Args>
991 _LIBCPP_INLINE_VISIBILITY
992 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
993 {
Eric Fiselier2e37f922016-04-18 06:51:33994 return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
995 _VSTD::forward_as_tuple(__k),
996 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow0ce05a92015-07-07 05:45:35997 }
998
999 template <class... _Args>
1000 _LIBCPP_INLINE_VISIBILITY
1001 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1002 {
Eric Fiselier2e37f922016-04-18 06:51:331003 return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
1004 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1005 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow0ce05a92015-07-07 05:45:351006 }
1007
1008 template <class... _Args>
1009 _LIBCPP_INLINE_VISIBILITY
1010 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1011 {
Eric Fiselier2e37f922016-04-18 06:51:331012#if _LIBCPP_DEBUG_LEVEL >= 2
Oleg Ranevskyy3ba3ad42016-09-26 21:39:381013 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
Eric Fiselier2e37f922016-04-18 06:51:331014 "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1015 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:521016#else
1017 ((void)__h);
Eric Fiselier2e37f922016-04-18 06:51:331018#endif
Eric Fiselier0e5ebbc2016-12-23 23:37:521019 return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
Marshall Clow0ce05a92015-07-07 05:45:351020 }
1021
1022 template <class... _Args>
1023 _LIBCPP_INLINE_VISIBILITY
1024 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1025 {
Eric Fiselier2e37f922016-04-18 06:51:331026#if _LIBCPP_DEBUG_LEVEL >= 2
Oleg Ranevskyy3ba3ad42016-09-26 21:39:381027 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
Eric Fiselier2e37f922016-04-18 06:51:331028 "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1029 " referring to this unordered_map");
Eric Fiselier0e5ebbc2016-12-23 23:37:521030#else
1031 ((void)__h);
Eric Fiselier2e37f922016-04-18 06:51:331032#endif
1033 return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
Marshall Clow0ce05a92015-07-07 05:45:351034 }
1035
1036 template <class _Vp>
1037 _LIBCPP_INLINE_VISIBILITY
1038 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1039 {
Eric Fiselier2e37f922016-04-18 06:51:331040 pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1041 __k, _VSTD::forward<_Vp>(__v));
1042 if (!__res.second) {
1043 __res.first->second = _VSTD::forward<_Vp>(__v);
Marshall Clow0ce05a92015-07-07 05:45:351044 }
Eric Fiselier2e37f922016-04-18 06:51:331045 return __res;
Marshall Clow0ce05a92015-07-07 05:45:351046 }
Eric Fiselier2e37f922016-04-18 06:51:331047
Marshall Clow0ce05a92015-07-07 05:45:351048 template <class _Vp>
1049 _LIBCPP_INLINE_VISIBILITY
1050 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1051 {
Eric Fiselier2e37f922016-04-18 06:51:331052 pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1053 _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1054 if (!__res.second) {
1055 __res.first->second = _VSTD::forward<_Vp>(__v);
Marshall Clow0ce05a92015-07-07 05:45:351056 }
Eric Fiselier2e37f922016-04-18 06:51:331057 return __res;
Marshall Clow0ce05a92015-07-07 05:45:351058 }
1059
1060 template <class _Vp>
1061 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier0e5ebbc2016-12-23 23:37:521062 iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
Marshall Clow0ce05a92015-07-07 05:45:351063 {
Eric Fiselier0e5ebbc2016-12-23 23:37:521064 // FIXME: Add debug mode checking for the iterator input
Eric Fiselier2e37f922016-04-18 06:51:331065 return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
Marshall Clow0ce05a92015-07-07 05:45:351066 }
1067
1068 template <class _Vp>
1069 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier0e5ebbc2016-12-23 23:37:521070 iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
Marshall Clow0ce05a92015-07-07 05:45:351071 {
Eric Fiselier0e5ebbc2016-12-23 23:37:521072 // FIXME: Add debug mode checking for the iterator input
Eric Fiselier2e37f922016-04-18 06:51:331073 return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
Marshall Clow0ce05a92015-07-07 05:45:351074 }
Eric Fiselier1ae14a32017-04-18 22:50:561075#endif // _LIBCPP_STD_VER > 14
Marshall Clow0ce05a92015-07-07 05:45:351076
Howard Hinnantee6ccd02010-09-23 18:58:281077 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161078 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281079 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001080 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1081 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161082 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281083 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161084 iterator erase(const_iterator __first, const_iterator __last)
1085 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241087 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161088
Howard Hinnantee6ccd02010-09-23 18:58:281089 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241090 void swap(unordered_map& __u)
1091 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
Eric Fiselier47257c42016-12-28 05:53:011092 { __table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161093
Howard Hinnantee6ccd02010-09-23 18:58:281094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161095 hasher hash_function() const
1096 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281097 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161098 key_equal key_eq() const
1099 {return __table_.key_eq().key_eq();}
1100
Howard Hinnantee6ccd02010-09-23 18:58:281101 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161102 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161104 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161106 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161108 pair<iterator, iterator> equal_range(const key_type& __k)
1109 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281110 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161111 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1112 {return __table_.__equal_range_unique(__k);}
1113
1114 mapped_type& operator[](const key_type& __k);
Eric Fiselier410ed302016-02-11 21:45:531115#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161116 mapped_type& operator[](key_type&& __k);
1117#endif
1118
1119 mapped_type& at(const key_type& __k);
1120 const mapped_type& at(const key_type& __k) const;
1121
Howard Hinnantee6ccd02010-09-23 18:58:281122 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241123 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241125 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161126
Howard Hinnantee6ccd02010-09-23 18:58:281127 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161128 size_type bucket_size(size_type __n) const
1129 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281130 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161131 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1132
Howard Hinnantee6ccd02010-09-23 18:58:281133 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161134 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281135 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161136 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161138 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281139 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161140 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281141 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161142 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161144 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1145
Howard Hinnantee6ccd02010-09-23 18:58:281146 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241147 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281148 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241149 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281150 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161151 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281152 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161153 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281154 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161155 void reserve(size_type __n) {__table_.reserve(__n);}
1156
Howard Hinnant39213642013-07-23 22:01:581157#if _LIBCPP_DEBUG_LEVEL >= 2
1158
1159 bool __dereferenceable(const const_iterator* __i) const
1160 {return __table_.__dereferenceable(&__i->__i_);}
1161 bool __decrementable(const const_iterator* __i) const
1162 {return __table_.__decrementable(&__i->__i_);}
1163 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1164 {return __table_.__addable(&__i->__i_, __n);}
1165 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1166 {return __table_.__addable(&__i->__i_, __n);}
1167
1168#endif // _LIBCPP_DEBUG_LEVEL >= 2
1169
Howard Hinnantbc8d3f92010-05-11 19:42:161170private:
Eric Fiselier410ed302016-02-11 21:45:531171
1172#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantb66e1c32013-07-04 20:59:161173 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselier410ed302016-02-11 21:45:531174#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161175};
1176
1177template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1178unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1179 size_type __n, const hasher& __hf, const key_equal& __eql)
1180 : __table_(__hf, __eql)
1181{
Howard Hinnant39213642013-07-23 22:01:581182#if _LIBCPP_DEBUG_LEVEL >= 2
1183 __get_db()->__insert_c(this);
1184#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161185 __table_.rehash(__n);
1186}
1187
1188template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1189unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1190 size_type __n, const hasher& __hf, const key_equal& __eql,
1191 const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401192 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161193{
Howard Hinnant39213642013-07-23 22:01:581194#if _LIBCPP_DEBUG_LEVEL >= 2
1195 __get_db()->__insert_c(this);
1196#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161197 __table_.rehash(__n);
1198}
1199
1200template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551201inline
Howard Hinnantbc8d3f92010-05-11 19:42:161202unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1203 const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401204 : __table_(typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161205{
Howard Hinnant39213642013-07-23 22:01:581206#if _LIBCPP_DEBUG_LEVEL >= 2
1207 __get_db()->__insert_c(this);
1208#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161209}
1210
1211template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1212template <class _InputIterator>
1213unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1214 _InputIterator __first, _InputIterator __last)
1215{
Howard Hinnant39213642013-07-23 22:01:581216#if _LIBCPP_DEBUG_LEVEL >= 2
1217 __get_db()->__insert_c(this);
1218#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161219 insert(__first, __last);
1220}
1221
1222template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1223template <class _InputIterator>
1224unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1225 _InputIterator __first, _InputIterator __last, size_type __n,
1226 const hasher& __hf, const key_equal& __eql)
1227 : __table_(__hf, __eql)
1228{
Howard Hinnant39213642013-07-23 22:01:581229#if _LIBCPP_DEBUG_LEVEL >= 2
1230 __get_db()->__insert_c(this);
1231#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161232 __table_.rehash(__n);
1233 insert(__first, __last);
1234}
1235
1236template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1237template <class _InputIterator>
1238unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1239 _InputIterator __first, _InputIterator __last, size_type __n,
1240 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401241 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161242{
Howard Hinnant39213642013-07-23 22:01:581243#if _LIBCPP_DEBUG_LEVEL >= 2
1244 __get_db()->__insert_c(this);
1245#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161246 __table_.rehash(__n);
1247 insert(__first, __last);
1248}
1249
1250template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1251unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1252 const unordered_map& __u)
1253 : __table_(__u.__table_)
1254{
Howard Hinnant39213642013-07-23 22:01:581255#if _LIBCPP_DEBUG_LEVEL >= 2
1256 __get_db()->__insert_c(this);
1257#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161258 __table_.rehash(__u.bucket_count());
1259 insert(__u.begin(), __u.end());
1260}
1261
1262template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1263unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1264 const unordered_map& __u, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401265 : __table_(__u.__table_, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161266{
Howard Hinnant39213642013-07-23 22:01:581267#if _LIBCPP_DEBUG_LEVEL >= 2
1268 __get_db()->__insert_c(this);
1269#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161270 __table_.rehash(__u.bucket_count());
1271 insert(__u.begin(), __u.end());
1272}
1273
Eric Fiselier1ae14a32017-04-18 22:50:561274#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161275
1276template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551277inline
Howard Hinnantbc8d3f92010-05-11 19:42:161278unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1279 unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241280 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191281 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161282{
Howard Hinnant39213642013-07-23 22:01:581283#if _LIBCPP_DEBUG_LEVEL >= 2
1284 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:421285 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:581286#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161287}
1288
1289template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1290unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1291 unordered_map&& __u, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401292 : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161293{
Howard Hinnant39213642013-07-23 22:01:581294#if _LIBCPP_DEBUG_LEVEL >= 2
1295 __get_db()->__insert_c(this);
1296#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161297 if (__a != __u.get_allocator())
1298 {
1299 iterator __i = __u.begin();
Eric Fiselier2960ae22016-02-11 11:59:441300 while (__u.size() != 0) {
1301 __table_.__emplace_unique(_VSTD::move(
1302 __u.__table_.remove((__i++).__i_)->__value_.__nc));
1303 }
Howard Hinnantbc8d3f92010-05-11 19:42:161304 }
Howard Hinnantf890d9b2013-07-30 21:04:421305#if _LIBCPP_DEBUG_LEVEL >= 2
1306 else
1307 __get_db()->swap(this, &__u);
1308#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161309}
1310
Howard Hinnantbc8d3f92010-05-11 19:42:161311template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1312unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1313 initializer_list<value_type> __il)
1314{
Howard Hinnant39213642013-07-23 22:01:581315#if _LIBCPP_DEBUG_LEVEL >= 2
1316 __get_db()->__insert_c(this);
1317#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161318 insert(__il.begin(), __il.end());
1319}
1320
1321template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1322unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1323 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1324 const key_equal& __eql)
1325 : __table_(__hf, __eql)
1326{
Howard Hinnant39213642013-07-23 22:01:581327#if _LIBCPP_DEBUG_LEVEL >= 2
1328 __get_db()->__insert_c(this);
1329#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161330 __table_.rehash(__n);
1331 insert(__il.begin(), __il.end());
1332}
1333
1334template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1335unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1336 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1337 const key_equal& __eql, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401338 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161339{
Howard Hinnant39213642013-07-23 22:01:581340#if _LIBCPP_DEBUG_LEVEL >= 2
1341 __get_db()->__insert_c(this);
1342#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161343 __table_.rehash(__n);
1344 insert(__il.begin(), __il.end());
1345}
1346
Howard Hinnantbc8d3f92010-05-11 19:42:161347template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551348inline
Howard Hinnantbc8d3f92010-05-11 19:42:161349unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1350unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241351 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161352{
Howard Hinnant0949eed2011-06-30 21:18:191353 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161354 return *this;
1355}
1356
Howard Hinnantbc8d3f92010-05-11 19:42:161357template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551358inline
Howard Hinnantbc8d3f92010-05-11 19:42:161359unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1360unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1361 initializer_list<value_type> __il)
1362{
1363 __table_.__assign_unique(__il.begin(), __il.end());
1364 return *this;
1365}
1366
Eric Fiselier1ae14a32017-04-18 22:50:561367#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161368
Howard Hinnantbc8d3f92010-05-11 19:42:161369template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1370template <class _InputIterator>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551371inline
Howard Hinnantbc8d3f92010-05-11 19:42:161372void
1373unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1374 _InputIterator __last)
1375{
1376 for (; __first != __last; ++__first)
1377 __table_.__insert_unique(*__first);
1378}
1379
Eric Fiselier1ae14a32017-04-18 22:50:561380#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161381
Eric Fiselier410ed302016-02-11 21:45:531382template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1383_Tp&
1384unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1385{
1386 return __table_.__emplace_unique_key_args(__k,
1387 std::piecewise_construct, std::forward_as_tuple(__k),
1388 std::forward_as_tuple()).first->__cc.second;
1389}
Howard Hinnantbc8d3f92010-05-11 19:42:161390
1391template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1392_Tp&
1393unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1394{
Eric Fiselier410ed302016-02-11 21:45:531395 return __table_.__emplace_unique_key_args(__k,
1396 std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1397 std::forward_as_tuple()).first->__cc.second;
Howard Hinnantbc8d3f92010-05-11 19:42:161398}
Eric Fiselier1ae14a32017-04-18 22:50:561399#else // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161400
Eric Fiselier1ae14a32017-04-18 22:50:561401template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1402typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1403unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
1404{
1405 __node_allocator& __na = __table_.__node_alloc();
1406 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1407 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
1408 __h.get_deleter().__first_constructed = true;
1409 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
1410 __h.get_deleter().__second_constructed = true;
1411 return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
1412}
1413
1414template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1415_Tp&
1416unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1417{
1418 iterator __i = find(__k);
1419 if (__i != end())
1420 return __i->second;
1421 __node_holder __h = __construct_node_with_key(__k);
1422 pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1423 __h.release();
1424 return __r.first->second;
1425}
1426
1427#endif // _LIBCPP_CXX03_MODE
Howard Hinnantbc8d3f92010-05-11 19:42:161428
1429template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1430_Tp&
1431unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1432{
1433 iterator __i = find(__k);
1434#ifndef _LIBCPP_NO_EXCEPTIONS
1435 if (__i == end())
1436 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431437#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161438 return __i->second;
1439}
1440
1441template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1442const _Tp&
1443unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1444{
1445 const_iterator __i = find(__k);
1446#ifndef _LIBCPP_NO_EXCEPTIONS
1447 if (__i == end())
1448 throw out_of_range("unordered_map::at: key not found");
Howard Hinnant324bb032010-08-22 00:02:431449#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161450 return __i->second;
1451}
1452
1453template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281454inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161455void
1456swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1457 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:241458 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161459{
1460 __x.swap(__y);
1461}
1462
1463template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1464bool
1465operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1466 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1467{
1468 if (__x.size() != __y.size())
1469 return false;
1470 typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1471 const_iterator;
1472 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1473 __i != __ex; ++__i)
1474 {
1475 const_iterator __j = __y.find(__i->first);
1476 if (__j == __ey || !(*__i == *__j))
1477 return false;
1478 }
1479 return true;
1480}
1481
1482template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281483inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161484bool
1485operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1486 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1487{
1488 return !(__x == __y);
1489}
1490
1491template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1492 class _Alloc = allocator<pair<const _Key, _Tp> > >
Eric Fiselierc3589a82017-01-04 23:56:001493class _LIBCPP_TEMPLATE_VIS unordered_multimap
Howard Hinnantbc8d3f92010-05-11 19:42:161494{
1495public:
1496 // types
1497 typedef _Key key_type;
1498 typedef _Tp mapped_type;
1499 typedef _Hash hasher;
1500 typedef _Pred key_equal;
1501 typedef _Alloc allocator_type;
1502 typedef pair<const key_type, mapped_type> value_type;
Howard Hinnant7a6b7ce2013-06-22 15:21:291503 typedef pair<key_type, mapped_type> __nc_value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161504 typedef value_type& reference;
1505 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:581506 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1507 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:161508
1509private:
Howard Hinnantff7546e2013-09-30 19:08:221510 typedef __hash_value_type<key_type, mapped_type> __value_type;
Howard Hinnant9b128e02013-07-05 18:06:001511 typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher;
1512 typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
Marshall Clow66302c62015-04-07 05:21:381513 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1514 __value_type>::type __allocator_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161515
1516 typedef __hash_table<__value_type, __hasher,
1517 __key_equal, __allocator_type> __table;
1518
1519 __table __table_;
1520
Eric Fiselier2960ae22016-02-11 11:59:441521 typedef typename __table::_NodeTypes _NodeTypes;
Howard Hinnantbc8d3f92010-05-11 19:42:161522 typedef typename __table::__node_traits __node_traits;
1523 typedef typename __table::__node_allocator __node_allocator;
1524 typedef typename __table::__node __node;
Howard Hinnant99968442011-11-29 18:15:501525 typedef __hash_map_node_destructor<__node_allocator> _Dp;
1526 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantbc8d3f92010-05-11 19:42:161527 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiselier774c7c52016-02-10 20:46:231528 static_assert((is_same<typename __node_traits::size_type,
1529 typename __alloc_traits::size_type>::value),
1530 "Allocator uses different size_type for different types");
Howard Hinnantbc8d3f92010-05-11 19:42:161531public:
1532 typedef typename __alloc_traits::pointer pointer;
1533 typedef typename __alloc_traits::const_pointer const_pointer;
Eric Fiselier774c7c52016-02-10 20:46:231534 typedef typename __table::size_type size_type;
1535 typedef typename __table::difference_type difference_type;
Howard Hinnantbc8d3f92010-05-11 19:42:161536
1537 typedef __hash_map_iterator<typename __table::iterator> iterator;
1538 typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1539 typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1540 typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1541
Howard Hinnantee6ccd02010-09-23 18:58:281542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241543 unordered_multimap()
1544 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:581545 {
1546#if _LIBCPP_DEBUG_LEVEL >= 2
1547 __get_db()->__insert_c(this);
1548#endif
1549 }
Howard Hinnantbc8d3f92010-05-11 19:42:161550 explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1551 const key_equal& __eql = key_equal());
1552 unordered_multimap(size_type __n, const hasher& __hf,
1553 const key_equal& __eql,
1554 const allocator_type& __a);
1555 template <class _InputIterator>
1556 unordered_multimap(_InputIterator __first, _InputIterator __last);
1557 template <class _InputIterator>
1558 unordered_multimap(_InputIterator __first, _InputIterator __last,
1559 size_type __n, const hasher& __hf = hasher(),
1560 const key_equal& __eql = key_equal());
1561 template <class _InputIterator>
1562 unordered_multimap(_InputIterator __first, _InputIterator __last,
1563 size_type __n, const hasher& __hf,
1564 const key_equal& __eql,
1565 const allocator_type& __a);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161567 explicit unordered_multimap(const allocator_type& __a);
1568 unordered_multimap(const unordered_multimap& __u);
1569 unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
Eric Fiselier1ae14a32017-04-18 22:50:561570#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov9341a8a2016-04-22 01:04:551571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241572 unordered_multimap(unordered_multimap&& __u)
1573 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161574 unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:161575 unordered_multimap(initializer_list<value_type> __il);
1576 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1577 const hasher& __hf = hasher(),
1578 const key_equal& __eql = key_equal());
1579 unordered_multimap(initializer_list<value_type> __il, size_type __n,
1580 const hasher& __hf, const key_equal& __eql,
1581 const allocator_type& __a);
Eric Fiselier1ae14a32017-04-18 22:50:561582#endif // _LIBCPP_CXX03_LANG
Marshall Clow6dff6182013-09-12 03:00:311583#if _LIBCPP_STD_VER > 11
1584 _LIBCPP_INLINE_VISIBILITY
1585 unordered_multimap(size_type __n, const allocator_type& __a)
1586 : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1587 _LIBCPP_INLINE_VISIBILITY
1588 unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1589 : unordered_multimap(__n, __hf, key_equal(), __a) {}
1590 template <class _InputIterator>
1591 _LIBCPP_INLINE_VISIBILITY
1592 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1593 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1594 template <class _InputIterator>
1595 _LIBCPP_INLINE_VISIBILITY
1596 unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
1597 const allocator_type& __a)
1598 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1599 _LIBCPP_INLINE_VISIBILITY
1600 unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1601 : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1602 _LIBCPP_INLINE_VISIBILITY
1603 unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1604 const allocator_type& __a)
1605 : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1606#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161607 // ~unordered_multimap() = default;
Howard Hinnant61aa6012011-07-01 19:24:361608 _LIBCPP_INLINE_VISIBILITY
1609 unordered_multimap& operator=(const unordered_multimap& __u)
1610 {
Marshall Clow3f013892016-07-18 13:19:001611#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant61aa6012011-07-01 19:24:361612 __table_ = __u.__table_;
Howard Hinnant7a6b7ce2013-06-22 15:21:291613#else
Marshall Clowebfc50e2014-02-08 04:03:141614 if (this != &__u) {
1615 __table_.clear();
1616 __table_.hash_function() = __u.__table_.hash_function();
1617 __table_.key_eq() = __u.__table_.key_eq();
1618 __table_.max_load_factor() = __u.__table_.max_load_factor();
1619 __table_.__copy_assign_alloc(__u.__table_);
1620 insert(__u.begin(), __u.end());
1621 }
Howard Hinnant7a6b7ce2013-06-22 15:21:291622#endif
Howard Hinnant61aa6012011-07-01 19:24:361623 return *this;
1624 }
Eric Fiselier1ae14a32017-04-18 22:50:561625#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov9341a8a2016-04-22 01:04:551626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241627 unordered_multimap& operator=(unordered_multimap&& __u)
1628 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551629 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161630 unordered_multimap& operator=(initializer_list<value_type> __il);
Eric Fiselier1ae14a32017-04-18 22:50:561631#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161632
Howard Hinnantee6ccd02010-09-23 18:58:281633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241634 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161635 {return allocator_type(__table_.__node_alloc());}
1636
Howard Hinnantee6ccd02010-09-23 18:58:281637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241638 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:281639 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241640 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:281641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241642 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:161643
Howard Hinnantee6ccd02010-09-23 18:58:281644 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241645 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281646 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241647 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241649 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241651 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281652 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241653 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241655 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:161656
Eric Fiselier91a15652016-04-18 01:40:451657 _LIBCPP_INLINE_VISIBILITY
1658 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1659
1660 _LIBCPP_INLINE_VISIBILITY
1661 iterator insert(const_iterator __p, const value_type& __x)
1662 {return __table_.__insert_multi(__p.__i_, __x);}
1663
1664 template <class _InputIterator>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551665 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier91a15652016-04-18 01:40:451666 void insert(_InputIterator __first, _InputIterator __last);
1667
Eric Fiselier1ae14a32017-04-18 22:50:561668#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier91a15652016-04-18 01:40:451669 _LIBCPP_INLINE_VISIBILITY
1670 void insert(initializer_list<value_type> __il)
1671 {insert(__il.begin(), __il.end());}
Eric Fiselier91a15652016-04-18 01:40:451672 _LIBCPP_INLINE_VISIBILITY
1673 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
1674
1675 _LIBCPP_INLINE_VISIBILITY
1676 iterator insert(const_iterator __p, value_type&& __x)
1677 {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
1678
1679 template <class _Pp,
1680 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1681 _LIBCPP_INLINE_VISIBILITY
1682 iterator insert(_Pp&& __x)
1683 {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
1684
1685 template <class _Pp,
1686 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1687 _LIBCPP_INLINE_VISIBILITY
1688 iterator insert(const_iterator __p, _Pp&& __x)
1689 {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
1690
Eric Fiselier2960ae22016-02-11 11:59:441691 template <class... _Args>
1692 iterator emplace(_Args&&... __args) {
1693 return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1694 }
Howard Hinnant73d21a42010-09-04 23:28:191695
Howard Hinnant635ce1d2012-05-25 22:04:211696 template <class... _Args>
Eric Fiselier2960ae22016-02-11 11:59:441697 iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1698 return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1699 }
1700#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161701
Howard Hinnantbc8d3f92010-05-11 19:42:161702
Howard Hinnantee6ccd02010-09-23 18:58:281703 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161704 iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281705 _LIBCPP_INLINE_VISIBILITY
Marshall Clow488025c2015-05-10 13:35:001706 iterator erase(iterator __p) {return __table_.erase(__p.__i_);}
1707 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161708 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161710 iterator erase(const_iterator __first, const_iterator __last)
1711 {return __table_.erase(__first.__i_, __last.__i_);}
Howard Hinnantee6ccd02010-09-23 18:58:281712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241713 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161714
Howard Hinnantee6ccd02010-09-23 18:58:281715 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241716 void swap(unordered_multimap& __u)
1717 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1718 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161719
Howard Hinnantee6ccd02010-09-23 18:58:281720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161721 hasher hash_function() const
1722 {return __table_.hash_function().hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281723 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161724 key_equal key_eq() const
1725 {return __table_.key_eq().key_eq();}
1726
Howard Hinnantee6ccd02010-09-23 18:58:281727 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161728 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281729 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161730 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281731 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161732 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161734 pair<iterator, iterator> equal_range(const key_type& __k)
1735 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281736 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161737 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1738 {return __table_.__equal_range_multi(__k);}
1739
Howard Hinnantee6ccd02010-09-23 18:58:281740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241741 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281742 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241743 size_type max_bucket_count() const _NOEXCEPT
1744 {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161745
Howard Hinnantee6ccd02010-09-23 18:58:281746 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161747 size_type bucket_size(size_type __n) const
1748 {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281749 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161750 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1751
Howard Hinnantee6ccd02010-09-23 18:58:281752 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161753 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281754 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161755 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281756 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161757 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281758 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161759 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161761 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281762 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161763 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1764
Howard Hinnantee6ccd02010-09-23 18:58:281765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241766 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281767 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5f2f14c2011-06-04 18:54:241768 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281769 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161770 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161772 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161774 void reserve(size_type __n) {__table_.reserve(__n);}
1775
Howard Hinnant39213642013-07-23 22:01:581776#if _LIBCPP_DEBUG_LEVEL >= 2
1777
1778 bool __dereferenceable(const const_iterator* __i) const
1779 {return __table_.__dereferenceable(&__i->__i_);}
1780 bool __decrementable(const const_iterator* __i) const
1781 {return __table_.__decrementable(&__i->__i_);}
1782 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1783 {return __table_.__addable(&__i->__i_, __n);}
1784 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1785 {return __table_.__addable(&__i->__i_, __n);}
1786
1787#endif // _LIBCPP_DEBUG_LEVEL >= 2
1788
Eric Fiselier2960ae22016-02-11 11:59:441789
Howard Hinnantbc8d3f92010-05-11 19:42:161790};
1791
1792template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1793unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1794 size_type __n, const hasher& __hf, const key_equal& __eql)
1795 : __table_(__hf, __eql)
1796{
Howard Hinnant39213642013-07-23 22:01:581797#if _LIBCPP_DEBUG_LEVEL >= 2
1798 __get_db()->__insert_c(this);
1799#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161800 __table_.rehash(__n);
1801}
1802
1803template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1804unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1805 size_type __n, const hasher& __hf, const key_equal& __eql,
1806 const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401807 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161808{
Howard Hinnant39213642013-07-23 22:01:581809#if _LIBCPP_DEBUG_LEVEL >= 2
1810 __get_db()->__insert_c(this);
1811#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161812 __table_.rehash(__n);
1813}
1814
1815template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1816template <class _InputIterator>
1817unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1818 _InputIterator __first, _InputIterator __last)
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 insert(__first, __last);
1824}
1825
1826template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1827template <class _InputIterator>
1828unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1829 _InputIterator __first, _InputIterator __last, size_type __n,
1830 const hasher& __hf, const key_equal& __eql)
1831 : __table_(__hf, __eql)
1832{
Howard Hinnant39213642013-07-23 22:01:581833#if _LIBCPP_DEBUG_LEVEL >= 2
1834 __get_db()->__insert_c(this);
1835#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161836 __table_.rehash(__n);
1837 insert(__first, __last);
1838}
1839
1840template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1841template <class _InputIterator>
1842unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1843 _InputIterator __first, _InputIterator __last, size_type __n,
1844 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401845 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161846{
Howard Hinnant39213642013-07-23 22:01:581847#if _LIBCPP_DEBUG_LEVEL >= 2
1848 __get_db()->__insert_c(this);
1849#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161850 __table_.rehash(__n);
1851 insert(__first, __last);
1852}
1853
Howard Hinnantbc8d3f92010-05-11 19:42:161854template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551855inline
Howard Hinnantbc8d3f92010-05-11 19:42:161856unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1857 const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401858 : __table_(typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161859{
Howard Hinnant39213642013-07-23 22:01:581860#if _LIBCPP_DEBUG_LEVEL >= 2
1861 __get_db()->__insert_c(this);
1862#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161863}
1864
1865template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1866unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1867 const unordered_multimap& __u)
1868 : __table_(__u.__table_)
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(__u.bucket_count());
1874 insert(__u.begin(), __u.end());
1875}
1876
1877template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1878unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1879 const unordered_multimap& __u, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401880 : __table_(__u.__table_, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161881{
Howard Hinnant39213642013-07-23 22:01:581882#if _LIBCPP_DEBUG_LEVEL >= 2
1883 __get_db()->__insert_c(this);
1884#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161885 __table_.rehash(__u.bucket_count());
1886 insert(__u.begin(), __u.end());
1887}
1888
Eric Fiselier1ae14a32017-04-18 22:50:561889#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161890
1891template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551892inline
Howard Hinnantbc8d3f92010-05-11 19:42:161893unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1894 unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241895 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191896 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161897{
Howard Hinnant39213642013-07-23 22:01:581898#if _LIBCPP_DEBUG_LEVEL >= 2
1899 __get_db()->__insert_c(this);
Howard Hinnantf890d9b2013-07-30 21:04:421900 __get_db()->swap(this, &__u);
Howard Hinnant39213642013-07-23 22:01:581901#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161902}
1903
1904template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1905unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1906 unordered_multimap&& __u, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401907 : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161908{
Howard Hinnant39213642013-07-23 22:01:581909#if _LIBCPP_DEBUG_LEVEL >= 2
1910 __get_db()->__insert_c(this);
1911#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161912 if (__a != __u.get_allocator())
1913 {
1914 iterator __i = __u.begin();
1915 while (__u.size() != 0)
Howard Hinnant39213642013-07-23 22:01:581916 {
Howard Hinnantbc8d3f92010-05-11 19:42:161917 __table_.__insert_multi(
Eric Fiselier2960ae22016-02-11 11:59:441918 _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_.__nc)
Howard Hinnantbc8d3f92010-05-11 19:42:161919 );
Howard Hinnant39213642013-07-23 22:01:581920 }
Howard Hinnantbc8d3f92010-05-11 19:42:161921 }
Howard Hinnantf890d9b2013-07-30 21:04:421922#if _LIBCPP_DEBUG_LEVEL >= 2
1923 else
1924 __get_db()->swap(this, &__u);
1925#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161926}
1927
Howard Hinnantbc8d3f92010-05-11 19:42:161928template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1929unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1930 initializer_list<value_type> __il)
1931{
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 insert(__il.begin(), __il.end());
1936}
1937
1938template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1939unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1940 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1941 const key_equal& __eql)
1942 : __table_(__hf, __eql)
1943{
Howard Hinnant39213642013-07-23 22:01:581944#if _LIBCPP_DEBUG_LEVEL >= 2
1945 __get_db()->__insert_c(this);
1946#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161947 __table_.rehash(__n);
1948 insert(__il.begin(), __il.end());
1949}
1950
1951template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1952unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
1953 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1954 const key_equal& __eql, const allocator_type& __a)
Marshall Clowd4badbb2016-08-17 05:58:401955 : __table_(__hf, __eql, typename __table::allocator_type(__a))
Howard Hinnantbc8d3f92010-05-11 19:42:161956{
Howard Hinnant39213642013-07-23 22:01:581957#if _LIBCPP_DEBUG_LEVEL >= 2
1958 __get_db()->__insert_c(this);
1959#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161960 __table_.rehash(__n);
1961 insert(__il.begin(), __il.end());
1962}
1963
Howard Hinnantbc8d3f92010-05-11 19:42:161964template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551965inline
Howard Hinnantbc8d3f92010-05-11 19:42:161966unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
1967unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
Howard Hinnant5f2f14c2011-06-04 18:54:241968 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161969{
Howard Hinnant0949eed2011-06-30 21:18:191970 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161971 return *this;
1972}
1973
Howard Hinnantbc8d3f92010-05-11 19:42:161974template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551975inline
Howard Hinnantbc8d3f92010-05-11 19:42:161976unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
1977unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1978 initializer_list<value_type> __il)
1979{
1980 __table_.__assign_multi(__il.begin(), __il.end());
1981 return *this;
1982}
1983
Eric Fiselier1ae14a32017-04-18 22:50:561984#endif // _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:021985
Howard Hinnantbc8d3f92010-05-11 19:42:161986
Howard Hinnantbc8d3f92010-05-11 19:42:161987
1988template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1989template <class _InputIterator>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551990inline
Howard Hinnantbc8d3f92010-05-11 19:42:161991void
1992unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1993 _InputIterator __last)
1994{
1995 for (; __first != __last; ++__first)
1996 __table_.__insert_multi(*__first);
1997}
1998
1999template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282000inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162001void
2002swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2003 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant5f2f14c2011-06-04 18:54:242004 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:162005{
2006 __x.swap(__y);
2007}
2008
2009template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2010bool
2011operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2012 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2013{
2014 if (__x.size() != __y.size())
2015 return false;
2016 typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2017 const_iterator;
2018 typedef pair<const_iterator, const_iterator> _EqRng;
2019 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2020 {
2021 _EqRng __xeq = __x.equal_range(__i->first);
2022 _EqRng __yeq = __y.equal_range(__i->first);
Howard Hinnant0949eed2011-06-30 21:18:192023 if (_VSTD::distance(__xeq.first, __xeq.second) !=
2024 _VSTD::distance(__yeq.first, __yeq.second) ||
2025 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:162026 return false;
2027 __i = __xeq.second;
2028 }
2029 return true;
2030}
2031
2032template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:282033inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162034bool
2035operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2036 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2037{
2038 return !(__x == __y);
2039}
2040
2041_LIBCPP_END_NAMESPACE_STD
2042
2043#endif // _LIBCPP_UNORDERED_MAP