13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===-------------------------- unordered_map -----------------------------===//
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
2193e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2203e519524SHoward Hinnant    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
2213714107eSHoward Hinnant              unordered_map<Key, T, Hash, Pred, Alloc>& y)
2223714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
2233e519524SHoward Hinnant
2243e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2253e519524SHoward Hinnant    bool
2263e519524SHoward Hinnant    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2273e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2283e519524SHoward Hinnant
2293e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2303e519524SHoward Hinnant    bool
2313e519524SHoward Hinnant    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2323e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2333e519524SHoward Hinnant
2343e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
2353e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
2363e519524SHoward Hinnantclass unordered_multimap
2373e519524SHoward Hinnant{
2383e519524SHoward Hinnantpublic:
2393e519524SHoward Hinnant    // types
2403e519524SHoward Hinnant    typedef Key                                                        key_type;
2413e519524SHoward Hinnant    typedef T                                                          mapped_type;
2423e519524SHoward Hinnant    typedef Hash                                                       hasher;
2433e519524SHoward Hinnant    typedef Pred                                                       key_equal;
2443e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
2453e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
2463e519524SHoward Hinnant    typedef value_type&                                                reference;
2473e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2483e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
2493e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
2503e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
2513e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
2523e519524SHoward Hinnant
2533e519524SHoward Hinnant    typedef /unspecified/ iterator;
2543e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
2553e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
2563e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
2573e519524SHoward Hinnant
258b0386a51SErik Pilkington    typedef unspecified node_type;    // C++17
259b0386a51SErik Pilkington
2603714107eSHoward Hinnant    unordered_multimap()
2613714107eSHoward Hinnant        noexcept(
2623714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
2633714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
2643714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
2653714107eSHoward Hinnant    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
2663e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
2673e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
2683e519524SHoward Hinnant    template <class InputIterator>
2693e519524SHoward Hinnant        unordered_multimap(InputIterator f, InputIterator l,
2703e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
2713e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
2723e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
2733e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type&);
2743e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&);
2753e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&, const Allocator&);
2763714107eSHoward Hinnant    unordered_multimap(unordered_multimap&&)
2773714107eSHoward Hinnant        noexcept(
2783714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
2793714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
2803714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
2813e519524SHoward Hinnant    unordered_multimap(unordered_multimap&&, const Allocator&);
2823e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type>, size_type n = 0,
2833e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
2843e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
2853cd37e64SMarshall Clow    unordered_multimap(size_type n, const allocator_type& a)
2863cd37e64SMarshall Clow      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
2873cd37e64SMarshall Clow    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
2883cd37e64SMarshall Clow      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
2893cd37e64SMarshall Clow    template <class InputIterator>
2903cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
2913cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
2923cd37e64SMarshall Clow    template <class InputIterator>
2933cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
2943cd37e64SMarshall Clow        const allocator_type& a)
2953cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
2963cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
2973cd37e64SMarshall Clow      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
2983cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
2993cd37e64SMarshall Clow      const allocator_type& a)
3003cd37e64SMarshall Clow      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
3013e519524SHoward Hinnant    ~unordered_multimap();
3023e519524SHoward Hinnant    unordered_multimap& operator=(const unordered_multimap&);
3033714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&&)
3043714107eSHoward Hinnant        noexcept(
3053714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3063714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3073714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
3083714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
3093e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type>);
3103e519524SHoward Hinnant
3113714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
3123e519524SHoward Hinnant
3133714107eSHoward Hinnant    bool      empty() const noexcept;
3143714107eSHoward Hinnant    size_type size() const noexcept;
3153714107eSHoward Hinnant    size_type max_size() const noexcept;
3163e519524SHoward Hinnant
3173714107eSHoward Hinnant    iterator       begin() noexcept;
3183714107eSHoward Hinnant    iterator       end() noexcept;
3193714107eSHoward Hinnant    const_iterator begin()  const noexcept;
3203714107eSHoward Hinnant    const_iterator end()    const noexcept;
3213714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
3223714107eSHoward Hinnant    const_iterator cend()   const noexcept;
3233e519524SHoward Hinnant
3243e519524SHoward Hinnant    template <class... Args>
3253e519524SHoward Hinnant        iterator emplace(Args&&... args);
3263e519524SHoward Hinnant    template <class... Args>
3273e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3283e519524SHoward Hinnant    iterator insert(const value_type& obj);
3293e519524SHoward Hinnant    template <class P>
3303e519524SHoward Hinnant        iterator insert(P&& obj);
3313e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
3323e519524SHoward Hinnant    template <class P>
3333e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
3343e519524SHoward Hinnant    template <class InputIterator>
3353e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3363e519524SHoward Hinnant    void insert(initializer_list<value_type>);
3373e519524SHoward Hinnant
338b0386a51SErik Pilkington    node_type extract(const_iterator position);                // C++17
339b0386a51SErik Pilkington    node_type extract(const key_type& x);                      // C++17
340b0386a51SErik Pilkington    iterator insert(node_type&& nh);                           // C++17
341b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);      // C++17
342b0386a51SErik Pilkington
3433e519524SHoward Hinnant    iterator erase(const_iterator position);
344ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
3453e519524SHoward Hinnant    size_type erase(const key_type& k);
3463e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
3473714107eSHoward Hinnant    void clear() noexcept;
3483e519524SHoward Hinnant
3495c4e07aeSErik Pilkington    template<class H2, class P2>
3505c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
3515c4e07aeSErik Pilkington    template<class H2, class P2>
3525c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
3535c4e07aeSErik Pilkington    template<class H2, class P2>
3545c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
3555c4e07aeSErik Pilkington    template<class H2, class P2>
3565c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
3575c4e07aeSErik Pilkington
3583714107eSHoward Hinnant    void swap(unordered_multimap&)
3593714107eSHoward Hinnant        noexcept(
3603714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3613714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
3623714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
3633714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
3643e519524SHoward Hinnant
3653e519524SHoward Hinnant    hasher hash_function() const;
3663e519524SHoward Hinnant    key_equal key_eq() const;
3673e519524SHoward Hinnant
3683e519524SHoward Hinnant    iterator       find(const key_type& k);
3693e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
370e5ec94a1SRuslan Arutyunyan    template<typename K>
371e5ec94a1SRuslan Arutyunyan        iterator find(const K& x);              // C++20
372e5ec94a1SRuslan Arutyunyan    template<typename K>
373e5ec94a1SRuslan Arutyunyan        const_iterator find(const K& x) const;  // C++20
3743e519524SHoward Hinnant    size_type count(const key_type& k) const;
375e5ec94a1SRuslan Arutyunyan    template<typename K>
376e5ec94a1SRuslan Arutyunyan        size_type count(const K& k) const; // C++20
377a17b1aedSZoe Carver    bool contains(const key_type& k) const; // C++20
378e5ec94a1SRuslan Arutyunyan    template<typename K>
379e5ec94a1SRuslan Arutyunyan        bool contains(const K& k) const; // C++20
3803e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
3813e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
382e5ec94a1SRuslan Arutyunyan    template<typename K>
383e5ec94a1SRuslan Arutyunyan        pair<iterator, iterator>             equal_range(const K& k); // C++20
384e5ec94a1SRuslan Arutyunyan    template<typename K>
385e5ec94a1SRuslan Arutyunyan        pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20
3863e519524SHoward Hinnant
3873714107eSHoward Hinnant    size_type bucket_count() const noexcept;
3883714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
3893e519524SHoward Hinnant
3903e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
3913e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    local_iterator       begin(size_type n);
3943e519524SHoward Hinnant    local_iterator       end(size_type n);
3953e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
3963e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
3973e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
3983e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
3993e519524SHoward Hinnant
4003714107eSHoward Hinnant    float load_factor() const noexcept;
4013714107eSHoward Hinnant    float max_load_factor() const noexcept;
4023e519524SHoward Hinnant    void max_load_factor(float z);
4033e519524SHoward Hinnant    void rehash(size_type n);
4043e519524SHoward Hinnant    void reserve(size_type n);
4053e519524SHoward Hinnant};
4063e519524SHoward Hinnant
4073e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
4083e519524SHoward Hinnant    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
4093714107eSHoward Hinnant              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
4103714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
4113e519524SHoward Hinnant
412f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
4133e895085SMarek Kurdej    typename unordered_map<K, T, H, P, A>::size_type
4143e895085SMarek Kurdej    erase_if(unordered_map<K, T, H, P, A>& c, Predicate pred);       // C++20
415f60c63c0SMarshall Clow
416f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
4173e895085SMarek Kurdej    typename unordered_multimap<K, T, H, P, A>::size_type
4183e895085SMarek Kurdej    erase_if(unordered_multimap<K, T, H, P, A>& c, Predicate pred);  // C++20
419f60c63c0SMarshall Clow
4203e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
4213e519524SHoward Hinnant    bool
4223e519524SHoward Hinnant    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
4233e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
4243e519524SHoward Hinnant
4253e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
4263e519524SHoward Hinnant    bool
4273e519524SHoward Hinnant    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
4283e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
4293e519524SHoward Hinnant
4303e519524SHoward Hinnant}  // std
4313e519524SHoward Hinnant
4323e519524SHoward Hinnant*/
4333e519524SHoward Hinnant
4343e519524SHoward Hinnant#include <__config>
435bfbd73f8SArthur O'Dwyer#include <__debug>
436050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
4373e519524SHoward Hinnant#include <__hash_table>
438b0386a51SErik Pilkington#include <__node_handle>
4396adbc83eSChristopher Di Bella#include <__utility/forward.h>
4402d0f1fa4SArthur O'Dwyer#include <compare>
4413e519524SHoward Hinnant#include <functional>
4422ac6babcSArthur O'Dwyer#include <iterator> // __libcpp_erase_if_container
4433e519524SHoward Hinnant#include <stdexcept>
4440f905677SEric Fiselier#include <tuple>
445f56972e2SMarshall Clow#include <version>
4463e519524SHoward Hinnant
447073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4483e519524SHoward Hinnant#pragma GCC system_header
449073458b1SHoward Hinnant#endif
4503e519524SHoward Hinnant
4513e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4523e519524SHoward Hinnant
453e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred,
4543560fbf3SLouis Dionne          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
4553e519524SHoward Hinnantclass __unordered_map_hasher
4563e519524SHoward Hinnant    : private _Hash
4573e519524SHoward Hinnant{
4583e519524SHoward Hinnantpublic:
459789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4603714107eSHoward Hinnant    __unordered_map_hasher()
4613714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4623714107eSHoward Hinnant        : _Hash() {}
463789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4643714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4653714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4663714107eSHoward Hinnant        : _Hash(__h) {}
467789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4683714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
469789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
470a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
471f52318b4SErik Pilkington        {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
472a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
473a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4743e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
475e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
476*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
477e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
478e5ec94a1SRuslan Arutyunyan    size_t operator()(const _K2& __x) const
479e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Hash&>(*this)(__x);}
480e5ec94a1SRuslan Arutyunyan#endif
481e3fbe143SMarshall Clow    void swap(__unordered_map_hasher& __y)
482e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
483e3fbe143SMarshall Clow    {
484e3fbe143SMarshall Clow        using _VSTD::swap;
485b3f57425SEric Fiselier        swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
486e3fbe143SMarshall Clow    }
4873e519524SHoward Hinnant};
4883e519524SHoward Hinnant
489e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred>
490e5ec94a1SRuslan Arutyunyanclass __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, false>
4913e519524SHoward Hinnant{
4923e519524SHoward Hinnant    _Hash __hash_;
4933e519524SHoward Hinnantpublic:
494789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4953714107eSHoward Hinnant    __unordered_map_hasher()
4963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4973714107eSHoward Hinnant        : __hash_() {}
498789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4993714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
5003714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
5013714107eSHoward Hinnant        : __hash_(__h) {}
502789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5033714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
504789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
505a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
506f52318b4SErik Pilkington        {return __hash_(__x.__get_value().first);}
507a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
508a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
5093e519524SHoward Hinnant        {return __hash_(__x);}
510e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
511*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
512e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
513e5ec94a1SRuslan Arutyunyan    size_t operator()(const _K2& __x) const
514e5ec94a1SRuslan Arutyunyan        {return __hash_(__x);}
515e5ec94a1SRuslan Arutyunyan#endif
516e3fbe143SMarshall Clow    void swap(__unordered_map_hasher& __y)
517e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
518e3fbe143SMarshall Clow    {
519e3fbe143SMarshall Clow        using _VSTD::swap;
520e3fbe143SMarshall Clow        swap(__hash_, __y.__hash_);
521e3fbe143SMarshall Clow    }
5223e519524SHoward Hinnant};
5233e519524SHoward Hinnant
524e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, bool __b>
525e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
526e3fbe143SMarshall Clowvoid
527e5ec94a1SRuslan Arutyunyanswap(__unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __x,
528e5ec94a1SRuslan Arutyunyan     __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __y)
529e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
530e3fbe143SMarshall Clow{
531e3fbe143SMarshall Clow    __x.swap(__y);
532e3fbe143SMarshall Clow}
533e3fbe143SMarshall Clow
534e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash,
5353560fbf3SLouis Dionne          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
5363e519524SHoward Hinnantclass __unordered_map_equal
5373e519524SHoward Hinnant    : private _Pred
5383e519524SHoward Hinnant{
5393e519524SHoward Hinnantpublic:
540789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5413714107eSHoward Hinnant    __unordered_map_equal()
5423714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
5433714107eSHoward Hinnant        : _Pred() {}
544789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5453714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
5463714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
5473714107eSHoward Hinnant        : _Pred(__p) {}
548789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5493714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return *this;}
550789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
551a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
552f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
553a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
554a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
555f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
556a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
557a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
558f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
559e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
560*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
561e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
562e5ec94a1SRuslan Arutyunyan    bool operator()(const _Cp& __x, const _K2& __y) const
563e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
564*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
565e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
566e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Cp& __y) const
567e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
568*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
569e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
570e5ec94a1SRuslan Arutyunyan    bool operator()(const _Key& __x, const _K2& __y) const
571e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y);}
572*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
573e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
574e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Key& __y) const
575e5ec94a1SRuslan Arutyunyan        {return static_cast<const _Pred&>(*this)(__x, __y);}
576e5ec94a1SRuslan Arutyunyan#endif
577e3fbe143SMarshall Clow    void swap(__unordered_map_equal& __y)
578e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
579e3fbe143SMarshall Clow    {
580e3fbe143SMarshall Clow        using _VSTD::swap;
581b3f57425SEric Fiselier        swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
582e3fbe143SMarshall Clow    }
5833e519524SHoward Hinnant};
5843e519524SHoward Hinnant
585e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash>
586e5ec94a1SRuslan Arutyunyanclass __unordered_map_equal<_Key, _Cp, _Pred, _Hash, false>
5873e519524SHoward Hinnant{
5883e519524SHoward Hinnant    _Pred __pred_;
5893e519524SHoward Hinnantpublic:
590789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5913714107eSHoward Hinnant    __unordered_map_equal()
5923714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
5933714107eSHoward Hinnant        : __pred_() {}
594789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5953714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
5963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
5973714107eSHoward Hinnant        : __pred_(__p) {}
598789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5993714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
600789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
601a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
602f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y.__get_value().first);}
603a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
604a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
605f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y);}
606a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
607a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
608f52318b4SErik Pilkington        {return __pred_(__x, __y.__get_value().first);}
609e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17
610*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
611e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
612e5ec94a1SRuslan Arutyunyan    bool operator()(const _Cp& __x, const _K2& __y) const
613e5ec94a1SRuslan Arutyunyan        {return __pred_(__x.__get_value().first, __y);}
614*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
615e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
616e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Cp& __y) const
617e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y.__get_value().first);}
618*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
619e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
620e5ec94a1SRuslan Arutyunyan    bool operator()(const _Key& __x, const _K2& __y) const
621e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y);}
622*4e0ea2cfSLouis Dionne    template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>>
623e5ec94a1SRuslan Arutyunyan    _LIBCPP_INLINE_VISIBILITY
624e5ec94a1SRuslan Arutyunyan    bool operator()(const _K2& __x, const _Key& __y) const
625e5ec94a1SRuslan Arutyunyan        {return __pred_(__x, __y);}
626e5ec94a1SRuslan Arutyunyan#endif
627e3fbe143SMarshall Clow    void swap(__unordered_map_equal& __y)
628e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
629e3fbe143SMarshall Clow    {
630e3fbe143SMarshall Clow        using _VSTD::swap;
631e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
632e3fbe143SMarshall Clow    }
6333e519524SHoward Hinnant};
6343e519524SHoward Hinnant
635e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, bool __b>
636e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
637e3fbe143SMarshall Clowvoid
638e5ec94a1SRuslan Arutyunyanswap(__unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __x,
639e5ec94a1SRuslan Arutyunyan     __unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __y)
640e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
641e3fbe143SMarshall Clow{
642e3fbe143SMarshall Clow    __x.swap(__y);
643e3fbe143SMarshall Clow}
644e3fbe143SMarshall Clow
6453e519524SHoward Hinnanttemplate <class _Alloc>
6463e519524SHoward Hinnantclass __hash_map_node_destructor
6473e519524SHoward Hinnant{
6483e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
6493e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
65075d0dcfdSEric Fiselier
6513e519524SHoward Hinnantpublic:
65275d0dcfdSEric Fiselier
6533e519524SHoward Hinnant    typedef typename __alloc_traits::pointer       pointer;
6543e519524SHoward Hinnantprivate:
6553e519524SHoward Hinnant
6563e519524SHoward Hinnant    allocator_type& __na_;
6573e519524SHoward Hinnant
6583e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
6593e519524SHoward Hinnant
6603e519524SHoward Hinnantpublic:
6613e519524SHoward Hinnant    bool __first_constructed;
6623e519524SHoward Hinnant    bool __second_constructed;
6633e519524SHoward Hinnant
664789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6653714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
6663e519524SHoward Hinnant        : __na_(__na),
6673e519524SHoward Hinnant          __first_constructed(false),
6683e519524SHoward Hinnant          __second_constructed(false)
6693e519524SHoward Hinnant        {}
6703e519524SHoward Hinnant
6716a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
672789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6733e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
6743714107eSHoward Hinnant        _NOEXCEPT
6753e519524SHoward Hinnant        : __na_(__x.__na_),
6763e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6773e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6783e519524SHoward Hinnant        {
6793e519524SHoward Hinnant            __x.__value_constructed = false;
6803e519524SHoward Hinnant        }
6816a470bcbSEric Fiselier#else  // _LIBCPP_CXX03_LANG
682789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6833e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
6843e519524SHoward Hinnant        : __na_(__x.__na_),
6853e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6863e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6873e519524SHoward Hinnant        {
6883e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
6893e519524SHoward Hinnant        }
6906a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
6913e519524SHoward Hinnant
692789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6933714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6943e519524SHoward Hinnant    {
6953e519524SHoward Hinnant        if (__second_constructed)
696f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6973e519524SHoward Hinnant        if (__first_constructed)
698f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6993e519524SHoward Hinnant        if (__p)
7003e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
7013e519524SHoward Hinnant    }
7023e519524SHoward Hinnant};
7033e519524SHoward Hinnant
704fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
7059fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7067c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __hash_value_type
7079fd9f84fSHoward Hinnant{
7089fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7099fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7109fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
711f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
712f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
7139fd9f84fSHoward Hinnant
714f52318b4SErik Pilkingtonprivate:
7159fd9f84fSHoward Hinnant    value_type __cc;
716f52318b4SErik Pilkington
717f52318b4SErik Pilkingtonpublic:
718f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
719f52318b4SErik Pilkington    value_type& __get_value()
720f52318b4SErik Pilkington    {
721f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
722f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
723f52318b4SErik Pilkington#else
724f52318b4SErik Pilkington        return __cc;
725f52318b4SErik Pilkington#endif
726f52318b4SErik Pilkington    }
727f52318b4SErik Pilkington
728f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
729f52318b4SErik Pilkington    const value_type& __get_value() const
730f52318b4SErik Pilkington    {
731f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
732f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
733f52318b4SErik Pilkington#else
734f52318b4SErik Pilkington        return __cc;
735f52318b4SErik Pilkington#endif
736f52318b4SErik Pilkington    }
737f52318b4SErik Pilkington
738f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
739f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
740f52318b4SErik Pilkington    {
741f52318b4SErik Pilkington        value_type& __v = __get_value();
742f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
743f52318b4SErik Pilkington    }
744f52318b4SErik Pilkington
745f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
746f52318b4SErik Pilkington    __nc_rref_pair_type __move()
747f52318b4SErik Pilkington    {
748f52318b4SErik Pilkington        value_type& __v = __get_value();
749f52318b4SErik Pilkington        return __nc_rref_pair_type(
750f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
751f52318b4SErik Pilkington            _VSTD::move(__v.second));
752f52318b4SErik Pilkington    }
7539fd9f84fSHoward Hinnant
7549fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7559fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
756f52318b4SErik Pilkington    {
757f52318b4SErik Pilkington        __ref() = __v.__get_value();
758f52318b4SErik Pilkington        return *this;
759f52318b4SErik Pilkington    }
7609fd9f84fSHoward Hinnant
7619fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7629fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
763f52318b4SErik Pilkington    {
764f52318b4SErik Pilkington        __ref() = __v.__move();
765f52318b4SErik Pilkington        return *this;
766f52318b4SErik Pilkington    }
7679fd9f84fSHoward Hinnant
768fcd02211SEric Fiselier    template <class _ValueTp,
769fcd02211SEric Fiselier              class = typename enable_if<
770fcd02211SEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
771fcd02211SEric Fiselier                 >::type
772fcd02211SEric Fiselier             >
7739fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
774f52318b4SErik Pilkington    __hash_value_type& operator=(_ValueTp&& __v)
775f52318b4SErik Pilkington    {
776f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
777f52318b4SErik Pilkington        return *this;
778fcd02211SEric Fiselier    }
779fcd02211SEric Fiselier
780fcd02211SEric Fiselierprivate:
781fcd02211SEric Fiselier    __hash_value_type(const __hash_value_type& __v) = delete;
782fcd02211SEric Fiselier    __hash_value_type(__hash_value_type&& __v) = delete;
783fcd02211SEric Fiselier    template <class ..._Args>
784fcd02211SEric Fiselier    explicit __hash_value_type(_Args&& ...__args) = delete;
785fcd02211SEric Fiselier
786fcd02211SEric Fiselier    ~__hash_value_type() = delete;
7879fd9f84fSHoward Hinnant};
7889fd9f84fSHoward Hinnant
7899fd9f84fSHoward Hinnant#else
7909fd9f84fSHoward Hinnant
7919fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7929fd9f84fSHoward Hinnantstruct __hash_value_type
7939fd9f84fSHoward Hinnant{
7949fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7959fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7969fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7979fd9f84fSHoward Hinnant
798f52318b4SErik Pilkingtonprivate:
7999fd9f84fSHoward Hinnant    value_type __cc;
8009fd9f84fSHoward Hinnant
801f52318b4SErik Pilkingtonpublic:
802f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
803f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
804f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
805f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
806f52318b4SErik Pilkington
807fcd02211SEric Fiselierprivate:
808fcd02211SEric Fiselier   ~__hash_value_type();
8099fd9f84fSHoward Hinnant};
8109fd9f84fSHoward Hinnant
8119fd9f84fSHoward Hinnant#endif
8129fd9f84fSHoward Hinnant
8133e519524SHoward Hinnanttemplate <class _HashIterator>
814e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator
8153e519524SHoward Hinnant{
8163e519524SHoward Hinnant    _HashIterator __i_;
8173e519524SHoward Hinnant
81875d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
81975d0dcfdSEric Fiselier
8203e519524SHoward Hinnantpublic:
8213e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
82275d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
82375d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
8243e519524SHoward Hinnant    typedef value_type&                                          reference;
82575d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
8263e519524SHoward Hinnant
827789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8283714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
8293e519524SHoward Hinnant
830789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8313714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
8323e519524SHoward Hinnant
833789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
834f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
835789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
836f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8373e519524SHoward Hinnant
838789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8393e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
840789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8413e519524SHoward Hinnant    __hash_map_iterator operator++(int)
8423e519524SHoward Hinnant    {
8433e519524SHoward Hinnant        __hash_map_iterator __t(*this);
8443e519524SHoward Hinnant        ++(*this);
8453e519524SHoward Hinnant        return __t;
8463e519524SHoward Hinnant    }
8473e519524SHoward Hinnant
848789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
849789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
8503e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
851789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
852789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
8533e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8543e519524SHoward Hinnant
855e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
856e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
857e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
858e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
859e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
8603e519524SHoward Hinnant};
8613e519524SHoward Hinnant
8623e519524SHoward Hinnanttemplate <class _HashIterator>
863e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
8643e519524SHoward Hinnant{
8653e519524SHoward Hinnant    _HashIterator __i_;
8663e519524SHoward Hinnant
86775d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
86875d0dcfdSEric Fiselier
8693e519524SHoward Hinnantpublic:
8703e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
87175d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
87275d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
8733e519524SHoward Hinnant    typedef const value_type&                                    reference;
87475d0dcfdSEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
8753e519524SHoward Hinnant
876789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8773714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
8783e519524SHoward Hinnant
879789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8803714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
881789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8823e519524SHoward Hinnant    __hash_map_const_iterator(
8833e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
8843714107eSHoward Hinnant                 _NOEXCEPT
8853e519524SHoward Hinnant                : __i_(__i.__i_) {}
8863e519524SHoward Hinnant
887789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
888f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
889789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
890f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8913e519524SHoward Hinnant
892789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8933e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
894789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8953e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
8963e519524SHoward Hinnant    {
8973e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
8983e519524SHoward Hinnant        ++(*this);
8993e519524SHoward Hinnant        return __t;
9003e519524SHoward Hinnant    }
9013e519524SHoward Hinnant
902789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
903789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
9043e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
905789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
906789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
9073e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
9083e519524SHoward Hinnant
909e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
910e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
911e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
912e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
9133e519524SHoward Hinnant};
9143e519524SHoward Hinnant
9155c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
9165c4e07aeSErik Pilkingtonclass unordered_multimap;
9175c4e07aeSErik Pilkington
9183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
9193e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
920e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map
9213e519524SHoward Hinnant{
9223e519524SHoward Hinnantpublic:
9233e519524SHoward Hinnant    // types
9243e519524SHoward Hinnant    typedef _Key                                           key_type;
9253e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
92609fa1d0eSArthur O'Dwyer    typedef __identity_t<_Hash>                            hasher;
92709fa1d0eSArthur O'Dwyer    typedef __identity_t<_Pred>                            key_equal;
92809fa1d0eSArthur O'Dwyer    typedef __identity_t<_Alloc>                           allocator_type;
9293e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
9303e519524SHoward Hinnant    typedef value_type&                                    reference;
9313e519524SHoward Hinnant    typedef const value_type&                              const_reference;
932b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
933b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
9343e519524SHoward Hinnant
9353e519524SHoward Hinnantprivate:
9369fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                          __value_type;
937e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher;
938e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher>  __key_equal;
9391f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
9401f508014SMarshall Clow                                                 __value_type>::type          __allocator_type;
9413e519524SHoward Hinnant
9423e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
9433e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
9443e519524SHoward Hinnant
9453e519524SHoward Hinnant    __table __table_;
9463e519524SHoward Hinnant
947fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
9483e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
9493e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
9503e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
9513e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
9523e519524SHoward Hinnant    typedef typename __table::__node                       __node;
953c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
954c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
9553e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
956fcd02211SEric Fiselier
957fcd02211SEric Fiselier    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
958fcd02211SEric Fiselier    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
9593e519524SHoward Hinnantpublic:
9603e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
9613e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
96275d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
96375d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
9643e519524SHoward Hinnant
9653e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
9663e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
9673e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
9683e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
9693e519524SHoward Hinnant
970b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
971b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
972b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
973b0386a51SErik Pilkington#endif
974b0386a51SErik Pilkington
9755c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
9765c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
9775c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
9785c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
9795c4e07aeSErik Pilkington
980789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9813714107eSHoward Hinnant    unordered_map()
9823714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
983b24c8024SHoward Hinnant        {
98431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
985b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
986b24c8024SHoward Hinnant#endif
987b24c8024SHoward Hinnant        }
9883e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
9893e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
9903e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
9913e519524SHoward Hinnant                  const key_equal& __eql,
9923e519524SHoward Hinnant                  const allocator_type& __a);
9933e519524SHoward Hinnant    template <class _InputIterator>
9943e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
9953e519524SHoward Hinnant    template <class _InputIterator>
9963e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
9973e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
9983e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
9993e519524SHoward Hinnant    template <class _InputIterator>
10003e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
10013e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
10023e519524SHoward Hinnant                      const key_equal& __eql,
10033e519524SHoward Hinnant                      const allocator_type& __a);
1004cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10053e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
10063e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
10073e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
10086a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1009cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10103714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
10113714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
10123e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
10133e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
10143e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
10153e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
10163e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
10173e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
10183e519524SHoward Hinnant                  const allocator_type& __a);
10196a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
10203cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
10213cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10223cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
10233cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
10243cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10253cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
10263cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
10273cd37e64SMarshall Clow    template <class _InputIterator>
10283cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10293cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
10303cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
10313cd37e64SMarshall Clow    template <class _InputIterator>
10323cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10333cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
10343cd37e64SMarshall Clow        const allocator_type& __a)
10353cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
10363cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10373cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
10383cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
10393cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10403cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
10413cd37e64SMarshall Clow      const allocator_type& __a)
10423cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
10433cd37e64SMarshall Clow#endif
10447c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
10457c142fccSLouis Dionne    ~unordered_map() {
10467c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
10477c142fccSLouis Dionne    }
10487c142fccSLouis Dionne
10495a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10505a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
10515a33687dSHoward Hinnant    {
10522ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
10535a33687dSHoward Hinnant        __table_ = __u.__table_;
1054307f8143SHoward Hinnant#else
105574cf6ff5SMarshall Clow        if (this != &__u) {
1056307f8143SHoward Hinnant            __table_.clear();
1057307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1058307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1059307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1060307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1061307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
106274cf6ff5SMarshall Clow        }
1063307f8143SHoward Hinnant#endif
10645a33687dSHoward Hinnant        return *this;
10655a33687dSHoward Hinnant    }
10666a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1067cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10683714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
10693714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1070cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10713e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
10726a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
10733e519524SHoward Hinnant
1074789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10753714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
10763e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
10773e519524SHoward Hinnant
107872c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
10793714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1080789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10813714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1082789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10833714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
10843e519524SHoward Hinnant
1085789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10863714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1087789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10883714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1089789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10903714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1091789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10923714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1093789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10943714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1095789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10963714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
10973e519524SHoward Hinnant
10987a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10997a9f500fSEric Fiselier    pair<iterator, bool> insert(const value_type& __x)
11007a9f500fSEric Fiselier        {return __table_.__insert_unique(__x);}
11017a9f500fSEric Fiselier
11027a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x) {
110331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
11047a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
11057a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
11067a9f500fSEric Fiselier            " referring to this unordered_map");
1107fd838227SEric Fiselier#else
1108fd838227SEric Fiselier        ((void)__p);
11097a9f500fSEric Fiselier#endif
11107a9f500fSEric Fiselier        return insert(__x).first;
11117a9f500fSEric Fiselier    }
11127a9f500fSEric Fiselier
11137a9f500fSEric Fiselier    template <class _InputIterator>
1114cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
11157a9f500fSEric Fiselier        void insert(_InputIterator __first, _InputIterator __last);
11167a9f500fSEric Fiselier
11176a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11187a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11197a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
11207a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
11217a9f500fSEric Fiselier
11227a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11237a9f500fSEric Fiselier    pair<iterator, bool> insert(value_type&& __x)
11247a9f500fSEric Fiselier        {return __table_.__insert_unique(_VSTD::move(__x));}
11257a9f500fSEric Fiselier
11267a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x) {
112731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
11287a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
11297a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
11307a9f500fSEric Fiselier            " referring to this unordered_map");
1131fd838227SEric Fiselier#else
1132fd838227SEric Fiselier        ((void)__p);
11337a9f500fSEric Fiselier#endif
11347a9f500fSEric Fiselier        return __table_.__insert_unique(_VSTD::move(__x)).first;
11357a9f500fSEric Fiselier    }
11367a9f500fSEric Fiselier
11377a9f500fSEric Fiselier    template <class _Pp,
11387a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
11397a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
11407a9f500fSEric Fiselier        pair<iterator, bool> insert(_Pp&& __x)
11417a9f500fSEric Fiselier            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
11427a9f500fSEric Fiselier
11437a9f500fSEric Fiselier    template <class _Pp,
11447a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
11457a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
11467a9f500fSEric Fiselier        iterator insert(const_iterator __p, _Pp&& __x)
11477a9f500fSEric Fiselier        {
114831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
11497a9f500fSEric Fiselier            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
11507a9f500fSEric Fiselier                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
11517a9f500fSEric Fiselier                " referring to this unordered_map");
1152fd838227SEric Fiselier#else
1153fd838227SEric Fiselier          ((void)__p);
11547a9f500fSEric Fiselier#endif
11557a9f500fSEric Fiselier            return insert(_VSTD::forward<_Pp>(__x)).first;
11567a9f500fSEric Fiselier        }
11577a9f500fSEric Fiselier
11588b805c91SHoward Hinnant    template <class... _Args>
1159fcd02211SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1160fcd02211SEric Fiselier    pair<iterator, bool> emplace(_Args&&... __args) {
1161fcd02211SEric Fiselier        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1162fcd02211SEric Fiselier    }
11633e519524SHoward Hinnant
11648b805c91SHoward Hinnant    template <class... _Args>
1165789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1166fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
116731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
11684c80bfbdSHoward Hinnant        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
11694c80bfbdSHoward Hinnant            "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
11704c80bfbdSHoward Hinnant            " referring to this unordered_map");
1171fd838227SEric Fiselier#else
1172fd838227SEric Fiselier          ((void)__p);
1173fcd02211SEric Fiselier#endif
1174ad783ce9SDuncan P. N. Exon Smith        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
11754c80bfbdSHoward Hinnant    }
1176fcd02211SEric Fiselier
1177fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG
1178fcd02211SEric Fiselier
1179bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
1180bc4c89a9SMarshall Clow    template <class... _Args>
1181bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1182bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1183bc4c89a9SMarshall Clow    {
1184d586f92cSArthur O'Dwyer        return __table_.__emplace_unique_key_args(__k, piecewise_construct,
118587c4104dSEric Fiselier            _VSTD::forward_as_tuple(__k),
118687c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1187bc4c89a9SMarshall Clow    }
1188bc4c89a9SMarshall Clow
1189bc4c89a9SMarshall Clow    template <class... _Args>
1190bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1191bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1192bc4c89a9SMarshall Clow    {
1193d586f92cSArthur O'Dwyer        return __table_.__emplace_unique_key_args(__k, piecewise_construct,
119487c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
119587c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1196bc4c89a9SMarshall Clow    }
1197bc4c89a9SMarshall Clow
1198bc4c89a9SMarshall Clow    template <class... _Args>
1199bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1200bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1201bc4c89a9SMarshall Clow    {
120231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1203eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
120487c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
120587c4104dSEric Fiselier            " referring to this unordered_map");
1206fd838227SEric Fiselier#else
1207fd838227SEric Fiselier        ((void)__h);
120887c4104dSEric Fiselier#endif
120987c4104dSEric Fiselier        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1210bc4c89a9SMarshall Clow    }
1211bc4c89a9SMarshall Clow
1212bc4c89a9SMarshall Clow    template <class... _Args>
1213bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1214bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1215bc4c89a9SMarshall Clow    {
121631e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1217eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
121887c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
121987c4104dSEric Fiselier            " referring to this unordered_map");
1220fd838227SEric Fiselier#else
1221fd838227SEric Fiselier        ((void)__h);
122287c4104dSEric Fiselier#endif
122387c4104dSEric Fiselier        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1224bc4c89a9SMarshall Clow    }
1225bc4c89a9SMarshall Clow
1226bc4c89a9SMarshall Clow    template <class _Vp>
1227bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1228bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1229bc4c89a9SMarshall Clow    {
123087c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
123187c4104dSEric Fiselier            __k, _VSTD::forward<_Vp>(__v));
123287c4104dSEric Fiselier        if (!__res.second) {
123387c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1234bc4c89a9SMarshall Clow        }
123587c4104dSEric Fiselier        return __res;
1236bc4c89a9SMarshall Clow    }
1237bc4c89a9SMarshall Clow
1238bc4c89a9SMarshall Clow    template <class _Vp>
1239bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1240bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1241bc4c89a9SMarshall Clow    {
124287c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
124387c4104dSEric Fiselier            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
124487c4104dSEric Fiselier        if (!__res.second) {
124587c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1246bc4c89a9SMarshall Clow        }
124787c4104dSEric Fiselier        return __res;
1248bc4c89a9SMarshall Clow    }
1249bc4c89a9SMarshall Clow
1250bc4c89a9SMarshall Clow    template <class _Vp>
1251bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1252fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1253bc4c89a9SMarshall Clow     {
1254fd838227SEric Fiselier          // FIXME: Add debug mode checking for the iterator input
125587c4104dSEric Fiselier          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1256bc4c89a9SMarshall Clow     }
1257bc4c89a9SMarshall Clow
1258bc4c89a9SMarshall Clow    template <class _Vp>
1259bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1260fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1261bc4c89a9SMarshall Clow     {
1262fd838227SEric Fiselier        // FIXME: Add debug mode checking for the iterator input
126387c4104dSEric Fiselier        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1264bc4c89a9SMarshall Clow     }
12656a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14
1266bc4c89a9SMarshall Clow
1267789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12683e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1269789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1270ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1271ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12723e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1273789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12743e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
12753e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1276789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12773714107eSHoward Hinnant        void clear() _NOEXCEPT {__table_.clear();}
12783e519524SHoward Hinnant
1279b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1280b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1281b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1282b0386a51SErik Pilkington    {
1283b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1284b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1285b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<
1286b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1287b0386a51SErik Pilkington    }
1288b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1289b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1290b0386a51SErik Pilkington    {
1291b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1292b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1293b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<node_type>(
1294b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1295b0386a51SErik Pilkington    }
1296b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1297b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1298b0386a51SErik Pilkington    {
1299b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1300b0386a51SErik Pilkington    }
1301b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1302b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1303b0386a51SErik Pilkington    {
1304b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1305b0386a51SErik Pilkington            __it.__i_);
1306b0386a51SErik Pilkington    }
13075c4e07aeSErik Pilkington
13085c4e07aeSErik Pilkington    template <class _H2, class _P2>
13095c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13105c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
13115c4e07aeSErik Pilkington    {
13125c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13135c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13145c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
13155c4e07aeSErik Pilkington    }
13165c4e07aeSErik Pilkington    template <class _H2, class _P2>
13175c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13185c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
13195c4e07aeSErik Pilkington    {
13205c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13215c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13225c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
13235c4e07aeSErik Pilkington    }
13245c4e07aeSErik Pilkington    template <class _H2, class _P2>
13255c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13265c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
13275c4e07aeSErik Pilkington    {
13285c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13295c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13305c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
13315c4e07aeSErik Pilkington    }
13325c4e07aeSErik Pilkington    template <class _H2, class _P2>
13335c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13345c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
13355c4e07aeSErik Pilkington    {
13365c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13375c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13385c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
13395c4e07aeSErik Pilkington    }
1340b0386a51SErik Pilkington#endif
1341b0386a51SErik Pilkington
1342789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13433714107eSHoward Hinnant    void swap(unordered_map& __u)
13443714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
13453714107eSHoward Hinnant        { __table_.swap(__u.__table_);}
13463e519524SHoward Hinnant
1347789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13483e519524SHoward Hinnant    hasher hash_function() const
13493e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1350789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13513e519524SHoward Hinnant    key_equal key_eq() const
13523e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
13533e519524SHoward Hinnant
1354789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13553e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1356789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13573e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1358e5ec94a1SRuslan Arutyunyan
1359e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
1360e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1361e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1362*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, iterator>
1363e5ec94a1SRuslan Arutyunyan        find(const _K2& __k)       {return __table_.find(__k);}
1364e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1365e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1366*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, const_iterator>
1367e5ec94a1SRuslan Arutyunyan        find(const _K2& __k) const {return __table_.find(__k);}
1368e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
1369e5ec94a1SRuslan Arutyunyan
1370789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13713e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1372a17b1aedSZoe Carver    #if _LIBCPP_STD_VER > 17
1373e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1374e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1375*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, size_type>
1376e5ec94a1SRuslan Arutyunyan        count(const _K2& __k) const {return __table_.__count_unique(__k);}
1377e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
1378e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
1379a17b1aedSZoe Carver        _LIBCPP_INLINE_VISIBILITY
1380a17b1aedSZoe Carver        bool contains(const key_type& __k) const {return find(__k) != end();}
1381e5ec94a1SRuslan Arutyunyan
1382e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1383e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1384*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, bool>
1385e5ec94a1SRuslan Arutyunyan        contains(const _K2& __k) const {return find(__k) != end();}
1386a17b1aedSZoe Carver    #endif // _LIBCPP_STD_VER > 17
1387789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13883e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
13893e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1390789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13913e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
13923e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1393e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
1394e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1395e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1396*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<iterator, iterator>>
1397e5ec94a1SRuslan Arutyunyan        equal_range(const _K2& __k)       {return __table_.__equal_range_unique(__k);}
1398e5ec94a1SRuslan Arutyunyan        template <typename _K2>
1399e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
1400*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<const_iterator, const_iterator>>
1401e5ec94a1SRuslan Arutyunyan        equal_range(const _K2& __k) const {return __table_.__equal_range_unique(__k);}
1402e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
14033e519524SHoward Hinnant
14043e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
14050f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14063e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
14073e519524SHoward Hinnant#endif
14083e519524SHoward Hinnant
14093e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
14103e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
14113e519524SHoward Hinnant
1412789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14133714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1414789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14153714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
14163e519524SHoward Hinnant
1417789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14183e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
14193e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1420789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14213e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
14223e519524SHoward Hinnant
1423789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14243e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1425789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14263e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1427789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14283e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1429789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14303e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1431789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14323e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1433789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14343e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
14353e519524SHoward Hinnant
1436789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14373714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1438789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14393714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1440789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14413e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1442789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14433e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1444789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14453e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
14463e519524SHoward Hinnant
144731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1448b24c8024SHoward Hinnant
1449b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1450b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1451b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1452b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1453b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1454b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1455b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1456b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1457b24c8024SHoward Hinnant
145831e82037SLouis Dionne#endif // _LIBCPP_DEBUG_LEVEL == 2
1459b24c8024SHoward Hinnant
14603e519524SHoward Hinnantprivate:
14610f905677SEric Fiselier
14620f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
14634a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
14640f905677SEric Fiselier#endif
14653e519524SHoward Hinnant};
14663e519524SHoward Hinnant
146701666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1468dfcd4384SLouis Dionnetemplate<class _InputIterator,
1469dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
1470dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
1471dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
1472*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
1473*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
1474*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
1475*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1476dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
1477dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1478dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
1479dfcd4384SLouis Dionne
1480dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
1481dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
1482dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
1483*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
1484*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
1485*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
1486*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1487dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
1488dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1489dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
1490dfcd4384SLouis Dionne
1491dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
1492*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1493dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
1494dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1495dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1496dfcd4384SLouis Dionne
1497dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
1498*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1499dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator)
1500dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1501dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1502dfcd4384SLouis Dionne
1503dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
1504*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
1505*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
1506*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1507dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1508dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1509dfcd4384SLouis Dionne                   _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1510dfcd4384SLouis Dionne
1511dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
1512*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1513dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
1514dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1515dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1516dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1517dfcd4384SLouis Dionne
1518dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
1519*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1520dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1521dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1522dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1523dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1524dfcd4384SLouis Dionne
1525dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
1526*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
1527*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
1528*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
1529dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1530dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash,
1531dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1532dfcd4384SLouis Dionne#endif
1533dfcd4384SLouis Dionne
15343e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15353e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15363e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
15373e519524SHoward Hinnant    : __table_(__hf, __eql)
15383e519524SHoward Hinnant{
153931e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1540b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1541b24c8024SHoward Hinnant#endif
15423e519524SHoward Hinnant    __table_.rehash(__n);
15433e519524SHoward Hinnant}
15443e519524SHoward Hinnant
15453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15463e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15473e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
15483e519524SHoward Hinnant        const allocator_type& __a)
15492a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
15503e519524SHoward Hinnant{
155131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1552b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1553b24c8024SHoward Hinnant#endif
15543e519524SHoward Hinnant    __table_.rehash(__n);
15553e519524SHoward Hinnant}
15563e519524SHoward Hinnant
15573e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1558cd31b434SEvgeniy Stepanovinline
15593e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15603e519524SHoward Hinnant        const allocator_type& __a)
15612a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
15623e519524SHoward Hinnant{
156331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1564b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1565b24c8024SHoward Hinnant#endif
15663e519524SHoward Hinnant}
15673e519524SHoward Hinnant
15683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15693e519524SHoward Hinnanttemplate <class _InputIterator>
15703e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15713e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
15723e519524SHoward Hinnant{
157331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1574b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1575b24c8024SHoward Hinnant#endif
15763e519524SHoward Hinnant    insert(__first, __last);
15773e519524SHoward Hinnant}
15783e519524SHoward Hinnant
15793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15803e519524SHoward Hinnanttemplate <class _InputIterator>
15813e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15823e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
15833e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
15843e519524SHoward Hinnant    : __table_(__hf, __eql)
15853e519524SHoward Hinnant{
158631e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1587b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1588b24c8024SHoward Hinnant#endif
15893e519524SHoward Hinnant    __table_.rehash(__n);
15903e519524SHoward Hinnant    insert(__first, __last);
15913e519524SHoward Hinnant}
15923e519524SHoward Hinnant
15933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15943e519524SHoward Hinnanttemplate <class _InputIterator>
15953e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15963e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
15973e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
15982a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
15993e519524SHoward Hinnant{
160031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1601b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1602b24c8024SHoward Hinnant#endif
16033e519524SHoward Hinnant    __table_.rehash(__n);
16043e519524SHoward Hinnant    insert(__first, __last);
16053e519524SHoward Hinnant}
16063e519524SHoward Hinnant
16073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16083e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16093e519524SHoward Hinnant        const unordered_map& __u)
16103e519524SHoward Hinnant    : __table_(__u.__table_)
16113e519524SHoward Hinnant{
161231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1613b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1614b24c8024SHoward Hinnant#endif
16153e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
16163e519524SHoward Hinnant    insert(__u.begin(), __u.end());
16173e519524SHoward Hinnant}
16183e519524SHoward Hinnant
16193e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16203e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16213e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
16222a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
16233e519524SHoward Hinnant{
162431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1625b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1626b24c8024SHoward Hinnant#endif
16273e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
16283e519524SHoward Hinnant    insert(__u.begin(), __u.end());
16293e519524SHoward Hinnant}
16303e519524SHoward Hinnant
16316a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
16323e519524SHoward Hinnant
16333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1634cd31b434SEvgeniy Stepanovinline
16353e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16363e519524SHoward Hinnant        unordered_map&& __u)
16373714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1638ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
16393e519524SHoward Hinnant{
164031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1641b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
16424c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1643b24c8024SHoward Hinnant#endif
16443e519524SHoward Hinnant}
16453e519524SHoward Hinnant
16463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16473e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16483e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
16492a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
16503e519524SHoward Hinnant{
165131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1652b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1653b24c8024SHoward Hinnant#endif
16543e519524SHoward Hinnant    if (__a != __u.get_allocator())
16553e519524SHoward Hinnant    {
16563e519524SHoward Hinnant        iterator __i = __u.begin();
1657fcd02211SEric Fiselier        while (__u.size() != 0) {
1658f52318b4SErik Pilkington            __table_.__emplace_unique(
1659f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
1660fcd02211SEric Fiselier        }
16613e519524SHoward Hinnant    }
166231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
16634c80bfbdSHoward Hinnant    else
16644c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
16654c80bfbdSHoward Hinnant#endif
16663e519524SHoward Hinnant}
16673e519524SHoward Hinnant
16683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16693e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16703e519524SHoward Hinnant        initializer_list<value_type> __il)
16713e519524SHoward Hinnant{
167231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1673b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1674b24c8024SHoward Hinnant#endif
16753e519524SHoward Hinnant    insert(__il.begin(), __il.end());
16763e519524SHoward Hinnant}
16773e519524SHoward Hinnant
16783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16793e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16803e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
16813e519524SHoward Hinnant        const key_equal& __eql)
16823e519524SHoward Hinnant    : __table_(__hf, __eql)
16833e519524SHoward Hinnant{
168431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1685b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1686b24c8024SHoward Hinnant#endif
16873e519524SHoward Hinnant    __table_.rehash(__n);
16883e519524SHoward Hinnant    insert(__il.begin(), __il.end());
16893e519524SHoward Hinnant}
16903e519524SHoward Hinnant
16913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16923e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
16933e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
16943e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
16952a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
16963e519524SHoward Hinnant{
169731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1698b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1699b24c8024SHoward Hinnant#endif
17003e519524SHoward Hinnant    __table_.rehash(__n);
17013e519524SHoward Hinnant    insert(__il.begin(), __il.end());
17023e519524SHoward Hinnant}
17033e519524SHoward Hinnant
17043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1705cd31b434SEvgeniy Stepanovinline
17063e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
17073e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
17083714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
17093e519524SHoward Hinnant{
1710ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
17113e519524SHoward Hinnant    return *this;
17123e519524SHoward Hinnant}
17133e519524SHoward Hinnant
17143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1715cd31b434SEvgeniy Stepanovinline
17163e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
17173e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
17183e519524SHoward Hinnant        initializer_list<value_type> __il)
17193e519524SHoward Hinnant{
17203e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
17213e519524SHoward Hinnant    return *this;
17223e519524SHoward Hinnant}
17233e519524SHoward Hinnant
17246a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
17253e519524SHoward Hinnant
17263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17273e519524SHoward Hinnanttemplate <class _InputIterator>
1728cd31b434SEvgeniy Stepanovinline
17293e519524SHoward Hinnantvoid
17303e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
17313e519524SHoward Hinnant                                                       _InputIterator __last)
17323e519524SHoward Hinnant{
17333e519524SHoward Hinnant    for (; __first != __last; ++__first)
17343e519524SHoward Hinnant        __table_.__insert_unique(*__first);
17353e519524SHoward Hinnant}
17363e519524SHoward Hinnant
17376a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17383e519524SHoward Hinnant
17390f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17400f905677SEric Fiselier_Tp&
17410f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
17420f905677SEric Fiselier{
17430f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
1744d586f92cSArthur O'Dwyer        piecewise_construct, _VSTD::forward_as_tuple(__k),
1745d586f92cSArthur O'Dwyer                             _VSTD::forward_as_tuple()).first->__get_value().second;
17460f905677SEric Fiselier}
17473e519524SHoward Hinnant
17483e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17493e519524SHoward Hinnant_Tp&
17503e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
17513e519524SHoward Hinnant{
17520f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
1753d586f92cSArthur O'Dwyer        piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1754d586f92cSArthur O'Dwyer                             _VSTD::forward_as_tuple()).first->__get_value().second;
17553e519524SHoward Hinnant}
17566a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG
17573e519524SHoward Hinnant
17586a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17596a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
17606a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
17616a470bcbSEric Fiselier{
17626a470bcbSEric Fiselier    __node_allocator& __na = __table_.__node_alloc();
17636a470bcbSEric Fiselier    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1764f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
17656a470bcbSEric Fiselier    __h.get_deleter().__first_constructed = true;
1766f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
17676a470bcbSEric Fiselier    __h.get_deleter().__second_constructed = true;
17688d4860aaSLouis Dionne    return __h;
17696a470bcbSEric Fiselier}
17706a470bcbSEric Fiselier
17716a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17726a470bcbSEric Fiselier_Tp&
17736a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
17746a470bcbSEric Fiselier{
17756a470bcbSEric Fiselier    iterator __i = find(__k);
17766a470bcbSEric Fiselier    if (__i != end())
17776a470bcbSEric Fiselier        return __i->second;
17786a470bcbSEric Fiselier    __node_holder __h = __construct_node_with_key(__k);
17796a470bcbSEric Fiselier    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
17806a470bcbSEric Fiselier    __h.release();
17816a470bcbSEric Fiselier    return __r.first->second;
17826a470bcbSEric Fiselier}
17836a470bcbSEric Fiselier
1784e6972024SArthur O'Dwyer#endif // _LIBCPP_CXX03_LANG
17853e519524SHoward Hinnant
17863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17873e519524SHoward Hinnant_Tp&
17883e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
17893e519524SHoward Hinnant{
17903e519524SHoward Hinnant    iterator __i = find(__k);
17913e519524SHoward Hinnant    if (__i == end())
17927232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
17933e519524SHoward Hinnant    return __i->second;
17943e519524SHoward Hinnant}
17953e519524SHoward Hinnant
17963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17973e519524SHoward Hinnantconst _Tp&
17983e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
17993e519524SHoward Hinnant{
18003e519524SHoward Hinnant    const_iterator __i = find(__k);
18013e519524SHoward Hinnant    if (__i == end())
18027232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
18033e519524SHoward Hinnant    return __i->second;
18043e519524SHoward Hinnant}
18053e519524SHoward Hinnant
18063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1807789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18083e519524SHoward Hinnantvoid
18093e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
18103e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
18113714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
18123e519524SHoward Hinnant{
18133e519524SHoward Hinnant    __x.swap(__y);
18143e519524SHoward Hinnant}
18153e519524SHoward Hinnant
1816f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
18173e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
18183e895085SMarek Kurdej          class _Predicate>
1819f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
18203e895085SMarek Kurdej    typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type
18213e895085SMarek Kurdej    erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c,
18223e895085SMarek Kurdej             _Predicate __pred) {
18232ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
18243e895085SMarek Kurdej}
1825f60c63c0SMarshall Clow#endif
1826f60c63c0SMarshall Clow
18273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18283e519524SHoward Hinnantbool
18293e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
18303e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
18313e519524SHoward Hinnant{
18323e519524SHoward Hinnant    if (__x.size() != __y.size())
18333e519524SHoward Hinnant        return false;
18343e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
18353e519524SHoward Hinnant                                                                 const_iterator;
18363e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
18373e519524SHoward Hinnant            __i != __ex; ++__i)
18383e519524SHoward Hinnant    {
18393e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
18403e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
18413e519524SHoward Hinnant            return false;
18423e519524SHoward Hinnant    }
18433e519524SHoward Hinnant    return true;
18443e519524SHoward Hinnant}
18453e519524SHoward Hinnant
18463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1847789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18483e519524SHoward Hinnantbool
18493e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
18503e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
18513e519524SHoward Hinnant{
18523e519524SHoward Hinnant    return !(__x == __y);
18533e519524SHoward Hinnant}
18543e519524SHoward Hinnant
18553e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
18563e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1857e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap
18583e519524SHoward Hinnant{
18593e519524SHoward Hinnantpublic:
18603e519524SHoward Hinnant    // types
18613e519524SHoward Hinnant    typedef _Key                                           key_type;
18623e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
186309fa1d0eSArthur O'Dwyer    typedef __identity_t<_Hash>                            hasher;
186409fa1d0eSArthur O'Dwyer    typedef __identity_t<_Pred>                            key_equal;
186509fa1d0eSArthur O'Dwyer    typedef __identity_t<_Alloc>                           allocator_type;
18663e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
18673e519524SHoward Hinnant    typedef value_type&                                    reference;
18683e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1869b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1870b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
18713e519524SHoward Hinnant
18723e519524SHoward Hinnantprivate:
18739fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                          __value_type;
1874e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher;
1875e5ec94a1SRuslan Arutyunyan    typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher>  __key_equal;
18761f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
18771f508014SMarshall Clow                                                 __value_type>::type          __allocator_type;
18783e519524SHoward Hinnant
18793e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
18803e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
18813e519524SHoward Hinnant
18823e519524SHoward Hinnant    __table __table_;
18833e519524SHoward Hinnant
1884fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
18853e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
18863e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
18873e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1888c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1889c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
18903e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
189175d0dcfdSEric Fiselier    static_assert((is_same<typename __node_traits::size_type,
189275d0dcfdSEric Fiselier                          typename __alloc_traits::size_type>::value),
189375d0dcfdSEric Fiselier                 "Allocator uses different size_type for different types");
18943e519524SHoward Hinnantpublic:
18953e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
18963e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
189775d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
189875d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
18993e519524SHoward Hinnant
19003e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
19013e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
19023e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
19033e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
19043e519524SHoward Hinnant
1905b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1906b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
1907b0386a51SErik Pilkington#endif
1908b0386a51SErik Pilkington
19095c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
19105c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
19115c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
19125c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
19135c4e07aeSErik Pilkington
1914789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19153714107eSHoward Hinnant    unordered_multimap()
19163714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1917b24c8024SHoward Hinnant        {
191831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
1919b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
1920b24c8024SHoward Hinnant#endif
1921b24c8024SHoward Hinnant        }
19223e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
19233e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
19243e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
19253e519524SHoward Hinnant                                const key_equal& __eql,
19263e519524SHoward Hinnant                                const allocator_type& __a);
19273e519524SHoward Hinnant    template <class _InputIterator>
19283e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
19293e519524SHoward Hinnant    template <class _InputIterator>
19303e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
19313e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
19323e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
19333e519524SHoward Hinnant    template <class _InputIterator>
19343e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
19353e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
19363e519524SHoward Hinnant                      const key_equal& __eql,
19373e519524SHoward Hinnant                      const allocator_type& __a);
1938cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
19393e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
19403e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
19413e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
19426a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1943cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
19443714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
19453714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
19463e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
19473e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
19483e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
19493e519524SHoward Hinnant                       const hasher& __hf = hasher(),
19503e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
19513e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
19523e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
19533e519524SHoward Hinnant                       const allocator_type& __a);
19546a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
19553cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
19563cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19573cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
19583cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
19593cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19603cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
19613cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
19623cd37e64SMarshall Clow    template <class _InputIterator>
19633cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19643cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
19653cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
19663cd37e64SMarshall Clow    template <class _InputIterator>
19673cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19683cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
19693cd37e64SMarshall Clow        const allocator_type& __a)
19703cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
19713cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19723cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
19733cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
19743cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19753cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
19763cd37e64SMarshall Clow      const allocator_type& __a)
19773cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
19783cd37e64SMarshall Clow#endif
19797c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
19807c142fccSLouis Dionne    ~unordered_multimap() {
19817c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
19827c142fccSLouis Dionne    }
19837c142fccSLouis Dionne
19845a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19855a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
19865a33687dSHoward Hinnant    {
19872ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
19885a33687dSHoward Hinnant        __table_ = __u.__table_;
1989307f8143SHoward Hinnant#else
199074cf6ff5SMarshall Clow        if (this != &__u) {
1991307f8143SHoward Hinnant            __table_.clear();
1992307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1993307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1994307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1995307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1996307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
199774cf6ff5SMarshall Clow        }
1998307f8143SHoward Hinnant#endif
19995a33687dSHoward Hinnant        return *this;
20005a33687dSHoward Hinnant    }
20016a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2002cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20033714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
20043714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
2005cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20063e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
20076a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
20083e519524SHoward Hinnant
2009789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20103714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
20113e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
20123e519524SHoward Hinnant
201372c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
20143714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
2015789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20163714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
2017789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20183714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
20193e519524SHoward Hinnant
2020789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20213714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
2022789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20233714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
2024789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20253714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
2026789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20273714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
2028789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20293714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
2030789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20313714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
20323e519524SHoward Hinnant
20337a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20347a9f500fSEric Fiselier    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
20357a9f500fSEric Fiselier
20367a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20377a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x)
20387a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, __x);}
20397a9f500fSEric Fiselier
20407a9f500fSEric Fiselier    template <class _InputIterator>
2041cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
20427a9f500fSEric Fiselier    void insert(_InputIterator __first, _InputIterator __last);
20437a9f500fSEric Fiselier
20446a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
20457a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20467a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
20477a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
20487a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20497a9f500fSEric Fiselier    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
20507a9f500fSEric Fiselier
20517a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20527a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x)
20537a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
20547a9f500fSEric Fiselier
20557a9f500fSEric Fiselier    template <class _Pp,
20567a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
20577a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20587a9f500fSEric Fiselier    iterator insert(_Pp&& __x)
20597a9f500fSEric Fiselier        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
20607a9f500fSEric Fiselier
20617a9f500fSEric Fiselier    template <class _Pp,
20627a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
20637a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20647a9f500fSEric Fiselier    iterator insert(const_iterator __p, _Pp&& __x)
20657a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
20667a9f500fSEric Fiselier
2067fcd02211SEric Fiselier    template <class... _Args>
2068fcd02211SEric Fiselier    iterator emplace(_Args&&... __args) {
2069fcd02211SEric Fiselier        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
2070fcd02211SEric Fiselier    }
20717609c9b6SHoward Hinnant
20728b805c91SHoward Hinnant    template <class... _Args>
2073fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
2074fcd02211SEric Fiselier        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
2075fcd02211SEric Fiselier    }
2076fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG
20773e519524SHoward Hinnant
20783e519524SHoward Hinnant
2079789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20803e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
2081789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2082ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
2083ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20843e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
2085789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20863e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
20873e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
2088789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20893714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
20903e519524SHoward Hinnant
2091b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
2092b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2093b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
2094b0386a51SErik Pilkington    {
2095b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2096b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
2097b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
2098b0386a51SErik Pilkington            _VSTD::move(__nh));
2099b0386a51SErik Pilkington    }
2100b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2101b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
2102b0386a51SErik Pilkington    {
2103b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2104b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
2105b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
2106b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
2107b0386a51SErik Pilkington    }
2108b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2109b0386a51SErik Pilkington    node_type extract(key_type const& __key)
2110b0386a51SErik Pilkington    {
2111b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
2112b0386a51SErik Pilkington    }
2113b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2114b0386a51SErik Pilkington    node_type extract(const_iterator __it)
2115b0386a51SErik Pilkington    {
2116b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
2117b0386a51SErik Pilkington            __it.__i_);
2118b0386a51SErik Pilkington    }
21195c4e07aeSErik Pilkington
21205c4e07aeSErik Pilkington    template <class _H2, class _P2>
21215c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21225c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
21235c4e07aeSErik Pilkington    {
21245c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21255c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21265c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21275c4e07aeSErik Pilkington    }
21285c4e07aeSErik Pilkington    template <class _H2, class _P2>
21295c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21305c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
21315c4e07aeSErik Pilkington    {
21325c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21335c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21345c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21355c4e07aeSErik Pilkington    }
21365c4e07aeSErik Pilkington    template <class _H2, class _P2>
21375c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21385c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
21395c4e07aeSErik Pilkington    {
21405c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21415c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21425c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21435c4e07aeSErik Pilkington    }
21445c4e07aeSErik Pilkington    template <class _H2, class _P2>
21455c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21465c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
21475c4e07aeSErik Pilkington    {
21485c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21495c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21505c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
21515c4e07aeSErik Pilkington    }
2152b0386a51SErik Pilkington#endif
2153b0386a51SErik Pilkington
2154789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21553714107eSHoward Hinnant    void swap(unordered_multimap& __u)
21563714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
21573714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
21583e519524SHoward Hinnant
2159789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21603e519524SHoward Hinnant    hasher hash_function() const
21613e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
2162789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21633e519524SHoward Hinnant    key_equal key_eq() const
21643e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
21653e519524SHoward Hinnant
2166789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21673e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
2168789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21693e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
2170e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
2171e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2172e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2173*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, iterator>
2174e5ec94a1SRuslan Arutyunyan        find(const _K2& __k)       {return __table_.find(__k);}
2175e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2176e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2177*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, const_iterator>
2178e5ec94a1SRuslan Arutyunyan        find(const _K2& __k) const {return __table_.find(__k);}
2179e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
2180789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21813e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
2182a17b1aedSZoe Carver    #if _LIBCPP_STD_VER > 17
2183e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2184e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2185*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, size_type>
2186e5ec94a1SRuslan Arutyunyan        count(const _K2& __k) const {return __table_.__count_multi(__k);}
2187e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
2188e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
2189a17b1aedSZoe Carver        _LIBCPP_INLINE_VISIBILITY
2190a17b1aedSZoe Carver        bool contains(const key_type& __k) const {return find(__k) != end();}
2191e5ec94a1SRuslan Arutyunyan
2192e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2193e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2194*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, bool>
2195e5ec94a1SRuslan Arutyunyan        contains(const _K2& __k) const {return find(__k) != end();}
2196a17b1aedSZoe Carver    #endif // _LIBCPP_STD_VER > 17
2197789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21983e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
21993e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
2200789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22013e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
22023e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
2203e5ec94a1SRuslan Arutyunyan    #if _LIBCPP_STD_VER > 17
2204e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2205e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2206*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<iterator, iterator>>
2207e5ec94a1SRuslan Arutyunyan        equal_range(const _K2& __k)       {return __table_.__equal_range_multi(__k);}
2208e5ec94a1SRuslan Arutyunyan        template <typename _K2>
2209e5ec94a1SRuslan Arutyunyan        _LIBCPP_INLINE_VISIBILITY
2210*4e0ea2cfSLouis Dionne        enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<const_iterator, const_iterator>>
2211e5ec94a1SRuslan Arutyunyan        equal_range(const _K2& __k) const {return __table_.__equal_range_multi(__k);}
2212e5ec94a1SRuslan Arutyunyan    #endif // _LIBCPP_STD_VER > 17
22133e519524SHoward Hinnant
2214789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22153714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
2216789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22173714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
22183714107eSHoward Hinnant        {return __table_.max_bucket_count();}
22193e519524SHoward Hinnant
2220789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22213e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
22223e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
2223789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22243e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
22253e519524SHoward Hinnant
2226789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22273e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
2228789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22293e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
2230789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22313e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
2232789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22333e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
2234789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22353e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
2236789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22373e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
22383e519524SHoward Hinnant
2239789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22403714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
2241789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22423714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
2243789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22443e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
2245789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22463e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
2247789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
22483e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
22493e519524SHoward Hinnant
225031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2251b24c8024SHoward Hinnant
2252b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
2253b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
2254b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
2255b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
2256b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
2257b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2258b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2259b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2260b24c8024SHoward Hinnant
226131e82037SLouis Dionne#endif // _LIBCPP_DEBUG_LEVEL == 2
2262b24c8024SHoward Hinnant
2263fcd02211SEric Fiselier
22643e519524SHoward Hinnant};
22653e519524SHoward Hinnant
226601666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
2267dfcd4384SLouis Dionnetemplate<class _InputIterator,
2268dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
2269dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
2270dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
2271*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
2272*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
2273*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
2274*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2275dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
2276dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2277dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
2278dfcd4384SLouis Dionne
2279dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
2280dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
2281dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
2282*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
2283*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
2284*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Pred>::value>,
2285*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2286dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
2287dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2288dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
2289dfcd4384SLouis Dionne
2290dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
2291*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2292dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
2293dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2294dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2295dfcd4384SLouis Dionne
2296dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
2297*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2298dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator)
2299dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2300dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2301dfcd4384SLouis Dionne
2302dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
2303*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
2304*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
2305*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2306dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2307dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2308dfcd4384SLouis Dionne                        _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2309dfcd4384SLouis Dionne
2310dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
2311*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2312dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
2313dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2314dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2315dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2316dfcd4384SLouis Dionne
2317dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
2318*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2319dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2320dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2321dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2322dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2323dfcd4384SLouis Dionne
2324dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
2325*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Hash>::value>,
2326*4e0ea2cfSLouis Dionne         class = enable_if_t<!is_integral<_Hash>::value>,
2327*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value>>
2328dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2329dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash,
2330dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2331dfcd4384SLouis Dionne#endif
2332dfcd4384SLouis Dionne
23333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23353e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
23363e519524SHoward Hinnant    : __table_(__hf, __eql)
23373e519524SHoward Hinnant{
233831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2339b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2340b24c8024SHoward Hinnant#endif
23413e519524SHoward Hinnant    __table_.rehash(__n);
23423e519524SHoward Hinnant}
23433e519524SHoward Hinnant
23443e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23453e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23463e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
23473e519524SHoward Hinnant        const allocator_type& __a)
23482a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
23493e519524SHoward Hinnant{
235031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2351b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2352b24c8024SHoward Hinnant#endif
23533e519524SHoward Hinnant    __table_.rehash(__n);
23543e519524SHoward Hinnant}
23553e519524SHoward Hinnant
23563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23573e519524SHoward Hinnanttemplate <class _InputIterator>
23583e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23593e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
23603e519524SHoward Hinnant{
236131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2362b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2363b24c8024SHoward Hinnant#endif
23643e519524SHoward Hinnant    insert(__first, __last);
23653e519524SHoward Hinnant}
23663e519524SHoward Hinnant
23673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23683e519524SHoward Hinnanttemplate <class _InputIterator>
23693e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23703e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
23713e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
23723e519524SHoward Hinnant    : __table_(__hf, __eql)
23733e519524SHoward Hinnant{
237431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2375b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2376b24c8024SHoward Hinnant#endif
23773e519524SHoward Hinnant    __table_.rehash(__n);
23783e519524SHoward Hinnant    insert(__first, __last);
23793e519524SHoward Hinnant}
23803e519524SHoward Hinnant
23813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23823e519524SHoward Hinnanttemplate <class _InputIterator>
23833e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23843e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
23853e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
23862a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
23873e519524SHoward Hinnant{
238831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2389b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2390b24c8024SHoward Hinnant#endif
23913e519524SHoward Hinnant    __table_.rehash(__n);
23923e519524SHoward Hinnant    insert(__first, __last);
23933e519524SHoward Hinnant}
23943e519524SHoward Hinnant
23953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2396cd31b434SEvgeniy Stepanovinline
23973e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23983e519524SHoward Hinnant        const allocator_type& __a)
23992a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
24003e519524SHoward Hinnant{
240131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2402b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2403b24c8024SHoward Hinnant#endif
24043e519524SHoward Hinnant}
24053e519524SHoward Hinnant
24063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24083e519524SHoward Hinnant        const unordered_multimap& __u)
24093e519524SHoward Hinnant    : __table_(__u.__table_)
24103e519524SHoward Hinnant{
241131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2412b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2413b24c8024SHoward Hinnant#endif
24143e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
24153e519524SHoward Hinnant    insert(__u.begin(), __u.end());
24163e519524SHoward Hinnant}
24173e519524SHoward Hinnant
24183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24193e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24203e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
24212a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
24223e519524SHoward Hinnant{
242331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2424b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2425b24c8024SHoward Hinnant#endif
24263e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
24273e519524SHoward Hinnant    insert(__u.begin(), __u.end());
24283e519524SHoward Hinnant}
24293e519524SHoward Hinnant
24306a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
24313e519524SHoward Hinnant
24323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2433cd31b434SEvgeniy Stepanovinline
24343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24353e519524SHoward Hinnant        unordered_multimap&& __u)
24363714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2437ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
24383e519524SHoward Hinnant{
243931e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2440b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
24414c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
2442b24c8024SHoward Hinnant#endif
24433e519524SHoward Hinnant}
24443e519524SHoward Hinnant
24453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24463e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24473e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
24482a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
24493e519524SHoward Hinnant{
245031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2451b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2452b24c8024SHoward Hinnant#endif
24533e519524SHoward Hinnant    if (__a != __u.get_allocator())
24543e519524SHoward Hinnant    {
24553e519524SHoward Hinnant        iterator __i = __u.begin();
24563e519524SHoward Hinnant        while (__u.size() != 0)
24573e519524SHoward Hinnant        {
24583e519524SHoward Hinnant            __table_.__insert_multi(
2459f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
24603e519524SHoward Hinnant        }
24613e519524SHoward Hinnant    }
246231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
24634c80bfbdSHoward Hinnant    else
24644c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
24654c80bfbdSHoward Hinnant#endif
24663e519524SHoward Hinnant}
24673e519524SHoward Hinnant
24683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24693e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24703e519524SHoward Hinnant        initializer_list<value_type> __il)
24713e519524SHoward Hinnant{
247231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2473b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2474b24c8024SHoward Hinnant#endif
24753e519524SHoward Hinnant    insert(__il.begin(), __il.end());
24763e519524SHoward Hinnant}
24773e519524SHoward Hinnant
24783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24803e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
24813e519524SHoward Hinnant        const key_equal& __eql)
24823e519524SHoward Hinnant    : __table_(__hf, __eql)
24833e519524SHoward Hinnant{
248431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2485b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2486b24c8024SHoward Hinnant#endif
24873e519524SHoward Hinnant    __table_.rehash(__n);
24883e519524SHoward Hinnant    insert(__il.begin(), __il.end());
24893e519524SHoward Hinnant}
24903e519524SHoward Hinnant
24913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24923e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
24933e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
24943e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
24952a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
24963e519524SHoward Hinnant{
249731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2
2498b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2499b24c8024SHoward Hinnant#endif
25003e519524SHoward Hinnant    __table_.rehash(__n);
25013e519524SHoward Hinnant    insert(__il.begin(), __il.end());
25023e519524SHoward Hinnant}
25033e519524SHoward Hinnant
25043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2505cd31b434SEvgeniy Stepanovinline
25063e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
25073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
25083714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
25093e519524SHoward Hinnant{
2510ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
25113e519524SHoward Hinnant    return *this;
25123e519524SHoward Hinnant}
25133e519524SHoward Hinnant
25143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2515cd31b434SEvgeniy Stepanovinline
25163e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
25173e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
25183e519524SHoward Hinnant        initializer_list<value_type> __il)
25193e519524SHoward Hinnant{
25203e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
25213e519524SHoward Hinnant    return *this;
25223e519524SHoward Hinnant}
25233e519524SHoward Hinnant
25246a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG
252554976f26SHoward Hinnant
25263e519524SHoward Hinnant
25273e519524SHoward Hinnant
25283e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25293e519524SHoward Hinnanttemplate <class _InputIterator>
2530cd31b434SEvgeniy Stepanovinline
25313e519524SHoward Hinnantvoid
25323e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
25333e519524SHoward Hinnant                                                            _InputIterator __last)
25343e519524SHoward Hinnant{
25353e519524SHoward Hinnant    for (; __first != __last; ++__first)
25363e519524SHoward Hinnant        __table_.__insert_multi(*__first);
25373e519524SHoward Hinnant}
25383e519524SHoward Hinnant
25393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2540789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25413e519524SHoward Hinnantvoid
25423e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
25433e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
25443714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
25453e519524SHoward Hinnant{
25463e519524SHoward Hinnant    __x.swap(__y);
25473e519524SHoward Hinnant}
25483e519524SHoward Hinnant
2549f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
25503e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc,
25513e895085SMarek Kurdej          class _Predicate>
2552f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
25533e895085SMarek Kurdej    typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type
25543e895085SMarek Kurdej    erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c,
25553e895085SMarek Kurdej             _Predicate __pred) {
25562ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
25573e895085SMarek Kurdej}
2558f60c63c0SMarshall Clow#endif
2559f60c63c0SMarshall Clow
25603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
25613e519524SHoward Hinnantbool
25623e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
25633e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
25643e519524SHoward Hinnant{
25653e519524SHoward Hinnant    if (__x.size() != __y.size())
25663e519524SHoward Hinnant        return false;
25673e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
25683e519524SHoward Hinnant                                                                 const_iterator;
25693e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
25703e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
25713e519524SHoward Hinnant    {
25723e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
25733e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2574ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2575ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2576ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
25773e519524SHoward Hinnant            return false;
25783e519524SHoward Hinnant        __i = __xeq.second;
25793e519524SHoward Hinnant    }
25803e519524SHoward Hinnant    return true;
25813e519524SHoward Hinnant}
25823e519524SHoward Hinnant
25833e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2584789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
25853e519524SHoward Hinnantbool
25863e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
25873e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
25883e519524SHoward Hinnant{
25893e519524SHoward Hinnant    return !(__x == __y);
25903e519524SHoward Hinnant}
25913e519524SHoward Hinnant
25923e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
25933e519524SHoward Hinnant
25943e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_MAP
2595