13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===-------------------------- unordered_map -----------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_UNORDERED_MAP
123e519524SHoward Hinnant#define _LIBCPP_UNORDERED_MAP
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant
163e519524SHoward Hinnant    unordered_map synopsis
173e519524SHoward Hinnant
183e519524SHoward Hinnant#include <initializer_list>
193e519524SHoward Hinnant
203e519524SHoward Hinnantnamespace std
213e519524SHoward Hinnant{
223e519524SHoward Hinnant
233e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
243e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
253e519524SHoward Hinnantclass unordered_map
263e519524SHoward Hinnant{
273e519524SHoward Hinnantpublic:
283e519524SHoward Hinnant    // types
293e519524SHoward Hinnant    typedef Key                                                        key_type;
303e519524SHoward Hinnant    typedef T                                                          mapped_type;
313e519524SHoward Hinnant    typedef Hash                                                       hasher;
323e519524SHoward Hinnant    typedef Pred                                                       key_equal;
333e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
343e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
353e519524SHoward Hinnant    typedef value_type&                                                reference;
363e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
373e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
383e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
393e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
403e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
413e519524SHoward Hinnant
423e519524SHoward Hinnant    typedef /unspecified/ iterator;
433e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
443e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
453e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
463e519524SHoward Hinnant
473714107eSHoward Hinnant    unordered_map()
483714107eSHoward Hinnant        noexcept(
493714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
503714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
513714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
523714107eSHoward Hinnant    explicit unordered_map(size_type n, const hasher& hf = hasher(),
533e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
543e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
553e519524SHoward Hinnant    template <class InputIterator>
563e519524SHoward Hinnant        unordered_map(InputIterator f, InputIterator l,
573e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
583e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
593e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
603e519524SHoward Hinnant    explicit unordered_map(const allocator_type&);
613e519524SHoward Hinnant    unordered_map(const unordered_map&);
623e519524SHoward Hinnant    unordered_map(const unordered_map&, const Allocator&);
633714107eSHoward Hinnant    unordered_map(unordered_map&&)
643714107eSHoward Hinnant        noexcept(
653714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
663714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
673714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
683e519524SHoward Hinnant    unordered_map(unordered_map&&, const Allocator&);
693e519524SHoward Hinnant    unordered_map(initializer_list<value_type>, size_type n = 0,
703e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
713e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
723cd37e64SMarshall Clow    unordered_map(size_type n, const allocator_type& a)
733cd37e64SMarshall Clow      : unordered_map(n, hasher(), key_equal(), a) {}  // C++14
743cd37e64SMarshall Clow    unordered_map(size_type n, const hasher& hf, const allocator_type& a)
753cd37e64SMarshall Clow      : unordered_map(n, hf, key_equal(), a) {}  // C++14
763cd37e64SMarshall Clow    template <class InputIterator>
773cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
783cd37e64SMarshall Clow      : unordered_map(f, l, n, hasher(), key_equal(), a) {}  // C++14
793cd37e64SMarshall Clow    template <class InputIterator>
803cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
813cd37e64SMarshall Clow        const allocator_type& a)
823cd37e64SMarshall Clow      : unordered_map(f, l, n, hf, key_equal(), a) {}  // C++14
833cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
843cd37e64SMarshall Clow      : unordered_map(il, n, hasher(), key_equal(), a) {}  // C++14
853cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
863cd37e64SMarshall Clow      const allocator_type& a)
873cd37e64SMarshall Clow      : unordered_map(il, n, hf, key_equal(), a) {}  // C++14
883e519524SHoward Hinnant    ~unordered_map();
893e519524SHoward Hinnant    unordered_map& operator=(const unordered_map&);
903714107eSHoward Hinnant    unordered_map& operator=(unordered_map&&)
913714107eSHoward Hinnant        noexcept(
923714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
933714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
943714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
953714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
963e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type>);
973e519524SHoward Hinnant
983714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
993e519524SHoward Hinnant
1003714107eSHoward Hinnant    bool      empty() const noexcept;
1013714107eSHoward Hinnant    size_type size() const noexcept;
1023714107eSHoward Hinnant    size_type max_size() const noexcept;
1033e519524SHoward Hinnant
1043714107eSHoward Hinnant    iterator       begin() noexcept;
1053714107eSHoward Hinnant    iterator       end() noexcept;
1063714107eSHoward Hinnant    const_iterator begin()  const noexcept;
1073714107eSHoward Hinnant    const_iterator end()    const noexcept;
1083714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
1093714107eSHoward Hinnant    const_iterator cend()   const noexcept;
1103e519524SHoward Hinnant
1113e519524SHoward Hinnant    template <class... Args>
1123e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1133e519524SHoward Hinnant    template <class... Args>
1143e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1153e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& obj);
1163e519524SHoward Hinnant    template <class P>
1173e519524SHoward Hinnant        pair<iterator, bool> insert(P&& obj);
1183e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
1193e519524SHoward Hinnant    template <class P>
1203e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
1213e519524SHoward Hinnant    template <class InputIterator>
1223e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1233e519524SHoward Hinnant    void insert(initializer_list<value_type>);
1243e519524SHoward Hinnant
125bc4c89a9SMarshall Clow    template <class... Args>
126bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
127bc4c89a9SMarshall Clow    template <class... Args>
128bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
129bc4c89a9SMarshall Clow    template <class... Args>
130bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
131bc4c89a9SMarshall Clow    template <class... Args>
132bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
133bc4c89a9SMarshall Clow    template <class M>
134bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
135bc4c89a9SMarshall Clow    template <class M>
136bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
137bc4c89a9SMarshall Clow    template <class M>
138bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
139bc4c89a9SMarshall Clow    template <class M>
140bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
141bc4c89a9SMarshall Clow
1423e519524SHoward Hinnant    iterator erase(const_iterator position);
143ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
1443e519524SHoward Hinnant    size_type erase(const key_type& k);
1453e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
1463714107eSHoward Hinnant    void clear() noexcept;
1473e519524SHoward Hinnant
1483714107eSHoward Hinnant    void swap(unordered_map&)
1493714107eSHoward Hinnant        noexcept(
1503714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
1513714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
1523714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
1533714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
1543e519524SHoward Hinnant
1553e519524SHoward Hinnant    hasher hash_function() const;
1563e519524SHoward Hinnant    key_equal key_eq() const;
1573e519524SHoward Hinnant
1583e519524SHoward Hinnant    iterator       find(const key_type& k);
1593e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1603e519524SHoward Hinnant    size_type count(const key_type& k) const;
1613e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
1623e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
1633e519524SHoward Hinnant
1643e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1653e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1663e519524SHoward Hinnant
1673e519524SHoward Hinnant    mapped_type&       at(const key_type& k);
1683e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1693e519524SHoward Hinnant
1703714107eSHoward Hinnant    size_type bucket_count() const noexcept;
1713714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
1723e519524SHoward Hinnant
1733e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
1743e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
1753e519524SHoward Hinnant
1763e519524SHoward Hinnant    local_iterator       begin(size_type n);
1773e519524SHoward Hinnant    local_iterator       end(size_type n);
1783e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
1793e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
1803e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
1813e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
1823e519524SHoward Hinnant
1833714107eSHoward Hinnant    float load_factor() const noexcept;
1843714107eSHoward Hinnant    float max_load_factor() const noexcept;
1853e519524SHoward Hinnant    void max_load_factor(float z);
1863e519524SHoward Hinnant    void rehash(size_type n);
1873e519524SHoward Hinnant    void reserve(size_type n);
1883e519524SHoward Hinnant};
1893e519524SHoward Hinnant
1903e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
1913e519524SHoward Hinnant    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
1923714107eSHoward Hinnant              unordered_map<Key, T, Hash, Pred, Alloc>& y)
1933714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
1943e519524SHoward Hinnant
1953e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
1963e519524SHoward Hinnant    bool
1973e519524SHoward Hinnant    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
1983e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
1993e519524SHoward Hinnant
2003e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2013e519524SHoward Hinnant    bool
2023e519524SHoward Hinnant    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2033e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2043e519524SHoward Hinnant
2053e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
2063e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
2073e519524SHoward Hinnantclass unordered_multimap
2083e519524SHoward Hinnant{
2093e519524SHoward Hinnantpublic:
2103e519524SHoward Hinnant    // types
2113e519524SHoward Hinnant    typedef Key                                                        key_type;
2123e519524SHoward Hinnant    typedef T                                                          mapped_type;
2133e519524SHoward Hinnant    typedef Hash                                                       hasher;
2143e519524SHoward Hinnant    typedef Pred                                                       key_equal;
2153e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
2163e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
2173e519524SHoward Hinnant    typedef value_type&                                                reference;
2183e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2193e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
2203e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
2213e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
2223e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
2233e519524SHoward Hinnant
2243e519524SHoward Hinnant    typedef /unspecified/ iterator;
2253e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
2263e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
2273e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
2283e519524SHoward Hinnant
2293714107eSHoward Hinnant    unordered_multimap()
2303714107eSHoward Hinnant        noexcept(
2313714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
2323714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
2333714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
2343714107eSHoward Hinnant    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
2353e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
2363e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
2373e519524SHoward Hinnant    template <class InputIterator>
2383e519524SHoward Hinnant        unordered_multimap(InputIterator f, InputIterator l,
2393e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
2403e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
2413e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
2423e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type&);
2433e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&);
2443e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&, const Allocator&);
2453714107eSHoward Hinnant    unordered_multimap(unordered_multimap&&)
2463714107eSHoward Hinnant        noexcept(
2473714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
2483714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
2493714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
2503e519524SHoward Hinnant    unordered_multimap(unordered_multimap&&, const Allocator&);
2513e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type>, size_type n = 0,
2523e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
2533e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
2543cd37e64SMarshall Clow    unordered_multimap(size_type n, const allocator_type& a)
2553cd37e64SMarshall Clow      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
2563cd37e64SMarshall Clow    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
2573cd37e64SMarshall Clow      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
2583cd37e64SMarshall Clow    template <class InputIterator>
2593cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
2603cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
2613cd37e64SMarshall Clow    template <class InputIterator>
2623cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
2633cd37e64SMarshall Clow        const allocator_type& a)
2643cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
2653cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
2663cd37e64SMarshall Clow      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
2673cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
2683cd37e64SMarshall Clow      const allocator_type& a)
2693cd37e64SMarshall Clow      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
2703e519524SHoward Hinnant    ~unordered_multimap();
2713e519524SHoward Hinnant    unordered_multimap& operator=(const unordered_multimap&);
2723714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&&)
2733714107eSHoward Hinnant        noexcept(
2743714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
2753714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
2763714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
2773714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
2783e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type>);
2793e519524SHoward Hinnant
2803714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
2813e519524SHoward Hinnant
2823714107eSHoward Hinnant    bool      empty() const noexcept;
2833714107eSHoward Hinnant    size_type size() const noexcept;
2843714107eSHoward Hinnant    size_type max_size() const noexcept;
2853e519524SHoward Hinnant
2863714107eSHoward Hinnant    iterator       begin() noexcept;
2873714107eSHoward Hinnant    iterator       end() noexcept;
2883714107eSHoward Hinnant    const_iterator begin()  const noexcept;
2893714107eSHoward Hinnant    const_iterator end()    const noexcept;
2903714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
2913714107eSHoward Hinnant    const_iterator cend()   const noexcept;
2923e519524SHoward Hinnant
2933e519524SHoward Hinnant    template <class... Args>
2943e519524SHoward Hinnant        iterator emplace(Args&&... args);
2953e519524SHoward Hinnant    template <class... Args>
2963e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
2973e519524SHoward Hinnant    iterator insert(const value_type& obj);
2983e519524SHoward Hinnant    template <class P>
2993e519524SHoward Hinnant        iterator insert(P&& obj);
3003e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
3013e519524SHoward Hinnant    template <class P>
3023e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
3033e519524SHoward Hinnant    template <class InputIterator>
3043e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3053e519524SHoward Hinnant    void insert(initializer_list<value_type>);
3063e519524SHoward Hinnant
3073e519524SHoward Hinnant    iterator erase(const_iterator position);
308ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
3093e519524SHoward Hinnant    size_type erase(const key_type& k);
3103e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
3113714107eSHoward Hinnant    void clear() noexcept;
3123e519524SHoward Hinnant
3133714107eSHoward Hinnant    void swap(unordered_multimap&)
3143714107eSHoward Hinnant        noexcept(
3153714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3163714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
3173714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
3183714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
3193e519524SHoward Hinnant
3203e519524SHoward Hinnant    hasher hash_function() const;
3213e519524SHoward Hinnant    key_equal key_eq() const;
3223e519524SHoward Hinnant
3233e519524SHoward Hinnant    iterator       find(const key_type& k);
3243e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
3253e519524SHoward Hinnant    size_type count(const key_type& k) const;
3263e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
3273e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
3283e519524SHoward Hinnant
3293714107eSHoward Hinnant    size_type bucket_count() const noexcept;
3303714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
3313e519524SHoward Hinnant
3323e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
3333e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
3343e519524SHoward Hinnant
3353e519524SHoward Hinnant    local_iterator       begin(size_type n);
3363e519524SHoward Hinnant    local_iterator       end(size_type n);
3373e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
3383e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
3393e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
3403e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
3413e519524SHoward Hinnant
3423714107eSHoward Hinnant    float load_factor() const noexcept;
3433714107eSHoward Hinnant    float max_load_factor() const noexcept;
3443e519524SHoward Hinnant    void max_load_factor(float z);
3453e519524SHoward Hinnant    void rehash(size_type n);
3463e519524SHoward Hinnant    void reserve(size_type n);
3473e519524SHoward Hinnant};
3483e519524SHoward Hinnant
3493e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3503e519524SHoward Hinnant    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3513714107eSHoward Hinnant              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
3523714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
3533e519524SHoward Hinnant
3543e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3553e519524SHoward Hinnant    bool
3563e519524SHoward Hinnant    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3573e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
3583e519524SHoward Hinnant
3593e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3603e519524SHoward Hinnant    bool
3613e519524SHoward Hinnant    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3623e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
3633e519524SHoward Hinnant
3643e519524SHoward Hinnant}  // std
3653e519524SHoward Hinnant
3663e519524SHoward Hinnant*/
3673e519524SHoward Hinnant
3683e519524SHoward Hinnant#include <__config>
3693e519524SHoward Hinnant#include <__hash_table>
3703e519524SHoward Hinnant#include <functional>
3713e519524SHoward Hinnant#include <stdexcept>
3723e519524SHoward Hinnant
373c1bd9197SEric Fiselier#include <__debug>
374c1bd9197SEric Fiselier
375073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3763e519524SHoward Hinnant#pragma GCC system_header
377073458b1SHoward Hinnant#endif
3783e519524SHoward Hinnant
3793e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
3803e519524SHoward Hinnant
381ee187e24SEric Fiseliertemplate <class _Key, class _Cp, class _Hash,
382ee187e24SEric Fiselier          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
38342b8bb50SHoward Hinnant         >
3843e519524SHoward Hinnantclass __unordered_map_hasher
3853e519524SHoward Hinnant    : private _Hash
3863e519524SHoward Hinnant{
3873e519524SHoward Hinnantpublic:
388789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3893714107eSHoward Hinnant    __unordered_map_hasher()
3903714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
3913714107eSHoward Hinnant        : _Hash() {}
392789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3933714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
3943714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
3953714107eSHoward Hinnant        : _Hash(__h) {}
396789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3973714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
398789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
399a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
400abb160e6SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
401a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
402a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4033e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
404e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
405e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
406e3fbe143SMarshall Clow    {
407e3fbe143SMarshall Clow        using _VSTD::swap;
408e3fbe143SMarshall Clow        swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y));
409e3fbe143SMarshall Clow    }
4103e519524SHoward Hinnant};
4113e519524SHoward Hinnant
412abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Hash>
413abb160e6SHoward Hinnantclass __unordered_map_hasher<_Key, _Cp, _Hash, false>
4143e519524SHoward Hinnant{
4153e519524SHoward Hinnant    _Hash __hash_;
416a1a9e771SHoward Hinnant
4173e519524SHoward Hinnantpublic:
418789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4193714107eSHoward Hinnant    __unordered_map_hasher()
4203714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4213714107eSHoward Hinnant        : __hash_() {}
422789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4233714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4243714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4253714107eSHoward Hinnant        : __hash_(__h) {}
426789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4273714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
428789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
429a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
430abb160e6SHoward Hinnant        {return __hash_(__x.__cc.first);}
431a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
432a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4333e519524SHoward Hinnant        {return __hash_(__x);}
434e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
435e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
436e3fbe143SMarshall Clow    {
437e3fbe143SMarshall Clow        using _VSTD::swap;
438e3fbe143SMarshall Clow        swap(__hash_, __y.__hash_);
439e3fbe143SMarshall Clow    }
4403e519524SHoward Hinnant};
4413e519524SHoward Hinnant
442e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Hash, bool __b>
443e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
444e3fbe143SMarshall Clowvoid
445e3fbe143SMarshall Clowswap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
446e3fbe143SMarshall Clow     __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
447e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
448e3fbe143SMarshall Clow{
449e3fbe143SMarshall Clow    __x.swap(__y);
450e3fbe143SMarshall Clow}
451e3fbe143SMarshall Clow
452ee187e24SEric Fiseliertemplate <class _Key, class _Cp, class _Pred,
453ee187e24SEric Fiselier          bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value
45442b8bb50SHoward Hinnant         >
4553e519524SHoward Hinnantclass __unordered_map_equal
4563e519524SHoward Hinnant    : private _Pred
4573e519524SHoward Hinnant{
4583e519524SHoward Hinnantpublic:
459789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4603714107eSHoward Hinnant    __unordered_map_equal()
4613714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
4623714107eSHoward Hinnant        : _Pred() {}
463789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4643714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
4653714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
4663714107eSHoward Hinnant        : _Pred(__p) {}
467789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4683714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return *this;}
469789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
470a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
471abb160e6SHoward Hinnant        {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);}
472a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
473a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
474abb160e6SHoward Hinnant        {return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);}
475a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
476a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
477abb160e6SHoward Hinnant        {return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);}
478e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
479e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
480e3fbe143SMarshall Clow    {
481e3fbe143SMarshall Clow        using _VSTD::swap;
482e3fbe143SMarshall Clow        swap(static_cast<const _Pred&>(*this), static_cast<const _Pred&>(__y));
483e3fbe143SMarshall Clow    }
4843e519524SHoward Hinnant};
4853e519524SHoward Hinnant
486abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Pred>
487abb160e6SHoward Hinnantclass __unordered_map_equal<_Key, _Cp, _Pred, false>
4883e519524SHoward Hinnant{
4893e519524SHoward Hinnant    _Pred __pred_;
490a1a9e771SHoward Hinnant
4913e519524SHoward Hinnantpublic:
492789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4933714107eSHoward Hinnant    __unordered_map_equal()
4943714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
4953714107eSHoward Hinnant        : __pred_() {}
496789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4973714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
4983714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
4993714107eSHoward Hinnant        : __pred_(__p) {}
500789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5013714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
502789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
503a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
504abb160e6SHoward Hinnant        {return __pred_(__x.__cc.first, __y.__cc.first);}
505a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
506a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
507abb160e6SHoward Hinnant        {return __pred_(__x.__cc.first, __y);}
508a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
509a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
510abb160e6SHoward Hinnant        {return __pred_(__x, __y.__cc.first);}
511e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
512e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
513e3fbe143SMarshall Clow    {
514e3fbe143SMarshall Clow        using _VSTD::swap;
515e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
516e3fbe143SMarshall Clow    }
5173e519524SHoward Hinnant};
5183e519524SHoward Hinnant
519e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Pred, bool __b>
520e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
521e3fbe143SMarshall Clowvoid
522e3fbe143SMarshall Clowswap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
523e3fbe143SMarshall Clow     __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
524e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
525e3fbe143SMarshall Clow{
526e3fbe143SMarshall Clow    __x.swap(__y);
527e3fbe143SMarshall Clow}
528e3fbe143SMarshall Clow
5293e519524SHoward Hinnanttemplate <class _Alloc>
5303e519524SHoward Hinnantclass __hash_map_node_destructor
5313e519524SHoward Hinnant{
5323e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
5333e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
5343e519524SHoward Hinnant    typedef typename __alloc_traits::value_type::value_type value_type;
5353e519524SHoward Hinnantpublic:
5363e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
5373e519524SHoward Hinnantprivate:
538307f8143SHoward Hinnant    typedef typename value_type::value_type::first_type     first_type;
539307f8143SHoward Hinnant    typedef typename value_type::value_type::second_type    second_type;
5403e519524SHoward Hinnant
5413e519524SHoward Hinnant    allocator_type& __na_;
5423e519524SHoward Hinnant
5433e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
5443e519524SHoward Hinnant
5453e519524SHoward Hinnantpublic:
5463e519524SHoward Hinnant    bool __first_constructed;
5473e519524SHoward Hinnant    bool __second_constructed;
5483e519524SHoward Hinnant
549789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5503714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
5513e519524SHoward Hinnant        : __na_(__na),
5523e519524SHoward Hinnant          __first_constructed(false),
5533e519524SHoward Hinnant          __second_constructed(false)
5543e519524SHoward Hinnant        {}
5553e519524SHoward Hinnant
5567609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
557789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5583e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
5593714107eSHoward Hinnant        _NOEXCEPT
5603e519524SHoward Hinnant        : __na_(__x.__na_),
5613e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5623e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5633e519524SHoward Hinnant        {
5643e519524SHoward Hinnant            __x.__value_constructed = false;
5653e519524SHoward Hinnant        }
5667609c9b6SHoward Hinnant#else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
567789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5683e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
5693e519524SHoward Hinnant        : __na_(__x.__na_),
5703e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5713e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5723e519524SHoward Hinnant        {
5733e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
5743e519524SHoward Hinnant        }
5757609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5763e519524SHoward Hinnant
577789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5783714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
5793e519524SHoward Hinnant    {
5803e519524SHoward Hinnant        if (__second_constructed)
581307f8143SHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
5823e519524SHoward Hinnant        if (__first_constructed)
583307f8143SHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
5843e519524SHoward Hinnant        if (__p)
5853e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
5863e519524SHoward Hinnant    }
5873e519524SHoward Hinnant};
5883e519524SHoward Hinnant
5899fd9f84fSHoward Hinnant#if __cplusplus >= 201103L
5909fd9f84fSHoward Hinnant
5919fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
5929fd9f84fSHoward Hinnantunion __hash_value_type
5939fd9f84fSHoward Hinnant{
5949fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
5959fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
5969fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
5979fd9f84fSHoward Hinnant    typedef pair<key_type, mapped_type>              __nc_value_type;
5989fd9f84fSHoward Hinnant
5999fd9f84fSHoward Hinnant    value_type __cc;
6009fd9f84fSHoward Hinnant    __nc_value_type __nc;
6019fd9f84fSHoward Hinnant
6029fd9f84fSHoward Hinnant    template <class ..._Args>
6039fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6049fd9f84fSHoward Hinnant    __hash_value_type(_Args&& ...__args)
6059fd9f84fSHoward Hinnant        : __cc(std::forward<_Args>(__args)...) {}
6069fd9f84fSHoward Hinnant
6079fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6089fd9f84fSHoward Hinnant    __hash_value_type(const __hash_value_type& __v)
6099fd9f84fSHoward Hinnant        : __cc(__v.__cc) {}
6109fd9f84fSHoward Hinnant
6119fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6129fd9f84fSHoward Hinnant    __hash_value_type(__hash_value_type&& __v)
61327647994SMarshall Clow        : __nc(_VSTD::move(__v.__nc)) {}
6149fd9f84fSHoward Hinnant
6159fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6169fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
6179fd9f84fSHoward Hinnant        {__nc = __v.__cc; return *this;}
6189fd9f84fSHoward Hinnant
6199fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6209fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
62127647994SMarshall Clow        {__nc = _VSTD::move(__v.__nc); return *this;}
6229fd9f84fSHoward Hinnant
6239fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6249fd9f84fSHoward Hinnant    ~__hash_value_type() {__cc.~value_type();}
6259fd9f84fSHoward Hinnant};
6269fd9f84fSHoward Hinnant
6279fd9f84fSHoward Hinnant#else
6289fd9f84fSHoward Hinnant
6299fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
6309fd9f84fSHoward Hinnantstruct __hash_value_type
6319fd9f84fSHoward Hinnant{
6329fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6339fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6349fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
6359fd9f84fSHoward Hinnant
6369fd9f84fSHoward Hinnant    value_type __cc;
6379fd9f84fSHoward Hinnant
6389fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6399fd9f84fSHoward Hinnant    __hash_value_type() {}
6409fd9f84fSHoward Hinnant
6419fd9f84fSHoward Hinnant    template <class _A0>
6429fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6439fd9f84fSHoward Hinnant    __hash_value_type(const _A0& __a0)
6449fd9f84fSHoward Hinnant        : __cc(__a0) {}
6459fd9f84fSHoward Hinnant
6469fd9f84fSHoward Hinnant    template <class _A0, class _A1>
6479fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6489fd9f84fSHoward Hinnant    __hash_value_type(const _A0& __a0, const _A1& __a1)
6499fd9f84fSHoward Hinnant        : __cc(__a0, __a1) {}
6509fd9f84fSHoward Hinnant};
6519fd9f84fSHoward Hinnant
6529fd9f84fSHoward Hinnant#endif
6539fd9f84fSHoward Hinnant
6543e519524SHoward Hinnanttemplate <class _HashIterator>
655f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
6563e519524SHoward Hinnant{
6573e519524SHoward Hinnant    _HashIterator __i_;
6583e519524SHoward Hinnant
659307f8143SHoward Hinnant    typedef const typename _HashIterator::value_type::value_type::first_type key_type;
660307f8143SHoward Hinnant    typedef typename _HashIterator::value_type::value_type::second_type      mapped_type;
6613e519524SHoward Hinnantpublic:
6623e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
6633e519524SHoward Hinnant    typedef pair<key_type, mapped_type>                          value_type;
6643e519524SHoward Hinnant    typedef typename _HashIterator::difference_type              difference_type;
6653e519524SHoward Hinnant    typedef value_type&                                          reference;
666934b0921SEric Fiselier    typedef typename __rebind_pointer<typename _HashIterator::pointer, value_type>::type
6673e519524SHoward Hinnant        pointer;
6683e519524SHoward Hinnant
669789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6703714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
6713e519524SHoward Hinnant
672789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6733714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
6743e519524SHoward Hinnant
675789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
676307f8143SHoward Hinnant    reference operator*() const {return __i_->__cc;}
677789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
678307f8143SHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
6793e519524SHoward Hinnant
680789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6813e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
682789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6833e519524SHoward Hinnant    __hash_map_iterator operator++(int)
6843e519524SHoward Hinnant    {
6853e519524SHoward Hinnant        __hash_map_iterator __t(*this);
6863e519524SHoward Hinnant        ++(*this);
6873e519524SHoward Hinnant        return __t;
6883e519524SHoward Hinnant    }
6893e519524SHoward Hinnant
690789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
691789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
6923e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
693789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
694789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
6953e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
6963e519524SHoward Hinnant
697f0544c20SHoward Hinnant    template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
698f0544c20SHoward Hinnant    template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
699f0544c20SHoward Hinnant    template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
700f0544c20SHoward Hinnant    template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
701f0544c20SHoward Hinnant    template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
7023e519524SHoward Hinnant};
7033e519524SHoward Hinnant
7043e519524SHoward Hinnanttemplate <class _HashIterator>
705f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
7063e519524SHoward Hinnant{
7073e519524SHoward Hinnant    _HashIterator __i_;
7083e519524SHoward Hinnant
709307f8143SHoward Hinnant    typedef const typename _HashIterator::value_type::value_type::first_type key_type;
710307f8143SHoward Hinnant    typedef typename _HashIterator::value_type::value_type::second_type      mapped_type;
7113e519524SHoward Hinnantpublic:
7123e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
7133e519524SHoward Hinnant    typedef pair<key_type, mapped_type>                          value_type;
7143e519524SHoward Hinnant    typedef typename _HashIterator::difference_type              difference_type;
7153e519524SHoward Hinnant    typedef const value_type&                                    reference;
716934b0921SEric Fiselier    typedef typename __rebind_pointer<typename _HashIterator::pointer, const value_type>::type
7173e519524SHoward Hinnant        pointer;
7183e519524SHoward Hinnant
719789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7203714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
7213e519524SHoward Hinnant
722789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7233714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
724789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7253e519524SHoward Hinnant    __hash_map_const_iterator(
7263e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
7273714107eSHoward Hinnant                 _NOEXCEPT
7283e519524SHoward Hinnant                : __i_(__i.__i_) {}
7293e519524SHoward Hinnant
730789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
731307f8143SHoward Hinnant    reference operator*() const {return __i_->__cc;}
732789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
733307f8143SHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
7343e519524SHoward Hinnant
735789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7363e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
737789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7383e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
7393e519524SHoward Hinnant    {
7403e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
7413e519524SHoward Hinnant        ++(*this);
7423e519524SHoward Hinnant        return __t;
7433e519524SHoward Hinnant    }
7443e519524SHoward Hinnant
745789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
746789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
7473e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
748789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
749789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
7503e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7513e519524SHoward Hinnant
752f0544c20SHoward Hinnant    template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_map;
753f0544c20SHoward Hinnant    template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap;
754f0544c20SHoward Hinnant    template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
755f0544c20SHoward Hinnant    template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
7563e519524SHoward Hinnant};
7573e519524SHoward Hinnant
7583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
7593e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
760f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY unordered_map
7613e519524SHoward Hinnant{
7623e519524SHoward Hinnantpublic:
7633e519524SHoward Hinnant    // types
7643e519524SHoward Hinnant    typedef _Key                                           key_type;
7653e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
7663e519524SHoward Hinnant    typedef _Hash                                          hasher;
7673e519524SHoward Hinnant    typedef _Pred                                          key_equal;
7683e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
7693e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
770307f8143SHoward Hinnant    typedef pair<key_type, mapped_type>                    __nc_value_type;
7713e519524SHoward Hinnant    typedef value_type&                                    reference;
7723e519524SHoward Hinnant    typedef const value_type&                              const_reference;
773b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
774b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
7753e519524SHoward Hinnant
7763e519524SHoward Hinnantprivate:
7779fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
778abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
779abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
7801f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
7811f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
7823e519524SHoward Hinnant
7833e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
7843e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
7853e519524SHoward Hinnant
7863e519524SHoward Hinnant    __table __table_;
7873e519524SHoward Hinnant
7883e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
7893e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
7903e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
7913e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
7923e519524SHoward Hinnant    typedef typename __table::__node                       __node;
793c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
794c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
7953e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
7963e519524SHoward Hinnantpublic:
7973e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
7983e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
7993e519524SHoward Hinnant    typedef typename __alloc_traits::size_type       size_type;
8003e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type difference_type;
8013e519524SHoward Hinnant
8023e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
8033e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
8043e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
8053e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
8063e519524SHoward Hinnant
807789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8083714107eSHoward Hinnant    unordered_map()
8093714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
810b24c8024SHoward Hinnant        {
811b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
812b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
813b24c8024SHoward Hinnant#endif
814b24c8024SHoward Hinnant        }
8153e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
8163e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
8173e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
8183e519524SHoward Hinnant                  const key_equal& __eql,
8193e519524SHoward Hinnant                  const allocator_type& __a);
8203e519524SHoward Hinnant    template <class _InputIterator>
8213e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
8223e519524SHoward Hinnant    template <class _InputIterator>
8233e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
8243e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
8253e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
8263e519524SHoward Hinnant    template <class _InputIterator>
8273e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
8283e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
8293e519524SHoward Hinnant                      const key_equal& __eql,
8303e519524SHoward Hinnant                      const allocator_type& __a);
8313e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
8323e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
8333e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
8347609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
8353714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
8363714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
8373e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
8387609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
83954976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8403e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
8413e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
8423e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
8433e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
8443e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
8453e519524SHoward Hinnant                  const allocator_type& __a);
84654976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8473cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
8483cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8493cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
8503cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
8513cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8523cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
8533cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
8543cd37e64SMarshall Clow    template <class _InputIterator>
8553cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8563cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
8573cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
8583cd37e64SMarshall Clow    template <class _InputIterator>
8593cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8603cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
8613cd37e64SMarshall Clow        const allocator_type& __a)
8623cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
8633cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8643cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
8653cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
8663cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8673cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
8683cd37e64SMarshall Clow      const allocator_type& __a)
8693cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
8703cd37e64SMarshall Clow#endif
8713e519524SHoward Hinnant    // ~unordered_map() = default;
8725a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8735a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
8745a33687dSHoward Hinnant    {
875307f8143SHoward Hinnant#if __cplusplus >= 201103L
8765a33687dSHoward Hinnant        __table_ = __u.__table_;
877307f8143SHoward Hinnant#else
87874cf6ff5SMarshall Clow        if (this != &__u) {
879307f8143SHoward Hinnant            __table_.clear();
880307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
881307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
882307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
883307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
884307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
88574cf6ff5SMarshall Clow        }
886307f8143SHoward Hinnant#endif
8875a33687dSHoward Hinnant        return *this;
8885a33687dSHoward Hinnant    }
8897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
8903714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
8913714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
8923e519524SHoward Hinnant#endif
89354976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8943e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
89554976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8963e519524SHoward Hinnant
897789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8983714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
8993e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
9003e519524SHoward Hinnant
901789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9023714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
903789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9043714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
905789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9063714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
9073e519524SHoward Hinnant
908789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9093714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
910789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9113714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
912789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9133714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
914789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9153714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
916789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9173714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
918789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9193714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
9203e519524SHoward Hinnant
9217609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
9227609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
9237609c9b6SHoward Hinnant
9248b805c91SHoward Hinnant    template <class... _Args>
925*ad783ce9SDuncan P. N. Exon Smith        pair<iterator, bool> emplace(_Args&&... __args);
9263e519524SHoward Hinnant
9278b805c91SHoward Hinnant    template <class... _Args>
928789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9294c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
9304c80bfbdSHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
9314c80bfbdSHoward Hinnant        {
9324c80bfbdSHoward Hinnant            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9334c80bfbdSHoward Hinnant                "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
9344c80bfbdSHoward Hinnant                " referring to this unordered_map");
935*ad783ce9SDuncan P. N. Exon Smith            return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
9364c80bfbdSHoward Hinnant        }
9374c80bfbdSHoward Hinnant#else
9388b805c91SHoward Hinnant        iterator emplace_hint(const_iterator, _Args&&... __args)
9398b805c91SHoward Hinnant            {return emplace(_VSTD::forward<_Args>(__args)...).first;}
9404c80bfbdSHoward Hinnant#endif
9417609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
9427609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
943789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9443e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& __x)
9453e519524SHoward Hinnant        {return __table_.__insert_unique(__x);}
9467609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
947c003db1fSHoward Hinnant    template <class _Pp,
948c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
949789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
950c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __x)
951c003db1fSHoward Hinnant            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
9527609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
953789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9544c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
9554c80bfbdSHoward Hinnant    iterator insert(const_iterator __p, const value_type& __x)
9564c80bfbdSHoward Hinnant        {
9574c80bfbdSHoward Hinnant            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9584c80bfbdSHoward Hinnant                "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
9594c80bfbdSHoward Hinnant                " referring to this unordered_map");
9604c80bfbdSHoward Hinnant            return insert(__x).first;
9614c80bfbdSHoward Hinnant        }
9624c80bfbdSHoward Hinnant#else
9633e519524SHoward Hinnant    iterator insert(const_iterator, const value_type& __x)
9643e519524SHoward Hinnant        {return insert(__x).first;}
9654c80bfbdSHoward Hinnant#endif
9667609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
967c003db1fSHoward Hinnant    template <class _Pp,
968c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
969789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9704c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
9714c80bfbdSHoward Hinnant        iterator insert(const_iterator __p, _Pp&& __x)
9724c80bfbdSHoward Hinnant        {
9734c80bfbdSHoward Hinnant            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9744c80bfbdSHoward Hinnant                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
9754c80bfbdSHoward Hinnant                " referring to this unordered_map");
9764c80bfbdSHoward Hinnant            return insert(_VSTD::forward<_Pp>(__x)).first;
9774c80bfbdSHoward Hinnant        }
9784c80bfbdSHoward Hinnant#else
979c003db1fSHoward Hinnant        iterator insert(const_iterator, _Pp&& __x)
980c003db1fSHoward Hinnant            {return insert(_VSTD::forward<_Pp>(__x)).first;}
9814c80bfbdSHoward Hinnant#endif
9827609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
9833e519524SHoward Hinnant    template <class _InputIterator>
9843e519524SHoward Hinnant        void insert(_InputIterator __first, _InputIterator __last);
98554976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
986789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9873e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
9883e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
98954976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
9903e519524SHoward Hinnant
991bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
992bc4c89a9SMarshall Clow#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
993bc4c89a9SMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS
994bc4c89a9SMarshall Clow    template <class... _Args>
995bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
996bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
997bc4c89a9SMarshall Clow    {
998bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
999bc4c89a9SMarshall Clow        if ( __p != end())
1000bc4c89a9SMarshall Clow            return _VSTD::make_pair(__p, false);
1001bc4c89a9SMarshall Clow        else
1002bc4c89a9SMarshall Clow            return _VSTD::make_pair(
1003bc4c89a9SMarshall Clow                      emplace_hint(__p,
1004bc4c89a9SMarshall Clow                        _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
1005bc4c89a9SMarshall Clow                        _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
1006bc4c89a9SMarshall Clow                      true);
1007bc4c89a9SMarshall Clow    }
1008bc4c89a9SMarshall Clow
1009bc4c89a9SMarshall Clow    template <class... _Args>
1010bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1011bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1012bc4c89a9SMarshall Clow    {
1013bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1014bc4c89a9SMarshall Clow        if ( __p != end())
1015bc4c89a9SMarshall Clow            return _VSTD::make_pair(__p, false);
1016bc4c89a9SMarshall Clow        else
1017bc4c89a9SMarshall Clow            return _VSTD::make_pair(
1018bc4c89a9SMarshall Clow                      emplace_hint(__p,
1019bc4c89a9SMarshall Clow                        _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1020bc4c89a9SMarshall Clow                        _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
1021bc4c89a9SMarshall Clow                      true);
1022bc4c89a9SMarshall Clow    }
1023bc4c89a9SMarshall Clow
1024bc4c89a9SMarshall Clow    template <class... _Args>
1025bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1026bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1027bc4c89a9SMarshall Clow    {
1028bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1029bc4c89a9SMarshall Clow        if ( __p != end())
1030bc4c89a9SMarshall Clow            return __p;
1031bc4c89a9SMarshall Clow        else
1032bc4c89a9SMarshall Clow            return emplace_hint(__h,
1033bc4c89a9SMarshall Clow                      _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
1034bc4c89a9SMarshall Clow                      _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1035bc4c89a9SMarshall Clow    }
1036bc4c89a9SMarshall Clow
1037bc4c89a9SMarshall Clow    template <class... _Args>
1038bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1039bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1040bc4c89a9SMarshall Clow    {
1041bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1042bc4c89a9SMarshall Clow        if ( __p != end())
1043bc4c89a9SMarshall Clow            return __p;
1044bc4c89a9SMarshall Clow        else
1045bc4c89a9SMarshall Clow            return emplace_hint(__h,
1046bc4c89a9SMarshall Clow                      _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
1047bc4c89a9SMarshall Clow                      _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1048bc4c89a9SMarshall Clow    }
1049bc4c89a9SMarshall Clow
1050bc4c89a9SMarshall Clow    template <class _Vp>
1051bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1052bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1053bc4c89a9SMarshall Clow    {
1054bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1055bc4c89a9SMarshall Clow        if ( __p != end())
1056bc4c89a9SMarshall Clow        {
1057bc4c89a9SMarshall Clow            __p->second = _VSTD::move(__v);
1058bc4c89a9SMarshall Clow            return _VSTD::make_pair(__p, false);
1059bc4c89a9SMarshall Clow        }
1060bc4c89a9SMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1061bc4c89a9SMarshall Clow    }
1062bc4c89a9SMarshall Clow
1063bc4c89a9SMarshall Clow    template <class _Vp>
1064bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1065bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1066bc4c89a9SMarshall Clow    {
1067bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1068bc4c89a9SMarshall Clow        if ( __p != end())
1069bc4c89a9SMarshall Clow        {
1070bc4c89a9SMarshall Clow            __p->second = _VSTD::move(__v);
1071bc4c89a9SMarshall Clow            return _VSTD::make_pair(__p, false);
1072bc4c89a9SMarshall Clow        }
1073bc4c89a9SMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v)), true);
1074bc4c89a9SMarshall Clow    }
1075bc4c89a9SMarshall Clow
1076bc4c89a9SMarshall Clow    template <class _Vp>
1077bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1078bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1079bc4c89a9SMarshall Clow     {
1080bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1081bc4c89a9SMarshall Clow        if ( __p != end())
1082bc4c89a9SMarshall Clow        {
1083bc4c89a9SMarshall Clow            __p->second = _VSTD::move(__v);
1084bc4c89a9SMarshall Clow            return __p;
1085bc4c89a9SMarshall Clow        }
1086bc4c89a9SMarshall Clow        return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1087bc4c89a9SMarshall Clow     }
1088bc4c89a9SMarshall Clow
1089bc4c89a9SMarshall Clow    template <class _Vp>
1090bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1091bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1092bc4c89a9SMarshall Clow     {
1093bc4c89a9SMarshall Clow        iterator __p = __table_.find(__k);
1094bc4c89a9SMarshall Clow        if ( __p != end())
1095bc4c89a9SMarshall Clow        {
1096bc4c89a9SMarshall Clow            __p->second = _VSTD::move(__v);
1097bc4c89a9SMarshall Clow            return __p;
1098bc4c89a9SMarshall Clow        }
1099bc4c89a9SMarshall Clow        return emplace_hint(__h, _VSTD::forward<key_type>(__k), _VSTD::forward<_Vp>(__v));
1100bc4c89a9SMarshall Clow     }
1101bc4c89a9SMarshall Clow#endif
1102bc4c89a9SMarshall Clow#endif
1103bc4c89a9SMarshall Clow#endif
1104bc4c89a9SMarshall Clow
1105789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11063e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1107789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1108ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1109ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11103e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1111789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11123e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
11133e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1114789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11153714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
11163e519524SHoward Hinnant
1117789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11183714107eSHoward Hinnant    void swap(unordered_map& __u)
11193714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
11203714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
11213e519524SHoward Hinnant
1122789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11233e519524SHoward Hinnant    hasher hash_function() const
11243e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1125789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11263e519524SHoward Hinnant    key_equal key_eq() const
11273e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
11283e519524SHoward Hinnant
1129789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11303e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1131789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11323e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1133789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11343e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1135789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11363e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
11373e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1138789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11393e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
11403e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
11413e519524SHoward Hinnant
11423e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
11437609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
11443e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
11453e519524SHoward Hinnant#endif
11463e519524SHoward Hinnant
11473e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
11483e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
11493e519524SHoward Hinnant
1150789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11513714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1152789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11533714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
11543e519524SHoward Hinnant
1155789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11563e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
11573e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1158789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11593e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
11603e519524SHoward Hinnant
1161789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11623e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1163789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11643e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1165789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11663e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1167789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11683e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1169789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11703e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1171789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11723e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
11733e519524SHoward Hinnant
1174789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11753714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1176789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11773714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1178789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11793e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1180789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11813e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1182789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11833e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
11843e519524SHoward Hinnant
1185b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1186b24c8024SHoward Hinnant
1187b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1188b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1189b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1190b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1191b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1192b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1193b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1194b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1195b24c8024SHoward Hinnant
1196b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1197b24c8024SHoward Hinnant
11983e519524SHoward Hinnantprivate:
11997609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
12008b805c91SHoward Hinnant    __node_holder __construct_node();
12018b805c91SHoward Hinnant    template <class _A0>
12028b805c91SHoward Hinnant        __node_holder
12038b805c91SHoward Hinnant         __construct_node(_A0&& __a0);
12044a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(key_type&& __k);
12057609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
12068b805c91SHoward Hinnant    template <class _A0, class _A1, class ..._Args>
12078b805c91SHoward Hinnant        __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
12087609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
12094a95f9ebSHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
12104a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
12113e519524SHoward Hinnant};
12123e519524SHoward Hinnant
12133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12143e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12153e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
12163e519524SHoward Hinnant    : __table_(__hf, __eql)
12173e519524SHoward Hinnant{
1218b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1219b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1220b24c8024SHoward Hinnant#endif
12213e519524SHoward Hinnant    __table_.rehash(__n);
12223e519524SHoward Hinnant}
12233e519524SHoward Hinnant
12243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12253e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12263e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
12273e519524SHoward Hinnant        const allocator_type& __a)
12283e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
12293e519524SHoward Hinnant{
1230b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1231b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1232b24c8024SHoward Hinnant#endif
12333e519524SHoward Hinnant    __table_.rehash(__n);
12343e519524SHoward Hinnant}
12353e519524SHoward Hinnant
12363e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1237789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
12383e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12393e519524SHoward Hinnant        const allocator_type& __a)
12403e519524SHoward Hinnant    : __table_(__a)
12413e519524SHoward Hinnant{
1242b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1243b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1244b24c8024SHoward Hinnant#endif
12453e519524SHoward Hinnant}
12463e519524SHoward Hinnant
12473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12483e519524SHoward Hinnanttemplate <class _InputIterator>
12493e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12503e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
12513e519524SHoward Hinnant{
1252b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1253b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1254b24c8024SHoward Hinnant#endif
12553e519524SHoward Hinnant    insert(__first, __last);
12563e519524SHoward Hinnant}
12573e519524SHoward Hinnant
12583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12593e519524SHoward Hinnanttemplate <class _InputIterator>
12603e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12613e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
12623e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
12633e519524SHoward Hinnant    : __table_(__hf, __eql)
12643e519524SHoward Hinnant{
1265b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1266b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1267b24c8024SHoward Hinnant#endif
12683e519524SHoward Hinnant    __table_.rehash(__n);
12693e519524SHoward Hinnant    insert(__first, __last);
12703e519524SHoward Hinnant}
12713e519524SHoward Hinnant
12723e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12733e519524SHoward Hinnanttemplate <class _InputIterator>
12743e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12753e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
12763e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
12773e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
12783e519524SHoward Hinnant{
1279b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1280b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1281b24c8024SHoward Hinnant#endif
12823e519524SHoward Hinnant    __table_.rehash(__n);
12833e519524SHoward Hinnant    insert(__first, __last);
12843e519524SHoward Hinnant}
12853e519524SHoward Hinnant
12863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12873e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12883e519524SHoward Hinnant        const unordered_map& __u)
12893e519524SHoward Hinnant    : __table_(__u.__table_)
12903e519524SHoward Hinnant{
1291b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1292b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1293b24c8024SHoward Hinnant#endif
12943e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
12953e519524SHoward Hinnant    insert(__u.begin(), __u.end());
12963e519524SHoward Hinnant}
12973e519524SHoward Hinnant
12983e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12993e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13003e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
13013e519524SHoward Hinnant    : __table_(__u.__table_, __a)
13023e519524SHoward Hinnant{
1303b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1304b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1305b24c8024SHoward Hinnant#endif
13063e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
13073e519524SHoward Hinnant    insert(__u.begin(), __u.end());
13083e519524SHoward Hinnant}
13093e519524SHoward Hinnant
13107609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
13113e519524SHoward Hinnant
13123e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1313789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
13143e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13153e519524SHoward Hinnant        unordered_map&& __u)
13163714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1317ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
13183e519524SHoward Hinnant{
1319b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1320b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
13214c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1322b24c8024SHoward Hinnant#endif
13233e519524SHoward Hinnant}
13243e519524SHoward Hinnant
13253e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13263e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13273e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
1328ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_), __a)
13293e519524SHoward Hinnant{
1330b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1331b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1332b24c8024SHoward Hinnant#endif
13333e519524SHoward Hinnant    if (__a != __u.get_allocator())
13343e519524SHoward Hinnant    {
13353e519524SHoward Hinnant        iterator __i = __u.begin();
13363e519524SHoward Hinnant        while (__u.size() != 0)
13373e519524SHoward Hinnant            __table_.__insert_unique(
1338ce48a113SHoward Hinnant                _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
13393e519524SHoward Hinnant                                    );
13403e519524SHoward Hinnant    }
13414c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
13424c80bfbdSHoward Hinnant    else
13434c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
13444c80bfbdSHoward Hinnant#endif
13453e519524SHoward Hinnant}
13463e519524SHoward Hinnant
13477609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
13483e519524SHoward Hinnant
134954976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
135054976f26SHoward Hinnant
13513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13523e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13533e519524SHoward Hinnant        initializer_list<value_type> __il)
13543e519524SHoward Hinnant{
1355b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1356b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1357b24c8024SHoward Hinnant#endif
13583e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13593e519524SHoward Hinnant}
13603e519524SHoward Hinnant
13613e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13623e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13633e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
13643e519524SHoward Hinnant        const key_equal& __eql)
13653e519524SHoward Hinnant    : __table_(__hf, __eql)
13663e519524SHoward Hinnant{
1367b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1368b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1369b24c8024SHoward Hinnant#endif
13703e519524SHoward Hinnant    __table_.rehash(__n);
13713e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13723e519524SHoward Hinnant}
13733e519524SHoward Hinnant
13743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13753e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13763e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
13773e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
13783e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
13793e519524SHoward Hinnant{
1380b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1381b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1382b24c8024SHoward Hinnant#endif
13833e519524SHoward Hinnant    __table_.rehash(__n);
13843e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13853e519524SHoward Hinnant}
13863e519524SHoward Hinnant
138754976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
138854976f26SHoward Hinnant
13897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
13903e519524SHoward Hinnant
13913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1392789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
13933e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
13943e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
13953714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
13963e519524SHoward Hinnant{
1397ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
13983e519524SHoward Hinnant    return *this;
13993e519524SHoward Hinnant}
14003e519524SHoward Hinnant
14017609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
14023e519524SHoward Hinnant
140354976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
140454976f26SHoward Hinnant
14053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1406789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14073e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
14083e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
14093e519524SHoward Hinnant        initializer_list<value_type> __il)
14103e519524SHoward Hinnant{
14113e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
14123e519524SHoward Hinnant    return *this;
14133e519524SHoward Hinnant}
14143e519524SHoward Hinnant
141554976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
141654976f26SHoward Hinnant
14177609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
14183e519524SHoward Hinnant
14193e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14203e519524SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
14218b805c91SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
14223e519524SHoward Hinnant{
14233e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
1424c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
14258b805c91SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
14263e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
14273e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
14283e519524SHoward Hinnant    return __h;
14293e519524SHoward Hinnant}
14303e519524SHoward Hinnant
14313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14328b805c91SHoward Hinnanttemplate <class _A0>
14333e519524SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
14343e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
14353e519524SHoward Hinnant{
14363e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
1437c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1438ce48a113SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
1439ce48a113SHoward Hinnant                             _VSTD::forward<_A0>(__a0));
14403e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
14413e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
14423e519524SHoward Hinnant    return __h;
14433e519524SHoward Hinnant}
14443e519524SHoward Hinnant
14458b805c91SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14468b805c91SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
14474a95f9ebSHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(key_type&& __k)
14488b805c91SHoward Hinnant{
14498b805c91SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
14508b805c91SHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
14514a95f9ebSHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
14528b805c91SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1453307f8143SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
14548b805c91SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1455179b1f8cSHoward Hinnant    return __h;
14568b805c91SHoward Hinnant}
14578b805c91SHoward Hinnant
14587609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
14597609c9b6SHoward Hinnant
14603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14618b805c91SHoward Hinnanttemplate <class _A0, class _A1, class ..._Args>
14628b805c91SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
14638b805c91SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0,
14648b805c91SHoward Hinnant                                                                 _A1&& __a1,
14658b805c91SHoward Hinnant                                                                 _Args&&... __args)
14663e519524SHoward Hinnant{
14678b805c91SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
14688b805c91SHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
14698b805c91SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
14708b805c91SHoward Hinnant                             _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
1471ce48a113SHoward Hinnant                             _VSTD::forward<_Args>(__args)...);
14728b805c91SHoward Hinnant    __h.get_deleter().__first_constructed = true;
14738b805c91SHoward Hinnant    __h.get_deleter().__second_constructed = true;
14748b805c91SHoward Hinnant    return __h;
14758b805c91SHoward Hinnant}
14768b805c91SHoward Hinnant
14778b805c91SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14788b805c91SHoward Hinnanttemplate <class... _Args>
14798b805c91SHoward Hinnantpair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool>
1480*ad783ce9SDuncan P. N. Exon Smithunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
14818b805c91SHoward Hinnant{
14828b805c91SHoward Hinnant    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
14833e519524SHoward Hinnant    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
14843e519524SHoward Hinnant    if (__r.second)
14853e519524SHoward Hinnant        __h.release();
14863e519524SHoward Hinnant    return __r;
14873e519524SHoward Hinnant}
14883e519524SHoward Hinnant
14897609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
14904a95f9ebSHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
14913e519524SHoward Hinnant
14923e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14933e519524SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
14944a95f9ebSHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
14953e519524SHoward Hinnant{
14963e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
1497c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1498307f8143SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
14993e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1500307f8143SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
15013e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1502251c6291SDimitry Andric    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
15033e519524SHoward Hinnant}
15043e519524SHoward Hinnant
15053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15063e519524SHoward Hinnanttemplate <class _InputIterator>
1507789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15083e519524SHoward Hinnantvoid
15093e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
15103e519524SHoward Hinnant                                                       _InputIterator __last)
15113e519524SHoward Hinnant{
15123e519524SHoward Hinnant    for (; __first != __last; ++__first)
15133e519524SHoward Hinnant        __table_.__insert_unique(*__first);
15143e519524SHoward Hinnant}
15153e519524SHoward Hinnant
15163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15173e519524SHoward Hinnant_Tp&
15183e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
15193e519524SHoward Hinnant{
15203e519524SHoward Hinnant    iterator __i = find(__k);
15213e519524SHoward Hinnant    if (__i != end())
15223e519524SHoward Hinnant        return __i->second;
15234a95f9ebSHoward Hinnant    __node_holder __h = __construct_node_with_key(__k);
15243e519524SHoward Hinnant    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
15253e519524SHoward Hinnant    __h.release();
15263e519524SHoward Hinnant    return __r.first->second;
15273e519524SHoward Hinnant}
15283e519524SHoward Hinnant
15297609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
15303e519524SHoward Hinnant
15313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15323e519524SHoward Hinnant_Tp&
15333e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
15343e519524SHoward Hinnant{
15353e519524SHoward Hinnant    iterator __i = find(__k);
15363e519524SHoward Hinnant    if (__i != end())
15373e519524SHoward Hinnant        return __i->second;
15384a95f9ebSHoward Hinnant    __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
15393e519524SHoward Hinnant    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
15403e519524SHoward Hinnant    __h.release();
15413e519524SHoward Hinnant    return __r.first->second;
15423e519524SHoward Hinnant}
15433e519524SHoward Hinnant
15447609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
15453e519524SHoward Hinnant
15463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15473e519524SHoward Hinnant_Tp&
15483e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
15493e519524SHoward Hinnant{
15503e519524SHoward Hinnant    iterator __i = find(__k);
15513e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15523e519524SHoward Hinnant    if (__i == end())
15533e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1554b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
15553e519524SHoward Hinnant    return __i->second;
15563e519524SHoward Hinnant}
15573e519524SHoward Hinnant
15583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15593e519524SHoward Hinnantconst _Tp&
15603e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
15613e519524SHoward Hinnant{
15623e519524SHoward Hinnant    const_iterator __i = find(__k);
15633e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15643e519524SHoward Hinnant    if (__i == end())
15653e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1566b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
15673e519524SHoward Hinnant    return __i->second;
15683e519524SHoward Hinnant}
15693e519524SHoward Hinnant
15703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1571789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15723e519524SHoward Hinnantvoid
15733e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
15743e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
15753714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
15763e519524SHoward Hinnant{
15773e519524SHoward Hinnant    __x.swap(__y);
15783e519524SHoward Hinnant}
15793e519524SHoward Hinnant
15803e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15813e519524SHoward Hinnantbool
15823e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
15833e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
15843e519524SHoward Hinnant{
15853e519524SHoward Hinnant    if (__x.size() != __y.size())
15863e519524SHoward Hinnant        return false;
15873e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
15883e519524SHoward Hinnant                                                                 const_iterator;
15893e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
15903e519524SHoward Hinnant            __i != __ex; ++__i)
15913e519524SHoward Hinnant    {
15923e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
15933e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
15943e519524SHoward Hinnant            return false;
15953e519524SHoward Hinnant    }
15963e519524SHoward Hinnant    return true;
15973e519524SHoward Hinnant}
15983e519524SHoward Hinnant
15993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1600789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16013e519524SHoward Hinnantbool
16023e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
16033e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
16043e519524SHoward Hinnant{
16053e519524SHoward Hinnant    return !(__x == __y);
16063e519524SHoward Hinnant}
16073e519524SHoward Hinnant
16083e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
16093e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1610f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY unordered_multimap
16113e519524SHoward Hinnant{
16123e519524SHoward Hinnantpublic:
16133e519524SHoward Hinnant    // types
16143e519524SHoward Hinnant    typedef _Key                                           key_type;
16153e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
16163e519524SHoward Hinnant    typedef _Hash                                          hasher;
16173e519524SHoward Hinnant    typedef _Pred                                          key_equal;
16183e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
16193e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
1620307f8143SHoward Hinnant    typedef pair<key_type, mapped_type>                    __nc_value_type;
16213e519524SHoward Hinnant    typedef value_type&                                    reference;
16223e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1623b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1624b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
16253e519524SHoward Hinnant
16263e519524SHoward Hinnantprivate:
16279fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1628abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1629abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
16301f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
16311f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
16323e519524SHoward Hinnant
16333e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
16343e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
16353e519524SHoward Hinnant
16363e519524SHoward Hinnant    __table __table_;
16373e519524SHoward Hinnant
16383e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
16393e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
16403e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1641c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1642c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
16433e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
16443e519524SHoward Hinnantpublic:
16453e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
16463e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
16473e519524SHoward Hinnant    typedef typename __alloc_traits::size_type       size_type;
16483e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type difference_type;
16493e519524SHoward Hinnant
16503e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
16513e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
16523e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
16533e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
16543e519524SHoward Hinnant
1655789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16563714107eSHoward Hinnant    unordered_multimap()
16573714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1658b24c8024SHoward Hinnant        {
1659b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1660b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
1661b24c8024SHoward Hinnant#endif
1662b24c8024SHoward Hinnant        }
16633e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
16643e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
16653e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
16663e519524SHoward Hinnant                                const key_equal& __eql,
16673e519524SHoward Hinnant                                const allocator_type& __a);
16683e519524SHoward Hinnant    template <class _InputIterator>
16693e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
16703e519524SHoward Hinnant    template <class _InputIterator>
16713e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
16723e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
16733e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
16743e519524SHoward Hinnant    template <class _InputIterator>
16753e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
16763e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
16773e519524SHoward Hinnant                      const key_equal& __eql,
16783e519524SHoward Hinnant                      const allocator_type& __a);
16793e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
16803e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
16813e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
16827609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
16833714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
16843714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
16853e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
16867609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
168754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16883e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
16893e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
16903e519524SHoward Hinnant                       const hasher& __hf = hasher(),
16913e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
16923e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
16933e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
16943e519524SHoward Hinnant                       const allocator_type& __a);
169554976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16963cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
16973cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16983cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
16993cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
17003cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17013cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
17023cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
17033cd37e64SMarshall Clow    template <class _InputIterator>
17043cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17053cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
17063cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
17073cd37e64SMarshall Clow    template <class _InputIterator>
17083cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17093cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
17103cd37e64SMarshall Clow        const allocator_type& __a)
17113cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
17123cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17133cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
17143cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
17153cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17163cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
17173cd37e64SMarshall Clow      const allocator_type& __a)
17183cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
17193cd37e64SMarshall Clow#endif
17203e519524SHoward Hinnant    // ~unordered_multimap() = default;
17215a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17225a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
17235a33687dSHoward Hinnant    {
1724307f8143SHoward Hinnant#if __cplusplus >= 201103L
17255a33687dSHoward Hinnant        __table_ = __u.__table_;
1726307f8143SHoward Hinnant#else
172774cf6ff5SMarshall Clow        if (this != &__u) {
1728307f8143SHoward Hinnant            __table_.clear();
1729307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1730307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1731307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1732307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1733307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
173474cf6ff5SMarshall Clow        }
1735307f8143SHoward Hinnant#endif
17365a33687dSHoward Hinnant        return *this;
17375a33687dSHoward Hinnant    }
17387609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
17393714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
17403714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
17413e519524SHoward Hinnant#endif
174254976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
17433e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
174454976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
17453e519524SHoward Hinnant
1746789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17473714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
17483e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
17493e519524SHoward Hinnant
1750789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17513714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1752789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17533714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1754789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17553714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
17563e519524SHoward Hinnant
1757789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17583714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1759789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17603714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1761789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17623714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1763789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17643714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1765789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17663714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1767789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17683714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
17693e519524SHoward Hinnant
17707609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
17717609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
17727609c9b6SHoward Hinnant
17738b805c91SHoward Hinnant    template <class... _Args>
17748b805c91SHoward Hinnant        iterator emplace(_Args&&... __args);
17753e519524SHoward Hinnant
17768b805c91SHoward Hinnant    template <class... _Args>
17778b805c91SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args);
17787609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
17797609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1780789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17813e519524SHoward Hinnant    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
17827609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1783c003db1fSHoward Hinnant    template <class _Pp,
1784c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1785789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1786c003db1fSHoward Hinnant        iterator insert(_Pp&& __x)
1787c003db1fSHoward Hinnant            {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
17887609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1789789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17903e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __x)
17913e519524SHoward Hinnant        {return __table_.__insert_multi(__p.__i_, __x);}
17927609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1793c003db1fSHoward Hinnant    template <class _Pp,
1794c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1795789847ddSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1796c003db1fSHoward Hinnant        iterator insert(const_iterator __p, _Pp&& __x)
1797c003db1fSHoward Hinnant            {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
17987609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
17993e519524SHoward Hinnant    template <class _InputIterator>
18003e519524SHoward Hinnant        void insert(_InputIterator __first, _InputIterator __last);
180154976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1802789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18033e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
18043e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
180554976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
18063e519524SHoward Hinnant
1807789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18083e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1809789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1810ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1811ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18123e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1813789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18143e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
18153e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1816789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18173714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
18183e519524SHoward Hinnant
1819789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18203714107eSHoward Hinnant    void swap(unordered_multimap& __u)
18213714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
18223714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
18233e519524SHoward Hinnant
1824789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18253e519524SHoward Hinnant    hasher hash_function() const
18263e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1827789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18283e519524SHoward Hinnant    key_equal key_eq() const
18293e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
18303e519524SHoward Hinnant
1831789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18323e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1833789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18343e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1835789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18363e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1837789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18383e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
18393e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
1840789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18413e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
18423e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
18433e519524SHoward Hinnant
1844789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18453714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1846789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18473714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
18483714107eSHoward Hinnant        {return __table_.max_bucket_count();}
18493e519524SHoward Hinnant
1850789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18513e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
18523e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1853789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18543e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
18553e519524SHoward Hinnant
1856789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18573e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1858789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18593e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1860789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18613e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1862789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18633e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1864789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18653e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1866789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18673e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
18683e519524SHoward Hinnant
1869789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18703714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1871789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18723714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1873789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18743e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1875789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18763e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1877789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18783e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
18793e519524SHoward Hinnant
1880b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1881b24c8024SHoward Hinnant
1882b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1883b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1884b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1885b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1886b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1887b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1888b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1889b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1890b24c8024SHoward Hinnant
1891b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1892b24c8024SHoward Hinnant
18933e519524SHoward Hinnantprivate:
18948b805c91SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
18958b805c91SHoward Hinnant    __node_holder __construct_node();
18968b805c91SHoward Hinnant    template <class _A0>
18978b805c91SHoward Hinnant        __node_holder
18988b805c91SHoward Hinnant         __construct_node(_A0&& __a0);
18998b805c91SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
19008b805c91SHoward Hinnant    template <class _A0, class _A1, class ..._Args>
19018b805c91SHoward Hinnant        __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
19028b805c91SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
19038b805c91SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
19043e519524SHoward Hinnant};
19053e519524SHoward Hinnant
19063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19083e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
19093e519524SHoward Hinnant    : __table_(__hf, __eql)
19103e519524SHoward Hinnant{
1911b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1912b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1913b24c8024SHoward Hinnant#endif
19143e519524SHoward Hinnant    __table_.rehash(__n);
19153e519524SHoward Hinnant}
19163e519524SHoward Hinnant
19173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19183e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19193e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
19203e519524SHoward Hinnant        const allocator_type& __a)
19213e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
19223e519524SHoward Hinnant{
1923b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1924b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1925b24c8024SHoward Hinnant#endif
19263e519524SHoward Hinnant    __table_.rehash(__n);
19273e519524SHoward Hinnant}
19283e519524SHoward Hinnant
19293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19303e519524SHoward Hinnanttemplate <class _InputIterator>
19313e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19323e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
19333e519524SHoward Hinnant{
1934b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1935b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1936b24c8024SHoward Hinnant#endif
19373e519524SHoward Hinnant    insert(__first, __last);
19383e519524SHoward Hinnant}
19393e519524SHoward Hinnant
19403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19413e519524SHoward Hinnanttemplate <class _InputIterator>
19423e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19433e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
19443e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
19453e519524SHoward Hinnant    : __table_(__hf, __eql)
19463e519524SHoward Hinnant{
1947b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1948b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1949b24c8024SHoward Hinnant#endif
19503e519524SHoward Hinnant    __table_.rehash(__n);
19513e519524SHoward Hinnant    insert(__first, __last);
19523e519524SHoward Hinnant}
19533e519524SHoward Hinnant
19543e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19553e519524SHoward Hinnanttemplate <class _InputIterator>
19563e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19573e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
19583e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
19593e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
19603e519524SHoward Hinnant{
1961b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1962b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1963b24c8024SHoward Hinnant#endif
19643e519524SHoward Hinnant    __table_.rehash(__n);
19653e519524SHoward Hinnant    insert(__first, __last);
19663e519524SHoward Hinnant}
19673e519524SHoward Hinnant
19683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1969789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19703e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19713e519524SHoward Hinnant        const allocator_type& __a)
19723e519524SHoward Hinnant    : __table_(__a)
19733e519524SHoward Hinnant{
1974b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1975b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1976b24c8024SHoward Hinnant#endif
19773e519524SHoward Hinnant}
19783e519524SHoward Hinnant
19793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19803e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19813e519524SHoward Hinnant        const unordered_multimap& __u)
19823e519524SHoward Hinnant    : __table_(__u.__table_)
19833e519524SHoward Hinnant{
1984b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1985b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1986b24c8024SHoward Hinnant#endif
19873e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
19883e519524SHoward Hinnant    insert(__u.begin(), __u.end());
19893e519524SHoward Hinnant}
19903e519524SHoward Hinnant
19913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19923e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19933e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
19943e519524SHoward Hinnant    : __table_(__u.__table_, __a)
19953e519524SHoward Hinnant{
1996b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1997b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1998b24c8024SHoward Hinnant#endif
19993e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
20003e519524SHoward Hinnant    insert(__u.begin(), __u.end());
20013e519524SHoward Hinnant}
20023e519524SHoward Hinnant
20037609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
20043e519524SHoward Hinnant
20053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2006789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20083e519524SHoward Hinnant        unordered_multimap&& __u)
20093714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2010ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
20113e519524SHoward Hinnant{
2012b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2013b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
20144c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
2015b24c8024SHoward Hinnant#endif
20163e519524SHoward Hinnant}
20173e519524SHoward Hinnant
20183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20193e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20203e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
2021ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_), __a)
20223e519524SHoward Hinnant{
2023b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2024b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2025b24c8024SHoward Hinnant#endif
20263e519524SHoward Hinnant    if (__a != __u.get_allocator())
20273e519524SHoward Hinnant    {
20283e519524SHoward Hinnant        iterator __i = __u.begin();
20293e519524SHoward Hinnant        while (__u.size() != 0)
20303e519524SHoward Hinnant        {
20313e519524SHoward Hinnant            __table_.__insert_multi(
2032ce48a113SHoward Hinnant                _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_)
20333e519524SHoward Hinnant                                   );
20343e519524SHoward Hinnant        }
20353e519524SHoward Hinnant    }
20364c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
20374c80bfbdSHoward Hinnant    else
20384c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
20394c80bfbdSHoward Hinnant#endif
20403e519524SHoward Hinnant}
20413e519524SHoward Hinnant
20427609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
20433e519524SHoward Hinnant
204454976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
204554976f26SHoward Hinnant
20463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20473e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20483e519524SHoward Hinnant        initializer_list<value_type> __il)
20493e519524SHoward Hinnant{
2050b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2051b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2052b24c8024SHoward Hinnant#endif
20533e519524SHoward Hinnant    insert(__il.begin(), __il.end());
20543e519524SHoward Hinnant}
20553e519524SHoward Hinnant
20563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20573e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20583e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
20593e519524SHoward Hinnant        const key_equal& __eql)
20603e519524SHoward Hinnant    : __table_(__hf, __eql)
20613e519524SHoward Hinnant{
2062b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2063b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2064b24c8024SHoward Hinnant#endif
20653e519524SHoward Hinnant    __table_.rehash(__n);
20663e519524SHoward Hinnant    insert(__il.begin(), __il.end());
20673e519524SHoward Hinnant}
20683e519524SHoward Hinnant
20693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20703e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20713e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
20723e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
20733e519524SHoward Hinnant    : __table_(__hf, __eql, __a)
20743e519524SHoward Hinnant{
2075b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2076b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2077b24c8024SHoward Hinnant#endif
20783e519524SHoward Hinnant    __table_.rehash(__n);
20793e519524SHoward Hinnant    insert(__il.begin(), __il.end());
20803e519524SHoward Hinnant}
20813e519524SHoward Hinnant
208254976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
208354976f26SHoward Hinnant
20847609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
20853e519524SHoward Hinnant
20863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2087789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20883e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
20893e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
20903714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
20913e519524SHoward Hinnant{
2092ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
20933e519524SHoward Hinnant    return *this;
20943e519524SHoward Hinnant}
20953e519524SHoward Hinnant
20967609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
20973e519524SHoward Hinnant
209854976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
209954976f26SHoward Hinnant
21003e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2101789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21023e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
21033e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
21043e519524SHoward Hinnant        initializer_list<value_type> __il)
21053e519524SHoward Hinnant{
21063e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
21073e519524SHoward Hinnant    return *this;
21083e519524SHoward Hinnant}
21093e519524SHoward Hinnant
211054976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
211154976f26SHoward Hinnant
21127609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
21133e519524SHoward Hinnant
21143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21153e519524SHoward Hinnanttypename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
21168b805c91SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node()
21173e519524SHoward Hinnant{
21183e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
2119c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
21208b805c91SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_));
21213e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
21223e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
21233e519524SHoward Hinnant    return __h;
21243e519524SHoward Hinnant}
21253e519524SHoward Hinnant
21263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21278b805c91SHoward Hinnanttemplate <class _A0>
21283e519524SHoward Hinnanttypename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
21293e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0)
21303e519524SHoward Hinnant{
21313e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
2132c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2133ce48a113SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
2134ce48a113SHoward Hinnant                             _VSTD::forward<_A0>(__a0));
21353e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
21363e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
21373e519524SHoward Hinnant    return __h;
21383e519524SHoward Hinnant}
21393e519524SHoward Hinnant
21407609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
21417609c9b6SHoward Hinnant
21423e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21438b805c91SHoward Hinnanttemplate <class _A0, class _A1, class ..._Args>
21448b805c91SHoward Hinnanttypename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
21458b805c91SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(
21468b805c91SHoward Hinnant        _A0&& __a0, _A1&& __a1, _Args&&... __args)
21473e519524SHoward Hinnant{
21488b805c91SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
21498b805c91SHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
21508b805c91SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
21518b805c91SHoward Hinnant                             _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
2152ce48a113SHoward Hinnant                             _VSTD::forward<_Args>(__args)...);
21538b805c91SHoward Hinnant    __h.get_deleter().__first_constructed = true;
21548b805c91SHoward Hinnant    __h.get_deleter().__second_constructed = true;
21558b805c91SHoward Hinnant    return __h;
21568b805c91SHoward Hinnant}
21578b805c91SHoward Hinnant
21588b805c91SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21598b805c91SHoward Hinnanttemplate <class... _Args>
21608b805c91SHoward Hinnanttypename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
21618b805c91SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
21628b805c91SHoward Hinnant{
21638b805c91SHoward Hinnant    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
21643e519524SHoward Hinnant    iterator __r = __table_.__node_insert_multi(__h.get());
21653e519524SHoward Hinnant    __h.release();
21663e519524SHoward Hinnant    return __r;
21673e519524SHoward Hinnant}
21683e519524SHoward Hinnant
21693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21708b805c91SHoward Hinnanttemplate <class... _Args>
21713e519524SHoward Hinnanttypename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator
21723e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace_hint(
21738b805c91SHoward Hinnant        const_iterator __p, _Args&&... __args)
21743e519524SHoward Hinnant{
21758b805c91SHoward Hinnant    __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
21763e519524SHoward Hinnant    iterator __r = __table_.__node_insert_multi(__p.__i_, __h.get());
21773e519524SHoward Hinnant    __h.release();
21783e519524SHoward Hinnant    return __r;
21793e519524SHoward Hinnant}
21803e519524SHoward Hinnant
21817609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
21827609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
21833e519524SHoward Hinnant
21843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21853e519524SHoward Hinnanttemplate <class _InputIterator>
2186789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21873e519524SHoward Hinnantvoid
21883e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
21893e519524SHoward Hinnant                                                            _InputIterator __last)
21903e519524SHoward Hinnant{
21913e519524SHoward Hinnant    for (; __first != __last; ++__first)
21923e519524SHoward Hinnant        __table_.__insert_multi(*__first);
21933e519524SHoward Hinnant}
21943e519524SHoward Hinnant
21953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2196789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21973e519524SHoward Hinnantvoid
21983e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
21993e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22003714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
22013e519524SHoward Hinnant{
22023e519524SHoward Hinnant    __x.swap(__y);
22033e519524SHoward Hinnant}
22043e519524SHoward Hinnant
22053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22063e519524SHoward Hinnantbool
22073e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
22083e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22093e519524SHoward Hinnant{
22103e519524SHoward Hinnant    if (__x.size() != __y.size())
22113e519524SHoward Hinnant        return false;
22123e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
22133e519524SHoward Hinnant                                                                 const_iterator;
22143e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
22153e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
22163e519524SHoward Hinnant    {
22173e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
22183e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2219ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2220ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2221ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
22223e519524SHoward Hinnant            return false;
22233e519524SHoward Hinnant        __i = __xeq.second;
22243e519524SHoward Hinnant    }
22253e519524SHoward Hinnant    return true;
22263e519524SHoward Hinnant}
22273e519524SHoward Hinnant
22283e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2229789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22303e519524SHoward Hinnantbool
22313e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
22323e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22333e519524SHoward Hinnant{
22343e519524SHoward Hinnant    return !(__x == __y);
22353e519524SHoward Hinnant}
22363e519524SHoward Hinnant
22373e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
22383e519524SHoward Hinnant
22393e519524SHoward Hinnant#endif  // _LIBCPP_UNORDERED_MAP
2240