• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// -*- C++ -*-
2//===-------------------------- unordered_map -----------------------------===//
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_MAP
12#define _LIBCPP_UNORDERED_MAP
13
14/*
15
16    unordered_map synopsis
17
18#include <initializer_list>
19
20namespace std
21{
22
23template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
24          class Alloc = allocator<pair<const Key, T>>>
25class unordered_map
26{
27public:
28    // types
29    typedef Key                                                        key_type;
30    typedef T                                                          mapped_type;
31    typedef Hash                                                       hasher;
32    typedef Pred                                                       key_equal;
33    typedef Alloc                                                      allocator_type;
34    typedef pair<const key_type, mapped_type>                          value_type;
35    typedef value_type&                                                reference;
36    typedef const value_type&                                          const_reference;
37    typedef typename allocator_traits<allocator_type>::pointer         pointer;
38    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
39    typedef typename allocator_traits<allocator_type>::size_type       size_type;
40    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
41
42    typedef /unspecified/ iterator;
43    typedef /unspecified/ const_iterator;
44    typedef /unspecified/ local_iterator;
45    typedef /unspecified/ const_local_iterator;
46
47    typedef unspecified                             node_type;            // C++17
48    typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type;   // C++17
49
50    unordered_map()
51        noexcept(
52            is_nothrow_default_constructible<hasher>::value &&
53            is_nothrow_default_constructible<key_equal>::value &&
54            is_nothrow_default_constructible<allocator_type>::value);
55    explicit unordered_map(size_type n, const hasher& hf = hasher(),
56                           const key_equal& eql = key_equal(),
57                           const allocator_type& a = allocator_type());
58    template <class InputIterator>
59        unordered_map(InputIterator f, InputIterator l,
60                      size_type n = 0, const hasher& hf = hasher(),
61                      const key_equal& eql = key_equal(),
62                      const allocator_type& a = allocator_type());
63    explicit unordered_map(const allocator_type&);
64    unordered_map(const unordered_map&);
65    unordered_map(const unordered_map&, const Allocator&);
66    unordered_map(unordered_map&&)
67        noexcept(
68            is_nothrow_move_constructible<hasher>::value &&
69            is_nothrow_move_constructible<key_equal>::value &&
70            is_nothrow_move_constructible<allocator_type>::value);
71    unordered_map(unordered_map&&, const Allocator&);
72    unordered_map(initializer_list<value_type>, size_type n = 0,
73                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
74                  const allocator_type& a = allocator_type());
75    unordered_map(size_type n, const allocator_type& a)
76      : unordered_map(n, hasher(), key_equal(), a) {}  // C++14
77    unordered_map(size_type n, const hasher& hf, const allocator_type& a)
78      : unordered_map(n, hf, key_equal(), a) {}  // C++14
79    template <class InputIterator>
80      unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
81      : unordered_map(f, l, n, hasher(), key_equal(), a) {}  // C++14
82    template <class InputIterator>
83      unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
84        const allocator_type& a)
85      : unordered_map(f, l, n, hf, key_equal(), a) {}  // C++14
86    unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
87      : unordered_map(il, n, hasher(), key_equal(), a) {}  // C++14
88    unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
89      const allocator_type& a)
90      : unordered_map(il, n, hf, key_equal(), a) {}  // C++14
91    ~unordered_map();
92    unordered_map& operator=(const unordered_map&);
93    unordered_map& operator=(unordered_map&&)
94        noexcept(
95            allocator_type::propagate_on_container_move_assignment::value &&
96            is_nothrow_move_assignable<allocator_type>::value &&
97            is_nothrow_move_assignable<hasher>::value &&
98            is_nothrow_move_assignable<key_equal>::value);
99    unordered_map& operator=(initializer_list<value_type>);
100
101    allocator_type get_allocator() const noexcept;
102
103    bool      empty() const noexcept;
104    size_type size() const noexcept;
105    size_type max_size() const noexcept;
106
107    iterator       begin() noexcept;
108    iterator       end() noexcept;
109    const_iterator begin()  const noexcept;
110    const_iterator end()    const noexcept;
111    const_iterator cbegin() const noexcept;
112    const_iterator cend()   const noexcept;
113
114    template <class... Args>
115        pair<iterator, bool> emplace(Args&&... args);
116    template <class... Args>
117        iterator emplace_hint(const_iterator position, Args&&... args);
118    pair<iterator, bool> insert(const value_type& obj);
119    template <class P>
120        pair<iterator, bool> insert(P&& obj);
121    iterator insert(const_iterator hint, const value_type& obj);
122    template <class P>
123        iterator insert(const_iterator hint, P&& obj);
124    template <class InputIterator>
125        void insert(InputIterator first, InputIterator last);
126    void insert(initializer_list<value_type>);
127
128    node_type extract(const_iterator position);                                       // C++17
129    node_type extract(const key_type& x);                                             // C++17
130    insert_return_type insert(node_type&& nh);                                        // C++17
131    iterator           insert(const_iterator hint, node_type&& nh);                   // C++17
132
133    template <class... Args>
134        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
135    template <class... Args>
136        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
137    template <class... Args>
138        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
139    template <class... Args>
140        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
141    template <class M>
142        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
143    template <class M>
144        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
145    template <class M>
146        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
147    template <class M>
148        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
149
150    iterator erase(const_iterator position);
151    iterator erase(iterator position);  // C++14
152    size_type erase(const key_type& k);
153    iterator erase(const_iterator first, const_iterator last);
154    void clear() noexcept;
155
156    template<class H2, class P2>
157      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
158    template<class H2, class P2>
159      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
160    template<class H2, class P2>
161      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
162    template<class H2, class P2>
163      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
164
165    void swap(unordered_map&)
166        noexcept(
167            (!allocator_type::propagate_on_container_swap::value ||
168             __is_nothrow_swappable<allocator_type>::value) &&
169            __is_nothrow_swappable<hasher>::value &&
170            __is_nothrow_swappable<key_equal>::value);
171
172    hasher hash_function() const;
173    key_equal key_eq() const;
174
175    iterator       find(const key_type& k);
176    const_iterator find(const key_type& k) const;
177    size_type count(const key_type& k) const;
178    pair<iterator, iterator>             equal_range(const key_type& k);
179    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
180
181    mapped_type& operator[](const key_type& k);
182    mapped_type& operator[](key_type&& k);
183
184    mapped_type&       at(const key_type& k);
185    const mapped_type& at(const key_type& k) const;
186
187    size_type bucket_count() const noexcept;
188    size_type max_bucket_count() const noexcept;
189
190    size_type bucket_size(size_type n) const;
191    size_type bucket(const key_type& k) const;
192
193    local_iterator       begin(size_type n);
194    local_iterator       end(size_type n);
195    const_local_iterator begin(size_type n) const;
196    const_local_iterator end(size_type n) const;
197    const_local_iterator cbegin(size_type n) const;
198    const_local_iterator cend(size_type n) const;
199
200    float load_factor() const noexcept;
201    float max_load_factor() const noexcept;
202    void max_load_factor(float z);
203    void rehash(size_type n);
204    void reserve(size_type n);
205};
206
207template <class Key, class T, class Hash, class Pred, class Alloc>
208    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
209              unordered_map<Key, T, Hash, Pred, Alloc>& y)
210              noexcept(noexcept(x.swap(y)));
211
212template <class Key, class T, class Hash, class Pred, class Alloc>
213    bool
214    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
215               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
216
217template <class Key, class T, class Hash, class Pred, class Alloc>
218    bool
219    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
220               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
221
222template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
223          class Alloc = allocator<pair<const Key, T>>>
224class unordered_multimap
225{
226public:
227    // types
228    typedef Key                                                        key_type;
229    typedef T                                                          mapped_type;
230    typedef Hash                                                       hasher;
231    typedef Pred                                                       key_equal;
232    typedef Alloc                                                      allocator_type;
233    typedef pair<const key_type, mapped_type>                          value_type;
234    typedef value_type&                                                reference;
235    typedef const value_type&                                          const_reference;
236    typedef typename allocator_traits<allocator_type>::pointer         pointer;
237    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
238    typedef typename allocator_traits<allocator_type>::size_type       size_type;
239    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
240
241    typedef /unspecified/ iterator;
242    typedef /unspecified/ const_iterator;
243    typedef /unspecified/ local_iterator;
244    typedef /unspecified/ const_local_iterator;
245
246    typedef unspecified node_type;    // C++17
247
248    unordered_multimap()
249        noexcept(
250            is_nothrow_default_constructible<hasher>::value &&
251            is_nothrow_default_constructible<key_equal>::value &&
252            is_nothrow_default_constructible<allocator_type>::value);
253    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
254                           const key_equal& eql = key_equal(),
255                           const allocator_type& a = allocator_type());
256    template <class InputIterator>
257        unordered_multimap(InputIterator f, InputIterator l,
258                      size_type n = 0, const hasher& hf = hasher(),
259                      const key_equal& eql = key_equal(),
260                      const allocator_type& a = allocator_type());
261    explicit unordered_multimap(const allocator_type&);
262    unordered_multimap(const unordered_multimap&);
263    unordered_multimap(const unordered_multimap&, const Allocator&);
264    unordered_multimap(unordered_multimap&&)
265        noexcept(
266            is_nothrow_move_constructible<hasher>::value &&
267            is_nothrow_move_constructible<key_equal>::value &&
268            is_nothrow_move_constructible<allocator_type>::value);
269    unordered_multimap(unordered_multimap&&, const Allocator&);
270    unordered_multimap(initializer_list<value_type>, size_type n = 0,
271                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
272                  const allocator_type& a = allocator_type());
273    unordered_multimap(size_type n, const allocator_type& a)
274      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
275    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
276      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
277    template <class InputIterator>
278      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
279      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
280    template <class InputIterator>
281      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
282        const allocator_type& a)
283      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
284    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
285      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
286    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
287      const allocator_type& a)
288      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
289    ~unordered_multimap();
290    unordered_multimap& operator=(const unordered_multimap&);
291    unordered_multimap& operator=(unordered_multimap&&)
292        noexcept(
293            allocator_type::propagate_on_container_move_assignment::value &&
294            is_nothrow_move_assignable<allocator_type>::value &&
295            is_nothrow_move_assignable<hasher>::value &&
296            is_nothrow_move_assignable<key_equal>::value);
297    unordered_multimap& operator=(initializer_list<value_type>);
298
299    allocator_type get_allocator() const noexcept;
300
301    bool      empty() const noexcept;
302    size_type size() const noexcept;
303    size_type max_size() const noexcept;
304
305    iterator       begin() noexcept;
306    iterator       end() noexcept;
307    const_iterator begin()  const noexcept;
308    const_iterator end()    const noexcept;
309    const_iterator cbegin() const noexcept;
310    const_iterator cend()   const noexcept;
311
312    template <class... Args>
313        iterator emplace(Args&&... args);
314    template <class... Args>
315        iterator emplace_hint(const_iterator position, Args&&... args);
316    iterator insert(const value_type& obj);
317    template <class P>
318        iterator insert(P&& obj);
319    iterator insert(const_iterator hint, const value_type& obj);
320    template <class P>
321        iterator insert(const_iterator hint, P&& obj);
322    template <class InputIterator>
323        void insert(InputIterator first, InputIterator last);
324    void insert(initializer_list<value_type>);
325
326    node_type extract(const_iterator position);                // C++17
327    node_type extract(const key_type& x);                      // C++17
328    iterator insert(node_type&& nh);                           // C++17
329    iterator insert(const_iterator hint, node_type&& nh);      // C++17
330
331    iterator erase(const_iterator position);
332    iterator erase(iterator position);  // C++14
333    size_type erase(const key_type& k);
334    iterator erase(const_iterator first, const_iterator last);
335    void clear() noexcept;
336
337    template<class H2, class P2>
338      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
339    template<class H2, class P2>
340      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
341    template<class H2, class P2>
342      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
343    template<class H2, class P2>
344      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
345
346    void swap(unordered_multimap&)
347        noexcept(
348            (!allocator_type::propagate_on_container_swap::value ||
349             __is_nothrow_swappable<allocator_type>::value) &&
350            __is_nothrow_swappable<hasher>::value &&
351            __is_nothrow_swappable<key_equal>::value);
352
353    hasher hash_function() const;
354    key_equal key_eq() const;
355
356    iterator       find(const key_type& k);
357    const_iterator find(const key_type& k) const;
358    size_type count(const key_type& k) const;
359    pair<iterator, iterator>             equal_range(const key_type& k);
360    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
361
362    size_type bucket_count() const noexcept;
363    size_type max_bucket_count() const noexcept;
364
365    size_type bucket_size(size_type n) const;
366    size_type bucket(const key_type& k) const;
367
368    local_iterator       begin(size_type n);
369    local_iterator       end(size_type n);
370    const_local_iterator begin(size_type n) const;
371    const_local_iterator end(size_type n) const;
372    const_local_iterator cbegin(size_type n) const;
373    const_local_iterator cend(size_type n) const;
374
375    float load_factor() const noexcept;
376    float max_load_factor() const noexcept;
377    void max_load_factor(float z);
378    void rehash(size_type n);
379    void reserve(size_type n);
380};
381
382template <class Key, class T, class Hash, class Pred, class Alloc>
383    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
384              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
385              noexcept(noexcept(x.swap(y)));
386
387template <class K, class T, class H, class P, class A, class Predicate>
388    void erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred);       // C++20
389
390template <class K, class T, class H, class P, class A, class Predicate>
391    void erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred);  // C++20
392
393template <class Key, class T, class Hash, class Pred, class Alloc>
394    bool
395    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
396               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
397
398template <class Key, class T, class Hash, class Pred, class Alloc>
399    bool
400    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
401               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
402
403}  // std
404
405*/
406
407#include <__config>
408#include <__hash_table>
409#include <__node_handle>
410#include <functional>
411#include <stdexcept>
412#include <tuple>
413#include <version>
414
415#include <__debug>
416
417#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
418#pragma GCC system_header
419#endif
420
421_LIBCPP_BEGIN_NAMESPACE_STD
422
423template <class _Key, class _Cp, class _Hash,
424          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
425class __unordered_map_hasher
426    : private _Hash
427{
428public:
429    _LIBCPP_INLINE_VISIBILITY
430    __unordered_map_hasher()
431        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
432        : _Hash() {}
433    _LIBCPP_INLINE_VISIBILITY
434    __unordered_map_hasher(const _Hash& __h)
435        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
436        : _Hash(__h) {}
437    _LIBCPP_INLINE_VISIBILITY
438    const _Hash& hash_function() const _NOEXCEPT {return *this;}
439    _LIBCPP_INLINE_VISIBILITY
440    size_t operator()(const _Cp& __x) const
441        {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
442    _LIBCPP_INLINE_VISIBILITY
443    size_t operator()(const _Key& __x) const
444        {return static_cast<const _Hash&>(*this)(__x);}
445    void swap(__unordered_map_hasher&__y)
446        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
447    {
448        using _VSTD::swap;
449        swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
450    }
451};
452
453template <class _Key, class _Cp, class _Hash>
454class __unordered_map_hasher<_Key, _Cp, _Hash, false>
455{
456    _Hash __hash_;
457public:
458    _LIBCPP_INLINE_VISIBILITY
459    __unordered_map_hasher()
460        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
461        : __hash_() {}
462    _LIBCPP_INLINE_VISIBILITY
463    __unordered_map_hasher(const _Hash& __h)
464        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
465        : __hash_(__h) {}
466    _LIBCPP_INLINE_VISIBILITY
467    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
468    _LIBCPP_INLINE_VISIBILITY
469    size_t operator()(const _Cp& __x) const
470        {return __hash_(__x.__get_value().first);}
471    _LIBCPP_INLINE_VISIBILITY
472    size_t operator()(const _Key& __x) const
473        {return __hash_(__x);}
474    void swap(__unordered_map_hasher&__y)
475        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
476    {
477        using _VSTD::swap;
478        swap(__hash_, __y.__hash_);
479    }
480};
481
482template <class _Key, class _Cp, class _Hash, bool __b>
483inline _LIBCPP_INLINE_VISIBILITY
484void
485swap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
486     __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
487    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
488{
489    __x.swap(__y);
490}
491
492template <class _Key, class _Cp, class _Pred,
493          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
494class __unordered_map_equal
495    : private _Pred
496{
497public:
498    _LIBCPP_INLINE_VISIBILITY
499    __unordered_map_equal()
500        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
501        : _Pred() {}
502    _LIBCPP_INLINE_VISIBILITY
503    __unordered_map_equal(const _Pred& __p)
504        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
505        : _Pred(__p) {}
506    _LIBCPP_INLINE_VISIBILITY
507    const _Pred& key_eq() const _NOEXCEPT {return *this;}
508    _LIBCPP_INLINE_VISIBILITY
509    bool operator()(const _Cp& __x, const _Cp& __y) const
510        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
511    _LIBCPP_INLINE_VISIBILITY
512    bool operator()(const _Cp& __x, const _Key& __y) const
513        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
514    _LIBCPP_INLINE_VISIBILITY
515    bool operator()(const _Key& __x, const _Cp& __y) const
516        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
517    void swap(__unordered_map_equal&__y)
518        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
519    {
520        using _VSTD::swap;
521        swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
522    }
523};
524
525template <class _Key, class _Cp, class _Pred>
526class __unordered_map_equal<_Key, _Cp, _Pred, false>
527{
528    _Pred __pred_;
529public:
530    _LIBCPP_INLINE_VISIBILITY
531    __unordered_map_equal()
532        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
533        : __pred_() {}
534    _LIBCPP_INLINE_VISIBILITY
535    __unordered_map_equal(const _Pred& __p)
536        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
537        : __pred_(__p) {}
538    _LIBCPP_INLINE_VISIBILITY
539    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
540    _LIBCPP_INLINE_VISIBILITY
541    bool operator()(const _Cp& __x, const _Cp& __y) const
542        {return __pred_(__x.__get_value().first, __y.__get_value().first);}
543    _LIBCPP_INLINE_VISIBILITY
544    bool operator()(const _Cp& __x, const _Key& __y) const
545        {return __pred_(__x.__get_value().first, __y);}
546    _LIBCPP_INLINE_VISIBILITY
547    bool operator()(const _Key& __x, const _Cp& __y) const
548        {return __pred_(__x, __y.__get_value().first);}
549    void swap(__unordered_map_equal&__y)
550        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
551    {
552        using _VSTD::swap;
553        swap(__pred_, __y.__pred_);
554    }
555};
556
557template <class _Key, class _Cp, class _Pred, bool __b>
558inline _LIBCPP_INLINE_VISIBILITY
559void
560swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
561     __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
562    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
563{
564    __x.swap(__y);
565}
566
567template <class _Alloc>
568class __hash_map_node_destructor
569{
570    typedef _Alloc                              allocator_type;
571    typedef allocator_traits<allocator_type>    __alloc_traits;
572
573public:
574
575    typedef typename __alloc_traits::pointer       pointer;
576private:
577
578    allocator_type& __na_;
579
580    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
581
582public:
583    bool __first_constructed;
584    bool __second_constructed;
585
586    _LIBCPP_INLINE_VISIBILITY
587    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
588        : __na_(__na),
589          __first_constructed(false),
590          __second_constructed(false)
591        {}
592
593#ifndef _LIBCPP_CXX03_LANG
594    _LIBCPP_INLINE_VISIBILITY
595    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
596        _NOEXCEPT
597        : __na_(__x.__na_),
598          __first_constructed(__x.__value_constructed),
599          __second_constructed(__x.__value_constructed)
600        {
601            __x.__value_constructed = false;
602        }
603#else  // _LIBCPP_CXX03_LANG
604    _LIBCPP_INLINE_VISIBILITY
605    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
606        : __na_(__x.__na_),
607          __first_constructed(__x.__value_constructed),
608          __second_constructed(__x.__value_constructed)
609        {
610            const_cast<bool&>(__x.__value_constructed) = false;
611        }
612#endif  // _LIBCPP_CXX03_LANG
613
614    _LIBCPP_INLINE_VISIBILITY
615    void operator()(pointer __p) _NOEXCEPT
616    {
617        if (__second_constructed)
618            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
619        if (__first_constructed)
620            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
621        if (__p)
622            __alloc_traits::deallocate(__na_, __p, 1);
623    }
624};
625
626#ifndef _LIBCPP_CXX03_LANG
627template <class _Key, class _Tp>
628struct __hash_value_type
629{
630    typedef _Key                                     key_type;
631    typedef _Tp                                      mapped_type;
632    typedef pair<const key_type, mapped_type>        value_type;
633    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
634    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
635
636private:
637    value_type __cc;
638
639public:
640    _LIBCPP_INLINE_VISIBILITY
641    value_type& __get_value()
642    {
643#if _LIBCPP_STD_VER > 14
644        return *_VSTD::launder(_VSTD::addressof(__cc));
645#else
646        return __cc;
647#endif
648    }
649
650    _LIBCPP_INLINE_VISIBILITY
651    const value_type& __get_value() const
652    {
653#if _LIBCPP_STD_VER > 14
654        return *_VSTD::launder(_VSTD::addressof(__cc));
655#else
656        return __cc;
657#endif
658    }
659
660    _LIBCPP_INLINE_VISIBILITY
661    __nc_ref_pair_type __ref()
662    {
663        value_type& __v = __get_value();
664        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
665    }
666
667    _LIBCPP_INLINE_VISIBILITY
668    __nc_rref_pair_type __move()
669    {
670        value_type& __v = __get_value();
671        return __nc_rref_pair_type(
672            _VSTD::move(const_cast<key_type&>(__v.first)),
673            _VSTD::move(__v.second));
674    }
675
676    _LIBCPP_INLINE_VISIBILITY
677    __hash_value_type& operator=(const __hash_value_type& __v)
678    {
679        __ref() = __v.__get_value();
680        return *this;
681    }
682
683    _LIBCPP_INLINE_VISIBILITY
684    __hash_value_type& operator=(__hash_value_type&& __v)
685    {
686        __ref() = __v.__move();
687        return *this;
688    }
689
690    template <class _ValueTp,
691              class = typename enable_if<
692                    __is_same_uncvref<_ValueTp, value_type>::value
693                 >::type
694             >
695    _LIBCPP_INLINE_VISIBILITY
696    __hash_value_type& operator=(_ValueTp&& __v)
697    {
698        __ref() = _VSTD::forward<_ValueTp>(__v);
699        return *this;
700    }
701
702private:
703    __hash_value_type(const __hash_value_type& __v) = delete;
704    __hash_value_type(__hash_value_type&& __v) = delete;
705    template <class ..._Args>
706    explicit __hash_value_type(_Args&& ...__args) = delete;
707
708    ~__hash_value_type() = delete;
709};
710
711#else
712
713template <class _Key, class _Tp>
714struct __hash_value_type
715{
716    typedef _Key                                     key_type;
717    typedef _Tp                                      mapped_type;
718    typedef pair<const key_type, mapped_type>        value_type;
719
720private:
721    value_type __cc;
722
723public:
724    _LIBCPP_INLINE_VISIBILITY
725    value_type& __get_value() { return __cc; }
726    _LIBCPP_INLINE_VISIBILITY
727    const value_type& __get_value() const { return __cc; }
728
729private:
730   ~__hash_value_type();
731};
732
733#endif
734
735template <class _HashIterator>
736class _LIBCPP_TEMPLATE_VIS __hash_map_iterator
737{
738    _HashIterator __i_;
739
740    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
741
742public:
743    typedef forward_iterator_tag                                 iterator_category;
744    typedef typename _NodeTypes::__map_value_type                value_type;
745    typedef typename _NodeTypes::difference_type                 difference_type;
746    typedef value_type&                                          reference;
747    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
748
749    _LIBCPP_INLINE_VISIBILITY
750    __hash_map_iterator() _NOEXCEPT {}
751
752    _LIBCPP_INLINE_VISIBILITY
753    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
754
755    _LIBCPP_INLINE_VISIBILITY
756    reference operator*() const {return __i_->__get_value();}
757    _LIBCPP_INLINE_VISIBILITY
758    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
759
760    _LIBCPP_INLINE_VISIBILITY
761    __hash_map_iterator& operator++() {++__i_; return *this;}
762    _LIBCPP_INLINE_VISIBILITY
763    __hash_map_iterator operator++(int)
764    {
765        __hash_map_iterator __t(*this);
766        ++(*this);
767        return __t;
768    }
769
770    friend _LIBCPP_INLINE_VISIBILITY
771        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
772        {return __x.__i_ == __y.__i_;}
773    friend _LIBCPP_INLINE_VISIBILITY
774        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
775        {return __x.__i_ != __y.__i_;}
776
777    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
778    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
779    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
780    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
781    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
782};
783
784template <class _HashIterator>
785class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
786{
787    _HashIterator __i_;
788
789    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
790
791public:
792    typedef forward_iterator_tag                                 iterator_category;
793    typedef typename _NodeTypes::__map_value_type                value_type;
794    typedef typename _NodeTypes::difference_type                 difference_type;
795    typedef const value_type&                                    reference;
796    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
797
798    _LIBCPP_INLINE_VISIBILITY
799    __hash_map_const_iterator() _NOEXCEPT {}
800
801    _LIBCPP_INLINE_VISIBILITY
802    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
803    _LIBCPP_INLINE_VISIBILITY
804    __hash_map_const_iterator(
805            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
806                 _NOEXCEPT
807                : __i_(__i.__i_) {}
808
809    _LIBCPP_INLINE_VISIBILITY
810    reference operator*() const {return __i_->__get_value();}
811    _LIBCPP_INLINE_VISIBILITY
812    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
813
814    _LIBCPP_INLINE_VISIBILITY
815    __hash_map_const_iterator& operator++() {++__i_; return *this;}
816    _LIBCPP_INLINE_VISIBILITY
817    __hash_map_const_iterator operator++(int)
818    {
819        __hash_map_const_iterator __t(*this);
820        ++(*this);
821        return __t;
822    }
823
824    friend _LIBCPP_INLINE_VISIBILITY
825        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
826        {return __x.__i_ == __y.__i_;}
827    friend _LIBCPP_INLINE_VISIBILITY
828        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
829        {return __x.__i_ != __y.__i_;}
830
831    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
832    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
833    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
834    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
835};
836
837template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
838class unordered_multimap;
839
840template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
841          class _Alloc = allocator<pair<const _Key, _Tp> > >
842class _LIBCPP_TEMPLATE_VIS unordered_map
843{
844public:
845    // types
846    typedef _Key                                           key_type;
847    typedef _Tp                                            mapped_type;
848    typedef _Hash                                          hasher;
849    typedef _Pred                                          key_equal;
850    typedef _Alloc                                         allocator_type;
851    typedef pair<const key_type, mapped_type>              value_type;
852    typedef value_type&                                    reference;
853    typedef const value_type&                              const_reference;
854    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
855                  "Invalid allocator::value_type");
856    static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
857
858private:
859    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
860    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
861    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
862    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
863                                                 __value_type>::type __allocator_type;
864
865    typedef __hash_table<__value_type, __hasher,
866                         __key_equal,  __allocator_type>   __table;
867
868    __table __table_;
869
870    typedef typename __table::_NodeTypes                   _NodeTypes;
871    typedef typename __table::__node_pointer               __node_pointer;
872    typedef typename __table::__node_const_pointer         __node_const_pointer;
873    typedef typename __table::__node_traits                __node_traits;
874    typedef typename __table::__node_allocator             __node_allocator;
875    typedef typename __table::__node                       __node;
876    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
877    typedef unique_ptr<__node, _Dp>                         __node_holder;
878    typedef allocator_traits<allocator_type>               __alloc_traits;
879
880    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
881    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
882public:
883    typedef typename __alloc_traits::pointer         pointer;
884    typedef typename __alloc_traits::const_pointer   const_pointer;
885    typedef typename __table::size_type              size_type;
886    typedef typename __table::difference_type        difference_type;
887
888    typedef __hash_map_iterator<typename __table::iterator>       iterator;
889    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
890    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
891    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
892
893#if _LIBCPP_STD_VER > 14
894    typedef __map_node_handle<__node, allocator_type> node_type;
895    typedef __insert_return_type<iterator, node_type> insert_return_type;
896#endif
897
898    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
899        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
900    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
901        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
902
903    _LIBCPP_INLINE_VISIBILITY
904    unordered_map()
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_map(size_type __n, const hasher& __hf = hasher(),
912                           const key_equal& __eql = key_equal());
913    unordered_map(size_type __n, const hasher& __hf,
914                  const key_equal& __eql,
915                  const allocator_type& __a);
916    template <class _InputIterator>
917        unordered_map(_InputIterator __first, _InputIterator __last);
918    template <class _InputIterator>
919        unordered_map(_InputIterator __first, _InputIterator __last,
920                      size_type __n, const hasher& __hf = hasher(),
921                      const key_equal& __eql = key_equal());
922    template <class _InputIterator>
923        unordered_map(_InputIterator __first, _InputIterator __last,
924                      size_type __n, const hasher& __hf,
925                      const key_equal& __eql,
926                      const allocator_type& __a);
927    _LIBCPP_INLINE_VISIBILITY
928    explicit unordered_map(const allocator_type& __a);
929    unordered_map(const unordered_map& __u);
930    unordered_map(const unordered_map& __u, const allocator_type& __a);
931#ifndef _LIBCPP_CXX03_LANG
932    _LIBCPP_INLINE_VISIBILITY
933    unordered_map(unordered_map&& __u)
934        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
935    unordered_map(unordered_map&& __u, const allocator_type& __a);
936    unordered_map(initializer_list<value_type> __il);
937    unordered_map(initializer_list<value_type> __il, size_type __n,
938                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
939    unordered_map(initializer_list<value_type> __il, size_type __n,
940                  const hasher& __hf, const key_equal& __eql,
941                  const allocator_type& __a);
942#endif  // _LIBCPP_CXX03_LANG
943#if _LIBCPP_STD_VER > 11
944    _LIBCPP_INLINE_VISIBILITY
945    unordered_map(size_type __n, const allocator_type& __a)
946      : unordered_map(__n, hasher(), key_equal(), __a) {}
947    _LIBCPP_INLINE_VISIBILITY
948    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
949      : unordered_map(__n, __hf, key_equal(), __a) {}
950    template <class _InputIterator>
951    _LIBCPP_INLINE_VISIBILITY
952      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
953      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
954    template <class _InputIterator>
955    _LIBCPP_INLINE_VISIBILITY
956      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
957        const allocator_type& __a)
958      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
959    _LIBCPP_INLINE_VISIBILITY
960    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
961      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
962    _LIBCPP_INLINE_VISIBILITY
963    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
964      const allocator_type& __a)
965      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
966#endif
967    // ~unordered_map() = default;
968    _LIBCPP_INLINE_VISIBILITY
969    unordered_map& operator=(const unordered_map& __u)
970    {
971#ifndef _LIBCPP_CXX03_LANG
972        __table_ = __u.__table_;
973#else
974        if (this != &__u) {
975            __table_.clear();
976            __table_.hash_function() = __u.__table_.hash_function();
977            __table_.key_eq() = __u.__table_.key_eq();
978            __table_.max_load_factor() = __u.__table_.max_load_factor();
979            __table_.__copy_assign_alloc(__u.__table_);
980            insert(__u.begin(), __u.end());
981        }
982#endif
983        return *this;
984    }
985#ifndef _LIBCPP_CXX03_LANG
986    _LIBCPP_INLINE_VISIBILITY
987    unordered_map& operator=(unordered_map&& __u)
988        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
989    _LIBCPP_INLINE_VISIBILITY
990    unordered_map& operator=(initializer_list<value_type> __il);
991#endif  // _LIBCPP_CXX03_LANG
992
993    _LIBCPP_INLINE_VISIBILITY
994    allocator_type get_allocator() const _NOEXCEPT
995        {return allocator_type(__table_.__node_alloc());}
996
997    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
998    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
999    _LIBCPP_INLINE_VISIBILITY
1000    size_type size() const _NOEXCEPT  {return __table_.size();}
1001    _LIBCPP_INLINE_VISIBILITY
1002    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
1003
1004    _LIBCPP_INLINE_VISIBILITY
1005    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1006    _LIBCPP_INLINE_VISIBILITY
1007    iterator       end() _NOEXCEPT          {return __table_.end();}
1008    _LIBCPP_INLINE_VISIBILITY
1009    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1010    _LIBCPP_INLINE_VISIBILITY
1011    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1012    _LIBCPP_INLINE_VISIBILITY
1013    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1014    _LIBCPP_INLINE_VISIBILITY
1015    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
1016
1017    _LIBCPP_INLINE_VISIBILITY
1018    pair<iterator, bool> insert(const value_type& __x)
1019        {return __table_.__insert_unique(__x);}
1020
1021    iterator insert(const_iterator __p, const value_type& __x) {
1022#if _LIBCPP_DEBUG_LEVEL >= 2
1023        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1024            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
1025            " referring to this unordered_map");
1026#else
1027        ((void)__p);
1028#endif
1029        return insert(__x).first;
1030    }
1031
1032    template <class _InputIterator>
1033        _LIBCPP_INLINE_VISIBILITY
1034        void insert(_InputIterator __first, _InputIterator __last);
1035
1036#ifndef _LIBCPP_CXX03_LANG
1037    _LIBCPP_INLINE_VISIBILITY
1038    void insert(initializer_list<value_type> __il)
1039        {insert(__il.begin(), __il.end());}
1040
1041    _LIBCPP_INLINE_VISIBILITY
1042    pair<iterator, bool> insert(value_type&& __x)
1043        {return __table_.__insert_unique(_VSTD::move(__x));}
1044
1045    iterator insert(const_iterator __p, value_type&& __x) {
1046#if _LIBCPP_DEBUG_LEVEL >= 2
1047        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1048            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
1049            " referring to this unordered_map");
1050#else
1051        ((void)__p);
1052#endif
1053        return __table_.__insert_unique(_VSTD::move(__x)).first;
1054    }
1055
1056    template <class _Pp,
1057              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1058        _LIBCPP_INLINE_VISIBILITY
1059        pair<iterator, bool> insert(_Pp&& __x)
1060            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
1061
1062    template <class _Pp,
1063              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1064        _LIBCPP_INLINE_VISIBILITY
1065        iterator insert(const_iterator __p, _Pp&& __x)
1066        {
1067#if _LIBCPP_DEBUG_LEVEL >= 2
1068            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1069                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
1070                " referring to this unordered_map");
1071#else
1072          ((void)__p);
1073#endif
1074            return insert(_VSTD::forward<_Pp>(__x)).first;
1075        }
1076
1077    template <class... _Args>
1078    _LIBCPP_INLINE_VISIBILITY
1079    pair<iterator, bool> emplace(_Args&&... __args) {
1080        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1081    }
1082
1083    template <class... _Args>
1084    _LIBCPP_INLINE_VISIBILITY
1085    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1086#if _LIBCPP_DEBUG_LEVEL >= 2
1087        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1088            "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
1089            " referring to this unordered_map");
1090#else
1091          ((void)__p);
1092#endif
1093        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
1094    }
1095
1096#endif  // _LIBCPP_CXX03_LANG
1097
1098#if _LIBCPP_STD_VER > 14
1099    template <class... _Args>
1100        _LIBCPP_INLINE_VISIBILITY
1101        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1102    {
1103        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
1104            _VSTD::forward_as_tuple(__k),
1105            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1106    }
1107
1108    template <class... _Args>
1109        _LIBCPP_INLINE_VISIBILITY
1110        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1111    {
1112        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
1113            _VSTD::forward_as_tuple(_VSTD::move(__k)),
1114            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1115    }
1116
1117    template <class... _Args>
1118        _LIBCPP_INLINE_VISIBILITY
1119        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1120    {
1121#if _LIBCPP_DEBUG_LEVEL >= 2
1122        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
1123            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1124            " referring to this unordered_map");
1125#else
1126        ((void)__h);
1127#endif
1128        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1129    }
1130
1131    template <class... _Args>
1132        _LIBCPP_INLINE_VISIBILITY
1133        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1134    {
1135#if _LIBCPP_DEBUG_LEVEL >= 2
1136        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
1137            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
1138            " referring to this unordered_map");
1139#else
1140        ((void)__h);
1141#endif
1142        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1143    }
1144
1145    template <class _Vp>
1146        _LIBCPP_INLINE_VISIBILITY
1147        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1148    {
1149        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1150            __k, _VSTD::forward<_Vp>(__v));
1151        if (!__res.second) {
1152            __res.first->second = _VSTD::forward<_Vp>(__v);
1153        }
1154        return __res;
1155    }
1156
1157    template <class _Vp>
1158        _LIBCPP_INLINE_VISIBILITY
1159        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1160    {
1161        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
1162            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1163        if (!__res.second) {
1164            __res.first->second = _VSTD::forward<_Vp>(__v);
1165        }
1166        return __res;
1167    }
1168
1169    template <class _Vp>
1170        _LIBCPP_INLINE_VISIBILITY
1171        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1172     {
1173          // FIXME: Add debug mode checking for the iterator input
1174          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1175     }
1176
1177    template <class _Vp>
1178        _LIBCPP_INLINE_VISIBILITY
1179        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1180     {
1181        // FIXME: Add debug mode checking for the iterator input
1182        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1183     }
1184#endif // _LIBCPP_STD_VER > 14
1185
1186    _LIBCPP_INLINE_VISIBILITY
1187    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1188    _LIBCPP_INLINE_VISIBILITY
1189    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1190    _LIBCPP_INLINE_VISIBILITY
1191    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1192    _LIBCPP_INLINE_VISIBILITY
1193    iterator erase(const_iterator __first, const_iterator __last)
1194        {return __table_.erase(__first.__i_, __last.__i_);}
1195    _LIBCPP_INLINE_VISIBILITY
1196        void clear() _NOEXCEPT {__table_.clear();}
1197
1198#if _LIBCPP_STD_VER > 14
1199    _LIBCPP_INLINE_VISIBILITY
1200    insert_return_type insert(node_type&& __nh)
1201    {
1202        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1203            "node_type with incompatible allocator passed to unordered_map::insert()");
1204        return __table_.template __node_handle_insert_unique<
1205            node_type, insert_return_type>(_VSTD::move(__nh));
1206    }
1207    _LIBCPP_INLINE_VISIBILITY
1208    iterator insert(const_iterator __hint, node_type&& __nh)
1209    {
1210        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1211            "node_type with incompatible allocator passed to unordered_map::insert()");
1212        return __table_.template __node_handle_insert_unique<node_type>(
1213            __hint.__i_, _VSTD::move(__nh));
1214    }
1215    _LIBCPP_INLINE_VISIBILITY
1216    node_type extract(key_type const& __key)
1217    {
1218        return __table_.template __node_handle_extract<node_type>(__key);
1219    }
1220    _LIBCPP_INLINE_VISIBILITY
1221    node_type extract(const_iterator __it)
1222    {
1223        return __table_.template __node_handle_extract<node_type>(
1224            __it.__i_);
1225    }
1226
1227    template <class _H2, class _P2>
1228    _LIBCPP_INLINE_VISIBILITY
1229    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1230    {
1231        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1232                       "merging container with incompatible allocator");
1233        return __table_.__node_handle_merge_unique(__source.__table_);
1234    }
1235    template <class _H2, class _P2>
1236    _LIBCPP_INLINE_VISIBILITY
1237    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1238    {
1239        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1240                       "merging container with incompatible allocator");
1241        return __table_.__node_handle_merge_unique(__source.__table_);
1242    }
1243    template <class _H2, class _P2>
1244    _LIBCPP_INLINE_VISIBILITY
1245    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1246    {
1247        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1248                       "merging container with incompatible allocator");
1249        return __table_.__node_handle_merge_unique(__source.__table_);
1250    }
1251    template <class _H2, class _P2>
1252    _LIBCPP_INLINE_VISIBILITY
1253    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1254    {
1255        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1256                       "merging container with incompatible allocator");
1257        return __table_.__node_handle_merge_unique(__source.__table_);
1258    }
1259#endif
1260
1261    _LIBCPP_INLINE_VISIBILITY
1262    void swap(unordered_map& __u)
1263        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1264        { __table_.swap(__u.__table_);}
1265
1266    _LIBCPP_INLINE_VISIBILITY
1267    hasher hash_function() const
1268        {return __table_.hash_function().hash_function();}
1269    _LIBCPP_INLINE_VISIBILITY
1270    key_equal key_eq() const
1271        {return __table_.key_eq().key_eq();}
1272
1273    _LIBCPP_INLINE_VISIBILITY
1274    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1275    _LIBCPP_INLINE_VISIBILITY
1276    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1277    _LIBCPP_INLINE_VISIBILITY
1278    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1279    _LIBCPP_INLINE_VISIBILITY
1280    pair<iterator, iterator>             equal_range(const key_type& __k)
1281        {return __table_.__equal_range_unique(__k);}
1282    _LIBCPP_INLINE_VISIBILITY
1283    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1284        {return __table_.__equal_range_unique(__k);}
1285
1286    mapped_type& operator[](const key_type& __k);
1287#ifndef _LIBCPP_CXX03_LANG
1288    mapped_type& operator[](key_type&& __k);
1289#endif
1290
1291    mapped_type&       at(const key_type& __k);
1292    const mapped_type& at(const key_type& __k) const;
1293
1294    _LIBCPP_INLINE_VISIBILITY
1295    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1296    _LIBCPP_INLINE_VISIBILITY
1297    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
1298
1299    _LIBCPP_INLINE_VISIBILITY
1300    size_type bucket_size(size_type __n) const
1301        {return __table_.bucket_size(__n);}
1302    _LIBCPP_INLINE_VISIBILITY
1303    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
1304
1305    _LIBCPP_INLINE_VISIBILITY
1306    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1307    _LIBCPP_INLINE_VISIBILITY
1308    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1309    _LIBCPP_INLINE_VISIBILITY
1310    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1311    _LIBCPP_INLINE_VISIBILITY
1312    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1313    _LIBCPP_INLINE_VISIBILITY
1314    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1315    _LIBCPP_INLINE_VISIBILITY
1316    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
1317
1318    _LIBCPP_INLINE_VISIBILITY
1319    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1320    _LIBCPP_INLINE_VISIBILITY
1321    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1322    _LIBCPP_INLINE_VISIBILITY
1323    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1324    _LIBCPP_INLINE_VISIBILITY
1325    void rehash(size_type __n) {__table_.rehash(__n);}
1326    _LIBCPP_INLINE_VISIBILITY
1327    void reserve(size_type __n) {__table_.reserve(__n);}
1328
1329#if _LIBCPP_DEBUG_LEVEL >= 2
1330
1331    bool __dereferenceable(const const_iterator* __i) const
1332        {return __table_.__dereferenceable(&__i->__i_);}
1333    bool __decrementable(const const_iterator* __i) const
1334        {return __table_.__decrementable(&__i->__i_);}
1335    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1336        {return __table_.__addable(&__i->__i_, __n);}
1337    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1338        {return __table_.__addable(&__i->__i_, __n);}
1339
1340#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1341
1342private:
1343
1344#ifdef _LIBCPP_CXX03_LANG
1345    __node_holder __construct_node_with_key(const key_type& __k);
1346#endif
1347};
1348
1349template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1350unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1351        size_type __n, const hasher& __hf, const key_equal& __eql)
1352    : __table_(__hf, __eql)
1353{
1354#if _LIBCPP_DEBUG_LEVEL >= 2
1355    __get_db()->__insert_c(this);
1356#endif
1357    __table_.rehash(__n);
1358}
1359
1360template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1361unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1362        size_type __n, const hasher& __hf, const key_equal& __eql,
1363        const allocator_type& __a)
1364    : __table_(__hf, __eql, typename __table::allocator_type(__a))
1365{
1366#if _LIBCPP_DEBUG_LEVEL >= 2
1367    __get_db()->__insert_c(this);
1368#endif
1369    __table_.rehash(__n);
1370}
1371
1372template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1373inline
1374unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1375        const allocator_type& __a)
1376    : __table_(typename __table::allocator_type(__a))
1377{
1378#if _LIBCPP_DEBUG_LEVEL >= 2
1379    __get_db()->__insert_c(this);
1380#endif
1381}
1382
1383template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1384template <class _InputIterator>
1385unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1386        _InputIterator __first, _InputIterator __last)
1387{
1388#if _LIBCPP_DEBUG_LEVEL >= 2
1389    __get_db()->__insert_c(this);
1390#endif
1391    insert(__first, __last);
1392}
1393
1394template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1395template <class _InputIterator>
1396unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1397        _InputIterator __first, _InputIterator __last, size_type __n,
1398        const hasher& __hf, const key_equal& __eql)
1399    : __table_(__hf, __eql)
1400{
1401#if _LIBCPP_DEBUG_LEVEL >= 2
1402    __get_db()->__insert_c(this);
1403#endif
1404    __table_.rehash(__n);
1405    insert(__first, __last);
1406}
1407
1408template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1409template <class _InputIterator>
1410unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1411        _InputIterator __first, _InputIterator __last, size_type __n,
1412        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
1413    : __table_(__hf, __eql, typename __table::allocator_type(__a))
1414{
1415#if _LIBCPP_DEBUG_LEVEL >= 2
1416    __get_db()->__insert_c(this);
1417#endif
1418    __table_.rehash(__n);
1419    insert(__first, __last);
1420}
1421
1422template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1423unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1424        const unordered_map& __u)
1425    : __table_(__u.__table_)
1426{
1427#if _LIBCPP_DEBUG_LEVEL >= 2
1428    __get_db()->__insert_c(this);
1429#endif
1430    __table_.rehash(__u.bucket_count());
1431    insert(__u.begin(), __u.end());
1432}
1433
1434template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1435unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1436        const unordered_map& __u, const allocator_type& __a)
1437    : __table_(__u.__table_, typename __table::allocator_type(__a))
1438{
1439#if _LIBCPP_DEBUG_LEVEL >= 2
1440    __get_db()->__insert_c(this);
1441#endif
1442    __table_.rehash(__u.bucket_count());
1443    insert(__u.begin(), __u.end());
1444}
1445
1446#ifndef _LIBCPP_CXX03_LANG
1447
1448template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1449inline
1450unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1451        unordered_map&& __u)
1452    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1453    : __table_(_VSTD::move(__u.__table_))
1454{
1455#if _LIBCPP_DEBUG_LEVEL >= 2
1456    __get_db()->__insert_c(this);
1457    __get_db()->swap(this, &__u);
1458#endif
1459}
1460
1461template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1462unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1463        unordered_map&& __u, const allocator_type& __a)
1464    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
1465{
1466#if _LIBCPP_DEBUG_LEVEL >= 2
1467    __get_db()->__insert_c(this);
1468#endif
1469    if (__a != __u.get_allocator())
1470    {
1471        iterator __i = __u.begin();
1472        while (__u.size() != 0) {
1473            __table_.__emplace_unique(
1474                __u.__table_.remove((__i++).__i_)->__value_.__move());
1475        }
1476    }
1477#if _LIBCPP_DEBUG_LEVEL >= 2
1478    else
1479        __get_db()->swap(this, &__u);
1480#endif
1481}
1482
1483template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1484unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1485        initializer_list<value_type> __il)
1486{
1487#if _LIBCPP_DEBUG_LEVEL >= 2
1488    __get_db()->__insert_c(this);
1489#endif
1490    insert(__il.begin(), __il.end());
1491}
1492
1493template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1494unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1495        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1496        const key_equal& __eql)
1497    : __table_(__hf, __eql)
1498{
1499#if _LIBCPP_DEBUG_LEVEL >= 2
1500    __get_db()->__insert_c(this);
1501#endif
1502    __table_.rehash(__n);
1503    insert(__il.begin(), __il.end());
1504}
1505
1506template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1507unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
1508        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1509        const key_equal& __eql, const allocator_type& __a)
1510    : __table_(__hf, __eql, typename __table::allocator_type(__a))
1511{
1512#if _LIBCPP_DEBUG_LEVEL >= 2
1513    __get_db()->__insert_c(this);
1514#endif
1515    __table_.rehash(__n);
1516    insert(__il.begin(), __il.end());
1517}
1518
1519template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1520inline
1521unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1522unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
1523    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
1524{
1525    __table_ = _VSTD::move(__u.__table_);
1526    return *this;
1527}
1528
1529template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1530inline
1531unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
1532unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
1533        initializer_list<value_type> __il)
1534{
1535    __table_.__assign_unique(__il.begin(), __il.end());
1536    return *this;
1537}
1538
1539#endif  // _LIBCPP_CXX03_LANG
1540
1541template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1542template <class _InputIterator>
1543inline
1544void
1545unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1546                                                       _InputIterator __last)
1547{
1548    for (; __first != __last; ++__first)
1549        __table_.__insert_unique(*__first);
1550}
1551
1552#ifndef _LIBCPP_CXX03_LANG
1553
1554template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1555_Tp&
1556unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1557{
1558    return __table_.__emplace_unique_key_args(__k,
1559        std::piecewise_construct, std::forward_as_tuple(__k),
1560                                  std::forward_as_tuple()).first->__get_value().second;
1561}
1562
1563template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1564_Tp&
1565unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
1566{
1567    return __table_.__emplace_unique_key_args(__k,
1568        std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1569                                  std::forward_as_tuple()).first->__get_value().second;
1570}
1571#else // _LIBCPP_CXX03_LANG
1572
1573template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1574typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
1575unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
1576{
1577    __node_allocator& __na = __table_.__node_alloc();
1578    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1579    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
1580    __h.get_deleter().__first_constructed = true;
1581    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
1582    __h.get_deleter().__second_constructed = true;
1583    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
1584}
1585
1586template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1587_Tp&
1588unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
1589{
1590    iterator __i = find(__k);
1591    if (__i != end())
1592        return __i->second;
1593    __node_holder __h = __construct_node_with_key(__k);
1594    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
1595    __h.release();
1596    return __r.first->second;
1597}
1598
1599#endif  // _LIBCPP_CXX03_MODE
1600
1601template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1602_Tp&
1603unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
1604{
1605    iterator __i = find(__k);
1606#ifndef _LIBCPP_NO_EXCEPTIONS
1607    if (__i == end())
1608        throw out_of_range("unordered_map::at: key not found");
1609#endif  // _LIBCPP_NO_EXCEPTIONS
1610    return __i->second;
1611}
1612
1613template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1614const _Tp&
1615unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
1616{
1617    const_iterator __i = find(__k);
1618#ifndef _LIBCPP_NO_EXCEPTIONS
1619    if (__i == end())
1620        throw out_of_range("unordered_map::at: key not found");
1621#endif  // _LIBCPP_NO_EXCEPTIONS
1622    return __i->second;
1623}
1624
1625template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1626inline _LIBCPP_INLINE_VISIBILITY
1627void
1628swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1629     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1630    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1631{
1632    __x.swap(__y);
1633}
1634
1635#if _LIBCPP_STD_VER > 17
1636template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
1637inline _LIBCPP_INLINE_VISIBILITY
1638void erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
1639{ __libcpp_erase_if_container(__c, __pred); }
1640#endif
1641
1642template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1643bool
1644operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1645           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1646{
1647    if (__x.size() != __y.size())
1648        return false;
1649    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
1650                                                                 const_iterator;
1651    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
1652            __i != __ex; ++__i)
1653    {
1654        const_iterator __j = __y.find(__i->first);
1655        if (__j == __ey || !(*__i == *__j))
1656            return false;
1657    }
1658    return true;
1659}
1660
1661template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1662inline _LIBCPP_INLINE_VISIBILITY
1663bool
1664operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
1665           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
1666{
1667    return !(__x == __y);
1668}
1669
1670template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
1671          class _Alloc = allocator<pair<const _Key, _Tp> > >
1672class _LIBCPP_TEMPLATE_VIS unordered_multimap
1673{
1674public:
1675    // types
1676    typedef _Key                                           key_type;
1677    typedef _Tp                                            mapped_type;
1678    typedef _Hash                                          hasher;
1679    typedef _Pred                                          key_equal;
1680    typedef _Alloc                                         allocator_type;
1681    typedef pair<const key_type, mapped_type>              value_type;
1682    typedef value_type&                                    reference;
1683    typedef const value_type&                              const_reference;
1684    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1685                  "Invalid allocator::value_type");
1686    static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
1687
1688private:
1689    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1690    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1691    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
1692    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1693                                                 __value_type>::type __allocator_type;
1694
1695    typedef __hash_table<__value_type, __hasher,
1696                         __key_equal,  __allocator_type>   __table;
1697
1698    __table __table_;
1699
1700    typedef typename __table::_NodeTypes                   _NodeTypes;
1701    typedef typename __table::__node_traits                __node_traits;
1702    typedef typename __table::__node_allocator             __node_allocator;
1703    typedef typename __table::__node                       __node;
1704    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1705    typedef unique_ptr<__node, _Dp>                         __node_holder;
1706    typedef allocator_traits<allocator_type>               __alloc_traits;
1707    static_assert((is_same<typename __node_traits::size_type,
1708                          typename __alloc_traits::size_type>::value),
1709                 "Allocator uses different size_type for different types");
1710public:
1711    typedef typename __alloc_traits::pointer         pointer;
1712    typedef typename __alloc_traits::const_pointer   const_pointer;
1713    typedef typename __table::size_type              size_type;
1714    typedef typename __table::difference_type        difference_type;
1715
1716    typedef __hash_map_iterator<typename __table::iterator>       iterator;
1717    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
1718    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
1719    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
1720
1721#if _LIBCPP_STD_VER > 14
1722    typedef __map_node_handle<__node, allocator_type> node_type;
1723#endif
1724
1725    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
1726        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
1727    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
1728        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
1729
1730    _LIBCPP_INLINE_VISIBILITY
1731    unordered_multimap()
1732        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1733        {
1734#if _LIBCPP_DEBUG_LEVEL >= 2
1735            __get_db()->__insert_c(this);
1736#endif
1737        }
1738    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
1739                                const key_equal& __eql = key_equal());
1740    unordered_multimap(size_type __n, const hasher& __hf,
1741                                const key_equal& __eql,
1742                                const allocator_type& __a);
1743    template <class _InputIterator>
1744        unordered_multimap(_InputIterator __first, _InputIterator __last);
1745    template <class _InputIterator>
1746        unordered_multimap(_InputIterator __first, _InputIterator __last,
1747                      size_type __n, const hasher& __hf = hasher(),
1748                      const key_equal& __eql = key_equal());
1749    template <class _InputIterator>
1750        unordered_multimap(_InputIterator __first, _InputIterator __last,
1751                      size_type __n, const hasher& __hf,
1752                      const key_equal& __eql,
1753                      const allocator_type& __a);
1754    _LIBCPP_INLINE_VISIBILITY
1755    explicit unordered_multimap(const allocator_type& __a);
1756    unordered_multimap(const unordered_multimap& __u);
1757    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
1758#ifndef _LIBCPP_CXX03_LANG
1759    _LIBCPP_INLINE_VISIBILITY
1760    unordered_multimap(unordered_multimap&& __u)
1761        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
1762    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
1763    unordered_multimap(initializer_list<value_type> __il);
1764    unordered_multimap(initializer_list<value_type> __il, size_type __n,
1765                       const hasher& __hf = hasher(),
1766                       const key_equal& __eql = key_equal());
1767    unordered_multimap(initializer_list<value_type> __il, size_type __n,
1768                       const hasher& __hf, const key_equal& __eql,
1769                       const allocator_type& __a);
1770#endif  // _LIBCPP_CXX03_LANG
1771#if _LIBCPP_STD_VER > 11
1772    _LIBCPP_INLINE_VISIBILITY
1773    unordered_multimap(size_type __n, const allocator_type& __a)
1774      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
1775    _LIBCPP_INLINE_VISIBILITY
1776    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
1777      : unordered_multimap(__n, __hf, key_equal(), __a) {}
1778    template <class _InputIterator>
1779    _LIBCPP_INLINE_VISIBILITY
1780      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
1781      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
1782    template <class _InputIterator>
1783    _LIBCPP_INLINE_VISIBILITY
1784      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
1785        const allocator_type& __a)
1786      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
1787    _LIBCPP_INLINE_VISIBILITY
1788    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
1789      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
1790    _LIBCPP_INLINE_VISIBILITY
1791    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1792      const allocator_type& __a)
1793      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
1794#endif
1795    // ~unordered_multimap() = default;
1796    _LIBCPP_INLINE_VISIBILITY
1797    unordered_multimap& operator=(const unordered_multimap& __u)
1798    {
1799#ifndef _LIBCPP_CXX03_LANG
1800        __table_ = __u.__table_;
1801#else
1802        if (this != &__u) {
1803            __table_.clear();
1804            __table_.hash_function() = __u.__table_.hash_function();
1805            __table_.key_eq() = __u.__table_.key_eq();
1806            __table_.max_load_factor() = __u.__table_.max_load_factor();
1807            __table_.__copy_assign_alloc(__u.__table_);
1808            insert(__u.begin(), __u.end());
1809        }
1810#endif
1811        return *this;
1812    }
1813#ifndef _LIBCPP_CXX03_LANG
1814    _LIBCPP_INLINE_VISIBILITY
1815    unordered_multimap& operator=(unordered_multimap&& __u)
1816        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1817    _LIBCPP_INLINE_VISIBILITY
1818    unordered_multimap& operator=(initializer_list<value_type> __il);
1819#endif  // _LIBCPP_CXX03_LANG
1820
1821    _LIBCPP_INLINE_VISIBILITY
1822    allocator_type get_allocator() const _NOEXCEPT
1823        {return allocator_type(__table_.__node_alloc());}
1824
1825    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1826    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1827    _LIBCPP_INLINE_VISIBILITY
1828    size_type size() const _NOEXCEPT  {return __table_.size();}
1829    _LIBCPP_INLINE_VISIBILITY
1830    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
1831
1832    _LIBCPP_INLINE_VISIBILITY
1833    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1834    _LIBCPP_INLINE_VISIBILITY
1835    iterator       end() _NOEXCEPT          {return __table_.end();}
1836    _LIBCPP_INLINE_VISIBILITY
1837    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1838    _LIBCPP_INLINE_VISIBILITY
1839    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1840    _LIBCPP_INLINE_VISIBILITY
1841    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1842    _LIBCPP_INLINE_VISIBILITY
1843    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
1844
1845    _LIBCPP_INLINE_VISIBILITY
1846    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
1847
1848    _LIBCPP_INLINE_VISIBILITY
1849    iterator insert(const_iterator __p, const value_type& __x)
1850        {return __table_.__insert_multi(__p.__i_, __x);}
1851
1852    template <class _InputIterator>
1853    _LIBCPP_INLINE_VISIBILITY
1854    void insert(_InputIterator __first, _InputIterator __last);
1855
1856#ifndef _LIBCPP_CXX03_LANG
1857    _LIBCPP_INLINE_VISIBILITY
1858    void insert(initializer_list<value_type> __il)
1859        {insert(__il.begin(), __il.end());}
1860    _LIBCPP_INLINE_VISIBILITY
1861    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
1862
1863    _LIBCPP_INLINE_VISIBILITY
1864    iterator insert(const_iterator __p, value_type&& __x)
1865        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
1866
1867    template <class _Pp,
1868              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1869    _LIBCPP_INLINE_VISIBILITY
1870    iterator insert(_Pp&& __x)
1871        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
1872
1873    template <class _Pp,
1874              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1875    _LIBCPP_INLINE_VISIBILITY
1876    iterator insert(const_iterator __p, _Pp&& __x)
1877        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
1878
1879    template <class... _Args>
1880    iterator emplace(_Args&&... __args) {
1881        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1882    }
1883
1884    template <class... _Args>
1885    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1886        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1887    }
1888#endif  // _LIBCPP_CXX03_LANG
1889
1890
1891    _LIBCPP_INLINE_VISIBILITY
1892    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1893    _LIBCPP_INLINE_VISIBILITY
1894    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1895    _LIBCPP_INLINE_VISIBILITY
1896    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1897    _LIBCPP_INLINE_VISIBILITY
1898    iterator erase(const_iterator __first, const_iterator __last)
1899        {return __table_.erase(__first.__i_, __last.__i_);}
1900    _LIBCPP_INLINE_VISIBILITY
1901    void clear() _NOEXCEPT {__table_.clear();}
1902
1903#if _LIBCPP_STD_VER > 14
1904    _LIBCPP_INLINE_VISIBILITY
1905    iterator insert(node_type&& __nh)
1906    {
1907        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1908            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1909        return __table_.template __node_handle_insert_multi<node_type>(
1910            _VSTD::move(__nh));
1911    }
1912    _LIBCPP_INLINE_VISIBILITY
1913    iterator insert(const_iterator __hint, node_type&& __nh)
1914    {
1915        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1916            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1917        return __table_.template __node_handle_insert_multi<node_type>(
1918            __hint.__i_, _VSTD::move(__nh));
1919    }
1920    _LIBCPP_INLINE_VISIBILITY
1921    node_type extract(key_type const& __key)
1922    {
1923        return __table_.template __node_handle_extract<node_type>(__key);
1924    }
1925    _LIBCPP_INLINE_VISIBILITY
1926    node_type extract(const_iterator __it)
1927    {
1928        return __table_.template __node_handle_extract<node_type>(
1929            __it.__i_);
1930    }
1931
1932    template <class _H2, class _P2>
1933    _LIBCPP_INLINE_VISIBILITY
1934    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1935    {
1936        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1937                       "merging container with incompatible allocator");
1938        return __table_.__node_handle_merge_multi(__source.__table_);
1939    }
1940    template <class _H2, class _P2>
1941    _LIBCPP_INLINE_VISIBILITY
1942    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1943    {
1944        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1945                       "merging container with incompatible allocator");
1946        return __table_.__node_handle_merge_multi(__source.__table_);
1947    }
1948    template <class _H2, class _P2>
1949    _LIBCPP_INLINE_VISIBILITY
1950    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1951    {
1952        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1953                       "merging container with incompatible allocator");
1954        return __table_.__node_handle_merge_multi(__source.__table_);
1955    }
1956    template <class _H2, class _P2>
1957    _LIBCPP_INLINE_VISIBILITY
1958    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1959    {
1960        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1961                       "merging container with incompatible allocator");
1962        return __table_.__node_handle_merge_multi(__source.__table_);
1963    }
1964#endif
1965
1966    _LIBCPP_INLINE_VISIBILITY
1967    void swap(unordered_multimap& __u)
1968        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
1969        {__table_.swap(__u.__table_);}
1970
1971    _LIBCPP_INLINE_VISIBILITY
1972    hasher hash_function() const
1973        {return __table_.hash_function().hash_function();}
1974    _LIBCPP_INLINE_VISIBILITY
1975    key_equal key_eq() const
1976        {return __table_.key_eq().key_eq();}
1977
1978    _LIBCPP_INLINE_VISIBILITY
1979    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1980    _LIBCPP_INLINE_VISIBILITY
1981    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1982    _LIBCPP_INLINE_VISIBILITY
1983    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1984    _LIBCPP_INLINE_VISIBILITY
1985    pair<iterator, iterator>             equal_range(const key_type& __k)
1986        {return __table_.__equal_range_multi(__k);}
1987    _LIBCPP_INLINE_VISIBILITY
1988    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
1989        {return __table_.__equal_range_multi(__k);}
1990
1991    _LIBCPP_INLINE_VISIBILITY
1992    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1993    _LIBCPP_INLINE_VISIBILITY
1994    size_type max_bucket_count() const _NOEXCEPT
1995        {return __table_.max_bucket_count();}
1996
1997    _LIBCPP_INLINE_VISIBILITY
1998    size_type bucket_size(size_type __n) const
1999        {return __table_.bucket_size(__n);}
2000    _LIBCPP_INLINE_VISIBILITY
2001    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
2002
2003    _LIBCPP_INLINE_VISIBILITY
2004    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
2005    _LIBCPP_INLINE_VISIBILITY
2006    local_iterator       end(size_type __n)          {return __table_.end(__n);}
2007    _LIBCPP_INLINE_VISIBILITY
2008    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
2009    _LIBCPP_INLINE_VISIBILITY
2010    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
2011    _LIBCPP_INLINE_VISIBILITY
2012    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
2013    _LIBCPP_INLINE_VISIBILITY
2014    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
2015
2016    _LIBCPP_INLINE_VISIBILITY
2017    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
2018    _LIBCPP_INLINE_VISIBILITY
2019    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
2020    _LIBCPP_INLINE_VISIBILITY
2021    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
2022    _LIBCPP_INLINE_VISIBILITY
2023    void rehash(size_type __n) {__table_.rehash(__n);}
2024    _LIBCPP_INLINE_VISIBILITY
2025    void reserve(size_type __n) {__table_.reserve(__n);}
2026
2027#if _LIBCPP_DEBUG_LEVEL >= 2
2028
2029    bool __dereferenceable(const const_iterator* __i) const
2030        {return __table_.__dereferenceable(&__i->__i_);}
2031    bool __decrementable(const const_iterator* __i) const
2032        {return __table_.__decrementable(&__i->__i_);}
2033    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
2034        {return __table_.__addable(&__i->__i_, __n);}
2035    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2036        {return __table_.__addable(&__i->__i_, __n);}
2037
2038#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2039
2040
2041};
2042
2043template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2044unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2045        size_type __n, const hasher& __hf, const key_equal& __eql)
2046    : __table_(__hf, __eql)
2047{
2048#if _LIBCPP_DEBUG_LEVEL >= 2
2049    __get_db()->__insert_c(this);
2050#endif
2051    __table_.rehash(__n);
2052}
2053
2054template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2055unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2056        size_type __n, const hasher& __hf, const key_equal& __eql,
2057        const allocator_type& __a)
2058    : __table_(__hf, __eql, typename __table::allocator_type(__a))
2059{
2060#if _LIBCPP_DEBUG_LEVEL >= 2
2061    __get_db()->__insert_c(this);
2062#endif
2063    __table_.rehash(__n);
2064}
2065
2066template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2067template <class _InputIterator>
2068unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2069        _InputIterator __first, _InputIterator __last)
2070{
2071#if _LIBCPP_DEBUG_LEVEL >= 2
2072    __get_db()->__insert_c(this);
2073#endif
2074    insert(__first, __last);
2075}
2076
2077template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2078template <class _InputIterator>
2079unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2080        _InputIterator __first, _InputIterator __last, size_type __n,
2081        const hasher& __hf, const key_equal& __eql)
2082    : __table_(__hf, __eql)
2083{
2084#if _LIBCPP_DEBUG_LEVEL >= 2
2085    __get_db()->__insert_c(this);
2086#endif
2087    __table_.rehash(__n);
2088    insert(__first, __last);
2089}
2090
2091template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2092template <class _InputIterator>
2093unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2094        _InputIterator __first, _InputIterator __last, size_type __n,
2095        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
2096    : __table_(__hf, __eql, typename __table::allocator_type(__a))
2097{
2098#if _LIBCPP_DEBUG_LEVEL >= 2
2099    __get_db()->__insert_c(this);
2100#endif
2101    __table_.rehash(__n);
2102    insert(__first, __last);
2103}
2104
2105template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2106inline
2107unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2108        const allocator_type& __a)
2109    : __table_(typename __table::allocator_type(__a))
2110{
2111#if _LIBCPP_DEBUG_LEVEL >= 2
2112    __get_db()->__insert_c(this);
2113#endif
2114}
2115
2116template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2117unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2118        const unordered_multimap& __u)
2119    : __table_(__u.__table_)
2120{
2121#if _LIBCPP_DEBUG_LEVEL >= 2
2122    __get_db()->__insert_c(this);
2123#endif
2124    __table_.rehash(__u.bucket_count());
2125    insert(__u.begin(), __u.end());
2126}
2127
2128template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2129unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2130        const unordered_multimap& __u, const allocator_type& __a)
2131    : __table_(__u.__table_, typename __table::allocator_type(__a))
2132{
2133#if _LIBCPP_DEBUG_LEVEL >= 2
2134    __get_db()->__insert_c(this);
2135#endif
2136    __table_.rehash(__u.bucket_count());
2137    insert(__u.begin(), __u.end());
2138}
2139
2140#ifndef _LIBCPP_CXX03_LANG
2141
2142template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2143inline
2144unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2145        unordered_multimap&& __u)
2146    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2147    : __table_(_VSTD::move(__u.__table_))
2148{
2149#if _LIBCPP_DEBUG_LEVEL >= 2
2150    __get_db()->__insert_c(this);
2151    __get_db()->swap(this, &__u);
2152#endif
2153}
2154
2155template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2156unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2157        unordered_multimap&& __u, const allocator_type& __a)
2158    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
2159{
2160#if _LIBCPP_DEBUG_LEVEL >= 2
2161    __get_db()->__insert_c(this);
2162#endif
2163    if (__a != __u.get_allocator())
2164    {
2165        iterator __i = __u.begin();
2166        while (__u.size() != 0)
2167        {
2168            __table_.__insert_multi(
2169                __u.__table_.remove((__i++).__i_)->__value_.__move());
2170        }
2171    }
2172#if _LIBCPP_DEBUG_LEVEL >= 2
2173    else
2174        __get_db()->swap(this, &__u);
2175#endif
2176}
2177
2178template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2179unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2180        initializer_list<value_type> __il)
2181{
2182#if _LIBCPP_DEBUG_LEVEL >= 2
2183    __get_db()->__insert_c(this);
2184#endif
2185    insert(__il.begin(), __il.end());
2186}
2187
2188template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2189unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2190        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
2191        const key_equal& __eql)
2192    : __table_(__hf, __eql)
2193{
2194#if _LIBCPP_DEBUG_LEVEL >= 2
2195    __get_db()->__insert_c(this);
2196#endif
2197    __table_.rehash(__n);
2198    insert(__il.begin(), __il.end());
2199}
2200
2201template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2202unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
2203        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
2204        const key_equal& __eql, const allocator_type& __a)
2205    : __table_(__hf, __eql, typename __table::allocator_type(__a))
2206{
2207#if _LIBCPP_DEBUG_LEVEL >= 2
2208    __get_db()->__insert_c(this);
2209#endif
2210    __table_.rehash(__n);
2211    insert(__il.begin(), __il.end());
2212}
2213
2214template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2215inline
2216unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2217unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
2218    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
2219{
2220    __table_ = _VSTD::move(__u.__table_);
2221    return *this;
2222}
2223
2224template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2225inline
2226unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
2227unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
2228        initializer_list<value_type> __il)
2229{
2230    __table_.__assign_multi(__il.begin(), __il.end());
2231    return *this;
2232}
2233
2234#endif  // _LIBCPP_CXX03_LANG
2235
2236
2237
2238template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2239template <class _InputIterator>
2240inline
2241void
2242unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
2243                                                            _InputIterator __last)
2244{
2245    for (; __first != __last; ++__first)
2246        __table_.__insert_multi(*__first);
2247}
2248
2249template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2250inline _LIBCPP_INLINE_VISIBILITY
2251void
2252swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2253     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2254    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
2255{
2256    __x.swap(__y);
2257}
2258
2259#if _LIBCPP_STD_VER > 17
2260template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
2261inline _LIBCPP_INLINE_VISIBILITY
2262void erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
2263{ __libcpp_erase_if_container(__c, __pred); }
2264#endif
2265
2266template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2267bool
2268operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2269           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2270{
2271    if (__x.size() != __y.size())
2272        return false;
2273    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
2274                                                                 const_iterator;
2275    typedef pair<const_iterator, const_iterator> _EqRng;
2276    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
2277    {
2278        _EqRng __xeq = __x.equal_range(__i->first);
2279        _EqRng __yeq = __y.equal_range(__i->first);
2280        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2281            _VSTD::distance(__yeq.first, __yeq.second) ||
2282                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
2283            return false;
2284        __i = __xeq.second;
2285    }
2286    return true;
2287}
2288
2289template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2290inline _LIBCPP_INLINE_VISIBILITY
2291bool
2292operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2293           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2294{
2295    return !(__x == __y);
2296}
2297
2298_LIBCPP_END_NAMESPACE_STD
2299
2300#endif  // _LIBCPP_UNORDERED_MAP
2301