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