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