Home | History | Annotate | Download | only in include
      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 
     20 namespace std
     21 {
     22 
     23 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
     24           class Alloc = allocator<pair<const Key, T>>>
     25 class unordered_map
     26 {
     27 public:
     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 
    207 template <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 
    212 template <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 
    217 template <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 
    222 template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
    223           class Alloc = allocator<pair<const Key, T>>>
    224 class unordered_multimap
    225 {
    226 public:
    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 
    382 template <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 
    387 template <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 
    390 template <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 
    393 template <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 
    398 template <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 
    423 template <class _Key, class _Cp, class _Hash,
    424           bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
    425 class __unordered_map_hasher
    426     : private _Hash
    427 {
    428 public:
    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 
    453 template <class _Key, class _Cp, class _Hash>
    454 class __unordered_map_hasher<_Key, _Cp, _Hash, false>
    455 {
    456     _Hash __hash_;
    457 public:
    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 
    482 template <class _Key, class _Cp, class _Hash, bool __b>
    483 inline _LIBCPP_INLINE_VISIBILITY
    484 void
    485 swap(__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 
    492 template <class _Key, class _Cp, class _Pred,
    493           bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
    494 class __unordered_map_equal
    495     : private _Pred
    496 {
    497 public:
    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 
    525 template <class _Key, class _Cp, class _Pred>
    526 class __unordered_map_equal<_Key, _Cp, _Pred, false>
    527 {
    528     _Pred __pred_;
    529 public:
    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 
    557 template <class _Key, class _Cp, class _Pred, bool __b>
    558 inline _LIBCPP_INLINE_VISIBILITY
    559 void
    560 swap(__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 
    567 template <class _Alloc>
    568 class __hash_map_node_destructor
    569 {
    570     typedef _Alloc                              allocator_type;
    571     typedef allocator_traits<allocator_type>    __alloc_traits;
    572 
    573 public:
    574 
    575     typedef typename __alloc_traits::pointer       pointer;
    576 private:
    577 
    578     allocator_type& __na_;
    579 
    580     __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
    581 
    582 public:
    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
    627 template <class _Key, class _Tp>
    628 struct __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 
    636 private:
    637     value_type __cc;
    638 
    639 public:
    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 
    702 private:
    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 
    713 template <class _Key, class _Tp>
    714 struct __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 
    720 private:
    721     value_type __cc;
    722 
    723 public:
    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 
    729 private:
    730    ~__hash_value_type();
    731 };
    732 
    733 #endif
    734 
    735 template <class _HashIterator>
    736 class _LIBCPP_TEMPLATE_VIS __hash_map_iterator
    737 {
    738     _HashIterator __i_;
    739 
    740     typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
    741 
    742 public:
    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 
    784 template <class _HashIterator>
    785 class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
    786 {
    787     _HashIterator __i_;
    788 
    789     typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
    790 
    791 public:
    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 
    837 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
    838 class unordered_multimap;
    839 
    840 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
    841           class _Alloc = allocator<pair<const _Key, _Tp> > >
    842 class _LIBCPP_TEMPLATE_VIS unordered_map
    843 {
    844 public:
    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 
    858 private:
    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), "");
    882 public:
    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 
   1342 private:
   1343 
   1344 #ifdef _LIBCPP_CXX03_LANG
   1345     __node_holder __construct_node_with_key(const key_type& __k);
   1346 #endif
   1347 };
   1348 
   1349 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1350 unordered_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 
   1360 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1361 unordered_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 
   1372 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1373 inline
   1374 unordered_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 
   1383 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1384 template <class _InputIterator>
   1385 unordered_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 
   1394 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1395 template <class _InputIterator>
   1396 unordered_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 
   1408 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1409 template <class _InputIterator>
   1410 unordered_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 
   1422 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1423 unordered_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 
   1434 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1435 unordered_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 
   1448 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1449 inline
   1450 unordered_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 
   1461 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1462 unordered_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 
   1483 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1484 unordered_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 
   1493 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1494 unordered_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 
   1506 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1507 unordered_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 
   1519 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1520 inline
   1521 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
   1522 unordered_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 
   1529 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1530 inline
   1531 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
   1532 unordered_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 
   1541 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1542 template <class _InputIterator>
   1543 inline
   1544 void
   1545 unordered_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 
   1554 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1555 _Tp&
   1556 unordered_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 
   1563 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1564 _Tp&
   1565 unordered_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 
   1573 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1574 typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
   1575 unordered_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 
   1586 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1587 _Tp&
   1588 unordered_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 
   1601 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1602 _Tp&
   1603 unordered_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 
   1613 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1614 const _Tp&
   1615 unordered_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 
   1625 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1626 inline _LIBCPP_INLINE_VISIBILITY
   1627 void
   1628 swap(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
   1636 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
   1637 inline _LIBCPP_INLINE_VISIBILITY
   1638 void erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
   1639 { __libcpp_erase_if_container(__c, __pred); }
   1640 #endif
   1641 
   1642 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1643 bool
   1644 operator==(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 
   1661 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   1662 inline _LIBCPP_INLINE_VISIBILITY
   1663 bool
   1664 operator!=(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 
   1670 template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
   1671           class _Alloc = allocator<pair<const _Key, _Tp> > >
   1672 class _LIBCPP_TEMPLATE_VIS unordered_multimap
   1673 {
   1674 public:
   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 
   1688 private:
   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");
   1710 public:
   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 
   2043 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2044 unordered_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 
   2054 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2055 unordered_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 
   2066 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2067 template <class _InputIterator>
   2068 unordered_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 
   2077 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2078 template <class _InputIterator>
   2079 unordered_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 
   2091 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2092 template <class _InputIterator>
   2093 unordered_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 
   2105 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2106 inline
   2107 unordered_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 
   2116 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2117 unordered_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 
   2128 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2129 unordered_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 
   2142 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2143 inline
   2144 unordered_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 
   2155 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2156 unordered_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 
   2178 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2179 unordered_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 
   2188 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2189 unordered_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 
   2201 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2202 unordered_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 
   2214 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2215 inline
   2216 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
   2217 unordered_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 
   2224 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2225 inline
   2226 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
   2227 unordered_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 
   2238 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2239 template <class _InputIterator>
   2240 inline
   2241 void
   2242 unordered_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 
   2249 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2250 inline _LIBCPP_INLINE_VISIBILITY
   2251 void
   2252 swap(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
   2260 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
   2261 inline _LIBCPP_INLINE_VISIBILITY
   2262 void erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
   2263 { __libcpp_erase_if_container(__c, __pred); }
   2264 #endif
   2265 
   2266 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2267 bool
   2268 operator==(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 
   2289 template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
   2290 inline _LIBCPP_INLINE_VISIBILITY
   2291 bool
   2292 operator!=(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