blob: a14fb0004922558bad15d189ff0470a459f205ea [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- unordered_set -----------------------------===//
3//
Howard Hinnant5b08a8a2010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:16 +00005//
Howard Hinnant412dbeb2010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3e519522010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_UNORDERED_SET
12#define _LIBCPP_UNORDERED_SET
13
14/*
15
16 unordered_set synopsis
17
18#include <initializer_list>
19
20namespace std
21{
22
23template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
24 class Alloc = allocator<Value>>
25class unordered_set
26{
27public:
28 // types
29 typedef Value key_type;
30 typedef key_type value_type;
31 typedef Hash hasher;
32 typedef Pred key_equal;
33 typedef Alloc allocator_type;
34 typedef value_type& reference;
35 typedef const value_type& const_reference;
36 typedef typename allocator_traits<allocator_type>::pointer pointer;
37 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
38 typedef typename allocator_traits<allocator_type>::size_type size_type;
39 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
40
41 typedef /unspecified/ iterator;
42 typedef /unspecified/ const_iterator;
43 typedef /unspecified/ local_iterator;
44 typedef /unspecified/ const_local_iterator;
45
Howard Hinnant557da862011-06-04 20:18:37 +000046 unordered_set()
47 noexcept(
48 is_nothrow_default_constructible<hasher>::value &&
49 is_nothrow_default_constructible<key_equal>::value &&
50 is_nothrow_default_constructible<allocator_type>::value);
51 explicit unordered_set(size_type n, const hasher& hf = hasher(),
Howard Hinnant3e519522010-05-11 19:42:16 +000052 const key_equal& eql = key_equal(),
53 const allocator_type& a = allocator_type());
54 template <class InputIterator>
55 unordered_set(InputIterator f, InputIterator l,
56 size_type n = 0, const hasher& hf = hasher(),
57 const key_equal& eql = key_equal(),
58 const allocator_type& a = allocator_type());
59 explicit unordered_set(const allocator_type&);
60 unordered_set(const unordered_set&);
61 unordered_set(const unordered_set&, const Allocator&);
Howard Hinnant557da862011-06-04 20:18:37 +000062 unordered_set(unordered_set&&)
63 noexcept(
64 is_nothrow_move_constructible<hasher>::value &&
65 is_nothrow_move_constructible<key_equal>::value &&
66 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +000067 unordered_set(unordered_set&&, const Allocator&);
68 unordered_set(initializer_list<value_type>, size_type n = 0,
69 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
70 const allocator_type& a = allocator_type());
Marshall Clow45b983c2013-09-30 21:33:51 +000071 unordered_set(size_type n, const allocator_type& a); // C++14
72 unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14
73 template <class InputIterator>
74 unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
75 template <class InputIterator>
76 unordered_set(InputIterator f, InputIterator l, size_type n,
77 const hasher& hf, const allocator_type& a); // C++14
78 unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
79 unordered_set(initializer_list<value_type> il, size_type n,
80 const hasher& hf, const allocator_type& a); // C++14
Howard Hinnant3e519522010-05-11 19:42:16 +000081 ~unordered_set();
82 unordered_set& operator=(const unordered_set&);
Howard Hinnant557da862011-06-04 20:18:37 +000083 unordered_set& operator=(unordered_set&&)
84 noexcept(
85 allocator_type::propagate_on_container_move_assignment::value &&
86 is_nothrow_move_assignable<allocator_type>::value &&
87 is_nothrow_move_assignable<hasher>::value &&
88 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +000089 unordered_set& operator=(initializer_list<value_type>);
90
Howard Hinnant557da862011-06-04 20:18:37 +000091 allocator_type get_allocator() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +000092
Howard Hinnant557da862011-06-04 20:18:37 +000093 bool empty() const noexcept;
94 size_type size() const noexcept;
95 size_type max_size() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +000096
Howard Hinnant557da862011-06-04 20:18:37 +000097 iterator begin() noexcept;
98 iterator end() noexcept;
99 const_iterator begin() const noexcept;
100 const_iterator end() const noexcept;
101 const_iterator cbegin() const noexcept;
102 const_iterator cend() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000103
104 template <class... Args>
105 pair<iterator, bool> emplace(Args&&... args);
106 template <class... Args>
107 iterator emplace_hint(const_iterator position, Args&&... args);
108 pair<iterator, bool> insert(const value_type& obj);
109 pair<iterator, bool> insert(value_type&& obj);
110 iterator insert(const_iterator hint, const value_type& obj);
111 iterator insert(const_iterator hint, value_type&& obj);
112 template <class InputIterator>
113 void insert(InputIterator first, InputIterator last);
114 void insert(initializer_list<value_type>);
115
116 iterator erase(const_iterator position);
Marshall Clowec392962015-05-10 13:35:00 +0000117 iterator erase(iterator position); // C++14
Howard Hinnant3e519522010-05-11 19:42:16 +0000118 size_type erase(const key_type& k);
119 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant557da862011-06-04 20:18:37 +0000120 void clear() noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000121
Howard Hinnant557da862011-06-04 20:18:37 +0000122 void swap(unordered_set&)
Marshall Clowe3fbe142015-07-13 20:04:56 +0000123 noexcept(allocator_traits<Allocator>::is_always_equal::value &&
124 noexcept(swap(declval<hasher&>(), declval<hasher&>())) &&
125 noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17
Howard Hinnant3e519522010-05-11 19:42:16 +0000126
127 hasher hash_function() const;
128 key_equal key_eq() const;
129
130 iterator find(const key_type& k);
131 const_iterator find(const key_type& k) const;
132 size_type count(const key_type& k) const;
133 pair<iterator, iterator> equal_range(const key_type& k);
134 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
135
Howard Hinnant557da862011-06-04 20:18:37 +0000136 size_type bucket_count() const noexcept;
137 size_type max_bucket_count() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000138
139 size_type bucket_size(size_type n) const;
140 size_type bucket(const key_type& k) const;
141
142 local_iterator begin(size_type n);
143 local_iterator end(size_type n);
144 const_local_iterator begin(size_type n) const;
145 const_local_iterator end(size_type n) const;
146 const_local_iterator cbegin(size_type n) const;
147 const_local_iterator cend(size_type n) const;
148
Howard Hinnant557da862011-06-04 20:18:37 +0000149 float load_factor() const noexcept;
150 float max_load_factor() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000151 void max_load_factor(float z);
152 void rehash(size_type n);
153 void reserve(size_type n);
154};
155
156template <class Value, class Hash, class Pred, class Alloc>
157 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
Howard Hinnant557da862011-06-04 20:18:37 +0000158 unordered_set<Value, Hash, Pred, Alloc>& y)
159 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16 +0000160
161template <class Value, class Hash, class Pred, class Alloc>
162 bool
163 operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
164 const unordered_set<Value, Hash, Pred, Alloc>& y);
165
166template <class Value, class Hash, class Pred, class Alloc>
167 bool
168 operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
169 const unordered_set<Value, Hash, Pred, Alloc>& y);
170
171template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
172 class Alloc = allocator<Value>>
173class unordered_multiset
174{
175public:
176 // types
177 typedef Value key_type;
178 typedef key_type value_type;
179 typedef Hash hasher;
180 typedef Pred key_equal;
181 typedef Alloc allocator_type;
182 typedef value_type& reference;
183 typedef const value_type& const_reference;
184 typedef typename allocator_traits<allocator_type>::pointer pointer;
185 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
186 typedef typename allocator_traits<allocator_type>::size_type size_type;
187 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
188
189 typedef /unspecified/ iterator;
190 typedef /unspecified/ const_iterator;
191 typedef /unspecified/ local_iterator;
192 typedef /unspecified/ const_local_iterator;
193
Howard Hinnant557da862011-06-04 20:18:37 +0000194 unordered_multiset()
195 noexcept(
196 is_nothrow_default_constructible<hasher>::value &&
197 is_nothrow_default_constructible<key_equal>::value &&
198 is_nothrow_default_constructible<allocator_type>::value);
199 explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
Howard Hinnant3e519522010-05-11 19:42:16 +0000200 const key_equal& eql = key_equal(),
201 const allocator_type& a = allocator_type());
202 template <class InputIterator>
203 unordered_multiset(InputIterator f, InputIterator l,
204 size_type n = 0, const hasher& hf = hasher(),
205 const key_equal& eql = key_equal(),
206 const allocator_type& a = allocator_type());
207 explicit unordered_multiset(const allocator_type&);
208 unordered_multiset(const unordered_multiset&);
209 unordered_multiset(const unordered_multiset&, const Allocator&);
Howard Hinnant557da862011-06-04 20:18:37 +0000210 unordered_multiset(unordered_multiset&&)
211 noexcept(
212 is_nothrow_move_constructible<hasher>::value &&
213 is_nothrow_move_constructible<key_equal>::value &&
214 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +0000215 unordered_multiset(unordered_multiset&&, const Allocator&);
216 unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
217 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
218 const allocator_type& a = allocator_type());
Marshall Clow45b983c2013-09-30 21:33:51 +0000219 unordered_multiset(size_type n, const allocator_type& a); // C++14
220 unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14
221 template <class InputIterator>
222 unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
223 template <class InputIterator>
224 unordered_multiset(InputIterator f, InputIterator l, size_type n,
225 const hasher& hf, const allocator_type& a); // C++14
226 unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
227 unordered_multiset(initializer_list<value_type> il, size_type n,
228 const hasher& hf, const allocator_type& a); // C++14
Howard Hinnant3e519522010-05-11 19:42:16 +0000229 ~unordered_multiset();
230 unordered_multiset& operator=(const unordered_multiset&);
Howard Hinnant557da862011-06-04 20:18:37 +0000231 unordered_multiset& operator=(unordered_multiset&&)
232 noexcept(
233 allocator_type::propagate_on_container_move_assignment::value &&
234 is_nothrow_move_assignable<allocator_type>::value &&
235 is_nothrow_move_assignable<hasher>::value &&
236 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +0000237 unordered_multiset& operator=(initializer_list<value_type>);
238
Howard Hinnant557da862011-06-04 20:18:37 +0000239 allocator_type get_allocator() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000240
Howard Hinnant557da862011-06-04 20:18:37 +0000241 bool empty() const noexcept;
242 size_type size() const noexcept;
243 size_type max_size() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000244
Howard Hinnant557da862011-06-04 20:18:37 +0000245 iterator begin() noexcept;
246 iterator end() noexcept;
247 const_iterator begin() const noexcept;
248 const_iterator end() const noexcept;
249 const_iterator cbegin() const noexcept;
250 const_iterator cend() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000251
252 template <class... Args>
253 iterator emplace(Args&&... args);
254 template <class... Args>
255 iterator emplace_hint(const_iterator position, Args&&... args);
256 iterator insert(const value_type& obj);
257 iterator insert(value_type&& obj);
258 iterator insert(const_iterator hint, const value_type& obj);
259 iterator insert(const_iterator hint, value_type&& obj);
260 template <class InputIterator>
261 void insert(InputIterator first, InputIterator last);
262 void insert(initializer_list<value_type>);
263
264 iterator erase(const_iterator position);
Marshall Clowec392962015-05-10 13:35:00 +0000265 iterator erase(iterator position); // C++14
Howard Hinnant3e519522010-05-11 19:42:16 +0000266 size_type erase(const key_type& k);
267 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant557da862011-06-04 20:18:37 +0000268 void clear() noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000269
Howard Hinnant557da862011-06-04 20:18:37 +0000270 void swap(unordered_multiset&)
Marshall Clowe3fbe142015-07-13 20:04:56 +0000271 noexcept(allocator_traits<Allocator>::is_always_equal::value &&
272 noexcept(swap(declval<hasher&>(), declval<hasher&>())) &&
273 noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17
Howard Hinnant3e519522010-05-11 19:42:16 +0000274
275 hasher hash_function() const;
276 key_equal key_eq() const;
277
278 iterator find(const key_type& k);
279 const_iterator find(const key_type& k) const;
280 size_type count(const key_type& k) const;
281 pair<iterator, iterator> equal_range(const key_type& k);
282 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
283
Howard Hinnant557da862011-06-04 20:18:37 +0000284 size_type bucket_count() const noexcept;
285 size_type max_bucket_count() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000286
287 size_type bucket_size(size_type n) const;
288 size_type bucket(const key_type& k) const;
289
290 local_iterator begin(size_type n);
291 local_iterator end(size_type n);
292 const_local_iterator begin(size_type n) const;
293 const_local_iterator end(size_type n) const;
294 const_local_iterator cbegin(size_type n) const;
295 const_local_iterator cend(size_type n) const;
296
Howard Hinnant557da862011-06-04 20:18:37 +0000297 float load_factor() const noexcept;
298 float max_load_factor() const noexcept;
Howard Hinnant3e519522010-05-11 19:42:16 +0000299 void max_load_factor(float z);
300 void rehash(size_type n);
301 void reserve(size_type n);
302};
303
304template <class Value, class Hash, class Pred, class Alloc>
305 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
Howard Hinnant557da862011-06-04 20:18:37 +0000306 unordered_multiset<Value, Hash, Pred, Alloc>& y)
307 noexcept(noexcept(x.swap(y)));
Howard Hinnant3e519522010-05-11 19:42:16 +0000308
309template <class Value, class Hash, class Pred, class Alloc>
310 bool
311 operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
312 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
313
314template <class Value, class Hash, class Pred, class Alloc>
315 bool
316 operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
317 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
318} // std
319
320*/
321
322#include <__config>
323#include <__hash_table>
324#include <functional>
325
Eric Fiselierc1bd9192014-08-10 23:53:08 +0000326#include <__debug>
327
Howard Hinnant073458b2011-10-17 20:05:10 +0000328#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3e519522010-05-11 19:42:16 +0000329#pragma GCC system_header
Howard Hinnant073458b2011-10-17 20:05:10 +0000330#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000331
332_LIBCPP_BEGIN_NAMESPACE_STD
333
334template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
335 class _Alloc = allocator<_Value> >
Eric Fiseliere2f2d1e2017-01-04 23:56:00 +0000336class _LIBCPP_TEMPLATE_VIS unordered_set
Howard Hinnant3e519522010-05-11 19:42:16 +0000337{
338public:
339 // types
340 typedef _Value key_type;
341 typedef key_type value_type;
342 typedef _Hash hasher;
343 typedef _Pred key_equal;
344 typedef _Alloc allocator_type;
345 typedef value_type& reference;
346 typedef const value_type& const_reference;
Howard Hinnantb24c8022013-07-23 22:01:58 +0000347 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
348 "Invalid allocator::value_type");
Howard Hinnant3e519522010-05-11 19:42:16 +0000349
350private:
351 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
352
353 __table __table_;
354
355public:
356 typedef typename __table::pointer pointer;
357 typedef typename __table::const_pointer const_pointer;
358 typedef typename __table::size_type size_type;
359 typedef typename __table::difference_type difference_type;
360
361 typedef typename __table::const_iterator iterator;
362 typedef typename __table::const_iterator const_iterator;
363 typedef typename __table::const_local_iterator local_iterator;
364 typedef typename __table::const_local_iterator const_local_iterator;
365
Howard Hinnant789847d2010-09-23 18:58:28 +0000366 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000367 unordered_set()
368 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnantb24c8022013-07-23 22:01:58 +0000369 {
370#if _LIBCPP_DEBUG_LEVEL >= 2
371 __get_db()->__insert_c(this);
372#endif
373 }
Howard Hinnant3e519522010-05-11 19:42:16 +0000374 explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
375 const key_equal& __eql = key_equal());
Marshall Clow45b983c2013-09-30 21:33:51 +0000376#if _LIBCPP_STD_VER > 11
377 inline _LIBCPP_INLINE_VISIBILITY
378 unordered_set(size_type __n, const allocator_type& __a)
379 : unordered_set(__n, hasher(), key_equal(), __a) {}
380 inline _LIBCPP_INLINE_VISIBILITY
381 unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a)
382 : unordered_set(__n, __hf, key_equal(), __a) {}
383#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000384 unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
385 const allocator_type& __a);
386 template <class _InputIterator>
387 unordered_set(_InputIterator __first, _InputIterator __last);
388 template <class _InputIterator>
389 unordered_set(_InputIterator __first, _InputIterator __last,
390 size_type __n, const hasher& __hf = hasher(),
391 const key_equal& __eql = key_equal());
392 template <class _InputIterator>
393 unordered_set(_InputIterator __first, _InputIterator __last,
394 size_type __n, const hasher& __hf, const key_equal& __eql,
395 const allocator_type& __a);
Marshall Clow45b983c2013-09-30 21:33:51 +0000396#if _LIBCPP_STD_VER > 11
397 template <class _InputIterator>
398 inline _LIBCPP_INLINE_VISIBILITY
399 unordered_set(_InputIterator __first, _InputIterator __last,
400 size_type __n, const allocator_type& __a)
401 : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {}
402 template <class _InputIterator>
403 unordered_set(_InputIterator __first, _InputIterator __last,
404 size_type __n, const hasher& __hf, const allocator_type& __a)
405 : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {}
406#endif
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000407 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000408 explicit unordered_set(const allocator_type& __a);
409 unordered_set(const unordered_set& __u);
410 unordered_set(const unordered_set& __u, const allocator_type& __a);
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000411#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000412 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000413 unordered_set(unordered_set&& __u)
414 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +0000415 unordered_set(unordered_set&& __u, const allocator_type& __a);
Howard Hinnant3e519522010-05-11 19:42:16 +0000416 unordered_set(initializer_list<value_type> __il);
417 unordered_set(initializer_list<value_type> __il, size_type __n,
418 const hasher& __hf = hasher(),
419 const key_equal& __eql = key_equal());
420 unordered_set(initializer_list<value_type> __il, size_type __n,
421 const hasher& __hf, const key_equal& __eql,
422 const allocator_type& __a);
Marshall Clow45b983c2013-09-30 21:33:51 +0000423#if _LIBCPP_STD_VER > 11
424 inline _LIBCPP_INLINE_VISIBILITY
425 unordered_set(initializer_list<value_type> __il, size_type __n,
426 const allocator_type& __a)
427 : unordered_set(__il, __n, hasher(), key_equal(), __a) {}
428 inline _LIBCPP_INLINE_VISIBILITY
429 unordered_set(initializer_list<value_type> __il, size_type __n,
430 const hasher& __hf, const allocator_type& __a)
431 : unordered_set(__il, __n, __hf, key_equal(), __a) {}
432#endif
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000433#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000434 // ~unordered_set() = default;
Howard Hinnant5a336872011-07-01 19:24:36 +0000435 _LIBCPP_INLINE_VISIBILITY
436 unordered_set& operator=(const unordered_set& __u)
437 {
438 __table_ = __u.__table_;
439 return *this;
440 }
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000441#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000442 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000443 unordered_set& operator=(unordered_set&& __u)
444 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000445 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000446 unordered_set& operator=(initializer_list<value_type> __il);
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000447#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000448
Howard Hinnant789847d2010-09-23 18:58:28 +0000449 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000450 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16 +0000451 {return allocator_type(__table_.__node_alloc());}
452
Howard Hinnant789847d2010-09-23 18:58:28 +0000453 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000454 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnant789847d2010-09-23 18:58:28 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000456 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000458 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000459
Howard Hinnant789847d2010-09-23 18:58:28 +0000460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000461 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000463 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000465 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000467 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000468 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000469 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000471 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000472
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000473#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000474 template <class... _Args>
Howard Hinnant789847d2010-09-23 18:58:28 +0000475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000476 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnantce48a112011-06-30 21:18:19 +0000477 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnant3e519522010-05-11 19:42:16 +0000478 template <class... _Args>
Howard Hinnant789847d2010-09-23 18:58:28 +0000479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb24c8022013-07-23 22:01:58 +0000480#if _LIBCPP_DEBUG_LEVEL >= 2
481 iterator emplace_hint(const_iterator __p, _Args&&... __args)
482 {
483 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
484 "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not"
485 " referring to this unordered_set");
486 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
487 }
488#else
Howard Hinnant3e519522010-05-11 19:42:16 +0000489 iterator emplace_hint(const_iterator, _Args&&... __args)
Howard Hinnantce48a112011-06-30 21:18:19 +0000490 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
Howard Hinnantb24c8022013-07-23 22:01:58 +0000491#endif
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000492
Howard Hinnant789847d2010-09-23 18:58:28 +0000493 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000494 pair<iterator, bool> insert(value_type&& __x)
Howard Hinnantce48a112011-06-30 21:18:19 +0000495 {return __table_.__insert_unique(_VSTD::move(__x));}
Howard Hinnant789847d2010-09-23 18:58:28 +0000496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb24c8022013-07-23 22:01:58 +0000497#if _LIBCPP_DEBUG_LEVEL >= 2
498 iterator insert(const_iterator __p, value_type&& __x)
499 {
500 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
501 "unordered_set::insert(const_iterator, value_type&&) called with an iterator not"
502 " referring to this unordered_set");
503 return insert(_VSTD::move(__x)).first;
504 }
505#else
Howard Hinnant3e519522010-05-11 19:42:16 +0000506 iterator insert(const_iterator, value_type&& __x)
Howard Hinnantce48a112011-06-30 21:18:19 +0000507 {return insert(_VSTD::move(__x)).first;}
Howard Hinnantb24c8022013-07-23 22:01:58 +0000508#endif
Howard Hinnant789847d2010-09-23 18:58:28 +0000509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000510 void insert(initializer_list<value_type> __il)
511 {insert(__il.begin(), __il.end());}
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000512#endif // _LIBCPP_CXX03_LANG
513 _LIBCPP_INLINE_VISIBILITY
514 pair<iterator, bool> insert(const value_type& __x)
515 {return __table_.__insert_unique(__x);}
516
517 _LIBCPP_INLINE_VISIBILITY
518#if _LIBCPP_DEBUG_LEVEL >= 2
519 iterator insert(const_iterator __p, const value_type& __x)
520 {
521 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
522 "unordered_set::insert(const_iterator, const value_type&) called with an iterator not"
523 " referring to this unordered_set");
524 return insert(__x).first;
525 }
526#else
527 iterator insert(const_iterator, const value_type& __x)
528 {return insert(__x).first;}
529#endif
530 template <class _InputIterator>
531 _LIBCPP_INLINE_VISIBILITY
532 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnant3e519522010-05-11 19:42:16 +0000533
Howard Hinnant789847d2010-09-23 18:58:28 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000535 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000536 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000537 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000539 iterator erase(const_iterator __first, const_iterator __last)
540 {return __table_.erase(__first, __last);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000542 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000543
Howard Hinnant789847d2010-09-23 18:58:28 +0000544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000545 void swap(unordered_set& __u)
546 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
547 {__table_.swap(__u.__table_);}
Howard Hinnant3e519522010-05-11 19:42:16 +0000548
Howard Hinnant789847d2010-09-23 18:58:28 +0000549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000550 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000552 key_equal key_eq() const {return __table_.key_eq();}
553
Howard Hinnant789847d2010-09-23 18:58:28 +0000554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000555 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000557 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000559 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000561 pair<iterator, iterator> equal_range(const key_type& __k)
562 {return __table_.__equal_range_unique(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000564 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
565 {return __table_.__equal_range_unique(__k);}
566
Howard Hinnant789847d2010-09-23 18:58:28 +0000567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000568 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000570 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000571
Howard Hinnant789847d2010-09-23 18:58:28 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000573 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000575 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
576
Howard Hinnant789847d2010-09-23 18:58:28 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000578 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000580 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000582 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000584 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000586 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000588 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
589
Howard Hinnant789847d2010-09-23 18:58:28 +0000590 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000591 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000593 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000594 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000595 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000597 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +0000598 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000599 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnantb24c8022013-07-23 22:01:58 +0000600
601#if _LIBCPP_DEBUG_LEVEL >= 2
602
603 bool __dereferenceable(const const_iterator* __i) const
604 {return __table_.__dereferenceable(__i);}
605 bool __decrementable(const const_iterator* __i) const
606 {return __table_.__decrementable(__i);}
607 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
608 {return __table_.__addable(__i, __n);}
609 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
610 {return __table_.__addable(__i, __n);}
611
612#endif // _LIBCPP_DEBUG_LEVEL >= 2
613
Howard Hinnant3e519522010-05-11 19:42:16 +0000614};
615
616template <class _Value, class _Hash, class _Pred, class _Alloc>
617unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
618 const hasher& __hf, const key_equal& __eql)
619 : __table_(__hf, __eql)
620{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000621#if _LIBCPP_DEBUG_LEVEL >= 2
622 __get_db()->__insert_c(this);
623#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000624 __table_.rehash(__n);
625}
626
627template <class _Value, class _Hash, class _Pred, class _Alloc>
628unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
629 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
630 : __table_(__hf, __eql, __a)
631{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000632#if _LIBCPP_DEBUG_LEVEL >= 2
633 __get_db()->__insert_c(this);
634#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000635 __table_.rehash(__n);
636}
637
638template <class _Value, class _Hash, class _Pred, class _Alloc>
639template <class _InputIterator>
640unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
641 _InputIterator __first, _InputIterator __last)
642{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000643#if _LIBCPP_DEBUG_LEVEL >= 2
644 __get_db()->__insert_c(this);
645#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000646 insert(__first, __last);
647}
648
649template <class _Value, class _Hash, class _Pred, class _Alloc>
650template <class _InputIterator>
651unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
652 _InputIterator __first, _InputIterator __last, size_type __n,
653 const hasher& __hf, const key_equal& __eql)
654 : __table_(__hf, __eql)
655{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000656#if _LIBCPP_DEBUG_LEVEL >= 2
657 __get_db()->__insert_c(this);
658#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000659 __table_.rehash(__n);
660 insert(__first, __last);
661}
662
663template <class _Value, class _Hash, class _Pred, class _Alloc>
664template <class _InputIterator>
665unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
666 _InputIterator __first, _InputIterator __last, size_type __n,
667 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
668 : __table_(__hf, __eql, __a)
669{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000670#if _LIBCPP_DEBUG_LEVEL >= 2
671 __get_db()->__insert_c(this);
672#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000673 __table_.rehash(__n);
674 insert(__first, __last);
675}
676
677template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000678inline
Howard Hinnant3e519522010-05-11 19:42:16 +0000679unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
680 const allocator_type& __a)
681 : __table_(__a)
682{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000683#if _LIBCPP_DEBUG_LEVEL >= 2
684 __get_db()->__insert_c(this);
685#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000686}
687
688template <class _Value, class _Hash, class _Pred, class _Alloc>
689unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
690 const unordered_set& __u)
691 : __table_(__u.__table_)
692{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000693#if _LIBCPP_DEBUG_LEVEL >= 2
694 __get_db()->__insert_c(this);
695#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000696 __table_.rehash(__u.bucket_count());
697 insert(__u.begin(), __u.end());
698}
699
700template <class _Value, class _Hash, class _Pred, class _Alloc>
701unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
702 const unordered_set& __u, const allocator_type& __a)
703 : __table_(__u.__table_, __a)
704{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000705#if _LIBCPP_DEBUG_LEVEL >= 2
706 __get_db()->__insert_c(this);
707#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000708 __table_.rehash(__u.bucket_count());
709 insert(__u.begin(), __u.end());
710}
711
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000712#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000713
714template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000715inline
Howard Hinnant3e519522010-05-11 19:42:16 +0000716unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
717 unordered_set&& __u)
Howard Hinnant557da862011-06-04 20:18:37 +0000718 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnantce48a112011-06-30 21:18:19 +0000719 : __table_(_VSTD::move(__u.__table_))
Howard Hinnant3e519522010-05-11 19:42:16 +0000720{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000721#if _LIBCPP_DEBUG_LEVEL >= 2
722 __get_db()->__insert_c(this);
723 __get_db()->swap(this, &__u);
724#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000725}
726
727template <class _Value, class _Hash, class _Pred, class _Alloc>
728unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
729 unordered_set&& __u, const allocator_type& __a)
Howard Hinnantce48a112011-06-30 21:18:19 +0000730 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnant3e519522010-05-11 19:42:16 +0000731{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000732#if _LIBCPP_DEBUG_LEVEL >= 2
733 __get_db()->__insert_c(this);
734#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000735 if (__a != __u.get_allocator())
736 {
737 iterator __i = __u.begin();
738 while (__u.size() != 0)
Howard Hinnantce48a112011-06-30 21:18:19 +0000739 __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnant3e519522010-05-11 19:42:16 +0000740 }
Howard Hinnantb24c8022013-07-23 22:01:58 +0000741#if _LIBCPP_DEBUG_LEVEL >= 2
742 else
743 __get_db()->swap(this, &__u);
744#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000745}
746
Howard Hinnant3e519522010-05-11 19:42:16 +0000747template <class _Value, class _Hash, class _Pred, class _Alloc>
748unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
749 initializer_list<value_type> __il)
750{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000751#if _LIBCPP_DEBUG_LEVEL >= 2
752 __get_db()->__insert_c(this);
753#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000754 insert(__il.begin(), __il.end());
755}
756
757template <class _Value, class _Hash, class _Pred, class _Alloc>
758unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
759 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
760 const key_equal& __eql)
761 : __table_(__hf, __eql)
762{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000763#if _LIBCPP_DEBUG_LEVEL >= 2
764 __get_db()->__insert_c(this);
765#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000766 __table_.rehash(__n);
767 insert(__il.begin(), __il.end());
768}
769
770template <class _Value, class _Hash, class _Pred, class _Alloc>
771unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
772 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
773 const key_equal& __eql, const allocator_type& __a)
774 : __table_(__hf, __eql, __a)
775{
Howard Hinnantb24c8022013-07-23 22:01:58 +0000776#if _LIBCPP_DEBUG_LEVEL >= 2
777 __get_db()->__insert_c(this);
778#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000779 __table_.rehash(__n);
780 insert(__il.begin(), __il.end());
781}
782
Howard Hinnant3e519522010-05-11 19:42:16 +0000783template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000784inline
Howard Hinnant3e519522010-05-11 19:42:16 +0000785unordered_set<_Value, _Hash, _Pred, _Alloc>&
786unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
Howard Hinnant557da862011-06-04 20:18:37 +0000787 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnant3e519522010-05-11 19:42:16 +0000788{
Howard Hinnantce48a112011-06-30 21:18:19 +0000789 __table_ = _VSTD::move(__u.__table_);
Howard Hinnant3e519522010-05-11 19:42:16 +0000790 return *this;
791}
792
Howard Hinnant3e519522010-05-11 19:42:16 +0000793template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000794inline
Howard Hinnant3e519522010-05-11 19:42:16 +0000795unordered_set<_Value, _Hash, _Pred, _Alloc>&
796unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
797 initializer_list<value_type> __il)
798{
799 __table_.__assign_unique(__il.begin(), __il.end());
800 return *this;
801}
802
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000803#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:02 +0000804
Howard Hinnant3e519522010-05-11 19:42:16 +0000805template <class _Value, class _Hash, class _Pred, class _Alloc>
806template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000807inline
Howard Hinnant3e519522010-05-11 19:42:16 +0000808void
809unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
810 _InputIterator __last)
811{
812 for (; __first != __last; ++__first)
813 __table_.__insert_unique(*__first);
814}
815
816template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:28 +0000817inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000818void
819swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
820 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant557da862011-06-04 20:18:37 +0000821 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnant3e519522010-05-11 19:42:16 +0000822{
823 __x.swap(__y);
824}
825
826template <class _Value, class _Hash, class _Pred, class _Alloc>
827bool
828operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
829 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
830{
831 if (__x.size() != __y.size())
832 return false;
833 typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
834 const_iterator;
835 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
836 __i != __ex; ++__i)
837 {
838 const_iterator __j = __y.find(*__i);
839 if (__j == __ey || !(*__i == *__j))
840 return false;
841 }
842 return true;
843}
844
845template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:28 +0000846inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000847bool
848operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
849 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
850{
851 return !(__x == __y);
852}
853
854template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
855 class _Alloc = allocator<_Value> >
Eric Fiseliere2f2d1e2017-01-04 23:56:00 +0000856class _LIBCPP_TEMPLATE_VIS unordered_multiset
Howard Hinnant3e519522010-05-11 19:42:16 +0000857{
858public:
859 // types
860 typedef _Value key_type;
861 typedef key_type value_type;
862 typedef _Hash hasher;
863 typedef _Pred key_equal;
864 typedef _Alloc allocator_type;
865 typedef value_type& reference;
866 typedef const value_type& const_reference;
Howard Hinnantb24c8022013-07-23 22:01:58 +0000867 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
868 "Invalid allocator::value_type");
Howard Hinnant3e519522010-05-11 19:42:16 +0000869
870private:
871 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
872
873 __table __table_;
874
875public:
876 typedef typename __table::pointer pointer;
877 typedef typename __table::const_pointer const_pointer;
878 typedef typename __table::size_type size_type;
879 typedef typename __table::difference_type difference_type;
880
881 typedef typename __table::const_iterator iterator;
882 typedef typename __table::const_iterator const_iterator;
883 typedef typename __table::const_local_iterator local_iterator;
884 typedef typename __table::const_local_iterator const_local_iterator;
885
Howard Hinnant789847d2010-09-23 18:58:28 +0000886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000887 unordered_multiset()
888 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnantb24c8022013-07-23 22:01:58 +0000889 {
890#if _LIBCPP_DEBUG_LEVEL >= 2
891 __get_db()->__insert_c(this);
892#endif
893 }
Howard Hinnant3e519522010-05-11 19:42:16 +0000894 explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
895 const key_equal& __eql = key_equal());
896 unordered_multiset(size_type __n, const hasher& __hf,
897 const key_equal& __eql, const allocator_type& __a);
Marshall Clow45b983c2013-09-30 21:33:51 +0000898#if _LIBCPP_STD_VER > 11
899 inline _LIBCPP_INLINE_VISIBILITY
900 unordered_multiset(size_type __n, const allocator_type& __a)
901 : unordered_multiset(__n, hasher(), key_equal(), __a) {}
902 inline _LIBCPP_INLINE_VISIBILITY
903 unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a)
904 : unordered_multiset(__n, __hf, key_equal(), __a) {}
905#endif
Howard Hinnant3e519522010-05-11 19:42:16 +0000906 template <class _InputIterator>
907 unordered_multiset(_InputIterator __first, _InputIterator __last);
908 template <class _InputIterator>
909 unordered_multiset(_InputIterator __first, _InputIterator __last,
910 size_type __n, const hasher& __hf = hasher(),
911 const key_equal& __eql = key_equal());
912 template <class _InputIterator>
913 unordered_multiset(_InputIterator __first, _InputIterator __last,
914 size_type __n , const hasher& __hf,
915 const key_equal& __eql, const allocator_type& __a);
Marshall Clow45b983c2013-09-30 21:33:51 +0000916#if _LIBCPP_STD_VER > 11
917 template <class _InputIterator>
918 inline _LIBCPP_INLINE_VISIBILITY
919 unordered_multiset(_InputIterator __first, _InputIterator __last,
920 size_type __n, const allocator_type& __a)
921 : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {}
922 template <class _InputIterator>
923 inline _LIBCPP_INLINE_VISIBILITY
924 unordered_multiset(_InputIterator __first, _InputIterator __last,
925 size_type __n, const hasher& __hf, const allocator_type& __a)
926 : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {}
927#endif
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000928 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000929 explicit unordered_multiset(const allocator_type& __a);
930 unordered_multiset(const unordered_multiset& __u);
931 unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000932#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000933 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000934 unordered_multiset(unordered_multiset&& __u)
935 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +0000936 unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
Howard Hinnant3e519522010-05-11 19:42:16 +0000937 unordered_multiset(initializer_list<value_type> __il);
938 unordered_multiset(initializer_list<value_type> __il, size_type __n,
939 const hasher& __hf = hasher(),
940 const key_equal& __eql = key_equal());
941 unordered_multiset(initializer_list<value_type> __il, size_type __n,
942 const hasher& __hf, const key_equal& __eql,
943 const allocator_type& __a);
Marshall Clow45b983c2013-09-30 21:33:51 +0000944#if _LIBCPP_STD_VER > 11
945 inline _LIBCPP_INLINE_VISIBILITY
946 unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
947 : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {}
948 inline _LIBCPP_INLINE_VISIBILITY
949 unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a)
950 : unordered_multiset(__il, __n, __hf, key_equal(), __a) {}
951#endif
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000952#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000953 // ~unordered_multiset() = default;
Howard Hinnant5a336872011-07-01 19:24:36 +0000954 _LIBCPP_INLINE_VISIBILITY
955 unordered_multiset& operator=(const unordered_multiset& __u)
956 {
957 __table_ = __u.__table_;
958 return *this;
959 }
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000960#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +0000961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000962 unordered_multiset& operator=(unordered_multiset&& __u)
963 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnant3e519522010-05-11 19:42:16 +0000964 unordered_multiset& operator=(initializer_list<value_type> __il);
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000965#endif // _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000966
Howard Hinnant789847d2010-09-23 18:58:28 +0000967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000968 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnant3e519522010-05-11 19:42:16 +0000969 {return allocator_type(__table_.__node_alloc());}
970
Howard Hinnant789847d2010-09-23 18:58:28 +0000971 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000972 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnant789847d2010-09-23 18:58:28 +0000973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000974 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000975 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000976 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000977
Howard Hinnant789847d2010-09-23 18:58:28 +0000978 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000979 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000980 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000981 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000983 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000984 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000985 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000987 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnant789847d2010-09-23 18:58:28 +0000988 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +0000989 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnant3e519522010-05-11 19:42:16 +0000990
Eric Fiselierf0f86ef2017-04-18 22:37:32 +0000991#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +0000992 template <class... _Args>
Howard Hinnant789847d2010-09-23 18:58:28 +0000993 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000994 iterator emplace(_Args&&... __args)
Howard Hinnantce48a112011-06-30 21:18:19 +0000995 {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnant3e519522010-05-11 19:42:16 +0000996 template <class... _Args>
Howard Hinnant789847d2010-09-23 18:58:28 +0000997 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +0000998 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnantce48a112011-06-30 21:18:19 +0000999 {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Eric Fiselierf0f86ef2017-04-18 22:37:32 +00001000
Howard Hinnant789847d2010-09-23 18:58:28 +00001001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantce48a112011-06-30 21:18:19 +00001002 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
Howard Hinnant789847d2010-09-23 18:58:28 +00001003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001004 iterator insert(const_iterator __p, value_type&& __x)
Howard Hinnantce48a112011-06-30 21:18:19 +00001005 {return __table_.__insert_multi(__p, _VSTD::move(__x));}
Howard Hinnant789847d2010-09-23 18:58:28 +00001006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001007 void insert(initializer_list<value_type> __il)
1008 {insert(__il.begin(), __il.end());}
Eric Fiselierf0f86ef2017-04-18 22:37:32 +00001009#endif // _LIBCPP_CXX03_LANG
1010
1011 _LIBCPP_INLINE_VISIBILITY
1012 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1013
1014 _LIBCPP_INLINE_VISIBILITY
1015 iterator insert(const_iterator __p, const value_type& __x)
1016 {return __table_.__insert_multi(__p, __x);}
1017
1018 template <class _InputIterator>
1019 _LIBCPP_INLINE_VISIBILITY
1020 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnant3e519522010-05-11 19:42:16 +00001021
Howard Hinnant789847d2010-09-23 18:58:28 +00001022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001023 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001024 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001025 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001027 iterator erase(const_iterator __first, const_iterator __last)
1028 {return __table_.erase(__first, __last);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001030 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnant3e519522010-05-11 19:42:16 +00001031
Howard Hinnant789847d2010-09-23 18:58:28 +00001032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001033 void swap(unordered_multiset& __u)
1034 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1035 {__table_.swap(__u.__table_);}
Howard Hinnant3e519522010-05-11 19:42:16 +00001036
Howard Hinnant789847d2010-09-23 18:58:28 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001038 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnant789847d2010-09-23 18:58:28 +00001039 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001040 key_equal key_eq() const {return __table_.key_eq();}
1041
Howard Hinnant789847d2010-09-23 18:58:28 +00001042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001043 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001045 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001046 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001047 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001049 pair<iterator, iterator> equal_range(const key_type& __k)
1050 {return __table_.__equal_range_multi(__k);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001052 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1053 {return __table_.__equal_range_multi(__k);}
1054
Howard Hinnant789847d2010-09-23 18:58:28 +00001055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001056 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnant789847d2010-09-23 18:58:28 +00001057 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001058 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnant3e519522010-05-11 19:42:16 +00001059
Howard Hinnant789847d2010-09-23 18:58:28 +00001060 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001061 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001062 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001063 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1064
Howard Hinnant789847d2010-09-23 18:58:28 +00001065 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001066 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001067 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001068 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001069 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001070 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001071 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001072 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001073 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001074 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001076 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1077
Howard Hinnant789847d2010-09-23 18:58:28 +00001078 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001079 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnant789847d2010-09-23 18:58:28 +00001080 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant557da862011-06-04 20:18:37 +00001081 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnant789847d2010-09-23 18:58:28 +00001082 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001083 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001084 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001085 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnant789847d2010-09-23 18:58:28 +00001086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001087 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnantb24c8022013-07-23 22:01:58 +00001088
1089#if _LIBCPP_DEBUG_LEVEL >= 2
1090
1091 bool __dereferenceable(const const_iterator* __i) const
1092 {return __table_.__dereferenceable(__i);}
1093 bool __decrementable(const const_iterator* __i) const
1094 {return __table_.__decrementable(__i);}
1095 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1096 {return __table_.__addable(__i, __n);}
1097 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1098 {return __table_.__addable(__i, __n);}
1099
1100#endif // _LIBCPP_DEBUG_LEVEL >= 2
1101
Howard Hinnant3e519522010-05-11 19:42:16 +00001102};
1103
1104template <class _Value, class _Hash, class _Pred, class _Alloc>
1105unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1106 size_type __n, const hasher& __hf, const key_equal& __eql)
1107 : __table_(__hf, __eql)
1108{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001109#if _LIBCPP_DEBUG_LEVEL >= 2
1110 __get_db()->__insert_c(this);
1111#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001112 __table_.rehash(__n);
1113}
1114
1115template <class _Value, class _Hash, class _Pred, class _Alloc>
1116unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1117 size_type __n, const hasher& __hf, const key_equal& __eql,
1118 const allocator_type& __a)
1119 : __table_(__hf, __eql, __a)
1120{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001121#if _LIBCPP_DEBUG_LEVEL >= 2
1122 __get_db()->__insert_c(this);
1123#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001124 __table_.rehash(__n);
1125}
1126
1127template <class _Value, class _Hash, class _Pred, class _Alloc>
1128template <class _InputIterator>
1129unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1130 _InputIterator __first, _InputIterator __last)
1131{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001132#if _LIBCPP_DEBUG_LEVEL >= 2
1133 __get_db()->__insert_c(this);
1134#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001135 insert(__first, __last);
1136}
1137
1138template <class _Value, class _Hash, class _Pred, class _Alloc>
1139template <class _InputIterator>
1140unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1141 _InputIterator __first, _InputIterator __last, size_type __n,
1142 const hasher& __hf, const key_equal& __eql)
1143 : __table_(__hf, __eql)
1144{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001145#if _LIBCPP_DEBUG_LEVEL >= 2
1146 __get_db()->__insert_c(this);
1147#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001148 __table_.rehash(__n);
1149 insert(__first, __last);
1150}
1151
1152template <class _Value, class _Hash, class _Pred, class _Alloc>
1153template <class _InputIterator>
1154unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1155 _InputIterator __first, _InputIterator __last, size_type __n,
1156 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1157 : __table_(__hf, __eql, __a)
1158{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001159#if _LIBCPP_DEBUG_LEVEL >= 2
1160 __get_db()->__insert_c(this);
1161#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001162 __table_.rehash(__n);
1163 insert(__first, __last);
1164}
1165
1166template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +00001167inline
Howard Hinnant3e519522010-05-11 19:42:16 +00001168unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1169 const allocator_type& __a)
1170 : __table_(__a)
1171{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001172#if _LIBCPP_DEBUG_LEVEL >= 2
1173 __get_db()->__insert_c(this);
1174#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001175}
1176
1177template <class _Value, class _Hash, class _Pred, class _Alloc>
1178unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1179 const unordered_multiset& __u)
1180 : __table_(__u.__table_)
1181{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001182#if _LIBCPP_DEBUG_LEVEL >= 2
1183 __get_db()->__insert_c(this);
1184#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001185 __table_.rehash(__u.bucket_count());
1186 insert(__u.begin(), __u.end());
1187}
1188
1189template <class _Value, class _Hash, class _Pred, class _Alloc>
1190unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1191 const unordered_multiset& __u, const allocator_type& __a)
1192 : __table_(__u.__table_, __a)
1193{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001194#if _LIBCPP_DEBUG_LEVEL >= 2
1195 __get_db()->__insert_c(this);
1196#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001197 __table_.rehash(__u.bucket_count());
1198 insert(__u.begin(), __u.end());
1199}
1200
Eric Fiselierf0f86ef2017-04-18 22:37:32 +00001201#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant3e519522010-05-11 19:42:16 +00001202
1203template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +00001204inline
Howard Hinnant3e519522010-05-11 19:42:16 +00001205unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1206 unordered_multiset&& __u)
Howard Hinnant557da862011-06-04 20:18:37 +00001207 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnantce48a112011-06-30 21:18:19 +00001208 : __table_(_VSTD::move(__u.__table_))
Howard Hinnant3e519522010-05-11 19:42:16 +00001209{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001210#if _LIBCPP_DEBUG_LEVEL >= 2
1211 __get_db()->__insert_c(this);
1212 __get_db()->swap(this, &__u);
1213#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001214}
1215
1216template <class _Value, class _Hash, class _Pred, class _Alloc>
1217unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1218 unordered_multiset&& __u, const allocator_type& __a)
Howard Hinnantce48a112011-06-30 21:18:19 +00001219 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnant3e519522010-05-11 19:42:16 +00001220{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001221#if _LIBCPP_DEBUG_LEVEL >= 2
1222 __get_db()->__insert_c(this);
1223#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001224 if (__a != __u.get_allocator())
1225 {
1226 iterator __i = __u.begin();
1227 while (__u.size() != 0)
Howard Hinnantce48a112011-06-30 21:18:19 +00001228 __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnant3e519522010-05-11 19:42:16 +00001229 }
Howard Hinnantb24c8022013-07-23 22:01:58 +00001230#if _LIBCPP_DEBUG_LEVEL >= 2
1231 else
1232 __get_db()->swap(this, &__u);
1233#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001234}
1235
Howard Hinnant3e519522010-05-11 19:42:16 +00001236template <class _Value, class _Hash, class _Pred, class _Alloc>
1237unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1238 initializer_list<value_type> __il)
1239{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001240#if _LIBCPP_DEBUG_LEVEL >= 2
1241 __get_db()->__insert_c(this);
1242#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001243 insert(__il.begin(), __il.end());
1244}
1245
1246template <class _Value, class _Hash, class _Pred, class _Alloc>
1247unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1248 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1249 const key_equal& __eql)
1250 : __table_(__hf, __eql)
1251{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001252#if _LIBCPP_DEBUG_LEVEL >= 2
1253 __get_db()->__insert_c(this);
1254#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001255 __table_.rehash(__n);
1256 insert(__il.begin(), __il.end());
1257}
1258
1259template <class _Value, class _Hash, class _Pred, class _Alloc>
1260unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1261 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1262 const key_equal& __eql, const allocator_type& __a)
1263 : __table_(__hf, __eql, __a)
1264{
Howard Hinnantb24c8022013-07-23 22:01:58 +00001265#if _LIBCPP_DEBUG_LEVEL >= 2
1266 __get_db()->__insert_c(this);
1267#endif
Howard Hinnant3e519522010-05-11 19:42:16 +00001268 __table_.rehash(__n);
1269 insert(__il.begin(), __il.end());
1270}
1271
Howard Hinnant3e519522010-05-11 19:42:16 +00001272template <class _Value, class _Hash, class _Pred, class _Alloc>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +00001273inline
Howard Hinnant3e519522010-05-11 19:42:16 +00001274unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1275unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1276 unordered_multiset&& __u)
Howard Hinnant557da862011-06-04 20:18:37 +00001277 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnant3e519522010-05-11 19:42:16 +00001278{
Howard Hinnantce48a112011-06-30 21:18:19 +00001279 __table_ = _VSTD::move(__u.__table_);
Howard Hinnant3e519522010-05-11 19:42:16 +00001280 return *this;
1281}
1282
Howard Hinnant3e519522010-05-11 19:42:16 +00001283template <class _Value, class _Hash, class _Pred, class _Alloc>
1284inline
1285unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1286unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1287 initializer_list<value_type> __il)
1288{
1289 __table_.__assign_multi(__il.begin(), __il.end());
1290 return *this;
1291}
1292
Eric Fiselierf0f86ef2017-04-18 22:37:32 +00001293#endif // _LIBCPP_CXX03_LANG
Howard Hinnant54976f22011-08-12 21:56:02 +00001294
Howard Hinnant3e519522010-05-11 19:42:16 +00001295template <class _Value, class _Hash, class _Pred, class _Alloc>
1296template <class _InputIterator>
Evgeniy Stepanovcd31b432016-04-22 01:04:55 +00001297inline
Howard Hinnant3e519522010-05-11 19:42:16 +00001298void
1299unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1300 _InputIterator __last)
1301{
1302 for (; __first != __last; ++__first)
1303 __table_.__insert_multi(*__first);
1304}
1305
1306template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:28 +00001307inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001308void
1309swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1310 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant557da862011-06-04 20:18:37 +00001311 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnant3e519522010-05-11 19:42:16 +00001312{
1313 __x.swap(__y);
1314}
1315
1316template <class _Value, class _Hash, class _Pred, class _Alloc>
1317bool
1318operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1319 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1320{
1321 if (__x.size() != __y.size())
1322 return false;
1323 typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
1324 const_iterator;
1325 typedef pair<const_iterator, const_iterator> _EqRng;
1326 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
1327 {
1328 _EqRng __xeq = __x.equal_range(*__i);
1329 _EqRng __yeq = __y.equal_range(*__i);
Howard Hinnantce48a112011-06-30 21:18:19 +00001330 if (_VSTD::distance(__xeq.first, __xeq.second) !=
1331 _VSTD::distance(__yeq.first, __yeq.second) ||
1332 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnant3e519522010-05-11 19:42:16 +00001333 return false;
1334 __i = __xeq.second;
1335 }
1336 return true;
1337}
1338
1339template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant789847d2010-09-23 18:58:28 +00001340inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3e519522010-05-11 19:42:16 +00001341bool
1342operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1343 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1344{
1345 return !(__x == __y);
1346}
1347
1348_LIBCPP_END_NAMESPACE_STD
1349
1350#endif // _LIBCPP_UNORDERED_SET