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