blob: d06629fdcd47f95a69657bb0fa6e84a8d128e232 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===-------------------------- unordered_set -----------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-11-16 22:09:026// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:168//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_UNORDERED_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:3746 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:1652 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:3762 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:1667 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:5171 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:1681 ~unordered_set();
82 unordered_set& operator=(const unordered_set&);
Howard Hinnant04dae1d2011-06-04 20:18:3783 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:1689 unordered_set& operator=(initializer_list<value_type>);
90
Howard Hinnant04dae1d2011-06-04 20:18:3791 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1692
Howard Hinnant04dae1d2011-06-04 20:18:3793 bool empty() const noexcept;
94 size_type size() const noexcept;
95 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1696
Howard Hinnant04dae1d2011-06-04 20:18:3797 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:16103
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:37119 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16120
Howard Hinnant04dae1d2011-06-04 20:18:37121 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:16127
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:37137 size_type bucket_count() const noexcept;
138 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16139
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:37150 float load_factor() const noexcept;
151 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16152 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:37159 unordered_set<Value, Hash, Pred, Alloc>& y)
160 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16161
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:37195 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:16201 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:37211 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:16216 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:51220 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:16230 ~unordered_multiset();
231 unordered_multiset& operator=(const unordered_multiset&);
Howard Hinnant04dae1d2011-06-04 20:18:37232 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:16238 unordered_multiset& operator=(initializer_list<value_type>);
239
Howard Hinnant04dae1d2011-06-04 20:18:37240 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16241
Howard Hinnant04dae1d2011-06-04 20:18:37242 bool empty() const noexcept;
243 size_type size() const noexcept;
244 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16245
Howard Hinnant04dae1d2011-06-04 20:18:37246 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:16252
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:37268 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16269
Howard Hinnant04dae1d2011-06-04 20:18:37270 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:16276
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:37286 size_type bucket_count() const noexcept;
287 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16288
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:37299 float load_factor() const noexcept;
300 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16301 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:37308 unordered_multiset<Value, Hash, Pred, Alloc>& y)
309 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16310
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
Eric Fiselierb9536102014-08-10 23:53:08328#include <__debug>
329
Howard Hinnant08e17472011-10-17 20:05:10330#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16331#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10332#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16333
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:34338class _LIBCPP_TYPE_VIS_ONLY unordered_set
Howard Hinnantbc8d3f92010-05-11 19:42:16339{
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:58349 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
350 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16351
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:28368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37369 unordered_set()
370 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58371 {
372#if _LIBCPP_DEBUG_LEVEL >= 2
373 __get_db()->__insert_c(this);
374#endif
375 }
Howard Hinnantbc8d3f92010-05-11 19:42:16376 explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
377 const key_equal& __eql = key_equal());
Marshall Clowbd444af2013-09-30 21:33:51378#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:16386 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:51398#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:16409 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:19412#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37413 unordered_set(unordered_set&& __u)
414 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16415 unordered_set(unordered_set&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19416#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02417#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16418 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:51425#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:02435#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16436 // ~unordered_set() = default;
Howard Hinnant61aa6012011-07-01 19:24:36437 _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:19443#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37444 unordered_set& operator=(unordered_set&& __u)
445 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16446#endif
Howard Hinnante3e32912011-08-12 21:56:02447#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16448 unordered_set& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02449#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16450
Howard Hinnantee6ccd02010-09-23 18:58:28451 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37452 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16453 {return allocator_type(__table_.__node_alloc());}
454
Howard Hinnantee6ccd02010-09-23 18:58:28455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37456 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37458 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37460 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16461
Howard Hinnantee6ccd02010-09-23 18:58:28462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37463 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37465 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37467 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28468 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37469 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37471 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37473 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16474
Howard Hinnant73d21a42010-09-04 23:28:19475#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16476 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16478 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19479 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16480 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58482#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:16491 iterator emplace_hint(const_iterator, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19492 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
Howard Hinnant39213642013-07-23 22:01:58493#endif
Howard Hinnant73d21a42010-09-04 23:28:19494#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:28495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16496 pair<iterator, bool> insert(const value_type& __x)
497 {return __table_.__insert_unique(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19498#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16500 pair<iterator, bool> insert(value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19501 {return __table_.__insert_unique(_VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19502#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58504#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:16513 iterator insert(const_iterator, const value_type& __x)
514 {return insert(__x).first;}
Howard Hinnant39213642013-07-23 22:01:58515#endif
Howard Hinnant73d21a42010-09-04 23:28:19516#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant39213642013-07-23 22:01:58518#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:16527 iterator insert(const_iterator, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19528 {return insert(_VSTD::move(__x)).first;}
Howard Hinnant39213642013-07-23 22:01:58529#endif
Howard Hinnant73d21a42010-09-04 23:28:19530#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16531 template <class _InputIterator>
532 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02533#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16535 void insert(initializer_list<value_type> __il)
536 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02537#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16538
Howard Hinnantee6ccd02010-09-23 18:58:28539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16540 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:28541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16542 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16544 iterator erase(const_iterator __first, const_iterator __last)
545 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:28546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37547 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16548
Howard Hinnantee6ccd02010-09-23 18:58:28549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37550 void swap(unordered_set& __u)
551 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
552 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16553
Howard Hinnantee6ccd02010-09-23 18:58:28554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16555 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:28556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16557 key_equal key_eq() const {return __table_.key_eq();}
558
Howard Hinnantee6ccd02010-09-23 18:58:28559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16560 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16562 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16564 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16566 pair<iterator, iterator> equal_range(const key_type& __k)
567 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16569 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:28572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37573 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:28574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37575 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:16576
Howard Hinnantee6ccd02010-09-23 18:58:28577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16578 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16580 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
581
Howard Hinnantee6ccd02010-09-23 18:58:28582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16583 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16585 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16587 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16589 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28590 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16591 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16593 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
594
Howard Hinnantee6ccd02010-09-23 18:58:28595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37596 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37598 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16600 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:28601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16602 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28603 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16604 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnant39213642013-07-23 22:01:58605
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:16619};
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:58626#if _LIBCPP_DEBUG_LEVEL >= 2
627 __get_db()->__insert_c(this);
628#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16629 __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:58637#if _LIBCPP_DEBUG_LEVEL >= 2
638 __get_db()->__insert_c(this);
639#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16640 __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:58648#if _LIBCPP_DEBUG_LEVEL >= 2
649 __get_db()->__insert_c(this);
650#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16651 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:58661#if _LIBCPP_DEBUG_LEVEL >= 2
662 __get_db()->__insert_c(this);
663#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16664 __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:58675#if _LIBCPP_DEBUG_LEVEL >= 2
676 __get_db()->__insert_c(this);
677#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16678 __table_.rehash(__n);
679 insert(__first, __last);
680}
681
682template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28683inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16684unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
685 const allocator_type& __a)
686 : __table_(__a)
687{
Howard Hinnant39213642013-07-23 22:01:58688#if _LIBCPP_DEBUG_LEVEL >= 2
689 __get_db()->__insert_c(this);
690#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16691}
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:58698#if _LIBCPP_DEBUG_LEVEL >= 2
699 __get_db()->__insert_c(this);
700#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16701 __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:58710#if _LIBCPP_DEBUG_LEVEL >= 2
711 __get_db()->__insert_c(this);
712#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16713 __table_.rehash(__u.bucket_count());
714 insert(__u.begin(), __u.end());
715}
716
Howard Hinnant73d21a42010-09-04 23:28:19717#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16718
719template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28720inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16721unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
722 unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37723 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:19724 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:16725{
Howard Hinnant39213642013-07-23 22:01:58726#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:16730}
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:19735 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16736{
Howard Hinnant39213642013-07-23 22:01:58737#if _LIBCPP_DEBUG_LEVEL >= 2
738 __get_db()->__insert_c(this);
739#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16740 if (__a != __u.get_allocator())
741 {
742 iterator __i = __u.begin();
743 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:19744 __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16745 }
Howard Hinnant39213642013-07-23 22:01:58746#if _LIBCPP_DEBUG_LEVEL >= 2
747 else
748 __get_db()->swap(this, &__u);
749#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16750}
751
Howard Hinnant73d21a42010-09-04 23:28:19752#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16753
Howard Hinnante3e32912011-08-12 21:56:02754#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
755
Howard Hinnantbc8d3f92010-05-11 19:42:16756template <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:58760#if _LIBCPP_DEBUG_LEVEL >= 2
761 __get_db()->__insert_c(this);
762#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16763 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:58772#if _LIBCPP_DEBUG_LEVEL >= 2
773 __get_db()->__insert_c(this);
774#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16775 __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:58785#if _LIBCPP_DEBUG_LEVEL >= 2
786 __get_db()->__insert_c(this);
787#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16788 __table_.rehash(__n);
789 insert(__il.begin(), __il.end());
790}
791
Howard Hinnante3e32912011-08-12 21:56:02792#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
793
Howard Hinnant73d21a42010-09-04 23:28:19794#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16795
796template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28797inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16798unordered_set<_Value, _Hash, _Pred, _Alloc>&
799unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37800 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16801{
Howard Hinnant0949eed2011-06-30 21:18:19802 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:16803 return *this;
804}
805
Howard Hinnant73d21a42010-09-04 23:28:19806#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16807
Howard Hinnante3e32912011-08-12 21:56:02808#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
809
Howard Hinnantbc8d3f92010-05-11 19:42:16810template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16812unordered_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:02820#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
821
Howard Hinnantbc8d3f92010-05-11 19:42:16822template <class _Value, class _Hash, class _Pred, class _Alloc>
823template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:28824inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16825void
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:28834inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16835void
836swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
837 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:37838 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16839{
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:28863inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16864bool
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:34873class _LIBCPP_TYPE_VIS_ONLY unordered_multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16874{
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:58884 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
885 "Invalid allocator::value_type");
Howard Hinnantbc8d3f92010-05-11 19:42:16886
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:28903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37904 unordered_multiset()
905 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
Howard Hinnant39213642013-07-23 22:01:58906 {
907#if _LIBCPP_DEBUG_LEVEL >= 2
908 __get_db()->__insert_c(this);
909#endif
910 }
Howard Hinnantbc8d3f92010-05-11 19:42:16911 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:51915#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:16923 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:51933#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:16945 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:19948#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37949 unordered_multiset(unordered_multiset&& __u)
950 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16951 unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19952#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02953#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16954 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:51961#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:02969#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16970 // ~unordered_multiset() = default;
Howard Hinnant61aa6012011-07-01 19:24:36971 _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:19977#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37978 unordered_multiset& operator=(unordered_multiset&& __u)
979 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16980#endif
Howard Hinnante3e32912011-08-12 21:56:02981#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16982 unordered_multiset& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02983#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16984
Howard Hinnantee6ccd02010-09-23 18:58:28985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37986 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16987 {return allocator_type(__table_.__node_alloc());}
988
Howard Hinnantee6ccd02010-09-23 18:58:28989 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37990 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37992 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28993 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37994 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16995
Howard Hinnantee6ccd02010-09-23 18:58:28996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37997 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37999 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371001 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281002 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371003 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:281004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371005 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:281006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371007 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:161008
Howard Hinnant73d21a42010-09-04 23:28:191009#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:161010 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:281011 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161012 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:191013 {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:161014 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:281015 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161016 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:191017 {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:191018#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:281019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161020 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Howard Hinnant73d21a42010-09-04 23:28:191021#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:281022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant0949eed2011-06-30 21:18:191023 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
Howard Hinnantbc8d3f92010-05-11 19:42:161024#endif
Howard Hinnantee6ccd02010-09-23 18:58:281025 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161026 iterator insert(const_iterator __p, const value_type& __x)
1027 {return __table_.__insert_multi(__p, __x);}
Howard Hinnant73d21a42010-09-04 23:28:191028#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:281029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161030 iterator insert(const_iterator __p, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:191031 {return __table_.__insert_multi(__p, _VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:191032#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161033 template <class _InputIterator>
1034 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021035#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:281036 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161037 void insert(initializer_list<value_type> __il)
1038 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021039#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161040
Howard Hinnantee6ccd02010-09-23 18:58:281041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161042 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:281043 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161044 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161046 iterator erase(const_iterator __first, const_iterator __last)
1047 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:281048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371049 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161050
Howard Hinnantee6ccd02010-09-23 18:58:281051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371052 void swap(unordered_multiset& __u)
1053 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1054 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161055
Howard Hinnantee6ccd02010-09-23 18:58:281056 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161057 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:281058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161059 key_equal key_eq() const {return __table_.key_eq();}
1060
Howard Hinnantee6ccd02010-09-23 18:58:281061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161062 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281063 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161064 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281065 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161066 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281067 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161068 pair<iterator, iterator> equal_range(const key_type& __k)
1069 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:281070 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161071 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:281074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371075 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:281076 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371077 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:161078
Howard Hinnantee6ccd02010-09-23 18:58:281079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161080 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281081 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161082 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1083
Howard Hinnantee6ccd02010-09-23 18:58:281084 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161085 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161087 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281088 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161089 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281090 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161091 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161093 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161095 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
1096
Howard Hinnantee6ccd02010-09-23 18:58:281097 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371098 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281099 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:371100 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:281101 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161102 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:281103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161104 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:281105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161106 void reserve(size_type __n) {__table_.reserve(__n);}
Howard Hinnant39213642013-07-23 22:01:581107
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:161121};
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:581128#if _LIBCPP_DEBUG_LEVEL >= 2
1129 __get_db()->__insert_c(this);
1130#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161131 __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:581140#if _LIBCPP_DEBUG_LEVEL >= 2
1141 __get_db()->__insert_c(this);
1142#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161143 __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:581151#if _LIBCPP_DEBUG_LEVEL >= 2
1152 __get_db()->__insert_c(this);
1153#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161154 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:581164#if _LIBCPP_DEBUG_LEVEL >= 2
1165 __get_db()->__insert_c(this);
1166#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161167 __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:581178#if _LIBCPP_DEBUG_LEVEL >= 2
1179 __get_db()->__insert_c(this);
1180#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161181 __table_.rehash(__n);
1182 insert(__first, __last);
1183}
1184
1185template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281186inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161187unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1188 const allocator_type& __a)
1189 : __table_(__a)
1190{
Howard Hinnant39213642013-07-23 22:01:581191#if _LIBCPP_DEBUG_LEVEL >= 2
1192 __get_db()->__insert_c(this);
1193#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161194}
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:581201#if _LIBCPP_DEBUG_LEVEL >= 2
1202 __get_db()->__insert_c(this);
1203#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161204 __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:581213#if _LIBCPP_DEBUG_LEVEL >= 2
1214 __get_db()->__insert_c(this);
1215#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161216 __table_.rehash(__u.bucket_count());
1217 insert(__u.begin(), __u.end());
1218}
1219
Howard Hinnant73d21a42010-09-04 23:28:191220#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161221
1222template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281223inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161224unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1225 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:371226 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191227 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161228{
Howard Hinnant39213642013-07-23 22:01:581229#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:161233}
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:191238 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161239{
Howard Hinnant39213642013-07-23 22:01:581240#if _LIBCPP_DEBUG_LEVEL >= 2
1241 __get_db()->__insert_c(this);
1242#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161243 if (__a != __u.get_allocator())
1244 {
1245 iterator __i = __u.begin();
1246 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:191247 __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:161248 }
Howard Hinnant39213642013-07-23 22:01:581249#if _LIBCPP_DEBUG_LEVEL >= 2
1250 else
1251 __get_db()->swap(this, &__u);
1252#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161253}
1254
Howard Hinnant73d21a42010-09-04 23:28:191255#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161256
Howard Hinnante3e32912011-08-12 21:56:021257#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1258
Howard Hinnantbc8d3f92010-05-11 19:42:161259template <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:581263#if _LIBCPP_DEBUG_LEVEL >= 2
1264 __get_db()->__insert_c(this);
1265#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161266 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:581275#if _LIBCPP_DEBUG_LEVEL >= 2
1276 __get_db()->__insert_c(this);
1277#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161278 __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:581288#if _LIBCPP_DEBUG_LEVEL >= 2
1289 __get_db()->__insert_c(this);
1290#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161291 __table_.rehash(__n);
1292 insert(__il.begin(), __il.end());
1293}
1294
Howard Hinnante3e32912011-08-12 21:56:021295#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1296
Howard Hinnant73d21a42010-09-04 23:28:191297#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161298
1299template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281300inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161301unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1302unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1303 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:371304 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161305{
Howard Hinnant0949eed2011-06-30 21:18:191306 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161307 return *this;
1308}
1309
Howard Hinnant73d21a42010-09-04 23:28:191310#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161311
Howard Hinnante3e32912011-08-12 21:56:021312#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1313
Howard Hinnantbc8d3f92010-05-11 19:42:161314template <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:021324#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1325
Howard Hinnantbc8d3f92010-05-11 19:42:161326template <class _Value, class _Hash, class _Pred, class _Alloc>
1327template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:281328inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161329void
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:281338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161339void
1340swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1341 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:371342 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161343{
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:191361 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:161364 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:281371inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161372bool
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