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