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>
3720f905677SEric Fiselier#include <tuple>
3733e519524SHoward Hinnant
374c1bd9197SEric Fiselier#include <__debug>
375c1bd9197SEric Fiselier
376073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3773e519524SHoward Hinnant#pragma GCC system_header
378073458b1SHoward Hinnant#endif
3793e519524SHoward Hinnant
3803e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
3813e519524SHoward Hinnant
382ee187e24SEric Fiseliertemplate <class _Key, class _Cp, class _Hash,
383ee187e24SEric Fiselier          bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value
38442b8bb50SHoward Hinnant         >
3853e519524SHoward Hinnantclass __unordered_map_hasher
3863e519524SHoward Hinnant    : private _Hash
3873e519524SHoward Hinnant{
3883e519524SHoward Hinnantpublic:
389789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3903714107eSHoward Hinnant    __unordered_map_hasher()
3913714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
3923714107eSHoward Hinnant        : _Hash() {}
393789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3943714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
3953714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
3963714107eSHoward Hinnant        : _Hash(__h) {}
397789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3983714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
399789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
400a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
401abb160e6SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x.__cc.first);}
402a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
403a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4043e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
405e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
406e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
407e3fbe143SMarshall Clow    {
408e3fbe143SMarshall Clow        using _VSTD::swap;
409e3fbe143SMarshall Clow        swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y));
410e3fbe143SMarshall Clow    }
4113e519524SHoward Hinnant};
4123e519524SHoward Hinnant
413abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Hash>
414abb160e6SHoward Hinnantclass __unordered_map_hasher<_Key, _Cp, _Hash, false>
4153e519524SHoward Hinnant{
4163e519524SHoward Hinnant    _Hash __hash_;
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_;
4903e519524SHoward Hinnantpublic:
491789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4923714107eSHoward Hinnant    __unordered_map_equal()
4933714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
4943714107eSHoward Hinnant        : __pred_() {}
495789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4963714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
4973714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
4983714107eSHoward Hinnant        : __pred_(__p) {}
499789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5003714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
501789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
502a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
503abb160e6SHoward Hinnant        {return __pred_(__x.__cc.first, __y.__cc.first);}
504a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
505a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
506abb160e6SHoward Hinnant        {return __pred_(__x.__cc.first, __y);}
507a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
508a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
509abb160e6SHoward Hinnant        {return __pred_(__x, __y.__cc.first);}
510e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
511e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
512e3fbe143SMarshall Clow    {
513e3fbe143SMarshall Clow        using _VSTD::swap;
514e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
515e3fbe143SMarshall Clow    }
5163e519524SHoward Hinnant};
5173e519524SHoward Hinnant
518e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Pred, bool __b>
519e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
520e3fbe143SMarshall Clowvoid
521e3fbe143SMarshall Clowswap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
522e3fbe143SMarshall Clow     __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
523e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
524e3fbe143SMarshall Clow{
525e3fbe143SMarshall Clow    __x.swap(__y);
526e3fbe143SMarshall Clow}
527e3fbe143SMarshall Clow
5283e519524SHoward Hinnanttemplate <class _Alloc>
5293e519524SHoward Hinnantclass __hash_map_node_destructor
5303e519524SHoward Hinnant{
5313e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
5323e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
53375d0dcfdSEric Fiselier
5343e519524SHoward Hinnantpublic:
53575d0dcfdSEric Fiselier
5363e519524SHoward Hinnant    typedef typename __alloc_traits::pointer       pointer;
5373e519524SHoward Hinnantprivate:
5383e519524SHoward Hinnant
5393e519524SHoward Hinnant    allocator_type& __na_;
5403e519524SHoward Hinnant
5413e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
5423e519524SHoward Hinnant
5433e519524SHoward Hinnantpublic:
5443e519524SHoward Hinnant    bool __first_constructed;
5453e519524SHoward Hinnant    bool __second_constructed;
5463e519524SHoward Hinnant
547789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5483714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
5493e519524SHoward Hinnant        : __na_(__na),
5503e519524SHoward Hinnant          __first_constructed(false),
5513e519524SHoward Hinnant          __second_constructed(false)
5523e519524SHoward Hinnant        {}
5533e519524SHoward Hinnant
5547609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
555789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5563e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
5573714107eSHoward Hinnant        _NOEXCEPT
5583e519524SHoward Hinnant        : __na_(__x.__na_),
5593e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5603e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5613e519524SHoward Hinnant        {
5623e519524SHoward Hinnant            __x.__value_constructed = false;
5633e519524SHoward Hinnant        }
5647609c9b6SHoward Hinnant#else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
565789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5663e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
5673e519524SHoward Hinnant        : __na_(__x.__na_),
5683e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5693e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5703e519524SHoward Hinnant        {
5713e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
5723e519524SHoward Hinnant        }
5737609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5743e519524SHoward Hinnant
575789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5763714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
5773e519524SHoward Hinnant    {
5783e519524SHoward Hinnant        if (__second_constructed)
579307f8143SHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
5803e519524SHoward Hinnant        if (__first_constructed)
581307f8143SHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
5823e519524SHoward Hinnant        if (__p)
5833e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
5843e519524SHoward Hinnant    }
5853e519524SHoward Hinnant};
5863e519524SHoward Hinnant
587fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5889fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
5899fd9f84fSHoward Hinnantunion __hash_value_type
5909fd9f84fSHoward Hinnant{
5919fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
5929fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
5939fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
5949fd9f84fSHoward Hinnant    typedef pair<key_type, mapped_type>              __nc_value_type;
5959fd9f84fSHoward Hinnant
5969fd9f84fSHoward Hinnant    value_type __cc;
5979fd9f84fSHoward Hinnant    __nc_value_type __nc;
5989fd9f84fSHoward Hinnant
5999fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6009fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
6019fd9f84fSHoward Hinnant        {__nc = __v.__cc; return *this;}
6029fd9f84fSHoward Hinnant
6039fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6049fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
60527647994SMarshall Clow        {__nc = _VSTD::move(__v.__nc); return *this;}
6069fd9f84fSHoward Hinnant
607fcd02211SEric Fiselier    template <class _ValueTp,
608fcd02211SEric Fiselier              class = typename enable_if<
609fcd02211SEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
610fcd02211SEric Fiselier                 >::type
611fcd02211SEric Fiselier             >
6129fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
613fcd02211SEric Fiselier    __hash_value_type& operator=(_ValueTp&& __v) {
614fcd02211SEric Fiselier        __nc = _VSTD::forward<_ValueTp>(__v); return *this;
615fcd02211SEric Fiselier    }
616fcd02211SEric Fiselier
617fcd02211SEric Fiselierprivate:
618fcd02211SEric Fiselier    __hash_value_type(const __hash_value_type& __v) = delete;
619fcd02211SEric Fiselier    __hash_value_type(__hash_value_type&& __v) = delete;
620fcd02211SEric Fiselier    template <class ..._Args>
621fcd02211SEric Fiselier    explicit __hash_value_type(_Args&& ...__args) = delete;
622fcd02211SEric Fiselier
623fcd02211SEric Fiselier    ~__hash_value_type() = delete;
6249fd9f84fSHoward Hinnant};
6259fd9f84fSHoward Hinnant
6269fd9f84fSHoward Hinnant#else
6279fd9f84fSHoward Hinnant
6289fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
6299fd9f84fSHoward Hinnantstruct __hash_value_type
6309fd9f84fSHoward Hinnant{
6319fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6329fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6339fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
6349fd9f84fSHoward Hinnant
6359fd9f84fSHoward Hinnant    value_type __cc;
6369fd9f84fSHoward Hinnant
637fcd02211SEric Fiselierprivate:
638fcd02211SEric Fiselier   ~__hash_value_type();
6399fd9f84fSHoward Hinnant};
6409fd9f84fSHoward Hinnant
6419fd9f84fSHoward Hinnant#endif
6429fd9f84fSHoward Hinnant
6433e519524SHoward Hinnanttemplate <class _HashIterator>
644*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator
6453e519524SHoward Hinnant{
6463e519524SHoward Hinnant    _HashIterator __i_;
6473e519524SHoward Hinnant
64875d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
64975d0dcfdSEric Fiselier
6503e519524SHoward Hinnantpublic:
6513e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
65275d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
65375d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
6543e519524SHoward Hinnant    typedef value_type&                                          reference;
65575d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
6563e519524SHoward Hinnant
657789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6583714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
6593e519524SHoward Hinnant
660789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6613714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
6623e519524SHoward Hinnant
663789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
664307f8143SHoward Hinnant    reference operator*() const {return __i_->__cc;}
665789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
666307f8143SHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
6673e519524SHoward Hinnant
668789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6693e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
670789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6713e519524SHoward Hinnant    __hash_map_iterator operator++(int)
6723e519524SHoward Hinnant    {
6733e519524SHoward Hinnant        __hash_map_iterator __t(*this);
6743e519524SHoward Hinnant        ++(*this);
6753e519524SHoward Hinnant        return __t;
6763e519524SHoward Hinnant    }
6773e519524SHoward Hinnant
678789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
679789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
6803e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
681789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
682789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
6833e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
6843e519524SHoward Hinnant
685*e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
686*e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
687*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
688*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
689*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
6903e519524SHoward Hinnant};
6913e519524SHoward Hinnant
6923e519524SHoward Hinnanttemplate <class _HashIterator>
693*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
6943e519524SHoward Hinnant{
6953e519524SHoward Hinnant    _HashIterator __i_;
6963e519524SHoward Hinnant
69775d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
69875d0dcfdSEric Fiselier
6993e519524SHoward Hinnantpublic:
7003e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
70175d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
70275d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
7033e519524SHoward Hinnant    typedef const value_type&                                    reference;
70475d0dcfdSEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
7053e519524SHoward Hinnant
706789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7073714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
7083e519524SHoward Hinnant
709789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7103714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
711789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7123e519524SHoward Hinnant    __hash_map_const_iterator(
7133e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
7143714107eSHoward Hinnant                 _NOEXCEPT
7153e519524SHoward Hinnant                : __i_(__i.__i_) {}
7163e519524SHoward Hinnant
717789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
718307f8143SHoward Hinnant    reference operator*() const {return __i_->__cc;}
719789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
720307f8143SHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
7213e519524SHoward Hinnant
722789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7233e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
724789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7253e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
7263e519524SHoward Hinnant    {
7273e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
7283e519524SHoward Hinnant        ++(*this);
7293e519524SHoward Hinnant        return __t;
7303e519524SHoward Hinnant    }
7313e519524SHoward Hinnant
732789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
733789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
7343e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
735789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
736789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
7373e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7383e519524SHoward Hinnant
739*e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
740*e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
741*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
742*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
7433e519524SHoward Hinnant};
7443e519524SHoward Hinnant
7453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
7463e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
747*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map
7483e519524SHoward Hinnant{
7493e519524SHoward Hinnantpublic:
7503e519524SHoward Hinnant    // types
7513e519524SHoward Hinnant    typedef _Key                                           key_type;
7523e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
7533e519524SHoward Hinnant    typedef _Hash                                          hasher;
7543e519524SHoward Hinnant    typedef _Pred                                          key_equal;
7553e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
7563e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
757307f8143SHoward Hinnant    typedef pair<key_type, mapped_type>                    __nc_value_type;
7583e519524SHoward Hinnant    typedef value_type&                                    reference;
7593e519524SHoward Hinnant    typedef const value_type&                              const_reference;
760b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
761b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
7623e519524SHoward Hinnant
7633e519524SHoward Hinnantprivate:
7649fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
765abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
766abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
7671f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
7681f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
7693e519524SHoward Hinnant
7703e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
7713e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
7723e519524SHoward Hinnant
7733e519524SHoward Hinnant    __table __table_;
7743e519524SHoward Hinnant
775fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
7763e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
7773e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
7783e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
7793e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
7803e519524SHoward Hinnant    typedef typename __table::__node                       __node;
781c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
782c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
7833e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
784fcd02211SEric Fiselier
785fcd02211SEric Fiselier    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
786fcd02211SEric Fiselier    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
7873e519524SHoward Hinnantpublic:
7883e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
7893e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
79075d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
79175d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
7923e519524SHoward Hinnant
7933e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
7943e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
7953e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
7963e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
7973e519524SHoward Hinnant
798789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7993714107eSHoward Hinnant    unordered_map()
8003714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
801b24c8024SHoward Hinnant        {
802b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
803b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
804b24c8024SHoward Hinnant#endif
805b24c8024SHoward Hinnant        }
8063e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
8073e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
8083e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
8093e519524SHoward Hinnant                  const key_equal& __eql,
8103e519524SHoward Hinnant                  const allocator_type& __a);
8113e519524SHoward Hinnant    template <class _InputIterator>
8123e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
8133e519524SHoward Hinnant    template <class _InputIterator>
8143e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
8153e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
8163e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
8173e519524SHoward Hinnant    template <class _InputIterator>
8183e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
8193e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
8203e519524SHoward Hinnant                      const key_equal& __eql,
8213e519524SHoward Hinnant                      const allocator_type& __a);
822cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
8233e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
8243e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
8253e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
8267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
827cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
8283714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
8293714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
8303e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
8317609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
83254976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8333e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
8343e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
8353e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
8363e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
8373e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
8383e519524SHoward Hinnant                  const allocator_type& __a);
83954976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8403cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
8413cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8423cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
8433cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
8443cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8453cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
8463cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
8473cd37e64SMarshall Clow    template <class _InputIterator>
8483cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8493cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
8503cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
8513cd37e64SMarshall Clow    template <class _InputIterator>
8523cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8533cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
8543cd37e64SMarshall Clow        const allocator_type& __a)
8553cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
8563cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8573cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
8583cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
8593cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8603cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
8613cd37e64SMarshall Clow      const allocator_type& __a)
8623cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
8633cd37e64SMarshall Clow#endif
8643e519524SHoward Hinnant    // ~unordered_map() = default;
8655a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8665a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
8675a33687dSHoward Hinnant    {
8682ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
8695a33687dSHoward Hinnant        __table_ = __u.__table_;
870307f8143SHoward Hinnant#else
87174cf6ff5SMarshall Clow        if (this != &__u) {
872307f8143SHoward Hinnant            __table_.clear();
873307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
874307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
875307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
876307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
877307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
87874cf6ff5SMarshall Clow        }
879307f8143SHoward Hinnant#endif
8805a33687dSHoward Hinnant        return *this;
8815a33687dSHoward Hinnant    }
8827609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
883cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
8843714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
8853714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
8863e519524SHoward Hinnant#endif
88754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
888cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
8893e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
89054976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
8913e519524SHoward Hinnant
892789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8933714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
8943e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
8953e519524SHoward Hinnant
896789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8973714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
898789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8993714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
900789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9013714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
9023e519524SHoward Hinnant
903789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9043714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
905789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9063714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
907789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9083714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
909789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9103714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
911789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9123714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
913789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9143714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
9153e519524SHoward Hinnant
9167a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
9177a9f500fSEric Fiselier    pair<iterator, bool> insert(const value_type& __x)
9187a9f500fSEric Fiselier        {return __table_.__insert_unique(__x);}
9197a9f500fSEric Fiselier
9207a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x) {
9217a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
9227a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9237a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
9247a9f500fSEric Fiselier            " referring to this unordered_map");
925fd838227SEric Fiselier#else
926fd838227SEric Fiselier        ((void)__p);
9277a9f500fSEric Fiselier#endif
9287a9f500fSEric Fiselier        return insert(__x).first;
9297a9f500fSEric Fiselier    }
9307a9f500fSEric Fiselier
9317a9f500fSEric Fiselier    template <class _InputIterator>
932cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
9337a9f500fSEric Fiselier        void insert(_InputIterator __first, _InputIterator __last);
9347a9f500fSEric Fiselier
9357a9f500fSEric Fiselier#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
9367a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
9377a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
9387a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
9397a9f500fSEric Fiselier#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
9407a9f500fSEric Fiselier
941fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
9427a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
9437a9f500fSEric Fiselier    pair<iterator, bool> insert(value_type&& __x)
9447a9f500fSEric Fiselier        {return __table_.__insert_unique(_VSTD::move(__x));}
9457a9f500fSEric Fiselier
9467a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x) {
9477a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
9487a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9497a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
9507a9f500fSEric Fiselier            " referring to this unordered_map");
951fd838227SEric Fiselier#else
952fd838227SEric Fiselier        ((void)__p);
9537a9f500fSEric Fiselier#endif
9547a9f500fSEric Fiselier        return __table_.__insert_unique(_VSTD::move(__x)).first;
9557a9f500fSEric Fiselier    }
9567a9f500fSEric Fiselier
9577a9f500fSEric Fiselier    template <class _Pp,
9587a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
9597a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
9607a9f500fSEric Fiselier        pair<iterator, bool> insert(_Pp&& __x)
9617a9f500fSEric Fiselier            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
9627a9f500fSEric Fiselier
9637a9f500fSEric Fiselier    template <class _Pp,
9647a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
9657a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
9667a9f500fSEric Fiselier        iterator insert(const_iterator __p, _Pp&& __x)
9677a9f500fSEric Fiselier        {
9687a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
9697a9f500fSEric Fiselier            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9707a9f500fSEric Fiselier                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
9717a9f500fSEric Fiselier                " referring to this unordered_map");
972fd838227SEric Fiselier#else
973fd838227SEric Fiselier          ((void)__p);
9747a9f500fSEric Fiselier#endif
9757a9f500fSEric Fiselier            return insert(_VSTD::forward<_Pp>(__x)).first;
9767a9f500fSEric Fiselier        }
9777a9f500fSEric Fiselier
9788b805c91SHoward Hinnant    template <class... _Args>
979fcd02211SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
980fcd02211SEric Fiselier    pair<iterator, bool> emplace(_Args&&... __args) {
981fcd02211SEric Fiselier        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
982fcd02211SEric Fiselier    }
9833e519524SHoward Hinnant
9848b805c91SHoward Hinnant    template <class... _Args>
985789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
986fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
9874c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
9884c80bfbdSHoward Hinnant        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
9894c80bfbdSHoward Hinnant            "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
9904c80bfbdSHoward Hinnant            " referring to this unordered_map");
991fd838227SEric Fiselier#else
992fd838227SEric Fiselier          ((void)__p);
993fcd02211SEric Fiselier#endif
994ad783ce9SDuncan P. N. Exon Smith        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
9954c80bfbdSHoward Hinnant    }
996fcd02211SEric Fiselier
997fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
998fcd02211SEric Fiselier
999bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
1000bc4c89a9SMarshall Clow    template <class... _Args>
1001bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1002bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1003bc4c89a9SMarshall Clow    {
100487c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
100587c4104dSEric Fiselier            _VSTD::forward_as_tuple(__k),
100687c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
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    {
101387c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
101487c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
101587c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1016bc4c89a9SMarshall Clow    }
1017bc4c89a9SMarshall Clow
1018bc4c89a9SMarshall Clow    template <class... _Args>
1019bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1020bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1021bc4c89a9SMarshall Clow    {
102287c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1023eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
102487c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
102587c4104dSEric Fiselier            " referring to this unordered_map");
1026fd838227SEric Fiselier#else
1027fd838227SEric Fiselier        ((void)__h);
102887c4104dSEric Fiselier#endif
102987c4104dSEric Fiselier        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1030bc4c89a9SMarshall Clow    }
1031bc4c89a9SMarshall Clow
1032bc4c89a9SMarshall Clow    template <class... _Args>
1033bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1034bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1035bc4c89a9SMarshall Clow    {
103687c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1037eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
103887c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
103987c4104dSEric Fiselier            " referring to this unordered_map");
1040fd838227SEric Fiselier#else
1041fd838227SEric Fiselier        ((void)__h);
104287c4104dSEric Fiselier#endif
104387c4104dSEric Fiselier        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1044bc4c89a9SMarshall Clow    }
1045bc4c89a9SMarshall Clow
1046bc4c89a9SMarshall Clow    template <class _Vp>
1047bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1048bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1049bc4c89a9SMarshall Clow    {
105087c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
105187c4104dSEric Fiselier            __k, _VSTD::forward<_Vp>(__v));
105287c4104dSEric Fiselier        if (!__res.second) {
105387c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1054bc4c89a9SMarshall Clow        }
105587c4104dSEric Fiselier        return __res;
1056bc4c89a9SMarshall Clow    }
1057bc4c89a9SMarshall Clow
1058bc4c89a9SMarshall Clow    template <class _Vp>
1059bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1060bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1061bc4c89a9SMarshall Clow    {
106287c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
106387c4104dSEric Fiselier            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
106487c4104dSEric Fiselier        if (!__res.second) {
106587c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1066bc4c89a9SMarshall Clow        }
106787c4104dSEric Fiselier        return __res;
1068bc4c89a9SMarshall Clow    }
1069bc4c89a9SMarshall Clow
1070bc4c89a9SMarshall Clow    template <class _Vp>
1071bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1072fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1073bc4c89a9SMarshall Clow     {
1074fd838227SEric Fiselier          // FIXME: Add debug mode checking for the iterator input
107587c4104dSEric Fiselier          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1076bc4c89a9SMarshall Clow     }
1077bc4c89a9SMarshall Clow
1078bc4c89a9SMarshall Clow    template <class _Vp>
1079bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1080fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1081bc4c89a9SMarshall Clow     {
1082fd838227SEric Fiselier        // FIXME: Add debug mode checking for the iterator input
108387c4104dSEric Fiselier        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1084bc4c89a9SMarshall Clow     }
1085bc4c89a9SMarshall Clow#endif
1086bc4c89a9SMarshall Clow
1087789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10883e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1089789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1090ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1091ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10923e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1093789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10943e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
10953e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1096789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10973714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
10983e519524SHoward Hinnant
1099789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11003714107eSHoward Hinnant    void swap(unordered_map& __u)
11013714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
11023714107eSHoward Hinnant        { __table_.swap(__u.__table_);}
11033e519524SHoward Hinnant
1104789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11053e519524SHoward Hinnant    hasher hash_function() const
11063e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1107789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11083e519524SHoward Hinnant    key_equal key_eq() const
11093e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
11103e519524SHoward Hinnant
1111789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11123e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1113789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11143e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1115789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11163e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1117789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11183e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
11193e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1120789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11213e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
11223e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
11233e519524SHoward Hinnant
11243e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
11250f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11263e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
11273e519524SHoward Hinnant#endif
11283e519524SHoward Hinnant
11293e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
11303e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
11313e519524SHoward Hinnant
1132789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11333714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1134789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11353714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
11363e519524SHoward Hinnant
1137789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11383e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
11393e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1140789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11413e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
11423e519524SHoward Hinnant
1143789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11443e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1145789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11463e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1147789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11483e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1149789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11503e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1151789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11523e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1153789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11543e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
11553e519524SHoward Hinnant
1156789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11573714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1158789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11593714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1160789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11613e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1162789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11633e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1164789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11653e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
11663e519524SHoward Hinnant
1167b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1168b24c8024SHoward Hinnant
1169b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1170b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1171b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1172b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1173b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1174b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1175b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1176b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1177b24c8024SHoward Hinnant
1178b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1179b24c8024SHoward Hinnant
11803e519524SHoward Hinnantprivate:
11810f905677SEric Fiselier
11820f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
11834a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
11840f905677SEric Fiselier#endif
11853e519524SHoward Hinnant};
11863e519524SHoward Hinnant
11873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
11883e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
11893e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
11903e519524SHoward Hinnant    : __table_(__hf, __eql)
11913e519524SHoward Hinnant{
1192b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1193b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1194b24c8024SHoward Hinnant#endif
11953e519524SHoward Hinnant    __table_.rehash(__n);
11963e519524SHoward Hinnant}
11973e519524SHoward Hinnant
11983e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
11993e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12003e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
12013e519524SHoward Hinnant        const allocator_type& __a)
12022a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
12033e519524SHoward Hinnant{
1204b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1205b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1206b24c8024SHoward Hinnant#endif
12073e519524SHoward Hinnant    __table_.rehash(__n);
12083e519524SHoward Hinnant}
12093e519524SHoward Hinnant
12103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1211cd31b434SEvgeniy Stepanovinline
12123e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12133e519524SHoward Hinnant        const allocator_type& __a)
12142a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
12153e519524SHoward Hinnant{
1216b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1217b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1218b24c8024SHoward Hinnant#endif
12193e519524SHoward Hinnant}
12203e519524SHoward Hinnant
12213e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12223e519524SHoward Hinnanttemplate <class _InputIterator>
12233e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12243e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
12253e519524SHoward Hinnant{
1226b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1227b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1228b24c8024SHoward Hinnant#endif
12293e519524SHoward Hinnant    insert(__first, __last);
12303e519524SHoward Hinnant}
12313e519524SHoward Hinnant
12323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12333e519524SHoward Hinnanttemplate <class _InputIterator>
12343e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12353e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
12363e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
12373e519524SHoward Hinnant    : __table_(__hf, __eql)
12383e519524SHoward Hinnant{
1239b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1240b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1241b24c8024SHoward Hinnant#endif
12423e519524SHoward Hinnant    __table_.rehash(__n);
12433e519524SHoward Hinnant    insert(__first, __last);
12443e519524SHoward Hinnant}
12453e519524SHoward Hinnant
12463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12473e519524SHoward Hinnanttemplate <class _InputIterator>
12483e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12493e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
12503e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
12512a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
12523e519524SHoward Hinnant{
1253b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1254b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1255b24c8024SHoward Hinnant#endif
12563e519524SHoward Hinnant    __table_.rehash(__n);
12573e519524SHoward Hinnant    insert(__first, __last);
12583e519524SHoward Hinnant}
12593e519524SHoward Hinnant
12603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12613e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12623e519524SHoward Hinnant        const unordered_map& __u)
12633e519524SHoward Hinnant    : __table_(__u.__table_)
12643e519524SHoward Hinnant{
1265b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1266b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1267b24c8024SHoward Hinnant#endif
12683e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
12693e519524SHoward Hinnant    insert(__u.begin(), __u.end());
12703e519524SHoward Hinnant}
12713e519524SHoward Hinnant
12723e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
12733e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12743e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
12752a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
12763e519524SHoward Hinnant{
1277b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1278b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1279b24c8024SHoward Hinnant#endif
12803e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
12813e519524SHoward Hinnant    insert(__u.begin(), __u.end());
12823e519524SHoward Hinnant}
12833e519524SHoward Hinnant
12847609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
12853e519524SHoward Hinnant
12863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1287cd31b434SEvgeniy Stepanovinline
12883e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
12893e519524SHoward Hinnant        unordered_map&& __u)
12903714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1291ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
12923e519524SHoward Hinnant{
1293b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1294b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
12954c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1296b24c8024SHoward Hinnant#endif
12973e519524SHoward Hinnant}
12983e519524SHoward Hinnant
12993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13003e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13013e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
13022a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
13033e519524SHoward Hinnant{
1304b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1305b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1306b24c8024SHoward Hinnant#endif
13073e519524SHoward Hinnant    if (__a != __u.get_allocator())
13083e519524SHoward Hinnant    {
13093e519524SHoward Hinnant        iterator __i = __u.begin();
1310fcd02211SEric Fiselier        while (__u.size() != 0) {
1311fcd02211SEric Fiselier            __table_.__emplace_unique(_VSTD::move(
1312fcd02211SEric Fiselier                __u.__table_.remove((__i++).__i_)->__value_.__nc));
1313fcd02211SEric Fiselier        }
13143e519524SHoward Hinnant    }
13154c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
13164c80bfbdSHoward Hinnant    else
13174c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
13184c80bfbdSHoward Hinnant#endif
13193e519524SHoward Hinnant}
13203e519524SHoward Hinnant
13217609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
13223e519524SHoward Hinnant
132354976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
132454976f26SHoward 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        initializer_list<value_type> __il)
13283e519524SHoward Hinnant{
1329b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1330b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1331b24c8024SHoward Hinnant#endif
13323e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13333e519524SHoward Hinnant}
13343e519524SHoward Hinnant
13353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13363e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13373e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
13383e519524SHoward Hinnant        const key_equal& __eql)
13393e519524SHoward Hinnant    : __table_(__hf, __eql)
13403e519524SHoward Hinnant{
1341b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1342b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1343b24c8024SHoward Hinnant#endif
13443e519524SHoward Hinnant    __table_.rehash(__n);
13453e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13463e519524SHoward Hinnant}
13473e519524SHoward Hinnant
13483e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13493e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13503e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
13513e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
13522a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
13533e519524SHoward Hinnant{
1354b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1355b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1356b24c8024SHoward Hinnant#endif
13573e519524SHoward Hinnant    __table_.rehash(__n);
13583e519524SHoward Hinnant    insert(__il.begin(), __il.end());
13593e519524SHoward Hinnant}
13603e519524SHoward Hinnant
136154976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
136254976f26SHoward Hinnant
13637609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
13643e519524SHoward Hinnant
13653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1366cd31b434SEvgeniy Stepanovinline
13673e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
13683e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
13693714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
13703e519524SHoward Hinnant{
1371ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
13723e519524SHoward Hinnant    return *this;
13733e519524SHoward Hinnant}
13743e519524SHoward Hinnant
13757609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
13763e519524SHoward Hinnant
137754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
137854976f26SHoward Hinnant
13793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1380cd31b434SEvgeniy Stepanovinline
13813e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
13823e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
13833e519524SHoward Hinnant        initializer_list<value_type> __il)
13843e519524SHoward Hinnant{
13853e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
13863e519524SHoward Hinnant    return *this;
13873e519524SHoward Hinnant}
13883e519524SHoward Hinnant
138954976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
139054976f26SHoward Hinnant
13910f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
13923e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13933e519524SHoward Hinnanttypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
13944a95f9ebSHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
13953e519524SHoward Hinnant{
13963e519524SHoward Hinnant    __node_allocator& __na = __table_.__node_alloc();
1397c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1398307f8143SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
13993e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1400307f8143SHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
14013e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1402251c6291SDimitry Andric    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
14033e519524SHoward Hinnant}
14040f905677SEric Fiselier#endif
14053e519524SHoward Hinnant
14063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14073e519524SHoward Hinnanttemplate <class _InputIterator>
1408cd31b434SEvgeniy Stepanovinline
14093e519524SHoward Hinnantvoid
14103e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
14113e519524SHoward Hinnant                                                       _InputIterator __last)
14123e519524SHoward Hinnant{
14133e519524SHoward Hinnant    for (; __first != __last; ++__first)
14143e519524SHoward Hinnant        __table_.__insert_unique(*__first);
14153e519524SHoward Hinnant}
14163e519524SHoward Hinnant
14170f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
14183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14193e519524SHoward Hinnant_Tp&
14203e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
14213e519524SHoward Hinnant{
14223e519524SHoward Hinnant    iterator __i = find(__k);
14233e519524SHoward Hinnant    if (__i != end())
14243e519524SHoward Hinnant        return __i->second;
14254a95f9ebSHoward Hinnant    __node_holder __h = __construct_node_with_key(__k);
14263e519524SHoward Hinnant    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
14273e519524SHoward Hinnant    __h.release();
14283e519524SHoward Hinnant    return __r.first->second;
14293e519524SHoward Hinnant}
14300f905677SEric Fiselier#else
14313e519524SHoward Hinnant
14320f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14330f905677SEric Fiselier_Tp&
14340f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
14350f905677SEric Fiselier{
14360f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
14370f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(__k),
14380f905677SEric Fiselier                                  std::forward_as_tuple()).first->__cc.second;
14390f905677SEric Fiselier}
14403e519524SHoward Hinnant
14413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14423e519524SHoward Hinnant_Tp&
14433e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
14443e519524SHoward Hinnant{
14450f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
14460f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
14470f905677SEric Fiselier                                  std::forward_as_tuple()).first->__cc.second;
14483e519524SHoward Hinnant}
14493e519524SHoward Hinnant
14500f905677SEric Fiselier#endif  // !_LIBCPP_CXX03_MODE
14513e519524SHoward Hinnant
14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14533e519524SHoward Hinnant_Tp&
14543e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
14553e519524SHoward Hinnant{
14563e519524SHoward Hinnant    iterator __i = find(__k);
14573e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14583e519524SHoward Hinnant    if (__i == end())
14593e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1460b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
14613e519524SHoward Hinnant    return __i->second;
14623e519524SHoward Hinnant}
14633e519524SHoward Hinnant
14643e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14653e519524SHoward Hinnantconst _Tp&
14663e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
14673e519524SHoward Hinnant{
14683e519524SHoward Hinnant    const_iterator __i = find(__k);
14693e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14703e519524SHoward Hinnant    if (__i == end())
14713e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1472b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
14733e519524SHoward Hinnant    return __i->second;
14743e519524SHoward Hinnant}
14753e519524SHoward Hinnant
14763e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1477789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14783e519524SHoward Hinnantvoid
14793e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
14803e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
14813714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
14823e519524SHoward Hinnant{
14833e519524SHoward Hinnant    __x.swap(__y);
14843e519524SHoward Hinnant}
14853e519524SHoward Hinnant
14863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14873e519524SHoward Hinnantbool
14883e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
14893e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
14903e519524SHoward Hinnant{
14913e519524SHoward Hinnant    if (__x.size() != __y.size())
14923e519524SHoward Hinnant        return false;
14933e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
14943e519524SHoward Hinnant                                                                 const_iterator;
14953e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
14963e519524SHoward Hinnant            __i != __ex; ++__i)
14973e519524SHoward Hinnant    {
14983e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
14993e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
15003e519524SHoward Hinnant            return false;
15013e519524SHoward Hinnant    }
15023e519524SHoward Hinnant    return true;
15033e519524SHoward Hinnant}
15043e519524SHoward Hinnant
15053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1506789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15073e519524SHoward Hinnantbool
15083e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
15093e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
15103e519524SHoward Hinnant{
15113e519524SHoward Hinnant    return !(__x == __y);
15123e519524SHoward Hinnant}
15133e519524SHoward Hinnant
15143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
15153e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1516*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap
15173e519524SHoward Hinnant{
15183e519524SHoward Hinnantpublic:
15193e519524SHoward Hinnant    // types
15203e519524SHoward Hinnant    typedef _Key                                           key_type;
15213e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
15223e519524SHoward Hinnant    typedef _Hash                                          hasher;
15233e519524SHoward Hinnant    typedef _Pred                                          key_equal;
15243e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
15253e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
1526307f8143SHoward Hinnant    typedef pair<key_type, mapped_type>                    __nc_value_type;
15273e519524SHoward Hinnant    typedef value_type&                                    reference;
15283e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1529b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1530b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
15313e519524SHoward Hinnant
15323e519524SHoward Hinnantprivate:
15339fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1534abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1535abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
15361f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
15371f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
15383e519524SHoward Hinnant
15393e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
15403e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
15413e519524SHoward Hinnant
15423e519524SHoward Hinnant    __table __table_;
15433e519524SHoward Hinnant
1544fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
15453e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
15463e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
15473e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1548c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1549c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
15503e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
155175d0dcfdSEric Fiselier    static_assert((is_same<typename __node_traits::size_type,
155275d0dcfdSEric Fiselier                          typename __alloc_traits::size_type>::value),
155375d0dcfdSEric Fiselier                 "Allocator uses different size_type for different types");
15543e519524SHoward Hinnantpublic:
15553e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
15563e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
155775d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
155875d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
15593e519524SHoward Hinnant
15603e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
15613e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
15623e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
15633e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
15643e519524SHoward Hinnant
1565789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15663714107eSHoward Hinnant    unordered_multimap()
15673714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1568b24c8024SHoward Hinnant        {
1569b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1570b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
1571b24c8024SHoward Hinnant#endif
1572b24c8024SHoward Hinnant        }
15733e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
15743e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
15753e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
15763e519524SHoward Hinnant                                const key_equal& __eql,
15773e519524SHoward Hinnant                                const allocator_type& __a);
15783e519524SHoward Hinnant    template <class _InputIterator>
15793e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
15803e519524SHoward Hinnant    template <class _InputIterator>
15813e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
15823e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
15833e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
15843e519524SHoward Hinnant    template <class _InputIterator>
15853e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
15863e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
15873e519524SHoward Hinnant                      const key_equal& __eql,
15883e519524SHoward Hinnant                      const allocator_type& __a);
1589cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15903e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
15913e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
15923e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
15937609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1594cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
15953714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
15963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
15973e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
15987609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
159954976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16003e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
16013e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
16023e519524SHoward Hinnant                       const hasher& __hf = hasher(),
16033e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
16043e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
16053e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
16063e519524SHoward Hinnant                       const allocator_type& __a);
160754976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16083cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
16093cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16103cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
16113cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
16123cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16133cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
16143cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
16153cd37e64SMarshall Clow    template <class _InputIterator>
16163cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16173cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
16183cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
16193cd37e64SMarshall Clow    template <class _InputIterator>
16203cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16213cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
16223cd37e64SMarshall Clow        const allocator_type& __a)
16233cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
16243cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16253cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
16263cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
16273cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
16283cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
16293cd37e64SMarshall Clow      const allocator_type& __a)
16303cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
16313cd37e64SMarshall Clow#endif
16323e519524SHoward Hinnant    // ~unordered_multimap() = default;
16335a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16345a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
16355a33687dSHoward Hinnant    {
16362ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
16375a33687dSHoward Hinnant        __table_ = __u.__table_;
1638307f8143SHoward Hinnant#else
163974cf6ff5SMarshall Clow        if (this != &__u) {
1640307f8143SHoward Hinnant            __table_.clear();
1641307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1642307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1643307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1644307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1645307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
164674cf6ff5SMarshall Clow        }
1647307f8143SHoward Hinnant#endif
16485a33687dSHoward Hinnant        return *this;
16495a33687dSHoward Hinnant    }
16507609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1651cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
16523714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
16533714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
16543e519524SHoward Hinnant#endif
165554976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1656cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
16573e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
165854976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16593e519524SHoward Hinnant
1660789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16613714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
16623e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
16633e519524SHoward Hinnant
1664789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16653714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1666789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16673714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1668789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16693714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
16703e519524SHoward Hinnant
1671789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16723714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1673789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16743714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1675789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16763714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1677789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16783714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1679789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16803714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1681789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16823714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
16833e519524SHoward Hinnant
16847a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
16857a9f500fSEric Fiselier    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
16867a9f500fSEric Fiselier
16877a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
16887a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x)
16897a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, __x);}
16907a9f500fSEric Fiselier
16917a9f500fSEric Fiselier    template <class _InputIterator>
1692cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
16937a9f500fSEric Fiselier    void insert(_InputIterator __first, _InputIterator __last);
16947a9f500fSEric Fiselier
16957a9f500fSEric Fiselier#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
16967a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
16977a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
16987a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
16997a9f500fSEric Fiselier#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
17007a9f500fSEric Fiselier
1701fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17027a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17037a9f500fSEric Fiselier    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
17047a9f500fSEric Fiselier
17057a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17067a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x)
17077a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
17087a9f500fSEric Fiselier
17097a9f500fSEric Fiselier    template <class _Pp,
17107a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
17117a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17127a9f500fSEric Fiselier    iterator insert(_Pp&& __x)
17137a9f500fSEric Fiselier        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
17147a9f500fSEric Fiselier
17157a9f500fSEric Fiselier    template <class _Pp,
17167a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
17177a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17187a9f500fSEric Fiselier    iterator insert(const_iterator __p, _Pp&& __x)
17197a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
17207a9f500fSEric Fiselier
1721fcd02211SEric Fiselier    template <class... _Args>
1722fcd02211SEric Fiselier    iterator emplace(_Args&&... __args) {
1723fcd02211SEric Fiselier        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1724fcd02211SEric Fiselier    }
17257609c9b6SHoward Hinnant
17268b805c91SHoward Hinnant    template <class... _Args>
1727fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1728fcd02211SEric Fiselier        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1729fcd02211SEric Fiselier    }
1730fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
17313e519524SHoward Hinnant
17323e519524SHoward Hinnant
1733789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17343e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1735789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1736ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1737ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17383e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1739789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17403e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
17413e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1742789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17433714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
17443e519524SHoward Hinnant
1745789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17463714107eSHoward Hinnant    void swap(unordered_multimap& __u)
17473714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
17483714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
17493e519524SHoward Hinnant
1750789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17513e519524SHoward Hinnant    hasher hash_function() const
17523e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1753789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17543e519524SHoward Hinnant    key_equal key_eq() const
17553e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
17563e519524SHoward Hinnant
1757789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17583e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1759789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17603e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1761789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17623e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1763789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17643e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
17653e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
1766789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17673e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
17683e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
17693e519524SHoward Hinnant
1770789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17713714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1772789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17733714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
17743714107eSHoward Hinnant        {return __table_.max_bucket_count();}
17753e519524SHoward Hinnant
1776789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17773e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
17783e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1779789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17803e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
17813e519524SHoward Hinnant
1782789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17833e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1784789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17853e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1786789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17873e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1788789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17893e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1790789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17913e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1792789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17933e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
17943e519524SHoward Hinnant
1795789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17963714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1797789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17983714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1799789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18003e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1801789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18023e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1803789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18043e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
18053e519524SHoward Hinnant
1806b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1807b24c8024SHoward Hinnant
1808b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1809b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1810b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1811b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1812b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1813b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1814b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1815b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1816b24c8024SHoward Hinnant
1817b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1818b24c8024SHoward Hinnant
1819fcd02211SEric Fiselier
18203e519524SHoward Hinnant};
18213e519524SHoward Hinnant
18223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18233e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18243e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
18253e519524SHoward Hinnant    : __table_(__hf, __eql)
18263e519524SHoward Hinnant{
1827b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1828b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1829b24c8024SHoward Hinnant#endif
18303e519524SHoward Hinnant    __table_.rehash(__n);
18313e519524SHoward Hinnant}
18323e519524SHoward Hinnant
18333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18353e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
18363e519524SHoward Hinnant        const allocator_type& __a)
18372a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
18383e519524SHoward Hinnant{
1839b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1840b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1841b24c8024SHoward Hinnant#endif
18423e519524SHoward Hinnant    __table_.rehash(__n);
18433e519524SHoward Hinnant}
18443e519524SHoward Hinnant
18453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18463e519524SHoward Hinnanttemplate <class _InputIterator>
18473e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18483e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
18493e519524SHoward Hinnant{
1850b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1851b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1852b24c8024SHoward Hinnant#endif
18533e519524SHoward Hinnant    insert(__first, __last);
18543e519524SHoward Hinnant}
18553e519524SHoward Hinnant
18563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18573e519524SHoward Hinnanttemplate <class _InputIterator>
18583e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18593e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
18603e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
18613e519524SHoward Hinnant    : __table_(__hf, __eql)
18623e519524SHoward Hinnant{
1863b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1864b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1865b24c8024SHoward Hinnant#endif
18663e519524SHoward Hinnant    __table_.rehash(__n);
18673e519524SHoward Hinnant    insert(__first, __last);
18683e519524SHoward Hinnant}
18693e519524SHoward Hinnant
18703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18713e519524SHoward Hinnanttemplate <class _InputIterator>
18723e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18733e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
18743e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
18752a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
18763e519524SHoward Hinnant{
1877b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1878b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1879b24c8024SHoward Hinnant#endif
18803e519524SHoward Hinnant    __table_.rehash(__n);
18813e519524SHoward Hinnant    insert(__first, __last);
18823e519524SHoward Hinnant}
18833e519524SHoward Hinnant
18843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1885cd31b434SEvgeniy Stepanovinline
18863e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18873e519524SHoward Hinnant        const allocator_type& __a)
18882a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
18893e519524SHoward Hinnant{
1890b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1891b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1892b24c8024SHoward Hinnant#endif
18933e519524SHoward Hinnant}
18943e519524SHoward Hinnant
18953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
18963e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
18973e519524SHoward Hinnant        const unordered_multimap& __u)
18983e519524SHoward Hinnant    : __table_(__u.__table_)
18993e519524SHoward Hinnant{
1900b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1901b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1902b24c8024SHoward Hinnant#endif
19033e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
19043e519524SHoward Hinnant    insert(__u.begin(), __u.end());
19053e519524SHoward Hinnant}
19063e519524SHoward Hinnant
19073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19083e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19093e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
19102a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
19113e519524SHoward Hinnant{
1912b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1913b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1914b24c8024SHoward Hinnant#endif
19153e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
19163e519524SHoward Hinnant    insert(__u.begin(), __u.end());
19173e519524SHoward Hinnant}
19183e519524SHoward Hinnant
19197609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
19203e519524SHoward Hinnant
19213e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1922cd31b434SEvgeniy Stepanovinline
19233e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19243e519524SHoward Hinnant        unordered_multimap&& __u)
19253714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1926ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
19273e519524SHoward Hinnant{
1928b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1929b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
19304c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1931b24c8024SHoward Hinnant#endif
19323e519524SHoward Hinnant}
19333e519524SHoward Hinnant
19343e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19353e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19363e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
19372a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
19383e519524SHoward Hinnant{
1939b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1940b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1941b24c8024SHoward Hinnant#endif
19423e519524SHoward Hinnant    if (__a != __u.get_allocator())
19433e519524SHoward Hinnant    {
19443e519524SHoward Hinnant        iterator __i = __u.begin();
19453e519524SHoward Hinnant        while (__u.size() != 0)
19463e519524SHoward Hinnant        {
19473e519524SHoward Hinnant            __table_.__insert_multi(
1948fcd02211SEric Fiselier                      _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_.__nc)
19493e519524SHoward Hinnant                                   );
19503e519524SHoward Hinnant        }
19513e519524SHoward Hinnant    }
19524c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
19534c80bfbdSHoward Hinnant    else
19544c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
19554c80bfbdSHoward Hinnant#endif
19563e519524SHoward Hinnant}
19573e519524SHoward Hinnant
19587609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
19593e519524SHoward Hinnant
196054976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
196154976f26SHoward Hinnant
19623e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19633e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19643e519524SHoward Hinnant        initializer_list<value_type> __il)
19653e519524SHoward Hinnant{
1966b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1967b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1968b24c8024SHoward Hinnant#endif
19693e519524SHoward Hinnant    insert(__il.begin(), __il.end());
19703e519524SHoward Hinnant}
19713e519524SHoward Hinnant
19723e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19733e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19743e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
19753e519524SHoward Hinnant        const key_equal& __eql)
19763e519524SHoward Hinnant    : __table_(__hf, __eql)
19773e519524SHoward Hinnant{
1978b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1979b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1980b24c8024SHoward Hinnant#endif
19813e519524SHoward Hinnant    __table_.rehash(__n);
19823e519524SHoward Hinnant    insert(__il.begin(), __il.end());
19833e519524SHoward Hinnant}
19843e519524SHoward Hinnant
19853e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
19863e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
19873e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
19883e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
19892a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
19903e519524SHoward Hinnant{
1991b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1992b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1993b24c8024SHoward Hinnant#endif
19943e519524SHoward Hinnant    __table_.rehash(__n);
19953e519524SHoward Hinnant    insert(__il.begin(), __il.end());
19963e519524SHoward Hinnant}
19973e519524SHoward Hinnant
199854976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
199954976f26SHoward Hinnant
20007609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
20013e519524SHoward Hinnant
20023e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2003cd31b434SEvgeniy Stepanovinline
20043e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
20053e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
20063714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
20073e519524SHoward Hinnant{
2008ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
20093e519524SHoward Hinnant    return *this;
20103e519524SHoward Hinnant}
20113e519524SHoward Hinnant
20127609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
20133e519524SHoward Hinnant
201454976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
201554976f26SHoward Hinnant
20163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2017cd31b434SEvgeniy Stepanovinline
20183e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
20193e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
20203e519524SHoward Hinnant        initializer_list<value_type> __il)
20213e519524SHoward Hinnant{
20223e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
20233e519524SHoward Hinnant    return *this;
20243e519524SHoward Hinnant}
20253e519524SHoward Hinnant
202654976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
202754976f26SHoward Hinnant
20283e519524SHoward Hinnant
20293e519524SHoward Hinnant
20303e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20313e519524SHoward Hinnanttemplate <class _InputIterator>
2032cd31b434SEvgeniy Stepanovinline
20333e519524SHoward Hinnantvoid
20343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
20353e519524SHoward Hinnant                                                            _InputIterator __last)
20363e519524SHoward Hinnant{
20373e519524SHoward Hinnant    for (; __first != __last; ++__first)
20383e519524SHoward Hinnant        __table_.__insert_multi(*__first);
20393e519524SHoward Hinnant}
20403e519524SHoward Hinnant
20413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2042789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20433e519524SHoward Hinnantvoid
20443e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
20453e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
20463714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
20473e519524SHoward Hinnant{
20483e519524SHoward Hinnant    __x.swap(__y);
20493e519524SHoward Hinnant}
20503e519524SHoward Hinnant
20513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20523e519524SHoward Hinnantbool
20533e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
20543e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
20553e519524SHoward Hinnant{
20563e519524SHoward Hinnant    if (__x.size() != __y.size())
20573e519524SHoward Hinnant        return false;
20583e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
20593e519524SHoward Hinnant                                                                 const_iterator;
20603e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
20613e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
20623e519524SHoward Hinnant    {
20633e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
20643e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2065ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2066ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2067ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
20683e519524SHoward Hinnant            return false;
20693e519524SHoward Hinnant        __i = __xeq.second;
20703e519524SHoward Hinnant    }
20713e519524SHoward Hinnant    return true;
20723e519524SHoward Hinnant}
20733e519524SHoward Hinnant
20743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2075789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20763e519524SHoward Hinnantbool
20773e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
20783e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
20793e519524SHoward Hinnant{
20803e519524SHoward Hinnant    return !(__x == __y);
20813e519524SHoward Hinnant}
20823e519524SHoward Hinnant
20833e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
20843e519524SHoward Hinnant
20853e519524SHoward Hinnant#endif  // _LIBCPP_UNORDERED_MAP
2086