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_UNORDERED_SET 113e519524SHoward Hinnant#define _LIBCPP_UNORDERED_SET 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant 153e519524SHoward Hinnant unordered_set synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnant#include <initializer_list> 183e519524SHoward Hinnant 193e519524SHoward Hinnantnamespace std 203e519524SHoward Hinnant{ 213e519524SHoward Hinnant 223e519524SHoward Hinnanttemplate <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, 233e519524SHoward Hinnant class Alloc = allocator<Value>> 243e519524SHoward Hinnantclass unordered_set 253e519524SHoward Hinnant{ 263e519524SHoward Hinnantpublic: 273e519524SHoward Hinnant // types 283e519524SHoward Hinnant typedef Value key_type; 293e519524SHoward Hinnant typedef key_type value_type; 303e519524SHoward Hinnant typedef Hash hasher; 313e519524SHoward Hinnant typedef Pred key_equal; 323e519524SHoward Hinnant typedef Alloc allocator_type; 333e519524SHoward Hinnant typedef value_type& reference; 343e519524SHoward Hinnant typedef const value_type& const_reference; 353e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 363e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 373e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 383e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 393e519524SHoward Hinnant 403e519524SHoward Hinnant typedef /unspecified/ iterator; 413e519524SHoward Hinnant typedef /unspecified/ const_iterator; 423e519524SHoward Hinnant typedef /unspecified/ local_iterator; 433e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 443e519524SHoward Hinnant 45b0386a51SErik Pilkington typedef unspecified node_type unspecified; // C++17 46b0386a51SErik Pilkington typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17 47b0386a51SErik Pilkington 48557da866SHoward Hinnant unordered_set() 49557da866SHoward Hinnant noexcept( 50557da866SHoward Hinnant is_nothrow_default_constructible<hasher>::value && 51557da866SHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 52557da866SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 53557da866SHoward Hinnant explicit unordered_set(size_type n, const hasher& hf = hasher(), 543e519524SHoward Hinnant const key_equal& eql = key_equal(), 553e519524SHoward Hinnant const allocator_type& a = allocator_type()); 563e519524SHoward Hinnant template <class InputIterator> 573e519524SHoward Hinnant unordered_set(InputIterator f, InputIterator l, 583e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 593e519524SHoward Hinnant const key_equal& eql = key_equal(), 603e519524SHoward Hinnant const allocator_type& a = allocator_type()); 613e519524SHoward Hinnant explicit unordered_set(const allocator_type&); 623e519524SHoward Hinnant unordered_set(const unordered_set&); 633e519524SHoward Hinnant unordered_set(const unordered_set&, const Allocator&); 64557da866SHoward Hinnant unordered_set(unordered_set&&) 65557da866SHoward Hinnant noexcept( 66557da866SHoward Hinnant is_nothrow_move_constructible<hasher>::value && 67557da866SHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 68557da866SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 693e519524SHoward Hinnant unordered_set(unordered_set&&, const Allocator&); 703e519524SHoward Hinnant unordered_set(initializer_list<value_type>, size_type n = 0, 713e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 723e519524SHoward Hinnant const allocator_type& a = allocator_type()); 7345b983c4SMarshall Clow unordered_set(size_type n, const allocator_type& a); // C++14 7445b983c4SMarshall Clow unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14 7545b983c4SMarshall Clow template <class InputIterator> 7645b983c4SMarshall Clow unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 7745b983c4SMarshall Clow template <class InputIterator> 7845b983c4SMarshall Clow unordered_set(InputIterator f, InputIterator l, size_type n, 7945b983c4SMarshall Clow const hasher& hf, const allocator_type& a); // C++14 8045b983c4SMarshall Clow unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 8145b983c4SMarshall Clow unordered_set(initializer_list<value_type> il, size_type n, 8245b983c4SMarshall Clow const hasher& hf, const allocator_type& a); // C++14 833e519524SHoward Hinnant ~unordered_set(); 843e519524SHoward Hinnant unordered_set& operator=(const unordered_set&); 85557da866SHoward Hinnant unordered_set& operator=(unordered_set&&) 86557da866SHoward Hinnant noexcept( 87557da866SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 88557da866SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 89557da866SHoward Hinnant is_nothrow_move_assignable<hasher>::value && 90557da866SHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 913e519524SHoward Hinnant unordered_set& operator=(initializer_list<value_type>); 923e519524SHoward Hinnant 93557da866SHoward Hinnant allocator_type get_allocator() const noexcept; 943e519524SHoward Hinnant 95557da866SHoward Hinnant bool empty() const noexcept; 96557da866SHoward Hinnant size_type size() const noexcept; 97557da866SHoward Hinnant size_type max_size() const noexcept; 983e519524SHoward Hinnant 99557da866SHoward Hinnant iterator begin() noexcept; 100557da866SHoward Hinnant iterator end() noexcept; 101557da866SHoward Hinnant const_iterator begin() const noexcept; 102557da866SHoward Hinnant const_iterator end() const noexcept; 103557da866SHoward Hinnant const_iterator cbegin() const noexcept; 104557da866SHoward Hinnant const_iterator cend() const noexcept; 1053e519524SHoward Hinnant 1063e519524SHoward Hinnant template <class... Args> 1073e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1083e519524SHoward Hinnant template <class... Args> 1093e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1103e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& obj); 1113e519524SHoward Hinnant pair<iterator, bool> insert(value_type&& obj); 1123e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 1133e519524SHoward Hinnant iterator insert(const_iterator hint, value_type&& obj); 1143e519524SHoward Hinnant template <class InputIterator> 1153e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1163e519524SHoward Hinnant void insert(initializer_list<value_type>); 1173e519524SHoward Hinnant 118b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 119b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 120b0386a51SErik Pilkington insert_return_type insert(node_type&& nh); // C++17 121b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 122b0386a51SErik Pilkington 1233e519524SHoward Hinnant iterator erase(const_iterator position); 124ec392968SMarshall Clow iterator erase(iterator position); // C++14 1253e519524SHoward Hinnant size_type erase(const key_type& k); 1263e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 127557da866SHoward Hinnant void clear() noexcept; 1283e519524SHoward Hinnant 1295c4e07aeSErik Pilkington template<class H2, class P2> 1305c4e07aeSErik Pilkington void merge(unordered_set<Key, H2, P2, Allocator>& source); // C++17 1315c4e07aeSErik Pilkington template<class H2, class P2> 1325c4e07aeSErik Pilkington void merge(unordered_set<Key, H2, P2, Allocator>&& source); // C++17 1335c4e07aeSErik Pilkington template<class H2, class P2> 1345c4e07aeSErik Pilkington void merge(unordered_multiset<Key, H2, P2, Allocator>& source); // C++17 1355c4e07aeSErik Pilkington template<class H2, class P2> 1365c4e07aeSErik Pilkington void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // C++17 1375c4e07aeSErik Pilkington 138557da866SHoward Hinnant void swap(unordered_set&) 139e3fbe143SMarshall Clow noexcept(allocator_traits<Allocator>::is_always_equal::value && 140e3fbe143SMarshall Clow noexcept(swap(declval<hasher&>(), declval<hasher&>())) && 141e3fbe143SMarshall Clow noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 1423e519524SHoward Hinnant 1433e519524SHoward Hinnant hasher hash_function() const; 1443e519524SHoward Hinnant key_equal key_eq() const; 1453e519524SHoward Hinnant 1463e519524SHoward Hinnant iterator find(const key_type& k); 1473e519524SHoward Hinnant const_iterator find(const key_type& k) const; 148e5ec94a1SRuslan Arutyunyan template<typename K> 149e5ec94a1SRuslan Arutyunyan iterator find(const K& x); // C++20 150e5ec94a1SRuslan Arutyunyan template<typename K> 151e5ec94a1SRuslan Arutyunyan const_iterator find(const K& x) const; // C++20 1523e519524SHoward Hinnant size_type count(const key_type& k) const; 153e5ec94a1SRuslan Arutyunyan template<typename K> 154e5ec94a1SRuslan Arutyunyan size_type count(const K& k) const; // C++20 155a17b1aedSZoe Carver bool contains(const key_type& k) const; // C++20 156e5ec94a1SRuslan Arutyunyan template<typename K> 157e5ec94a1SRuslan Arutyunyan bool contains(const K& k) const; // C++20 1583e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 1593e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 160e5ec94a1SRuslan Arutyunyan template<typename K> 161e5ec94a1SRuslan Arutyunyan pair<iterator, iterator> equal_range(const K& k); // C++20 162e5ec94a1SRuslan Arutyunyan template<typename K> 163e5ec94a1SRuslan Arutyunyan pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20 1643e519524SHoward Hinnant 165557da866SHoward Hinnant size_type bucket_count() const noexcept; 166557da866SHoward Hinnant size_type max_bucket_count() const noexcept; 1673e519524SHoward Hinnant 1683e519524SHoward Hinnant size_type bucket_size(size_type n) const; 1693e519524SHoward Hinnant size_type bucket(const key_type& k) const; 1703e519524SHoward Hinnant 1713e519524SHoward Hinnant local_iterator begin(size_type n); 1723e519524SHoward Hinnant local_iterator end(size_type n); 1733e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 1743e519524SHoward Hinnant const_local_iterator end(size_type n) const; 1753e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 1763e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 1773e519524SHoward Hinnant 178557da866SHoward Hinnant float load_factor() const noexcept; 179557da866SHoward Hinnant float max_load_factor() const noexcept; 1803e519524SHoward Hinnant void max_load_factor(float z); 1813e519524SHoward Hinnant void rehash(size_type n); 1823e519524SHoward Hinnant void reserve(size_type n); 1833e519524SHoward Hinnant}; 1843e519524SHoward Hinnant 18568072a71SKonstantin Varlamovtemplate<class InputIterator, 18668072a71SKonstantin Varlamov class Hash = hash<typename iterator_traits<InputIterator>::value_type>, 18768072a71SKonstantin Varlamov class Pred = equal_to<typename iterator_traits<InputIterator>::value_type>, 18868072a71SKonstantin Varlamov class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 18968072a71SKonstantin Varlamovunordered_set(InputIterator, InputIterator, typename see below::size_type = see below, 19068072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 19168072a71SKonstantin Varlamov -> unordered_set<typename iterator_traits<InputIterator>::value_type, 19268072a71SKonstantin Varlamov Hash, Pred, Allocator>; // C++17 19368072a71SKonstantin Varlamov 19468072a71SKonstantin Varlamovtemplate<class T, class Hash = hash<T>, 19568072a71SKonstantin Varlamov class Pred = equal_to<T>, class Allocator = allocator<T>> 19668072a71SKonstantin Varlamovunordered_set(initializer_list<T>, typename see below::size_type = see below, 19768072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 19868072a71SKonstantin Varlamov -> unordered_set<T, Hash, Pred, Allocator>; // C++17 19968072a71SKonstantin Varlamov 20068072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 20168072a71SKonstantin Varlamovunordered_set(InputIterator, InputIterator, typename see below::size_type, Allocator) 20268072a71SKonstantin Varlamov -> unordered_set<typename iterator_traits<InputIterator>::value_type, 20368072a71SKonstantin Varlamov hash<typename iterator_traits<InputIterator>::value_type>, 20468072a71SKonstantin Varlamov equal_to<typename iterator_traits<InputIterator>::value_type>, 20568072a71SKonstantin Varlamov Allocator>; // C++17 20668072a71SKonstantin Varlamov 20768072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator> 20868072a71SKonstantin Varlamovunordered_set(InputIterator, InputIterator, typename see below::size_type, 20968072a71SKonstantin Varlamov Hash, Allocator) 21068072a71SKonstantin Varlamov -> unordered_set<typename iterator_traits<InputIterator>::value_type, Hash, 21168072a71SKonstantin Varlamov equal_to<typename iterator_traits<InputIterator>::value_type>, 21268072a71SKonstantin Varlamov Allocator>; // C++17 21368072a71SKonstantin Varlamov 21468072a71SKonstantin Varlamovtemplate<class T, class Allocator> 21568072a71SKonstantin Varlamovunordered_set(initializer_list<T>, typename see below::size_type, Allocator) 21668072a71SKonstantin Varlamov -> unordered_set<T, hash<T>, equal_to<T>, Allocator>; // C++17 21768072a71SKonstantin Varlamov 21868072a71SKonstantin Varlamovtemplate<class T, class Hash, class Allocator> 21968072a71SKonstantin Varlamovunordered_set(initializer_list<T>, typename see below::size_type, Hash, Allocator) 22068072a71SKonstantin Varlamov -> unordered_set<T, Hash, equal_to<T>, Allocator>; // C++17 22168072a71SKonstantin Varlamov 2223e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 2233e519524SHoward Hinnant void swap(unordered_set<Value, Hash, Pred, Alloc>& x, 224557da866SHoward Hinnant unordered_set<Value, Hash, Pred, Alloc>& y) 225557da866SHoward Hinnant noexcept(noexcept(x.swap(y))); 2263e519524SHoward Hinnant 2273e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 2283e519524SHoward Hinnant bool 2293e519524SHoward Hinnant operator==(const unordered_set<Value, Hash, Pred, Alloc>& x, 2303e519524SHoward Hinnant const unordered_set<Value, Hash, Pred, Alloc>& y); 2313e519524SHoward Hinnant 2323e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 2333e519524SHoward Hinnant bool 2343e519524SHoward Hinnant operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x, 2353e519524SHoward Hinnant const unordered_set<Value, Hash, Pred, Alloc>& y); 2363e519524SHoward Hinnant 2373e519524SHoward Hinnanttemplate <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, 2383e519524SHoward Hinnant class Alloc = allocator<Value>> 2393e519524SHoward Hinnantclass unordered_multiset 2403e519524SHoward Hinnant{ 2413e519524SHoward Hinnantpublic: 2423e519524SHoward Hinnant // types 2433e519524SHoward Hinnant typedef Value key_type; 2443e519524SHoward Hinnant typedef key_type value_type; 2453e519524SHoward Hinnant typedef Hash hasher; 2463e519524SHoward Hinnant typedef Pred key_equal; 2473e519524SHoward Hinnant typedef Alloc allocator_type; 2483e519524SHoward Hinnant typedef value_type& reference; 2493e519524SHoward Hinnant typedef const value_type& const_reference; 2503e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 2513e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 2523e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 2533e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 2543e519524SHoward Hinnant 2553e519524SHoward Hinnant typedef /unspecified/ iterator; 2563e519524SHoward Hinnant typedef /unspecified/ const_iterator; 2573e519524SHoward Hinnant typedef /unspecified/ local_iterator; 2583e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 2593e519524SHoward Hinnant 260b0386a51SErik Pilkington typedef unspecified node_type unspecified; // C++17 261b0386a51SErik Pilkington 262557da866SHoward Hinnant unordered_multiset() 263557da866SHoward Hinnant noexcept( 264557da866SHoward Hinnant is_nothrow_default_constructible<hasher>::value && 265557da866SHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 266557da866SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 267557da866SHoward Hinnant explicit unordered_multiset(size_type n, const hasher& hf = hasher(), 2683e519524SHoward Hinnant const key_equal& eql = key_equal(), 2693e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2703e519524SHoward Hinnant template <class InputIterator> 2713e519524SHoward Hinnant unordered_multiset(InputIterator f, InputIterator l, 2723e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 2733e519524SHoward Hinnant const key_equal& eql = key_equal(), 2743e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2753e519524SHoward Hinnant explicit unordered_multiset(const allocator_type&); 2763e519524SHoward Hinnant unordered_multiset(const unordered_multiset&); 2773e519524SHoward Hinnant unordered_multiset(const unordered_multiset&, const Allocator&); 278557da866SHoward Hinnant unordered_multiset(unordered_multiset&&) 279557da866SHoward Hinnant noexcept( 280557da866SHoward Hinnant is_nothrow_move_constructible<hasher>::value && 281557da866SHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 282557da866SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 2833e519524SHoward Hinnant unordered_multiset(unordered_multiset&&, const Allocator&); 2843e519524SHoward Hinnant unordered_multiset(initializer_list<value_type>, size_type n = /see below/, 2853e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 2863e519524SHoward Hinnant const allocator_type& a = allocator_type()); 28745b983c4SMarshall Clow unordered_multiset(size_type n, const allocator_type& a); // C++14 28845b983c4SMarshall Clow unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14 28945b983c4SMarshall Clow template <class InputIterator> 29045b983c4SMarshall Clow unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 29145b983c4SMarshall Clow template <class InputIterator> 29245b983c4SMarshall Clow unordered_multiset(InputIterator f, InputIterator l, size_type n, 29345b983c4SMarshall Clow const hasher& hf, const allocator_type& a); // C++14 29445b983c4SMarshall Clow unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 29545b983c4SMarshall Clow unordered_multiset(initializer_list<value_type> il, size_type n, 29645b983c4SMarshall Clow const hasher& hf, const allocator_type& a); // C++14 2973e519524SHoward Hinnant ~unordered_multiset(); 2983e519524SHoward Hinnant unordered_multiset& operator=(const unordered_multiset&); 299557da866SHoward Hinnant unordered_multiset& operator=(unordered_multiset&&) 300557da866SHoward Hinnant noexcept( 301557da866SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 302557da866SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 303557da866SHoward Hinnant is_nothrow_move_assignable<hasher>::value && 304557da866SHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 3053e519524SHoward Hinnant unordered_multiset& operator=(initializer_list<value_type>); 3063e519524SHoward Hinnant 307557da866SHoward Hinnant allocator_type get_allocator() const noexcept; 3083e519524SHoward Hinnant 309557da866SHoward Hinnant bool empty() const noexcept; 310557da866SHoward Hinnant size_type size() const noexcept; 311557da866SHoward Hinnant size_type max_size() const noexcept; 3123e519524SHoward Hinnant 313557da866SHoward Hinnant iterator begin() noexcept; 314557da866SHoward Hinnant iterator end() noexcept; 315557da866SHoward Hinnant const_iterator begin() const noexcept; 316557da866SHoward Hinnant const_iterator end() const noexcept; 317557da866SHoward Hinnant const_iterator cbegin() const noexcept; 318557da866SHoward Hinnant const_iterator cend() const noexcept; 3193e519524SHoward Hinnant 3203e519524SHoward Hinnant template <class... Args> 3213e519524SHoward Hinnant iterator emplace(Args&&... args); 3223e519524SHoward Hinnant template <class... Args> 3233e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3243e519524SHoward Hinnant iterator insert(const value_type& obj); 3253e519524SHoward Hinnant iterator insert(value_type&& obj); 3263e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 3273e519524SHoward Hinnant iterator insert(const_iterator hint, value_type&& obj); 3283e519524SHoward Hinnant template <class InputIterator> 3293e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3303e519524SHoward Hinnant void insert(initializer_list<value_type>); 3313e519524SHoward Hinnant 332b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 333b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 334b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 335b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 336b0386a51SErik Pilkington 3373e519524SHoward Hinnant iterator erase(const_iterator position); 338ec392968SMarshall Clow iterator erase(iterator position); // C++14 3393e519524SHoward Hinnant size_type erase(const key_type& k); 3403e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 341557da866SHoward Hinnant void clear() noexcept; 3423e519524SHoward Hinnant 3435c4e07aeSErik Pilkington template<class H2, class P2> 3445c4e07aeSErik Pilkington void merge(unordered_multiset<Key, H2, P2, Allocator>& source); // C++17 3455c4e07aeSErik Pilkington template<class H2, class P2> 3465c4e07aeSErik Pilkington void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // C++17 3475c4e07aeSErik Pilkington template<class H2, class P2> 3485c4e07aeSErik Pilkington void merge(unordered_set<Key, H2, P2, Allocator>& source); // C++17 3495c4e07aeSErik Pilkington template<class H2, class P2> 3505c4e07aeSErik Pilkington void merge(unordered_set<Key, H2, P2, Allocator>&& source); // C++17 3515c4e07aeSErik Pilkington 352557da866SHoward Hinnant void swap(unordered_multiset&) 353e3fbe143SMarshall Clow noexcept(allocator_traits<Allocator>::is_always_equal::value && 354e3fbe143SMarshall Clow noexcept(swap(declval<hasher&>(), declval<hasher&>())) && 355e3fbe143SMarshall Clow noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 3563e519524SHoward Hinnant 3573e519524SHoward Hinnant hasher hash_function() const; 3583e519524SHoward Hinnant key_equal key_eq() const; 3593e519524SHoward Hinnant 3603e519524SHoward Hinnant iterator find(const key_type& k); 3613e519524SHoward Hinnant const_iterator find(const key_type& k) const; 362e5ec94a1SRuslan Arutyunyan template<typename K> 363e5ec94a1SRuslan Arutyunyan iterator find(const K& x); // C++20 364e5ec94a1SRuslan Arutyunyan template<typename K> 365e5ec94a1SRuslan Arutyunyan const_iterator find(const K& x) const; // C++20 3663e519524SHoward Hinnant size_type count(const key_type& k) const; 367e5ec94a1SRuslan Arutyunyan template<typename K> 368e5ec94a1SRuslan Arutyunyan size_type count(const K& k) const; // C++20 369a17b1aedSZoe Carver bool contains(const key_type& k) const; // C++20 370e5ec94a1SRuslan Arutyunyan template<typename K> 371e5ec94a1SRuslan Arutyunyan bool contains(const K& k) const; // C++20 3723e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 3733e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 374e5ec94a1SRuslan Arutyunyan template<typename K> 375e5ec94a1SRuslan Arutyunyan pair<iterator, iterator> equal_range(const K& k); // C++20 376e5ec94a1SRuslan Arutyunyan template<typename K> 377e5ec94a1SRuslan Arutyunyan pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20 3783e519524SHoward Hinnant 379557da866SHoward Hinnant size_type bucket_count() const noexcept; 380557da866SHoward Hinnant size_type max_bucket_count() const noexcept; 3813e519524SHoward Hinnant 3823e519524SHoward Hinnant size_type bucket_size(size_type n) const; 3833e519524SHoward Hinnant size_type bucket(const key_type& k) const; 3843e519524SHoward Hinnant 3853e519524SHoward Hinnant local_iterator begin(size_type n); 3863e519524SHoward Hinnant local_iterator end(size_type n); 3873e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 3883e519524SHoward Hinnant const_local_iterator end(size_type n) const; 3893e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 3903e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 3913e519524SHoward Hinnant 392557da866SHoward Hinnant float load_factor() const noexcept; 393557da866SHoward Hinnant float max_load_factor() const noexcept; 3943e519524SHoward Hinnant void max_load_factor(float z); 3953e519524SHoward Hinnant void rehash(size_type n); 3963e519524SHoward Hinnant void reserve(size_type n); 3973e519524SHoward Hinnant}; 3983e519524SHoward Hinnant 39968072a71SKonstantin Varlamovtemplate<class InputIterator, 40068072a71SKonstantin Varlamov class Hash = hash<typename iterator_traits<InputIterator>::value_type>, 40168072a71SKonstantin Varlamov class Pred = equal_to<typename iterator_traits<InputIterator>::value_type>, 40268072a71SKonstantin Varlamov class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 40368072a71SKonstantin Varlamovunordered_multiset(InputIterator, InputIterator, see below::size_type = see below, 40468072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 40568072a71SKonstantin Varlamov -> unordered_multiset<typename iterator_traits<InputIterator>::value_type, 40668072a71SKonstantin Varlamov Hash, Pred, Allocator>; // C++17 40768072a71SKonstantin Varlamov 40868072a71SKonstantin Varlamovtemplate<class T, class Hash = hash<T>, 40968072a71SKonstantin Varlamov class Pred = equal_to<T>, class Allocator = allocator<T>> 41068072a71SKonstantin Varlamovunordered_multiset(initializer_list<T>, typename see below::size_type = see below, 41168072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 41268072a71SKonstantin Varlamov -> unordered_multiset<T, Hash, Pred, Allocator>; // C++17 41368072a71SKonstantin Varlamov 41468072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 41568072a71SKonstantin Varlamovunordered_multiset(InputIterator, InputIterator, typename see below::size_type, Allocator) 41668072a71SKonstantin Varlamov -> unordered_multiset<typename iterator_traits<InputIterator>::value_type, 41768072a71SKonstantin Varlamov hash<typename iterator_traits<InputIterator>::value_type>, 41868072a71SKonstantin Varlamov equal_to<typename iterator_traits<InputIterator>::value_type>, 41968072a71SKonstantin Varlamov Allocator>; // C++17 42068072a71SKonstantin Varlamov 42168072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator> 42268072a71SKonstantin Varlamovunordered_multiset(InputIterator, InputIterator, typename see below::size_type, 42368072a71SKonstantin Varlamov Hash, Allocator) 42468072a71SKonstantin Varlamov -> unordered_multiset<typename iterator_traits<InputIterator>::value_type, Hash, 42568072a71SKonstantin Varlamov equal_to<typename iterator_traits<InputIterator>::value_type>, Allocator>; // C++17 42668072a71SKonstantin Varlamov 42768072a71SKonstantin Varlamovtemplate<class T, class Allocator> 42868072a71SKonstantin Varlamovunordered_multiset(initializer_list<T>, typename see below::size_type, Allocator) 42968072a71SKonstantin Varlamov -> unordered_multiset<T, hash<T>, equal_to<T>, Allocator>; // C++17 43068072a71SKonstantin Varlamov 43168072a71SKonstantin Varlamovtemplate<class T, class Hash, class Allocator> 43268072a71SKonstantin Varlamovunordered_multiset(initializer_list<T>, typename see below::size_type, Hash, Allocator) 43368072a71SKonstantin Varlamov -> unordered_multiset<T, Hash, equal_to<T>, Allocator>; // C++17 43468072a71SKonstantin Varlamov 4353e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 4363e519524SHoward Hinnant void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, 437557da866SHoward Hinnant unordered_multiset<Value, Hash, Pred, Alloc>& y) 438557da866SHoward Hinnant noexcept(noexcept(x.swap(y))); 4393e519524SHoward Hinnant 440f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 4413e895085SMarek Kurdej typename unordered_set<K, T, H, P, A>::size_type 4423e895085SMarek Kurdej erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred); // C++20 443f60c63c0SMarshall Clow 444f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 4453e895085SMarek Kurdej typename unordered_multiset<K, T, H, P, A>::size_type 4463e895085SMarek Kurdej erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred); // C++20 447f60c63c0SMarshall Clow 448f60c63c0SMarshall Clow 4493e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 4503e519524SHoward Hinnant bool 4513e519524SHoward Hinnant operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x, 4523e519524SHoward Hinnant const unordered_multiset<Value, Hash, Pred, Alloc>& y); 4533e519524SHoward Hinnant 4543e519524SHoward Hinnanttemplate <class Value, class Hash, class Pred, class Alloc> 4553e519524SHoward Hinnant bool 4563e519524SHoward Hinnant operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x, 4573e519524SHoward Hinnant const unordered_multiset<Value, Hash, Pred, Alloc>& y); 4583e519524SHoward Hinnant} // std 4593e519524SHoward Hinnant 4603e519524SHoward Hinnant*/ 4613e519524SHoward Hinnant 4622e2f3158SNikolas Klauser#include <__algorithm/is_permutation.h> 463385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 4643e519524SHoward Hinnant#include <__config> 465bfbd73f8SArthur O'Dwyer#include <__debug> 466050b064fSChristopher Di Bella#include <__functional/is_transparent.h> 46734f73804SNikolas Klauser#include <__functional/operations.h> 4683e519524SHoward Hinnant#include <__hash_table> 4693cd4531bSNikolas Klauser#include <__iterator/distance.h> 4703cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h> 4713cd4531bSNikolas Klauser#include <__iterator/iterator_traits.h> 47226544b98SMark de Wever#include <__memory/addressof.h> 473b0386a51SErik Pilkington#include <__node_handle> 4746adbc83eSChristopher Di Bella#include <__utility/forward.h> 475f56972e2SMarshall Clow#include <version> 4763e519524SHoward Hinnant 477de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 478de4a57cbSLouis Dionne# include <functional> 479de4a57cbSLouis Dionne# include <iterator> 480de4a57cbSLouis Dionne#endif 481de4a57cbSLouis Dionne 482db1978b6SNikolas Klauser// standard-mandated includes 483db1978b6SNikolas Klauser 484db1978b6SNikolas Klauser// [iterator.range] 485db1978b6SNikolas Klauser#include <__iterator/access.h> 486db1978b6SNikolas Klauser#include <__iterator/data.h> 487db1978b6SNikolas Klauser#include <__iterator/empty.h> 488db1978b6SNikolas Klauser#include <__iterator/reverse_access.h> 489db1978b6SNikolas Klauser#include <__iterator/size.h> 490db1978b6SNikolas Klauser 491db1978b6SNikolas Klauser// [unord.set.syn] 492db1978b6SNikolas Klauser#include <compare> 493db1978b6SNikolas Klauser#include <initializer_list> 494db1978b6SNikolas Klauser 495073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4963e519524SHoward Hinnant# pragma GCC system_header 497073458b1SHoward Hinnant#endif 4983e519524SHoward Hinnant 4993e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 5003e519524SHoward Hinnant 5015c4e07aeSErik Pilkingtontemplate <class _Value, class _Hash, class _Pred, class _Alloc> 5025c4e07aeSErik Pilkingtonclass unordered_multiset; 5035c4e07aeSErik Pilkington 5043e519524SHoward Hinnanttemplate <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, 5053e519524SHoward Hinnant class _Alloc = allocator<_Value> > 506e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_set 5073e519524SHoward Hinnant{ 5083e519524SHoward Hinnantpublic: 5093e519524SHoward Hinnant // types 5103e519524SHoward Hinnant typedef _Value key_type; 5113e519524SHoward Hinnant typedef key_type value_type; 5123c6bd176SNikolas Klauser typedef __type_identity_t<_Hash> hasher; 5133c6bd176SNikolas Klauser typedef __type_identity_t<_Pred> key_equal; 5143c6bd176SNikolas Klauser typedef __type_identity_t<_Alloc> allocator_type; 5153e519524SHoward Hinnant typedef value_type& reference; 5163e519524SHoward Hinnant typedef const value_type& const_reference; 517b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 518b24c8024SHoward Hinnant "Invalid allocator::value_type"); 5193e519524SHoward Hinnant 5203e519524SHoward Hinnantprivate: 5213e519524SHoward Hinnant typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; 5223e519524SHoward Hinnant 5233e519524SHoward Hinnant __table __table_; 5243e519524SHoward Hinnant 5253e519524SHoward Hinnantpublic: 5263e519524SHoward Hinnant typedef typename __table::pointer pointer; 5273e519524SHoward Hinnant typedef typename __table::const_pointer const_pointer; 5283e519524SHoward Hinnant typedef typename __table::size_type size_type; 5293e519524SHoward Hinnant typedef typename __table::difference_type difference_type; 5303e519524SHoward Hinnant 5313e519524SHoward Hinnant typedef typename __table::const_iterator iterator; 5323e519524SHoward Hinnant typedef typename __table::const_iterator const_iterator; 5333e519524SHoward Hinnant typedef typename __table::const_local_iterator local_iterator; 5343e519524SHoward Hinnant typedef typename __table::const_local_iterator const_local_iterator; 5353e519524SHoward Hinnant 536b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 537b0386a51SErik Pilkington typedef __set_node_handle<typename __table::__node, allocator_type> node_type; 538b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 539b0386a51SErik Pilkington#endif 540b0386a51SErik Pilkington 5415c4e07aeSErik Pilkington template <class _Value2, class _Hash2, class _Pred2, class _Alloc2> 5425c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_set; 5435c4e07aeSErik Pilkington template <class _Value2, class _Hash2, class _Pred2, class _Alloc2> 5445c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multiset; 5455c4e07aeSErik Pilkington 546789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 547557da866SHoward Hinnant unordered_set() 548557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 549b24c8024SHoward Hinnant { 550e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 551b24c8024SHoward Hinnant } 5523e519524SHoward Hinnant explicit unordered_set(size_type __n, const hasher& __hf = hasher(), 5533e519524SHoward Hinnant const key_equal& __eql = key_equal()); 55445b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 55545b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 55645b983c4SMarshall Clow unordered_set(size_type __n, const allocator_type& __a) 55745b983c4SMarshall Clow : unordered_set(__n, hasher(), key_equal(), __a) {} 55845b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 55945b983c4SMarshall Clow unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a) 56045b983c4SMarshall Clow : unordered_set(__n, __hf, key_equal(), __a) {} 56145b983c4SMarshall Clow#endif 5623e519524SHoward Hinnant unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql, 5633e519524SHoward Hinnant const allocator_type& __a); 5643e519524SHoward Hinnant template <class _InputIterator> 5653e519524SHoward Hinnant unordered_set(_InputIterator __first, _InputIterator __last); 5663e519524SHoward Hinnant template <class _InputIterator> 5673e519524SHoward Hinnant unordered_set(_InputIterator __first, _InputIterator __last, 5683e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 5693e519524SHoward Hinnant const key_equal& __eql = key_equal()); 5703e519524SHoward Hinnant template <class _InputIterator> 5713e519524SHoward Hinnant unordered_set(_InputIterator __first, _InputIterator __last, 5723e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 5733e519524SHoward Hinnant const allocator_type& __a); 57445b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 57545b983c4SMarshall Clow template <class _InputIterator> 57645b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 57745b983c4SMarshall Clow unordered_set(_InputIterator __first, _InputIterator __last, 57845b983c4SMarshall Clow size_type __n, const allocator_type& __a) 57945b983c4SMarshall Clow : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {} 58045b983c4SMarshall Clow template <class _InputIterator> 58145b983c4SMarshall Clow unordered_set(_InputIterator __first, _InputIterator __last, 58245b983c4SMarshall Clow size_type __n, const hasher& __hf, const allocator_type& __a) 58345b983c4SMarshall Clow : unordered_set(__first, __last, __n, __hf, key_equal(), __a) {} 58445b983c4SMarshall Clow#endif 585cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 5863e519524SHoward Hinnant explicit unordered_set(const allocator_type& __a); 5873e519524SHoward Hinnant unordered_set(const unordered_set& __u); 5883e519524SHoward Hinnant unordered_set(const unordered_set& __u, const allocator_type& __a); 589f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 590cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 591557da866SHoward Hinnant unordered_set(unordered_set&& __u) 592557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 5933e519524SHoward Hinnant unordered_set(unordered_set&& __u, const allocator_type& __a); 5943e519524SHoward Hinnant unordered_set(initializer_list<value_type> __il); 5953e519524SHoward Hinnant unordered_set(initializer_list<value_type> __il, size_type __n, 5963e519524SHoward Hinnant const hasher& __hf = hasher(), 5973e519524SHoward Hinnant const key_equal& __eql = key_equal()); 5983e519524SHoward Hinnant unordered_set(initializer_list<value_type> __il, size_type __n, 5993e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 6003e519524SHoward Hinnant const allocator_type& __a); 60145b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 60245b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 60345b983c4SMarshall Clow unordered_set(initializer_list<value_type> __il, size_type __n, 60445b983c4SMarshall Clow const allocator_type& __a) 60545b983c4SMarshall Clow : unordered_set(__il, __n, hasher(), key_equal(), __a) {} 60645b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 60745b983c4SMarshall Clow unordered_set(initializer_list<value_type> __il, size_type __n, 60845b983c4SMarshall Clow const hasher& __hf, const allocator_type& __a) 60945b983c4SMarshall Clow : unordered_set(__il, __n, __hf, key_equal(), __a) {} 61045b983c4SMarshall Clow#endif 611f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 6127c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 6137c142fccSLouis Dionne ~unordered_set() { 6147c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Value, _Hash, _Pred>(0)), ""); 6157c142fccSLouis Dionne } 6167c142fccSLouis Dionne 6175a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6185a33687dSHoward Hinnant unordered_set& operator=(const unordered_set& __u) 6195a33687dSHoward Hinnant { 6205a33687dSHoward Hinnant __table_ = __u.__table_; 6215a33687dSHoward Hinnant return *this; 6225a33687dSHoward Hinnant } 623f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 624cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 625557da866SHoward Hinnant unordered_set& operator=(unordered_set&& __u) 626557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 627cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 6283e519524SHoward Hinnant unordered_set& operator=(initializer_list<value_type> __il); 629f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 6303e519524SHoward Hinnant 631789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 632557da866SHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 6333e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 6343e519524SHoward Hinnant 63572c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 636557da866SHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 637789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 638557da866SHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 639789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 640557da866SHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 6413e519524SHoward Hinnant 642789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 643557da866SHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 644789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 645557da866SHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 646789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 647557da866SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 648789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 649557da866SHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 650789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 651557da866SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 652789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 653557da866SHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 6543e519524SHoward Hinnant 655f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6563e519524SHoward Hinnant template <class... _Args> 657789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6583e519524SHoward Hinnant pair<iterator, bool> emplace(_Args&&... __args) 659ce48a113SHoward Hinnant {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} 6603e519524SHoward Hinnant template <class... _Args> 661789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 662c87c8917SLouis Dionne iterator emplace_hint(const_iterator __p, _Args&&... __args) { 663c87c8917SLouis Dionne _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__p)) == this, 664b24c8024SHoward Hinnant "unordered_set::emplace_hint(const_iterator, args...) called with an iterator not" 665b24c8024SHoward Hinnant " referring to this unordered_set"); 666c87c8917SLouis Dionne (void)__p; 667c87c8917SLouis Dionne return __table_.__emplace_unique(std::forward<_Args>(__args)...).first; 668b24c8024SHoward Hinnant } 669f0f86ef9SEric Fiselier 670789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6713e519524SHoward Hinnant pair<iterator, bool> insert(value_type&& __x) 672ce48a113SHoward Hinnant {return __table_.__insert_unique(_VSTD::move(__x));} 673789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 674c87c8917SLouis Dionne iterator insert(const_iterator __p, value_type&& __x) { 675c87c8917SLouis Dionne _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__p)) == this, 676b24c8024SHoward Hinnant "unordered_set::insert(const_iterator, value_type&&) called with an iterator not" 677b24c8024SHoward Hinnant " referring to this unordered_set"); 678c87c8917SLouis Dionne (void)__p; 679c87c8917SLouis Dionne return insert(std::move(__x)).first; 680b24c8024SHoward Hinnant } 681c87c8917SLouis Dionne 682789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6833e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 6843e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 685f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 686f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 687f0f86ef9SEric Fiselier pair<iterator, bool> insert(const value_type& __x) 688f0f86ef9SEric Fiselier {return __table_.__insert_unique(__x);} 689f0f86ef9SEric Fiselier 690f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 691c87c8917SLouis Dionne iterator insert(const_iterator __p, const value_type& __x) { 692c87c8917SLouis Dionne _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__p)) == this, 693f0f86ef9SEric Fiselier "unordered_set::insert(const_iterator, const value_type&) called with an iterator not" 694f0f86ef9SEric Fiselier " referring to this unordered_set"); 695c87c8917SLouis Dionne (void)__p; 696f0f86ef9SEric Fiselier return insert(__x).first; 697f0f86ef9SEric Fiselier } 698f0f86ef9SEric Fiselier template <class _InputIterator> 699f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 700f0f86ef9SEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 7013e519524SHoward Hinnant 702789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7033e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p);} 704789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7053e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 706789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7073e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 7083e519524SHoward Hinnant {return __table_.erase(__first, __last);} 709789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 710557da866SHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 7113e519524SHoward Hinnant 712b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 713b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 714b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 715b0386a51SErik Pilkington { 716b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 717b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_set::insert()"); 718b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique< 719b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 720b0386a51SErik Pilkington } 721b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 722b0386a51SErik Pilkington iterator insert(const_iterator __h, node_type&& __nh) 723b0386a51SErik Pilkington { 724b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 725b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_set::insert()"); 726b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique<node_type>( 727b0386a51SErik Pilkington __h, _VSTD::move(__nh)); 728b0386a51SErik Pilkington } 729b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 730b0386a51SErik Pilkington node_type extract(key_type const& __key) 731b0386a51SErik Pilkington { 732b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 733b0386a51SErik Pilkington } 734b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 735b0386a51SErik Pilkington node_type extract(const_iterator __it) 736b0386a51SErik Pilkington { 737b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__it); 738b0386a51SErik Pilkington } 7395c4e07aeSErik Pilkington 7405c4e07aeSErik Pilkington template<class _H2, class _P2> 7415c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 7425c4e07aeSErik Pilkington void merge(unordered_set<key_type, _H2, _P2, allocator_type>& __source) 7435c4e07aeSErik Pilkington { 7445c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 7455c4e07aeSErik Pilkington "merging container with incompatible allocator"); 7465c4e07aeSErik Pilkington __table_.__node_handle_merge_unique(__source.__table_); 7475c4e07aeSErik Pilkington } 7485c4e07aeSErik Pilkington template<class _H2, class _P2> 7495c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 7505c4e07aeSErik Pilkington void merge(unordered_set<key_type, _H2, _P2, allocator_type>&& __source) 7515c4e07aeSErik Pilkington { 7525c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 7535c4e07aeSErik Pilkington "merging container with incompatible allocator"); 7545c4e07aeSErik Pilkington __table_.__node_handle_merge_unique(__source.__table_); 7555c4e07aeSErik Pilkington } 7565c4e07aeSErik Pilkington template<class _H2, class _P2> 7575c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 7585c4e07aeSErik Pilkington void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>& __source) 7595c4e07aeSErik Pilkington { 7605c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 7615c4e07aeSErik Pilkington "merging container with incompatible allocator"); 7625c4e07aeSErik Pilkington __table_.__node_handle_merge_unique(__source.__table_); 7635c4e07aeSErik Pilkington } 7645c4e07aeSErik Pilkington template<class _H2, class _P2> 7655c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 7665c4e07aeSErik Pilkington void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>&& __source) 7675c4e07aeSErik Pilkington { 7685c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 7695c4e07aeSErik Pilkington "merging container with incompatible allocator"); 7705c4e07aeSErik Pilkington __table_.__node_handle_merge_unique(__source.__table_); 7715c4e07aeSErik Pilkington } 772b0386a51SErik Pilkington#endif 773b0386a51SErik Pilkington 774789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 775557da866SHoward Hinnant void swap(unordered_set& __u) 776557da866SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 777557da866SHoward Hinnant {__table_.swap(__u.__table_);} 7783e519524SHoward Hinnant 779789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7803e519524SHoward Hinnant hasher hash_function() const {return __table_.hash_function();} 781789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7823e519524SHoward Hinnant key_equal key_eq() const {return __table_.key_eq();} 7833e519524SHoward Hinnant 784789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7853e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 786789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7873e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 788e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 789d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 790e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 791d5db71d1SArthur O'Dwyer iterator find(const _K2& __k) {return __table_.find(__k);} 792d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 793e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 794d5db71d1SArthur O'Dwyer const_iterator find(const _K2& __k) const {return __table_.find(__k);} 795e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 796d5db71d1SArthur O'Dwyer 797789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7983e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 799a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 800d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 801e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 802d5db71d1SArthur O'Dwyer size_type count(const _K2& __k) const {return __table_.__count_unique(__k);} 803e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 804d5db71d1SArthur O'Dwyer 805e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 806a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 807a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 808e5ec94a1SRuslan Arutyunyan 809d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 810e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 811d5db71d1SArthur O'Dwyer bool contains(const _K2& __k) const {return find(__k) != end();} 812a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 813d5db71d1SArthur O'Dwyer 814789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8153e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 8163e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 817789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8183e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 8193e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 820e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 821d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 822e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 823d5db71d1SArthur O'Dwyer pair<iterator, iterator> equal_range(const _K2& __k) 824d5db71d1SArthur O'Dwyer {return __table_.__equal_range_unique(__k);} 825d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 826e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 827d5db71d1SArthur O'Dwyer pair<const_iterator, const_iterator> equal_range(const _K2& __k) const 828d5db71d1SArthur O'Dwyer {return __table_.__equal_range_unique(__k);} 829e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 8303e519524SHoward Hinnant 831789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 832557da866SHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 833789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 834557da866SHoward Hinnant size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 8353e519524SHoward Hinnant 836789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8373e519524SHoward Hinnant size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} 838789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8393e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 8403e519524SHoward Hinnant 841789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8423e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 843789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8443e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 845789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8463e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 847789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8483e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 849789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8503e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 851789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8523e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 8533e519524SHoward Hinnant 854789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 855557da866SHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 856789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 857557da866SHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 858789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8593e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 860789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 861*3085e42fSIvan Trofimov void rehash(size_type __n) {__table_.__rehash_unique(__n);} 862789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 863*3085e42fSIvan Trofimov void reserve(size_type __n) {__table_.__reserve_unique(__n);} 864b24c8024SHoward Hinnant 865f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE 866b24c8024SHoward Hinnant 867b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 868b24c8024SHoward Hinnant {return __table_.__dereferenceable(__i);} 869b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 870b24c8024SHoward Hinnant {return __table_.__decrementable(__i);} 871b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 872b24c8024SHoward Hinnant {return __table_.__addable(__i, __n);} 873b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 874b24c8024SHoward Hinnant {return __table_.__addable(__i, __n);} 875b24c8024SHoward Hinnant 876f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE 877b24c8024SHoward Hinnant 8783e519524SHoward Hinnant}; 8793e519524SHoward Hinnant 88001666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 881296a8010SLouis Dionnetemplate<class _InputIterator, 882296a8010SLouis Dionne class _Hash = hash<__iter_value_type<_InputIterator>>, 883296a8010SLouis Dionne class _Pred = equal_to<__iter_value_type<_InputIterator>>, 884296a8010SLouis Dionne class _Allocator = allocator<__iter_value_type<_InputIterator>>, 88568072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 8864e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 8874e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 8884e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 8894e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 890296a8010SLouis Dionneunordered_set(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 891296a8010SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 892296a8010SLouis Dionne -> unordered_set<__iter_value_type<_InputIterator>, _Hash, _Pred, _Allocator>; 893296a8010SLouis Dionne 894296a8010SLouis Dionnetemplate<class _Tp, class _Hash = hash<_Tp>, 895296a8010SLouis Dionne class _Pred = equal_to<_Tp>, 896296a8010SLouis Dionne class _Allocator = allocator<_Tp>, 8974e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 8984e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 8994e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 9004e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 901296a8010SLouis Dionneunordered_set(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type = 0, 902296a8010SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 903296a8010SLouis Dionne -> unordered_set<_Tp, _Hash, _Pred, _Allocator>; 904296a8010SLouis Dionne 905296a8010SLouis Dionnetemplate<class _InputIterator, class _Allocator, 90668072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 9074e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 908296a8010SLouis Dionneunordered_set(_InputIterator, _InputIterator, 909296a8010SLouis Dionne typename allocator_traits<_Allocator>::size_type, _Allocator) 910296a8010SLouis Dionne -> unordered_set<__iter_value_type<_InputIterator>, 911296a8010SLouis Dionne hash<__iter_value_type<_InputIterator>>, 912296a8010SLouis Dionne equal_to<__iter_value_type<_InputIterator>>, 913296a8010SLouis Dionne _Allocator>; 914296a8010SLouis Dionne 915296a8010SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 91668072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 9174e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 9184e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 9194e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 920296a8010SLouis Dionneunordered_set(_InputIterator, _InputIterator, 921296a8010SLouis Dionne typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 922296a8010SLouis Dionne -> unordered_set<__iter_value_type<_InputIterator>, _Hash, 923296a8010SLouis Dionne equal_to<__iter_value_type<_InputIterator>>, 924296a8010SLouis Dionne _Allocator>; 925296a8010SLouis Dionne 926296a8010SLouis Dionnetemplate<class _Tp, class _Allocator, 9274e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 928296a8010SLouis Dionneunordered_set(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type, _Allocator) 929296a8010SLouis Dionne -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; 930296a8010SLouis Dionne 931296a8010SLouis Dionnetemplate<class _Tp, class _Hash, class _Allocator, 9324e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 9334e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 9344e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 935296a8010SLouis Dionneunordered_set(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 936296a8010SLouis Dionne -> unordered_set<_Tp, _Hash, equal_to<_Tp>, _Allocator>; 937296a8010SLouis Dionne#endif 938296a8010SLouis Dionne 9393e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 9403e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, 9413e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 9423e519524SHoward Hinnant : __table_(__hf, __eql) 9433e519524SHoward Hinnant{ 944e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 945*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 9463e519524SHoward Hinnant} 9473e519524SHoward Hinnant 9483e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 9493e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, 9503e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 9513e519524SHoward Hinnant : __table_(__hf, __eql, __a) 9523e519524SHoward Hinnant{ 953e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 954*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 9553e519524SHoward Hinnant} 9563e519524SHoward Hinnant 9573e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 9583e519524SHoward Hinnanttemplate <class _InputIterator> 9593e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 9603e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 9613e519524SHoward Hinnant{ 962e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 9633e519524SHoward Hinnant insert(__first, __last); 9643e519524SHoward Hinnant} 9653e519524SHoward Hinnant 9663e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 9673e519524SHoward Hinnanttemplate <class _InputIterator> 9683e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 9693e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 9703e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 9713e519524SHoward Hinnant : __table_(__hf, __eql) 9723e519524SHoward Hinnant{ 973e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 974*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 9753e519524SHoward Hinnant insert(__first, __last); 9763e519524SHoward Hinnant} 9773e519524SHoward Hinnant 9783e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 9793e519524SHoward Hinnanttemplate <class _InputIterator> 9803e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 9813e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 9823e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 9833e519524SHoward Hinnant : __table_(__hf, __eql, __a) 9843e519524SHoward Hinnant{ 985e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 986*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 9873e519524SHoward Hinnant insert(__first, __last); 9883e519524SHoward Hinnant} 9893e519524SHoward Hinnant 9903e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 991cd31b434SEvgeniy Stepanovinline 9923e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 9933e519524SHoward Hinnant const allocator_type& __a) 9943e519524SHoward Hinnant : __table_(__a) 9953e519524SHoward Hinnant{ 996e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 9973e519524SHoward Hinnant} 9983e519524SHoward Hinnant 9993e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10003e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10013e519524SHoward Hinnant const unordered_set& __u) 10023e519524SHoward Hinnant : __table_(__u.__table_) 10033e519524SHoward Hinnant{ 1004e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1005*3085e42fSIvan Trofimov __table_.__rehash_unique(__u.bucket_count()); 10063e519524SHoward Hinnant insert(__u.begin(), __u.end()); 10073e519524SHoward Hinnant} 10083e519524SHoward Hinnant 10093e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10103e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10113e519524SHoward Hinnant const unordered_set& __u, const allocator_type& __a) 10123e519524SHoward Hinnant : __table_(__u.__table_, __a) 10133e519524SHoward Hinnant{ 1014e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1015*3085e42fSIvan Trofimov __table_.__rehash_unique(__u.bucket_count()); 10163e519524SHoward Hinnant insert(__u.begin(), __u.end()); 10173e519524SHoward Hinnant} 10183e519524SHoward Hinnant 1019f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10203e519524SHoward Hinnant 10213e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1022cd31b434SEvgeniy Stepanovinline 10233e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10243e519524SHoward Hinnant unordered_set&& __u) 1025557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1026ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 10273e519524SHoward Hinnant{ 1028e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 102908f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 10303e519524SHoward Hinnant} 10313e519524SHoward Hinnant 10323e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10333e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10343e519524SHoward Hinnant unordered_set&& __u, const allocator_type& __a) 1035ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_), __a) 10363e519524SHoward Hinnant{ 1037e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 10383e519524SHoward Hinnant if (__a != __u.get_allocator()) 10393e519524SHoward Hinnant { 10403e519524SHoward Hinnant iterator __i = __u.begin(); 10413e519524SHoward Hinnant while (__u.size() != 0) 1042ce48a113SHoward Hinnant __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_)); 10433e519524SHoward Hinnant } 1044b24c8024SHoward Hinnant else 104508f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 10463e519524SHoward Hinnant} 10473e519524SHoward Hinnant 10483e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10493e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10503e519524SHoward Hinnant initializer_list<value_type> __il) 10513e519524SHoward Hinnant{ 1052e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 10533e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10543e519524SHoward Hinnant} 10553e519524SHoward Hinnant 10563e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10573e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10583e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 10593e519524SHoward Hinnant const key_equal& __eql) 10603e519524SHoward Hinnant : __table_(__hf, __eql) 10613e519524SHoward Hinnant{ 1062e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1063*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 10643e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10653e519524SHoward Hinnant} 10663e519524SHoward Hinnant 10673e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 10683e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( 10693e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 10703e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 10713e519524SHoward Hinnant : __table_(__hf, __eql, __a) 10723e519524SHoward Hinnant{ 1073e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1074*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 10753e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10763e519524SHoward Hinnant} 10773e519524SHoward Hinnant 10783e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1079cd31b434SEvgeniy Stepanovinline 10803e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>& 10813e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u) 1082557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 10833e519524SHoward Hinnant{ 1084ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 10853e519524SHoward Hinnant return *this; 10863e519524SHoward Hinnant} 10873e519524SHoward Hinnant 10883e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1089cd31b434SEvgeniy Stepanovinline 10903e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>& 10913e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::operator=( 10923e519524SHoward Hinnant initializer_list<value_type> __il) 10933e519524SHoward Hinnant{ 10943e519524SHoward Hinnant __table_.__assign_unique(__il.begin(), __il.end()); 10953e519524SHoward Hinnant return *this; 10963e519524SHoward Hinnant} 10973e519524SHoward Hinnant 1098f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 109954976f26SHoward Hinnant 11003e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 11013e519524SHoward Hinnanttemplate <class _InputIterator> 1102cd31b434SEvgeniy Stepanovinline 11033e519524SHoward Hinnantvoid 11043e519524SHoward Hinnantunordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 11053e519524SHoward Hinnant _InputIterator __last) 11063e519524SHoward Hinnant{ 11073e519524SHoward Hinnant for (; __first != __last; ++__first) 11083e519524SHoward Hinnant __table_.__insert_unique(*__first); 11093e519524SHoward Hinnant} 11103e519524SHoward Hinnant 11113e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1112789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11133e519524SHoward Hinnantvoid 11143e519524SHoward Hinnantswap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 11153e519524SHoward Hinnant unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 1116557da866SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 11173e519524SHoward Hinnant{ 11183e519524SHoward Hinnant __x.swap(__y); 11193e519524SHoward Hinnant} 11203e519524SHoward Hinnant 1121f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 11223e895085SMarek Kurdejtemplate <class _Value, class _Hash, class _Pred, class _Alloc, 11233e895085SMarek Kurdej class _Predicate> 1124f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 11253e895085SMarek Kurdej typename unordered_set<_Value, _Hash, _Pred, _Alloc>::size_type 11263e895085SMarek Kurdej erase_if(unordered_set<_Value, _Hash, _Pred, _Alloc>& __c, 11273e895085SMarek Kurdej _Predicate __pred) { 11282ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 11293e895085SMarek Kurdej} 1130f60c63c0SMarshall Clow#endif 1131f60c63c0SMarshall Clow 11323e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 11333e519524SHoward Hinnantbool 11343e519524SHoward Hinnantoperator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 11353e519524SHoward Hinnant const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 11363e519524SHoward Hinnant{ 11373e519524SHoward Hinnant if (__x.size() != __y.size()) 11383e519524SHoward Hinnant return false; 11393e519524SHoward Hinnant typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator 11403e519524SHoward Hinnant const_iterator; 11413e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 11423e519524SHoward Hinnant __i != __ex; ++__i) 11433e519524SHoward Hinnant { 11443e519524SHoward Hinnant const_iterator __j = __y.find(*__i); 11453e519524SHoward Hinnant if (__j == __ey || !(*__i == *__j)) 11463e519524SHoward Hinnant return false; 11473e519524SHoward Hinnant } 11483e519524SHoward Hinnant return true; 11493e519524SHoward Hinnant} 11503e519524SHoward Hinnant 11513e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1152789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11533e519524SHoward Hinnantbool 11543e519524SHoward Hinnantoperator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, 11553e519524SHoward Hinnant const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) 11563e519524SHoward Hinnant{ 11573e519524SHoward Hinnant return !(__x == __y); 11583e519524SHoward Hinnant} 11593e519524SHoward Hinnant 11603e519524SHoward Hinnanttemplate <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, 11613e519524SHoward Hinnant class _Alloc = allocator<_Value> > 1162e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multiset 11633e519524SHoward Hinnant{ 11643e519524SHoward Hinnantpublic: 11653e519524SHoward Hinnant // types 11663e519524SHoward Hinnant typedef _Value key_type; 11673e519524SHoward Hinnant typedef key_type value_type; 11683c6bd176SNikolas Klauser typedef __type_identity_t<_Hash> hasher; 11693c6bd176SNikolas Klauser typedef __type_identity_t<_Pred> key_equal; 11703c6bd176SNikolas Klauser typedef __type_identity_t<_Alloc> allocator_type; 11713e519524SHoward Hinnant typedef value_type& reference; 11723e519524SHoward Hinnant typedef const value_type& const_reference; 1173b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1174b24c8024SHoward Hinnant "Invalid allocator::value_type"); 11753e519524SHoward Hinnant 11763e519524SHoward Hinnantprivate: 11773e519524SHoward Hinnant typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; 11783e519524SHoward Hinnant 11793e519524SHoward Hinnant __table __table_; 11803e519524SHoward Hinnant 11813e519524SHoward Hinnantpublic: 11823e519524SHoward Hinnant typedef typename __table::pointer pointer; 11833e519524SHoward Hinnant typedef typename __table::const_pointer const_pointer; 11843e519524SHoward Hinnant typedef typename __table::size_type size_type; 11853e519524SHoward Hinnant typedef typename __table::difference_type difference_type; 11863e519524SHoward Hinnant 11873e519524SHoward Hinnant typedef typename __table::const_iterator iterator; 11883e519524SHoward Hinnant typedef typename __table::const_iterator const_iterator; 11893e519524SHoward Hinnant typedef typename __table::const_local_iterator local_iterator; 11903e519524SHoward Hinnant typedef typename __table::const_local_iterator const_local_iterator; 11913e519524SHoward Hinnant 1192b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1193b0386a51SErik Pilkington typedef __set_node_handle<typename __table::__node, allocator_type> node_type; 1194b0386a51SErik Pilkington#endif 1195b0386a51SErik Pilkington 11965c4e07aeSErik Pilkington template <class _Value2, class _Hash2, class _Pred2, class _Alloc2> 11975c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_set; 11985c4e07aeSErik Pilkington template <class _Value2, class _Hash2, class _Pred2, class _Alloc2> 11995c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multiset; 12005c4e07aeSErik Pilkington 1201789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1202557da866SHoward Hinnant unordered_multiset() 1203557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1204b24c8024SHoward Hinnant { 1205e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1206b24c8024SHoward Hinnant } 12073e519524SHoward Hinnant explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(), 12083e519524SHoward Hinnant const key_equal& __eql = key_equal()); 12093e519524SHoward Hinnant unordered_multiset(size_type __n, const hasher& __hf, 12103e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a); 121145b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 121245b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 121345b983c4SMarshall Clow unordered_multiset(size_type __n, const allocator_type& __a) 121445b983c4SMarshall Clow : unordered_multiset(__n, hasher(), key_equal(), __a) {} 121545b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 121645b983c4SMarshall Clow unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a) 121745b983c4SMarshall Clow : unordered_multiset(__n, __hf, key_equal(), __a) {} 121845b983c4SMarshall Clow#endif 12193e519524SHoward Hinnant template <class _InputIterator> 12203e519524SHoward Hinnant unordered_multiset(_InputIterator __first, _InputIterator __last); 12213e519524SHoward Hinnant template <class _InputIterator> 12223e519524SHoward Hinnant unordered_multiset(_InputIterator __first, _InputIterator __last, 12233e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 12243e519524SHoward Hinnant const key_equal& __eql = key_equal()); 12253e519524SHoward Hinnant template <class _InputIterator> 12263e519524SHoward Hinnant unordered_multiset(_InputIterator __first, _InputIterator __last, 12273e519524SHoward Hinnant size_type __n , const hasher& __hf, 12283e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a); 122945b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 123045b983c4SMarshall Clow template <class _InputIterator> 123145b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 123245b983c4SMarshall Clow unordered_multiset(_InputIterator __first, _InputIterator __last, 123345b983c4SMarshall Clow size_type __n, const allocator_type& __a) 123445b983c4SMarshall Clow : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {} 123545b983c4SMarshall Clow template <class _InputIterator> 123645b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 123745b983c4SMarshall Clow unordered_multiset(_InputIterator __first, _InputIterator __last, 123845b983c4SMarshall Clow size_type __n, const hasher& __hf, const allocator_type& __a) 123945b983c4SMarshall Clow : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {} 124045b983c4SMarshall Clow#endif 1241cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 12423e519524SHoward Hinnant explicit unordered_multiset(const allocator_type& __a); 12433e519524SHoward Hinnant unordered_multiset(const unordered_multiset& __u); 12443e519524SHoward Hinnant unordered_multiset(const unordered_multiset& __u, const allocator_type& __a); 1245f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1246cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 1247557da866SHoward Hinnant unordered_multiset(unordered_multiset&& __u) 1248557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 12493e519524SHoward Hinnant unordered_multiset(unordered_multiset&& __u, const allocator_type& __a); 12503e519524SHoward Hinnant unordered_multiset(initializer_list<value_type> __il); 12513e519524SHoward Hinnant unordered_multiset(initializer_list<value_type> __il, size_type __n, 12523e519524SHoward Hinnant const hasher& __hf = hasher(), 12533e519524SHoward Hinnant const key_equal& __eql = key_equal()); 12543e519524SHoward Hinnant unordered_multiset(initializer_list<value_type> __il, size_type __n, 12553e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 12563e519524SHoward Hinnant const allocator_type& __a); 125745b983c4SMarshall Clow#if _LIBCPP_STD_VER > 11 125845b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 125945b983c4SMarshall Clow unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 126045b983c4SMarshall Clow : unordered_multiset(__il, __n, hasher(), key_equal(), __a) {} 126145b983c4SMarshall Clow inline _LIBCPP_INLINE_VISIBILITY 126245b983c4SMarshall Clow unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a) 126345b983c4SMarshall Clow : unordered_multiset(__il, __n, __hf, key_equal(), __a) {} 126445b983c4SMarshall Clow#endif 1265f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 12667c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 12677c142fccSLouis Dionne ~unordered_multiset() { 12687c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Value, _Hash, _Pred>(0)), ""); 12697c142fccSLouis Dionne } 12707c142fccSLouis Dionne 12715a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12725a33687dSHoward Hinnant unordered_multiset& operator=(const unordered_multiset& __u) 12735a33687dSHoward Hinnant { 12745a33687dSHoward Hinnant __table_ = __u.__table_; 12755a33687dSHoward Hinnant return *this; 12765a33687dSHoward Hinnant } 1277f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1278cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 1279557da866SHoward Hinnant unordered_multiset& operator=(unordered_multiset&& __u) 1280557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 12813e519524SHoward Hinnant unordered_multiset& operator=(initializer_list<value_type> __il); 1282f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 12833e519524SHoward Hinnant 1284789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1285557da866SHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 12863e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 12873e519524SHoward Hinnant 128872c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1289557da866SHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1290789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1291557da866SHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 1292789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1293557da866SHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 12943e519524SHoward Hinnant 1295789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1296557da866SHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 1297789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1298557da866SHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 1299789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1300557da866SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1301789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1302557da866SHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 1303789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1304557da866SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1305789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1306557da866SHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 13073e519524SHoward Hinnant 1308f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13093e519524SHoward Hinnant template <class... _Args> 1310789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13113e519524SHoward Hinnant iterator emplace(_Args&&... __args) 1312ce48a113SHoward Hinnant {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} 13133e519524SHoward Hinnant template <class... _Args> 1314789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13153e519524SHoward Hinnant iterator emplace_hint(const_iterator __p, _Args&&... __args) 1316ce48a113SHoward Hinnant {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} 1317f0f86ef9SEric Fiselier 1318789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1319ce48a113SHoward Hinnant iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} 1320789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13213e519524SHoward Hinnant iterator insert(const_iterator __p, value_type&& __x) 1322ce48a113SHoward Hinnant {return __table_.__insert_multi(__p, _VSTD::move(__x));} 1323789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13243e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 13253e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 1326f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 1327f0f86ef9SEric Fiselier 1328f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1329f0f86ef9SEric Fiselier iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 1330f0f86ef9SEric Fiselier 1331f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1332f0f86ef9SEric Fiselier iterator insert(const_iterator __p, const value_type& __x) 1333f0f86ef9SEric Fiselier {return __table_.__insert_multi(__p, __x);} 1334f0f86ef9SEric Fiselier 1335f0f86ef9SEric Fiselier template <class _InputIterator> 1336f0f86ef9SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1337f0f86ef9SEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 13383e519524SHoward Hinnant 1339b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1340b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1341b0386a51SErik Pilkington iterator insert(node_type&& __nh) 1342b0386a51SErik Pilkington { 1343b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1344b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multiset::insert()"); 1345b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 1346b0386a51SErik Pilkington _VSTD::move(__nh)); 1347b0386a51SErik Pilkington } 1348b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1349b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1350b0386a51SErik Pilkington { 1351b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1352b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multiset::insert()"); 1353b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 1354b0386a51SErik Pilkington __hint, _VSTD::move(__nh)); 1355b0386a51SErik Pilkington } 1356b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1357b0386a51SErik Pilkington node_type extract(const_iterator __position) 1358b0386a51SErik Pilkington { 1359b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 1360b0386a51SErik Pilkington __position); 1361b0386a51SErik Pilkington } 1362b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1363b0386a51SErik Pilkington node_type extract(key_type const& __key) 1364b0386a51SErik Pilkington { 1365b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 1366b0386a51SErik Pilkington } 13675c4e07aeSErik Pilkington 13685c4e07aeSErik Pilkington template <class _H2, class _P2> 13695c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13705c4e07aeSErik Pilkington void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>& __source) 13715c4e07aeSErik Pilkington { 13725c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13735c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13745c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 13755c4e07aeSErik Pilkington } 13765c4e07aeSErik Pilkington template <class _H2, class _P2> 13775c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13785c4e07aeSErik Pilkington void merge(unordered_multiset<key_type, _H2, _P2, allocator_type>&& __source) 13795c4e07aeSErik Pilkington { 13805c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13815c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13825c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 13835c4e07aeSErik Pilkington } 13845c4e07aeSErik Pilkington template <class _H2, class _P2> 13855c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13865c4e07aeSErik Pilkington void merge(unordered_set<key_type, _H2, _P2, allocator_type>& __source) 13875c4e07aeSErik Pilkington { 13885c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13895c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13905c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 13915c4e07aeSErik Pilkington } 13925c4e07aeSErik Pilkington template <class _H2, class _P2> 13935c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13945c4e07aeSErik Pilkington void merge(unordered_set<key_type, _H2, _P2, allocator_type>&& __source) 13955c4e07aeSErik Pilkington { 13965c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13975c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13985c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 13995c4e07aeSErik Pilkington } 1400b0386a51SErik Pilkington#endif 1401b0386a51SErik Pilkington 1402789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14033e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p);} 1404789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14053e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 1406789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14073e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 14083e519524SHoward Hinnant {return __table_.erase(__first, __last);} 1409789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1410557da866SHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 14113e519524SHoward Hinnant 1412789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1413557da866SHoward Hinnant void swap(unordered_multiset& __u) 1414557da866SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 1415557da866SHoward Hinnant {__table_.swap(__u.__table_);} 14163e519524SHoward Hinnant 1417789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14183e519524SHoward Hinnant hasher hash_function() const {return __table_.hash_function();} 1419789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14203e519524SHoward Hinnant key_equal key_eq() const {return __table_.key_eq();} 14213e519524SHoward Hinnant 1422789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14233e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 1424789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14253e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1426e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1427d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1428e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1429d5db71d1SArthur O'Dwyer iterator find(const _K2& __k) {return __table_.find(__k);} 1430d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1431e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1432d5db71d1SArthur O'Dwyer const_iterator find(const _K2& __k) const {return __table_.find(__k);} 1433e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 1434d5db71d1SArthur O'Dwyer 1435789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14363e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 1437a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 1438d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1439e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1440d5db71d1SArthur O'Dwyer size_type count(const _K2& __k) const {return __table_.__count_multi(__k);} 1441e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 1442d5db71d1SArthur O'Dwyer 1443e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1444a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 1445a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 1446e5ec94a1SRuslan Arutyunyan 1447d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1448e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1449d5db71d1SArthur O'Dwyer bool contains(const _K2& __k) const {return find(__k) != end();} 1450a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 1451d5db71d1SArthur O'Dwyer 1452789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14533e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 14543e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 1455789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14563e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 14573e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 1458e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1459d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1460e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1461d5db71d1SArthur O'Dwyer pair<iterator, iterator> equal_range(const _K2& __k) 1462d5db71d1SArthur O'Dwyer {return __table_.__equal_range_multi(__k);} 1463d5db71d1SArthur O'Dwyer template<class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1464e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1465d5db71d1SArthur O'Dwyer pair<const_iterator, const_iterator> equal_range(const _K2& __k) const 1466d5db71d1SArthur O'Dwyer {return __table_.__equal_range_multi(__k);} 1467e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 14683e519524SHoward Hinnant 1469789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1470557da866SHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1471789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1472557da866SHoward Hinnant size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 14733e519524SHoward Hinnant 1474789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14753e519524SHoward Hinnant size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} 1476789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14773e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 14783e519524SHoward Hinnant 1479789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14803e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 1481789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14823e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 1483789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14843e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1485789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14863e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1487789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14883e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1489789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14903e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 14913e519524SHoward Hinnant 1492789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1493557da866SHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1494789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1495557da866SHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1496789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14973e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1498789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1499*3085e42fSIvan Trofimov void rehash(size_type __n) {__table_.__rehash_multi(__n);} 1500789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1501*3085e42fSIvan Trofimov void reserve(size_type __n) {__table_.__reserve_multi(__n);} 1502b24c8024SHoward Hinnant 1503f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE 1504b24c8024SHoward Hinnant 1505b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 1506b24c8024SHoward Hinnant {return __table_.__dereferenceable(__i);} 1507b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 1508b24c8024SHoward Hinnant {return __table_.__decrementable(__i);} 1509b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1510b24c8024SHoward Hinnant {return __table_.__addable(__i, __n);} 1511b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1512b24c8024SHoward Hinnant {return __table_.__addable(__i, __n);} 1513b24c8024SHoward Hinnant 1514f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE 1515b24c8024SHoward Hinnant 15163e519524SHoward Hinnant}; 15173e519524SHoward Hinnant 151801666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 1519296a8010SLouis Dionnetemplate<class _InputIterator, 1520296a8010SLouis Dionne class _Hash = hash<__iter_value_type<_InputIterator>>, 1521296a8010SLouis Dionne class _Pred = equal_to<__iter_value_type<_InputIterator>>, 1522296a8010SLouis Dionne class _Allocator = allocator<__iter_value_type<_InputIterator>>, 152368072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15244e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15254e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15264e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 15274e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1528296a8010SLouis Dionneunordered_multiset(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 1529296a8010SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1530296a8010SLouis Dionne -> unordered_multiset<__iter_value_type<_InputIterator>, _Hash, _Pred, _Allocator>; 1531296a8010SLouis Dionne 1532296a8010SLouis Dionnetemplate<class _Tp, class _Hash = hash<_Tp>, 1533296a8010SLouis Dionne class _Pred = equal_to<_Tp>, class _Allocator = allocator<_Tp>, 15344e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15354e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15364e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 15374e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1538296a8010SLouis Dionneunordered_multiset(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type = 0, 1539296a8010SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1540296a8010SLouis Dionne -> unordered_multiset<_Tp, _Hash, _Pred, _Allocator>; 1541296a8010SLouis Dionne 1542296a8010SLouis Dionnetemplate<class _InputIterator, class _Allocator, 154368072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15444e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1545296a8010SLouis Dionneunordered_multiset(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 1546296a8010SLouis Dionne -> unordered_multiset<__iter_value_type<_InputIterator>, 1547296a8010SLouis Dionne hash<__iter_value_type<_InputIterator>>, 1548296a8010SLouis Dionne equal_to<__iter_value_type<_InputIterator>>, 1549296a8010SLouis Dionne _Allocator>; 1550296a8010SLouis Dionne 1551296a8010SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 155268072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15534e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15544e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15554e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1556296a8010SLouis Dionneunordered_multiset(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, 1557296a8010SLouis Dionne _Hash, _Allocator) 1558296a8010SLouis Dionne -> unordered_multiset<__iter_value_type<_InputIterator>, _Hash, 1559296a8010SLouis Dionne equal_to<__iter_value_type<_InputIterator>>, 1560296a8010SLouis Dionne _Allocator>; 1561296a8010SLouis Dionne 1562296a8010SLouis Dionnetemplate<class _Tp, class _Allocator, 15634e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1564296a8010SLouis Dionneunordered_multiset(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type, _Allocator) 1565296a8010SLouis Dionne -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; 1566296a8010SLouis Dionne 1567296a8010SLouis Dionnetemplate<class _Tp, class _Hash, class _Allocator, 15684e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15694e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15704e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1571296a8010SLouis Dionneunordered_multiset(initializer_list<_Tp>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1572296a8010SLouis Dionne -> unordered_multiset<_Tp, _Hash, equal_to<_Tp>, _Allocator>; 1573296a8010SLouis Dionne#endif 1574296a8010SLouis Dionne 15753e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 15763e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 15773e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 15783e519524SHoward Hinnant : __table_(__hf, __eql) 15793e519524SHoward Hinnant{ 1580e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1581*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 15823e519524SHoward Hinnant} 15833e519524SHoward Hinnant 15843e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 15853e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 15863e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 15873e519524SHoward Hinnant const allocator_type& __a) 15883e519524SHoward Hinnant : __table_(__hf, __eql, __a) 15893e519524SHoward Hinnant{ 1590e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1591*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 15923e519524SHoward Hinnant} 15933e519524SHoward Hinnant 15943e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 15953e519524SHoward Hinnanttemplate <class _InputIterator> 15963e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 15973e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 15983e519524SHoward Hinnant{ 1599e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16003e519524SHoward Hinnant insert(__first, __last); 16013e519524SHoward Hinnant} 16023e519524SHoward Hinnant 16033e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16043e519524SHoward Hinnanttemplate <class _InputIterator> 16053e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16063e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 16073e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 16083e519524SHoward Hinnant : __table_(__hf, __eql) 16093e519524SHoward Hinnant{ 1610e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1611*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 16123e519524SHoward Hinnant insert(__first, __last); 16133e519524SHoward Hinnant} 16143e519524SHoward Hinnant 16153e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16163e519524SHoward Hinnanttemplate <class _InputIterator> 16173e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16183e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 16193e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 16203e519524SHoward Hinnant : __table_(__hf, __eql, __a) 16213e519524SHoward Hinnant{ 1622e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1623*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 16243e519524SHoward Hinnant insert(__first, __last); 16253e519524SHoward Hinnant} 16263e519524SHoward Hinnant 16273e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1628cd31b434SEvgeniy Stepanovinline 16293e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16303e519524SHoward Hinnant const allocator_type& __a) 16313e519524SHoward Hinnant : __table_(__a) 16323e519524SHoward Hinnant{ 1633e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16343e519524SHoward Hinnant} 16353e519524SHoward Hinnant 16363e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16373e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16383e519524SHoward Hinnant const unordered_multiset& __u) 16393e519524SHoward Hinnant : __table_(__u.__table_) 16403e519524SHoward Hinnant{ 1641e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1642*3085e42fSIvan Trofimov __table_.__rehash_multi(__u.bucket_count()); 16433e519524SHoward Hinnant insert(__u.begin(), __u.end()); 16443e519524SHoward Hinnant} 16453e519524SHoward Hinnant 16463e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16473e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16483e519524SHoward Hinnant const unordered_multiset& __u, const allocator_type& __a) 16493e519524SHoward Hinnant : __table_(__u.__table_, __a) 16503e519524SHoward Hinnant{ 1651e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1652*3085e42fSIvan Trofimov __table_.__rehash_multi(__u.bucket_count()); 16533e519524SHoward Hinnant insert(__u.begin(), __u.end()); 16543e519524SHoward Hinnant} 16553e519524SHoward Hinnant 1656f0f86ef9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 16573e519524SHoward Hinnant 16583e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1659cd31b434SEvgeniy Stepanovinline 16603e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16613e519524SHoward Hinnant unordered_multiset&& __u) 1662557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1663ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 16643e519524SHoward Hinnant{ 1665e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 166608f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 16673e519524SHoward Hinnant} 16683e519524SHoward Hinnant 16693e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16703e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16713e519524SHoward Hinnant unordered_multiset&& __u, const allocator_type& __a) 1672ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_), __a) 16733e519524SHoward Hinnant{ 1674e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16753e519524SHoward Hinnant if (__a != __u.get_allocator()) 16763e519524SHoward Hinnant { 16773e519524SHoward Hinnant iterator __i = __u.begin(); 16783e519524SHoward Hinnant while (__u.size() != 0) 1679ce48a113SHoward Hinnant __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_)); 16803e519524SHoward Hinnant } 1681b24c8024SHoward Hinnant else 168208f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 16833e519524SHoward Hinnant} 16843e519524SHoward Hinnant 16853e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16863e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16873e519524SHoward Hinnant initializer_list<value_type> __il) 16883e519524SHoward Hinnant{ 1689e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16903e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16913e519524SHoward Hinnant} 16923e519524SHoward Hinnant 16933e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 16943e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 16953e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 16963e519524SHoward Hinnant const key_equal& __eql) 16973e519524SHoward Hinnant : __table_(__hf, __eql) 16983e519524SHoward Hinnant{ 1699e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1700*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 17013e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17023e519524SHoward Hinnant} 17033e519524SHoward Hinnant 17043e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 17053e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( 17063e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 17073e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 17083e519524SHoward Hinnant : __table_(__hf, __eql, __a) 17093e519524SHoward Hinnant{ 1710e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1711*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 17123e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17133e519524SHoward Hinnant} 17143e519524SHoward Hinnant 17153e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1716cd31b434SEvgeniy Stepanovinline 17173e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>& 17183e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( 17193e519524SHoward Hinnant unordered_multiset&& __u) 1720557da866SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 17213e519524SHoward Hinnant{ 1722ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 17233e519524SHoward Hinnant return *this; 17243e519524SHoward Hinnant} 17253e519524SHoward Hinnant 17263e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 17273e519524SHoward Hinnantinline 17283e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>& 17293e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( 17303e519524SHoward Hinnant initializer_list<value_type> __il) 17313e519524SHoward Hinnant{ 17323e519524SHoward Hinnant __table_.__assign_multi(__il.begin(), __il.end()); 17333e519524SHoward Hinnant return *this; 17343e519524SHoward Hinnant} 17353e519524SHoward Hinnant 1736f0f86ef9SEric Fiselier#endif // _LIBCPP_CXX03_LANG 173754976f26SHoward Hinnant 17383e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 17393e519524SHoward Hinnanttemplate <class _InputIterator> 1740cd31b434SEvgeniy Stepanovinline 17413e519524SHoward Hinnantvoid 17423e519524SHoward Hinnantunordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 17433e519524SHoward Hinnant _InputIterator __last) 17443e519524SHoward Hinnant{ 17453e519524SHoward Hinnant for (; __first != __last; ++__first) 17463e519524SHoward Hinnant __table_.__insert_multi(*__first); 17473e519524SHoward Hinnant} 17483e519524SHoward Hinnant 17493e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1750789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17513e519524SHoward Hinnantvoid 17523e519524SHoward Hinnantswap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 17533e519524SHoward Hinnant unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 1754557da866SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 17553e519524SHoward Hinnant{ 17563e519524SHoward Hinnant __x.swap(__y); 17573e519524SHoward Hinnant} 17583e519524SHoward Hinnant 1759f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 17603e895085SMarek Kurdejtemplate <class _Value, class _Hash, class _Pred, class _Alloc, 17613e895085SMarek Kurdej class _Predicate> 1762f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 17633e895085SMarek Kurdej typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::size_type 17643e895085SMarek Kurdej erase_if(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __c, 17653e895085SMarek Kurdej _Predicate __pred) { 17662ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 17673e895085SMarek Kurdej} 1768f60c63c0SMarshall Clow#endif 1769f60c63c0SMarshall Clow 17703e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 17713e519524SHoward Hinnantbool 17723e519524SHoward Hinnantoperator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 17733e519524SHoward Hinnant const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 17743e519524SHoward Hinnant{ 17753e519524SHoward Hinnant if (__x.size() != __y.size()) 17763e519524SHoward Hinnant return false; 17773e519524SHoward Hinnant typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator 17783e519524SHoward Hinnant const_iterator; 17793e519524SHoward Hinnant typedef pair<const_iterator, const_iterator> _EqRng; 17803e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 17813e519524SHoward Hinnant { 17823e519524SHoward Hinnant _EqRng __xeq = __x.equal_range(*__i); 17833e519524SHoward Hinnant _EqRng __yeq = __y.equal_range(*__i); 1784ce48a113SHoward Hinnant if (_VSTD::distance(__xeq.first, __xeq.second) != 1785ce48a113SHoward Hinnant _VSTD::distance(__yeq.first, __yeq.second) || 1786ce48a113SHoward Hinnant !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 17873e519524SHoward Hinnant return false; 17883e519524SHoward Hinnant __i = __xeq.second; 17893e519524SHoward Hinnant } 17903e519524SHoward Hinnant return true; 17913e519524SHoward Hinnant} 17923e519524SHoward Hinnant 17933e519524SHoward Hinnanttemplate <class _Value, class _Hash, class _Pred, class _Alloc> 1794789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17953e519524SHoward Hinnantbool 17963e519524SHoward Hinnantoperator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 17973e519524SHoward Hinnant const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 17983e519524SHoward Hinnant{ 17993e519524SHoward Hinnant return !(__x == __y); 18003e519524SHoward Hinnant} 18013e519524SHoward Hinnant 18023e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 18033e519524SHoward Hinnant 18043e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_SET 1805