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;
1763e519524SHoward Hinnant    size_type count(const key_type& k) const;
1773e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
1783e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
1793e519524SHoward Hinnant
1803e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1813e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1823e519524SHoward Hinnant
1833e519524SHoward Hinnant    mapped_type&       at(const key_type& k);
1843e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1853e519524SHoward Hinnant
1863714107eSHoward Hinnant    size_type bucket_count() const noexcept;
1873714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
1883e519524SHoward Hinnant
1893e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
1903e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
1913e519524SHoward Hinnant
1923e519524SHoward Hinnant    local_iterator       begin(size_type n);
1933e519524SHoward Hinnant    local_iterator       end(size_type n);
1943e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
1953e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
1963e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
1973e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
1983e519524SHoward Hinnant
1993714107eSHoward Hinnant    float load_factor() const noexcept;
2003714107eSHoward Hinnant    float max_load_factor() const noexcept;
2013e519524SHoward Hinnant    void max_load_factor(float z);
2023e519524SHoward Hinnant    void rehash(size_type n);
2033e519524SHoward Hinnant    void reserve(size_type n);
2043e519524SHoward Hinnant};
2053e519524SHoward Hinnant
2063e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2073e519524SHoward Hinnant    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
2083714107eSHoward Hinnant              unordered_map<Key, T, Hash, Pred, Alloc>& y)
2093714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
2103e519524SHoward Hinnant
2113e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2123e519524SHoward Hinnant    bool
2133e519524SHoward Hinnant    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2143e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2153e519524SHoward Hinnant
2163e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2173e519524SHoward Hinnant    bool
2183e519524SHoward Hinnant    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2193e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2203e519524SHoward Hinnant
2213e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
2223e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
2233e519524SHoward Hinnantclass unordered_multimap
2243e519524SHoward Hinnant{
2253e519524SHoward Hinnantpublic:
2263e519524SHoward Hinnant    // types
2273e519524SHoward Hinnant    typedef Key                                                        key_type;
2283e519524SHoward Hinnant    typedef T                                                          mapped_type;
2293e519524SHoward Hinnant    typedef Hash                                                       hasher;
2303e519524SHoward Hinnant    typedef Pred                                                       key_equal;
2313e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
2323e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
2333e519524SHoward Hinnant    typedef value_type&                                                reference;
2343e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2353e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
2363e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
2373e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
2383e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
2393e519524SHoward Hinnant
2403e519524SHoward Hinnant    typedef /unspecified/ iterator;
2413e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
2423e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
2433e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
2443e519524SHoward Hinnant
245b0386a51SErik Pilkington    typedef unspecified node_type;    // C++17
246b0386a51SErik Pilkington
2473714107eSHoward Hinnant    unordered_multimap()
2483714107eSHoward Hinnant        noexcept(
2493714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
2503714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
2513714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
2523714107eSHoward Hinnant    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
2533e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
2543e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
2553e519524SHoward Hinnant    template <class InputIterator>
2563e519524SHoward Hinnant        unordered_multimap(InputIterator f, InputIterator l,
2573e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
2583e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
2593e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
2603e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type&);
2613e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&);
2623e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&, const Allocator&);
2633714107eSHoward Hinnant    unordered_multimap(unordered_multimap&&)
2643714107eSHoward Hinnant        noexcept(
2653714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
2663714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
2673714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
2683e519524SHoward Hinnant    unordered_multimap(unordered_multimap&&, const Allocator&);
2693e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type>, size_type n = 0,
2703e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
2713e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
2723cd37e64SMarshall Clow    unordered_multimap(size_type n, const allocator_type& a)
2733cd37e64SMarshall Clow      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
2743cd37e64SMarshall Clow    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
2753cd37e64SMarshall Clow      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
2763cd37e64SMarshall Clow    template <class InputIterator>
2773cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
2783cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
2793cd37e64SMarshall Clow    template <class InputIterator>
2803cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
2813cd37e64SMarshall Clow        const allocator_type& a)
2823cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
2833cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
2843cd37e64SMarshall Clow      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
2853cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
2863cd37e64SMarshall Clow      const allocator_type& a)
2873cd37e64SMarshall Clow      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
2883e519524SHoward Hinnant    ~unordered_multimap();
2893e519524SHoward Hinnant    unordered_multimap& operator=(const unordered_multimap&);
2903714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&&)
2913714107eSHoward Hinnant        noexcept(
2923714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
2933714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
2943714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
2953714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
2963e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type>);
2973e519524SHoward Hinnant
2983714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
2993e519524SHoward Hinnant
3003714107eSHoward Hinnant    bool      empty() const noexcept;
3013714107eSHoward Hinnant    size_type size() const noexcept;
3023714107eSHoward Hinnant    size_type max_size() const noexcept;
3033e519524SHoward Hinnant
3043714107eSHoward Hinnant    iterator       begin() noexcept;
3053714107eSHoward Hinnant    iterator       end() noexcept;
3063714107eSHoward Hinnant    const_iterator begin()  const noexcept;
3073714107eSHoward Hinnant    const_iterator end()    const noexcept;
3083714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
3093714107eSHoward Hinnant    const_iterator cend()   const noexcept;
3103e519524SHoward Hinnant
3113e519524SHoward Hinnant    template <class... Args>
3123e519524SHoward Hinnant        iterator emplace(Args&&... args);
3133e519524SHoward Hinnant    template <class... Args>
3143e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3153e519524SHoward Hinnant    iterator insert(const value_type& obj);
3163e519524SHoward Hinnant    template <class P>
3173e519524SHoward Hinnant        iterator insert(P&& obj);
3183e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
3193e519524SHoward Hinnant    template <class P>
3203e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
3213e519524SHoward Hinnant    template <class InputIterator>
3223e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3233e519524SHoward Hinnant    void insert(initializer_list<value_type>);
3243e519524SHoward Hinnant
325b0386a51SErik Pilkington    node_type extract(const_iterator position);                // C++17
326b0386a51SErik Pilkington    node_type extract(const key_type& x);                      // C++17
327b0386a51SErik Pilkington    iterator insert(node_type&& nh);                           // C++17
328b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);      // C++17
329b0386a51SErik Pilkington
3303e519524SHoward Hinnant    iterator erase(const_iterator position);
331ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
3323e519524SHoward Hinnant    size_type erase(const key_type& k);
3333e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
3343714107eSHoward Hinnant    void clear() noexcept;
3353e519524SHoward Hinnant
3365c4e07aeSErik Pilkington    template<class H2, class P2>
3375c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
3385c4e07aeSErik Pilkington    template<class H2, class P2>
3395c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
3405c4e07aeSErik Pilkington    template<class H2, class P2>
3415c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
3425c4e07aeSErik Pilkington    template<class H2, class P2>
3435c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
3445c4e07aeSErik Pilkington
3453714107eSHoward Hinnant    void swap(unordered_multimap&)
3463714107eSHoward Hinnant        noexcept(
3473714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3483714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
3493714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
3503714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
3513e519524SHoward Hinnant
3523e519524SHoward Hinnant    hasher hash_function() const;
3533e519524SHoward Hinnant    key_equal key_eq() const;
3543e519524SHoward Hinnant
3553e519524SHoward Hinnant    iterator       find(const key_type& k);
3563e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
3573e519524SHoward Hinnant    size_type count(const key_type& k) const;
3583e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
3593e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
3603e519524SHoward Hinnant
3613714107eSHoward Hinnant    size_type bucket_count() const noexcept;
3623714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
3633e519524SHoward Hinnant
3643e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
3653e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
3663e519524SHoward Hinnant
3673e519524SHoward Hinnant    local_iterator       begin(size_type n);
3683e519524SHoward Hinnant    local_iterator       end(size_type n);
3693e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
3703e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
3713e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
3723e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
3733e519524SHoward Hinnant
3743714107eSHoward Hinnant    float load_factor() const noexcept;
3753714107eSHoward Hinnant    float max_load_factor() const noexcept;
3763e519524SHoward Hinnant    void max_load_factor(float z);
3773e519524SHoward Hinnant    void rehash(size_type n);
3783e519524SHoward Hinnant    void reserve(size_type n);
3793e519524SHoward Hinnant};
3803e519524SHoward Hinnant
3813e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3823e519524SHoward Hinnant    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3833714107eSHoward Hinnant              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
3843714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
3853e519524SHoward Hinnant
386f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
387f60c63c0SMarshall Clow    void erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred);       // C++20
388f60c63c0SMarshall Clow
389f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate>
390f60c63c0SMarshall Clow    void erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred);  // C++20
391f60c63c0SMarshall Clow
3923e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3933e519524SHoward Hinnant    bool
3943e519524SHoward Hinnant    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3953e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
3963e519524SHoward Hinnant
3973e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3983e519524SHoward Hinnant    bool
3993e519524SHoward Hinnant    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
4003e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
4013e519524SHoward Hinnant
4023e519524SHoward Hinnant}  // std
4033e519524SHoward Hinnant
4043e519524SHoward Hinnant*/
4053e519524SHoward Hinnant
4063e519524SHoward Hinnant#include <__config>
4073e519524SHoward Hinnant#include <__hash_table>
408b0386a51SErik Pilkington#include <__node_handle>
4093e519524SHoward Hinnant#include <functional>
4103e519524SHoward Hinnant#include <stdexcept>
4110f905677SEric Fiselier#include <tuple>
412f56972e2SMarshall Clow#include <version>
4133e519524SHoward Hinnant
414c1bd9197SEric Fiselier#include <__debug>
415c1bd9197SEric Fiselier
416073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4173e519524SHoward Hinnant#pragma GCC system_header
418073458b1SHoward Hinnant#endif
4193e519524SHoward Hinnant
4203e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4213e519524SHoward Hinnant
4223560fbf3SLouis Dionnetemplate <class _Key, class _Cp, class _Hash,
4233560fbf3SLouis Dionne          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value>
4243e519524SHoward Hinnantclass __unordered_map_hasher
4253e519524SHoward Hinnant    : private _Hash
4263e519524SHoward Hinnant{
4273e519524SHoward Hinnantpublic:
428789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4293714107eSHoward Hinnant    __unordered_map_hasher()
4303714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4313714107eSHoward Hinnant        : _Hash() {}
432789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4333714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4343714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4353714107eSHoward Hinnant        : _Hash(__h) {}
436789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4373714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
438789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
439a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
440f52318b4SErik Pilkington        {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
441a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
442a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4433e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
444e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
445e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
446e3fbe143SMarshall Clow    {
447e3fbe143SMarshall Clow        using _VSTD::swap;
448b3f57425SEric Fiselier        swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
449e3fbe143SMarshall Clow    }
4503e519524SHoward Hinnant};
4513e519524SHoward Hinnant
452abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Hash>
453abb160e6SHoward Hinnantclass __unordered_map_hasher<_Key, _Cp, _Hash, false>
4543e519524SHoward Hinnant{
4553e519524SHoward Hinnant    _Hash __hash_;
4563e519524SHoward Hinnantpublic:
457789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4583714107eSHoward Hinnant    __unordered_map_hasher()
4593714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4603714107eSHoward Hinnant        : __hash_() {}
461789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4623714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4633714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4643714107eSHoward Hinnant        : __hash_(__h) {}
465789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4663714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
467789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
468a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
469f52318b4SErik Pilkington        {return __hash_(__x.__get_value().first);}
470a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
471a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4723e519524SHoward Hinnant        {return __hash_(__x);}
473e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
474e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
475e3fbe143SMarshall Clow    {
476e3fbe143SMarshall Clow        using _VSTD::swap;
477e3fbe143SMarshall Clow        swap(__hash_, __y.__hash_);
478e3fbe143SMarshall Clow    }
4793e519524SHoward Hinnant};
4803e519524SHoward Hinnant
481e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Hash, bool __b>
482e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
483e3fbe143SMarshall Clowvoid
484e3fbe143SMarshall Clowswap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
485e3fbe143SMarshall Clow     __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
486e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
487e3fbe143SMarshall Clow{
488e3fbe143SMarshall Clow    __x.swap(__y);
489e3fbe143SMarshall Clow}
490e3fbe143SMarshall Clow
4913560fbf3SLouis Dionnetemplate <class _Key, class _Cp, class _Pred,
4923560fbf3SLouis Dionne          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value>
4933e519524SHoward Hinnantclass __unordered_map_equal
4943e519524SHoward Hinnant    : private _Pred
4953e519524SHoward Hinnant{
4963e519524SHoward Hinnantpublic:
497789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4983714107eSHoward Hinnant    __unordered_map_equal()
4993714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
5003714107eSHoward Hinnant        : _Pred() {}
501789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5023714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
5033714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
5043714107eSHoward Hinnant        : _Pred(__p) {}
505789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5063714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return *this;}
507789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
508a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
509f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
510a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
511a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
512f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
513a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
514a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
515f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
516e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
517e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
518e3fbe143SMarshall Clow    {
519e3fbe143SMarshall Clow        using _VSTD::swap;
520b3f57425SEric Fiselier        swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
521e3fbe143SMarshall Clow    }
5223e519524SHoward Hinnant};
5233e519524SHoward Hinnant
524abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Pred>
525abb160e6SHoward Hinnantclass __unordered_map_equal<_Key, _Cp, _Pred, false>
5263e519524SHoward Hinnant{
5273e519524SHoward Hinnant    _Pred __pred_;
5283e519524SHoward Hinnantpublic:
529789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5303714107eSHoward Hinnant    __unordered_map_equal()
5313714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
5323714107eSHoward Hinnant        : __pred_() {}
533789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5343714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
5353714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
5363714107eSHoward Hinnant        : __pred_(__p) {}
537789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5383714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
539789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
540a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
541f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y.__get_value().first);}
542a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
543a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
544f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y);}
545a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
546a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
547f52318b4SErik Pilkington        {return __pred_(__x, __y.__get_value().first);}
548e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
549e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
550e3fbe143SMarshall Clow    {
551e3fbe143SMarshall Clow        using _VSTD::swap;
552e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
553e3fbe143SMarshall Clow    }
5543e519524SHoward Hinnant};
5553e519524SHoward Hinnant
556e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Pred, bool __b>
557e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
558e3fbe143SMarshall Clowvoid
559e3fbe143SMarshall Clowswap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
560e3fbe143SMarshall Clow     __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
561e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
562e3fbe143SMarshall Clow{
563e3fbe143SMarshall Clow    __x.swap(__y);
564e3fbe143SMarshall Clow}
565e3fbe143SMarshall Clow
5663e519524SHoward Hinnanttemplate <class _Alloc>
5673e519524SHoward Hinnantclass __hash_map_node_destructor
5683e519524SHoward Hinnant{
5693e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
5703e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
57175d0dcfdSEric Fiselier
5723e519524SHoward Hinnantpublic:
57375d0dcfdSEric Fiselier
5743e519524SHoward Hinnant    typedef typename __alloc_traits::pointer       pointer;
5753e519524SHoward Hinnantprivate:
5763e519524SHoward Hinnant
5773e519524SHoward Hinnant    allocator_type& __na_;
5783e519524SHoward Hinnant
5793e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
5803e519524SHoward Hinnant
5813e519524SHoward Hinnantpublic:
5823e519524SHoward Hinnant    bool __first_constructed;
5833e519524SHoward Hinnant    bool __second_constructed;
5843e519524SHoward Hinnant
585789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5863714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
5873e519524SHoward Hinnant        : __na_(__na),
5883e519524SHoward Hinnant          __first_constructed(false),
5893e519524SHoward Hinnant          __second_constructed(false)
5903e519524SHoward Hinnant        {}
5913e519524SHoward Hinnant
5926a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
593789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5943e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
5953714107eSHoward Hinnant        _NOEXCEPT
5963e519524SHoward Hinnant        : __na_(__x.__na_),
5973e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5983e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5993e519524SHoward Hinnant        {
6003e519524SHoward Hinnant            __x.__value_constructed = false;
6013e519524SHoward Hinnant        }
6026a470bcbSEric Fiselier#else  // _LIBCPP_CXX03_LANG
603789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6043e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
6053e519524SHoward Hinnant        : __na_(__x.__na_),
6063e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6073e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6083e519524SHoward Hinnant        {
6093e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
6103e519524SHoward Hinnant        }
6116a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6123e519524SHoward Hinnant
613789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6143714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6153e519524SHoward Hinnant    {
6163e519524SHoward Hinnant        if (__second_constructed)
617f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6183e519524SHoward Hinnant        if (__first_constructed)
619f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6203e519524SHoward Hinnant        if (__p)
6213e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6223e519524SHoward Hinnant    }
6233e519524SHoward Hinnant};
6243e519524SHoward Hinnant
625fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6269fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
627f52318b4SErik Pilkingtonstruct __hash_value_type
6289fd9f84fSHoward Hinnant{
6299fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6309fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6319fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
632f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
633f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
6349fd9f84fSHoward Hinnant
635f52318b4SErik Pilkingtonprivate:
6369fd9f84fSHoward Hinnant    value_type __cc;
637f52318b4SErik Pilkington
638f52318b4SErik Pilkingtonpublic:
639f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
640f52318b4SErik Pilkington    value_type& __get_value()
641f52318b4SErik Pilkington    {
642f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
643f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
644f52318b4SErik Pilkington#else
645f52318b4SErik Pilkington        return __cc;
646f52318b4SErik Pilkington#endif
647f52318b4SErik Pilkington    }
648f52318b4SErik Pilkington
649f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
650f52318b4SErik Pilkington    const value_type& __get_value() const
651f52318b4SErik Pilkington    {
652f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
653f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
654f52318b4SErik Pilkington#else
655f52318b4SErik Pilkington        return __cc;
656f52318b4SErik Pilkington#endif
657f52318b4SErik Pilkington    }
658f52318b4SErik Pilkington
659f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
660f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
661f52318b4SErik Pilkington    {
662f52318b4SErik Pilkington        value_type& __v = __get_value();
663f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
664f52318b4SErik Pilkington    }
665f52318b4SErik Pilkington
666f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
667f52318b4SErik Pilkington    __nc_rref_pair_type __move()
668f52318b4SErik Pilkington    {
669f52318b4SErik Pilkington        value_type& __v = __get_value();
670f52318b4SErik Pilkington        return __nc_rref_pair_type(
671f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
672f52318b4SErik Pilkington            _VSTD::move(__v.second));
673f52318b4SErik Pilkington    }
6749fd9f84fSHoward Hinnant
6759fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6769fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
677f52318b4SErik Pilkington    {
678f52318b4SErik Pilkington        __ref() = __v.__get_value();
679f52318b4SErik Pilkington        return *this;
680f52318b4SErik Pilkington    }
6819fd9f84fSHoward Hinnant
6829fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6839fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
684f52318b4SErik Pilkington    {
685f52318b4SErik Pilkington        __ref() = __v.__move();
686f52318b4SErik Pilkington        return *this;
687f52318b4SErik Pilkington    }
6889fd9f84fSHoward Hinnant
689fcd02211SEric Fiselier    template <class _ValueTp,
690fcd02211SEric Fiselier              class = typename enable_if<
691fcd02211SEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
692fcd02211SEric Fiselier                 >::type
693fcd02211SEric Fiselier             >
6949fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
695f52318b4SErik Pilkington    __hash_value_type& operator=(_ValueTp&& __v)
696f52318b4SErik Pilkington    {
697f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
698f52318b4SErik Pilkington        return *this;
699fcd02211SEric Fiselier    }
700fcd02211SEric Fiselier
701fcd02211SEric Fiselierprivate:
702fcd02211SEric Fiselier    __hash_value_type(const __hash_value_type& __v) = delete;
703fcd02211SEric Fiselier    __hash_value_type(__hash_value_type&& __v) = delete;
704fcd02211SEric Fiselier    template <class ..._Args>
705fcd02211SEric Fiselier    explicit __hash_value_type(_Args&& ...__args) = delete;
706fcd02211SEric Fiselier
707fcd02211SEric Fiselier    ~__hash_value_type() = delete;
7089fd9f84fSHoward Hinnant};
7099fd9f84fSHoward Hinnant
7109fd9f84fSHoward Hinnant#else
7119fd9f84fSHoward Hinnant
7129fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7139fd9f84fSHoward Hinnantstruct __hash_value_type
7149fd9f84fSHoward Hinnant{
7159fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7169fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7179fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7189fd9f84fSHoward Hinnant
719f52318b4SErik Pilkingtonprivate:
7209fd9f84fSHoward Hinnant    value_type __cc;
7219fd9f84fSHoward Hinnant
722f52318b4SErik Pilkingtonpublic:
723f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
724f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
725f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
726f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
727f52318b4SErik Pilkington
728fcd02211SEric Fiselierprivate:
729fcd02211SEric Fiselier   ~__hash_value_type();
7309fd9f84fSHoward Hinnant};
7319fd9f84fSHoward Hinnant
7329fd9f84fSHoward Hinnant#endif
7339fd9f84fSHoward Hinnant
7343e519524SHoward Hinnanttemplate <class _HashIterator>
735e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator
7363e519524SHoward Hinnant{
7373e519524SHoward Hinnant    _HashIterator __i_;
7383e519524SHoward Hinnant
73975d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
74075d0dcfdSEric Fiselier
7413e519524SHoward Hinnantpublic:
7423e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
74375d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
74475d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
7453e519524SHoward Hinnant    typedef value_type&                                          reference;
74675d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
7473e519524SHoward Hinnant
748789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7493714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
7503e519524SHoward Hinnant
751789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7523714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
7533e519524SHoward Hinnant
754789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
755f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
756789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
757f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
7583e519524SHoward Hinnant
759789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7603e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
761789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7623e519524SHoward Hinnant    __hash_map_iterator operator++(int)
7633e519524SHoward Hinnant    {
7643e519524SHoward Hinnant        __hash_map_iterator __t(*this);
7653e519524SHoward Hinnant        ++(*this);
7663e519524SHoward Hinnant        return __t;
7673e519524SHoward Hinnant    }
7683e519524SHoward Hinnant
769789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
770789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
7713e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
772789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
773789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
7743e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7753e519524SHoward Hinnant
776e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
777e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
778e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
779e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
780e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
7813e519524SHoward Hinnant};
7823e519524SHoward Hinnant
7833e519524SHoward Hinnanttemplate <class _HashIterator>
784e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
7853e519524SHoward Hinnant{
7863e519524SHoward Hinnant    _HashIterator __i_;
7873e519524SHoward Hinnant
78875d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
78975d0dcfdSEric Fiselier
7903e519524SHoward Hinnantpublic:
7913e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
79275d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
79375d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
7943e519524SHoward Hinnant    typedef const value_type&                                    reference;
79575d0dcfdSEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
7963e519524SHoward Hinnant
797789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7983714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
7993e519524SHoward Hinnant
800789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8013714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
802789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8033e519524SHoward Hinnant    __hash_map_const_iterator(
8043e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
8053714107eSHoward Hinnant                 _NOEXCEPT
8063e519524SHoward Hinnant                : __i_(__i.__i_) {}
8073e519524SHoward Hinnant
808789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
809f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
810789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
811f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8123e519524SHoward Hinnant
813789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8143e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
815789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8163e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
8173e519524SHoward Hinnant    {
8183e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
8193e519524SHoward Hinnant        ++(*this);
8203e519524SHoward Hinnant        return __t;
8213e519524SHoward Hinnant    }
8223e519524SHoward Hinnant
823789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
824789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
8253e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
826789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
827789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
8283e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8293e519524SHoward Hinnant
830e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
831e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
832e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
833e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
8343e519524SHoward Hinnant};
8353e519524SHoward Hinnant
8365c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
8375c4e07aeSErik Pilkingtonclass unordered_multimap;
8385c4e07aeSErik Pilkington
8393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
8403e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
841e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map
8423e519524SHoward Hinnant{
8433e519524SHoward Hinnantpublic:
8443e519524SHoward Hinnant    // types
8453e519524SHoward Hinnant    typedef _Key                                           key_type;
8463e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
847*dfcd4384SLouis Dionne    typedef typename __identity<_Hash>::type               hasher;
848*dfcd4384SLouis Dionne    typedef typename __identity<_Pred>::type               key_equal;
849*dfcd4384SLouis Dionne    typedef typename __identity<_Alloc>::type              allocator_type;
8503e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
8513e519524SHoward Hinnant    typedef value_type&                                    reference;
8523e519524SHoward Hinnant    typedef const value_type&                              const_reference;
853b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
854b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
8553e519524SHoward Hinnant
8563e519524SHoward Hinnantprivate:
8579fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
858abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
859abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
8601f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
8611f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
8623e519524SHoward Hinnant
8633e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
8643e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
8653e519524SHoward Hinnant
8663e519524SHoward Hinnant    __table __table_;
8673e519524SHoward Hinnant
868fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
8693e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
8703e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
8713e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
8723e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
8733e519524SHoward Hinnant    typedef typename __table::__node                       __node;
874c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
875c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
8763e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
877fcd02211SEric Fiselier
878fcd02211SEric Fiselier    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
879fcd02211SEric Fiselier    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
8803e519524SHoward Hinnantpublic:
8813e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
8823e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
88375d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
88475d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
8853e519524SHoward Hinnant
8863e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
8873e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
8883e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
8893e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
8903e519524SHoward Hinnant
891b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
892b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
893b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
894b0386a51SErik Pilkington#endif
895b0386a51SErik Pilkington
8965c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
8975c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
8985c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
8995c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
9005c4e07aeSErik Pilkington
901789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9023714107eSHoward Hinnant    unordered_map()
9033714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
904b24c8024SHoward Hinnant        {
905b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
906b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
907b24c8024SHoward Hinnant#endif
908b24c8024SHoward Hinnant        }
9093e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
9103e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
9113e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
9123e519524SHoward Hinnant                  const key_equal& __eql,
9133e519524SHoward Hinnant                  const allocator_type& __a);
9143e519524SHoward Hinnant    template <class _InputIterator>
9153e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
9163e519524SHoward Hinnant    template <class _InputIterator>
9173e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
9183e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
9193e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
9203e519524SHoward Hinnant    template <class _InputIterator>
9213e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
9223e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
9233e519524SHoward Hinnant                      const key_equal& __eql,
9243e519524SHoward Hinnant                      const allocator_type& __a);
925cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9263e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
9273e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
9283e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
9296a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
930cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9313714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
9323714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
9333e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
9343e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
9353e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
9363e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
9373e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
9383e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
9393e519524SHoward Hinnant                  const allocator_type& __a);
9406a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
9413cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
9423cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9433cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
9443cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
9453cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9463cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
9473cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
9483cd37e64SMarshall Clow    template <class _InputIterator>
9493cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9503cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
9513cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
9523cd37e64SMarshall Clow    template <class _InputIterator>
9533cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9543cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
9553cd37e64SMarshall Clow        const allocator_type& __a)
9563cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
9573cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9583cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
9593cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
9603cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9613cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
9623cd37e64SMarshall Clow      const allocator_type& __a)
9633cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
9643cd37e64SMarshall Clow#endif
9657c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
9667c142fccSLouis Dionne    ~unordered_map() {
9677c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
9687c142fccSLouis Dionne    }
9697c142fccSLouis Dionne
9705a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9715a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
9725a33687dSHoward Hinnant    {
9732ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
9745a33687dSHoward Hinnant        __table_ = __u.__table_;
975307f8143SHoward Hinnant#else
97674cf6ff5SMarshall Clow        if (this != &__u) {
977307f8143SHoward Hinnant            __table_.clear();
978307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
979307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
980307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
981307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
982307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
98374cf6ff5SMarshall Clow        }
984307f8143SHoward Hinnant#endif
9855a33687dSHoward Hinnant        return *this;
9865a33687dSHoward Hinnant    }
9876a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
988cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9893714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
9903714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
991cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9923e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
9936a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
9943e519524SHoward Hinnant
995789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9963714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
9973e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
9983e519524SHoward Hinnant
99972c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
10003714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1001789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10023714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1003789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10043714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
10053e519524SHoward Hinnant
1006789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10073714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1008789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10093714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1010789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10113714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1012789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10133714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1014789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10153714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1016789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10173714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
10183e519524SHoward Hinnant
10197a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10207a9f500fSEric Fiselier    pair<iterator, bool> insert(const value_type& __x)
10217a9f500fSEric Fiselier        {return __table_.__insert_unique(__x);}
10227a9f500fSEric Fiselier
10237a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x) {
10247a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10257a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10267a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
10277a9f500fSEric Fiselier            " referring to this unordered_map");
1028fd838227SEric Fiselier#else
1029fd838227SEric Fiselier        ((void)__p);
10307a9f500fSEric Fiselier#endif
10317a9f500fSEric Fiselier        return insert(__x).first;
10327a9f500fSEric Fiselier    }
10337a9f500fSEric Fiselier
10347a9f500fSEric Fiselier    template <class _InputIterator>
1035cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
10367a9f500fSEric Fiselier        void insert(_InputIterator __first, _InputIterator __last);
10377a9f500fSEric Fiselier
10386a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10397a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10407a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
10417a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
10427a9f500fSEric Fiselier
10437a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10447a9f500fSEric Fiselier    pair<iterator, bool> insert(value_type&& __x)
10457a9f500fSEric Fiselier        {return __table_.__insert_unique(_VSTD::move(__x));}
10467a9f500fSEric Fiselier
10477a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x) {
10487a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10497a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10507a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
10517a9f500fSEric Fiselier            " referring to this unordered_map");
1052fd838227SEric Fiselier#else
1053fd838227SEric Fiselier        ((void)__p);
10547a9f500fSEric Fiselier#endif
10557a9f500fSEric Fiselier        return __table_.__insert_unique(_VSTD::move(__x)).first;
10567a9f500fSEric Fiselier    }
10577a9f500fSEric Fiselier
10587a9f500fSEric Fiselier    template <class _Pp,
10597a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
10607a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
10617a9f500fSEric Fiselier        pair<iterator, bool> insert(_Pp&& __x)
10627a9f500fSEric Fiselier            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
10637a9f500fSEric Fiselier
10647a9f500fSEric Fiselier    template <class _Pp,
10657a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
10667a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
10677a9f500fSEric Fiselier        iterator insert(const_iterator __p, _Pp&& __x)
10687a9f500fSEric Fiselier        {
10697a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10707a9f500fSEric Fiselier            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10717a9f500fSEric Fiselier                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
10727a9f500fSEric Fiselier                " referring to this unordered_map");
1073fd838227SEric Fiselier#else
1074fd838227SEric Fiselier          ((void)__p);
10757a9f500fSEric Fiselier#endif
10767a9f500fSEric Fiselier            return insert(_VSTD::forward<_Pp>(__x)).first;
10777a9f500fSEric Fiselier        }
10787a9f500fSEric Fiselier
10798b805c91SHoward Hinnant    template <class... _Args>
1080fcd02211SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1081fcd02211SEric Fiselier    pair<iterator, bool> emplace(_Args&&... __args) {
1082fcd02211SEric Fiselier        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1083fcd02211SEric Fiselier    }
10843e519524SHoward Hinnant
10858b805c91SHoward Hinnant    template <class... _Args>
1086789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1087fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
10884c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
10894c80bfbdSHoward Hinnant        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10904c80bfbdSHoward Hinnant            "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
10914c80bfbdSHoward Hinnant            " referring to this unordered_map");
1092fd838227SEric Fiselier#else
1093fd838227SEric Fiselier          ((void)__p);
1094fcd02211SEric Fiselier#endif
1095ad783ce9SDuncan P. N. Exon Smith        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
10964c80bfbdSHoward Hinnant    }
1097fcd02211SEric Fiselier
1098fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
1099fcd02211SEric Fiselier
1100bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
1101bc4c89a9SMarshall Clow    template <class... _Args>
1102bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1103bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1104bc4c89a9SMarshall Clow    {
110587c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
110687c4104dSEric Fiselier            _VSTD::forward_as_tuple(__k),
110787c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1108bc4c89a9SMarshall Clow    }
1109bc4c89a9SMarshall Clow
1110bc4c89a9SMarshall Clow    template <class... _Args>
1111bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1112bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1113bc4c89a9SMarshall Clow    {
111487c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
111587c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
111687c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1117bc4c89a9SMarshall Clow    }
1118bc4c89a9SMarshall Clow
1119bc4c89a9SMarshall Clow    template <class... _Args>
1120bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1121bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1122bc4c89a9SMarshall Clow    {
112387c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1124eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
112587c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
112687c4104dSEric Fiselier            " referring to this unordered_map");
1127fd838227SEric Fiselier#else
1128fd838227SEric Fiselier        ((void)__h);
112987c4104dSEric Fiselier#endif
113087c4104dSEric Fiselier        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1131bc4c89a9SMarshall Clow    }
1132bc4c89a9SMarshall Clow
1133bc4c89a9SMarshall Clow    template <class... _Args>
1134bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1135bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1136bc4c89a9SMarshall Clow    {
113787c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1138eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
113987c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
114087c4104dSEric Fiselier            " referring to this unordered_map");
1141fd838227SEric Fiselier#else
1142fd838227SEric Fiselier        ((void)__h);
114387c4104dSEric Fiselier#endif
114487c4104dSEric Fiselier        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1145bc4c89a9SMarshall Clow    }
1146bc4c89a9SMarshall Clow
1147bc4c89a9SMarshall Clow    template <class _Vp>
1148bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1149bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1150bc4c89a9SMarshall Clow    {
115187c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
115287c4104dSEric Fiselier            __k, _VSTD::forward<_Vp>(__v));
115387c4104dSEric Fiselier        if (!__res.second) {
115487c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1155bc4c89a9SMarshall Clow        }
115687c4104dSEric Fiselier        return __res;
1157bc4c89a9SMarshall Clow    }
1158bc4c89a9SMarshall Clow
1159bc4c89a9SMarshall Clow    template <class _Vp>
1160bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1161bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1162bc4c89a9SMarshall Clow    {
116387c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
116487c4104dSEric Fiselier            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
116587c4104dSEric Fiselier        if (!__res.second) {
116687c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1167bc4c89a9SMarshall Clow        }
116887c4104dSEric Fiselier        return __res;
1169bc4c89a9SMarshall Clow    }
1170bc4c89a9SMarshall Clow
1171bc4c89a9SMarshall Clow    template <class _Vp>
1172bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1173fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1174bc4c89a9SMarshall Clow     {
1175fd838227SEric Fiselier          // FIXME: Add debug mode checking for the iterator input
117687c4104dSEric Fiselier          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1177bc4c89a9SMarshall Clow     }
1178bc4c89a9SMarshall Clow
1179bc4c89a9SMarshall Clow    template <class _Vp>
1180bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1181fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1182bc4c89a9SMarshall Clow     {
1183fd838227SEric Fiselier        // FIXME: Add debug mode checking for the iterator input
118487c4104dSEric Fiselier        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1185bc4c89a9SMarshall Clow     }
11866a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14
1187bc4c89a9SMarshall Clow
1188789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11893e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1190789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1191ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1192ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11933e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1194789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11953e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
11963e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1197789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11983714107eSHoward Hinnant        void clear() _NOEXCEPT {__table_.clear();}
11993e519524SHoward Hinnant
1200b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1201b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1202b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1203b0386a51SErik Pilkington    {
1204b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1205b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1206b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<
1207b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1208b0386a51SErik Pilkington    }
1209b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1210b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1211b0386a51SErik Pilkington    {
1212b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1213b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1214b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<node_type>(
1215b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1216b0386a51SErik Pilkington    }
1217b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1218b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1219b0386a51SErik Pilkington    {
1220b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1221b0386a51SErik Pilkington    }
1222b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1223b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1224b0386a51SErik Pilkington    {
1225b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1226b0386a51SErik Pilkington            __it.__i_);
1227b0386a51SErik Pilkington    }
12285c4e07aeSErik Pilkington
12295c4e07aeSErik Pilkington    template <class _H2, class _P2>
12305c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12315c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
12325c4e07aeSErik Pilkington    {
12335c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12345c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12355c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
12365c4e07aeSErik Pilkington    }
12375c4e07aeSErik Pilkington    template <class _H2, class _P2>
12385c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12395c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
12405c4e07aeSErik Pilkington    {
12415c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12425c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12435c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
12445c4e07aeSErik Pilkington    }
12455c4e07aeSErik Pilkington    template <class _H2, class _P2>
12465c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12475c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
12485c4e07aeSErik Pilkington    {
12495c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12505c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12515c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
12525c4e07aeSErik Pilkington    }
12535c4e07aeSErik Pilkington    template <class _H2, class _P2>
12545c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12555c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
12565c4e07aeSErik Pilkington    {
12575c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12585c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12595c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
12605c4e07aeSErik Pilkington    }
1261b0386a51SErik Pilkington#endif
1262b0386a51SErik Pilkington
1263789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12643714107eSHoward Hinnant    void swap(unordered_map& __u)
12653714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
12663714107eSHoward Hinnant        { __table_.swap(__u.__table_);}
12673e519524SHoward Hinnant
1268789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12693e519524SHoward Hinnant    hasher hash_function() const
12703e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1271789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12723e519524SHoward Hinnant    key_equal key_eq() const
12733e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
12743e519524SHoward Hinnant
1275789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12763e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1277789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12783e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1279789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12803e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1281789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12823e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
12833e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1284789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12853e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
12863e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
12873e519524SHoward Hinnant
12883e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
12890f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12903e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
12913e519524SHoward Hinnant#endif
12923e519524SHoward Hinnant
12933e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
12943e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
12953e519524SHoward Hinnant
1296789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12973714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1298789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12993714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
13003e519524SHoward Hinnant
1301789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13023e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
13033e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1304789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13053e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
13063e519524SHoward Hinnant
1307789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13083e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1309789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13103e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1311789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13123e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1313789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13143e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1315789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13163e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1317789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13183e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
13193e519524SHoward Hinnant
1320789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13213714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1322789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13233714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1324789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13253e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1326789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13273e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1328789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13293e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
13303e519524SHoward Hinnant
1331b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1332b24c8024SHoward Hinnant
1333b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1334b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1335b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1336b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1337b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1338b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1339b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1340b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1341b24c8024SHoward Hinnant
1342b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1343b24c8024SHoward Hinnant
13443e519524SHoward Hinnantprivate:
13450f905677SEric Fiselier
13460f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
13474a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
13480f905677SEric Fiselier#endif
13493e519524SHoward Hinnant};
13503e519524SHoward Hinnant
1351*dfcd4384SLouis Dionne#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
1352*dfcd4384SLouis Dionnetemplate<class _InputIterator,
1353*dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
1354*dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
1355*dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
1356*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
1357*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
1358*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Pred>::value>,
1359*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1360*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
1361*dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1362*dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
1363*dfcd4384SLouis Dionne
1364*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
1365*dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
1366*dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
1367*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
1368*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
1369*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Pred>::value>,
1370*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1371*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
1372*dfcd4384SLouis Dionne              _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1373*dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
1374*dfcd4384SLouis Dionne
1375*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
1376*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1377*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
1378*dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1379*dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1380*dfcd4384SLouis Dionne
1381*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
1382*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1383*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator)
1384*dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1385*dfcd4384SLouis Dionne                   hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1386*dfcd4384SLouis Dionne
1387*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
1388*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
1389*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
1390*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1391*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1392*dfcd4384SLouis Dionne  -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1393*dfcd4384SLouis Dionne                   _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
1394*dfcd4384SLouis Dionne
1395*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
1396*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1397*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
1398*dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1399*dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1400*dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1401*dfcd4384SLouis Dionne
1402*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
1403*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1404*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1405*dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp,
1406*dfcd4384SLouis Dionne                   hash<remove_const_t<_Key>>,
1407*dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1408*dfcd4384SLouis Dionne
1409*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
1410*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
1411*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
1412*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
1413*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
1414*dfcd4384SLouis Dionne  -> unordered_map<remove_const_t<_Key>, _Tp, _Hash,
1415*dfcd4384SLouis Dionne                   equal_to<remove_const_t<_Key>>, _Allocator>;
1416*dfcd4384SLouis Dionne#endif
1417*dfcd4384SLouis Dionne
14183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14193e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14203e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
14213e519524SHoward Hinnant    : __table_(__hf, __eql)
14223e519524SHoward Hinnant{
1423b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1424b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1425b24c8024SHoward Hinnant#endif
14263e519524SHoward Hinnant    __table_.rehash(__n);
14273e519524SHoward Hinnant}
14283e519524SHoward Hinnant
14293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14303e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14313e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
14323e519524SHoward Hinnant        const allocator_type& __a)
14332a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
14343e519524SHoward Hinnant{
1435b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1436b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1437b24c8024SHoward Hinnant#endif
14383e519524SHoward Hinnant    __table_.rehash(__n);
14393e519524SHoward Hinnant}
14403e519524SHoward Hinnant
14413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1442cd31b434SEvgeniy Stepanovinline
14433e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14443e519524SHoward Hinnant        const allocator_type& __a)
14452a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
14463e519524SHoward Hinnant{
1447b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1448b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1449b24c8024SHoward Hinnant#endif
14503e519524SHoward Hinnant}
14513e519524SHoward Hinnant
14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14533e519524SHoward Hinnanttemplate <class _InputIterator>
14543e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14553e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
14563e519524SHoward Hinnant{
1457b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1458b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1459b24c8024SHoward Hinnant#endif
14603e519524SHoward Hinnant    insert(__first, __last);
14613e519524SHoward Hinnant}
14623e519524SHoward Hinnant
14633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14643e519524SHoward Hinnanttemplate <class _InputIterator>
14653e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14663e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
14673e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
14683e519524SHoward Hinnant    : __table_(__hf, __eql)
14693e519524SHoward Hinnant{
1470b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1471b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1472b24c8024SHoward Hinnant#endif
14733e519524SHoward Hinnant    __table_.rehash(__n);
14743e519524SHoward Hinnant    insert(__first, __last);
14753e519524SHoward Hinnant}
14763e519524SHoward Hinnant
14773e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14783e519524SHoward Hinnanttemplate <class _InputIterator>
14793e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14803e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
14813e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
14822a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
14833e519524SHoward Hinnant{
1484b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1485b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1486b24c8024SHoward Hinnant#endif
14873e519524SHoward Hinnant    __table_.rehash(__n);
14883e519524SHoward Hinnant    insert(__first, __last);
14893e519524SHoward Hinnant}
14903e519524SHoward Hinnant
14913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14923e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14933e519524SHoward Hinnant        const unordered_map& __u)
14943e519524SHoward Hinnant    : __table_(__u.__table_)
14953e519524SHoward Hinnant{
1496b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1497b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1498b24c8024SHoward Hinnant#endif
14993e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
15003e519524SHoward Hinnant    insert(__u.begin(), __u.end());
15013e519524SHoward Hinnant}
15023e519524SHoward Hinnant
15033e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15043e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15053e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
15062a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
15073e519524SHoward Hinnant{
1508b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1509b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1510b24c8024SHoward Hinnant#endif
15113e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
15123e519524SHoward Hinnant    insert(__u.begin(), __u.end());
15133e519524SHoward Hinnant}
15143e519524SHoward Hinnant
15156a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
15163e519524SHoward Hinnant
15173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1518cd31b434SEvgeniy Stepanovinline
15193e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15203e519524SHoward Hinnant        unordered_map&& __u)
15213714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1522ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
15233e519524SHoward Hinnant{
1524b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1525b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
15264c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1527b24c8024SHoward Hinnant#endif
15283e519524SHoward Hinnant}
15293e519524SHoward Hinnant
15303e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15313e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15323e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
15332a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
15343e519524SHoward Hinnant{
1535b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1536b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1537b24c8024SHoward Hinnant#endif
15383e519524SHoward Hinnant    if (__a != __u.get_allocator())
15393e519524SHoward Hinnant    {
15403e519524SHoward Hinnant        iterator __i = __u.begin();
1541fcd02211SEric Fiselier        while (__u.size() != 0) {
1542f52318b4SErik Pilkington            __table_.__emplace_unique(
1543f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
1544fcd02211SEric Fiselier        }
15453e519524SHoward Hinnant    }
15464c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
15474c80bfbdSHoward Hinnant    else
15484c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
15494c80bfbdSHoward Hinnant#endif
15503e519524SHoward Hinnant}
15513e519524SHoward Hinnant
15523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15533e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15543e519524SHoward Hinnant        initializer_list<value_type> __il)
15553e519524SHoward Hinnant{
1556b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1557b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1558b24c8024SHoward Hinnant#endif
15593e519524SHoward Hinnant    insert(__il.begin(), __il.end());
15603e519524SHoward Hinnant}
15613e519524SHoward Hinnant
15623e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15633e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15643e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
15653e519524SHoward Hinnant        const key_equal& __eql)
15663e519524SHoward Hinnant    : __table_(__hf, __eql)
15673e519524SHoward Hinnant{
1568b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1569b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1570b24c8024SHoward Hinnant#endif
15713e519524SHoward Hinnant    __table_.rehash(__n);
15723e519524SHoward Hinnant    insert(__il.begin(), __il.end());
15733e519524SHoward Hinnant}
15743e519524SHoward Hinnant
15753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15763e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
15773e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
15783e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
15792a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
15803e519524SHoward Hinnant{
1581b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1582b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1583b24c8024SHoward Hinnant#endif
15843e519524SHoward Hinnant    __table_.rehash(__n);
15853e519524SHoward Hinnant    insert(__il.begin(), __il.end());
15863e519524SHoward Hinnant}
15873e519524SHoward Hinnant
15883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1589cd31b434SEvgeniy Stepanovinline
15903e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
15913e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
15923714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
15933e519524SHoward Hinnant{
1594ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
15953e519524SHoward Hinnant    return *this;
15963e519524SHoward Hinnant}
15973e519524SHoward Hinnant
15983e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1599cd31b434SEvgeniy Stepanovinline
16003e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
16013e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
16023e519524SHoward Hinnant        initializer_list<value_type> __il)
16033e519524SHoward Hinnant{
16043e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
16053e519524SHoward Hinnant    return *this;
16063e519524SHoward Hinnant}
16073e519524SHoward Hinnant
16086a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
16093e519524SHoward Hinnant
16103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16113e519524SHoward Hinnanttemplate <class _InputIterator>
1612cd31b434SEvgeniy Stepanovinline
16133e519524SHoward Hinnantvoid
16143e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
16153e519524SHoward Hinnant                                                       _InputIterator __last)
16163e519524SHoward Hinnant{
16173e519524SHoward Hinnant    for (; __first != __last; ++__first)
16183e519524SHoward Hinnant        __table_.__insert_unique(*__first);
16193e519524SHoward Hinnant}
16203e519524SHoward Hinnant
16216a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
16223e519524SHoward Hinnant
16230f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16240f905677SEric Fiselier_Tp&
16250f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
16260f905677SEric Fiselier{
16270f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
16280f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(__k),
1629f52318b4SErik Pilkington                                  std::forward_as_tuple()).first->__get_value().second;
16300f905677SEric Fiselier}
16313e519524SHoward Hinnant
16323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16333e519524SHoward Hinnant_Tp&
16343e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
16353e519524SHoward Hinnant{
16360f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
16370f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1638f52318b4SErik Pilkington                                  std::forward_as_tuple()).first->__get_value().second;
16393e519524SHoward Hinnant}
16406a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG
16413e519524SHoward Hinnant
16426a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16436a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
16446a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
16456a470bcbSEric Fiselier{
16466a470bcbSEric Fiselier    __node_allocator& __na = __table_.__node_alloc();
16476a470bcbSEric Fiselier    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1648f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
16496a470bcbSEric Fiselier    __h.get_deleter().__first_constructed = true;
1650f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
16516a470bcbSEric Fiselier    __h.get_deleter().__second_constructed = true;
16526a470bcbSEric Fiselier    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
16536a470bcbSEric Fiselier}
16546a470bcbSEric Fiselier
16556a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16566a470bcbSEric Fiselier_Tp&
16576a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
16586a470bcbSEric Fiselier{
16596a470bcbSEric Fiselier    iterator __i = find(__k);
16606a470bcbSEric Fiselier    if (__i != end())
16616a470bcbSEric Fiselier        return __i->second;
16626a470bcbSEric Fiselier    __node_holder __h = __construct_node_with_key(__k);
16636a470bcbSEric Fiselier    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
16646a470bcbSEric Fiselier    __h.release();
16656a470bcbSEric Fiselier    return __r.first->second;
16666a470bcbSEric Fiselier}
16676a470bcbSEric Fiselier
16686a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_MODE
16693e519524SHoward Hinnant
16703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16713e519524SHoward Hinnant_Tp&
16723e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
16733e519524SHoward Hinnant{
16743e519524SHoward Hinnant    iterator __i = find(__k);
16753e519524SHoward Hinnant    if (__i == end())
16767232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
16773e519524SHoward Hinnant    return __i->second;
16783e519524SHoward Hinnant}
16793e519524SHoward Hinnant
16803e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16813e519524SHoward Hinnantconst _Tp&
16823e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
16833e519524SHoward Hinnant{
16843e519524SHoward Hinnant    const_iterator __i = find(__k);
16853e519524SHoward Hinnant    if (__i == end())
16867232a84eSLouis Dionne        __throw_out_of_range("unordered_map::at: key not found");
16873e519524SHoward Hinnant    return __i->second;
16883e519524SHoward Hinnant}
16893e519524SHoward Hinnant
16903e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1691789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16923e519524SHoward Hinnantvoid
16933e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
16943e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
16953714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
16963e519524SHoward Hinnant{
16973e519524SHoward Hinnant    __x.swap(__y);
16983e519524SHoward Hinnant}
16993e519524SHoward Hinnant
1700f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
1701f60c63c0SMarshall Clowtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
1702f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
1703f60c63c0SMarshall Clowvoid erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
1704f60c63c0SMarshall Clow{ __libcpp_erase_if_container(__c, __pred); }
1705f60c63c0SMarshall Clow#endif
1706f60c63c0SMarshall Clow
17073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
17083e519524SHoward Hinnantbool
17093e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
17103e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
17113e519524SHoward Hinnant{
17123e519524SHoward Hinnant    if (__x.size() != __y.size())
17133e519524SHoward Hinnant        return false;
17143e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
17153e519524SHoward Hinnant                                                                 const_iterator;
17163e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
17173e519524SHoward Hinnant            __i != __ex; ++__i)
17183e519524SHoward Hinnant    {
17193e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
17203e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
17213e519524SHoward Hinnant            return false;
17223e519524SHoward Hinnant    }
17233e519524SHoward Hinnant    return true;
17243e519524SHoward Hinnant}
17253e519524SHoward Hinnant
17263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1727789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
17283e519524SHoward Hinnantbool
17293e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
17303e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
17313e519524SHoward Hinnant{
17323e519524SHoward Hinnant    return !(__x == __y);
17333e519524SHoward Hinnant}
17343e519524SHoward Hinnant
17353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
17363e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1737e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap
17383e519524SHoward Hinnant{
17393e519524SHoward Hinnantpublic:
17403e519524SHoward Hinnant    // types
17413e519524SHoward Hinnant    typedef _Key                                           key_type;
17423e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
1743*dfcd4384SLouis Dionne    typedef typename __identity<_Hash>::type               hasher;
1744*dfcd4384SLouis Dionne    typedef typename __identity<_Pred>::type               key_equal;
1745*dfcd4384SLouis Dionne    typedef typename __identity<_Alloc>::type              allocator_type;
17463e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
17473e519524SHoward Hinnant    typedef value_type&                                    reference;
17483e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1749b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1750b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
17513e519524SHoward Hinnant
17523e519524SHoward Hinnantprivate:
17539fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1754abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1755abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
17561f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
17571f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
17583e519524SHoward Hinnant
17593e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
17603e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
17613e519524SHoward Hinnant
17623e519524SHoward Hinnant    __table __table_;
17633e519524SHoward Hinnant
1764fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
17653e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
17663e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
17673e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1768c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1769c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
17703e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
177175d0dcfdSEric Fiselier    static_assert((is_same<typename __node_traits::size_type,
177275d0dcfdSEric Fiselier                          typename __alloc_traits::size_type>::value),
177375d0dcfdSEric Fiselier                 "Allocator uses different size_type for different types");
17743e519524SHoward Hinnantpublic:
17753e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
17763e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
177775d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
177875d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
17793e519524SHoward Hinnant
17803e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
17813e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
17823e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
17833e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
17843e519524SHoward Hinnant
1785b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1786b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
1787b0386a51SErik Pilkington#endif
1788b0386a51SErik Pilkington
17895c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
17905c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
17915c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
17925c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
17935c4e07aeSErik Pilkington
1794789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17953714107eSHoward Hinnant    unordered_multimap()
17963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1797b24c8024SHoward Hinnant        {
1798b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1799b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
1800b24c8024SHoward Hinnant#endif
1801b24c8024SHoward Hinnant        }
18023e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
18033e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
18043e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
18053e519524SHoward Hinnant                                const key_equal& __eql,
18063e519524SHoward Hinnant                                const allocator_type& __a);
18073e519524SHoward Hinnant    template <class _InputIterator>
18083e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
18093e519524SHoward Hinnant    template <class _InputIterator>
18103e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
18113e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
18123e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
18133e519524SHoward Hinnant    template <class _InputIterator>
18143e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
18153e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
18163e519524SHoward Hinnant                      const key_equal& __eql,
18173e519524SHoward Hinnant                      const allocator_type& __a);
1818cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18193e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
18203e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
18213e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
18226a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1823cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18243714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
18253714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
18263e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
18273e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
18283e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
18293e519524SHoward Hinnant                       const hasher& __hf = hasher(),
18303e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
18313e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
18323e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
18333e519524SHoward Hinnant                       const allocator_type& __a);
18346a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18353cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
18363cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18373cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
18383cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
18393cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18403cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
18413cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
18423cd37e64SMarshall Clow    template <class _InputIterator>
18433cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18443cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
18453cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
18463cd37e64SMarshall Clow    template <class _InputIterator>
18473cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18483cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
18493cd37e64SMarshall Clow        const allocator_type& __a)
18503cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
18513cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18523cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
18533cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
18543cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18553cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
18563cd37e64SMarshall Clow      const allocator_type& __a)
18573cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
18583cd37e64SMarshall Clow#endif
18597c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
18607c142fccSLouis Dionne    ~unordered_multimap() {
18617c142fccSLouis Dionne        static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), "");
18627c142fccSLouis Dionne    }
18637c142fccSLouis Dionne
18645a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18655a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
18665a33687dSHoward Hinnant    {
18672ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
18685a33687dSHoward Hinnant        __table_ = __u.__table_;
1869307f8143SHoward Hinnant#else
187074cf6ff5SMarshall Clow        if (this != &__u) {
1871307f8143SHoward Hinnant            __table_.clear();
1872307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1873307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1874307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1875307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1876307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
187774cf6ff5SMarshall Clow        }
1878307f8143SHoward Hinnant#endif
18795a33687dSHoward Hinnant        return *this;
18805a33687dSHoward Hinnant    }
18816a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1882cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18833714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
18843714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1885cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18863e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
18876a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18883e519524SHoward Hinnant
1889789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18903714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
18913e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
18923e519524SHoward Hinnant
189372c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
18943714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1895789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18963714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1897789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18983714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
18993e519524SHoward Hinnant
1900789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19013714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1902789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19033714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1904789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19053714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1906789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19073714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1908789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19093714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1910789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19113714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
19123e519524SHoward Hinnant
19137a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19147a9f500fSEric Fiselier    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
19157a9f500fSEric Fiselier
19167a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19177a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x)
19187a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, __x);}
19197a9f500fSEric Fiselier
19207a9f500fSEric Fiselier    template <class _InputIterator>
1921cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
19227a9f500fSEric Fiselier    void insert(_InputIterator __first, _InputIterator __last);
19237a9f500fSEric Fiselier
19246a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19257a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19267a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
19277a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
19287a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19297a9f500fSEric Fiselier    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
19307a9f500fSEric Fiselier
19317a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19327a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x)
19337a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
19347a9f500fSEric Fiselier
19357a9f500fSEric Fiselier    template <class _Pp,
19367a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
19377a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19387a9f500fSEric Fiselier    iterator insert(_Pp&& __x)
19397a9f500fSEric Fiselier        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
19407a9f500fSEric Fiselier
19417a9f500fSEric Fiselier    template <class _Pp,
19427a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
19437a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19447a9f500fSEric Fiselier    iterator insert(const_iterator __p, _Pp&& __x)
19457a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
19467a9f500fSEric Fiselier
1947fcd02211SEric Fiselier    template <class... _Args>
1948fcd02211SEric Fiselier    iterator emplace(_Args&&... __args) {
1949fcd02211SEric Fiselier        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1950fcd02211SEric Fiselier    }
19517609c9b6SHoward Hinnant
19528b805c91SHoward Hinnant    template <class... _Args>
1953fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1954fcd02211SEric Fiselier        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1955fcd02211SEric Fiselier    }
1956fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
19573e519524SHoward Hinnant
19583e519524SHoward Hinnant
1959789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19603e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1961789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1962ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1963ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19643e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1965789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19663e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
19673e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1968789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19693714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
19703e519524SHoward Hinnant
1971b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1972b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1973b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1974b0386a51SErik Pilkington    {
1975b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1976b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1977b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
1978b0386a51SErik Pilkington            _VSTD::move(__nh));
1979b0386a51SErik Pilkington    }
1980b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1981b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1982b0386a51SErik Pilkington    {
1983b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1984b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1985b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
1986b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1987b0386a51SErik Pilkington    }
1988b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1989b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1990b0386a51SErik Pilkington    {
1991b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1992b0386a51SErik Pilkington    }
1993b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1994b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1995b0386a51SErik Pilkington    {
1996b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1997b0386a51SErik Pilkington            __it.__i_);
1998b0386a51SErik Pilkington    }
19995c4e07aeSErik Pilkington
20005c4e07aeSErik Pilkington    template <class _H2, class _P2>
20015c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20025c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
20035c4e07aeSErik Pilkington    {
20045c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20055c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20065c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
20075c4e07aeSErik Pilkington    }
20085c4e07aeSErik Pilkington    template <class _H2, class _P2>
20095c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20105c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
20115c4e07aeSErik Pilkington    {
20125c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20135c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20145c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
20155c4e07aeSErik Pilkington    }
20165c4e07aeSErik Pilkington    template <class _H2, class _P2>
20175c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20185c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
20195c4e07aeSErik Pilkington    {
20205c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20215c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20225c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
20235c4e07aeSErik Pilkington    }
20245c4e07aeSErik Pilkington    template <class _H2, class _P2>
20255c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20265c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
20275c4e07aeSErik Pilkington    {
20285c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20295c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20305c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
20315c4e07aeSErik Pilkington    }
2032b0386a51SErik Pilkington#endif
2033b0386a51SErik Pilkington
2034789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20353714107eSHoward Hinnant    void swap(unordered_multimap& __u)
20363714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
20373714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
20383e519524SHoward Hinnant
2039789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20403e519524SHoward Hinnant    hasher hash_function() const
20413e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
2042789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20433e519524SHoward Hinnant    key_equal key_eq() const
20443e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
20453e519524SHoward Hinnant
2046789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20473e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
2048789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20493e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
2050789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20513e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
2052789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20533e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
20543e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
2055789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20563e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
20573e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
20583e519524SHoward Hinnant
2059789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20603714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
2061789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20623714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
20633714107eSHoward Hinnant        {return __table_.max_bucket_count();}
20643e519524SHoward Hinnant
2065789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20663e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
20673e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
2068789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20693e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
20703e519524SHoward Hinnant
2071789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20723e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
2073789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20743e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
2075789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20763e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
2077789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20783e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
2079789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20803e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
2081789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20823e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
20833e519524SHoward Hinnant
2084789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20853714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
2086789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20873714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
2088789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20893e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
2090789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20913e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
2092789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20933e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
20943e519524SHoward Hinnant
2095b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2096b24c8024SHoward Hinnant
2097b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
2098b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
2099b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
2100b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
2101b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
2102b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2103b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2104b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2105b24c8024SHoward Hinnant
2106b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2107b24c8024SHoward Hinnant
2108fcd02211SEric Fiselier
21093e519524SHoward Hinnant};
21103e519524SHoward Hinnant
2111*dfcd4384SLouis Dionne#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2112*dfcd4384SLouis Dionnetemplate<class _InputIterator,
2113*dfcd4384SLouis Dionne         class _Hash = hash<__iter_key_type<_InputIterator>>,
2114*dfcd4384SLouis Dionne         class _Pred = equal_to<__iter_key_type<_InputIterator>>,
2115*dfcd4384SLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
2116*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
2117*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
2118*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Pred>::value>,
2119*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2120*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0,
2121*dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2122*dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>;
2123*dfcd4384SLouis Dionne
2124*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>,
2125*dfcd4384SLouis Dionne         class _Pred = equal_to<remove_const_t<_Key>>,
2126*dfcd4384SLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
2127*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
2128*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
2129*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Pred>::value>,
2130*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2131*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0,
2132*dfcd4384SLouis Dionne                   _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
2133*dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>;
2134*dfcd4384SLouis Dionne
2135*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
2136*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2137*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator)
2138*dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2139*dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2140*dfcd4384SLouis Dionne
2141*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator,
2142*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2143*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator)
2144*dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2145*dfcd4384SLouis Dionne                        hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2146*dfcd4384SLouis Dionne
2147*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator,
2148*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
2149*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
2150*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2151*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2152*dfcd4384SLouis Dionne  -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2153*dfcd4384SLouis Dionne                        _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>;
2154*dfcd4384SLouis Dionne
2155*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
2156*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2157*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator)
2158*dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2159*dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2160*dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2161*dfcd4384SLouis Dionne
2162*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
2163*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2164*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2165*dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp,
2166*dfcd4384SLouis Dionne                        hash<remove_const_t<_Key>>,
2167*dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2168*dfcd4384SLouis Dionne
2169*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator,
2170*dfcd4384SLouis Dionne         class = _EnableIf<!__is_allocator<_Hash>::value>,
2171*dfcd4384SLouis Dionne         class = _EnableIf<!is_integral<_Hash>::value>,
2172*dfcd4384SLouis Dionne         class = _EnableIf<__is_allocator<_Allocator>::value>>
2173*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator)
2174*dfcd4384SLouis Dionne  -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash,
2175*dfcd4384SLouis Dionne                        equal_to<remove_const_t<_Key>>, _Allocator>;
2176*dfcd4384SLouis Dionne#endif
2177*dfcd4384SLouis Dionne
21783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21803e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
21813e519524SHoward Hinnant    : __table_(__hf, __eql)
21823e519524SHoward Hinnant{
2183b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2184b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2185b24c8024SHoward Hinnant#endif
21863e519524SHoward Hinnant    __table_.rehash(__n);
21873e519524SHoward Hinnant}
21883e519524SHoward Hinnant
21893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21903e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21913e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
21923e519524SHoward Hinnant        const allocator_type& __a)
21932a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
21943e519524SHoward Hinnant{
2195b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2196b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2197b24c8024SHoward Hinnant#endif
21983e519524SHoward Hinnant    __table_.rehash(__n);
21993e519524SHoward Hinnant}
22003e519524SHoward Hinnant
22013e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22023e519524SHoward Hinnanttemplate <class _InputIterator>
22033e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22043e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
22053e519524SHoward Hinnant{
2206b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2207b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2208b24c8024SHoward Hinnant#endif
22093e519524SHoward Hinnant    insert(__first, __last);
22103e519524SHoward Hinnant}
22113e519524SHoward Hinnant
22123e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22133e519524SHoward Hinnanttemplate <class _InputIterator>
22143e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22153e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
22163e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
22173e519524SHoward Hinnant    : __table_(__hf, __eql)
22183e519524SHoward Hinnant{
2219b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2220b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2221b24c8024SHoward Hinnant#endif
22223e519524SHoward Hinnant    __table_.rehash(__n);
22233e519524SHoward Hinnant    insert(__first, __last);
22243e519524SHoward Hinnant}
22253e519524SHoward Hinnant
22263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22273e519524SHoward Hinnanttemplate <class _InputIterator>
22283e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22293e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
22303e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
22312a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
22323e519524SHoward Hinnant{
2233b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2234b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2235b24c8024SHoward Hinnant#endif
22363e519524SHoward Hinnant    __table_.rehash(__n);
22373e519524SHoward Hinnant    insert(__first, __last);
22383e519524SHoward Hinnant}
22393e519524SHoward Hinnant
22403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2241cd31b434SEvgeniy Stepanovinline
22423e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22433e519524SHoward Hinnant        const allocator_type& __a)
22442a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
22453e519524SHoward Hinnant{
2246b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2247b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2248b24c8024SHoward Hinnant#endif
22493e519524SHoward Hinnant}
22503e519524SHoward Hinnant
22513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22523e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22533e519524SHoward Hinnant        const unordered_multimap& __u)
22543e519524SHoward Hinnant    : __table_(__u.__table_)
22553e519524SHoward Hinnant{
2256b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2257b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2258b24c8024SHoward Hinnant#endif
22593e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
22603e519524SHoward Hinnant    insert(__u.begin(), __u.end());
22613e519524SHoward Hinnant}
22623e519524SHoward Hinnant
22633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22643e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22653e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
22662a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
22673e519524SHoward Hinnant{
2268b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2269b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2270b24c8024SHoward Hinnant#endif
22713e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
22723e519524SHoward Hinnant    insert(__u.begin(), __u.end());
22733e519524SHoward Hinnant}
22743e519524SHoward Hinnant
22756a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
22763e519524SHoward Hinnant
22773e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2278cd31b434SEvgeniy Stepanovinline
22793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22803e519524SHoward Hinnant        unordered_multimap&& __u)
22813714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2282ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
22833e519524SHoward Hinnant{
2284b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2285b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
22864c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
2287b24c8024SHoward Hinnant#endif
22883e519524SHoward Hinnant}
22893e519524SHoward Hinnant
22903e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22913e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
22923e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
22932a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
22943e519524SHoward Hinnant{
2295b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2296b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2297b24c8024SHoward Hinnant#endif
22983e519524SHoward Hinnant    if (__a != __u.get_allocator())
22993e519524SHoward Hinnant    {
23003e519524SHoward Hinnant        iterator __i = __u.begin();
23013e519524SHoward Hinnant        while (__u.size() != 0)
23023e519524SHoward Hinnant        {
23033e519524SHoward Hinnant            __table_.__insert_multi(
2304f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
23053e519524SHoward Hinnant        }
23063e519524SHoward Hinnant    }
23074c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
23084c80bfbdSHoward Hinnant    else
23094c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
23104c80bfbdSHoward Hinnant#endif
23113e519524SHoward Hinnant}
23123e519524SHoward Hinnant
23133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23143e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23153e519524SHoward Hinnant        initializer_list<value_type> __il)
23163e519524SHoward Hinnant{
2317b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2318b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2319b24c8024SHoward Hinnant#endif
23203e519524SHoward Hinnant    insert(__il.begin(), __il.end());
23213e519524SHoward Hinnant}
23223e519524SHoward Hinnant
23233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23243e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23253e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
23263e519524SHoward Hinnant        const key_equal& __eql)
23273e519524SHoward Hinnant    : __table_(__hf, __eql)
23283e519524SHoward Hinnant{
2329b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2330b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2331b24c8024SHoward Hinnant#endif
23323e519524SHoward Hinnant    __table_.rehash(__n);
23333e519524SHoward Hinnant    insert(__il.begin(), __il.end());
23343e519524SHoward Hinnant}
23353e519524SHoward Hinnant
23363e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23373e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
23383e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
23393e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
23402a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
23413e519524SHoward Hinnant{
2342b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2343b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2344b24c8024SHoward Hinnant#endif
23453e519524SHoward Hinnant    __table_.rehash(__n);
23463e519524SHoward Hinnant    insert(__il.begin(), __il.end());
23473e519524SHoward Hinnant}
23483e519524SHoward Hinnant
23493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2350cd31b434SEvgeniy Stepanovinline
23513e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
23523e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
23533714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
23543e519524SHoward Hinnant{
2355ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
23563e519524SHoward Hinnant    return *this;
23573e519524SHoward Hinnant}
23583e519524SHoward Hinnant
23593e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2360cd31b434SEvgeniy Stepanovinline
23613e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
23623e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
23633e519524SHoward Hinnant        initializer_list<value_type> __il)
23643e519524SHoward Hinnant{
23653e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
23663e519524SHoward Hinnant    return *this;
23673e519524SHoward Hinnant}
23683e519524SHoward Hinnant
23696a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
237054976f26SHoward Hinnant
23713e519524SHoward Hinnant
23723e519524SHoward Hinnant
23733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
23743e519524SHoward Hinnanttemplate <class _InputIterator>
2375cd31b434SEvgeniy Stepanovinline
23763e519524SHoward Hinnantvoid
23773e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
23783e519524SHoward Hinnant                                                            _InputIterator __last)
23793e519524SHoward Hinnant{
23803e519524SHoward Hinnant    for (; __first != __last; ++__first)
23813e519524SHoward Hinnant        __table_.__insert_multi(*__first);
23823e519524SHoward Hinnant}
23833e519524SHoward Hinnant
23843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2385789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
23863e519524SHoward Hinnantvoid
23873e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
23883e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
23893714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
23903e519524SHoward Hinnant{
23913e519524SHoward Hinnant    __x.swap(__y);
23923e519524SHoward Hinnant}
23933e519524SHoward Hinnant
2394f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
2395f60c63c0SMarshall Clowtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate>
2396f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
2397f60c63c0SMarshall Clowvoid erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred)
2398f60c63c0SMarshall Clow{ __libcpp_erase_if_container(__c, __pred); }
2399f60c63c0SMarshall Clow#endif
2400f60c63c0SMarshall Clow
24013e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
24023e519524SHoward Hinnantbool
24033e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
24043e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
24053e519524SHoward Hinnant{
24063e519524SHoward Hinnant    if (__x.size() != __y.size())
24073e519524SHoward Hinnant        return false;
24083e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
24093e519524SHoward Hinnant                                                                 const_iterator;
24103e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
24113e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
24123e519524SHoward Hinnant    {
24133e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
24143e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2415ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2416ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2417ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
24183e519524SHoward Hinnant            return false;
24193e519524SHoward Hinnant        __i = __xeq.second;
24203e519524SHoward Hinnant    }
24213e519524SHoward Hinnant    return true;
24223e519524SHoward Hinnant}
24233e519524SHoward Hinnant
24243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2425789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
24263e519524SHoward Hinnantbool
24273e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
24283e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
24293e519524SHoward Hinnant{
24303e519524SHoward Hinnant    return !(__x == __y);
24313e519524SHoward Hinnant}
24323e519524SHoward Hinnant
24333e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
24343e519524SHoward Hinnant
24353e519524SHoward Hinnant#endif  // _LIBCPP_UNORDERED_MAP
2436