]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/libc++/include/unordered_set
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / libc++ / include / unordered_set
1 // -*- C++ -*-
2 //===-------------------------- unordered_set -----------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
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
20 namespace std
21 {
22
23 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
24           class Alloc = allocator<Value>>
25 class unordered_set
26 {
27 public:
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
46     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(),
52                            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&);
62     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);
67     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());
71     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
81     ~unordered_set();
82     unordered_set& operator=(const unordered_set&);
83     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);
89     unordered_set& operator=(initializer_list<value_type>);
90
91     allocator_type get_allocator() const noexcept;
92
93     bool      empty() const noexcept;
94     size_type size() const noexcept;
95     size_type max_size() const noexcept;
96
97     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;
103
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);
119     void clear() noexcept;
120
121     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);
127
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
137     size_type bucket_count() const noexcept;
138     size_type max_bucket_count() const noexcept;
139
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
150     float load_factor() const noexcept;
151     float max_load_factor() const noexcept;
152     void max_load_factor(float z);
153     void rehash(size_type n);
154     void reserve(size_type n);
155 };
156
157 template <class Value, class Hash, class Pred, class Alloc>
158     void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
159               unordered_set<Value, Hash, Pred, Alloc>& y)
160               noexcept(noexcept(x.swap(y)));
161
162 template <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
167 template <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
172 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
173           class Alloc = allocator<Value>>
174 class unordered_multiset
175 {
176 public:
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
195     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(),
201                            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&);
211     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);
216     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());
220     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
230     ~unordered_multiset();
231     unordered_multiset& operator=(const unordered_multiset&);
232     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);
238     unordered_multiset& operator=(initializer_list<value_type>);
239
240     allocator_type get_allocator() const noexcept;
241
242     bool      empty() const noexcept;
243     size_type size() const noexcept;
244     size_type max_size() const noexcept;
245
246     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;
252
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);
268     void clear() noexcept;
269
270     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);
276
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
286     size_type bucket_count() const noexcept;
287     size_type max_bucket_count() const noexcept;
288
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
299     float load_factor() const noexcept;
300     float max_load_factor() const noexcept;
301     void max_load_factor(float z);
302     void rehash(size_type n);
303     void reserve(size_type n);
304 };
305
306 template <class Value, class Hash, class Pred, class Alloc>
307     void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
308               unordered_multiset<Value, Hash, Pred, Alloc>& y)
309               noexcept(noexcept(x.swap(y)));
310
311 template <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
316 template <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
328 #include <__debug>
329
330 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
331 #pragma GCC system_header
332 #endif
333
334 _LIBCPP_BEGIN_NAMESPACE_STD
335
336 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
337           class _Alloc = allocator<_Value> >
338 class _LIBCPP_TYPE_VIS_ONLY unordered_set
339 {
340 public:
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;
349     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
350                   "Invalid allocator::value_type");
351
352 private:
353     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
354
355     __table __table_;
356
357 public:
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
368     _LIBCPP_INLINE_VISIBILITY
369     unordered_set()
370         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
371         {
372 #if _LIBCPP_DEBUG_LEVEL >= 2
373             __get_db()->__insert_c(this);
374 #endif
375         }
376     explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
377                            const key_equal& __eql = key_equal());
378 #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
386     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);
398 #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
409     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);
412 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
413     unordered_set(unordered_set&& __u)
414         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
415     unordered_set(unordered_set&& __u, const allocator_type& __a);
416 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
417 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
418     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);
425 #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
435 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
436     // ~unordered_set() = default;
437     _LIBCPP_INLINE_VISIBILITY
438     unordered_set& operator=(const unordered_set& __u)
439     {
440         __table_ = __u.__table_;
441         return *this;
442     }
443 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
444     unordered_set& operator=(unordered_set&& __u)
445         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
446 #endif
447 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
448     unordered_set& operator=(initializer_list<value_type> __il);
449 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
450
451     _LIBCPP_INLINE_VISIBILITY
452     allocator_type get_allocator() const _NOEXCEPT
453         {return allocator_type(__table_.__node_alloc());}
454
455     _LIBCPP_INLINE_VISIBILITY
456     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
457     _LIBCPP_INLINE_VISIBILITY
458     size_type size() const _NOEXCEPT  {return __table_.size();}
459     _LIBCPP_INLINE_VISIBILITY
460     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
461
462     _LIBCPP_INLINE_VISIBILITY
463     iterator       begin() _NOEXCEPT        {return __table_.begin();}
464     _LIBCPP_INLINE_VISIBILITY
465     iterator       end() _NOEXCEPT          {return __table_.end();}
466     _LIBCPP_INLINE_VISIBILITY
467     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
468     _LIBCPP_INLINE_VISIBILITY
469     const_iterator end()    const _NOEXCEPT {return __table_.end();}
470     _LIBCPP_INLINE_VISIBILITY
471     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
472     _LIBCPP_INLINE_VISIBILITY
473     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
474
475 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
476     template <class... _Args>
477         _LIBCPP_INLINE_VISIBILITY
478         pair<iterator, bool> emplace(_Args&&... __args)
479             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
480     template <class... _Args>
481         _LIBCPP_INLINE_VISIBILITY
482 #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
491         iterator emplace_hint(const_iterator, _Args&&... __args)
492             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
493 #endif
494 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
495     _LIBCPP_INLINE_VISIBILITY
496     pair<iterator, bool> insert(const value_type& __x)
497         {return __table_.__insert_unique(__x);}
498 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
499     _LIBCPP_INLINE_VISIBILITY
500     pair<iterator, bool> insert(value_type&& __x)
501         {return __table_.__insert_unique(_VSTD::move(__x));}
502 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
503     _LIBCPP_INLINE_VISIBILITY
504 #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
513     iterator insert(const_iterator, const value_type& __x)
514         {return insert(__x).first;}
515 #endif
516 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
517     _LIBCPP_INLINE_VISIBILITY
518 #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
527     iterator insert(const_iterator, value_type&& __x)
528         {return insert(_VSTD::move(__x)).first;}
529 #endif
530 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
531     template <class _InputIterator>
532         void insert(_InputIterator __first, _InputIterator __last);
533 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
534     _LIBCPP_INLINE_VISIBILITY
535     void insert(initializer_list<value_type> __il)
536         {insert(__il.begin(), __il.end());}
537 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
538
539     _LIBCPP_INLINE_VISIBILITY
540     iterator erase(const_iterator __p) {return __table_.erase(__p);}
541     _LIBCPP_INLINE_VISIBILITY
542     size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
543     _LIBCPP_INLINE_VISIBILITY
544     iterator erase(const_iterator __first, const_iterator __last)
545         {return __table_.erase(__first, __last);}
546     _LIBCPP_INLINE_VISIBILITY
547     void clear() _NOEXCEPT {__table_.clear();}
548
549     _LIBCPP_INLINE_VISIBILITY
550     void swap(unordered_set& __u)
551         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
552         {__table_.swap(__u.__table_);}
553
554     _LIBCPP_INLINE_VISIBILITY
555     hasher hash_function() const {return __table_.hash_function();}
556     _LIBCPP_INLINE_VISIBILITY
557     key_equal key_eq() const {return __table_.key_eq();}
558
559     _LIBCPP_INLINE_VISIBILITY
560     iterator       find(const key_type& __k)       {return __table_.find(__k);}
561     _LIBCPP_INLINE_VISIBILITY
562     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
563     _LIBCPP_INLINE_VISIBILITY
564     size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
565     _LIBCPP_INLINE_VISIBILITY
566     pair<iterator, iterator>             equal_range(const key_type& __k)
567         {return __table_.__equal_range_unique(__k);}
568     _LIBCPP_INLINE_VISIBILITY
569     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
570         {return __table_.__equal_range_unique(__k);}
571
572     _LIBCPP_INLINE_VISIBILITY
573     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
574     _LIBCPP_INLINE_VISIBILITY
575     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
576
577     _LIBCPP_INLINE_VISIBILITY
578     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
579     _LIBCPP_INLINE_VISIBILITY
580     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
581
582     _LIBCPP_INLINE_VISIBILITY
583     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
584     _LIBCPP_INLINE_VISIBILITY
585     local_iterator       end(size_type __n)          {return __table_.end(__n);}
586     _LIBCPP_INLINE_VISIBILITY
587     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
588     _LIBCPP_INLINE_VISIBILITY
589     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
590     _LIBCPP_INLINE_VISIBILITY
591     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
592     _LIBCPP_INLINE_VISIBILITY
593     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
594
595     _LIBCPP_INLINE_VISIBILITY
596     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
597     _LIBCPP_INLINE_VISIBILITY
598     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
599     _LIBCPP_INLINE_VISIBILITY
600     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
601     _LIBCPP_INLINE_VISIBILITY
602     void rehash(size_type __n) {__table_.rehash(__n);}
603     _LIBCPP_INLINE_VISIBILITY
604     void reserve(size_type __n) {__table_.reserve(__n);}
605
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
619 };
620
621 template <class _Value, class _Hash, class _Pred, class _Alloc>
622 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
623         const hasher& __hf, const key_equal& __eql)
624     : __table_(__hf, __eql)
625 {
626 #if _LIBCPP_DEBUG_LEVEL >= 2
627     __get_db()->__insert_c(this);
628 #endif
629     __table_.rehash(__n);
630 }
631
632 template <class _Value, class _Hash, class _Pred, class _Alloc>
633 unordered_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 {
637 #if _LIBCPP_DEBUG_LEVEL >= 2
638     __get_db()->__insert_c(this);
639 #endif
640     __table_.rehash(__n);
641 }
642
643 template <class _Value, class _Hash, class _Pred, class _Alloc>
644 template <class _InputIterator>
645 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
646         _InputIterator __first, _InputIterator __last)
647 {
648 #if _LIBCPP_DEBUG_LEVEL >= 2
649     __get_db()->__insert_c(this);
650 #endif
651     insert(__first, __last);
652 }
653
654 template <class _Value, class _Hash, class _Pred, class _Alloc>
655 template <class _InputIterator>
656 unordered_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 {
661 #if _LIBCPP_DEBUG_LEVEL >= 2
662     __get_db()->__insert_c(this);
663 #endif
664     __table_.rehash(__n);
665     insert(__first, __last);
666 }
667
668 template <class _Value, class _Hash, class _Pred, class _Alloc>
669 template <class _InputIterator>
670 unordered_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 {
675 #if _LIBCPP_DEBUG_LEVEL >= 2
676     __get_db()->__insert_c(this);
677 #endif
678     __table_.rehash(__n);
679     insert(__first, __last);
680 }
681
682 template <class _Value, class _Hash, class _Pred, class _Alloc>
683 inline _LIBCPP_INLINE_VISIBILITY
684 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
685         const allocator_type& __a)
686     : __table_(__a)
687 {
688 #if _LIBCPP_DEBUG_LEVEL >= 2
689     __get_db()->__insert_c(this);
690 #endif
691 }
692
693 template <class _Value, class _Hash, class _Pred, class _Alloc>
694 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
695         const unordered_set& __u)
696     : __table_(__u.__table_)
697 {
698 #if _LIBCPP_DEBUG_LEVEL >= 2
699     __get_db()->__insert_c(this);
700 #endif
701     __table_.rehash(__u.bucket_count());
702     insert(__u.begin(), __u.end());
703 }
704
705 template <class _Value, class _Hash, class _Pred, class _Alloc>
706 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
707         const unordered_set& __u, const allocator_type& __a)
708     : __table_(__u.__table_, __a)
709 {
710 #if _LIBCPP_DEBUG_LEVEL >= 2
711     __get_db()->__insert_c(this);
712 #endif
713     __table_.rehash(__u.bucket_count());
714     insert(__u.begin(), __u.end());
715 }
716
717 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
718
719 template <class _Value, class _Hash, class _Pred, class _Alloc>
720 inline _LIBCPP_INLINE_VISIBILITY
721 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
722         unordered_set&& __u)
723     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
724     : __table_(_VSTD::move(__u.__table_))
725 {
726 #if _LIBCPP_DEBUG_LEVEL >= 2
727     __get_db()->__insert_c(this);
728     __get_db()->swap(this, &__u);
729 #endif
730 }
731
732 template <class _Value, class _Hash, class _Pred, class _Alloc>
733 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
734         unordered_set&& __u, const allocator_type& __a)
735     : __table_(_VSTD::move(__u.__table_), __a)
736 {
737 #if _LIBCPP_DEBUG_LEVEL >= 2
738     __get_db()->__insert_c(this);
739 #endif
740     if (__a != __u.get_allocator())
741     {
742         iterator __i = __u.begin();
743         while (__u.size() != 0)
744             __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
745     }
746 #if _LIBCPP_DEBUG_LEVEL >= 2
747     else
748         __get_db()->swap(this, &__u);
749 #endif
750 }
751
752 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
753
754 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
755
756 template <class _Value, class _Hash, class _Pred, class _Alloc>
757 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
758         initializer_list<value_type> __il)
759 {
760 #if _LIBCPP_DEBUG_LEVEL >= 2
761     __get_db()->__insert_c(this);
762 #endif
763     insert(__il.begin(), __il.end());
764 }
765
766 template <class _Value, class _Hash, class _Pred, class _Alloc>
767 unordered_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 {
772 #if _LIBCPP_DEBUG_LEVEL >= 2
773     __get_db()->__insert_c(this);
774 #endif
775     __table_.rehash(__n);
776     insert(__il.begin(), __il.end());
777 }
778
779 template <class _Value, class _Hash, class _Pred, class _Alloc>
780 unordered_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 {
785 #if _LIBCPP_DEBUG_LEVEL >= 2
786     __get_db()->__insert_c(this);
787 #endif
788     __table_.rehash(__n);
789     insert(__il.begin(), __il.end());
790 }
791
792 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
793
794 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
795
796 template <class _Value, class _Hash, class _Pred, class _Alloc>
797 inline _LIBCPP_INLINE_VISIBILITY
798 unordered_set<_Value, _Hash, _Pred, _Alloc>&
799 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
800     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
801 {
802     __table_ = _VSTD::move(__u.__table_);
803     return *this;
804 }
805
806 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
807
808 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
809
810 template <class _Value, class _Hash, class _Pred, class _Alloc>
811 inline _LIBCPP_INLINE_VISIBILITY
812 unordered_set<_Value, _Hash, _Pred, _Alloc>&
813 unordered_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
820 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
821
822 template <class _Value, class _Hash, class _Pred, class _Alloc>
823 template <class _InputIterator>
824 inline _LIBCPP_INLINE_VISIBILITY
825 void
826 unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
827                                                     _InputIterator __last)
828 {
829     for (; __first != __last; ++__first)
830         __table_.__insert_unique(*__first);
831 }
832
833 template <class _Value, class _Hash, class _Pred, class _Alloc>
834 inline _LIBCPP_INLINE_VISIBILITY
835 void
836 swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
837      unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
838     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
839 {
840     __x.swap(__y);
841 }
842
843 template <class _Value, class _Hash, class _Pred, class _Alloc>
844 bool
845 operator==(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
862 template <class _Value, class _Hash, class _Pred, class _Alloc>
863 inline _LIBCPP_INLINE_VISIBILITY
864 bool
865 operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
866            const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
867 {
868     return !(__x == __y);
869 }
870
871 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
872           class _Alloc = allocator<_Value> >
873 class _LIBCPP_TYPE_VIS_ONLY unordered_multiset
874 {
875 public:
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;
884     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
885                   "Invalid allocator::value_type");
886
887 private:
888     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
889
890     __table __table_;
891
892 public:
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
903     _LIBCPP_INLINE_VISIBILITY
904     unordered_multiset()
905         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
906         {
907 #if _LIBCPP_DEBUG_LEVEL >= 2
908             __get_db()->__insert_c(this);
909 #endif
910         }
911     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);
915 #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
923     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);
933 #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
945     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);
948 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
949     unordered_multiset(unordered_multiset&& __u)
950         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
951     unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
952 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
953 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
954     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);
961 #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
969 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
970     // ~unordered_multiset() = default;
971     _LIBCPP_INLINE_VISIBILITY
972     unordered_multiset& operator=(const unordered_multiset& __u)
973     {
974         __table_ = __u.__table_;
975         return *this;
976     }
977 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
978     unordered_multiset& operator=(unordered_multiset&& __u)
979         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
980 #endif
981 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
982     unordered_multiset& operator=(initializer_list<value_type> __il);
983 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
984
985     _LIBCPP_INLINE_VISIBILITY
986     allocator_type get_allocator() const _NOEXCEPT
987         {return allocator_type(__table_.__node_alloc());}
988
989     _LIBCPP_INLINE_VISIBILITY
990     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
991     _LIBCPP_INLINE_VISIBILITY
992     size_type size() const _NOEXCEPT  {return __table_.size();}
993     _LIBCPP_INLINE_VISIBILITY
994     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
995
996     _LIBCPP_INLINE_VISIBILITY
997     iterator       begin() _NOEXCEPT        {return __table_.begin();}
998     _LIBCPP_INLINE_VISIBILITY
999     iterator       end() _NOEXCEPT          {return __table_.end();}
1000     _LIBCPP_INLINE_VISIBILITY
1001     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1002     _LIBCPP_INLINE_VISIBILITY
1003     const_iterator end()    const _NOEXCEPT {return __table_.end();}
1004     _LIBCPP_INLINE_VISIBILITY
1005     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1006     _LIBCPP_INLINE_VISIBILITY
1007     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
1008
1009 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
1010     template <class... _Args>
1011         _LIBCPP_INLINE_VISIBILITY
1012         iterator emplace(_Args&&... __args)
1013             {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
1014     template <class... _Args>
1015         _LIBCPP_INLINE_VISIBILITY
1016         iterator emplace_hint(const_iterator __p, _Args&&... __args)
1017             {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
1018 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
1019     _LIBCPP_INLINE_VISIBILITY
1020     iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1021 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1022     _LIBCPP_INLINE_VISIBILITY
1023     iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
1024 #endif
1025     _LIBCPP_INLINE_VISIBILITY
1026     iterator insert(const_iterator __p, const value_type& __x)
1027         {return __table_.__insert_multi(__p, __x);}
1028 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1029     _LIBCPP_INLINE_VISIBILITY
1030     iterator insert(const_iterator __p, value_type&& __x)
1031         {return __table_.__insert_multi(__p, _VSTD::move(__x));}
1032 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1033     template <class _InputIterator>
1034         void insert(_InputIterator __first, _InputIterator __last);
1035 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1036     _LIBCPP_INLINE_VISIBILITY
1037     void insert(initializer_list<value_type> __il)
1038         {insert(__il.begin(), __il.end());}
1039 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1040
1041     _LIBCPP_INLINE_VISIBILITY
1042     iterator erase(const_iterator __p) {return __table_.erase(__p);}
1043     _LIBCPP_INLINE_VISIBILITY
1044     size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1045     _LIBCPP_INLINE_VISIBILITY
1046     iterator erase(const_iterator __first, const_iterator __last)
1047         {return __table_.erase(__first, __last);}
1048     _LIBCPP_INLINE_VISIBILITY
1049     void clear() _NOEXCEPT {__table_.clear();}
1050
1051     _LIBCPP_INLINE_VISIBILITY
1052     void swap(unordered_multiset& __u)
1053         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1054         {__table_.swap(__u.__table_);}
1055
1056     _LIBCPP_INLINE_VISIBILITY
1057     hasher hash_function() const {return __table_.hash_function();}
1058     _LIBCPP_INLINE_VISIBILITY
1059     key_equal key_eq() const {return __table_.key_eq();}
1060
1061     _LIBCPP_INLINE_VISIBILITY
1062     iterator       find(const key_type& __k)       {return __table_.find(__k);}
1063     _LIBCPP_INLINE_VISIBILITY
1064     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1065     _LIBCPP_INLINE_VISIBILITY
1066     size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1067     _LIBCPP_INLINE_VISIBILITY
1068     pair<iterator, iterator>             equal_range(const key_type& __k)
1069         {return __table_.__equal_range_multi(__k);}
1070     _LIBCPP_INLINE_VISIBILITY
1071     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1072         {return __table_.__equal_range_multi(__k);}
1073
1074     _LIBCPP_INLINE_VISIBILITY
1075     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1076     _LIBCPP_INLINE_VISIBILITY
1077     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
1078
1079     _LIBCPP_INLINE_VISIBILITY
1080     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
1081     _LIBCPP_INLINE_VISIBILITY
1082     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1083
1084     _LIBCPP_INLINE_VISIBILITY
1085     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1086     _LIBCPP_INLINE_VISIBILITY
1087     local_iterator       end(size_type __n)          {return __table_.end(__n);}
1088     _LIBCPP_INLINE_VISIBILITY
1089     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1090     _LIBCPP_INLINE_VISIBILITY
1091     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1092     _LIBCPP_INLINE_VISIBILITY
1093     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1094     _LIBCPP_INLINE_VISIBILITY
1095     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
1096
1097     _LIBCPP_INLINE_VISIBILITY
1098     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1099     _LIBCPP_INLINE_VISIBILITY
1100     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1101     _LIBCPP_INLINE_VISIBILITY
1102     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1103     _LIBCPP_INLINE_VISIBILITY
1104     void rehash(size_type __n) {__table_.rehash(__n);}
1105     _LIBCPP_INLINE_VISIBILITY
1106     void reserve(size_type __n) {__table_.reserve(__n);}
1107
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
1121 };
1122
1123 template <class _Value, class _Hash, class _Pred, class _Alloc>
1124 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1125         size_type __n, const hasher& __hf, const key_equal& __eql)
1126     : __table_(__hf, __eql)
1127 {
1128 #if _LIBCPP_DEBUG_LEVEL >= 2
1129     __get_db()->__insert_c(this);
1130 #endif
1131     __table_.rehash(__n);
1132 }
1133
1134 template <class _Value, class _Hash, class _Pred, class _Alloc>
1135 unordered_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 {
1140 #if _LIBCPP_DEBUG_LEVEL >= 2
1141     __get_db()->__insert_c(this);
1142 #endif
1143     __table_.rehash(__n);
1144 }
1145
1146 template <class _Value, class _Hash, class _Pred, class _Alloc>
1147 template <class _InputIterator>
1148 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1149         _InputIterator __first, _InputIterator __last)
1150 {
1151 #if _LIBCPP_DEBUG_LEVEL >= 2
1152     __get_db()->__insert_c(this);
1153 #endif
1154     insert(__first, __last);
1155 }
1156
1157 template <class _Value, class _Hash, class _Pred, class _Alloc>
1158 template <class _InputIterator>
1159 unordered_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 {
1164 #if _LIBCPP_DEBUG_LEVEL >= 2
1165     __get_db()->__insert_c(this);
1166 #endif
1167     __table_.rehash(__n);
1168     insert(__first, __last);
1169 }
1170
1171 template <class _Value, class _Hash, class _Pred, class _Alloc>
1172 template <class _InputIterator>
1173 unordered_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 {
1178 #if _LIBCPP_DEBUG_LEVEL >= 2
1179     __get_db()->__insert_c(this);
1180 #endif
1181     __table_.rehash(__n);
1182     insert(__first, __last);
1183 }
1184
1185 template <class _Value, class _Hash, class _Pred, class _Alloc>
1186 inline _LIBCPP_INLINE_VISIBILITY
1187 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1188         const allocator_type& __a)
1189     : __table_(__a)
1190 {
1191 #if _LIBCPP_DEBUG_LEVEL >= 2
1192     __get_db()->__insert_c(this);
1193 #endif
1194 }
1195
1196 template <class _Value, class _Hash, class _Pred, class _Alloc>
1197 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1198         const unordered_multiset& __u)
1199     : __table_(__u.__table_)
1200 {
1201 #if _LIBCPP_DEBUG_LEVEL >= 2
1202     __get_db()->__insert_c(this);
1203 #endif
1204     __table_.rehash(__u.bucket_count());
1205     insert(__u.begin(), __u.end());
1206 }
1207
1208 template <class _Value, class _Hash, class _Pred, class _Alloc>
1209 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1210         const unordered_multiset& __u, const allocator_type& __a)
1211     : __table_(__u.__table_, __a)
1212 {
1213 #if _LIBCPP_DEBUG_LEVEL >= 2
1214     __get_db()->__insert_c(this);
1215 #endif
1216     __table_.rehash(__u.bucket_count());
1217     insert(__u.begin(), __u.end());
1218 }
1219
1220 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1221
1222 template <class _Value, class _Hash, class _Pred, class _Alloc>
1223 inline _LIBCPP_INLINE_VISIBILITY
1224 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1225         unordered_multiset&& __u)
1226     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1227     : __table_(_VSTD::move(__u.__table_))
1228 {
1229 #if _LIBCPP_DEBUG_LEVEL >= 2
1230     __get_db()->__insert_c(this);
1231     __get_db()->swap(this, &__u);
1232 #endif
1233 }
1234
1235 template <class _Value, class _Hash, class _Pred, class _Alloc>
1236 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1237         unordered_multiset&& __u, const allocator_type& __a)
1238     : __table_(_VSTD::move(__u.__table_), __a)
1239 {
1240 #if _LIBCPP_DEBUG_LEVEL >= 2
1241     __get_db()->__insert_c(this);
1242 #endif
1243     if (__a != __u.get_allocator())
1244     {
1245         iterator __i = __u.begin();
1246         while (__u.size() != 0)
1247             __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
1248     }
1249 #if _LIBCPP_DEBUG_LEVEL >= 2
1250     else
1251         __get_db()->swap(this, &__u);
1252 #endif
1253 }
1254
1255 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1256
1257 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1258
1259 template <class _Value, class _Hash, class _Pred, class _Alloc>
1260 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1261         initializer_list<value_type> __il)
1262 {
1263 #if _LIBCPP_DEBUG_LEVEL >= 2
1264     __get_db()->__insert_c(this);
1265 #endif
1266     insert(__il.begin(), __il.end());
1267 }
1268
1269 template <class _Value, class _Hash, class _Pred, class _Alloc>
1270 unordered_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 {
1275 #if _LIBCPP_DEBUG_LEVEL >= 2
1276     __get_db()->__insert_c(this);
1277 #endif
1278     __table_.rehash(__n);
1279     insert(__il.begin(), __il.end());
1280 }
1281
1282 template <class _Value, class _Hash, class _Pred, class _Alloc>
1283 unordered_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 {
1288 #if _LIBCPP_DEBUG_LEVEL >= 2
1289     __get_db()->__insert_c(this);
1290 #endif
1291     __table_.rehash(__n);
1292     insert(__il.begin(), __il.end());
1293 }
1294
1295 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1296
1297 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1298
1299 template <class _Value, class _Hash, class _Pred, class _Alloc>
1300 inline _LIBCPP_INLINE_VISIBILITY
1301 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1302 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1303         unordered_multiset&& __u)
1304     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
1305 {
1306     __table_ = _VSTD::move(__u.__table_);
1307     return *this;
1308 }
1309
1310 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1311
1312 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1313
1314 template <class _Value, class _Hash, class _Pred, class _Alloc>
1315 inline
1316 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1317 unordered_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
1324 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1325
1326 template <class _Value, class _Hash, class _Pred, class _Alloc>
1327 template <class _InputIterator>
1328 inline _LIBCPP_INLINE_VISIBILITY
1329 void
1330 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1331                                                          _InputIterator __last)
1332 {
1333     for (; __first != __last; ++__first)
1334         __table_.__insert_multi(*__first);
1335 }
1336
1337 template <class _Value, class _Hash, class _Pred, class _Alloc>
1338 inline _LIBCPP_INLINE_VISIBILITY
1339 void
1340 swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1341      unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1342     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1343 {
1344     __x.swap(__y);
1345 }
1346
1347 template <class _Value, class _Hash, class _Pred, class _Alloc>
1348 bool
1349 operator==(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);
1361         if (_VSTD::distance(__xeq.first, __xeq.second) !=
1362             _VSTD::distance(__yeq.first, __yeq.second) ||
1363                   !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
1364             return false;
1365         __i = __xeq.second;
1366     }
1367     return true;
1368 }
1369
1370 template <class _Value, class _Hash, class _Pred, class _Alloc>
1371 inline _LIBCPP_INLINE_VISIBILITY
1372 bool
1373 operator!=(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