blob: d06629fdcd47f95a69657bb0fa6e84a8d128e232 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- unordered_set -----------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-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 Hinnantbc8d3f92010-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 Hinnant04dae1d2011-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 Hinnantbc8d3f92010-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 Hinnant04dae1d2011-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 Hinnantbc8d3f92010-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 Clowbd444af2013-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 Hinnantbc8d3f92010-05-11 19:42:16 +000081 ~unordered_set();
82 unordered_set& operator=(const unordered_set&);
Howard Hinnant04dae1d2011-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 Hinnantbc8d3f92010-05-11 19:42:16 +000089 unordered_set& operator=(initializer_list<value_type>);
90
Howard Hinnant04dae1d2011-06-04 20:18:37 +000091 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000092
Howard Hinnant04dae1d2011-06-04 20:18:37 +000093 bool empty() const noexcept;
94 size_type size() const noexcept;
95 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000096
Howard Hinnant04dae1d2011-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 Hinnantbc8d3f92010-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);
117 size_type erase(const key_type& k);
118 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000119 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000120
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000121 void swap(unordered_set&)
122 noexcept(
123 (!allocator_type::propagate_on_container_swap::value ||
124 __is_nothrow_swappable<allocator_type>::value) &&
125 __is_nothrow_swappable<hasher>::value &&
126 __is_nothrow_swappable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000127
128 hasher hash_function() const;
129 key_equal key_eq() const;
130
131 iterator find(const key_type& k);
132 const_iterator find(const key_type& k) const;
133 size_type count(const key_type& k) const;
134 pair<iterator, iterator> equal_range(const key_type& k);
135 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
136
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000137 size_type bucket_count() const noexcept;
138 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000139
140 size_type bucket_size(size_type n) const;
141 size_type bucket(const key_type& k) const;
142
143 local_iterator begin(size_type n);
144 local_iterator end(size_type n);
145 const_local_iterator begin(size_type n) const;
146 const_local_iterator end(size_type n) const;
147 const_local_iterator cbegin(size_type n) const;
148 const_local_iterator cend(size_type n) const;
149
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000150 float load_factor() const noexcept;
151 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000152 void max_load_factor(float z);
153 void rehash(size_type n);
154 void reserve(size_type n);
155};
156
157template <class Value, class Hash, class Pred, class Alloc>
158 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000159 unordered_set<Value, Hash, Pred, Alloc>& y)
160 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000161
162template <class Value, class Hash, class Pred, class Alloc>
163 bool
164 operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
165 const unordered_set<Value, Hash, Pred, Alloc>& y);
166
167template <class Value, class Hash, class Pred, class Alloc>
168 bool
169 operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
170 const unordered_set<Value, Hash, Pred, Alloc>& y);
171
172template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
173 class Alloc = allocator<Value>>
174class unordered_multiset
175{
176public:
177 // types
178 typedef Value key_type;
179 typedef key_type value_type;
180 typedef Hash hasher;
181 typedef Pred key_equal;
182 typedef Alloc allocator_type;
183 typedef value_type& reference;
184 typedef const value_type& const_reference;
185 typedef typename allocator_traits<allocator_type>::pointer pointer;
186 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
187 typedef typename allocator_traits<allocator_type>::size_type size_type;
188 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
189
190 typedef /unspecified/ iterator;
191 typedef /unspecified/ const_iterator;
192 typedef /unspecified/ local_iterator;
193 typedef /unspecified/ const_local_iterator;
194
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000195 unordered_multiset()
196 noexcept(
197 is_nothrow_default_constructible<hasher>::value &&
198 is_nothrow_default_constructible<key_equal>::value &&
199 is_nothrow_default_constructible<allocator_type>::value);
200 explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201 const key_equal& eql = key_equal(),
202 const allocator_type& a = allocator_type());
203 template <class InputIterator>
204 unordered_multiset(InputIterator f, InputIterator l,
205 size_type n = 0, const hasher& hf = hasher(),
206 const key_equal& eql = key_equal(),
207 const allocator_type& a = allocator_type());
208 explicit unordered_multiset(const allocator_type&);
209 unordered_multiset(const unordered_multiset&);
210 unordered_multiset(const unordered_multiset&, const Allocator&);
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000211 unordered_multiset(unordered_multiset&&)
212 noexcept(
213 is_nothrow_move_constructible<hasher>::value &&
214 is_nothrow_move_constructible<key_equal>::value &&
215 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000216 unordered_multiset(unordered_multiset&&, const Allocator&);
217 unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
218 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
219 const allocator_type& a = allocator_type());
Marshall Clowbd444af2013-09-30 21:33:51 +0000220 unordered_multiset(size_type n, const allocator_type& a); // C++14
221 unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14
222 template <class InputIterator>
223 unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
224 template <class InputIterator>
225 unordered_multiset(InputIterator f, InputIterator l, size_type n,
226 const hasher& hf, const allocator_type& a); // C++14
227 unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
228 unordered_multiset(initializer_list<value_type> il, size_type n,
229 const hasher& hf, const allocator_type& a); // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000230 ~unordered_multiset();
231 unordered_multiset& operator=(const unordered_multiset&);
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000232 unordered_multiset& operator=(unordered_multiset&&)
233 noexcept(
234 allocator_type::propagate_on_container_move_assignment::value &&
235 is_nothrow_move_assignable<allocator_type>::value &&
236 is_nothrow_move_assignable<hasher>::value &&
237 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000238 unordered_multiset& operator=(initializer_list<value_type>);
239
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000240 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000241
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000242 bool empty() const noexcept;
243 size_type size() const noexcept;
244 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000245
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000246 iterator begin() noexcept;
247 iterator end() noexcept;
248 const_iterator begin() const noexcept;
249 const_iterator end() const noexcept;
250 const_iterator cbegin() const noexcept;
251 const_iterator cend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000252
253 template <class... Args>
254 iterator emplace(Args&&... args);
255 template <class... Args>
256 iterator emplace_hint(const_iterator position, Args&&... args);
257 iterator insert(const value_type& obj);
258 iterator insert(value_type&& obj);
259 iterator insert(const_iterator hint, const value_type& obj);
260 iterator insert(const_iterator hint, value_type&& obj);
261 template <class InputIterator>
262 void insert(InputIterator first, InputIterator last);
263 void insert(initializer_list<value_type>);
264
265 iterator erase(const_iterator position);
266 size_type erase(const key_type& k);
267 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000268 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000269
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000270 void swap(unordered_multiset&)
271 noexcept(
272 (!allocator_type::propagate_on_container_swap::value ||
273 __is_nothrow_swappable<allocator_type>::value) &&
274 __is_nothrow_swappable<hasher>::value &&
275 __is_nothrow_swappable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276
277 hasher hash_function() const;
278 key_equal key_eq() const;
279
280 iterator find(const key_type& k);
281 const_iterator find(const key_type& k) const;
282 size_type count(const key_type& k) const;
283 pair<iterator, iterator> equal_range(const key_type& k);
284 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
285
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000286 size_type bucket_count() const noexcept;
287 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000288
289 size_type bucket_size(size_type n) const;
290 size_type bucket(const key_type& k) const;
291
292 local_iterator begin(size_type n);
293 local_iterator end(size_type n);
294 const_local_iterator begin(size_type n) const;
295 const_local_iterator end(size_type n) const;
296 const_local_iterator cbegin(size_type n) const;
297 const_local_iterator cend(size_type n) const;
298
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000299 float load_factor() const noexcept;
300 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000301 void max_load_factor(float z);
302 void rehash(size_type n);
303 void reserve(size_type n);
304};
305
306template <class Value, class Hash, class Pred, class Alloc>
307 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000308 unordered_multiset<Value, Hash, Pred, Alloc>& y)
309 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000310
311template <class Value, class Hash, class Pred, class Alloc>
312 bool
313 operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
314 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
315
316template <class Value, class Hash, class Pred, class Alloc>
317 bool
318 operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
319 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
320} // std
321
322*/
323
324#include <__config>
325#include <__hash_table>
326#include <functional>
327
Dan Albert7112dae2014-11-20 15:55:17 -0800328#include <__debug>
329
Howard Hinnant08e17472011-10-17 20:05:10 +0000330#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000331#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000332#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000333
334_LIBCPP_BEGIN_NAMESPACE_STD
335
336template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
337 class _Alloc = allocator<_Value> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000338class _LIBCPP_TYPE_VIS_ONLY unordered_set
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000339{
340public:
341 // types
342 typedef _Value key_type;
343 typedef key_type value_type;
344 typedef _Hash hasher;
345 typedef _Pred key_equal;
346 typedef _Alloc allocator_type;
347 typedef value_type& reference;
348 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:58 +0000349 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
350 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000351
352private:
353 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
354
355 __table __table_;
356
357public:
358 typedef typename __table::pointer pointer;
359 typedef typename __table::const_pointer const_pointer;
360 typedef typename __table::size_type size_type;
361 typedef typename __table::difference_type difference_type;
362
363 typedef typename __table::const_iterator iterator;
364 typedef typename __table::const_iterator const_iterator;
365 typedef typename __table::const_local_iterator local_iterator;
366 typedef typename __table::const_local_iterator const_local_iterator;
367
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000369 unordered_set()
370 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58 +0000371 {
372#if _LIBCPP_DEBUG_LEVEL >= 2
373 __get_db()->__insert_c(this);
374#endif
375 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000376 explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
377 const key_equal& __eql = key_equal());
Marshall Clowbd444af2013-09-30 21:33:51 +0000378#if _LIBCPP_STD_VER > 11
379 inline _LIBCPP_INLINE_VISIBILITY
380 unordered_set(size_type __n, const allocator_type& __a)
381 : unordered_set(__n, hasher(), key_equal(), __a) {}
382 inline _LIBCPP_INLINE_VISIBILITY
383 unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a)
384 : unordered_set(__n, __hf, key_equal(), __a) {}
385#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000386 unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
387 const allocator_type& __a);
388 template <class _InputIterator>
389 unordered_set(_InputIterator __first, _InputIterator __last);
390 template <class _InputIterator>
391 unordered_set(_InputIterator __first, _InputIterator __last,
392 size_type __n, const hasher& __hf = hasher(),
393 const key_equal& __eql = key_equal());
394 template <class _InputIterator>
395 unordered_set(_InputIterator __first, _InputIterator __last,
396 size_type __n, const hasher& __hf, const key_equal& __eql,
397 const allocator_type& __a);
Marshall Clowbd444af2013-09-30 21:33:51 +0000398#if _LIBCPP_STD_VER > 11
399 template <class _InputIterator>
400 inline _LIBCPP_INLINE_VISIBILITY
401 unordered_set(_InputIterator __first, _InputIterator __last,
402 size_type __n, const allocator_type& __a)
403 : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {}
404 template <class _InputIterator>
405 unordered_set(_InputIterator __first, _InputIterator __last,
406 size_type __n, const hasher& __hf, const allocator_type& __a)
407 : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {}
408#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000409 explicit unordered_set(const allocator_type& __a);
410 unordered_set(const unordered_set& __u);
411 unordered_set(const unordered_set& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000412#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000413 unordered_set(unordered_set&& __u)
414 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000415 unordered_set(unordered_set&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000416#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000417#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000418 unordered_set(initializer_list<value_type> __il);
419 unordered_set(initializer_list<value_type> __il, size_type __n,
420 const hasher& __hf = hasher(),
421 const key_equal& __eql = key_equal());
422 unordered_set(initializer_list<value_type> __il, size_type __n,
423 const hasher& __hf, const key_equal& __eql,
424 const allocator_type& __a);
Marshall Clowbd444af2013-09-30 21:33:51 +0000425#if _LIBCPP_STD_VER > 11
426 inline _LIBCPP_INLINE_VISIBILITY
427 unordered_set(initializer_list<value_type> __il, size_type __n,
428 const allocator_type& __a)
429 : unordered_set(__il, __n, hasher(), key_equal(), __a) {}
430 inline _LIBCPP_INLINE_VISIBILITY
431 unordered_set(initializer_list<value_type> __il, size_type __n,
432 const hasher& __hf, const allocator_type& __a)
433 : unordered_set(__il, __n, __hf, key_equal(), __a) {}
434#endif
Howard Hinnante3e32912011-08-12 21:56:02 +0000435#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000436 // ~unordered_set() = default;
Howard Hinnant61aa6012011-07-01 19:24:36 +0000437 _LIBCPP_INLINE_VISIBILITY
438 unordered_set& operator=(const unordered_set& __u)
439 {
440 __table_ = __u.__table_;
441 return *this;
442 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000443#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000444 unordered_set& operator=(unordered_set&& __u)
445 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000446#endif
Howard Hinnante3e32912011-08-12 21:56:02 +0000447#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448 unordered_set& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02 +0000449#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000450
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000451 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000452 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000453 {return allocator_type(__table_.__node_alloc());}
454
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000456 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000458 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000460 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000461
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000463 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000465 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000467 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000468 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000469 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000471 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000473 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000474
Howard Hinnant73d21a42010-09-04 23:28:19 +0000475#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000476 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000478 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000479 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000480 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58 +0000482#if _LIBCPP_DEBUG_LEVEL >= 2
483 iterator emplace_hint(const_iterator __p, _Args&&... __args)
484 {
485 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
486 "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not"
487 " referring to this unordered_set");
488 return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
489 }
490#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000491 iterator emplace_hint(const_iterator, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000492 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
Howard Hinnant39213642013-07-23 22:01:58 +0000493#endif
Howard Hinnant73d21a42010-09-04 23:28:19 +0000494#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000496 pair<iterator, bool> insert(const value_type& __x)
497 {return __table_.__insert_unique(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000498#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000500 pair<iterator, bool> insert(value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000501 {return __table_.__insert_unique(_VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000502#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58 +0000504#if _LIBCPP_DEBUG_LEVEL >= 2
505 iterator insert(const_iterator __p, const value_type& __x)
506 {
507 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
508 "unordered_set::insert(const_iterator, const value_type&) called with an iterator not"
509 " referring to this unordered_set");
510 return insert(__x).first;
511 }
512#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000513 iterator insert(const_iterator, const value_type& __x)
514 {return insert(__x).first;}
Howard Hinnant39213642013-07-23 22:01:58 +0000515#endif
Howard Hinnant73d21a42010-09-04 23:28:19 +0000516#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58 +0000518#if _LIBCPP_DEBUG_LEVEL >= 2
519 iterator insert(const_iterator __p, value_type&& __x)
520 {
521 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
522 "unordered_set::insert(const_iterator, value_type&&) called with an iterator not"
523 " referring to this unordered_set");
524 return insert(_VSTD::move(__x)).first;
525 }
526#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000527 iterator insert(const_iterator, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000528 {return insert(_VSTD::move(__x)).first;}
Howard Hinnant39213642013-07-23 22:01:58 +0000529#endif
Howard Hinnant73d21a42010-09-04 23:28:19 +0000530#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000531 template <class _InputIterator>
532 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +0000533#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000535 void insert(initializer_list<value_type> __il)
536 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000537#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000538
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000542 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000544 iterator erase(const_iterator __first, const_iterator __last)
545 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000547 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000548
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000550 void swap(unordered_set& __u)
551 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
552 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000553
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000555 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000557 key_equal key_eq() const {return __table_.key_eq();}
558
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000560 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000562 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000564 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000566 pair<iterator, iterator> equal_range(const key_type& __k)
567 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000569 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
570 {return __table_.__equal_range_unique(__k);}
571
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000573 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000575 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000576
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000578 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000580 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
581
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000583 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000585 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000587 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000589 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000590 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000591 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000593 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
594
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000596 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000598 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000600 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000602 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000603 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnant39213642013-07-23 22:01:58 +0000605
606#if _LIBCPP_DEBUG_LEVEL >= 2
607
608 bool __dereferenceable(const const_iterator* __i) const
609 {return __table_.__dereferenceable(__i);}
610 bool __decrementable(const const_iterator* __i) const
611 {return __table_.__decrementable(__i);}
612 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
613 {return __table_.__addable(__i, __n);}
614 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
615 {return __table_.__addable(__i, __n);}
616
617#endif // _LIBCPP_DEBUG_LEVEL >= 2
618
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000619};
620
621template <class _Value, class _Hash, class _Pred, class _Alloc>
622unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
623 const hasher& __hf, const key_equal& __eql)
624 : __table_(__hf, __eql)
625{
Howard Hinnant39213642013-07-23 22:01:58 +0000626#if _LIBCPP_DEBUG_LEVEL >= 2
627 __get_db()->__insert_c(this);
628#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000629 __table_.rehash(__n);
630}
631
632template <class _Value, class _Hash, class _Pred, class _Alloc>
633unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
634 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
635 : __table_(__hf, __eql, __a)
636{
Howard Hinnant39213642013-07-23 22:01:58 +0000637#if _LIBCPP_DEBUG_LEVEL >= 2
638 __get_db()->__insert_c(this);
639#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000640 __table_.rehash(__n);
641}
642
643template <class _Value, class _Hash, class _Pred, class _Alloc>
644template <class _InputIterator>
645unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
646 _InputIterator __first, _InputIterator __last)
647{
Howard Hinnant39213642013-07-23 22:01:58 +0000648#if _LIBCPP_DEBUG_LEVEL >= 2
649 __get_db()->__insert_c(this);
650#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000651 insert(__first, __last);
652}
653
654template <class _Value, class _Hash, class _Pred, class _Alloc>
655template <class _InputIterator>
656unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
657 _InputIterator __first, _InputIterator __last, size_type __n,
658 const hasher& __hf, const key_equal& __eql)
659 : __table_(__hf, __eql)
660{
Howard Hinnant39213642013-07-23 22:01:58 +0000661#if _LIBCPP_DEBUG_LEVEL >= 2
662 __get_db()->__insert_c(this);
663#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664 __table_.rehash(__n);
665 insert(__first, __last);
666}
667
668template <class _Value, class _Hash, class _Pred, class _Alloc>
669template <class _InputIterator>
670unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
671 _InputIterator __first, _InputIterator __last, size_type __n,
672 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
673 : __table_(__hf, __eql, __a)
674{
Howard Hinnant39213642013-07-23 22:01:58 +0000675#if _LIBCPP_DEBUG_LEVEL >= 2
676 __get_db()->__insert_c(this);
677#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000678 __table_.rehash(__n);
679 insert(__first, __last);
680}
681
682template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000683inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000684unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
685 const allocator_type& __a)
686 : __table_(__a)
687{
Howard Hinnant39213642013-07-23 22:01:58 +0000688#if _LIBCPP_DEBUG_LEVEL >= 2
689 __get_db()->__insert_c(this);
690#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000691}
692
693template <class _Value, class _Hash, class _Pred, class _Alloc>
694unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
695 const unordered_set& __u)
696 : __table_(__u.__table_)
697{
Howard Hinnant39213642013-07-23 22:01:58 +0000698#if _LIBCPP_DEBUG_LEVEL >= 2
699 __get_db()->__insert_c(this);
700#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000701 __table_.rehash(__u.bucket_count());
702 insert(__u.begin(), __u.end());
703}
704
705template <class _Value, class _Hash, class _Pred, class _Alloc>
706unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
707 const unordered_set& __u, const allocator_type& __a)
708 : __table_(__u.__table_, __a)
709{
Howard Hinnant39213642013-07-23 22:01:58 +0000710#if _LIBCPP_DEBUG_LEVEL >= 2
711 __get_db()->__insert_c(this);
712#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000713 __table_.rehash(__u.bucket_count());
714 insert(__u.begin(), __u.end());
715}
716
Howard Hinnant73d21a42010-09-04 23:28:19 +0000717#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000718
719template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000720inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000721unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
722 unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000723 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000724 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000725{
Howard Hinnant39213642013-07-23 22:01:58 +0000726#if _LIBCPP_DEBUG_LEVEL >= 2
727 __get_db()->__insert_c(this);
728 __get_db()->swap(this, &__u);
729#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000730}
731
732template <class _Value, class _Hash, class _Pred, class _Alloc>
733unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
734 unordered_set&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000735 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000736{
Howard Hinnant39213642013-07-23 22:01:58 +0000737#if _LIBCPP_DEBUG_LEVEL >= 2
738 __get_db()->__insert_c(this);
739#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000740 if (__a != __u.get_allocator())
741 {
742 iterator __i = __u.begin();
743 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000744 __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000745 }
Howard Hinnant39213642013-07-23 22:01:58 +0000746#if _LIBCPP_DEBUG_LEVEL >= 2
747 else
748 __get_db()->swap(this, &__u);
749#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000750}
751
Howard Hinnant73d21a42010-09-04 23:28:19 +0000752#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000753
Howard Hinnante3e32912011-08-12 21:56:02 +0000754#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
755
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000756template <class _Value, class _Hash, class _Pred, class _Alloc>
757unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
758 initializer_list<value_type> __il)
759{
Howard Hinnant39213642013-07-23 22:01:58 +0000760#if _LIBCPP_DEBUG_LEVEL >= 2
761 __get_db()->__insert_c(this);
762#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000763 insert(__il.begin(), __il.end());
764}
765
766template <class _Value, class _Hash, class _Pred, class _Alloc>
767unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
768 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
769 const key_equal& __eql)
770 : __table_(__hf, __eql)
771{
Howard Hinnant39213642013-07-23 22:01:58 +0000772#if _LIBCPP_DEBUG_LEVEL >= 2
773 __get_db()->__insert_c(this);
774#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000775 __table_.rehash(__n);
776 insert(__il.begin(), __il.end());
777}
778
779template <class _Value, class _Hash, class _Pred, class _Alloc>
780unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
781 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
782 const key_equal& __eql, const allocator_type& __a)
783 : __table_(__hf, __eql, __a)
784{
Howard Hinnant39213642013-07-23 22:01:58 +0000785#if _LIBCPP_DEBUG_LEVEL >= 2
786 __get_db()->__insert_c(this);
787#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000788 __table_.rehash(__n);
789 insert(__il.begin(), __il.end());
790}
791
Howard Hinnante3e32912011-08-12 21:56:02 +0000792#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
793
Howard Hinnant73d21a42010-09-04 23:28:19 +0000794#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000795
796template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000797inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000798unordered_set<_Value, _Hash, _Pred, _Alloc>&
799unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000800 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000801{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000802 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000803 return *this;
804}
805
Howard Hinnant73d21a42010-09-04 23:28:19 +0000806#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000807
Howard Hinnante3e32912011-08-12 21:56:02 +0000808#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
809
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000810template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000812unordered_set<_Value, _Hash, _Pred, _Alloc>&
813unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
814 initializer_list<value_type> __il)
815{
816 __table_.__assign_unique(__il.begin(), __il.end());
817 return *this;
818}
819
Howard Hinnante3e32912011-08-12 21:56:02 +0000820#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
821
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000822template <class _Value, class _Hash, class _Pred, class _Alloc>
823template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000824inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000825void
826unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
827 _InputIterator __last)
828{
829 for (; __first != __last; ++__first)
830 __table_.__insert_unique(*__first);
831}
832
833template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000834inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000835void
836swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
837 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000838 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000839{
840 __x.swap(__y);
841}
842
843template <class _Value, class _Hash, class _Pred, class _Alloc>
844bool
845operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
846 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
847{
848 if (__x.size() != __y.size())
849 return false;
850 typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
851 const_iterator;
852 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
853 __i != __ex; ++__i)
854 {
855 const_iterator __j = __y.find(*__i);
856 if (__j == __ey || !(*__i == *__j))
857 return false;
858 }
859 return true;
860}
861
862template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000863inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000864bool
865operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
866 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
867{
868 return !(__x == __y);
869}
870
871template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
872 class _Alloc = allocator<_Value> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000873class _LIBCPP_TYPE_VIS_ONLY unordered_multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000874{
875public:
876 // types
877 typedef _Value key_type;
878 typedef key_type value_type;
879 typedef _Hash hasher;
880 typedef _Pred key_equal;
881 typedef _Alloc allocator_type;
882 typedef value_type& reference;
883 typedef const value_type& const_reference;
Howard Hinnant39213642013-07-23 22:01:58 +0000884 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
885 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000886
887private:
888 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
889
890 __table __table_;
891
892public:
893 typedef typename __table::pointer pointer;
894 typedef typename __table::const_pointer const_pointer;
895 typedef typename __table::size_type size_type;
896 typedef typename __table::difference_type difference_type;
897
898 typedef typename __table::const_iterator iterator;
899 typedef typename __table::const_iterator const_iterator;
900 typedef typename __table::const_local_iterator local_iterator;
901 typedef typename __table::const_local_iterator const_local_iterator;
902
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000904 unordered_multiset()
905 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58 +0000906 {
907#if _LIBCPP_DEBUG_LEVEL >= 2
908 __get_db()->__insert_c(this);
909#endif
910 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000911 explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
912 const key_equal& __eql = key_equal());
913 unordered_multiset(size_type __n, const hasher& __hf,
914 const key_equal& __eql, const allocator_type& __a);
Marshall Clowbd444af2013-09-30 21:33:51 +0000915#if _LIBCPP_STD_VER > 11
916 inline _LIBCPP_INLINE_VISIBILITY
917 unordered_multiset(size_type __n, const allocator_type& __a)
918 : unordered_multiset(__n, hasher(), key_equal(), __a) {}
919 inline _LIBCPP_INLINE_VISIBILITY
920 unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a)
921 : unordered_multiset(__n, __hf, key_equal(), __a) {}
922#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000923 template <class _InputIterator>
924 unordered_multiset(_InputIterator __first, _InputIterator __last);
925 template <class _InputIterator>
926 unordered_multiset(_InputIterator __first, _InputIterator __last,
927 size_type __n, const hasher& __hf = hasher(),
928 const key_equal& __eql = key_equal());
929 template <class _InputIterator>
930 unordered_multiset(_InputIterator __first, _InputIterator __last,
931 size_type __n , const hasher& __hf,
932 const key_equal& __eql, const allocator_type& __a);
Marshall Clowbd444af2013-09-30 21:33:51 +0000933#if _LIBCPP_STD_VER > 11
934 template <class _InputIterator>
935 inline _LIBCPP_INLINE_VISIBILITY
936 unordered_multiset(_InputIterator __first, _InputIterator __last,
937 size_type __n, const allocator_type& __a)
938 : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {}
939 template <class _InputIterator>
940 inline _LIBCPP_INLINE_VISIBILITY
941 unordered_multiset(_InputIterator __first, _InputIterator __last,
942 size_type __n, const hasher& __hf, const allocator_type& __a)
943 : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {}
944#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000945 explicit unordered_multiset(const allocator_type& __a);
946 unordered_multiset(const unordered_multiset& __u);
947 unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000948#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000949 unordered_multiset(unordered_multiset&& __u)
950 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000951 unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000952#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000953#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000954 unordered_multiset(initializer_list<value_type> __il);
955 unordered_multiset(initializer_list<value_type> __il, size_type __n,
956 const hasher& __hf = hasher(),
957 const key_equal& __eql = key_equal());
958 unordered_multiset(initializer_list<value_type> __il, size_type __n,
959 const hasher& __hf, const key_equal& __eql,
960 const allocator_type& __a);
Marshall Clowbd444af2013-09-30 21:33:51 +0000961#if _LIBCPP_STD_VER > 11
962 inline _LIBCPP_INLINE_VISIBILITY
963 unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
964 : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {}
965 inline _LIBCPP_INLINE_VISIBILITY
966 unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a)
967 : unordered_multiset(__il, __n, __hf, key_equal(), __a) {}
968#endif
Howard Hinnante3e32912011-08-12 21:56:02 +0000969#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000970 // ~unordered_multiset() = default;
Howard Hinnant61aa6012011-07-01 19:24:36 +0000971 _LIBCPP_INLINE_VISIBILITY
972 unordered_multiset& operator=(const unordered_multiset& __u)
973 {
974 __table_ = __u.__table_;
975 return *this;
976 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000977#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000978 unordered_multiset& operator=(unordered_multiset&& __u)
979 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000980#endif
Howard Hinnante3e32912011-08-12 21:56:02 +0000981#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000982 unordered_multiset& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02 +0000983#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000984
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000986 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000987 {return allocator_type(__table_.__node_alloc());}
988
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000989 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000990 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000992 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000993 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000994 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000995
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000997 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +0000999 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001001 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001002 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001003 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001005 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001007 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001008
Howard Hinnant73d21a42010-09-04 23:28:19 +00001009#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001010 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001011 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001012 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001013 {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001014 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001015 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001016 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001017 {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001018#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001020 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001021#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant0949eed2011-06-30 21:18:19 +00001023 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001024#endif
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001025 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001026 iterator insert(const_iterator __p, const value_type& __x)
1027 {return __table_.__insert_multi(__p, __x);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001028#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001030 iterator insert(const_iterator __p, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001031 {return __table_.__insert_multi(__p, _VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001032#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001033 template <class _InputIterator>
1034 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001035#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001036 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001037 void insert(initializer_list<value_type> __il)
1038 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001039#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001040
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001042 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001043 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001044 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001046 iterator erase(const_iterator __first, const_iterator __last)
1047 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001049 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001050
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001052 void swap(unordered_multiset& __u)
1053 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1054 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001055
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001056 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001057 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001059 key_equal key_eq() const {return __table_.key_eq();}
1060
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001062 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001063 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001064 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001065 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001066 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001067 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001068 pair<iterator, iterator> equal_range(const key_type& __k)
1069 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001070 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001071 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1072 {return __table_.__equal_range_multi(__k);}
1073
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001075 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001076 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001077 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001078
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001080 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001081 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001082 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1083
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001084 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001085 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001087 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001088 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001089 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001090 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001091 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001093 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001095 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1096
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001097 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001098 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001099 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001100 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001101 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001102 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001104 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001106 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnant39213642013-07-23 22:01:58 +00001107
1108#if _LIBCPP_DEBUG_LEVEL >= 2
1109
1110 bool __dereferenceable(const const_iterator* __i) const
1111 {return __table_.__dereferenceable(__i);}
1112 bool __decrementable(const const_iterator* __i) const
1113 {return __table_.__decrementable(__i);}
1114 bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1115 {return __table_.__addable(__i, __n);}
1116 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1117 {return __table_.__addable(__i, __n);}
1118
1119#endif // _LIBCPP_DEBUG_LEVEL >= 2
1120
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001121};
1122
1123template <class _Value, class _Hash, class _Pred, class _Alloc>
1124unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1125 size_type __n, const hasher& __hf, const key_equal& __eql)
1126 : __table_(__hf, __eql)
1127{
Howard Hinnant39213642013-07-23 22:01:58 +00001128#if _LIBCPP_DEBUG_LEVEL >= 2
1129 __get_db()->__insert_c(this);
1130#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001131 __table_.rehash(__n);
1132}
1133
1134template <class _Value, class _Hash, class _Pred, class _Alloc>
1135unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1136 size_type __n, const hasher& __hf, const key_equal& __eql,
1137 const allocator_type& __a)
1138 : __table_(__hf, __eql, __a)
1139{
Howard Hinnant39213642013-07-23 22:01:58 +00001140#if _LIBCPP_DEBUG_LEVEL >= 2
1141 __get_db()->__insert_c(this);
1142#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001143 __table_.rehash(__n);
1144}
1145
1146template <class _Value, class _Hash, class _Pred, class _Alloc>
1147template <class _InputIterator>
1148unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1149 _InputIterator __first, _InputIterator __last)
1150{
Howard Hinnant39213642013-07-23 22:01:58 +00001151#if _LIBCPP_DEBUG_LEVEL >= 2
1152 __get_db()->__insert_c(this);
1153#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001154 insert(__first, __last);
1155}
1156
1157template <class _Value, class _Hash, class _Pred, class _Alloc>
1158template <class _InputIterator>
1159unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1160 _InputIterator __first, _InputIterator __last, size_type __n,
1161 const hasher& __hf, const key_equal& __eql)
1162 : __table_(__hf, __eql)
1163{
Howard Hinnant39213642013-07-23 22:01:58 +00001164#if _LIBCPP_DEBUG_LEVEL >= 2
1165 __get_db()->__insert_c(this);
1166#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001167 __table_.rehash(__n);
1168 insert(__first, __last);
1169}
1170
1171template <class _Value, class _Hash, class _Pred, class _Alloc>
1172template <class _InputIterator>
1173unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1174 _InputIterator __first, _InputIterator __last, size_type __n,
1175 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1176 : __table_(__hf, __eql, __a)
1177{
Howard Hinnant39213642013-07-23 22:01:58 +00001178#if _LIBCPP_DEBUG_LEVEL >= 2
1179 __get_db()->__insert_c(this);
1180#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001181 __table_.rehash(__n);
1182 insert(__first, __last);
1183}
1184
1185template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001186inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001187unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1188 const allocator_type& __a)
1189 : __table_(__a)
1190{
Howard Hinnant39213642013-07-23 22:01:58 +00001191#if _LIBCPP_DEBUG_LEVEL >= 2
1192 __get_db()->__insert_c(this);
1193#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001194}
1195
1196template <class _Value, class _Hash, class _Pred, class _Alloc>
1197unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1198 const unordered_multiset& __u)
1199 : __table_(__u.__table_)
1200{
Howard Hinnant39213642013-07-23 22:01:58 +00001201#if _LIBCPP_DEBUG_LEVEL >= 2
1202 __get_db()->__insert_c(this);
1203#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001204 __table_.rehash(__u.bucket_count());
1205 insert(__u.begin(), __u.end());
1206}
1207
1208template <class _Value, class _Hash, class _Pred, class _Alloc>
1209unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1210 const unordered_multiset& __u, const allocator_type& __a)
1211 : __table_(__u.__table_, __a)
1212{
Howard Hinnant39213642013-07-23 22:01:58 +00001213#if _LIBCPP_DEBUG_LEVEL >= 2
1214 __get_db()->__insert_c(this);
1215#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001216 __table_.rehash(__u.bucket_count());
1217 insert(__u.begin(), __u.end());
1218}
1219
Howard Hinnant73d21a42010-09-04 23:28:19 +00001220#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001221
1222template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001223inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001224unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1225 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001226 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001227 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001228{
Howard Hinnant39213642013-07-23 22:01:58 +00001229#if _LIBCPP_DEBUG_LEVEL >= 2
1230 __get_db()->__insert_c(this);
1231 __get_db()->swap(this, &__u);
1232#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001233}
1234
1235template <class _Value, class _Hash, class _Pred, class _Alloc>
1236unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1237 unordered_multiset&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001238 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001239{
Howard Hinnant39213642013-07-23 22:01:58 +00001240#if _LIBCPP_DEBUG_LEVEL >= 2
1241 __get_db()->__insert_c(this);
1242#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001243 if (__a != __u.get_allocator())
1244 {
1245 iterator __i = __u.begin();
1246 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001247 __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001248 }
Howard Hinnant39213642013-07-23 22:01:58 +00001249#if _LIBCPP_DEBUG_LEVEL >= 2
1250 else
1251 __get_db()->swap(this, &__u);
1252#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001253}
1254
Howard Hinnant73d21a42010-09-04 23:28:19 +00001255#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001256
Howard Hinnante3e32912011-08-12 21:56:02 +00001257#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1258
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001259template <class _Value, class _Hash, class _Pred, class _Alloc>
1260unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1261 initializer_list<value_type> __il)
1262{
Howard Hinnant39213642013-07-23 22:01:58 +00001263#if _LIBCPP_DEBUG_LEVEL >= 2
1264 __get_db()->__insert_c(this);
1265#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001266 insert(__il.begin(), __il.end());
1267}
1268
1269template <class _Value, class _Hash, class _Pred, class _Alloc>
1270unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1271 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1272 const key_equal& __eql)
1273 : __table_(__hf, __eql)
1274{
Howard Hinnant39213642013-07-23 22:01:58 +00001275#if _LIBCPP_DEBUG_LEVEL >= 2
1276 __get_db()->__insert_c(this);
1277#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001278 __table_.rehash(__n);
1279 insert(__il.begin(), __il.end());
1280}
1281
1282template <class _Value, class _Hash, class _Pred, class _Alloc>
1283unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1284 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1285 const key_equal& __eql, const allocator_type& __a)
1286 : __table_(__hf, __eql, __a)
1287{
Howard Hinnant39213642013-07-23 22:01:58 +00001288#if _LIBCPP_DEBUG_LEVEL >= 2
1289 __get_db()->__insert_c(this);
1290#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001291 __table_.rehash(__n);
1292 insert(__il.begin(), __il.end());
1293}
1294
Howard Hinnante3e32912011-08-12 21:56:02 +00001295#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1296
Howard Hinnant73d21a42010-09-04 23:28:19 +00001297#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001298
1299template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001300inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001301unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1302unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1303 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001304 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001305{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001306 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001307 return *this;
1308}
1309
Howard Hinnant73d21a42010-09-04 23:28:19 +00001310#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001311
Howard Hinnante3e32912011-08-12 21:56:02 +00001312#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1313
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001314template <class _Value, class _Hash, class _Pred, class _Alloc>
1315inline
1316unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1317unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1318 initializer_list<value_type> __il)
1319{
1320 __table_.__assign_multi(__il.begin(), __il.end());
1321 return *this;
1322}
1323
Howard Hinnante3e32912011-08-12 21:56:02 +00001324#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1325
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001326template <class _Value, class _Hash, class _Pred, class _Alloc>
1327template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001328inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001329void
1330unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1331 _InputIterator __last)
1332{
1333 for (; __first != __last; ++__first)
1334 __table_.__insert_multi(*__first);
1335}
1336
1337template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001339void
1340swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1341 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:37 +00001342 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001343{
1344 __x.swap(__y);
1345}
1346
1347template <class _Value, class _Hash, class _Pred, class _Alloc>
1348bool
1349operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1350 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1351{
1352 if (__x.size() != __y.size())
1353 return false;
1354 typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
1355 const_iterator;
1356 typedef pair<const_iterator, const_iterator> _EqRng;
1357 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
1358 {
1359 _EqRng __xeq = __x.equal_range(*__i);
1360 _EqRng __yeq = __y.equal_range(*__i);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001361 if (_VSTD::distance(__xeq.first, __xeq.second) !=
1362 _VSTD::distance(__yeq.first, __yeq.second) ||
1363 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001364 return false;
1365 __i = __xeq.second;
1366 }
1367 return true;
1368}
1369
1370template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001371inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001372bool
1373operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1374 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1375{
1376 return !(__x == __y);
1377}
1378
1379_LIBCPP_END_NAMESPACE_STD
1380
1381#endif // _LIBCPP_UNORDERED_SET