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_MAP
113e519524SHoward Hinnant#define _LIBCPP_UNORDERED_MAP
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant
153e519524SHoward Hinnant    unordered_map synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnant#include <initializer_list>
183e519524SHoward Hinnant
193e519524SHoward Hinnantnamespace std
203e519524SHoward Hinnant{
213e519524SHoward Hinnant
223e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
233e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
243e519524SHoward Hinnantclass unordered_map
253e519524SHoward Hinnant{
263e519524SHoward Hinnantpublic:
273e519524SHoward Hinnant    // types
283e519524SHoward Hinnant    typedef Key                                                        key_type;
293e519524SHoward Hinnant    typedef T                                                          mapped_type;
303e519524SHoward Hinnant    typedef Hash                                                       hasher;
313e519524SHoward Hinnant    typedef Pred                                                       key_equal;
323e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
333e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
343e519524SHoward Hinnant    typedef value_type&                                                reference;
353e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
363e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
373e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
383e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
393e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
403e519524SHoward Hinnant
413e519524SHoward Hinnant    typedef /unspecified/ iterator;
423e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
433e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
443e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
453e519524SHoward Hinnant
46b0386a51SErik Pilkington    typedef unspecified                             node_type;            // C++17
47b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type;   // C++17
48b0386a51SErik Pilkington
493714107eSHoward Hinnant    unordered_map()
503714107eSHoward Hinnant        noexcept(
513714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
523714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
533714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
543714107eSHoward Hinnant    explicit unordered_map(size_type n, const hasher& hf = hasher(),
553e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
563e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
573e519524SHoward Hinnant    template <class InputIterator>
583e519524SHoward Hinnant        unordered_map(InputIterator f, InputIterator l,
593e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
603e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
613e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
623e519524SHoward Hinnant    explicit unordered_map(const allocator_type&);
633e519524SHoward Hinnant    unordered_map(const unordered_map&);
643e519524SHoward Hinnant    unordered_map(const unordered_map&, const Allocator&);
653714107eSHoward Hinnant    unordered_map(unordered_map&&)
663714107eSHoward Hinnant        noexcept(
673714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
683714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
693714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
703e519524SHoward Hinnant    unordered_map(unordered_map&&, const Allocator&);
713e519524SHoward Hinnant    unordered_map(initializer_list<value_type>, size_type n = 0,
723e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
733e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
743cd37e64SMarshall Clow    unordered_map(size_type n, const allocator_type& a)
753cd37e64SMarshall Clow      : unordered_map(n, hasher(), key_equal(), a) {}  // C++14
763cd37e64SMarshall Clow    unordered_map(size_type n, const hasher& hf, const allocator_type& a)
773cd37e64SMarshall Clow      : unordered_map(n, hf, key_equal(), a) {}  // C++14
783cd37e64SMarshall Clow    template <class InputIterator>
793cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
803cd37e64SMarshall Clow      : unordered_map(f, l, n, hasher(), key_equal(), a) {}  // C++14
813cd37e64SMarshall Clow    template <class InputIterator>
823cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
833cd37e64SMarshall Clow        const allocator_type& a)
843cd37e64SMarshall Clow      : unordered_map(f, l, n, hf, key_equal(), a) {}  // C++14
853cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
863cd37e64SMarshall Clow      : unordered_map(il, n, hasher(), key_equal(), a) {}  // C++14
873cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
883cd37e64SMarshall Clow      const allocator_type& a)
893cd37e64SMarshall Clow      : unordered_map(il, n, hf, key_equal(), a) {}  // C++14
903e519524SHoward Hinnant    ~unordered_map();
913e519524SHoward Hinnant    unordered_map& operator=(const unordered_map&);
923714107eSHoward Hinnant    unordered_map& operator=(unordered_map&&)
933714107eSHoward Hinnant        noexcept(
943714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
953714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
963714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
973714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
983e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type>);
993e519524SHoward Hinnant
1003714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
1013e519524SHoward Hinnant
1023714107eSHoward Hinnant    bool      empty() const noexcept;
1033714107eSHoward Hinnant    size_type size() const noexcept;
1043714107eSHoward Hinnant    size_type max_size() const noexcept;
1053e519524SHoward Hinnant
1063714107eSHoward Hinnant    iterator       begin() noexcept;
1073714107eSHoward Hinnant    iterator       end() noexcept;
1083714107eSHoward Hinnant    const_iterator begin()  const noexcept;
1093714107eSHoward Hinnant    const_iterator end()    const noexcept;
1103714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
1113714107eSHoward Hinnant    const_iterator cend()   const noexcept;
1123e519524SHoward Hinnant
1133e519524SHoward Hinnant    template <class... Args>
1143e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1153e519524SHoward Hinnant    template <class... Args>
1163e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1173e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& obj);
1183e519524SHoward Hinnant    template <class P>
1193e519524SHoward Hinnant        pair<iterator, bool> insert(P&& obj);
1203e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
1213e519524SHoward Hinnant    template <class P>
1223e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
1233e519524SHoward Hinnant    template <class InputIterator>
1243e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1253e519524SHoward Hinnant    void insert(initializer_list<value_type>);
1263e519524SHoward Hinnant
127b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
128b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
129b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
130b0386a51SErik Pilkington    iterator           insert(const_iterator hint, node_type&& nh);                   // C++17
131b0386a51SErik Pilkington
132bc4c89a9SMarshall Clow    template <class... Args>
133bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
134bc4c89a9SMarshall Clow    template <class... Args>
135bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
136bc4c89a9SMarshall Clow    template <class... Args>
137bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
138bc4c89a9SMarshall Clow    template <class... Args>
139bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
140bc4c89a9SMarshall Clow    template <class M>
141bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
142bc4c89a9SMarshall Clow    template <class M>
143bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
144bc4c89a9SMarshall Clow    template <class M>
145bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
146bc4c89a9SMarshall Clow    template <class M>
147bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
148bc4c89a9SMarshall Clow
1493e519524SHoward Hinnant    iterator erase(const_iterator position);
150ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
1513e519524SHoward Hinnant    size_type erase(const key_type& k);
1523e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
1533714107eSHoward Hinnant    void clear() noexcept;
1543e519524SHoward Hinnant
1555c4e07aeSErik Pilkington    template<class H2, class P2>
1565c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
1575c4e07aeSErik Pilkington    template<class H2, class P2>
1585c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
1595c4e07aeSErik Pilkington    template<class H2, class P2>
1605c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
1615c4e07aeSErik Pilkington    template<class H2, class P2>
1625c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
1635c4e07aeSErik Pilkington
1643714107eSHoward Hinnant    void swap(unordered_map&)
1653714107eSHoward Hinnant        noexcept(
1663714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
1673714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
1683714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
1693714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
1703e519524SHoward Hinnant
1713e519524SHoward Hinnant    hasher hash_function() const;
1723e519524SHoward Hinnant    key_equal key_eq() const;
1733e519524SHoward Hinnant
1743e519524SHoward Hinnant    iterator       find(const key_type& k);
1753e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
176e5ec94a1SRuslan Arutyunyan    template<typename K>
177e5ec94a1SRuslan Arutyunyan        iterator find(const K& x);              // C++20
178e5ec94a1SRuslan Arutyunyan    template<typename K>
179e5ec94a1SRuslan Arutyunyan        const_iterator find(const K& x) const;  // C++20
1803e519524SHoward Hinnant    size_type count(const key_type& k) const;
181e5ec94a1SRuslan Arutyunyan    template<typename K>
182e5ec94a1SRuslan Arutyunyan        size_type count(const K& k) const; // C++20
183a17b1aedSZoe Carver    bool contains(const key_type& k) const; // C++20
184e5ec94a1SRuslan Arutyunyan    template<typename K>
185e5ec94a1SRuslan Arutyunyan        bool contains(const K& k) const; // C++20
1863e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
1873e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
188e5ec94a1SRuslan Arutyunyan    template<typename K>
189e5ec94a1SRuslan Arutyunyan        pair<iterator, iterator>             equal_range(const K& k); // C++20
190e5ec94a1SRuslan Arutyunyan    template<typename K>
191e5ec94a1SRuslan Arutyunyan        pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20
1923e519524SHoward Hinnant
1933e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1943e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1953e519524SHoward Hinnant
1963e519524SHoward Hinnant    mapped_type&       at(const key_type& k);
1973e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1983e519524SHoward Hinnant
1993714107eSHoward Hinnant    size_type bucket_count() const noexcept;
2003714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
2013e519524SHoward Hinnant
2023e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
2033e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
2043e519524SHoward Hinnant
2053e519524SHoward Hinnant    local_iterator       begin(size_type n);
2063e519524SHoward Hinnant    local_iterator       end(size_type n);
2073e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
2083e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
2093e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
2103e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
2113e519524SHoward Hinnant
2123714107eSHoward Hinnant    float load_factor() const noexcept;
2133714107eSHoward Hinnant    float max_load_factor() const noexcept;
2143e519524SHoward Hinnant    void max_load_factor(float z);
2153e519524SHoward Hinnant    void rehash(size_type n);
2163e519524SHoward Hinnant    void reserve(size_type n);
2173e519524SHoward Hinnant};
2183e519524SHoward Hinnant
21968072a71SKonstantin Varlamovtemplate<class InputIterator,
22068072a71SKonstantin Varlamov    class Hash = hash<iter_key_t<InputIterator>>, class Pred = equal_to<iter_key_t<InputIterator>>,
22168072a71SKonstantin Varlamov    class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
22268072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type = see below,
22368072a71SKonstantin Varlamov    Hash = Hash(), Pred = Pred(), Allocator = Allocator())
22468072a71SKonstantin Varlamov  -> unordered_map<iter_key_t<InputIterator>, iter_value_t<InputIterator>, Hash, Pred,
22568072a71SKonstantin Varlamov    Allocator>; // C++17
22668072a71SKonstantin Varlamov
22768072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash = hash<Key>,
22868072a71SKonstantin Varlamov    class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>>
22968072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type = see below,
23068072a71SKonstantin Varlamov    Hash = Hash(), Pred = Pred(), Allocator = Allocator())
23168072a71SKonstantin Varlamov  -> unordered_map<Key, T, Hash, Pred, Allocator>; // C++17
23268072a71SKonstantin Varlamov
23368072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
23468072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type, Allocator)
23568072a71SKonstantin Varlamov  -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
23668072a71SKonstantin Varlamov        hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
23768072a71SKonstantin Varlamov
23868072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
23968072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, Allocator)
24068072a71SKonstantin Varlamov  -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
24168072a71SKonstantin Varlamov        hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
24268072a71SKonstantin Varlamov
24368072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator>
24468072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator)
24568072a71SKonstantin Varlamov  -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Hash,
24668072a71SKonstantin Varlamov          equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
24768072a71SKonstantin Varlamov
24868072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator>
24968072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type, Allocator)
25068072a71SKonstantin Varlamov  -> unordered_map<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17
25168072a71SKonstantin Varlamov
25268072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator>
25368072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, Allocator)
25468072a71SKonstantin Varlamov  -> unordered_map<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17
25568072a71SKonstantin Varlamov
25668072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash, class Allocator>
25768072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type, Hash, Allocator)
25868072a71SKonstantin Varlamov  -> unordered_map<Key, T, Hash, equal_to<Key>, Allocator>; // C++17
25968072a71SKonstantin Varlamov
2603e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2613e519524SHoward Hinnant    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
2623714107eSHoward Hinnant              unordered_map<Key, T, Hash, Pred, Alloc>& y)
2633714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
2643e519524SHoward Hinnant
2653e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2663e519524SHoward Hinnant    bool
2673e519524SHoward Hinnant    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2683e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2693e519524SHoward Hinnant
2703e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2713e519524SHoward Hinnant    bool
2723e519524SHoward Hinnant    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2733e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2743e519524SHoward Hinnant
2753e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
2763e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
2773e519524SHoward Hinnantclass unordered_multimap
2783e519524SHoward Hinnant{
2793e519524SHoward Hinnantpublic:
2803e519524SHoward Hinnant    // types
2813e519524SHoward Hinnant    typedef Key                                                        key_type;
2823e519524SHoward Hinnant    typedef T                                                          mapped_type;
2833e519524SHoward Hinnant    typedef Hash                                                       hasher;
2843e519524SHoward Hinnant    typedef Pred                                                       key_equal;
2853e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
2863e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
2873e519524SHoward Hinnant    typedef value_type&                                                reference;
2883e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2893e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
2903e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
2913e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
2923e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
2933e519524SHoward Hinnant
2943e519524SHoward Hinnant    typedef /unspecified/ iterator;
2953e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
2963e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
2973e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
2983e519524SHoward Hinnant
299b0386a51SErik Pilkington    typedef unspecified node_type;    // C++17
300b0386a51SErik Pilkington
3013714107eSHoward Hinnant    unordered_multimap()
3023714107eSHoward Hinnant        noexcept(
3033714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
3043714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
3053714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
3063714107eSHoward Hinnant    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
3073e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
3083e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
3093e519524SHoward Hinnant    template <class InputIterator>
3103e519524SHoward Hinnant        unordered_multimap(InputIterator f, InputIterator l,
3113e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
3123e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
3133e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
3143e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type&);
3153e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&);
3163e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&, const Allocator&);
3173714107eSHoward Hinnant    unordered_multimap(unordered_multimap&&)
3183714107eSHoward Hinnant        noexcept(
3193714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
3203714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
3213714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
3223e519524SHoward Hinnant    unordered_multimap(unordered_multimap&&, const Allocator&);
3233e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type>, size_type n = 0,
3243e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
3253e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
3263cd37e64SMarshall Clow    unordered_multimap(size_type n, const allocator_type& a)
3273cd37e64SMarshall Clow      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
3283cd37e64SMarshall Clow    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
3293cd37e64SMarshall Clow      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
3303cd37e64SMarshall Clow    template <class InputIterator>
3313cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
3323cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
3333cd37e64SMarshall Clow    template <class InputIterator>
3343cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
3353cd37e64SMarshall Clow        const allocator_type& a)
3363cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
3373cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
3383cd37e64SMarshall Clow      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
3393cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
3403cd37e64SMarshall Clow      const allocator_type& a)
3413cd37e64SMarshall Clow      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
3423e519524SHoward Hinnant    ~unordered_multimap();
3433e519524SHoward Hinnant    unordered_multimap& operator=(const unordered_multimap&);
3443714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&&)
3453714107eSHoward Hinnant        noexcept(
3463714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3473714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3483714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
3493714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
3503e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type>);
3513e519524SHoward Hinnant
3523714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
3533e519524SHoward Hinnant
3543714107eSHoward Hinnant    bool      empty() const noexcept;
3553714107eSHoward Hinnant    size_type size() const noexcept;
3563714107eSHoward Hinnant    size_type max_size() const noexcept;
3573e519524SHoward Hinnant
3583714107eSHoward Hinnant    iterator       begin() noexcept;
3593714107eSHoward Hinnant    iterator       end() noexcept;
3603714107eSHoward Hinnant    const_iterator begin()  const noexcept;
3613714107eSHoward Hinnant    const_iterator end()    const noexcept;
3623714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
3633714107eSHoward Hinnant    const_iterator cend()   const noexcept;
3643e519524SHoward Hinnant
3653e519524SHoward Hinnant    template <class... Args>
3663e519524SHoward Hinnant        iterator emplace(Args&&... args);
3673e519524SHoward Hinnant    template <class... Args>
3683e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3693e519524SHoward Hinnant    iterator insert(const value_type& obj);
3703e519524SHoward Hinnant    template <class P>
3713e519524SHoward Hinnant        iterator insert(P&& obj);
3723e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
3733e519524SHoward Hinnant    template <class P>
3743e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
3753e519524SHoward Hinnant    template <class InputIterator>
3763e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3773e519524SHoward Hinnant    void insert(initializer_list<value_type>);
3783e519524SHoward Hinnant
379b0386a51SErik Pilkington    node_type extract(const_iterator position);                // C++17
380b0386a51SErik Pilkington    node_type extract(const key_type& x);                      // C++17
381b0386a51SErik Pilkington    iterator insert(node_type&& nh);                           // C++17
382b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);      // C++17
383b0386a51SErik Pilkington
3843e519524SHoward Hinnant    iterator erase(const_iterator position);
385ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
3863e519524SHoward Hinnant    size_type erase(const key_type& k);
3873e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
3883714107eSHoward Hinnant    void clear() noexcept;
3893e519524SHoward Hinnant
3905c4e07aeSErik Pilkington    template<class H2, class P2>
3915c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
3925c4e07aeSErik Pilkington    template<class H2, class P2>
3935c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
3945c4e07aeSErik Pilkington    template<class H2, class P2>
3955c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
3965c4e07aeSErik Pilkington    template<class H2, class P2>
3975c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
3985c4e07aeSErik Pilkington
3993714107eSHoward Hinnant    void swap(unordered_multimap&)
4003714107eSHoward Hinnant        noexcept(
4013714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
4023714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
4033714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
4043714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
4053e519524SHoward Hinnant
4063e519524SHoward Hinnant    hasher hash_function() const;
4073e519524SHoward Hinnant    key_equal key_eq() const;
4083e519524SHoward Hinnant
4093e519524SHoward Hinnant    iterator       find(const key_type& k);
4103e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
411e5ec94a1SRuslan Arutyunyan    template<typename K>
412e5ec94a1SRuslan Arutyunyan        iterator find(const K& x);              // C++20
413e5ec94a1SRuslan Arutyunyan    template<typename K>
414e5ec94a1SRuslan Arutyunyan        const_iterator find(const K& x) const;  // C++20
4153e519524SHoward Hinnant    size_type count(const key_type& k) const;
416e5ec94a1SRuslan Arutyunyan    template<typename K>
417e5ec94a1SRuslan Arutyunyan        size_type count(const K& k) const; // C++20
418a17b1aedSZoe Carver    bool contains(const key_type& k) const; // C++20
419e5ec94a1SRuslan Arutyunyan    template<typename K>
420e5ec94a1SRuslan Arutyunyan        bool contains(const K& k) const; // C++20
4213e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
4223e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
423e5ec94a1SRuslan Arutyunyan    template<typename K>
424e5ec94a1SRuslan Arutyunyan        pair<iterator, iterator>             equal_range(const K& k); // C++20
425e5ec94a1SRuslan Arutyunyan    template<typename K>
426e5ec94a1SRuslan Arutyunyan        pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20
4273e519524SHoward Hinnant
4283714107eSHoward Hinnant    size_type bucket_count() const noexcept;
4293714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
4303e519524SHoward Hinnant
4313e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
4323e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
4333e519524SHoward Hinnant
4343e519524SHoward Hinnant    local_iterator       begin(size_type n);
4353e519524SHoward Hinnant    local_iterator       end(size_type n);
4363e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
4373e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
4383e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
4393e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
4403e519524SHoward Hinnant
4413714107eSHoward Hinnant    float load_factor() const noexcept;
4423714107eSHoward Hinnant    float max_load_factor() const noexcept;
4433e519524SHoward Hinnant    void max_load_factor(float z);
4443e519524SHoward Hinnant    void rehash(size_type n);
4453e519524SHoward Hinnant    void reserve(size_type n);
4463e519524SHoward Hinnant};
4473e519524SHoward Hinnant
44868072a71SKonstantin Varlamovtemplate<class InputIterator,
44968072a71SKonstantin Varlamov    class Hash = hash<iter_key_t<InputIterator>>, class Pred = equal_to<iter_key_t<InputIterator>>,
45068072a71SKonstantin Varlamov    class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
45168072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type = see below,
45268072a71SKonstantin Varlamov    Hash = Hash(), Pred = Pred(), Allocator = Allocator())
45368072a71SKonstantin Varlamov  -> unordered_multimap<iter_key_t<InputIterator>, iter_value_t<InputIterator>, Hash, Pred,
45468072a71SKonstantin Varlamov    Allocator>; // C++17
45568072a71SKonstantin Varlamov
45668072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash = hash<Key>,
45768072a71SKonstantin Varlamov    class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>>
45868072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type = see below,
45968072a71SKonstantin Varlamov    Hash = Hash(), Pred = Pred(), Allocator = Allocator())
46068072a71SKonstantin Varlamov  -> unordered_multimap<Key, T, Hash, Pred, Allocator>; // C++17
46168072a71SKonstantin Varlamov
46268072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
46368072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type, Allocator)
46468072a71SKonstantin Varlamov  -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
46568072a71SKonstantin Varlamov        hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
46668072a71SKonstantin Varlamov
46768072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
46868072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, Allocator)
46968072a71SKonstantin Varlamov  -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
47068072a71SKonstantin Varlamov        hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
47168072a71SKonstantin Varlamov
47268072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator>
47368072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator)
47468072a71SKonstantin Varlamov  -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Hash,
47568072a71SKonstantin Varlamov          equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17
47668072a71SKonstantin Varlamov
47768072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator>
47868072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type, Allocator)
47968072a71SKonstantin Varlamov  -> unordered_multimap<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17
48068072a71SKonstantin Varlamov
48168072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator>
48268072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, Allocator)
48368072a71SKonstantin Varlamov  -> unordered_multimap<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17
48468072a71SKonstantin Varlamov
48568072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash, class Allocator>
48668072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type, Hash,
48768072a71SKonstantin Varlamov    Allocator)
48868072a71SKonstantin Varlamov  -> unordered_multimap<Key, T, Hash, equal_to<Key>, Allocator>; // C++17
48968072a71SKonstantin Varlamov
4903e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
4913e519524SHoward Hinnant    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
4923714107eSHoward Hinnant              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
4933714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
4943e519524SHoward Hinnant
495f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
4963e895085SMarek Kurdej    typename unordered_map<K, T, H, P, A>::size_type
4973e895085SMarek Kurdej    erase_if(unordered_map<K, T, H, P, A>& c, Predicate pred);       // C++20
498f60c63c0SMarshall Clow
499f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
5003e895085SMarek Kurdej    typename unordered_multimap<K, T, H, P, A>::size_type
5013e895085SMarek Kurdej    erase_if(unordered_multimap<K, T, H, P, A>& c, Predicate pred);  // C++20
502f60c63c0SMarshall Clow
5033e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
5043e519524SHoward Hinnant    bool
5053e519524SHoward Hinnant    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
5063e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
5073e519524SHoward Hinnant
5083e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
5093e519524SHoward Hinnant    bool
5103e519524SHoward Hinnant    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
5113e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
5123e519524SHoward Hinnant
5133e519524SHoward Hinnant}  // std
5143e519524SHoward Hinnant
5153e519524SHoward Hinnant*/
5163e519524SHoward Hinnant
5172e2f3158SNikolas Klauser#include <__algorithm/is_permutation.h>
518385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
5193e519524SHoward Hinnant#include <__config>
520bfbd73f8SArthur O'Dwyer#include <__debug>
521050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
52234f73804SNikolas Klauser#include <__functional/operations.h>
5233e519524SHoward Hinnant#include <__hash_table>
5243cd4531bSNikolas Klauser#include <__iterator/distance.h>
5253cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h>
5264d81a46fSArthur O'Dwyer#include <__iterator/iterator_traits.h>
527d6e2c95dSMark de Wever#include <__memory/addressof.h>
528b0386a51SErik Pilkington#include <__node_handle>
5296adbc83eSChristopher Di Bella#include <__utility/forward.h>
5303e519524SHoward Hinnant#include <stdexcept>
5310f905677SEric Fiselier#include <tuple>
532f56972e2SMarshall Clow#include <version>
5333e519524SHoward Hinnant
534de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
535de4a57cbSLouis Dionne#  include <algorithm>
536de4a57cbSLouis Dionne#  include <bit>
537de4a57cbSLouis Dionne#  include <iterator>
538de4a57cbSLouis Dionne#endif
539de4a57cbSLouis Dionne
540db1978b6SNikolas Klauser// standard-mandated includes
541db1978b6SNikolas Klauser
542db1978b6SNikolas Klauser// [iterator.range]
543db1978b6SNikolas Klauser#include <__iterator/access.h>
544db1978b6SNikolas Klauser#include <__iterator/data.h>
545db1978b6SNikolas Klauser#include <__iterator/empty.h>
546db1978b6SNikolas Klauser#include <__iterator/reverse_access.h>
547db1978b6SNikolas Klauser#include <__iterator/size.h>
548db1978b6SNikolas Klauser
549db1978b6SNikolas Klauser// [unord.map.syn]
550db1978b6SNikolas Klauser#include <compare>
551db1978b6SNikolas Klauser#include <initializer_list>
552db1978b6SNikolas Klauser
553073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5543e519524SHoward Hinnant#  pragma GCC system_header
555073458b1SHoward Hinnant#endif
5563e519524SHoward Hinnant
5573e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
5583e519524SHoward Hinnant
559e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred,
5603560fbf3SLouis Dionne          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
5613e519524SHoward Hinnantclass __unordered_map_hasher
5623e519524SHoward Hinnant    : private _Hash
5633e519524SHoward Hinnant{
5643e519524SHoward Hinnantpublic:
565789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5663714107eSHoward Hinnant    __unordered_map_hasher()
5673714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
5683714107eSHoward Hinnant        : _Hash() {}
569789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5703714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
5713714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
5723714107eSHoward Hinnant        : _Hash(__h) {}
573789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5743714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
575789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
576a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
577f52318b4SErik Pilkington        {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
578a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
579a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
5803e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
581e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
582d5db71d1SArthur O'Dwyer    template <typename _K2>
583e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
584e5ec94a1SRuslan Arutyunyan    size_t operator()(const _K2& __x) const
585e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Hash&>(*this)(__x);}
586e5ec94a1SRuslan Arutyunyan#endif
587d5db71d1SArthur O'Dwyer    _LIBCPP_INLINE_VISIBILITY
588e3fbe143SMarshall Clow    void swap(__unordered_map_hasher& __y)
589e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
590e3fbe143SMarshall Clow    {
591e3fbe143SMarshall Clow        using _VSTD::swap;
592b3f57425SEric Fiselier        swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
593e3fbe143SMarshall Clow    }
5943e519524SHoward Hinnant};
5953e519524SHoward Hinnant
596e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred>
597e5ec94a1SRuslan Arutyunyanclass __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, false>
5983e519524SHoward Hinnant{
5993e519524SHoward Hinnant    _Hash __hash_;
6003e519524SHoward Hinnantpublic:
601789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6023714107eSHoward Hinnant    __unordered_map_hasher()
6033714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
6043714107eSHoward Hinnant        : __hash_() {}
605789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6063714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
6073714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
6083714107eSHoward Hinnant        : __hash_(__h) {}
609789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6103714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
611789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
612a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
613f52318b4SErik Pilkington        {return __hash_(__x.__get_value().first);}
614a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
615a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
6163e519524SHoward Hinnant        {return __hash_(__x);}
617e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
618d5db71d1SArthur O'Dwyer    template <typename _K2>
619e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
620e5ec94a1SRuslan Arutyunyan    size_t operator()(const _K2& __x) const
621e5ec94a1SRuslan Arutyunyan        {return __hash_(__x);}
622e5ec94a1SRuslan Arutyunyan#endif
623d5db71d1SArthur O'Dwyer    _LIBCPP_INLINE_VISIBILITY
624e3fbe143SMarshall Clow    void swap(__unordered_map_hasher& __y)
625e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
626e3fbe143SMarshall Clow    {
627e3fbe143SMarshall Clow        using _VSTD::swap;
628e3fbe143SMarshall Clow        swap(__hash_, __y.__hash_);
629e3fbe143SMarshall Clow    }
6303e519524SHoward Hinnant};
6313e519524SHoward Hinnant
632e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, bool __b>
633e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
634e3fbe143SMarshall Clowvoid
635e5ec94a1SRuslan Arutyunyanswap(__unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __x,
636e5ec94a1SRuslan Arutyunyan     __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __y)
637e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
638e3fbe143SMarshall Clow{
639e3fbe143SMarshall Clow    __x.swap(__y);
640e3fbe143SMarshall Clow}
641e3fbe143SMarshall Clow
642e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash,
6433560fbf3SLouis Dionne          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
6443e519524SHoward Hinnantclass __unordered_map_equal
6453e519524SHoward Hinnant    : private _Pred
6463e519524SHoward Hinnant{
6473e519524SHoward Hinnantpublic:
648789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6493714107eSHoward Hinnant    __unordered_map_equal()
6503714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
6513714107eSHoward Hinnant        : _Pred() {}
652789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6533714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
6543714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
6553714107eSHoward Hinnant        : _Pred(__p) {}
656789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6573714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return *this;}
658789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
659a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
660f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
661a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
662a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
663f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
664a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
665a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
666f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
667e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
668d5db71d1SArthur O'Dwyer    template <typename _K2>
669e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
670e5ec94a1SRuslan Arutyunyan    bool operator()(const _Cp& __x, const _K2& __y) const
671e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
672d5db71d1SArthur O'Dwyer    template <typename _K2>
673e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
674e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Cp& __y) const
675e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
676d5db71d1SArthur O'Dwyer    template <typename _K2>
677e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
678e5ec94a1SRuslan Arutyunyan    bool operator()(const _Key& __x, const _K2& __y) const
679e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y);}
680d5db71d1SArthur O'Dwyer    template <typename _K2>
681e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
682e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Key& __y) const
683e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y);}
684e5ec94a1SRuslan Arutyunyan#endif
685d5db71d1SArthur O'Dwyer    _LIBCPP_INLINE_VISIBILITY
686e3fbe143SMarshall Clow    void swap(__unordered_map_equal& __y)
687e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
688e3fbe143SMarshall Clow    {
689e3fbe143SMarshall Clow        using _VSTD::swap;
690b3f57425SEric Fiselier        swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
691e3fbe143SMarshall Clow    }
6923e519524SHoward Hinnant};
6933e519524SHoward Hinnant
694e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash>
695e5ec94a1SRuslan Arutyunyanclass __unordered_map_equal<_Key, _Cp, _Pred, _Hash, false>
6963e519524SHoward Hinnant{
6973e519524SHoward Hinnant    _Pred __pred_;
6983e519524SHoward Hinnantpublic:
699789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7003714107eSHoward Hinnant    __unordered_map_equal()
7013714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
7023714107eSHoward Hinnant        : __pred_() {}
703789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7043714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
7053714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
7063714107eSHoward Hinnant        : __pred_(__p) {}
707789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7083714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
709789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
710a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
711f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y.__get_value().first);}
712a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
713a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
714f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y);}
715a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
716a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
717f52318b4SErik Pilkington        {return __pred_(__x, __y.__get_value().first);}
718e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
719d5db71d1SArthur O'Dwyer    template <typename _K2>
720e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
721e5ec94a1SRuslan Arutyunyan    bool operator()(const _Cp& __x, const _K2& __y) const
722e5ec94a1SRuslan Arutyunyan        {return __pred_(__x.__get_value().first, __y);}
723d5db71d1SArthur O'Dwyer    template <typename _K2>
724e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
725e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Cp& __y) const
726e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y.__get_value().first);}
727d5db71d1SArthur O'Dwyer    template <typename _K2>
728e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
729e5ec94a1SRuslan Arutyunyan    bool operator()(const _Key& __x, const _K2& __y) const
730e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y);}
731d5db71d1SArthur O'Dwyer    template <typename _K2>
732e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
733e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Key& __y) const
734e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y);}
735e5ec94a1SRuslan Arutyunyan#endif
736d5db71d1SArthur O'Dwyer    _LIBCPP_INLINE_VISIBILITY
737e3fbe143SMarshall Clow    void swap(__unordered_map_equal& __y)
738e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
739e3fbe143SMarshall Clow    {
740e3fbe143SMarshall Clow        using _VSTD::swap;
741e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
742e3fbe143SMarshall Clow    }
7433e519524SHoward Hinnant};
7443e519524SHoward Hinnant
745e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, bool __b>
746e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
747e3fbe143SMarshall Clowvoid
748e5ec94a1SRuslan Arutyunyanswap(__unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __x,
749e5ec94a1SRuslan Arutyunyan     __unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __y)
750e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
751e3fbe143SMarshall Clow{
752e3fbe143SMarshall Clow    __x.swap(__y);
753e3fbe143SMarshall Clow}
754e3fbe143SMarshall Clow
7553e519524SHoward Hinnanttemplate <class _Alloc>
7563e519524SHoward Hinnantclass __hash_map_node_destructor
7573e519524SHoward Hinnant{
7583e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
7593e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
76075d0dcfdSEric Fiselier
7613e519524SHoward Hinnantpublic:
76275d0dcfdSEric Fiselier
7633e519524SHoward Hinnant    typedef typename __alloc_traits::pointer       pointer;
7643e519524SHoward Hinnantprivate:
7653e519524SHoward Hinnant
7663e519524SHoward Hinnant    allocator_type& __na_;
7673e519524SHoward Hinnant
7683e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
7693e519524SHoward Hinnant
7703e519524SHoward Hinnantpublic:
7713e519524SHoward Hinnant    bool __first_constructed;
7723e519524SHoward Hinnant    bool __second_constructed;
7733e519524SHoward Hinnant
774789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7753714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
7763e519524SHoward Hinnant        : __na_(__na),
7773e519524SHoward Hinnant          __first_constructed(false),
7783e519524SHoward Hinnant          __second_constructed(false)
7793e519524SHoward Hinnant        {}
7803e519524SHoward Hinnant
7816a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
782789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7833e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
7843714107eSHoward Hinnant        _NOEXCEPT
7853e519524SHoward Hinnant        : __na_(__x.__na_),
7863e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
7873e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
7883e519524SHoward Hinnant        {
7893e519524SHoward Hinnant            __x.__value_constructed = false;
7903e519524SHoward Hinnant        }
7916a470bcbSEric Fiselier#else  // _LIBCPP_CXX03_LANG
792789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7933e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
7943e519524SHoward Hinnant        : __na_(__x.__na_),
7953e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
7963e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
7973e519524SHoward Hinnant        {
7983e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
7993e519524SHoward Hinnant        }
8006a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
8013e519524SHoward Hinnant
802789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8033714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
8043e519524SHoward Hinnant    {
8053e519524SHoward Hinnant        if (__second_constructed)
806f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
8073e519524SHoward Hinnant        if (__first_constructed)
808f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
8093e519524SHoward Hinnant        if (__p)
8103e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
8113e519524SHoward Hinnant    }
8123e519524SHoward Hinnant};
8133e519524SHoward Hinnant
814fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
8159fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
8167c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __hash_value_type
8179fd9f84fSHoward Hinnant{
8189fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
8199fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
8209fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
821f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
822f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
8239fd9f84fSHoward Hinnant
824f52318b4SErik Pilkingtonprivate:
8259fd9f84fSHoward Hinnant    value_type __cc;
826f52318b4SErik Pilkington
827f52318b4SErik Pilkingtonpublic:
828f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
829f52318b4SErik Pilkington    value_type& __get_value()
830f52318b4SErik Pilkington    {
831f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
832f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
833f52318b4SErik Pilkington#else
834f52318b4SErik Pilkington        return __cc;
835f52318b4SErik Pilkington#endif
836f52318b4SErik Pilkington    }
837f52318b4SErik Pilkington
838f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
839f52318b4SErik Pilkington    const value_type& __get_value() const
840f52318b4SErik Pilkington    {
841f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
842f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
843f52318b4SErik Pilkington#else
844f52318b4SErik Pilkington        return __cc;
845f52318b4SErik Pilkington#endif
846f52318b4SErik Pilkington    }
847f52318b4SErik Pilkington
848f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
849f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
850f52318b4SErik Pilkington    {
851f52318b4SErik Pilkington        value_type& __v = __get_value();
852f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
853f52318b4SErik Pilkington    }
854f52318b4SErik Pilkington
855f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
856f52318b4SErik Pilkington    __nc_rref_pair_type __move()
857f52318b4SErik Pilkington    {
858f52318b4SErik Pilkington        value_type& __v = __get_value();
859f52318b4SErik Pilkington        return __nc_rref_pair_type(
860f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
861f52318b4SErik Pilkington            _VSTD::move(__v.second));
862f52318b4SErik Pilkington    }
8639fd9f84fSHoward Hinnant
8649fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8659fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
866f52318b4SErik Pilkington    {
867f52318b4SErik Pilkington        __ref() = __v.__get_value();
868f52318b4SErik Pilkington        return *this;
869f52318b4SErik Pilkington    }
8709fd9f84fSHoward Hinnant
8719fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8729fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
873f52318b4SErik Pilkington    {
874f52318b4SErik Pilkington        __ref() = __v.__move();
875f52318b4SErik Pilkington        return *this;
876f52318b4SErik Pilkington    }
8779fd9f84fSHoward Hinnant
878fcd02211SEric Fiselier    template <class _ValueTp,
8794887d047SNikolas Klauser              class = __enable_if_t<__is_same_uncvref<_ValueTp, value_type>::value>
880fcd02211SEric Fiselier             >
8819fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
882f52318b4SErik Pilkington    __hash_value_type& operator=(_ValueTp&& __v)
883f52318b4SErik Pilkington    {
884f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
885f52318b4SErik Pilkington        return *this;
886fcd02211SEric Fiselier    }
887fcd02211SEric Fiselier
888fcd02211SEric Fiselierprivate:
889fcd02211SEric Fiselier    __hash_value_type(const __hash_value_type& __v) = delete;
890fcd02211SEric Fiselier    __hash_value_type(__hash_value_type&& __v) = delete;
891fcd02211SEric Fiselier    template <class ..._Args>
892fcd02211SEric Fiselier    explicit __hash_value_type(_Args&& ...__args) = delete;
893fcd02211SEric Fiselier
894fcd02211SEric Fiselier    ~__hash_value_type() = delete;
8959fd9f84fSHoward Hinnant};
8969fd9f84fSHoward Hinnant
8979fd9f84fSHoward Hinnant#else
8989fd9f84fSHoward Hinnant
8999fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
9009fd9f84fSHoward Hinnantstruct __hash_value_type
9019fd9f84fSHoward Hinnant{
9029fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
9039fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
9049fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
9059fd9f84fSHoward Hinnant
906f52318b4SErik Pilkingtonprivate:
9079fd9f84fSHoward Hinnant    value_type __cc;
9089fd9f84fSHoward Hinnant
909f52318b4SErik Pilkingtonpublic:
910f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
911f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
912f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
913f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
914f52318b4SErik Pilkington
915fcd02211SEric Fiselierprivate:
916fcd02211SEric Fiselier   ~__hash_value_type();
9179fd9f84fSHoward Hinnant};
9189fd9f84fSHoward Hinnant
9199fd9f84fSHoward Hinnant#endif
9209fd9f84fSHoward Hinnant
9213e519524SHoward Hinnanttemplate <class _HashIterator>
922e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator
9233e519524SHoward Hinnant{
9243e519524SHoward Hinnant    _HashIterator __i_;
9253e519524SHoward Hinnant
92675d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
92775d0dcfdSEric Fiselier
9283e519524SHoward Hinnantpublic:
9293e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
93075d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
93175d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
9323e519524SHoward Hinnant    typedef value_type&                                          reference;
93375d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
9343e519524SHoward Hinnant
935789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9363714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
9373e519524SHoward Hinnant
938789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9393714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
9403e519524SHoward Hinnant
941789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
942f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
943789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
944f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
9453e519524SHoward Hinnant
946789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9473e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
948789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9493e519524SHoward Hinnant    __hash_map_iterator operator++(int)
9503e519524SHoward Hinnant    {
9513e519524SHoward Hinnant        __hash_map_iterator __t(*this);
9523e519524SHoward Hinnant        ++(*this);
9533e519524SHoward Hinnant        return __t;
9543e519524SHoward Hinnant    }
9553e519524SHoward Hinnant
956789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
957789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
9583e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
959789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
960789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
9613e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
9623e519524SHoward Hinnant
963e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
964e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
965e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
966e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
967e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
9683e519524SHoward Hinnant};
9693e519524SHoward Hinnant
9703e519524SHoward Hinnanttemplate <class _HashIterator>
971e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
9723e519524SHoward Hinnant{
9733e519524SHoward Hinnant    _HashIterator __i_;
9743e519524SHoward Hinnant
97575d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
97675d0dcfdSEric Fiselier
9773e519524SHoward Hinnantpublic:
9783e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
97975d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
98075d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
9813e519524SHoward Hinnant    typedef const value_type&                                    reference;
98275d0dcfdSEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
9833e519524SHoward Hinnant
984789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9853714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
9863e519524SHoward Hinnant
987789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9883714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
989789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9903e519524SHoward Hinnant    __hash_map_const_iterator(
9913e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
9923714107eSHoward Hinnant                 _NOEXCEPT
9933e519524SHoward Hinnant                : __i_(__i.__i_) {}
9943e519524SHoward Hinnant
995789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
996f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
997789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
998f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
9993e519524SHoward Hinnant
1000789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10013e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
1002789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10033e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
10043e519524SHoward Hinnant    {
10053e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
10063e519524SHoward Hinnant        ++(*this);
10073e519524SHoward Hinnant        return __t;
10083e519524SHoward Hinnant    }
10093e519524SHoward Hinnant
1010789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
1011789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
10123e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
1013789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
1014789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
10153e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
10163e519524SHoward Hinnant
1017e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
1018e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
1019e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
1020e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
10213e519524SHoward Hinnant};
10223e519524SHoward Hinnant
10235c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
10245c4e07aeSErik Pilkingtonclass unordered_multimap;
10255c4e07aeSErik Pilkington
10263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
10273e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1028e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map
10293e519524SHoward Hinnant{
10303e519524SHoward Hinnantpublic:
10313e519524SHoward Hinnant    // types
10323e519524SHoward Hinnant    typedef _Key                                           key_type;
10333e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
10343c6bd176SNikolas Klauser    typedef __type_identity_t<_Hash>                       hasher;
10353c6bd176SNikolas Klauser    typedef __type_identity_t<_Pred>                       key_equal;
10363c6bd176SNikolas Klauser    typedef __type_identity_t<_Alloc>                      allocator_type;
10373e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
10383e519524SHoward Hinnant    typedef value_type&                                    reference;
10393e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1040b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1041b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
10423e519524SHoward Hinnant
10433e519524SHoward Hinnantprivate:
10449fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                          __value_type;
1045e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher;
1046e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher>  __key_equal;
10471f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
10481f508014SMarshall Clow                                                 __value_type>::type          __allocator_type;
10493e519524SHoward Hinnant
10503e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
10513e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
10523e519524SHoward Hinnant
10533e519524SHoward Hinnant    __table __table_;
10543e519524SHoward Hinnant
1055fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
10563e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
10573e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
10583e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
10593e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
10603e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1061c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1062c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
10633e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
1064fcd02211SEric Fiselier
1065fcd02211SEric Fiselier    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
1066fcd02211SEric Fiselier    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
10673e519524SHoward Hinnantpublic:
10683e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
10693e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
107075d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
107175d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
10723e519524SHoward Hinnant
10733e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
10743e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
10753e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
10763e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
10773e519524SHoward Hinnant
1078b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1079b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
1080b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
1081b0386a51SErik Pilkington#endif
1082b0386a51SErik Pilkington
10835c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
10845c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
10855c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
10865c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
10875c4e07aeSErik Pilkington
1088789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10893714107eSHoward Hinnant    unordered_map()
10903714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1091b24c8024SHoward Hinnant    {
1092e3cf7050SNikolas Klauser        _VSTD::__debug_db_insert_c(this);
1093b24c8024SHoward Hinnant    }
10943e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
10953e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
10963e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
10973e519524SHoward Hinnant                  const key_equal& __eql,
10983e519524SHoward Hinnant                  const allocator_type& __a);
10993e519524SHoward Hinnant    template <class _InputIterator>
11003e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
11013e519524SHoward Hinnant    template <class _InputIterator>
11023e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
11033e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
11043e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
11053e519524SHoward Hinnant    template <class _InputIterator>
11063e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
11073e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
11083e519524SHoward Hinnant                      const key_equal& __eql,
11093e519524SHoward Hinnant                      const allocator_type& __a);
1110cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11113e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
11123e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
11133e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
11146a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1115cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11163714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
11173714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
11183e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
11193e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
11203e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
11213e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
11223e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
11233e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
11243e519524SHoward Hinnant                  const allocator_type& __a);
11256a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
11263cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
11273cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11283cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
11293cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
11303cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11313cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
11323cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
11333cd37e64SMarshall Clow    template <class _InputIterator>
11343cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11353cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
11363cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
11373cd37e64SMarshall Clow    template <class _InputIterator>
11383cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11393cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
11403cd37e64SMarshall Clow        const allocator_type& __a)
11413cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
11423cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11433cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
11443cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
11453cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11463cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
11473cd37e64SMarshall Clow      const allocator_type& __a)
11483cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
11493cd37e64SMarshall Clow#endif
11507c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
11517c142fccSLouis Dionne    ~unordered_map() {
11527c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
11537c142fccSLouis Dionne    }
11547c142fccSLouis Dionne
11555a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11565a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
11575a33687dSHoward Hinnant    {
11582ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
11595a33687dSHoward Hinnant        __table_ = __u.__table_;
1160307f8143SHoward Hinnant#else
1161b8608b87SMark de Wever        if (this != _VSTD::addressof(__u)) {
1162307f8143SHoward Hinnant            __table_.clear();
1163307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1164307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1165307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1166307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1167307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
116874cf6ff5SMarshall Clow        }
1169307f8143SHoward Hinnant#endif
11705a33687dSHoward Hinnant        return *this;
11715a33687dSHoward Hinnant    }
11726a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1173cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11743714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
11753714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1176cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11773e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
11786a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
11793e519524SHoward Hinnant
1180789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11813714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
11823e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
11833e519524SHoward Hinnant
118472c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
11853714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1186789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11873714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1188789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11893714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
11903e519524SHoward Hinnant
1191789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11923714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1193789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11943714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1195789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11963714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1197789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11983714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1199789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12003714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1201789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12023714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
12033e519524SHoward Hinnant
12047a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
12057a9f500fSEric Fiselier    pair<iterator, bool> insert(const value_type& __x)
12067a9f500fSEric Fiselier        {return __table_.__insert_unique(__x);}
12077a9f500fSEric Fiselier
12087a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x) {
1209d6e2c95dSMark de Wever        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
12107a9f500fSEric Fiselier                             "unordered_map::insert(const_iterator, const value_type&) called with an iterator not "
12117a9f500fSEric Fiselier                             "referring to this unordered_map");
1212fd838227SEric Fiselier        ((void)__p);
12137a9f500fSEric Fiselier        return insert(__x).first;
12147a9f500fSEric Fiselier    }
12157a9f500fSEric Fiselier
12167a9f500fSEric Fiselier    template <class _InputIterator>
1217cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
12187a9f500fSEric Fiselier        void insert(_InputIterator __first, _InputIterator __last);
12197a9f500fSEric Fiselier
12206a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12217a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
12227a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
12237a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
12247a9f500fSEric Fiselier
12257a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
12267a9f500fSEric Fiselier    pair<iterator, bool> insert(value_type&& __x)
12277a9f500fSEric Fiselier        {return __table_.__insert_unique(_VSTD::move(__x));}
12287a9f500fSEric Fiselier
12297a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x) {
1230d6e2c95dSMark de Wever        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
12317a9f500fSEric Fiselier                             "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
12327a9f500fSEric Fiselier                             " referring to this unordered_map");
1233fd838227SEric Fiselier        ((void)__p);
12347a9f500fSEric Fiselier        return __table_.__insert_unique(_VSTD::move(__x)).first;
12357a9f500fSEric Fiselier    }
12367a9f500fSEric Fiselier
12377a9f500fSEric Fiselier    template <class _Pp,
12384887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
12397a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
12407a9f500fSEric Fiselier        pair<iterator, bool> insert(_Pp&& __x)
12417a9f500fSEric Fiselier            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
12427a9f500fSEric Fiselier
12437a9f500fSEric Fiselier    template <class _Pp,
12444887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
12457a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
12467a9f500fSEric Fiselier        iterator insert(const_iterator __p, _Pp&& __x)
12477a9f500fSEric Fiselier        {
1248d6e2c95dSMark de Wever            _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
12497a9f500fSEric Fiselier                                 "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
12507a9f500fSEric Fiselier                                 " referring to this unordered_map");
1251fd838227SEric Fiselier          ((void)__p);
12527a9f500fSEric Fiselier            return insert(_VSTD::forward<_Pp>(__x)).first;
12537a9f500fSEric Fiselier        }
12547a9f500fSEric Fiselier
12558b805c91SHoward Hinnant    template <class... _Args>
1256fcd02211SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1257fcd02211SEric Fiselier    pair<iterator, bool> emplace(_Args&&... __args) {
1258fcd02211SEric Fiselier        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1259fcd02211SEric Fiselier    }
12603e519524SHoward Hinnant
12618b805c91SHoward Hinnant    template <class... _Args>
1262789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1263fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1264d6e2c95dSMark de Wever        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
12654c80bfbdSHoward Hinnant                             "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
12664c80bfbdSHoward Hinnant                             " referring to this unordered_map");
1267fd838227SEric Fiselier          ((void)__p);
1268ad783ce9SDuncan P. N. Exon Smith        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
12694c80bfbdSHoward Hinnant    }
1270fcd02211SEric Fiselier
1271fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG
1272fcd02211SEric Fiselier
1273bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
1274bc4c89a9SMarshall Clow    template <class... _Args>
1275bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1276bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1277bc4c89a9SMarshall Clow    {
1278d586f92cSArthur O'Dwyer        return __table_.__emplace_unique_key_args(__k, piecewise_construct,
127987c4104dSEric Fiselier            _VSTD::forward_as_tuple(__k),
128087c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1281bc4c89a9SMarshall Clow    }
1282bc4c89a9SMarshall Clow
1283bc4c89a9SMarshall Clow    template <class... _Args>
1284bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1285bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1286bc4c89a9SMarshall Clow    {
1287d586f92cSArthur O'Dwyer        return __table_.__emplace_unique_key_args(__k, piecewise_construct,
128887c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
128987c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1290bc4c89a9SMarshall Clow    }
1291bc4c89a9SMarshall Clow
1292bc4c89a9SMarshall Clow    template <class... _Args>
1293bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1294bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1295bc4c89a9SMarshall Clow    {
1296d6e2c95dSMark de Wever        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__h)) == this,
129787c4104dSEric Fiselier                             "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
129887c4104dSEric Fiselier                             " referring to this unordered_map");
1299fd838227SEric Fiselier        ((void)__h);
130087c4104dSEric Fiselier        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1301bc4c89a9SMarshall Clow    }
1302bc4c89a9SMarshall Clow
1303bc4c89a9SMarshall Clow    template <class... _Args>
1304bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1305bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1306bc4c89a9SMarshall Clow    {
1307d6e2c95dSMark de Wever        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__h)) == this,
130887c4104dSEric Fiselier                             "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
130987c4104dSEric Fiselier                             " referring to this unordered_map");
1310fd838227SEric Fiselier        ((void)__h);
131187c4104dSEric Fiselier        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1312bc4c89a9SMarshall Clow    }
1313bc4c89a9SMarshall Clow
1314bc4c89a9SMarshall Clow    template <class _Vp>
1315bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1316bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1317bc4c89a9SMarshall Clow    {
131887c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
131987c4104dSEric Fiselier            __k, _VSTD::forward<_Vp>(__v));
132087c4104dSEric Fiselier        if (!__res.second) {
132187c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1322bc4c89a9SMarshall Clow        }
132387c4104dSEric Fiselier        return __res;
1324bc4c89a9SMarshall Clow    }
1325bc4c89a9SMarshall Clow
1326bc4c89a9SMarshall Clow    template <class _Vp>
1327bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1328bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1329bc4c89a9SMarshall Clow    {
133087c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
133187c4104dSEric Fiselier            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
133287c4104dSEric Fiselier        if (!__res.second) {
133387c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1334bc4c89a9SMarshall Clow        }
133587c4104dSEric Fiselier        return __res;
1336bc4c89a9SMarshall Clow    }
1337bc4c89a9SMarshall Clow
1338bc4c89a9SMarshall Clow    template <class _Vp>
1339bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1340fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1341bc4c89a9SMarshall Clow     {
1342fd838227SEric Fiselier          // FIXME: Add debug mode checking for the iterator input
134387c4104dSEric Fiselier          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1344bc4c89a9SMarshall Clow     }
1345bc4c89a9SMarshall Clow
1346bc4c89a9SMarshall Clow    template <class _Vp>
1347bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1348fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1349bc4c89a9SMarshall Clow     {
1350fd838227SEric Fiselier        // FIXME: Add debug mode checking for the iterator input
135187c4104dSEric Fiselier        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1352bc4c89a9SMarshall Clow     }
13536a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14
1354bc4c89a9SMarshall Clow
1355789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13563e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1357789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1358ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1359ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13603e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1361789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13623e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
13633e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1364789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13653714107eSHoward Hinnant        void clear() _NOEXCEPT {__table_.clear();}
13663e519524SHoward Hinnant
1367b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1368b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1369b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1370b0386a51SErik Pilkington    {
1371b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1372b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1373b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<
1374b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1375b0386a51SErik Pilkington    }
1376b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1377b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1378b0386a51SErik Pilkington    {
1379b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1380b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1381b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<node_type>(
1382b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1383b0386a51SErik Pilkington    }
1384b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1385b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1386b0386a51SErik Pilkington    {
1387b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1388b0386a51SErik Pilkington    }
1389b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1390b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1391b0386a51SErik Pilkington    {
1392b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1393b0386a51SErik Pilkington            __it.__i_);
1394b0386a51SErik Pilkington    }
13955c4e07aeSErik Pilkington
13965c4e07aeSErik Pilkington    template <class _H2, class _P2>
13975c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13985c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
13995c4e07aeSErik Pilkington    {
14005c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14015c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14025c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
14035c4e07aeSErik Pilkington    }
14045c4e07aeSErik Pilkington    template <class _H2, class _P2>
14055c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14065c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
14075c4e07aeSErik Pilkington    {
14085c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14095c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14105c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
14115c4e07aeSErik Pilkington    }
14125c4e07aeSErik Pilkington    template <class _H2, class _P2>
14135c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14145c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
14155c4e07aeSErik Pilkington    {
14165c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14175c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14185c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
14195c4e07aeSErik Pilkington    }
14205c4e07aeSErik Pilkington    template <class _H2, class _P2>
14215c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14225c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
14235c4e07aeSErik Pilkington    {
14245c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14255c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14265c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
14275c4e07aeSErik Pilkington    }
1428b0386a51SErik Pilkington#endif
1429b0386a51SErik Pilkington
1430789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14313714107eSHoward Hinnant    void swap(unordered_map& __u)
14323714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
14333714107eSHoward Hinnant        { __table_.swap(__u.__table_);}
14343e519524SHoward Hinnant
1435789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14363e519524SHoward Hinnant    hasher hash_function() const
14373e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1438789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14393e519524SHoward Hinnant    key_equal key_eq() const
14403e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
14413e519524SHoward Hinnant
1442789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14433e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1444789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14453e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1446e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
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    iterator       find(const _K2& __k)            {return __table_.find(__k);}
1450d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
1451e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
1452d5db71d1SArthur O'Dwyer    const_iterator find(const _K2& __k) const      {return __table_.find(__k);}
1453e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
1454e5ec94a1SRuslan Arutyunyan
1455789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14563e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1457a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
1458d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
1459e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
1460d5db71d1SArthur O'Dwyer    size_type count(const _K2& __k) const      {return __table_.__count_unique(__k);}
1461e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
1462d5db71d1SArthur O'Dwyer
1463e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
1464a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
1465a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
1466e5ec94a1SRuslan Arutyunyan
1467d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
1468e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
1469d5db71d1SArthur O'Dwyer    bool contains(const _K2& __k) const      {return find(__k) != end();}
1470a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
1471d5db71d1SArthur O'Dwyer
1472789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14733e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
14743e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1475789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14763e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
14773e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1478e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
1479d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
1480e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
1481d5db71d1SArthur O'Dwyer    pair<iterator, iterator>             equal_range(const _K2& __k)
1482d5db71d1SArthur O'Dwyer        {return __table_.__equal_range_unique(__k);}
1483d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
1484e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
1485d5db71d1SArthur O'Dwyer    pair<const_iterator, const_iterator> equal_range(const _K2& __k) const
1486d5db71d1SArthur O'Dwyer        {return __table_.__equal_range_unique(__k);}
1487e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
14883e519524SHoward Hinnant
14893e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
14900f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14913e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
14923e519524SHoward Hinnant#endif
14933e519524SHoward Hinnant
14943e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
14953e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
14963e519524SHoward Hinnant
1497789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14983714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1499789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15003714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
15013e519524SHoward Hinnant
1502789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15033e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
15043e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1505789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15063e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
15073e519524SHoward Hinnant
1508789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15093e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1510789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15113e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1512789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15133e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1514789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15153e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1516789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15173e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1518789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15193e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
15203e519524SHoward Hinnant
1521789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15223714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1523789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15243714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1525789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15263e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1527789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1528*3085e42fSIvan Trofimov    void rehash(size_type __n) {__table_.__rehash_unique(__n);}
1529789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1530*3085e42fSIvan Trofimov    void reserve(size_type __n) {__table_.__reserve_unique(__n);}
15313e519524SHoward Hinnant
1532f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE
1533b24c8024SHoward Hinnant
1534b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1535968e2739SMark de Wever        {return __table_.__dereferenceable(_VSTD::addressof(__i->__i_));}
1536b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1537968e2739SMark de Wever        {return __table_.__decrementable(_VSTD::addressof(__i->__i_));}
1538b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1539968e2739SMark de Wever        {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);}
1540b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1541968e2739SMark de Wever        {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);}
1542b24c8024SHoward Hinnant
1543f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE
1544b24c8024SHoward Hinnant
15453e519524SHoward Hinnantprivate:
15460f905677SEric Fiselier
15470f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
15484a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
15490f905677SEric Fiselier#endif
15503e519524SHoward Hinnant};
15513e519524SHoward Hinnant
155201666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1553dfcd4384SLouis Dionnetemplate<class _InputIterator,
1554dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
1555dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
1556dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
155768072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
15584e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
15594e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
15604e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
15614e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1562dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
1563dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1564dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
1565dfcd4384SLouis Dionne
1566dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
1567dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
1568dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
15694e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
15704e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
15714e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
15724e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1573dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
1574dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1575dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
1576dfcd4384SLouis Dionne
1577dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
157868072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
15794e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1580dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
1581dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1582dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1583dfcd4384SLouis Dionne
1584dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
158568072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
15864e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1587dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator)
1588dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1589dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1590dfcd4384SLouis Dionne
1591dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
159268072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
15934e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
15944e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
15954e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1596dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1597dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1598dfcd4384SLouis Dionne                   _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1599dfcd4384SLouis Dionne
1600dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
16014e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1602dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
1603dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1604dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1605dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1606dfcd4384SLouis Dionne
1607dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
16084e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1609dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1610dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1611dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1612dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1613dfcd4384SLouis Dionne
1614dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
16154e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
16164e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
16174e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1618dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1619dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash,
1620dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1621dfcd4384SLouis Dionne#endif
1622dfcd4384SLouis Dionne
16233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16243e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16253e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
16263e519524SHoward Hinnant    : __table_(__hf, __eql)
16273e519524SHoward Hinnant{
1628e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1629*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
16303e519524SHoward Hinnant}
16313e519524SHoward Hinnant
16323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16333e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16343e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
16353e519524SHoward Hinnant        const allocator_type& __a)
16362a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
16373e519524SHoward Hinnant{
1638e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1639*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
16403e519524SHoward Hinnant}
16413e519524SHoward Hinnant
16423e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1643cd31b434SEvgeniy Stepanovinline
16443e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16453e519524SHoward Hinnant        const allocator_type& __a)
16462a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
16473e519524SHoward Hinnant{
1648e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
16493e519524SHoward Hinnant}
16503e519524SHoward Hinnant
16513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16523e519524SHoward Hinnanttemplate <class _InputIterator>
16533e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16543e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
16553e519524SHoward Hinnant{
1656e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
16573e519524SHoward Hinnant    insert(__first, __last);
16583e519524SHoward Hinnant}
16593e519524SHoward Hinnant
16603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16613e519524SHoward Hinnanttemplate <class _InputIterator>
16623e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16633e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
16643e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
16653e519524SHoward Hinnant    : __table_(__hf, __eql)
16663e519524SHoward Hinnant{
1667e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1668*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
16693e519524SHoward Hinnant    insert(__first, __last);
16703e519524SHoward Hinnant}
16713e519524SHoward Hinnant
16723e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16733e519524SHoward Hinnanttemplate <class _InputIterator>
16743e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16753e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
16763e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
16772a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
16783e519524SHoward Hinnant{
1679e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1680*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
16813e519524SHoward Hinnant    insert(__first, __last);
16823e519524SHoward Hinnant}
16833e519524SHoward Hinnant
16843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16853e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16863e519524SHoward Hinnant        const unordered_map& __u)
16873e519524SHoward Hinnant    : __table_(__u.__table_)
16883e519524SHoward Hinnant{
1689e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1690*3085e42fSIvan Trofimov    __table_.__rehash_unique(__u.bucket_count());
16913e519524SHoward Hinnant    insert(__u.begin(), __u.end());
16923e519524SHoward Hinnant}
16933e519524SHoward Hinnant
16943e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16953e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16963e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
16972a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
16983e519524SHoward Hinnant{
1699e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1700*3085e42fSIvan Trofimov    __table_.__rehash_unique(__u.bucket_count());
17013e519524SHoward Hinnant    insert(__u.begin(), __u.end());
17023e519524SHoward Hinnant}
17033e519524SHoward Hinnant
17046a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17053e519524SHoward Hinnant
17063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1707cd31b434SEvgeniy Stepanovinline
17083e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
17093e519524SHoward Hinnant        unordered_map&& __u)
17103714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1711ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
17123e519524SHoward Hinnant{
1713e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
171408f68dfeSNikolas Klauser    std::__debug_db_swap(this, std::addressof(__u));
17153e519524SHoward Hinnant}
17163e519524SHoward Hinnant
17173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17183e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
17193e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
17202a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
17213e519524SHoward Hinnant{
1722e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
17233e519524SHoward Hinnant    if (__a != __u.get_allocator())
17243e519524SHoward Hinnant    {
17253e519524SHoward Hinnant        iterator __i = __u.begin();
1726fcd02211SEric Fiselier        while (__u.size() != 0) {
1727f52318b4SErik Pilkington            __table_.__emplace_unique(
1728f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
1729fcd02211SEric Fiselier        }
17303e519524SHoward Hinnant    }
17314c80bfbdSHoward Hinnant    else
173208f68dfeSNikolas Klauser        std::__debug_db_swap(this, std::addressof(__u));
17333e519524SHoward Hinnant}
17343e519524SHoward Hinnant
17353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17363e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
17373e519524SHoward Hinnant        initializer_list<value_type> __il)
17383e519524SHoward Hinnant{
1739e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
17403e519524SHoward Hinnant    insert(__il.begin(), __il.end());
17413e519524SHoward Hinnant}
17423e519524SHoward Hinnant
17433e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17443e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
17453e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
17463e519524SHoward Hinnant        const key_equal& __eql)
17473e519524SHoward Hinnant    : __table_(__hf, __eql)
17483e519524SHoward Hinnant{
1749e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1750*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
17513e519524SHoward Hinnant    insert(__il.begin(), __il.end());
17523e519524SHoward Hinnant}
17533e519524SHoward Hinnant
17543e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17553e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
17563e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
17573e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
17582a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
17593e519524SHoward Hinnant{
1760e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
1761*3085e42fSIvan Trofimov    __table_.__rehash_unique(__n);
17623e519524SHoward Hinnant    insert(__il.begin(), __il.end());
17633e519524SHoward Hinnant}
17643e519524SHoward Hinnant
17653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1766cd31b434SEvgeniy Stepanovinline
17673e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
17683e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
17693714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
17703e519524SHoward Hinnant{
1771ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
17723e519524SHoward Hinnant    return *this;
17733e519524SHoward Hinnant}
17743e519524SHoward Hinnant
17753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1776cd31b434SEvgeniy Stepanovinline
17773e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
17783e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
17793e519524SHoward Hinnant        initializer_list<value_type> __il)
17803e519524SHoward Hinnant{
17813e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
17823e519524SHoward Hinnant    return *this;
17833e519524SHoward Hinnant}
17843e519524SHoward Hinnant
17856a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
17863e519524SHoward Hinnant
17873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17883e519524SHoward Hinnanttemplate <class _InputIterator>
1789cd31b434SEvgeniy Stepanovinline
17903e519524SHoward Hinnantvoid
17913e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
17923e519524SHoward Hinnant                                                       _InputIterator __last)
17933e519524SHoward Hinnant{
17943e519524SHoward Hinnant    for (; __first != __last; ++__first)
17953e519524SHoward Hinnant        __table_.__insert_unique(*__first);
17963e519524SHoward Hinnant}
17973e519524SHoward Hinnant
17986a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17993e519524SHoward Hinnant
18000f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18010f905677SEric Fiselier_Tp&
18020f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
18030f905677SEric Fiselier{
18040f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
1805d586f92cSArthur O'Dwyer        piecewise_construct, _VSTD::forward_as_tuple(__k),
1806d586f92cSArthur O'Dwyer                             _VSTD::forward_as_tuple()).first->__get_value().second;
18070f905677SEric Fiselier}
18083e519524SHoward Hinnant
18093e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18103e519524SHoward Hinnant_Tp&
18113e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
18123e519524SHoward Hinnant{
18130f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
1814d586f92cSArthur O'Dwyer        piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1815d586f92cSArthur O'Dwyer                             _VSTD::forward_as_tuple()).first->__get_value().second;
18163e519524SHoward Hinnant}
18176a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG
18183e519524SHoward Hinnant
18196a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18206a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
18216a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
18226a470bcbSEric Fiselier{
18236a470bcbSEric Fiselier    __node_allocator& __na = __table_.__node_alloc();
18246a470bcbSEric Fiselier    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1825f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
18266a470bcbSEric Fiselier    __h.get_deleter().__first_constructed = true;
1827f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
18286a470bcbSEric Fiselier    __h.get_deleter().__second_constructed = true;
18298d4860aaSLouis Dionne    return __h;
18306a470bcbSEric Fiselier}
18316a470bcbSEric Fiselier
18326a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18336a470bcbSEric Fiselier_Tp&
18346a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
18356a470bcbSEric Fiselier{
18366a470bcbSEric Fiselier    iterator __i = find(__k);
18376a470bcbSEric Fiselier    if (__i != end())
18386a470bcbSEric Fiselier        return __i->second;
18396a470bcbSEric Fiselier    __node_holder __h = __construct_node_with_key(__k);
18406a470bcbSEric Fiselier    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
18416a470bcbSEric Fiselier    __h.release();
18426a470bcbSEric Fiselier    return __r.first->second;
18436a470bcbSEric Fiselier}
18446a470bcbSEric Fiselier
1845e6972024SArthur O'Dwyer#endif // _LIBCPP_CXX03_LANG
18463e519524SHoward Hinnant
18473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18483e519524SHoward Hinnant_Tp&
18493e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
18503e519524SHoward Hinnant{
18513e519524SHoward Hinnant    iterator __i = find(__k);
18523e519524SHoward Hinnant    if (__i == end())
18537232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
18543e519524SHoward Hinnant    return __i->second;
18553e519524SHoward Hinnant}
18563e519524SHoward Hinnant
18573e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18583e519524SHoward Hinnantconst _Tp&
18593e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
18603e519524SHoward Hinnant{
18613e519524SHoward Hinnant    const_iterator __i = find(__k);
18623e519524SHoward Hinnant    if (__i == end())
18637232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
18643e519524SHoward Hinnant    return __i->second;
18653e519524SHoward Hinnant}
18663e519524SHoward Hinnant
18673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1868789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18693e519524SHoward Hinnantvoid
18703e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
18713e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
18723714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
18733e519524SHoward Hinnant{
18743e519524SHoward Hinnant    __x.swap(__y);
18753e519524SHoward Hinnant}
18763e519524SHoward Hinnant
1877f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
18783e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
18793e895085SMarek Kurdej          class _Predicate>
1880f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
18813e895085SMarek Kurdej    typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type
18823e895085SMarek Kurdej    erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c,
18833e895085SMarek Kurdej             _Predicate __pred) {
18842ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
18853e895085SMarek Kurdej}
1886f60c63c0SMarshall Clow#endif
1887f60c63c0SMarshall Clow
18883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18893e519524SHoward Hinnantbool
18903e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
18913e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
18923e519524SHoward Hinnant{
18933e519524SHoward Hinnant    if (__x.size() != __y.size())
18943e519524SHoward Hinnant        return false;
18953e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
18963e519524SHoward Hinnant                                                                 const_iterator;
18973e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
18983e519524SHoward Hinnant            __i != __ex; ++__i)
18993e519524SHoward Hinnant    {
19003e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
19013e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
19023e519524SHoward Hinnant            return false;
19033e519524SHoward Hinnant    }
19043e519524SHoward Hinnant    return true;
19053e519524SHoward Hinnant}
19063e519524SHoward Hinnant
19073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1908789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19093e519524SHoward Hinnantbool
19103e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
19113e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
19123e519524SHoward Hinnant{
19133e519524SHoward Hinnant    return !(__x == __y);
19143e519524SHoward Hinnant}
19153e519524SHoward Hinnant
19163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
19173e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1918e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap
19193e519524SHoward Hinnant{
19203e519524SHoward Hinnantpublic:
19213e519524SHoward Hinnant    // types
19223e519524SHoward Hinnant    typedef _Key                                           key_type;
19233e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
19243c6bd176SNikolas Klauser    typedef __type_identity_t<_Hash>                       hasher;
19253c6bd176SNikolas Klauser    typedef __type_identity_t<_Pred>                       key_equal;
19263c6bd176SNikolas Klauser    typedef __type_identity_t<_Alloc>                      allocator_type;
19273e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
19283e519524SHoward Hinnant    typedef value_type&                                    reference;
19293e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1930b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1931b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
19323e519524SHoward Hinnant
19333e519524SHoward Hinnantprivate:
19349fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                          __value_type;
1935e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher;
1936e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher>  __key_equal;
19371f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
19381f508014SMarshall Clow                                                 __value_type>::type          __allocator_type;
19393e519524SHoward Hinnant
19403e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
19413e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
19423e519524SHoward Hinnant
19433e519524SHoward Hinnant    __table __table_;
19443e519524SHoward Hinnant
1945fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
19463e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
19473e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
19483e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1949c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1950c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
19513e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
195275d0dcfdSEric Fiselier    static_assert((is_same<typename __node_traits::size_type,
195375d0dcfdSEric Fiselier                          typename __alloc_traits::size_type>::value),
195475d0dcfdSEric Fiselier                 "Allocator uses different size_type for different types");
19553e519524SHoward Hinnantpublic:
19563e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
19573e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
195875d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
195975d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
19603e519524SHoward Hinnant
19613e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
19623e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
19633e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
19643e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
19653e519524SHoward Hinnant
1966b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1967b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
1968b0386a51SErik Pilkington#endif
1969b0386a51SErik Pilkington
19705c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
19715c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
19725c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
19735c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
19745c4e07aeSErik Pilkington
1975789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19763714107eSHoward Hinnant    unordered_multimap()
19773714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1978b24c8024SHoward Hinnant    {
1979e3cf7050SNikolas Klauser        _VSTD::__debug_db_insert_c(this);
1980b24c8024SHoward Hinnant    }
19813e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
19823e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
19833e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
19843e519524SHoward Hinnant                                const key_equal& __eql,
19853e519524SHoward Hinnant                                const allocator_type& __a);
19863e519524SHoward Hinnant    template <class _InputIterator>
19873e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
19883e519524SHoward Hinnant    template <class _InputIterator>
19893e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
19903e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
19913e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
19923e519524SHoward Hinnant    template <class _InputIterator>
19933e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
19943e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
19953e519524SHoward Hinnant                      const key_equal& __eql,
19963e519524SHoward Hinnant                      const allocator_type& __a);
1997cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
19983e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
19993e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
20003e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
20016a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2002cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20033714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
20043714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
20053e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
20063e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
20073e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
20083e519524SHoward Hinnant                       const hasher& __hf = hasher(),
20093e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
20103e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
20113e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
20123e519524SHoward Hinnant                       const allocator_type& __a);
20136a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
20143cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
20153cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20163cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
20173cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
20183cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20193cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
20203cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
20213cd37e64SMarshall Clow    template <class _InputIterator>
20223cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20233cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
20243cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
20253cd37e64SMarshall Clow    template <class _InputIterator>
20263cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20273cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
20283cd37e64SMarshall Clow        const allocator_type& __a)
20293cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
20303cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20313cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
20323cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
20333cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20343cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
20353cd37e64SMarshall Clow      const allocator_type& __a)
20363cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
20373cd37e64SMarshall Clow#endif
20387c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
20397c142fccSLouis Dionne    ~unordered_multimap() {
20407c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
20417c142fccSLouis Dionne    }
20427c142fccSLouis Dionne
20435a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20445a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
20455a33687dSHoward Hinnant    {
20462ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
20475a33687dSHoward Hinnant        __table_ = __u.__table_;
2048307f8143SHoward Hinnant#else
2049b8608b87SMark de Wever        if (this != _VSTD::addressof(__u)) {
2050307f8143SHoward Hinnant            __table_.clear();
2051307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
2052307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
2053307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
2054307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
2055307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
205674cf6ff5SMarshall Clow        }
2057307f8143SHoward Hinnant#endif
20585a33687dSHoward Hinnant        return *this;
20595a33687dSHoward Hinnant    }
20606a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2061cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20623714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
20633714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
2064cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20653e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
20666a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
20673e519524SHoward Hinnant
2068789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20693714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
20703e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
20713e519524SHoward Hinnant
207272c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
20733714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
2074789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20753714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
2076789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20773714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
20783e519524SHoward Hinnant
2079789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20803714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
2081789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20823714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
2083789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20843714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
2085789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20863714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
2087789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20883714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
2089789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20903714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
20913e519524SHoward Hinnant
20927a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20937a9f500fSEric Fiselier    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
20947a9f500fSEric Fiselier
20957a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20967a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x)
20977a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, __x);}
20987a9f500fSEric Fiselier
20997a9f500fSEric Fiselier    template <class _InputIterator>
2100cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
21017a9f500fSEric Fiselier    void insert(_InputIterator __first, _InputIterator __last);
21027a9f500fSEric Fiselier
21036a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
21047a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
21057a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
21067a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
21077a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
21087a9f500fSEric Fiselier    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
21097a9f500fSEric Fiselier
21107a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
21117a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x)
21127a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
21137a9f500fSEric Fiselier
21147a9f500fSEric Fiselier    template <class _Pp,
21154887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
21167a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
21177a9f500fSEric Fiselier    iterator insert(_Pp&& __x)
21187a9f500fSEric Fiselier        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
21197a9f500fSEric Fiselier
21207a9f500fSEric Fiselier    template <class _Pp,
21214887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
21227a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
21237a9f500fSEric Fiselier    iterator insert(const_iterator __p, _Pp&& __x)
21247a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
21257a9f500fSEric Fiselier
2126fcd02211SEric Fiselier    template <class... _Args>
2127fcd02211SEric Fiselier    iterator emplace(_Args&&... __args) {
2128fcd02211SEric Fiselier        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
2129fcd02211SEric Fiselier    }
21307609c9b6SHoward Hinnant
21318b805c91SHoward Hinnant    template <class... _Args>
2132fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
2133fcd02211SEric Fiselier        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
2134fcd02211SEric Fiselier    }
2135fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG
21363e519524SHoward Hinnant
21373e519524SHoward Hinnant
2138789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21393e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
2140789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2141ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
2142ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21433e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
2144789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21453e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
21463e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
2147789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21483714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
21493e519524SHoward Hinnant
2150b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
2151b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2152b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
2153b0386a51SErik Pilkington    {
2154b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2155b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
2156b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
2157b0386a51SErik Pilkington            _VSTD::move(__nh));
2158b0386a51SErik Pilkington    }
2159b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2160b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
2161b0386a51SErik Pilkington    {
2162b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2163b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
2164b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
2165b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
2166b0386a51SErik Pilkington    }
2167b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2168b0386a51SErik Pilkington    node_type extract(key_type const& __key)
2169b0386a51SErik Pilkington    {
2170b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
2171b0386a51SErik Pilkington    }
2172b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2173b0386a51SErik Pilkington    node_type extract(const_iterator __it)
2174b0386a51SErik Pilkington    {
2175b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
2176b0386a51SErik Pilkington            __it.__i_);
2177b0386a51SErik Pilkington    }
21785c4e07aeSErik Pilkington
21795c4e07aeSErik Pilkington    template <class _H2, class _P2>
21805c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21815c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
21825c4e07aeSErik Pilkington    {
21835c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21845c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21855c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21865c4e07aeSErik Pilkington    }
21875c4e07aeSErik Pilkington    template <class _H2, class _P2>
21885c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21895c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
21905c4e07aeSErik Pilkington    {
21915c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21925c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21935c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21945c4e07aeSErik Pilkington    }
21955c4e07aeSErik Pilkington    template <class _H2, class _P2>
21965c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21975c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
21985c4e07aeSErik Pilkington    {
21995c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
22005c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
22015c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
22025c4e07aeSErik Pilkington    }
22035c4e07aeSErik Pilkington    template <class _H2, class _P2>
22045c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
22055c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
22065c4e07aeSErik Pilkington    {
22075c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
22085c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
22095c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
22105c4e07aeSErik Pilkington    }
2211b0386a51SErik Pilkington#endif
2212b0386a51SErik Pilkington
2213789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22143714107eSHoward Hinnant    void swap(unordered_multimap& __u)
22153714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
22163714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
22173e519524SHoward Hinnant
2218789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22193e519524SHoward Hinnant    hasher hash_function() const
22203e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
2221789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22223e519524SHoward Hinnant    key_equal key_eq() const
22233e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
22243e519524SHoward Hinnant
2225789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22263e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
2227789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22283e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
2229e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
2230d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2231e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2232d5db71d1SArthur O'Dwyer    iterator       find(const _K2& __k)            {return __table_.find(__k);}
2233d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2234e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2235d5db71d1SArthur O'Dwyer    const_iterator find(const _K2& __k) const      {return __table_.find(__k);}
2236e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
2237d5db71d1SArthur O'Dwyer
2238789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22393e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
2240a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
2241d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2242e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2243d5db71d1SArthur O'Dwyer    size_type count(const _K2& __k) const      {return __table_.__count_multi(__k);}
2244e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
2245d5db71d1SArthur O'Dwyer
2246e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
2247a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
2248a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
2249e5ec94a1SRuslan Arutyunyan
2250d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2251e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2252d5db71d1SArthur O'Dwyer    bool contains(const _K2& __k) const      {return find(__k) != end();}
2253a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
2254d5db71d1SArthur O'Dwyer
2255789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22563e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
22573e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
2258789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22593e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
22603e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
2261e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
2262d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2263e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2264d5db71d1SArthur O'Dwyer    pair<iterator, iterator>             equal_range(const _K2& __k)
2265d5db71d1SArthur O'Dwyer        {return __table_.__equal_range_multi(__k);}
2266d5db71d1SArthur O'Dwyer    template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr>
2267e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
2268d5db71d1SArthur O'Dwyer    pair<const_iterator, const_iterator> equal_range(const _K2& __k) const
2269d5db71d1SArthur O'Dwyer        {return __table_.__equal_range_multi(__k);}
2270e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17
22713e519524SHoward Hinnant
2272789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22733714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
2274789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22753714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
22763714107eSHoward Hinnant        {return __table_.max_bucket_count();}
22773e519524SHoward Hinnant
2278789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22793e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
22803e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
2281789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22823e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
22833e519524SHoward Hinnant
2284789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22853e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
2286789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22873e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
2288789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22893e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
2290789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22913e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
2292789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22933e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
2294789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22953e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
22963e519524SHoward Hinnant
2297789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22983714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
2299789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
23003714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
2301789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
23023e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
2303789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2304*3085e42fSIvan Trofimov    void rehash(size_type __n) {__table_.__rehash_multi(__n);}
2305789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2306*3085e42fSIvan Trofimov    void reserve(size_type __n) {__table_.__reserve_multi(__n);}
23073e519524SHoward Hinnant
2308f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE
2309b24c8024SHoward Hinnant
2310b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
2311968e2739SMark de Wever        {return __table_.__dereferenceable(_VSTD::addressof(__i->__i_));}
2312b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
2313968e2739SMark de Wever        {return __table_.__decrementable(_VSTD::addressof(__i->__i_));}
2314b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
2315968e2739SMark de Wever        {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);}
2316b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2317968e2739SMark de Wever        {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);}
2318b24c8024SHoward Hinnant
2319f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE
2320b24c8024SHoward Hinnant
2321fcd02211SEric Fiselier
23223e519524SHoward Hinnant};
23233e519524SHoward Hinnant
232401666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
2325dfcd4384SLouis Dionnetemplate<class _InputIterator,
2326dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
2327dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
2328dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
232968072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
23304e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
23314e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
23324e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
23334e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2334dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
2335dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2336dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
2337dfcd4384SLouis Dionne
2338dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
2339dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
2340dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
23414e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
23424e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
23434e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
23444e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2345dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
2346dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2347dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
2348dfcd4384SLouis Dionne
2349dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
235068072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
23514e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2352dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
2353dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2354dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2355dfcd4384SLouis Dionne
2356dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
235768072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
23584e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2359dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator)
2360dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2361dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2362dfcd4384SLouis Dionne
2363dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
236468072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
23654e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
23664e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
23674e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2368dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2369dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2370dfcd4384SLouis Dionne                        _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2371dfcd4384SLouis Dionne
2372dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
23734e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2374dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
2375dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2376dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2377dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2378dfcd4384SLouis Dionne
2379dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
23804e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2381dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2382dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2383dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2384dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2385dfcd4384SLouis Dionne
2386dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
23874e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
23884e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
23894e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2390dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2391dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash,
2392dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2393dfcd4384SLouis Dionne#endif
2394dfcd4384SLouis Dionne
23953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23963e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23973e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
23983e519524SHoward Hinnant    : __table_(__hf, __eql)
23993e519524SHoward Hinnant{
2400e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2401*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
24023e519524SHoward Hinnant}
24033e519524SHoward Hinnant
24043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24053e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24063e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
24073e519524SHoward Hinnant        const allocator_type& __a)
24082a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
24093e519524SHoward Hinnant{
2410e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2411*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
24123e519524SHoward Hinnant}
24133e519524SHoward Hinnant
24143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24153e519524SHoward Hinnanttemplate <class _InputIterator>
24163e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24173e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
24183e519524SHoward Hinnant{
2419e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
24203e519524SHoward Hinnant    insert(__first, __last);
24213e519524SHoward Hinnant}
24223e519524SHoward Hinnant
24233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24243e519524SHoward Hinnanttemplate <class _InputIterator>
24253e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24263e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
24273e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
24283e519524SHoward Hinnant    : __table_(__hf, __eql)
24293e519524SHoward Hinnant{
2430e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2431*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
24323e519524SHoward Hinnant    insert(__first, __last);
24333e519524SHoward Hinnant}
24343e519524SHoward Hinnant
24353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24363e519524SHoward Hinnanttemplate <class _InputIterator>
24373e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24383e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
24393e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
24402a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
24413e519524SHoward Hinnant{
2442e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2443*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
24443e519524SHoward Hinnant    insert(__first, __last);
24453e519524SHoward Hinnant}
24463e519524SHoward Hinnant
24473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2448cd31b434SEvgeniy Stepanovinline
24493e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24503e519524SHoward Hinnant        const allocator_type& __a)
24512a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
24523e519524SHoward Hinnant{
2453e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
24543e519524SHoward Hinnant}
24553e519524SHoward Hinnant
24563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24573e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24583e519524SHoward Hinnant        const unordered_multimap& __u)
24593e519524SHoward Hinnant    : __table_(__u.__table_)
24603e519524SHoward Hinnant{
2461e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2462*3085e42fSIvan Trofimov    __table_.__rehash_multi(__u.bucket_count());
24633e519524SHoward Hinnant    insert(__u.begin(), __u.end());
24643e519524SHoward Hinnant}
24653e519524SHoward Hinnant
24663e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24673e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24683e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
24692a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
24703e519524SHoward Hinnant{
2471e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2472*3085e42fSIvan Trofimov    __table_.__rehash_multi(__u.bucket_count());
24733e519524SHoward Hinnant    insert(__u.begin(), __u.end());
24743e519524SHoward Hinnant}
24753e519524SHoward Hinnant
24766a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
24773e519524SHoward Hinnant
24783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2479cd31b434SEvgeniy Stepanovinline
24803e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24813e519524SHoward Hinnant        unordered_multimap&& __u)
24823714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2483ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
24843e519524SHoward Hinnant{
2485e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
248608f68dfeSNikolas Klauser    std::__debug_db_swap(this, std::addressof(__u));
24873e519524SHoward Hinnant}
24883e519524SHoward Hinnant
24893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24903e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24913e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
24922a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
24933e519524SHoward Hinnant{
2494e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
24953e519524SHoward Hinnant    if (__a != __u.get_allocator())
24963e519524SHoward Hinnant    {
24973e519524SHoward Hinnant        iterator __i = __u.begin();
24983e519524SHoward Hinnant        while (__u.size() != 0)
24993e519524SHoward Hinnant        {
25003e519524SHoward Hinnant            __table_.__insert_multi(
2501f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
25023e519524SHoward Hinnant        }
25033e519524SHoward Hinnant    }
25044c80bfbdSHoward Hinnant    else
250508f68dfeSNikolas Klauser        std::__debug_db_swap(this, std::addressof(__u));
25063e519524SHoward Hinnant}
25073e519524SHoward Hinnant
25083e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25093e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
25103e519524SHoward Hinnant        initializer_list<value_type> __il)
25113e519524SHoward Hinnant{
2512e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
25133e519524SHoward Hinnant    insert(__il.begin(), __il.end());
25143e519524SHoward Hinnant}
25153e519524SHoward Hinnant
25163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25173e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
25183e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
25193e519524SHoward Hinnant        const key_equal& __eql)
25203e519524SHoward Hinnant    : __table_(__hf, __eql)
25213e519524SHoward Hinnant{
2522e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2523*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
25243e519524SHoward Hinnant    insert(__il.begin(), __il.end());
25253e519524SHoward Hinnant}
25263e519524SHoward Hinnant
25273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25283e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
25293e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
25303e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
25312a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
25323e519524SHoward Hinnant{
2533e3cf7050SNikolas Klauser    _VSTD::__debug_db_insert_c(this);
2534*3085e42fSIvan Trofimov    __table_.__rehash_multi(__n);
25353e519524SHoward Hinnant    insert(__il.begin(), __il.end());
25363e519524SHoward Hinnant}
25373e519524SHoward Hinnant
25383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2539cd31b434SEvgeniy Stepanovinline
25403e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
25413e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
25423714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
25433e519524SHoward Hinnant{
2544ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
25453e519524SHoward Hinnant    return *this;
25463e519524SHoward Hinnant}
25473e519524SHoward Hinnant
25483e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2549cd31b434SEvgeniy Stepanovinline
25503e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
25513e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
25523e519524SHoward Hinnant        initializer_list<value_type> __il)
25533e519524SHoward Hinnant{
25543e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
25553e519524SHoward Hinnant    return *this;
25563e519524SHoward Hinnant}
25573e519524SHoward Hinnant
25586a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
255954976f26SHoward Hinnant
25603e519524SHoward Hinnant
25613e519524SHoward Hinnant
25623e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25633e519524SHoward Hinnanttemplate <class _InputIterator>
2564cd31b434SEvgeniy Stepanovinline
25653e519524SHoward Hinnantvoid
25663e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
25673e519524SHoward Hinnant                                                            _InputIterator __last)
25683e519524SHoward Hinnant{
25693e519524SHoward Hinnant    for (; __first != __last; ++__first)
25703e519524SHoward Hinnant        __table_.__insert_multi(*__first);
25713e519524SHoward Hinnant}
25723e519524SHoward Hinnant
25733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2574789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25753e519524SHoward Hinnantvoid
25763e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
25773e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
25783714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
25793e519524SHoward Hinnant{
25803e519524SHoward Hinnant    __x.swap(__y);
25813e519524SHoward Hinnant}
25823e519524SHoward Hinnant
2583f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
25843e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
25853e895085SMarek Kurdej          class _Predicate>
2586f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
25873e895085SMarek Kurdej    typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type
25883e895085SMarek Kurdej    erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c,
25893e895085SMarek Kurdej             _Predicate __pred) {
25902ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
25913e895085SMarek Kurdej}
2592f60c63c0SMarshall Clow#endif
2593f60c63c0SMarshall Clow
25943e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25953e519524SHoward Hinnantbool
25963e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
25973e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
25983e519524SHoward Hinnant{
25993e519524SHoward Hinnant    if (__x.size() != __y.size())
26003e519524SHoward Hinnant        return false;
26013e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
26023e519524SHoward Hinnant                                                                 const_iterator;
26033e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
26043e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
26053e519524SHoward Hinnant    {
26063e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
26073e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2608ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2609ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2610ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
26113e519524SHoward Hinnant            return false;
26123e519524SHoward Hinnant        __i = __xeq.second;
26133e519524SHoward Hinnant    }
26143e519524SHoward Hinnant    return true;
26153e519524SHoward Hinnant}
26163e519524SHoward Hinnant
26173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2618789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
26193e519524SHoward Hinnantbool
26203e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
26213e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
26223e519524SHoward Hinnant{
26233e519524SHoward Hinnant    return !(__x == __y);
26243e519524SHoward Hinnant}
26253e519524SHoward Hinnant
26263e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
26273e519524SHoward Hinnant
26283e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_MAP
2629