Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===-------------------------- unordered_set -----------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_UNORDERED_SET
     12 #define _LIBCPP_UNORDERED_SET
     13 
     14 /*
     15 
     16     unordered_set synopsis
     17 
     18 #include <initializer_list>
     19 
     20 namespace std
     21 {
     22 
     23 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
     24           class Alloc = allocator<Value>>
     25 class unordered_set
     26 {
     27 public:
     28     // types
     29     typedef Value                                                      key_type;
     30     typedef key_type                                                   value_type;
     31     typedef Hash                                                       hasher;
     32     typedef Pred                                                       key_equal;
     33     typedef Alloc                                                      allocator_type;
     34     typedef value_type&                                                reference;
     35     typedef const value_type&                                          const_reference;
     36     typedef typename allocator_traits<allocator_type>::pointer         pointer;
     37     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
     38     typedef typename allocator_traits<allocator_type>::size_type       size_type;
     39     typedef typename allocator_traits<allocator_type>::difference_type difference_type;
     40 
     41     typedef /unspecified/ iterator;
     42     typedef /unspecified/ const_iterator;
     43     typedef /unspecified/ local_iterator;
     44     typedef /unspecified/ const_local_iterator;
     45 
     46     unordered_set()
     47         noexcept(
     48             is_nothrow_default_constructible<hasher>::value &&
     49             is_nothrow_default_constructible<key_equal>::value &&
     50             is_nothrow_default_constructible<allocator_type>::value);
     51     explicit unordered_set(size_type n, const hasher& hf = hasher(),
     52                            const key_equal& eql = key_equal(),
     53                            const allocator_type& a = allocator_type());
     54     template <class InputIterator>
     55         unordered_set(InputIterator f, InputIterator l,
     56                       size_type n = 0, const hasher& hf = hasher(),
     57                       const key_equal& eql = key_equal(),
     58                       const allocator_type& a = allocator_type());
     59     explicit unordered_set(const allocator_type&);
     60     unordered_set(const unordered_set&);
     61     unordered_set(const unordered_set&, const Allocator&);
     62     unordered_set(unordered_set&&)
     63         noexcept(
     64             is_nothrow_move_constructible<hasher>::value &&
     65             is_nothrow_move_constructible<key_equal>::value &&
     66             is_nothrow_move_constructible<allocator_type>::value);
     67     unordered_set(unordered_set&&, const Allocator&);
     68     unordered_set(initializer_list<value_type>, size_type n = 0,
     69                   const hasher& hf = hasher(), const key_equal& eql = key_equal(),
     70                   const allocator_type& a = allocator_type());
     71     unordered_set(size_type n, const allocator_type& a); // C++14
     72     unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14
     73     template <class InputIterator>
     74       unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
     75     template <class InputIterator>
     76       unordered_set(InputIterator f, InputIterator l, size_type n, 
     77                     const hasher& hf,  const allocator_type& a); // C++14
     78     unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
     79     unordered_set(initializer_list<value_type> il, size_type n,
     80                   const hasher& hf,  const allocator_type& a); // C++14
     81     ~unordered_set();
     82     unordered_set& operator=(const unordered_set&);
     83     unordered_set& operator=(unordered_set&&)
     84         noexcept(
     85             allocator_type::propagate_on_container_move_assignment::value &&
     86             is_nothrow_move_assignable<allocator_type>::value &&
     87             is_nothrow_move_assignable<hasher>::value &&
     88             is_nothrow_move_assignable<key_equal>::value);
     89     unordered_set& operator=(initializer_list<value_type>);
     90 
     91     allocator_type get_allocator() const noexcept;
     92 
     93     bool      empty() const noexcept;
     94     size_type size() const noexcept;
     95     size_type max_size() const noexcept;
     96 
     97     iterator       begin() noexcept;
     98     iterator       end() noexcept;
     99     const_iterator begin()  const noexcept;
    100     const_iterator end()    const noexcept;
    101     const_iterator cbegin() const noexcept;
    102     const_iterator cend()   const noexcept;
    103 
    104     template <class... Args>
    105         pair<iterator, bool> emplace(Args&&... args);
    106     template <class... Args>
    107         iterator emplace_hint(const_iterator position, Args&&... args);
    108     pair<iterator, bool> insert(const value_type& obj);
    109     pair<iterator, bool> insert(value_type&& obj);
    110     iterator insert(const_iterator hint, const value_type& obj);
    111     iterator insert(const_iterator hint, value_type&& obj);
    112     template <class InputIterator>
    113         void insert(InputIterator first, InputIterator last);
    114     void insert(initializer_list<value_type>);
    115 
    116     iterator erase(const_iterator position);
    117     size_type erase(const key_type& k);
    118     iterator erase(const_iterator first, const_iterator last);
    119     void clear() noexcept;
    120 
    121     void swap(unordered_set&)
    122         noexcept(
    123             (!allocator_type::propagate_on_container_swap::value ||
    124              __is_nothrow_swappable<allocator_type>::value) &&
    125             __is_nothrow_swappable<hasher>::value &&
    126             __is_nothrow_swappable<key_equal>::value);
    127 
    128     hasher hash_function() const;
    129     key_equal key_eq() const;
    130 
    131     iterator       find(const key_type& k);
    132     const_iterator find(const key_type& k) const;
    133     size_type count(const key_type& k) const;
    134     pair<iterator, iterator>             equal_range(const key_type& k);
    135     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
    136 
    137     size_type bucket_count() const noexcept;
    138     size_type max_bucket_count() const noexcept;
    139 
    140     size_type bucket_size(size_type n) const;
    141     size_type bucket(const key_type& k) const;
    142 
    143     local_iterator       begin(size_type n);
    144     local_iterator       end(size_type n);
    145     const_local_iterator begin(size_type n) const;
    146     const_local_iterator end(size_type n) const;
    147     const_local_iterator cbegin(size_type n) const;
    148     const_local_iterator cend(size_type n) const;
    149 
    150     float load_factor() const noexcept;
    151     float max_load_factor() const noexcept;
    152     void max_load_factor(float z);
    153     void rehash(size_type n);
    154     void reserve(size_type n);
    155 };
    156 
    157 template <class Value, class Hash, class Pred, class Alloc>
    158     void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
    159               unordered_set<Value, Hash, Pred, Alloc>& y)
    160               noexcept(noexcept(x.swap(y)));
    161 
    162 template <class Value, class Hash, class Pred, class Alloc>
    163     bool
    164     operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
    165                const unordered_set<Value, Hash, Pred, Alloc>& y);
    166 
    167 template <class Value, class Hash, class Pred, class Alloc>
    168     bool
    169     operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
    170                const unordered_set<Value, Hash, Pred, Alloc>& y);
    171 
    172 template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
    173           class Alloc = allocator<Value>>
    174 class unordered_multiset
    175 {
    176 public:
    177     // types
    178     typedef Value                                                      key_type;
    179     typedef key_type                                                   value_type;
    180     typedef Hash                                                       hasher;
    181     typedef Pred                                                       key_equal;
    182     typedef Alloc                                                      allocator_type;
    183     typedef value_type&                                                reference;
    184     typedef const value_type&                                          const_reference;
    185     typedef typename allocator_traits<allocator_type>::pointer         pointer;
    186     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
    187     typedef typename allocator_traits<allocator_type>::size_type       size_type;
    188     typedef typename allocator_traits<allocator_type>::difference_type difference_type;
    189 
    190     typedef /unspecified/ iterator;
    191     typedef /unspecified/ const_iterator;
    192     typedef /unspecified/ local_iterator;
    193     typedef /unspecified/ const_local_iterator;
    194 
    195     unordered_multiset()
    196         noexcept(
    197             is_nothrow_default_constructible<hasher>::value &&
    198             is_nothrow_default_constructible<key_equal>::value &&
    199             is_nothrow_default_constructible<allocator_type>::value);
    200     explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
    201                            const key_equal& eql = key_equal(),
    202                            const allocator_type& a = allocator_type());
    203     template <class InputIterator>
    204         unordered_multiset(InputIterator f, InputIterator l,
    205                       size_type n = 0, const hasher& hf = hasher(),
    206                       const key_equal& eql = key_equal(),
    207                       const allocator_type& a = allocator_type());
    208     explicit unordered_multiset(const allocator_type&);
    209     unordered_multiset(const unordered_multiset&);
    210     unordered_multiset(const unordered_multiset&, const Allocator&);
    211     unordered_multiset(unordered_multiset&&)
    212         noexcept(
    213             is_nothrow_move_constructible<hasher>::value &&
    214             is_nothrow_move_constructible<key_equal>::value &&
    215             is_nothrow_move_constructible<allocator_type>::value);
    216     unordered_multiset(unordered_multiset&&, const Allocator&);
    217     unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
    218                   const hasher& hf = hasher(), const key_equal& eql = key_equal(),
    219                   const allocator_type& a = allocator_type());
    220     unordered_multiset(size_type n, const allocator_type& a); // C++14
    221     unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14
    222     template <class InputIterator>
    223       unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
    224     template <class InputIterator>
    225       unordered_multiset(InputIterator f, InputIterator l, size_type n,
    226                          const hasher& hf, const allocator_type& a); // C++14
    227     unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
    228     unordered_multiset(initializer_list<value_type> il, size_type n, 
    229                        const hasher& hf,  const allocator_type& a); // C++14
    230     ~unordered_multiset();
    231     unordered_multiset& operator=(const unordered_multiset&);
    232     unordered_multiset& operator=(unordered_multiset&&)
    233         noexcept(
    234             allocator_type::propagate_on_container_move_assignment::value &&
    235             is_nothrow_move_assignable<allocator_type>::value &&
    236             is_nothrow_move_assignable<hasher>::value &&
    237             is_nothrow_move_assignable<key_equal>::value);
    238     unordered_multiset& operator=(initializer_list<value_type>);
    239 
    240     allocator_type get_allocator() const noexcept;
    241 
    242     bool      empty() const noexcept;
    243     size_type size() const noexcept;
    244     size_type max_size() const noexcept;
    245 
    246     iterator       begin() noexcept;
    247     iterator       end() noexcept;
    248     const_iterator begin()  const noexcept;
    249     const_iterator end()    const noexcept;
    250     const_iterator cbegin() const noexcept;
    251     const_iterator cend()   const noexcept;
    252 
    253     template <class... Args>
    254         iterator emplace(Args&&... args);
    255     template <class... Args>
    256         iterator emplace_hint(const_iterator position, Args&&... args);
    257     iterator insert(const value_type& obj);
    258     iterator insert(value_type&& obj);
    259     iterator insert(const_iterator hint, const value_type& obj);
    260     iterator insert(const_iterator hint, value_type&& obj);
    261     template <class InputIterator>
    262         void insert(InputIterator first, InputIterator last);
    263     void insert(initializer_list<value_type>);
    264 
    265     iterator erase(const_iterator position);
    266     size_type erase(const key_type& k);
    267     iterator erase(const_iterator first, const_iterator last);
    268     void clear() noexcept;
    269 
    270     void swap(unordered_multiset&)
    271         noexcept(
    272             (!allocator_type::propagate_on_container_swap::value ||
    273              __is_nothrow_swappable<allocator_type>::value) &&
    274             __is_nothrow_swappable<hasher>::value &&
    275             __is_nothrow_swappable<key_equal>::value);
    276 
    277     hasher hash_function() const;
    278     key_equal key_eq() const;
    279 
    280     iterator       find(const key_type& k);
    281     const_iterator find(const key_type& k) const;
    282     size_type count(const key_type& k) const;
    283     pair<iterator, iterator>             equal_range(const key_type& k);
    284     pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
    285 
    286     size_type bucket_count() const noexcept;
    287     size_type max_bucket_count() const noexcept;
    288 
    289     size_type bucket_size(size_type n) const;
    290     size_type bucket(const key_type& k) const;
    291 
    292     local_iterator       begin(size_type n);
    293     local_iterator       end(size_type n);
    294     const_local_iterator begin(size_type n) const;
    295     const_local_iterator end(size_type n) const;
    296     const_local_iterator cbegin(size_type n) const;
    297     const_local_iterator cend(size_type n) const;
    298 
    299     float load_factor() const noexcept;
    300     float max_load_factor() const noexcept;
    301     void max_load_factor(float z);
    302     void rehash(size_type n);
    303     void reserve(size_type n);
    304 };
    305 
    306 template <class Value, class Hash, class Pred, class Alloc>
    307     void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
    308               unordered_multiset<Value, Hash, Pred, Alloc>& y)
    309               noexcept(noexcept(x.swap(y)));
    310 
    311 template <class Value, class Hash, class Pred, class Alloc>
    312     bool
    313     operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
    314                const unordered_multiset<Value, Hash, Pred, Alloc>& y);
    315 
    316 template <class Value, class Hash, class Pred, class Alloc>
    317     bool
    318     operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
    319                const unordered_multiset<Value, Hash, Pred, Alloc>& y);
    320 }  // std
    321 
    322 */
    323 
    324 #include <__config>
    325 #include <__hash_table>
    326 #include <functional>
    327 
    328 #include <__debug>
    329 
    330 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    331 #pragma GCC system_header
    332 #endif
    333 
    334 _LIBCPP_BEGIN_NAMESPACE_STD
    335 
    336 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
    337           class _Alloc = allocator<_Value> >
    338 class _LIBCPP_TYPE_VIS_ONLY unordered_set
    339 {
    340 public:
    341     // types
    342     typedef _Value                                                     key_type;
    343     typedef key_type                                                   value_type;
    344     typedef _Hash                                                      hasher;
    345     typedef _Pred                                                      key_equal;
    346     typedef _Alloc                                                     allocator_type;
    347     typedef value_type&                                                reference;
    348     typedef const value_type&                                          const_reference;
    349     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
    350                   "Invalid allocator::value_type");
    351 
    352 private:
    353     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
    354 
    355     __table __table_;
    356 
    357 public:
    358     typedef typename __table::pointer         pointer;
    359     typedef typename __table::const_pointer   const_pointer;
    360     typedef typename __table::size_type       size_type;
    361     typedef typename __table::difference_type difference_type;
    362 
    363     typedef typename __table::const_iterator       iterator;
    364     typedef typename __table::const_iterator       const_iterator;
    365     typedef typename __table::const_local_iterator local_iterator;
    366     typedef typename __table::const_local_iterator const_local_iterator;
    367 
    368     _LIBCPP_INLINE_VISIBILITY
    369     unordered_set()
    370         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
    371         {
    372 #if _LIBCPP_DEBUG_LEVEL >= 2
    373             __get_db()->__insert_c(this);
    374 #endif
    375         }
    376     explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
    377                            const key_equal& __eql = key_equal());
    378 #if _LIBCPP_STD_VER > 11
    379     inline _LIBCPP_INLINE_VISIBILITY
    380     unordered_set(size_type __n, const allocator_type& __a)
    381         : unordered_set(__n, hasher(), key_equal(), __a) {}
    382     inline _LIBCPP_INLINE_VISIBILITY
    383     unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a)
    384         : unordered_set(__n, __hf, key_equal(), __a) {}
    385 #endif
    386     unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
    387                   const allocator_type& __a);
    388     template <class _InputIterator>
    389         unordered_set(_InputIterator __first, _InputIterator __last);
    390     template <class _InputIterator>
    391         unordered_set(_InputIterator __first, _InputIterator __last,
    392                       size_type __n, const hasher& __hf = hasher(),
    393                       const key_equal& __eql = key_equal());
    394     template <class _InputIterator>
    395         unordered_set(_InputIterator __first, _InputIterator __last,
    396                       size_type __n, const hasher& __hf, const key_equal& __eql,
    397                       const allocator_type& __a);
    398 #if _LIBCPP_STD_VER > 11
    399     template <class _InputIterator>
    400     inline _LIBCPP_INLINE_VISIBILITY
    401         unordered_set(_InputIterator __first, _InputIterator __last, 
    402                     size_type __n, const allocator_type& __a)
    403             : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {}
    404     template <class _InputIterator>
    405         unordered_set(_InputIterator __first, _InputIterator __last, 
    406                       size_type __n, const hasher& __hf, const allocator_type& __a)
    407             : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {}
    408 #endif
    409     explicit unordered_set(const allocator_type& __a);
    410     unordered_set(const unordered_set& __u);
    411     unordered_set(const unordered_set& __u, const allocator_type& __a);
    412 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    413     unordered_set(unordered_set&& __u)
    414         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
    415     unordered_set(unordered_set&& __u, const allocator_type& __a);
    416 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    417 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    418     unordered_set(initializer_list<value_type> __il);
    419     unordered_set(initializer_list<value_type> __il, size_type __n,
    420                   const hasher& __hf = hasher(),
    421                   const key_equal& __eql = key_equal());
    422     unordered_set(initializer_list<value_type> __il, size_type __n,
    423                   const hasher& __hf, const key_equal& __eql,
    424                   const allocator_type& __a);
    425 #if _LIBCPP_STD_VER > 11
    426     inline _LIBCPP_INLINE_VISIBILITY
    427     unordered_set(initializer_list<value_type> __il, size_type __n,
    428                                                       const allocator_type& __a)
    429         : unordered_set(__il, __n, hasher(), key_equal(), __a) {}
    430     inline _LIBCPP_INLINE_VISIBILITY
    431     unordered_set(initializer_list<value_type> __il, size_type __n, 
    432                                   const hasher& __hf, const allocator_type& __a)
    433         : unordered_set(__il, __n, __hf, key_equal(), __a) {}
    434 #endif
    435 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    436     // ~unordered_set() = default;
    437     _LIBCPP_INLINE_VISIBILITY
    438     unordered_set& operator=(const unordered_set& __u)
    439     {
    440         __table_ = __u.__table_;
    441         return *this;
    442     }
    443 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    444     unordered_set& operator=(unordered_set&& __u)
    445         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
    446 #endif
    447 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    448     unordered_set& operator=(initializer_list<value_type> __il);
    449 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    450 
    451     _LIBCPP_INLINE_VISIBILITY
    452     allocator_type get_allocator() const _NOEXCEPT
    453         {return allocator_type(__table_.__node_alloc());}
    454 
    455     _LIBCPP_INLINE_VISIBILITY
    456     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
    457     _LIBCPP_INLINE_VISIBILITY
    458     size_type size() const _NOEXCEPT  {return __table_.size();}
    459     _LIBCPP_INLINE_VISIBILITY
    460     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
    461 
    462     _LIBCPP_INLINE_VISIBILITY
    463     iterator       begin() _NOEXCEPT        {return __table_.begin();}
    464     _LIBCPP_INLINE_VISIBILITY
    465     iterator       end() _NOEXCEPT          {return __table_.end();}
    466     _LIBCPP_INLINE_VISIBILITY
    467     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
    468     _LIBCPP_INLINE_VISIBILITY
    469     const_iterator end()    const _NOEXCEPT {return __table_.end();}
    470     _LIBCPP_INLINE_VISIBILITY
    471     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
    472     _LIBCPP_INLINE_VISIBILITY
    473     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
    474 
    475 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
    476     template <class... _Args>
    477         _LIBCPP_INLINE_VISIBILITY
    478         pair<iterator, bool> emplace(_Args&&... __args)
    479             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
    480     template <class... _Args>
    481         _LIBCPP_INLINE_VISIBILITY
    482 #if _LIBCPP_DEBUG_LEVEL >= 2
    483         iterator emplace_hint(const_iterator __p, _Args&&... __args)
    484         {
    485             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
    486                 "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not"
    487                 " referring to this unordered_set");
    488             return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
    489         }
    490 #else
    491         iterator emplace_hint(const_iterator, _Args&&... __args)
    492             {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
    493 #endif
    494 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
    495     _LIBCPP_INLINE_VISIBILITY
    496     pair<iterator, bool> insert(const value_type& __x)
    497         {return __table_.__insert_unique(__x);}
    498 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    499     _LIBCPP_INLINE_VISIBILITY
    500     pair<iterator, bool> insert(value_type&& __x)
    501         {return __table_.__insert_unique(_VSTD::move(__x));}
    502 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    503     _LIBCPP_INLINE_VISIBILITY
    504 #if _LIBCPP_DEBUG_LEVEL >= 2
    505     iterator insert(const_iterator __p, const value_type& __x)
    506         {
    507             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
    508                 "unordered_set::insert(const_iterator, const value_type&) called with an iterator not"
    509                 " referring to this unordered_set");
    510             return insert(__x).first;
    511         }
    512 #else
    513     iterator insert(const_iterator, const value_type& __x)
    514         {return insert(__x).first;}
    515 #endif
    516 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    517     _LIBCPP_INLINE_VISIBILITY
    518 #if _LIBCPP_DEBUG_LEVEL >= 2
    519     iterator insert(const_iterator __p, value_type&& __x)
    520         {
    521             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
    522                 "unordered_set::insert(const_iterator, value_type&&) called with an iterator not"
    523                 " referring to this unordered_set");
    524             return insert(_VSTD::move(__x)).first;
    525         }
    526 #else
    527     iterator insert(const_iterator, value_type&& __x)
    528         {return insert(_VSTD::move(__x)).first;}
    529 #endif
    530 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    531     template <class _InputIterator>
    532         void insert(_InputIterator __first, _InputIterator __last);
    533 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    534     _LIBCPP_INLINE_VISIBILITY
    535     void insert(initializer_list<value_type> __il)
    536         {insert(__il.begin(), __il.end());}
    537 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    538 
    539     _LIBCPP_INLINE_VISIBILITY
    540     iterator erase(const_iterator __p) {return __table_.erase(__p);}
    541     _LIBCPP_INLINE_VISIBILITY
    542     size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
    543     _LIBCPP_INLINE_VISIBILITY
    544     iterator erase(const_iterator __first, const_iterator __last)
    545         {return __table_.erase(__first, __last);}
    546     _LIBCPP_INLINE_VISIBILITY
    547     void clear() _NOEXCEPT {__table_.clear();}
    548 
    549     _LIBCPP_INLINE_VISIBILITY
    550     void swap(unordered_set& __u)
    551         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
    552         {__table_.swap(__u.__table_);}
    553 
    554     _LIBCPP_INLINE_VISIBILITY
    555     hasher hash_function() const {return __table_.hash_function();}
    556     _LIBCPP_INLINE_VISIBILITY
    557     key_equal key_eq() const {return __table_.key_eq();}
    558 
    559     _LIBCPP_INLINE_VISIBILITY
    560     iterator       find(const key_type& __k)       {return __table_.find(__k);}
    561     _LIBCPP_INLINE_VISIBILITY
    562     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
    563     _LIBCPP_INLINE_VISIBILITY
    564     size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
    565     _LIBCPP_INLINE_VISIBILITY
    566     pair<iterator, iterator>             equal_range(const key_type& __k)
    567         {return __table_.__equal_range_unique(__k);}
    568     _LIBCPP_INLINE_VISIBILITY
    569     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
    570         {return __table_.__equal_range_unique(__k);}
    571 
    572     _LIBCPP_INLINE_VISIBILITY
    573     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
    574     _LIBCPP_INLINE_VISIBILITY
    575     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
    576 
    577     _LIBCPP_INLINE_VISIBILITY
    578     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
    579     _LIBCPP_INLINE_VISIBILITY
    580     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
    581 
    582     _LIBCPP_INLINE_VISIBILITY
    583     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
    584     _LIBCPP_INLINE_VISIBILITY
    585     local_iterator       end(size_type __n)          {return __table_.end(__n);}
    586     _LIBCPP_INLINE_VISIBILITY
    587     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
    588     _LIBCPP_INLINE_VISIBILITY
    589     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
    590     _LIBCPP_INLINE_VISIBILITY
    591     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
    592     _LIBCPP_INLINE_VISIBILITY
    593     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
    594 
    595     _LIBCPP_INLINE_VISIBILITY
    596     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
    597     _LIBCPP_INLINE_VISIBILITY
    598     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
    599     _LIBCPP_INLINE_VISIBILITY
    600     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
    601     _LIBCPP_INLINE_VISIBILITY
    602     void rehash(size_type __n) {__table_.rehash(__n);}
    603     _LIBCPP_INLINE_VISIBILITY
    604     void reserve(size_type __n) {__table_.reserve(__n);}
    605 
    606 #if _LIBCPP_DEBUG_LEVEL >= 2
    607 
    608     bool __dereferenceable(const const_iterator* __i) const
    609         {return __table_.__dereferenceable(__i);}
    610     bool __decrementable(const const_iterator* __i) const
    611         {return __table_.__decrementable(__i);}
    612     bool __addable(const const_iterator* __i, ptrdiff_t __n) const
    613         {return __table_.__addable(__i, __n);}
    614     bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
    615         {return __table_.__addable(__i, __n);}
    616 
    617 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
    618 
    619 };
    620 
    621 template <class _Value, class _Hash, class _Pred, class _Alloc>
    622 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
    623         const hasher& __hf, const key_equal& __eql)
    624     : __table_(__hf, __eql)
    625 {
    626 #if _LIBCPP_DEBUG_LEVEL >= 2
    627     __get_db()->__insert_c(this);
    628 #endif
    629     __table_.rehash(__n);
    630 }
    631 
    632 template <class _Value, class _Hash, class _Pred, class _Alloc>
    633 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
    634         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
    635     : __table_(__hf, __eql, __a)
    636 {
    637 #if _LIBCPP_DEBUG_LEVEL >= 2
    638     __get_db()->__insert_c(this);
    639 #endif
    640     __table_.rehash(__n);
    641 }
    642 
    643 template <class _Value, class _Hash, class _Pred, class _Alloc>
    644 template <class _InputIterator>
    645 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    646         _InputIterator __first, _InputIterator __last)
    647 {
    648 #if _LIBCPP_DEBUG_LEVEL >= 2
    649     __get_db()->__insert_c(this);
    650 #endif
    651     insert(__first, __last);
    652 }
    653 
    654 template <class _Value, class _Hash, class _Pred, class _Alloc>
    655 template <class _InputIterator>
    656 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    657         _InputIterator __first, _InputIterator __last, size_type __n,
    658         const hasher& __hf, const key_equal& __eql)
    659     : __table_(__hf, __eql)
    660 {
    661 #if _LIBCPP_DEBUG_LEVEL >= 2
    662     __get_db()->__insert_c(this);
    663 #endif
    664     __table_.rehash(__n);
    665     insert(__first, __last);
    666 }
    667 
    668 template <class _Value, class _Hash, class _Pred, class _Alloc>
    669 template <class _InputIterator>
    670 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    671         _InputIterator __first, _InputIterator __last, size_type __n,
    672         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
    673     : __table_(__hf, __eql, __a)
    674 {
    675 #if _LIBCPP_DEBUG_LEVEL >= 2
    676     __get_db()->__insert_c(this);
    677 #endif
    678     __table_.rehash(__n);
    679     insert(__first, __last);
    680 }
    681 
    682 template <class _Value, class _Hash, class _Pred, class _Alloc>
    683 inline _LIBCPP_INLINE_VISIBILITY
    684 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    685         const allocator_type& __a)
    686     : __table_(__a)
    687 {
    688 #if _LIBCPP_DEBUG_LEVEL >= 2
    689     __get_db()->__insert_c(this);
    690 #endif
    691 }
    692 
    693 template <class _Value, class _Hash, class _Pred, class _Alloc>
    694 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    695         const unordered_set& __u)
    696     : __table_(__u.__table_)
    697 {
    698 #if _LIBCPP_DEBUG_LEVEL >= 2
    699     __get_db()->__insert_c(this);
    700 #endif
    701     __table_.rehash(__u.bucket_count());
    702     insert(__u.begin(), __u.end());
    703 }
    704 
    705 template <class _Value, class _Hash, class _Pred, class _Alloc>
    706 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    707         const unordered_set& __u, const allocator_type& __a)
    708     : __table_(__u.__table_, __a)
    709 {
    710 #if _LIBCPP_DEBUG_LEVEL >= 2
    711     __get_db()->__insert_c(this);
    712 #endif
    713     __table_.rehash(__u.bucket_count());
    714     insert(__u.begin(), __u.end());
    715 }
    716 
    717 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    718 
    719 template <class _Value, class _Hash, class _Pred, class _Alloc>
    720 inline _LIBCPP_INLINE_VISIBILITY
    721 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    722         unordered_set&& __u)
    723     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
    724     : __table_(_VSTD::move(__u.__table_))
    725 {
    726 #if _LIBCPP_DEBUG_LEVEL >= 2
    727     __get_db()->__insert_c(this);
    728     __get_db()->swap(this, &__u);
    729 #endif
    730 }
    731 
    732 template <class _Value, class _Hash, class _Pred, class _Alloc>
    733 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    734         unordered_set&& __u, const allocator_type& __a)
    735     : __table_(_VSTD::move(__u.__table_), __a)
    736 {
    737 #if _LIBCPP_DEBUG_LEVEL >= 2
    738     __get_db()->__insert_c(this);
    739 #endif
    740     if (__a != __u.get_allocator())
    741     {
    742         iterator __i = __u.begin();
    743         while (__u.size() != 0)
    744             __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
    745     }
    746 #if _LIBCPP_DEBUG_LEVEL >= 2
    747     else
    748         __get_db()->swap(this, &__u);
    749 #endif
    750 }
    751 
    752 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    753 
    754 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    755 
    756 template <class _Value, class _Hash, class _Pred, class _Alloc>
    757 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    758         initializer_list<value_type> __il)
    759 {
    760 #if _LIBCPP_DEBUG_LEVEL >= 2
    761     __get_db()->__insert_c(this);
    762 #endif
    763     insert(__il.begin(), __il.end());
    764 }
    765 
    766 template <class _Value, class _Hash, class _Pred, class _Alloc>
    767 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    768         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
    769         const key_equal& __eql)
    770     : __table_(__hf, __eql)
    771 {
    772 #if _LIBCPP_DEBUG_LEVEL >= 2
    773     __get_db()->__insert_c(this);
    774 #endif
    775     __table_.rehash(__n);
    776     insert(__il.begin(), __il.end());
    777 }
    778 
    779 template <class _Value, class _Hash, class _Pred, class _Alloc>
    780 unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
    781         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
    782         const key_equal& __eql, const allocator_type& __a)
    783     : __table_(__hf, __eql, __a)
    784 {
    785 #if _LIBCPP_DEBUG_LEVEL >= 2
    786     __get_db()->__insert_c(this);
    787 #endif
    788     __table_.rehash(__n);
    789     insert(__il.begin(), __il.end());
    790 }
    791 
    792 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    793 
    794 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    795 
    796 template <class _Value, class _Hash, class _Pred, class _Alloc>
    797 inline _LIBCPP_INLINE_VISIBILITY
    798 unordered_set<_Value, _Hash, _Pred, _Alloc>&
    799 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
    800     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
    801 {
    802     __table_ = _VSTD::move(__u.__table_);
    803     return *this;
    804 }
    805 
    806 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    807 
    808 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    809 
    810 template <class _Value, class _Hash, class _Pred, class _Alloc>
    811 inline _LIBCPP_INLINE_VISIBILITY
    812 unordered_set<_Value, _Hash, _Pred, _Alloc>&
    813 unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
    814         initializer_list<value_type> __il)
    815 {
    816     __table_.__assign_unique(__il.begin(), __il.end());
    817     return *this;
    818 }
    819 
    820 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    821 
    822 template <class _Value, class _Hash, class _Pred, class _Alloc>
    823 template <class _InputIterator>
    824 inline _LIBCPP_INLINE_VISIBILITY
    825 void
    826 unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
    827                                                     _InputIterator __last)
    828 {
    829     for (; __first != __last; ++__first)
    830         __table_.__insert_unique(*__first);
    831 }
    832 
    833 template <class _Value, class _Hash, class _Pred, class _Alloc>
    834 inline _LIBCPP_INLINE_VISIBILITY
    835 void
    836 swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
    837      unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
    838     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    839 {
    840     __x.swap(__y);
    841 }
    842 
    843 template <class _Value, class _Hash, class _Pred, class _Alloc>
    844 bool
    845 operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
    846            const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
    847 {
    848     if (__x.size() != __y.size())
    849         return false;
    850     typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
    851                                                                  const_iterator;
    852     for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
    853             __i != __ex; ++__i)
    854     {
    855         const_iterator __j = __y.find(*__i);
    856         if (__j == __ey || !(*__i == *__j))
    857             return false;
    858     }
    859     return true;
    860 }
    861 
    862 template <class _Value, class _Hash, class _Pred, class _Alloc>
    863 inline _LIBCPP_INLINE_VISIBILITY
    864 bool
    865 operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
    866            const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
    867 {
    868     return !(__x == __y);
    869 }
    870 
    871 template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
    872           class _Alloc = allocator<_Value> >
    873 class _LIBCPP_TYPE_VIS_ONLY unordered_multiset
    874 {
    875 public:
    876     // types
    877     typedef _Value                                                     key_type;
    878     typedef key_type                                                   value_type;
    879     typedef _Hash                                                      hasher;
    880     typedef _Pred                                                      key_equal;
    881     typedef _Alloc                                                     allocator_type;
    882     typedef value_type&                                                reference;
    883     typedef const value_type&                                          const_reference;
    884     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
    885                   "Invalid allocator::value_type");
    886 
    887 private:
    888     typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
    889 
    890     __table __table_;
    891 
    892 public:
    893     typedef typename __table::pointer         pointer;
    894     typedef typename __table::const_pointer   const_pointer;
    895     typedef typename __table::size_type       size_type;
    896     typedef typename __table::difference_type difference_type;
    897 
    898     typedef typename __table::const_iterator       iterator;
    899     typedef typename __table::const_iterator       const_iterator;
    900     typedef typename __table::const_local_iterator local_iterator;
    901     typedef typename __table::const_local_iterator const_local_iterator;
    902 
    903     _LIBCPP_INLINE_VISIBILITY
    904     unordered_multiset()
    905         _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
    906         {
    907 #if _LIBCPP_DEBUG_LEVEL >= 2
    908             __get_db()->__insert_c(this);
    909 #endif
    910         }
    911     explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
    912                                 const key_equal& __eql = key_equal());
    913     unordered_multiset(size_type __n, const hasher& __hf,
    914                        const key_equal& __eql, const allocator_type& __a);
    915 #if _LIBCPP_STD_VER > 11
    916     inline _LIBCPP_INLINE_VISIBILITY
    917     unordered_multiset(size_type __n, const allocator_type& __a)
    918         : unordered_multiset(__n, hasher(), key_equal(), __a) {}
    919     inline _LIBCPP_INLINE_VISIBILITY
    920     unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a)
    921         : unordered_multiset(__n, __hf, key_equal(), __a) {}
    922 #endif
    923     template <class _InputIterator>
    924         unordered_multiset(_InputIterator __first, _InputIterator __last);
    925     template <class _InputIterator>
    926         unordered_multiset(_InputIterator __first, _InputIterator __last,
    927                       size_type __n, const hasher& __hf = hasher(),
    928                       const key_equal& __eql = key_equal());
    929     template <class _InputIterator>
    930         unordered_multiset(_InputIterator __first, _InputIterator __last,
    931                       size_type __n , const hasher& __hf,
    932                       const key_equal& __eql, const allocator_type& __a);
    933 #if _LIBCPP_STD_VER > 11
    934     template <class _InputIterator>
    935     inline _LIBCPP_INLINE_VISIBILITY
    936     unordered_multiset(_InputIterator __first, _InputIterator __last, 
    937                        size_type __n, const allocator_type& __a)
    938         : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {}
    939     template <class _InputIterator>
    940     inline _LIBCPP_INLINE_VISIBILITY
    941     unordered_multiset(_InputIterator __first, _InputIterator __last,
    942                        size_type __n, const hasher& __hf, const allocator_type& __a)
    943         : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {}
    944 #endif
    945     explicit unordered_multiset(const allocator_type& __a);
    946     unordered_multiset(const unordered_multiset& __u);
    947     unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
    948 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    949     unordered_multiset(unordered_multiset&& __u)
    950         _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
    951     unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
    952 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    953 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    954     unordered_multiset(initializer_list<value_type> __il);
    955     unordered_multiset(initializer_list<value_type> __il, size_type __n,
    956                        const hasher& __hf = hasher(),
    957                        const key_equal& __eql = key_equal());
    958     unordered_multiset(initializer_list<value_type> __il, size_type __n,
    959                        const hasher& __hf, const key_equal& __eql,
    960                        const allocator_type& __a);
    961 #if _LIBCPP_STD_VER > 11
    962     inline _LIBCPP_INLINE_VISIBILITY
    963     unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
    964       : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {}
    965     inline _LIBCPP_INLINE_VISIBILITY
    966     unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a)
    967       : unordered_multiset(__il, __n, __hf, key_equal(), __a) {}
    968 #endif
    969 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    970     // ~unordered_multiset() = default;
    971     _LIBCPP_INLINE_VISIBILITY
    972     unordered_multiset& operator=(const unordered_multiset& __u)
    973     {
    974         __table_ = __u.__table_;
    975         return *this;
    976     }
    977 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    978     unordered_multiset& operator=(unordered_multiset&& __u)
    979         _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
    980 #endif
    981 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    982     unordered_multiset& operator=(initializer_list<value_type> __il);
    983 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    984 
    985     _LIBCPP_INLINE_VISIBILITY
    986     allocator_type get_allocator() const _NOEXCEPT
    987         {return allocator_type(__table_.__node_alloc());}
    988 
    989     _LIBCPP_INLINE_VISIBILITY
    990     bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
    991     _LIBCPP_INLINE_VISIBILITY
    992     size_type size() const _NOEXCEPT  {return __table_.size();}
    993     _LIBCPP_INLINE_VISIBILITY
    994     size_type max_size() const _NOEXCEPT {return __table_.max_size();}
    995 
    996     _LIBCPP_INLINE_VISIBILITY
    997     iterator       begin() _NOEXCEPT        {return __table_.begin();}
    998     _LIBCPP_INLINE_VISIBILITY
    999     iterator       end() _NOEXCEPT          {return __table_.end();}
   1000     _LIBCPP_INLINE_VISIBILITY
   1001     const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
   1002     _LIBCPP_INLINE_VISIBILITY
   1003     const_iterator end()    const _NOEXCEPT {return __table_.end();}
   1004     _LIBCPP_INLINE_VISIBILITY
   1005     const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
   1006     _LIBCPP_INLINE_VISIBILITY
   1007     const_iterator cend()   const _NOEXCEPT {return __table_.end();}
   1008 
   1009 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   1010     template <class... _Args>
   1011         _LIBCPP_INLINE_VISIBILITY
   1012         iterator emplace(_Args&&... __args)
   1013             {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
   1014     template <class... _Args>
   1015         _LIBCPP_INLINE_VISIBILITY
   1016         iterator emplace_hint(const_iterator __p, _Args&&... __args)
   1017             {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
   1018 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   1019     _LIBCPP_INLINE_VISIBILITY
   1020     iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
   1021 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1022     _LIBCPP_INLINE_VISIBILITY
   1023     iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
   1024 #endif
   1025     _LIBCPP_INLINE_VISIBILITY
   1026     iterator insert(const_iterator __p, const value_type& __x)
   1027         {return __table_.__insert_multi(__p, __x);}
   1028 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1029     _LIBCPP_INLINE_VISIBILITY
   1030     iterator insert(const_iterator __p, value_type&& __x)
   1031         {return __table_.__insert_multi(__p, _VSTD::move(__x));}
   1032 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1033     template <class _InputIterator>
   1034         void insert(_InputIterator __first, _InputIterator __last);
   1035 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1036     _LIBCPP_INLINE_VISIBILITY
   1037     void insert(initializer_list<value_type> __il)
   1038         {insert(__il.begin(), __il.end());}
   1039 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1040 
   1041     _LIBCPP_INLINE_VISIBILITY
   1042     iterator erase(const_iterator __p) {return __table_.erase(__p);}
   1043     _LIBCPP_INLINE_VISIBILITY
   1044     size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
   1045     _LIBCPP_INLINE_VISIBILITY
   1046     iterator erase(const_iterator __first, const_iterator __last)
   1047         {return __table_.erase(__first, __last);}
   1048     _LIBCPP_INLINE_VISIBILITY
   1049     void clear() _NOEXCEPT {__table_.clear();}
   1050 
   1051     _LIBCPP_INLINE_VISIBILITY
   1052     void swap(unordered_multiset& __u)
   1053         _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
   1054         {__table_.swap(__u.__table_);}
   1055 
   1056     _LIBCPP_INLINE_VISIBILITY
   1057     hasher hash_function() const {return __table_.hash_function();}
   1058     _LIBCPP_INLINE_VISIBILITY
   1059     key_equal key_eq() const {return __table_.key_eq();}
   1060 
   1061     _LIBCPP_INLINE_VISIBILITY
   1062     iterator       find(const key_type& __k)       {return __table_.find(__k);}
   1063     _LIBCPP_INLINE_VISIBILITY
   1064     const_iterator find(const key_type& __k) const {return __table_.find(__k);}
   1065     _LIBCPP_INLINE_VISIBILITY
   1066     size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
   1067     _LIBCPP_INLINE_VISIBILITY
   1068     pair<iterator, iterator>             equal_range(const key_type& __k)
   1069         {return __table_.__equal_range_multi(__k);}
   1070     _LIBCPP_INLINE_VISIBILITY
   1071     pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
   1072         {return __table_.__equal_range_multi(__k);}
   1073 
   1074     _LIBCPP_INLINE_VISIBILITY
   1075     size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
   1076     _LIBCPP_INLINE_VISIBILITY
   1077     size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
   1078 
   1079     _LIBCPP_INLINE_VISIBILITY
   1080     size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
   1081     _LIBCPP_INLINE_VISIBILITY
   1082     size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
   1083 
   1084     _LIBCPP_INLINE_VISIBILITY
   1085     local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
   1086     _LIBCPP_INLINE_VISIBILITY
   1087     local_iterator       end(size_type __n)          {return __table_.end(__n);}
   1088     _LIBCPP_INLINE_VISIBILITY
   1089     const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
   1090     _LIBCPP_INLINE_VISIBILITY
   1091     const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
   1092     _LIBCPP_INLINE_VISIBILITY
   1093     const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
   1094     _LIBCPP_INLINE_VISIBILITY
   1095     const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
   1096 
   1097     _LIBCPP_INLINE_VISIBILITY
   1098     float load_factor() const _NOEXCEPT {return __table_.load_factor();}
   1099     _LIBCPP_INLINE_VISIBILITY
   1100     float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
   1101     _LIBCPP_INLINE_VISIBILITY
   1102     void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
   1103     _LIBCPP_INLINE_VISIBILITY
   1104     void rehash(size_type __n) {__table_.rehash(__n);}
   1105     _LIBCPP_INLINE_VISIBILITY
   1106     void reserve(size_type __n) {__table_.reserve(__n);}
   1107 
   1108 #if _LIBCPP_DEBUG_LEVEL >= 2
   1109 
   1110     bool __dereferenceable(const const_iterator* __i) const
   1111         {return __table_.__dereferenceable(__i);}
   1112     bool __decrementable(const const_iterator* __i) const
   1113         {return __table_.__decrementable(__i);}
   1114     bool __addable(const const_iterator* __i, ptrdiff_t __n) const
   1115         {return __table_.__addable(__i, __n);}
   1116     bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
   1117         {return __table_.__addable(__i, __n);}
   1118 
   1119 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
   1120 
   1121 };
   1122 
   1123 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1124 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1125         size_type __n, const hasher& __hf, const key_equal& __eql)
   1126     : __table_(__hf, __eql)
   1127 {
   1128 #if _LIBCPP_DEBUG_LEVEL >= 2
   1129     __get_db()->__insert_c(this);
   1130 #endif
   1131     __table_.rehash(__n);
   1132 }
   1133 
   1134 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1135 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1136         size_type __n, const hasher& __hf, const key_equal& __eql,
   1137         const allocator_type& __a)
   1138     : __table_(__hf, __eql, __a)
   1139 {
   1140 #if _LIBCPP_DEBUG_LEVEL >= 2
   1141     __get_db()->__insert_c(this);
   1142 #endif
   1143     __table_.rehash(__n);
   1144 }
   1145 
   1146 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1147 template <class _InputIterator>
   1148 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1149         _InputIterator __first, _InputIterator __last)
   1150 {
   1151 #if _LIBCPP_DEBUG_LEVEL >= 2
   1152     __get_db()->__insert_c(this);
   1153 #endif
   1154     insert(__first, __last);
   1155 }
   1156 
   1157 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1158 template <class _InputIterator>
   1159 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1160         _InputIterator __first, _InputIterator __last, size_type __n,
   1161         const hasher& __hf, const key_equal& __eql)
   1162     : __table_(__hf, __eql)
   1163 {
   1164 #if _LIBCPP_DEBUG_LEVEL >= 2
   1165     __get_db()->__insert_c(this);
   1166 #endif
   1167     __table_.rehash(__n);
   1168     insert(__first, __last);
   1169 }
   1170 
   1171 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1172 template <class _InputIterator>
   1173 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1174         _InputIterator __first, _InputIterator __last, size_type __n,
   1175         const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
   1176     : __table_(__hf, __eql, __a)
   1177 {
   1178 #if _LIBCPP_DEBUG_LEVEL >= 2
   1179     __get_db()->__insert_c(this);
   1180 #endif
   1181     __table_.rehash(__n);
   1182     insert(__first, __last);
   1183 }
   1184 
   1185 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1186 inline _LIBCPP_INLINE_VISIBILITY
   1187 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1188         const allocator_type& __a)
   1189     : __table_(__a)
   1190 {
   1191 #if _LIBCPP_DEBUG_LEVEL >= 2
   1192     __get_db()->__insert_c(this);
   1193 #endif
   1194 }
   1195 
   1196 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1197 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1198         const unordered_multiset& __u)
   1199     : __table_(__u.__table_)
   1200 {
   1201 #if _LIBCPP_DEBUG_LEVEL >= 2
   1202     __get_db()->__insert_c(this);
   1203 #endif
   1204     __table_.rehash(__u.bucket_count());
   1205     insert(__u.begin(), __u.end());
   1206 }
   1207 
   1208 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1209 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1210         const unordered_multiset& __u, const allocator_type& __a)
   1211     : __table_(__u.__table_, __a)
   1212 {
   1213 #if _LIBCPP_DEBUG_LEVEL >= 2
   1214     __get_db()->__insert_c(this);
   1215 #endif
   1216     __table_.rehash(__u.bucket_count());
   1217     insert(__u.begin(), __u.end());
   1218 }
   1219 
   1220 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1221 
   1222 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1223 inline _LIBCPP_INLINE_VISIBILITY
   1224 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1225         unordered_multiset&& __u)
   1226     _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
   1227     : __table_(_VSTD::move(__u.__table_))
   1228 {
   1229 #if _LIBCPP_DEBUG_LEVEL >= 2
   1230     __get_db()->__insert_c(this);
   1231     __get_db()->swap(this, &__u);
   1232 #endif
   1233 }
   1234 
   1235 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1236 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1237         unordered_multiset&& __u, const allocator_type& __a)
   1238     : __table_(_VSTD::move(__u.__table_), __a)
   1239 {
   1240 #if _LIBCPP_DEBUG_LEVEL >= 2
   1241     __get_db()->__insert_c(this);
   1242 #endif
   1243     if (__a != __u.get_allocator())
   1244     {
   1245         iterator __i = __u.begin();
   1246         while (__u.size() != 0)
   1247             __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
   1248     }
   1249 #if _LIBCPP_DEBUG_LEVEL >= 2
   1250     else
   1251         __get_db()->swap(this, &__u);
   1252 #endif
   1253 }
   1254 
   1255 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1256 
   1257 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1258 
   1259 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1260 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1261         initializer_list<value_type> __il)
   1262 {
   1263 #if _LIBCPP_DEBUG_LEVEL >= 2
   1264     __get_db()->__insert_c(this);
   1265 #endif
   1266     insert(__il.begin(), __il.end());
   1267 }
   1268 
   1269 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1270 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1271         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
   1272         const key_equal& __eql)
   1273     : __table_(__hf, __eql)
   1274 {
   1275 #if _LIBCPP_DEBUG_LEVEL >= 2
   1276     __get_db()->__insert_c(this);
   1277 #endif
   1278     __table_.rehash(__n);
   1279     insert(__il.begin(), __il.end());
   1280 }
   1281 
   1282 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1283 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
   1284         initializer_list<value_type> __il, size_type __n, const hasher& __hf,
   1285         const key_equal& __eql, const allocator_type& __a)
   1286     : __table_(__hf, __eql, __a)
   1287 {
   1288 #if _LIBCPP_DEBUG_LEVEL >= 2
   1289     __get_db()->__insert_c(this);
   1290 #endif
   1291     __table_.rehash(__n);
   1292     insert(__il.begin(), __il.end());
   1293 }
   1294 
   1295 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1296 
   1297 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1298 
   1299 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1300 inline _LIBCPP_INLINE_VISIBILITY
   1301 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
   1302 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
   1303         unordered_multiset&& __u)
   1304     _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
   1305 {
   1306     __table_ = _VSTD::move(__u.__table_);
   1307     return *this;
   1308 }
   1309 
   1310 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1311 
   1312 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1313 
   1314 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1315 inline
   1316 unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
   1317 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
   1318         initializer_list<value_type> __il)
   1319 {
   1320     __table_.__assign_multi(__il.begin(), __il.end());
   1321     return *this;
   1322 }
   1323 
   1324 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1325 
   1326 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1327 template <class _InputIterator>
   1328 inline _LIBCPP_INLINE_VISIBILITY
   1329 void
   1330 unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
   1331                                                          _InputIterator __last)
   1332 {
   1333     for (; __first != __last; ++__first)
   1334         __table_.__insert_multi(*__first);
   1335 }
   1336 
   1337 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1338 inline _LIBCPP_INLINE_VISIBILITY
   1339 void
   1340 swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
   1341      unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
   1342     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   1343 {
   1344     __x.swap(__y);
   1345 }
   1346 
   1347 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1348 bool
   1349 operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
   1350            const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
   1351 {
   1352     if (__x.size() != __y.size())
   1353         return false;
   1354     typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
   1355                                                                  const_iterator;
   1356     typedef pair<const_iterator, const_iterator> _EqRng;
   1357     for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
   1358     {
   1359         _EqRng __xeq = __x.equal_range(*__i);
   1360         _EqRng __yeq = __y.equal_range(*__i);
   1361         if (_VSTD::distance(__xeq.first, __xeq.second) !=
   1362             _VSTD::distance(__yeq.first, __yeq.second) ||
   1363                   !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
   1364             return false;
   1365         __i = __xeq.second;
   1366     }
   1367     return true;
   1368 }
   1369 
   1370 template <class _Value, class _Hash, class _Pred, class _Alloc>
   1371 inline _LIBCPP_INLINE_VISIBILITY
   1372 bool
   1373 operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
   1374            const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
   1375 {
   1376     return !(__x == __y);
   1377 }
   1378 
   1379 _LIBCPP_END_NAMESPACE_STD
   1380 
   1381 #endif  // _LIBCPP_UNORDERED_SET
   1382