13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_HASH_SET
113e519524SHoward Hinnant#define _LIBCPP_HASH_SET
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant
153e519524SHoward Hinnant    hash_set synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace __gnu_cxx
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
213e519524SHoward Hinnant          class Alloc = allocator<Value>>
223e519524SHoward Hinnantclass hash_set
233e519524SHoward Hinnant{
243e519524SHoward Hinnantpublic:
253e519524SHoward Hinnant    // types
263e519524SHoward Hinnant    typedef Value                                                      key_type;
273e519524SHoward Hinnant    typedef key_type                                                   value_type;
283e519524SHoward Hinnant    typedef Hash                                                       hasher;
293e519524SHoward Hinnant    typedef Pred                                                       key_equal;
303e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
313e519524SHoward Hinnant    typedef value_type&                                                reference;
323e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
333e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
343e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
353e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
363e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
373e519524SHoward Hinnant
383e519524SHoward Hinnant    typedef /unspecified/ iterator;
393e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
403e519524SHoward Hinnant
413e519524SHoward Hinnant    explicit hash_set(size_type n = 193, const hasher& hf = hasher(),
423e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
433e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
443e519524SHoward Hinnant    template <class InputIterator>
453e519524SHoward Hinnant        hash_set(InputIterator f, InputIterator l,
463e519524SHoward Hinnant                      size_type n = 193, const hasher& hf = hasher(),
473e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
483e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
493e519524SHoward Hinnant    hash_set(const hash_set&);
503e519524SHoward Hinnant    ~hash_set();
513e519524SHoward Hinnant    hash_set& operator=(const hash_set&);
523e519524SHoward Hinnant
533e519524SHoward Hinnant    allocator_type get_allocator() const;
543e519524SHoward Hinnant
553e519524SHoward Hinnant    bool      empty() const;
563e519524SHoward Hinnant    size_type size() const;
573e519524SHoward Hinnant    size_type max_size() const;
583e519524SHoward Hinnant
593e519524SHoward Hinnant    iterator       begin();
603e519524SHoward Hinnant    iterator       end();
613e519524SHoward Hinnant    const_iterator begin()  const;
623e519524SHoward Hinnant    const_iterator end()    const;
633e519524SHoward Hinnant
643e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& obj);
653e519524SHoward Hinnant    template <class InputIterator>
663e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
673e519524SHoward Hinnant
683e519524SHoward Hinnant    void erase(const_iterator position);
693e519524SHoward Hinnant    size_type erase(const key_type& k);
703e519524SHoward Hinnant    void erase(const_iterator first, const_iterator last);
713e519524SHoward Hinnant    void clear();
723e519524SHoward Hinnant
733e519524SHoward Hinnant    void swap(hash_set&);
743e519524SHoward Hinnant
753e519524SHoward Hinnant    hasher hash_funct() const;
763e519524SHoward Hinnant    key_equal key_eq() const;
773e519524SHoward Hinnant
783e519524SHoward Hinnant    iterator       find(const key_type& k);
793e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
803e519524SHoward Hinnant    size_type count(const key_type& k) const;
813e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
823e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
833e519524SHoward Hinnant
843e519524SHoward Hinnant    size_type bucket_count() const;
853e519524SHoward Hinnant    size_type max_bucket_count() const;
863e519524SHoward Hinnant
873e519524SHoward Hinnant    size_type elems_in_bucket(size_type n) const;
883e519524SHoward Hinnant
893e519524SHoward Hinnant    void resize(size_type n);
903e519524SHoward Hinnant};
913e519524SHoward Hinnant
923e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
933e519524SHoward Hinnant    void swap(hash_set<Value, Hash, Pred, Alloc>& x,
943e519524SHoward Hinnant              hash_set<Value, Hash, Pred, Alloc>& y);
953e519524SHoward Hinnant
963e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
973e519524SHoward Hinnant    bool
983e519524SHoward Hinnant    operator==(const hash_set<Value, Hash, Pred, Alloc>& x,
993e519524SHoward Hinnant               const hash_set<Value, Hash, Pred, Alloc>& y);
1003e519524SHoward Hinnant
1013e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
1023e519524SHoward Hinnant    bool
1033e519524SHoward Hinnant    operator!=(const hash_set<Value, Hash, Pred, Alloc>& x,
1043e519524SHoward Hinnant               const hash_set<Value, Hash, Pred, Alloc>& y);
1053e519524SHoward Hinnant
1063e519524SHoward Hinnanttemplate <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
1073e519524SHoward Hinnant          class Alloc = allocator<Value>>
1083e519524SHoward Hinnantclass hash_multiset
1093e519524SHoward Hinnant{
1103e519524SHoward Hinnantpublic:
1113e519524SHoward Hinnant    // types
1123e519524SHoward Hinnant    typedef Value                                                      key_type;
1133e519524SHoward Hinnant    typedef key_type                                                   value_type;
1143e519524SHoward Hinnant    typedef Hash                                                       hasher;
1153e519524SHoward Hinnant    typedef Pred                                                       key_equal;
1163e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
1173e519524SHoward Hinnant    typedef value_type&                                                reference;
1183e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
1193e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
1203e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
1213e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
1223e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
1233e519524SHoward Hinnant
1243e519524SHoward Hinnant    typedef /unspecified/ iterator;
1253e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
1263e519524SHoward Hinnant
1273e519524SHoward Hinnant    explicit hash_multiset(size_type n = 193, const hasher& hf = hasher(),
1283e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
1293e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
1303e519524SHoward Hinnant    template <class InputIterator>
1313e519524SHoward Hinnant        hash_multiset(InputIterator f, InputIterator l,
1323e519524SHoward Hinnant                      size_type n = 193, const hasher& hf = hasher(),
1333e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
1343e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
1353e519524SHoward Hinnant    hash_multiset(const hash_multiset&);
1363e519524SHoward Hinnant    ~hash_multiset();
1373e519524SHoward Hinnant    hash_multiset& operator=(const hash_multiset&);
1383e519524SHoward Hinnant
1393e519524SHoward Hinnant    allocator_type get_allocator() const;
1403e519524SHoward Hinnant
1413e519524SHoward Hinnant    bool      empty() const;
1423e519524SHoward Hinnant    size_type size() const;
1433e519524SHoward Hinnant    size_type max_size() const;
1443e519524SHoward Hinnant
1453e519524SHoward Hinnant    iterator       begin();
1463e519524SHoward Hinnant    iterator       end();
1473e519524SHoward Hinnant    const_iterator begin()  const;
1483e519524SHoward Hinnant    const_iterator end()    const;
1493e519524SHoward Hinnant
1503e519524SHoward Hinnant    iterator insert(const value_type& obj);
1513e519524SHoward Hinnant    template <class InputIterator>
1523e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1533e519524SHoward Hinnant
1543e519524SHoward Hinnant    void erase(const_iterator position);
1553e519524SHoward Hinnant    size_type erase(const key_type& k);
1563e519524SHoward Hinnant    void erase(const_iterator first, const_iterator last);
1573e519524SHoward Hinnant    void clear();
1583e519524SHoward Hinnant
1593e519524SHoward Hinnant    void swap(hash_multiset&);
1603e519524SHoward Hinnant
1613e519524SHoward Hinnant    hasher hash_funct() const;
1623e519524SHoward Hinnant    key_equal key_eq() const;
1633e519524SHoward Hinnant
1643e519524SHoward Hinnant    iterator       find(const key_type& k);
1653e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1663e519524SHoward Hinnant    size_type count(const key_type& k) const;
1673e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
1683e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
1693e519524SHoward Hinnant
1703e519524SHoward Hinnant    size_type bucket_count() const;
1713e519524SHoward Hinnant    size_type max_bucket_count() const;
1723e519524SHoward Hinnant
1733e519524SHoward Hinnant    size_type elems_in_bucket(size_type n) const;
1743e519524SHoward Hinnant
1753e519524SHoward Hinnant    void resize(size_type n);
1763e519524SHoward Hinnant};
1773e519524SHoward Hinnant
1783e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
1793e519524SHoward Hinnant    void swap(hash_multiset<Value, Hash, Pred, Alloc>& x,
1803e519524SHoward Hinnant              hash_multiset<Value, Hash, Pred, Alloc>& y);
1813e519524SHoward Hinnant
1823e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
1833e519524SHoward Hinnant    bool
1843e519524SHoward Hinnant    operator==(const hash_multiset<Value, Hash, Pred, Alloc>& x,
1853e519524SHoward Hinnant               const hash_multiset<Value, Hash, Pred, Alloc>& y);
1863e519524SHoward Hinnant
1873e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc>
1883e519524SHoward Hinnant    bool
1893e519524SHoward Hinnant    operator!=(const hash_multiset<Value, Hash, Pred, Alloc>& x,
1903e519524SHoward Hinnant               const hash_multiset<Value, Hash, Pred, Alloc>& y);
1913e519524SHoward Hinnant}  // __gnu_cxx
1923e519524SHoward Hinnant
1933e519524SHoward Hinnant*/
1943e519524SHoward Hinnant
195385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1963e519524SHoward Hinnant#include <__config>
1973e519524SHoward Hinnant#include <__hash_table>
198385cc25aSLouis Dionne#include <algorithm>
1998d2ed566SAlexis Hunt#include <ext/__hash>
20034f73804SNikolas Klauser#include <functional>
2013e519524SHoward Hinnant
202de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
203de4a57cbSLouis Dionne#  include <iterator>
204de4a57cbSLouis Dionne#endif
205de4a57cbSLouis Dionne
2065c703f0fSMarek Kurdej#if defined(__DEPRECATED) && __DEPRECATED
2070c6e7ae4SEric Fiselier#if defined(_LIBCPP_WARNING)
20880b84d4cSHoward Hinnant    _LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated.  Migrate to <unordered_set>")
20980b84d4cSHoward Hinnant#else
2103e519524SHoward Hinnant#   warning Use of the header <ext/hash_set> is deprecated.  Migrate to <unordered_set>
2111dba445eSHoward Hinnant#endif
21280b84d4cSHoward Hinnant#endif
2133e519524SHoward Hinnant
214413c3c4fSArthur O'Dwyer#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
215413c3c4fSArthur O'Dwyer#  pragma GCC system_header
216413c3c4fSArthur O'Dwyer#endif
217413c3c4fSArthur O'Dwyer
2183e519524SHoward Hinnantnamespace __gnu_cxx {
2193e519524SHoward Hinnant
2203e519524SHoward Hinnant
221549ddae5SEric Fiseliertemplate <class _Value, class _Hash = hash<_Value>, class _Pred = std::equal_to<_Value>,
222549ddae5SEric Fiselier          class _Alloc = std::allocator<_Value> >
223e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS hash_set
2243e519524SHoward Hinnant{
2253e519524SHoward Hinnantpublic:
2263e519524SHoward Hinnant    // types
2273e519524SHoward Hinnant    typedef _Value                                                     key_type;
2283e519524SHoward Hinnant    typedef key_type                                                   value_type;
2293e519524SHoward Hinnant    typedef _Hash                                                      hasher;
2303e519524SHoward Hinnant    typedef _Pred                                                      key_equal;
2313e519524SHoward Hinnant    typedef _Alloc                                                     allocator_type;
2323e519524SHoward Hinnant    typedef value_type&                                                reference;
2333e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2343e519524SHoward Hinnant
2353e519524SHoward Hinnantprivate:
236549ddae5SEric Fiselier    typedef std::__hash_table<value_type, hasher, key_equal, allocator_type> __table;
2373e519524SHoward Hinnant
2383e519524SHoward Hinnant    __table __table_;
2393e519524SHoward Hinnant
2403e519524SHoward Hinnantpublic:
2413e519524SHoward Hinnant    typedef typename __table::pointer         pointer;
2423e519524SHoward Hinnant    typedef typename __table::const_pointer   const_pointer;
2433e519524SHoward Hinnant    typedef typename __table::size_type       size_type;
2443e519524SHoward Hinnant    typedef typename __table::difference_type difference_type;
2453e519524SHoward Hinnant
2463e519524SHoward Hinnant    typedef typename __table::const_iterator       iterator;
2473e519524SHoward Hinnant    typedef typename __table::const_iterator       const_iterator;
2483e519524SHoward Hinnant
249fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2503eb5aec6SEric Fiselier    hash_set() { }
2513e519524SHoward Hinnant    explicit hash_set(size_type __n, const hasher& __hf = hasher(),
2523e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
2533e519524SHoward Hinnant    hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
2543e519524SHoward Hinnant                  const allocator_type& __a);
2553e519524SHoward Hinnant    template <class _InputIterator>
2563e519524SHoward Hinnant        hash_set(_InputIterator __first, _InputIterator __last);
2573e519524SHoward Hinnant    template <class _InputIterator>
2583e519524SHoward Hinnant        hash_set(_InputIterator __first, _InputIterator __last,
2593e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
2603e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
2613e519524SHoward Hinnant    template <class _InputIterator>
2623e519524SHoward Hinnant        hash_set(_InputIterator __first, _InputIterator __last,
2633e519524SHoward Hinnant                      size_type __n, const hasher& __hf, const key_equal& __eql,
2643e519524SHoward Hinnant                      const allocator_type& __a);
2653e519524SHoward Hinnant    hash_set(const hash_set& __u);
2663e519524SHoward Hinnant
267fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2683e519524SHoward Hinnant    allocator_type get_allocator() const
2693e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
2703e519524SHoward Hinnant
271fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2723e519524SHoward Hinnant    bool      empty() const {return __table_.size() == 0;}
273fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2743e519524SHoward Hinnant    size_type size() const  {return __table_.size();}
275fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2763e519524SHoward Hinnant    size_type max_size() const {return __table_.max_size();}
2773e519524SHoward Hinnant
278fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2793e519524SHoward Hinnant    iterator       begin()        {return __table_.begin();}
280fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2813e519524SHoward Hinnant    iterator       end()          {return __table_.end();}
282fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2833e519524SHoward Hinnant    const_iterator begin()  const {return __table_.begin();}
284fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2853e519524SHoward Hinnant    const_iterator end()    const {return __table_.end();}
2863e519524SHoward Hinnant
287fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
288549ddae5SEric Fiselier    std::pair<iterator, bool> insert(const value_type& __x)
2893e519524SHoward Hinnant        {return __table_.__insert_unique(__x);}
290fe473ae2SAlexis Hunt    _LIBCPP_INLINE_VISIBILITY
291fe473ae2SAlexis Hunt    iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
2923e519524SHoward Hinnant    template <class _InputIterator>
293cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
2943e519524SHoward Hinnant        void insert(_InputIterator __first, _InputIterator __last);
2953e519524SHoward Hinnant
296fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2973e519524SHoward Hinnant    void erase(const_iterator __p) {__table_.erase(__p);}
298fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2993e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
300fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3013e519524SHoward Hinnant    void erase(const_iterator __first, const_iterator __last)
3023e519524SHoward Hinnant        {__table_.erase(__first, __last);}
303fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3043e519524SHoward Hinnant    void clear() {__table_.clear();}
3053e519524SHoward Hinnant
306fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3073e519524SHoward Hinnant    void swap(hash_set& __u) {__table_.swap(__u.__table_);}
3083e519524SHoward Hinnant
309fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3103e519524SHoward Hinnant    hasher hash_funct() const {return __table_.hash_function();}
311fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3123e519524SHoward Hinnant    key_equal key_eq() const {return __table_.key_eq();}
3133e519524SHoward Hinnant
314fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3153e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
316fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3173e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
318fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3193e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
320fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
321549ddae5SEric Fiselier    std::pair<iterator, iterator>             equal_range(const key_type& __k)
3223e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
323fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
324549ddae5SEric Fiselier    std::pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
3253e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
3263e519524SHoward Hinnant
327fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3283e519524SHoward Hinnant    size_type bucket_count() const {return __table_.bucket_count();}
329fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3303e519524SHoward Hinnant    size_type max_bucket_count() const {return __table_.max_bucket_count();}
3313e519524SHoward Hinnant
332fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3333e519524SHoward Hinnant    size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
3343e519524SHoward Hinnant
335fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
336*3085e42fSIvan Trofimov    void resize(size_type __n) {__table_.__rehash_unique(__n);}
3373e519524SHoward Hinnant};
3383e519524SHoward Hinnant
3393e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3403e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
3413e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
3423e519524SHoward Hinnant    : __table_(__hf, __eql)
3433e519524SHoward Hinnant{
344*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
3453e519524SHoward Hinnant}
3463e519524SHoward Hinnant
3473e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3483e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
3493e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
3503e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
3513e519524SHoward Hinnant{
352*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
3533e519524SHoward Hinnant}
3543e519524SHoward Hinnant
3553e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3563e519524SHoward Hinnanttemplate <class _InputIterator>
3573e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
3583e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
3593e519524SHoward Hinnant{
3603e519524SHoward Hinnant    insert(__first, __last);
3613e519524SHoward Hinnant}
3623e519524SHoward Hinnant
3633e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3643e519524SHoward Hinnanttemplate <class _InputIterator>
3653e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
3663e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
3673e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
3683e519524SHoward Hinnant    : __table_(__hf, __eql)
3693e519524SHoward Hinnant{
370*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
3713e519524SHoward Hinnant    insert(__first, __last);
3723e519524SHoward Hinnant}
3733e519524SHoward Hinnant
3743e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3753e519524SHoward Hinnanttemplate <class _InputIterator>
3763e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
3773e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
3783e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
3793e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
3803e519524SHoward Hinnant{
381*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
3823e519524SHoward Hinnant    insert(__first, __last);
3833e519524SHoward Hinnant}
3843e519524SHoward Hinnant
3853e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3863e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
3873e519524SHoward Hinnant        const hash_set& __u)
3883e519524SHoward Hinnant    : __table_(__u.__table_)
3893e519524SHoward Hinnant{
390*3085e42fSIvan Trofimov    __table_.__rehash_unique(__u.bucket_count());
3913e519524SHoward Hinnant    insert(__u.begin(), __u.end());
3923e519524SHoward Hinnant}
3933e519524SHoward Hinnant
3943e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
3953e519524SHoward Hinnanttemplate <class _InputIterator>
396cd31b434SEvgeniy Stepanovinline
3973e519524SHoward Hinnantvoid
3983e519524SHoward Hinnanthash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
3993e519524SHoward Hinnant                                                    _InputIterator __last)
4003e519524SHoward Hinnant{
4013e519524SHoward Hinnant    for (; __first != __last; ++__first)
4023e519524SHoward Hinnant        __table_.__insert_unique(*__first);
4033e519524SHoward Hinnant}
4043e519524SHoward Hinnant
4053e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
406fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4073e519524SHoward Hinnantvoid
4083e519524SHoward Hinnantswap(hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
4093e519524SHoward Hinnant     hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
4103e519524SHoward Hinnant{
4113e519524SHoward Hinnant    __x.swap(__y);
4123e519524SHoward Hinnant}
4133e519524SHoward Hinnant
4143e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
4153e519524SHoward Hinnantbool
4163e519524SHoward Hinnantoperator==(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
4173e519524SHoward Hinnant           const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
4183e519524SHoward Hinnant{
4193e519524SHoward Hinnant    if (__x.size() != __y.size())
4203e519524SHoward Hinnant        return false;
4213e519524SHoward Hinnant    typedef typename hash_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
4223e519524SHoward Hinnant                                                                 const_iterator;
4233e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
4243e519524SHoward Hinnant            __i != __ex; ++__i)
4253e519524SHoward Hinnant    {
4263e519524SHoward Hinnant        const_iterator __j = __y.find(*__i);
4273e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
4283e519524SHoward Hinnant            return false;
4293e519524SHoward Hinnant    }
4303e519524SHoward Hinnant    return true;
4313e519524SHoward Hinnant}
4323e519524SHoward Hinnant
4333e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
434fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4353e519524SHoward Hinnantbool
4363e519524SHoward Hinnantoperator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
4373e519524SHoward Hinnant           const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
4383e519524SHoward Hinnant{
4393e519524SHoward Hinnant    return !(__x == __y);
4403e519524SHoward Hinnant}
4413e519524SHoward Hinnant
442549ddae5SEric Fiseliertemplate <class _Value, class _Hash = hash<_Value>, class _Pred = std::equal_to<_Value>,
443549ddae5SEric Fiselier          class _Alloc = std::allocator<_Value> >
444e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS hash_multiset
4453e519524SHoward Hinnant{
4463e519524SHoward Hinnantpublic:
4473e519524SHoward Hinnant    // types
4483e519524SHoward Hinnant    typedef _Value                                                     key_type;
4493e519524SHoward Hinnant    typedef key_type                                                   value_type;
4503e519524SHoward Hinnant    typedef _Hash                                                      hasher;
4513e519524SHoward Hinnant    typedef _Pred                                                      key_equal;
4523e519524SHoward Hinnant    typedef _Alloc                                                     allocator_type;
4533e519524SHoward Hinnant    typedef value_type&                                                reference;
4543e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
4553e519524SHoward Hinnant
4563e519524SHoward Hinnantprivate:
457549ddae5SEric Fiselier    typedef std::__hash_table<value_type, hasher, key_equal, allocator_type> __table;
4583e519524SHoward Hinnant
4593e519524SHoward Hinnant    __table __table_;
4603e519524SHoward Hinnant
4613e519524SHoward Hinnantpublic:
4623e519524SHoward Hinnant    typedef typename __table::pointer         pointer;
4633e519524SHoward Hinnant    typedef typename __table::const_pointer   const_pointer;
4643e519524SHoward Hinnant    typedef typename __table::size_type       size_type;
4653e519524SHoward Hinnant    typedef typename __table::difference_type difference_type;
4663e519524SHoward Hinnant
4673e519524SHoward Hinnant    typedef typename __table::const_iterator       iterator;
4683e519524SHoward Hinnant    typedef typename __table::const_iterator       const_iterator;
4693e519524SHoward Hinnant
470fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4713eb5aec6SEric Fiselier    hash_multiset() { }
4723e519524SHoward Hinnant    explicit hash_multiset(size_type __n, const hasher& __hf = hasher(),
4733e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
4743e519524SHoward Hinnant    hash_multiset(size_type __n, const hasher& __hf,
4753e519524SHoward Hinnant                       const key_equal& __eql, const allocator_type& __a);
4763e519524SHoward Hinnant    template <class _InputIterator>
4773e519524SHoward Hinnant        hash_multiset(_InputIterator __first, _InputIterator __last);
4783e519524SHoward Hinnant    template <class _InputIterator>
4793e519524SHoward Hinnant        hash_multiset(_InputIterator __first, _InputIterator __last,
4803e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
4813e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
4823e519524SHoward Hinnant    template <class _InputIterator>
4833e519524SHoward Hinnant        hash_multiset(_InputIterator __first, _InputIterator __last,
4843e519524SHoward Hinnant                      size_type __n , const hasher& __hf,
4853e519524SHoward Hinnant                      const key_equal& __eql, const allocator_type& __a);
4863e519524SHoward Hinnant    hash_multiset(const hash_multiset& __u);
4873e519524SHoward Hinnant
488fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4893e519524SHoward Hinnant    allocator_type get_allocator() const
4903e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
4913e519524SHoward Hinnant
492fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4933e519524SHoward Hinnant    bool      empty() const {return __table_.size() == 0;}
494fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4953e519524SHoward Hinnant    size_type size() const  {return __table_.size();}
496fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4973e519524SHoward Hinnant    size_type max_size() const {return __table_.max_size();}
4983e519524SHoward Hinnant
499fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5003e519524SHoward Hinnant    iterator       begin()        {return __table_.begin();}
501fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5023e519524SHoward Hinnant    iterator       end()          {return __table_.end();}
503fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5043e519524SHoward Hinnant    const_iterator begin()  const {return __table_.begin();}
505fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5063e519524SHoward Hinnant    const_iterator end()    const {return __table_.end();}
5073e519524SHoward Hinnant
508fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5093e519524SHoward Hinnant    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
510fe473ae2SAlexis Hunt    _LIBCPP_INLINE_VISIBILITY
511fe473ae2SAlexis Hunt    iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
5123e519524SHoward Hinnant    template <class _InputIterator>
513cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
5143e519524SHoward Hinnant        void insert(_InputIterator __first, _InputIterator __last);
5153e519524SHoward Hinnant
516fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5173e519524SHoward Hinnant    void erase(const_iterator __p) {__table_.erase(__p);}
518fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5193e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
520fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5213e519524SHoward Hinnant    void erase(const_iterator __first, const_iterator __last)
5223e519524SHoward Hinnant        {__table_.erase(__first, __last);}
523fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5243e519524SHoward Hinnant    void clear() {__table_.clear();}
5253e519524SHoward Hinnant
526fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5273e519524SHoward Hinnant    void swap(hash_multiset& __u) {__table_.swap(__u.__table_);}
5283e519524SHoward Hinnant
529fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5303e519524SHoward Hinnant    hasher hash_funct() const {return __table_.hash_function();}
531fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5323e519524SHoward Hinnant    key_equal key_eq() const {return __table_.key_eq();}
5333e519524SHoward Hinnant
534fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5353e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
536fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5373e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
538fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5393e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
540fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
541549ddae5SEric Fiselier    std::pair<iterator, iterator>             equal_range(const key_type& __k)
5423e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
543fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
544549ddae5SEric Fiselier    std::pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
5453e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
5463e519524SHoward Hinnant
547fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5483e519524SHoward Hinnant    size_type bucket_count() const {return __table_.bucket_count();}
549fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5503e519524SHoward Hinnant    size_type max_bucket_count() const {return __table_.max_bucket_count();}
5513e519524SHoward Hinnant
552fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5533e519524SHoward Hinnant    size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
5543e519524SHoward Hinnant
555fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
556*3085e42fSIvan Trofimov    void resize(size_type __n) {__table_.__rehash_multi(__n);}
5573e519524SHoward Hinnant};
5583e519524SHoward Hinnant
5593e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
5603e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
5613e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
5623e519524SHoward Hinnant    : __table_(__hf, __eql)
5633e519524SHoward Hinnant{
564*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
5653e519524SHoward Hinnant}
5663e519524SHoward Hinnant
5673e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
5683e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
5693e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
5703e519524SHoward Hinnant        const allocator_type& __a)
5713e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
5723e519524SHoward Hinnant{
573*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
5743e519524SHoward Hinnant}
5753e519524SHoward Hinnant
5763e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
5773e519524SHoward Hinnanttemplate <class _InputIterator>
5783e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
5793e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
5803e519524SHoward Hinnant{
5813e519524SHoward Hinnant    insert(__first, __last);
5823e519524SHoward Hinnant}
5833e519524SHoward Hinnant
5843e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
5853e519524SHoward Hinnanttemplate <class _InputIterator>
5863e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
5873e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
5883e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
5893e519524SHoward Hinnant    : __table_(__hf, __eql)
5903e519524SHoward Hinnant{
591*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
5923e519524SHoward Hinnant    insert(__first, __last);
5933e519524SHoward Hinnant}
5943e519524SHoward Hinnant
5953e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
5963e519524SHoward Hinnanttemplate <class _InputIterator>
5973e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
5983e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
5993e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
6003e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
6013e519524SHoward Hinnant{
602*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
6033e519524SHoward Hinnant    insert(__first, __last);
6043e519524SHoward Hinnant}
6053e519524SHoward Hinnant
6063e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
6073e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
6083e519524SHoward Hinnant        const hash_multiset& __u)
6093e519524SHoward Hinnant    : __table_(__u.__table_)
6103e519524SHoward Hinnant{
611*3085e42fSIvan Trofimov    __table_.__rehash_multi(__u.bucket_count());
6123e519524SHoward Hinnant    insert(__u.begin(), __u.end());
6133e519524SHoward Hinnant}
6143e519524SHoward Hinnant
6153e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
6163e519524SHoward Hinnanttemplate <class _InputIterator>
617cd31b434SEvgeniy Stepanovinline
6183e519524SHoward Hinnantvoid
6193e519524SHoward Hinnanthash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
6203e519524SHoward Hinnant                                                    _InputIterator __last)
6213e519524SHoward Hinnant{
6223e519524SHoward Hinnant    for (; __first != __last; ++__first)
6233e519524SHoward Hinnant        __table_.__insert_multi(*__first);
6243e519524SHoward Hinnant}
6253e519524SHoward Hinnant
6263e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
627fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6283e519524SHoward Hinnantvoid
6293e519524SHoward Hinnantswap(hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
6303e519524SHoward Hinnant     hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
6313e519524SHoward Hinnant{
6323e519524SHoward Hinnant    __x.swap(__y);
6333e519524SHoward Hinnant}
6343e519524SHoward Hinnant
6353e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
6363e519524SHoward Hinnantbool
6373e519524SHoward Hinnantoperator==(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
6383e519524SHoward Hinnant           const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
6393e519524SHoward Hinnant{
6403e519524SHoward Hinnant    if (__x.size() != __y.size())
6413e519524SHoward Hinnant        return false;
6423e519524SHoward Hinnant    typedef typename hash_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
6433e519524SHoward Hinnant                                                                 const_iterator;
644549ddae5SEric Fiselier    typedef std::pair<const_iterator, const_iterator> _EqRng;
6453e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
6463e519524SHoward Hinnant    {
6473e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(*__i);
6483e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(*__i);
649ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
650ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
651ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
6523e519524SHoward Hinnant            return false;
6533e519524SHoward Hinnant        __i = __xeq.second;
6543e519524SHoward Hinnant    }
6553e519524SHoward Hinnant    return true;
6563e519524SHoward Hinnant}
6573e519524SHoward Hinnant
6583e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc>
659fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6603e519524SHoward Hinnantbool
6613e519524SHoward Hinnantoperator!=(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
6623e519524SHoward Hinnant           const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
6633e519524SHoward Hinnant{
6643e519524SHoward Hinnant    return !(__x == __y);
6653e519524SHoward Hinnant}
6663e519524SHoward Hinnant
667d2b0df35SNikolas Klauser} // namespace __gnu_cxx
6683e519524SHoward Hinnant
6693e519524SHoward Hinnant#endif // _LIBCPP_HASH_SET
670