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
47b0386a51SErik Pilkington    typedef unspecified                             node_type;            // C++17
48b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type;   // C++17
49b0386a51SErik Pilkington
503714107eSHoward Hinnant    unordered_map()
513714107eSHoward Hinnant        noexcept(
523714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
533714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
543714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
553714107eSHoward Hinnant    explicit unordered_map(size_type n, const hasher& hf = hasher(),
563e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
573e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
583e519524SHoward Hinnant    template <class InputIterator>
593e519524SHoward Hinnant        unordered_map(InputIterator f, InputIterator l,
603e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
613e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
623e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
633e519524SHoward Hinnant    explicit unordered_map(const allocator_type&);
643e519524SHoward Hinnant    unordered_map(const unordered_map&);
653e519524SHoward Hinnant    unordered_map(const unordered_map&, const Allocator&);
663714107eSHoward Hinnant    unordered_map(unordered_map&&)
673714107eSHoward Hinnant        noexcept(
683714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
693714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
703714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
713e519524SHoward Hinnant    unordered_map(unordered_map&&, const Allocator&);
723e519524SHoward Hinnant    unordered_map(initializer_list<value_type>, size_type n = 0,
733e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
743e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
753cd37e64SMarshall Clow    unordered_map(size_type n, const allocator_type& a)
763cd37e64SMarshall Clow      : unordered_map(n, hasher(), key_equal(), a) {}  // C++14
773cd37e64SMarshall Clow    unordered_map(size_type n, const hasher& hf, const allocator_type& a)
783cd37e64SMarshall Clow      : unordered_map(n, hf, key_equal(), a) {}  // C++14
793cd37e64SMarshall Clow    template <class InputIterator>
803cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
813cd37e64SMarshall Clow      : unordered_map(f, l, n, hasher(), key_equal(), a) {}  // C++14
823cd37e64SMarshall Clow    template <class InputIterator>
833cd37e64SMarshall Clow      unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf,
843cd37e64SMarshall Clow        const allocator_type& a)
853cd37e64SMarshall Clow      : unordered_map(f, l, n, hf, key_equal(), a) {}  // C++14
863cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a)
873cd37e64SMarshall Clow      : unordered_map(il, n, hasher(), key_equal(), a) {}  // C++14
883cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf,
893cd37e64SMarshall Clow      const allocator_type& a)
903cd37e64SMarshall Clow      : unordered_map(il, n, hf, key_equal(), a) {}  // C++14
913e519524SHoward Hinnant    ~unordered_map();
923e519524SHoward Hinnant    unordered_map& operator=(const unordered_map&);
933714107eSHoward Hinnant    unordered_map& operator=(unordered_map&&)
943714107eSHoward Hinnant        noexcept(
953714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
963714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
973714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
983714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
993e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type>);
1003e519524SHoward Hinnant
1013714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
1023e519524SHoward Hinnant
1033714107eSHoward Hinnant    bool      empty() const noexcept;
1043714107eSHoward Hinnant    size_type size() const noexcept;
1053714107eSHoward Hinnant    size_type max_size() const noexcept;
1063e519524SHoward Hinnant
1073714107eSHoward Hinnant    iterator       begin() noexcept;
1083714107eSHoward Hinnant    iterator       end() noexcept;
1093714107eSHoward Hinnant    const_iterator begin()  const noexcept;
1103714107eSHoward Hinnant    const_iterator end()    const noexcept;
1113714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
1123714107eSHoward Hinnant    const_iterator cend()   const noexcept;
1133e519524SHoward Hinnant
1143e519524SHoward Hinnant    template <class... Args>
1153e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1163e519524SHoward Hinnant    template <class... Args>
1173e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1183e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& obj);
1193e519524SHoward Hinnant    template <class P>
1203e519524SHoward Hinnant        pair<iterator, bool> insert(P&& obj);
1213e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
1223e519524SHoward Hinnant    template <class P>
1233e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
1243e519524SHoward Hinnant    template <class InputIterator>
1253e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1263e519524SHoward Hinnant    void insert(initializer_list<value_type>);
1273e519524SHoward Hinnant
128b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
129b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
130b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
131b0386a51SErik Pilkington    iterator           insert(const_iterator hint, node_type&& nh);                   // C++17
132b0386a51SErik Pilkington
133bc4c89a9SMarshall Clow    template <class... Args>
134bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
135bc4c89a9SMarshall Clow    template <class... Args>
136bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
137bc4c89a9SMarshall Clow    template <class... Args>
138bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
139bc4c89a9SMarshall Clow    template <class... Args>
140bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
141bc4c89a9SMarshall Clow    template <class M>
142bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
143bc4c89a9SMarshall Clow    template <class M>
144bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
145bc4c89a9SMarshall Clow    template <class M>
146bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
147bc4c89a9SMarshall Clow    template <class M>
148bc4c89a9SMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
149bc4c89a9SMarshall Clow
1503e519524SHoward Hinnant    iterator erase(const_iterator position);
151ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
1523e519524SHoward Hinnant    size_type erase(const key_type& k);
1533e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
1543714107eSHoward Hinnant    void clear() noexcept;
1553e519524SHoward Hinnant
156*5c4e07aeSErik Pilkington    template<class H2, class P2>
157*5c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
158*5c4e07aeSErik Pilkington    template<class H2, class P2>
159*5c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
160*5c4e07aeSErik Pilkington    template<class H2, class P2>
161*5c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
162*5c4e07aeSErik Pilkington    template<class H2, class P2>
163*5c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
164*5c4e07aeSErik Pilkington
1653714107eSHoward Hinnant    void swap(unordered_map&)
1663714107eSHoward Hinnant        noexcept(
1673714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
1683714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
1693714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
1703714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
1713e519524SHoward Hinnant
1723e519524SHoward Hinnant    hasher hash_function() const;
1733e519524SHoward Hinnant    key_equal key_eq() const;
1743e519524SHoward Hinnant
1753e519524SHoward Hinnant    iterator       find(const key_type& k);
1763e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1773e519524SHoward Hinnant    size_type count(const key_type& k) const;
1783e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
1793e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
1803e519524SHoward Hinnant
1813e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1823e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1833e519524SHoward Hinnant
1843e519524SHoward Hinnant    mapped_type&       at(const key_type& k);
1853e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1863e519524SHoward Hinnant
1873714107eSHoward Hinnant    size_type bucket_count() const noexcept;
1883714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
1893e519524SHoward Hinnant
1903e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
1913e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
1923e519524SHoward Hinnant
1933e519524SHoward Hinnant    local_iterator       begin(size_type n);
1943e519524SHoward Hinnant    local_iterator       end(size_type n);
1953e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
1963e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
1973e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
1983e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
1993e519524SHoward Hinnant
2003714107eSHoward Hinnant    float load_factor() const noexcept;
2013714107eSHoward Hinnant    float max_load_factor() const noexcept;
2023e519524SHoward Hinnant    void max_load_factor(float z);
2033e519524SHoward Hinnant    void rehash(size_type n);
2043e519524SHoward Hinnant    void reserve(size_type n);
2053e519524SHoward Hinnant};
2063e519524SHoward Hinnant
2073e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2083e519524SHoward Hinnant    void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
2093714107eSHoward Hinnant              unordered_map<Key, T, Hash, Pred, Alloc>& y)
2103714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
2113e519524SHoward Hinnant
2123e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2133e519524SHoward Hinnant    bool
2143e519524SHoward Hinnant    operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2153e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2163e519524SHoward Hinnant
2173e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
2183e519524SHoward Hinnant    bool
2193e519524SHoward Hinnant    operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x,
2203e519524SHoward Hinnant               const unordered_map<Key, T, Hash, Pred, Alloc>& y);
2213e519524SHoward Hinnant
2223e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
2233e519524SHoward Hinnant          class Alloc = allocator<pair<const Key, T>>>
2243e519524SHoward Hinnantclass unordered_multimap
2253e519524SHoward Hinnant{
2263e519524SHoward Hinnantpublic:
2273e519524SHoward Hinnant    // types
2283e519524SHoward Hinnant    typedef Key                                                        key_type;
2293e519524SHoward Hinnant    typedef T                                                          mapped_type;
2303e519524SHoward Hinnant    typedef Hash                                                       hasher;
2313e519524SHoward Hinnant    typedef Pred                                                       key_equal;
2323e519524SHoward Hinnant    typedef Alloc                                                      allocator_type;
2333e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>                          value_type;
2343e519524SHoward Hinnant    typedef value_type&                                                reference;
2353e519524SHoward Hinnant    typedef const value_type&                                          const_reference;
2363e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::pointer         pointer;
2373e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer;
2383e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::size_type       size_type;
2393e519524SHoward Hinnant    typedef typename allocator_traits<allocator_type>::difference_type difference_type;
2403e519524SHoward Hinnant
2413e519524SHoward Hinnant    typedef /unspecified/ iterator;
2423e519524SHoward Hinnant    typedef /unspecified/ const_iterator;
2433e519524SHoward Hinnant    typedef /unspecified/ local_iterator;
2443e519524SHoward Hinnant    typedef /unspecified/ const_local_iterator;
2453e519524SHoward Hinnant
246b0386a51SErik Pilkington    typedef unspecified node_type;    // C++17
247b0386a51SErik Pilkington
2483714107eSHoward Hinnant    unordered_multimap()
2493714107eSHoward Hinnant        noexcept(
2503714107eSHoward Hinnant            is_nothrow_default_constructible<hasher>::value &&
2513714107eSHoward Hinnant            is_nothrow_default_constructible<key_equal>::value &&
2523714107eSHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value);
2533714107eSHoward Hinnant    explicit unordered_multimap(size_type n, const hasher& hf = hasher(),
2543e519524SHoward Hinnant                           const key_equal& eql = key_equal(),
2553e519524SHoward Hinnant                           const allocator_type& a = allocator_type());
2563e519524SHoward Hinnant    template <class InputIterator>
2573e519524SHoward Hinnant        unordered_multimap(InputIterator f, InputIterator l,
2583e519524SHoward Hinnant                      size_type n = 0, const hasher& hf = hasher(),
2593e519524SHoward Hinnant                      const key_equal& eql = key_equal(),
2603e519524SHoward Hinnant                      const allocator_type& a = allocator_type());
2613e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type&);
2623e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&);
2633e519524SHoward Hinnant    unordered_multimap(const unordered_multimap&, const Allocator&);
2643714107eSHoward Hinnant    unordered_multimap(unordered_multimap&&)
2653714107eSHoward Hinnant        noexcept(
2663714107eSHoward Hinnant            is_nothrow_move_constructible<hasher>::value &&
2673714107eSHoward Hinnant            is_nothrow_move_constructible<key_equal>::value &&
2683714107eSHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value);
2693e519524SHoward Hinnant    unordered_multimap(unordered_multimap&&, const Allocator&);
2703e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type>, size_type n = 0,
2713e519524SHoward Hinnant                  const hasher& hf = hasher(), const key_equal& eql = key_equal(),
2723e519524SHoward Hinnant                  const allocator_type& a = allocator_type());
2733cd37e64SMarshall Clow    unordered_multimap(size_type n, const allocator_type& a)
2743cd37e64SMarshall Clow      : unordered_multimap(n, hasher(), key_equal(), a) {}  // C++14
2753cd37e64SMarshall Clow    unordered_multimap(size_type n, const hasher& hf, const allocator_type& a)
2763cd37e64SMarshall Clow      : unordered_multimap(n, hf, key_equal(), a) {}  // C++14
2773cd37e64SMarshall Clow    template <class InputIterator>
2783cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a)
2793cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hasher(), key_equal(), a) {}  // C++14
2803cd37e64SMarshall Clow    template <class InputIterator>
2813cd37e64SMarshall Clow      unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf,
2823cd37e64SMarshall Clow        const allocator_type& a)
2833cd37e64SMarshall Clow      : unordered_multimap(f, l, n, hf, key_equal(), a) {}  // C++14
2843cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a)
2853cd37e64SMarshall Clow      : unordered_multimap(il, n, hasher(), key_equal(), a) {}  // C++14
2863cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf,
2873cd37e64SMarshall Clow      const allocator_type& a)
2883cd37e64SMarshall Clow      : unordered_multimap(il, n, hf, key_equal(), a) {}  // C++14
2893e519524SHoward Hinnant    ~unordered_multimap();
2903e519524SHoward Hinnant    unordered_multimap& operator=(const unordered_multimap&);
2913714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&&)
2923714107eSHoward Hinnant        noexcept(
2933714107eSHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
2943714107eSHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
2953714107eSHoward Hinnant            is_nothrow_move_assignable<hasher>::value &&
2963714107eSHoward Hinnant            is_nothrow_move_assignable<key_equal>::value);
2973e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type>);
2983e519524SHoward Hinnant
2993714107eSHoward Hinnant    allocator_type get_allocator() const noexcept;
3003e519524SHoward Hinnant
3013714107eSHoward Hinnant    bool      empty() const noexcept;
3023714107eSHoward Hinnant    size_type size() const noexcept;
3033714107eSHoward Hinnant    size_type max_size() const noexcept;
3043e519524SHoward Hinnant
3053714107eSHoward Hinnant    iterator       begin() noexcept;
3063714107eSHoward Hinnant    iterator       end() noexcept;
3073714107eSHoward Hinnant    const_iterator begin()  const noexcept;
3083714107eSHoward Hinnant    const_iterator end()    const noexcept;
3093714107eSHoward Hinnant    const_iterator cbegin() const noexcept;
3103714107eSHoward Hinnant    const_iterator cend()   const noexcept;
3113e519524SHoward Hinnant
3123e519524SHoward Hinnant    template <class... Args>
3133e519524SHoward Hinnant        iterator emplace(Args&&... args);
3143e519524SHoward Hinnant    template <class... Args>
3153e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3163e519524SHoward Hinnant    iterator insert(const value_type& obj);
3173e519524SHoward Hinnant    template <class P>
3183e519524SHoward Hinnant        iterator insert(P&& obj);
3193e519524SHoward Hinnant    iterator insert(const_iterator hint, const value_type& obj);
3203e519524SHoward Hinnant    template <class P>
3213e519524SHoward Hinnant        iterator insert(const_iterator hint, P&& obj);
3223e519524SHoward Hinnant    template <class InputIterator>
3233e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3243e519524SHoward Hinnant    void insert(initializer_list<value_type>);
3253e519524SHoward Hinnant
326b0386a51SErik Pilkington    node_type extract(const_iterator position);                // C++17
327b0386a51SErik Pilkington    node_type extract(const key_type& x);                      // C++17
328b0386a51SErik Pilkington    iterator insert(node_type&& nh);                           // C++17
329b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);      // C++17
330b0386a51SErik Pilkington
3313e519524SHoward Hinnant    iterator erase(const_iterator position);
332ec392968SMarshall Clow    iterator erase(iterator position);  // C++14
3333e519524SHoward Hinnant    size_type erase(const key_type& k);
3343e519524SHoward Hinnant    iterator erase(const_iterator first, const_iterator last);
3353714107eSHoward Hinnant    void clear() noexcept;
3363e519524SHoward Hinnant
337*5c4e07aeSErik Pilkington    template<class H2, class P2>
338*5c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source);    // C++17
339*5c4e07aeSErik Pilkington    template<class H2, class P2>
340*5c4e07aeSErik Pilkington      void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source);   // C++17
341*5c4e07aeSErik Pilkington    template<class H2, class P2>
342*5c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>& source);         // C++17
343*5c4e07aeSErik Pilkington    template<class H2, class P2>
344*5c4e07aeSErik Pilkington      void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);        // C++17
345*5c4e07aeSErik Pilkington
3463714107eSHoward Hinnant    void swap(unordered_multimap&)
3473714107eSHoward Hinnant        noexcept(
3483714107eSHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3493714107eSHoward Hinnant             __is_nothrow_swappable<allocator_type>::value) &&
3503714107eSHoward Hinnant            __is_nothrow_swappable<hasher>::value &&
3513714107eSHoward Hinnant            __is_nothrow_swappable<key_equal>::value);
3523e519524SHoward Hinnant
3533e519524SHoward Hinnant    hasher hash_function() const;
3543e519524SHoward Hinnant    key_equal key_eq() const;
3553e519524SHoward Hinnant
3563e519524SHoward Hinnant    iterator       find(const key_type& k);
3573e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
3583e519524SHoward Hinnant    size_type count(const key_type& k) const;
3593e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& k);
3603e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
3613e519524SHoward Hinnant
3623714107eSHoward Hinnant    size_type bucket_count() const noexcept;
3633714107eSHoward Hinnant    size_type max_bucket_count() const noexcept;
3643e519524SHoward Hinnant
3653e519524SHoward Hinnant    size_type bucket_size(size_type n) const;
3663e519524SHoward Hinnant    size_type bucket(const key_type& k) const;
3673e519524SHoward Hinnant
3683e519524SHoward Hinnant    local_iterator       begin(size_type n);
3693e519524SHoward Hinnant    local_iterator       end(size_type n);
3703e519524SHoward Hinnant    const_local_iterator begin(size_type n) const;
3713e519524SHoward Hinnant    const_local_iterator end(size_type n) const;
3723e519524SHoward Hinnant    const_local_iterator cbegin(size_type n) const;
3733e519524SHoward Hinnant    const_local_iterator cend(size_type n) const;
3743e519524SHoward Hinnant
3753714107eSHoward Hinnant    float load_factor() const noexcept;
3763714107eSHoward Hinnant    float max_load_factor() const noexcept;
3773e519524SHoward Hinnant    void max_load_factor(float z);
3783e519524SHoward Hinnant    void rehash(size_type n);
3793e519524SHoward Hinnant    void reserve(size_type n);
3803e519524SHoward Hinnant};
3813e519524SHoward Hinnant
3823e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3833e519524SHoward Hinnant    void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3843714107eSHoward Hinnant              unordered_multimap<Key, T, Hash, Pred, Alloc>& y)
3853714107eSHoward Hinnant              noexcept(noexcept(x.swap(y)));
3863e519524SHoward Hinnant
3873e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3883e519524SHoward Hinnant    bool
3893e519524SHoward Hinnant    operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3903e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
3913e519524SHoward Hinnant
3923e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc>
3933e519524SHoward Hinnant    bool
3943e519524SHoward Hinnant    operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
3953e519524SHoward Hinnant               const unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
3963e519524SHoward Hinnant
3973e519524SHoward Hinnant}  // std
3983e519524SHoward Hinnant
3993e519524SHoward Hinnant*/
4003e519524SHoward Hinnant
4013e519524SHoward Hinnant#include <__config>
4023e519524SHoward Hinnant#include <__hash_table>
403b0386a51SErik Pilkington#include <__node_handle>
4043e519524SHoward Hinnant#include <functional>
4053e519524SHoward Hinnant#include <stdexcept>
4060f905677SEric Fiselier#include <tuple>
407f56972e2SMarshall Clow#include <version>
4083e519524SHoward Hinnant
409c1bd9197SEric Fiselier#include <__debug>
410c1bd9197SEric Fiselier
411073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4123e519524SHoward Hinnant#pragma GCC system_header
413073458b1SHoward Hinnant#endif
4143e519524SHoward Hinnant
4153e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4163e519524SHoward Hinnant
41704333f9bSEric Fiseliertemplate <class _Key, class _Cp, class _Hash, bool _IsEmpty>
4183e519524SHoward Hinnantclass __unordered_map_hasher
4193e519524SHoward Hinnant    : private _Hash
4203e519524SHoward Hinnant{
4213e519524SHoward Hinnantpublic:
422789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4233714107eSHoward Hinnant    __unordered_map_hasher()
4243714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4253714107eSHoward Hinnant        : _Hash() {}
426789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4273714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4283714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4293714107eSHoward Hinnant        : _Hash(__h) {}
430789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4313714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return *this;}
432789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
433a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
434f52318b4SErik Pilkington        {return static_cast<const _Hash&>(*this)(__x.__get_value().first);}
435a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
436a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4373e519524SHoward Hinnant        {return static_cast<const _Hash&>(*this)(__x);}
438e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
439e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
440e3fbe143SMarshall Clow    {
441e3fbe143SMarshall Clow        using _VSTD::swap;
442b3f57425SEric Fiselier        swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y));
443e3fbe143SMarshall Clow    }
4443e519524SHoward Hinnant};
4453e519524SHoward Hinnant
446abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Hash>
447abb160e6SHoward Hinnantclass __unordered_map_hasher<_Key, _Cp, _Hash, false>
4483e519524SHoward Hinnant{
4493e519524SHoward Hinnant    _Hash __hash_;
4503e519524SHoward Hinnantpublic:
451789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4523714107eSHoward Hinnant    __unordered_map_hasher()
4533714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value)
4543714107eSHoward Hinnant        : __hash_() {}
455789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4563714107eSHoward Hinnant    __unordered_map_hasher(const _Hash& __h)
4573714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value)
4583714107eSHoward Hinnant        : __hash_(__h) {}
459789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4603714107eSHoward Hinnant    const _Hash& hash_function() const _NOEXCEPT {return __hash_;}
461789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
462a1a9e771SHoward Hinnant    size_t operator()(const _Cp& __x) const
463f52318b4SErik Pilkington        {return __hash_(__x.__get_value().first);}
464a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
465a1a9e771SHoward Hinnant    size_t operator()(const _Key& __x) const
4663e519524SHoward Hinnant        {return __hash_(__x);}
467e3fbe143SMarshall Clow    void swap(__unordered_map_hasher&__y)
468e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value)
469e3fbe143SMarshall Clow    {
470e3fbe143SMarshall Clow        using _VSTD::swap;
471e3fbe143SMarshall Clow        swap(__hash_, __y.__hash_);
472e3fbe143SMarshall Clow    }
4733e519524SHoward Hinnant};
4743e519524SHoward Hinnant
475e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Hash, bool __b>
476e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
477e3fbe143SMarshall Clowvoid
478e3fbe143SMarshall Clowswap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x,
479e3fbe143SMarshall Clow     __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y)
480e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
481e3fbe143SMarshall Clow{
482e3fbe143SMarshall Clow    __x.swap(__y);
483e3fbe143SMarshall Clow}
484e3fbe143SMarshall Clow
48504333f9bSEric Fiseliertemplate <class _Key, class _Cp, class _Pred, bool _IsEmpty>
4863e519524SHoward Hinnantclass __unordered_map_equal
4873e519524SHoward Hinnant    : private _Pred
4883e519524SHoward Hinnant{
4893e519524SHoward Hinnantpublic:
490789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4913714107eSHoward Hinnant    __unordered_map_equal()
4923714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
4933714107eSHoward Hinnant        : _Pred() {}
494789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4953714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
4963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
4973714107eSHoward Hinnant        : _Pred(__p) {}
498789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4993714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return *this;}
500789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
501a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
502f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);}
503a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
504a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
505f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);}
506a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
507a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
508f52318b4SErik Pilkington        {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);}
509e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
510e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
511e3fbe143SMarshall Clow    {
512e3fbe143SMarshall Clow        using _VSTD::swap;
513b3f57425SEric Fiselier        swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y));
514e3fbe143SMarshall Clow    }
5153e519524SHoward Hinnant};
5163e519524SHoward Hinnant
517abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Pred>
518abb160e6SHoward Hinnantclass __unordered_map_equal<_Key, _Cp, _Pred, false>
5193e519524SHoward Hinnant{
5203e519524SHoward Hinnant    _Pred __pred_;
5213e519524SHoward Hinnantpublic:
522789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5233714107eSHoward Hinnant    __unordered_map_equal()
5243714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value)
5253714107eSHoward Hinnant        : __pred_() {}
526789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5273714107eSHoward Hinnant    __unordered_map_equal(const _Pred& __p)
5283714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value)
5293714107eSHoward Hinnant        : __pred_(__p) {}
530789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5313714107eSHoward Hinnant    const _Pred& key_eq() const _NOEXCEPT {return __pred_;}
532789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
533a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Cp& __y) const
534f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y.__get_value().first);}
535a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
536a1a9e771SHoward Hinnant    bool operator()(const _Cp& __x, const _Key& __y) const
537f52318b4SErik Pilkington        {return __pred_(__x.__get_value().first, __y);}
538a1a9e771SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
539a1a9e771SHoward Hinnant    bool operator()(const _Key& __x, const _Cp& __y) const
540f52318b4SErik Pilkington        {return __pred_(__x, __y.__get_value().first);}
541e3fbe143SMarshall Clow    void swap(__unordered_map_equal&__y)
542e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value)
543e3fbe143SMarshall Clow    {
544e3fbe143SMarshall Clow        using _VSTD::swap;
545e3fbe143SMarshall Clow        swap(__pred_, __y.__pred_);
546e3fbe143SMarshall Clow    }
5473e519524SHoward Hinnant};
5483e519524SHoward Hinnant
549e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Pred, bool __b>
550e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
551e3fbe143SMarshall Clowvoid
552e3fbe143SMarshall Clowswap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x,
553e3fbe143SMarshall Clow     __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y)
554e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
555e3fbe143SMarshall Clow{
556e3fbe143SMarshall Clow    __x.swap(__y);
557e3fbe143SMarshall Clow}
558e3fbe143SMarshall Clow
5593e519524SHoward Hinnanttemplate <class _Alloc>
5603e519524SHoward Hinnantclass __hash_map_node_destructor
5613e519524SHoward Hinnant{
5623e519524SHoward Hinnant    typedef _Alloc                              allocator_type;
5633e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
56475d0dcfdSEric Fiselier
5653e519524SHoward Hinnantpublic:
56675d0dcfdSEric Fiselier
5673e519524SHoward Hinnant    typedef typename __alloc_traits::pointer       pointer;
5683e519524SHoward Hinnantprivate:
5693e519524SHoward Hinnant
5703e519524SHoward Hinnant    allocator_type& __na_;
5713e519524SHoward Hinnant
5723e519524SHoward Hinnant    __hash_map_node_destructor& operator=(const __hash_map_node_destructor&);
5733e519524SHoward Hinnant
5743e519524SHoward Hinnantpublic:
5753e519524SHoward Hinnant    bool __first_constructed;
5763e519524SHoward Hinnant    bool __second_constructed;
5773e519524SHoward Hinnant
578789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5793714107eSHoward Hinnant    explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT
5803e519524SHoward Hinnant        : __na_(__na),
5813e519524SHoward Hinnant          __first_constructed(false),
5823e519524SHoward Hinnant          __second_constructed(false)
5833e519524SHoward Hinnant        {}
5843e519524SHoward Hinnant
5856a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
586789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5873e519524SHoward Hinnant    __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x)
5883714107eSHoward Hinnant        _NOEXCEPT
5893e519524SHoward Hinnant        : __na_(__x.__na_),
5903e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5913e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5923e519524SHoward Hinnant        {
5933e519524SHoward Hinnant            __x.__value_constructed = false;
5943e519524SHoward Hinnant        }
5956a470bcbSEric Fiselier#else  // _LIBCPP_CXX03_LANG
596789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5973e519524SHoward Hinnant    __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x)
5983e519524SHoward Hinnant        : __na_(__x.__na_),
5993e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6003e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6013e519524SHoward Hinnant        {
6023e519524SHoward Hinnant            const_cast<bool&>(__x.__value_constructed) = false;
6033e519524SHoward Hinnant        }
6046a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6053e519524SHoward Hinnant
606789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6073714107eSHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6083e519524SHoward Hinnant    {
6093e519524SHoward Hinnant        if (__second_constructed)
610f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6113e519524SHoward Hinnant        if (__first_constructed)
612f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6133e519524SHoward Hinnant        if (__p)
6143e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6153e519524SHoward Hinnant    }
6163e519524SHoward Hinnant};
6173e519524SHoward Hinnant
618fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6199fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
620f52318b4SErik Pilkingtonstruct __hash_value_type
6219fd9f84fSHoward Hinnant{
6229fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6239fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6249fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
625f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
626f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
6279fd9f84fSHoward Hinnant
628f52318b4SErik Pilkingtonprivate:
6299fd9f84fSHoward Hinnant    value_type __cc;
630f52318b4SErik Pilkington
631f52318b4SErik Pilkingtonpublic:
632f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
633f52318b4SErik Pilkington    value_type& __get_value()
634f52318b4SErik Pilkington    {
635f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
636f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
637f52318b4SErik Pilkington#else
638f52318b4SErik Pilkington        return __cc;
639f52318b4SErik Pilkington#endif
640f52318b4SErik Pilkington    }
641f52318b4SErik Pilkington
642f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
643f52318b4SErik Pilkington    const value_type& __get_value() const
644f52318b4SErik Pilkington    {
645f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
646f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
647f52318b4SErik Pilkington#else
648f52318b4SErik Pilkington        return __cc;
649f52318b4SErik Pilkington#endif
650f52318b4SErik Pilkington    }
651f52318b4SErik Pilkington
652f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
653f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
654f52318b4SErik Pilkington    {
655f52318b4SErik Pilkington        value_type& __v = __get_value();
656f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
657f52318b4SErik Pilkington    }
658f52318b4SErik Pilkington
659f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
660f52318b4SErik Pilkington    __nc_rref_pair_type __move()
661f52318b4SErik Pilkington    {
662f52318b4SErik Pilkington        value_type& __v = __get_value();
663f52318b4SErik Pilkington        return __nc_rref_pair_type(
664f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
665f52318b4SErik Pilkington            _VSTD::move(__v.second));
666f52318b4SErik Pilkington    }
6679fd9f84fSHoward Hinnant
6689fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6699fd9f84fSHoward Hinnant    __hash_value_type& operator=(const __hash_value_type& __v)
670f52318b4SErik Pilkington    {
671f52318b4SErik Pilkington        __ref() = __v.__get_value();
672f52318b4SErik Pilkington        return *this;
673f52318b4SErik Pilkington    }
6749fd9f84fSHoward Hinnant
6759fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6769fd9f84fSHoward Hinnant    __hash_value_type& operator=(__hash_value_type&& __v)
677f52318b4SErik Pilkington    {
678f52318b4SErik Pilkington        __ref() = __v.__move();
679f52318b4SErik Pilkington        return *this;
680f52318b4SErik Pilkington    }
6819fd9f84fSHoward Hinnant
682fcd02211SEric Fiselier    template <class _ValueTp,
683fcd02211SEric Fiselier              class = typename enable_if<
684fcd02211SEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
685fcd02211SEric Fiselier                 >::type
686fcd02211SEric Fiselier             >
6879fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
688f52318b4SErik Pilkington    __hash_value_type& operator=(_ValueTp&& __v)
689f52318b4SErik Pilkington    {
690f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
691f52318b4SErik Pilkington        return *this;
692fcd02211SEric Fiselier    }
693fcd02211SEric Fiselier
694fcd02211SEric Fiselierprivate:
695fcd02211SEric Fiselier    __hash_value_type(const __hash_value_type& __v) = delete;
696fcd02211SEric Fiselier    __hash_value_type(__hash_value_type&& __v) = delete;
697fcd02211SEric Fiselier    template <class ..._Args>
698fcd02211SEric Fiselier    explicit __hash_value_type(_Args&& ...__args) = delete;
699fcd02211SEric Fiselier
700fcd02211SEric Fiselier    ~__hash_value_type() = delete;
7019fd9f84fSHoward Hinnant};
7029fd9f84fSHoward Hinnant
7039fd9f84fSHoward Hinnant#else
7049fd9f84fSHoward Hinnant
7059fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7069fd9f84fSHoward Hinnantstruct __hash_value_type
7079fd9f84fSHoward Hinnant{
7089fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7099fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7109fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7119fd9f84fSHoward Hinnant
712f52318b4SErik Pilkingtonprivate:
7139fd9f84fSHoward Hinnant    value_type __cc;
7149fd9f84fSHoward Hinnant
715f52318b4SErik Pilkingtonpublic:
716f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
717f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
718f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
719f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
720f52318b4SErik Pilkington
721fcd02211SEric Fiselierprivate:
722fcd02211SEric Fiselier   ~__hash_value_type();
7239fd9f84fSHoward Hinnant};
7249fd9f84fSHoward Hinnant
7259fd9f84fSHoward Hinnant#endif
7269fd9f84fSHoward Hinnant
7273e519524SHoward Hinnanttemplate <class _HashIterator>
728e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator
7293e519524SHoward Hinnant{
7303e519524SHoward Hinnant    _HashIterator __i_;
7313e519524SHoward Hinnant
73275d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
73375d0dcfdSEric Fiselier
7343e519524SHoward Hinnantpublic:
7353e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
73675d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
73775d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
7383e519524SHoward Hinnant    typedef value_type&                                          reference;
73975d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer       pointer;
7403e519524SHoward Hinnant
741789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7423714107eSHoward Hinnant    __hash_map_iterator() _NOEXCEPT {}
7433e519524SHoward Hinnant
744789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7453714107eSHoward Hinnant    __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
7463e519524SHoward Hinnant
747789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
748f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
749789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
750f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
7513e519524SHoward Hinnant
752789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7533e519524SHoward Hinnant    __hash_map_iterator& operator++() {++__i_; return *this;}
754789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7553e519524SHoward Hinnant    __hash_map_iterator operator++(int)
7563e519524SHoward Hinnant    {
7573e519524SHoward Hinnant        __hash_map_iterator __t(*this);
7583e519524SHoward Hinnant        ++(*this);
7593e519524SHoward Hinnant        return __t;
7603e519524SHoward Hinnant    }
7613e519524SHoward Hinnant
762789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
763789847ddSHoward Hinnant        bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
7643e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
765789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
766789847ddSHoward Hinnant        bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
7673e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7683e519524SHoward Hinnant
769e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
770e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
771e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
772e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
773e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
7743e519524SHoward Hinnant};
7753e519524SHoward Hinnant
7763e519524SHoward Hinnanttemplate <class _HashIterator>
777e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator
7783e519524SHoward Hinnant{
7793e519524SHoward Hinnant    _HashIterator __i_;
7803e519524SHoward Hinnant
78175d0dcfdSEric Fiselier    typedef  __hash_node_types_from_iterator<_HashIterator> _NodeTypes;
78275d0dcfdSEric Fiselier
7833e519524SHoward Hinnantpublic:
7843e519524SHoward Hinnant    typedef forward_iterator_tag                                 iterator_category;
78575d0dcfdSEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
78675d0dcfdSEric Fiselier    typedef typename _NodeTypes::difference_type                 difference_type;
7873e519524SHoward Hinnant    typedef const value_type&                                    reference;
78875d0dcfdSEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
7893e519524SHoward Hinnant
790789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7913714107eSHoward Hinnant    __hash_map_const_iterator() _NOEXCEPT {}
7923e519524SHoward Hinnant
793789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7943714107eSHoward Hinnant    __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {}
795789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7963e519524SHoward Hinnant    __hash_map_const_iterator(
7973e519524SHoward Hinnant            __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i)
7983714107eSHoward Hinnant                 _NOEXCEPT
7993e519524SHoward Hinnant                : __i_(__i.__i_) {}
8003e519524SHoward Hinnant
801789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
802f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
803789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
804f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8053e519524SHoward Hinnant
806789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8073e519524SHoward Hinnant    __hash_map_const_iterator& operator++() {++__i_; return *this;}
808789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8093e519524SHoward Hinnant    __hash_map_const_iterator operator++(int)
8103e519524SHoward Hinnant    {
8113e519524SHoward Hinnant        __hash_map_const_iterator __t(*this);
8123e519524SHoward Hinnant        ++(*this);
8133e519524SHoward Hinnant        return __t;
8143e519524SHoward Hinnant    }
8153e519524SHoward Hinnant
816789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
817789847ddSHoward Hinnant        bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
8183e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
819789847ddSHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
820789847ddSHoward Hinnant        bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
8213e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8223e519524SHoward Hinnant
823e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
824e2f2d1edSEric Fiselier    template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
825e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
826e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
8273e519524SHoward Hinnant};
8283e519524SHoward Hinnant
829*5c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
830*5c4e07aeSErik Pilkingtonclass unordered_multimap;
831*5c4e07aeSErik Pilkington
8323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
8333e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
834e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map
8353e519524SHoward Hinnant{
8363e519524SHoward Hinnantpublic:
8373e519524SHoward Hinnant    // types
8383e519524SHoward Hinnant    typedef _Key                                           key_type;
8393e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
8403e519524SHoward Hinnant    typedef _Hash                                          hasher;
8413e519524SHoward Hinnant    typedef _Pred                                          key_equal;
8423e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
8433e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
8443e519524SHoward Hinnant    typedef value_type&                                    reference;
8453e519524SHoward Hinnant    typedef const value_type&                              const_reference;
846b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
847b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
8483e519524SHoward Hinnant
8493e519524SHoward Hinnantprivate:
8509fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
851abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
852abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
8531f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
8541f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
8553e519524SHoward Hinnant
8563e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
8573e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
8583e519524SHoward Hinnant
8593e519524SHoward Hinnant    __table __table_;
8603e519524SHoward Hinnant
861fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
8623e519524SHoward Hinnant    typedef typename __table::__node_pointer               __node_pointer;
8633e519524SHoward Hinnant    typedef typename __table::__node_const_pointer         __node_const_pointer;
8643e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
8653e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
8663e519524SHoward Hinnant    typedef typename __table::__node                       __node;
867c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
868c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
8693e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
870fcd02211SEric Fiselier
871fcd02211SEric Fiselier    static_assert((is_same<typename __table::__container_value_type, value_type>::value), "");
872fcd02211SEric Fiselier    static_assert((is_same<typename __table::__node_value_type, __value_type>::value), "");
8733e519524SHoward Hinnantpublic:
8743e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
8753e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
87675d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
87775d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
8783e519524SHoward Hinnant
8793e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
8803e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
8813e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
8823e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
8833e519524SHoward Hinnant
884b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
885b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
886b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
887b0386a51SErik Pilkington#endif
888b0386a51SErik Pilkington
889*5c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
890*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
891*5c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
892*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
893*5c4e07aeSErik Pilkington
894789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8953714107eSHoward Hinnant    unordered_map()
8963714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
897b24c8024SHoward Hinnant        {
898b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
899b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
900b24c8024SHoward Hinnant#endif
901b24c8024SHoward Hinnant        }
9023e519524SHoward Hinnant    explicit unordered_map(size_type __n, const hasher& __hf = hasher(),
9033e519524SHoward Hinnant                           const key_equal& __eql = key_equal());
9043e519524SHoward Hinnant    unordered_map(size_type __n, const hasher& __hf,
9053e519524SHoward Hinnant                  const key_equal& __eql,
9063e519524SHoward Hinnant                  const allocator_type& __a);
9073e519524SHoward Hinnant    template <class _InputIterator>
9083e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last);
9093e519524SHoward Hinnant    template <class _InputIterator>
9103e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
9113e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
9123e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
9133e519524SHoward Hinnant    template <class _InputIterator>
9143e519524SHoward Hinnant        unordered_map(_InputIterator __first, _InputIterator __last,
9153e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
9163e519524SHoward Hinnant                      const key_equal& __eql,
9173e519524SHoward Hinnant                      const allocator_type& __a);
918cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9193e519524SHoward Hinnant    explicit unordered_map(const allocator_type& __a);
9203e519524SHoward Hinnant    unordered_map(const unordered_map& __u);
9213e519524SHoward Hinnant    unordered_map(const unordered_map& __u, const allocator_type& __a);
9226a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
923cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9243714107eSHoward Hinnant    unordered_map(unordered_map&& __u)
9253714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
9263e519524SHoward Hinnant    unordered_map(unordered_map&& __u, const allocator_type& __a);
9273e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il);
9283e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
9293e519524SHoward Hinnant                  const hasher& __hf = hasher(), const key_equal& __eql = key_equal());
9303e519524SHoward Hinnant    unordered_map(initializer_list<value_type> __il, size_type __n,
9313e519524SHoward Hinnant                  const hasher& __hf, const key_equal& __eql,
9323e519524SHoward Hinnant                  const allocator_type& __a);
9336a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
9343cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
9353cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9363cd37e64SMarshall Clow    unordered_map(size_type __n, const allocator_type& __a)
9373cd37e64SMarshall Clow      : unordered_map(__n, hasher(), key_equal(), __a) {}
9383cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9393cd37e64SMarshall Clow    unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a)
9403cd37e64SMarshall Clow      : unordered_map(__n, __hf, key_equal(), __a) {}
9413cd37e64SMarshall Clow    template <class _InputIterator>
9423cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9433cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
9443cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {}
9453cd37e64SMarshall Clow    template <class _InputIterator>
9463cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9473cd37e64SMarshall Clow      unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
9483cd37e64SMarshall Clow        const allocator_type& __a)
9493cd37e64SMarshall Clow      : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {}
9503cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9513cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
9523cd37e64SMarshall Clow      : unordered_map(__il, __n, hasher(), key_equal(), __a) {}
9533cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
9543cd37e64SMarshall Clow    unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
9553cd37e64SMarshall Clow      const allocator_type& __a)
9563cd37e64SMarshall Clow      : unordered_map(__il, __n, __hf, key_equal(), __a) {}
9573cd37e64SMarshall Clow#endif
9583e519524SHoward Hinnant    // ~unordered_map() = default;
9595a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9605a33687dSHoward Hinnant    unordered_map& operator=(const unordered_map& __u)
9615a33687dSHoward Hinnant    {
9622ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
9635a33687dSHoward Hinnant        __table_ = __u.__table_;
964307f8143SHoward Hinnant#else
96574cf6ff5SMarshall Clow        if (this != &__u) {
966307f8143SHoward Hinnant            __table_.clear();
967307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
968307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
969307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
970307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
971307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
97274cf6ff5SMarshall Clow        }
973307f8143SHoward Hinnant#endif
9745a33687dSHoward Hinnant        return *this;
9755a33687dSHoward Hinnant    }
9766a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
977cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9783714107eSHoward Hinnant    unordered_map& operator=(unordered_map&& __u)
9793714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
980cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
9813e519524SHoward Hinnant    unordered_map& operator=(initializer_list<value_type> __il);
9826a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
9833e519524SHoward Hinnant
984789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9853714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
9863e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
9873e519524SHoward Hinnant
98872c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
9893714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
990789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9913714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
992789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9933714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
9943e519524SHoward Hinnant
995789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9963714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
997789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9983714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
999789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10003714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1001789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10023714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1003789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10043714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1005789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10063714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
10073e519524SHoward Hinnant
10087a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10097a9f500fSEric Fiselier    pair<iterator, bool> insert(const value_type& __x)
10107a9f500fSEric Fiselier        {return __table_.__insert_unique(__x);}
10117a9f500fSEric Fiselier
10127a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x) {
10137a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10147a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10157a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
10167a9f500fSEric Fiselier            " referring to this unordered_map");
1017fd838227SEric Fiselier#else
1018fd838227SEric Fiselier        ((void)__p);
10197a9f500fSEric Fiselier#endif
10207a9f500fSEric Fiselier        return insert(__x).first;
10217a9f500fSEric Fiselier    }
10227a9f500fSEric Fiselier
10237a9f500fSEric Fiselier    template <class _InputIterator>
1024cd31b434SEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
10257a9f500fSEric Fiselier        void insert(_InputIterator __first, _InputIterator __last);
10267a9f500fSEric Fiselier
10276a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10287a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10297a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
10307a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
10317a9f500fSEric Fiselier
10327a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10337a9f500fSEric Fiselier    pair<iterator, bool> insert(value_type&& __x)
10347a9f500fSEric Fiselier        {return __table_.__insert_unique(_VSTD::move(__x));}
10357a9f500fSEric Fiselier
10367a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x) {
10377a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10387a9f500fSEric Fiselier        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10397a9f500fSEric Fiselier            "unordered_map::insert(const_iterator, const value_type&) called with an iterator not"
10407a9f500fSEric Fiselier            " referring to this unordered_map");
1041fd838227SEric Fiselier#else
1042fd838227SEric Fiselier        ((void)__p);
10437a9f500fSEric Fiselier#endif
10447a9f500fSEric Fiselier        return __table_.__insert_unique(_VSTD::move(__x)).first;
10457a9f500fSEric Fiselier    }
10467a9f500fSEric Fiselier
10477a9f500fSEric Fiselier    template <class _Pp,
10487a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
10497a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
10507a9f500fSEric Fiselier        pair<iterator, bool> insert(_Pp&& __x)
10517a9f500fSEric Fiselier            {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));}
10527a9f500fSEric Fiselier
10537a9f500fSEric Fiselier    template <class _Pp,
10547a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
10557a9f500fSEric Fiselier        _LIBCPP_INLINE_VISIBILITY
10567a9f500fSEric Fiselier        iterator insert(const_iterator __p, _Pp&& __x)
10577a9f500fSEric Fiselier        {
10587a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
10597a9f500fSEric Fiselier            _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10607a9f500fSEric Fiselier                "unordered_map::insert(const_iterator, value_type&&) called with an iterator not"
10617a9f500fSEric Fiselier                " referring to this unordered_map");
1062fd838227SEric Fiselier#else
1063fd838227SEric Fiselier          ((void)__p);
10647a9f500fSEric Fiselier#endif
10657a9f500fSEric Fiselier            return insert(_VSTD::forward<_Pp>(__x)).first;
10667a9f500fSEric Fiselier        }
10677a9f500fSEric Fiselier
10688b805c91SHoward Hinnant    template <class... _Args>
1069fcd02211SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1070fcd02211SEric Fiselier    pair<iterator, bool> emplace(_Args&&... __args) {
1071fcd02211SEric Fiselier        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1072fcd02211SEric Fiselier    }
10733e519524SHoward Hinnant
10748b805c91SHoward Hinnant    template <class... _Args>
1075789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1076fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
10774c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
10784c80bfbdSHoward Hinnant        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
10794c80bfbdSHoward Hinnant            "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
10804c80bfbdSHoward Hinnant            " referring to this unordered_map");
1081fd838227SEric Fiselier#else
1082fd838227SEric Fiselier          ((void)__p);
1083fcd02211SEric Fiselier#endif
1084ad783ce9SDuncan P. N. Exon Smith        return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
10854c80bfbdSHoward Hinnant    }
1086fcd02211SEric Fiselier
1087fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
1088fcd02211SEric Fiselier
1089bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14
1090bc4c89a9SMarshall Clow    template <class... _Args>
1091bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1092bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1093bc4c89a9SMarshall Clow    {
109487c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
109587c4104dSEric Fiselier            _VSTD::forward_as_tuple(__k),
109687c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1097bc4c89a9SMarshall Clow    }
1098bc4c89a9SMarshall Clow
1099bc4c89a9SMarshall Clow    template <class... _Args>
1100bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1101bc4c89a9SMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1102bc4c89a9SMarshall Clow    {
110387c4104dSEric Fiselier        return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct,
110487c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
110587c4104dSEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1106bc4c89a9SMarshall Clow    }
1107bc4c89a9SMarshall Clow
1108bc4c89a9SMarshall Clow    template <class... _Args>
1109bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1110bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1111bc4c89a9SMarshall Clow    {
111287c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1113eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
111487c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
111587c4104dSEric Fiselier            " referring to this unordered_map");
1116fd838227SEric Fiselier#else
1117fd838227SEric Fiselier        ((void)__h);
111887c4104dSEric Fiselier#endif
111987c4104dSEric Fiselier        return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first;
1120bc4c89a9SMarshall Clow    }
1121bc4c89a9SMarshall Clow
1122bc4c89a9SMarshall Clow    template <class... _Args>
1123bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1124bc4c89a9SMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1125bc4c89a9SMarshall Clow    {
112687c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2
1127eef9b35cSOleg Ranevskyy        _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this,
112887c4104dSEric Fiselier            "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not"
112987c4104dSEric Fiselier            " referring to this unordered_map");
1130fd838227SEric Fiselier#else
1131fd838227SEric Fiselier        ((void)__h);
113287c4104dSEric Fiselier#endif
113387c4104dSEric Fiselier        return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first;
1134bc4c89a9SMarshall Clow    }
1135bc4c89a9SMarshall Clow
1136bc4c89a9SMarshall Clow    template <class _Vp>
1137bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1138bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1139bc4c89a9SMarshall Clow    {
114087c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
114187c4104dSEric Fiselier            __k, _VSTD::forward<_Vp>(__v));
114287c4104dSEric Fiselier        if (!__res.second) {
114387c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1144bc4c89a9SMarshall Clow        }
114587c4104dSEric Fiselier        return __res;
1146bc4c89a9SMarshall Clow    }
1147bc4c89a9SMarshall Clow
1148bc4c89a9SMarshall Clow    template <class _Vp>
1149bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1150bc4c89a9SMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1151bc4c89a9SMarshall Clow    {
115287c4104dSEric Fiselier        pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k,
115387c4104dSEric Fiselier            _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
115487c4104dSEric Fiselier        if (!__res.second) {
115587c4104dSEric Fiselier            __res.first->second = _VSTD::forward<_Vp>(__v);
1156bc4c89a9SMarshall Clow        }
115787c4104dSEric Fiselier        return __res;
1158bc4c89a9SMarshall Clow    }
1159bc4c89a9SMarshall Clow
1160bc4c89a9SMarshall Clow    template <class _Vp>
1161bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1162fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v)
1163bc4c89a9SMarshall Clow     {
1164fd838227SEric Fiselier          // FIXME: Add debug mode checking for the iterator input
116587c4104dSEric Fiselier          return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first;
1166bc4c89a9SMarshall Clow     }
1167bc4c89a9SMarshall Clow
1168bc4c89a9SMarshall Clow    template <class _Vp>
1169bc4c89a9SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1170fd838227SEric Fiselier        iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v)
1171bc4c89a9SMarshall Clow     {
1172fd838227SEric Fiselier        // FIXME: Add debug mode checking for the iterator input
117387c4104dSEric Fiselier        return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first;
1174bc4c89a9SMarshall Clow     }
11756a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14
1176bc4c89a9SMarshall Clow
1177789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11783e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1179789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1180ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1181ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11823e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
1183789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11843e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
11853e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1186789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11873714107eSHoward Hinnant        void clear() _NOEXCEPT {__table_.clear();}
11883e519524SHoward Hinnant
1189b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1190b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1191b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1192b0386a51SErik Pilkington    {
1193b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1194b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1195b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<
1196b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1197b0386a51SErik Pilkington    }
1198b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1199b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1200b0386a51SErik Pilkington    {
1201b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1202b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_map::insert()");
1203b0386a51SErik Pilkington        return __table_.template __node_handle_insert_unique<node_type>(
1204b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1205b0386a51SErik Pilkington    }
1206b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1207b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1208b0386a51SErik Pilkington    {
1209b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1210b0386a51SErik Pilkington    }
1211b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1212b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1213b0386a51SErik Pilkington    {
1214b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1215b0386a51SErik Pilkington            __it.__i_);
1216b0386a51SErik Pilkington    }
1217*5c4e07aeSErik Pilkington
1218*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1219*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1220*5c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1221*5c4e07aeSErik Pilkington    {
1222*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1223*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1224*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
1225*5c4e07aeSErik Pilkington    }
1226*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1227*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1228*5c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1229*5c4e07aeSErik Pilkington    {
1230*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1231*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1232*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
1233*5c4e07aeSErik Pilkington    }
1234*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1235*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1236*5c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1237*5c4e07aeSErik Pilkington    {
1238*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1239*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1240*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
1241*5c4e07aeSErik Pilkington    }
1242*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1243*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1244*5c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1245*5c4e07aeSErik Pilkington    {
1246*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1247*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1248*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_unique(__source.__table_);
1249*5c4e07aeSErik Pilkington    }
1250b0386a51SErik Pilkington#endif
1251b0386a51SErik Pilkington
1252789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12533714107eSHoward Hinnant    void swap(unordered_map& __u)
12543714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
12553714107eSHoward Hinnant        { __table_.swap(__u.__table_);}
12563e519524SHoward Hinnant
1257789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12583e519524SHoward Hinnant    hasher hash_function() const
12593e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1260789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12613e519524SHoward Hinnant    key_equal key_eq() const
12623e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
12633e519524SHoward Hinnant
1264789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12653e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1266789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12673e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1268789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12693e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
1270789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12713e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
12723e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
1273789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12743e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
12753e519524SHoward Hinnant        {return __table_.__equal_range_unique(__k);}
12763e519524SHoward Hinnant
12773e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
12780f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12793e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
12803e519524SHoward Hinnant#endif
12813e519524SHoward Hinnant
12823e519524SHoward Hinnant    mapped_type&       at(const key_type& __k);
12833e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
12843e519524SHoward Hinnant
1285789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12863714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1287789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12883714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
12893e519524SHoward Hinnant
1290789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12913e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
12923e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1293789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12943e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
12953e519524SHoward Hinnant
1296789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12973e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1298789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12993e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1300789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13013e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1302789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13033e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1304789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13053e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1306789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13073e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
13083e519524SHoward Hinnant
1309789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13103714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
1311789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13123714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
1313789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13143e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
1315789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13163e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
1317789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13183e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
13193e519524SHoward Hinnant
1320b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1321b24c8024SHoward Hinnant
1322b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
1323b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
1324b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
1325b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
1326b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
1327b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1328b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1329b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
1330b24c8024SHoward Hinnant
1331b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
1332b24c8024SHoward Hinnant
13333e519524SHoward Hinnantprivate:
13340f905677SEric Fiselier
13350f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
13364a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
13370f905677SEric Fiselier#endif
13383e519524SHoward Hinnant};
13393e519524SHoward Hinnant
13403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13413e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13423e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
13433e519524SHoward Hinnant    : __table_(__hf, __eql)
13443e519524SHoward Hinnant{
1345b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1346b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1347b24c8024SHoward Hinnant#endif
13483e519524SHoward Hinnant    __table_.rehash(__n);
13493e519524SHoward Hinnant}
13503e519524SHoward Hinnant
13513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13523e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13533e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
13543e519524SHoward Hinnant        const allocator_type& __a)
13552a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
13563e519524SHoward Hinnant{
1357b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1358b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1359b24c8024SHoward Hinnant#endif
13603e519524SHoward Hinnant    __table_.rehash(__n);
13613e519524SHoward Hinnant}
13623e519524SHoward Hinnant
13633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1364cd31b434SEvgeniy Stepanovinline
13653e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13663e519524SHoward Hinnant        const allocator_type& __a)
13672a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
13683e519524SHoward Hinnant{
1369b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1370b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1371b24c8024SHoward Hinnant#endif
13723e519524SHoward Hinnant}
13733e519524SHoward Hinnant
13743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13753e519524SHoward Hinnanttemplate <class _InputIterator>
13763e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13773e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
13783e519524SHoward Hinnant{
1379b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1380b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1381b24c8024SHoward Hinnant#endif
13823e519524SHoward Hinnant    insert(__first, __last);
13833e519524SHoward Hinnant}
13843e519524SHoward Hinnant
13853e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
13863e519524SHoward Hinnanttemplate <class _InputIterator>
13873e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
13883e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
13893e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
13903e519524SHoward Hinnant    : __table_(__hf, __eql)
13913e519524SHoward Hinnant{
1392b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1393b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1394b24c8024SHoward Hinnant#endif
13953e519524SHoward Hinnant    __table_.rehash(__n);
13963e519524SHoward Hinnant    insert(__first, __last);
13973e519524SHoward Hinnant}
13983e519524SHoward Hinnant
13993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14003e519524SHoward Hinnanttemplate <class _InputIterator>
14013e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14023e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
14033e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
14042a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
14053e519524SHoward Hinnant{
1406b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1407b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1408b24c8024SHoward Hinnant#endif
14093e519524SHoward Hinnant    __table_.rehash(__n);
14103e519524SHoward Hinnant    insert(__first, __last);
14113e519524SHoward Hinnant}
14123e519524SHoward Hinnant
14133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14143e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14153e519524SHoward Hinnant        const unordered_map& __u)
14163e519524SHoward Hinnant    : __table_(__u.__table_)
14173e519524SHoward Hinnant{
1418b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1419b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1420b24c8024SHoward Hinnant#endif
14213e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
14223e519524SHoward Hinnant    insert(__u.begin(), __u.end());
14233e519524SHoward Hinnant}
14243e519524SHoward Hinnant
14253e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14263e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14273e519524SHoward Hinnant        const unordered_map& __u, const allocator_type& __a)
14282a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
14293e519524SHoward Hinnant{
1430b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1431b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1432b24c8024SHoward Hinnant#endif
14333e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
14343e519524SHoward Hinnant    insert(__u.begin(), __u.end());
14353e519524SHoward Hinnant}
14363e519524SHoward Hinnant
14376a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14383e519524SHoward Hinnant
14393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1440cd31b434SEvgeniy Stepanovinline
14413e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14423e519524SHoward Hinnant        unordered_map&& __u)
14433714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
1444ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
14453e519524SHoward Hinnant{
1446b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1447b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
14484c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
1449b24c8024SHoward Hinnant#endif
14503e519524SHoward Hinnant}
14513e519524SHoward Hinnant
14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14533e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14543e519524SHoward Hinnant        unordered_map&& __u, const allocator_type& __a)
14552a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
14563e519524SHoward Hinnant{
1457b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1458b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1459b24c8024SHoward Hinnant#endif
14603e519524SHoward Hinnant    if (__a != __u.get_allocator())
14613e519524SHoward Hinnant    {
14623e519524SHoward Hinnant        iterator __i = __u.begin();
1463fcd02211SEric Fiselier        while (__u.size() != 0) {
1464f52318b4SErik Pilkington            __table_.__emplace_unique(
1465f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
1466fcd02211SEric Fiselier        }
14673e519524SHoward Hinnant    }
14684c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
14694c80bfbdSHoward Hinnant    else
14704c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
14714c80bfbdSHoward Hinnant#endif
14723e519524SHoward Hinnant}
14733e519524SHoward Hinnant
14743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14753e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14763e519524SHoward Hinnant        initializer_list<value_type> __il)
14773e519524SHoward Hinnant{
1478b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1479b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1480b24c8024SHoward Hinnant#endif
14813e519524SHoward Hinnant    insert(__il.begin(), __il.end());
14823e519524SHoward Hinnant}
14833e519524SHoward Hinnant
14843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14853e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14863e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
14873e519524SHoward Hinnant        const key_equal& __eql)
14883e519524SHoward Hinnant    : __table_(__hf, __eql)
14893e519524SHoward Hinnant{
1490b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1491b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1492b24c8024SHoward Hinnant#endif
14933e519524SHoward Hinnant    __table_.rehash(__n);
14943e519524SHoward Hinnant    insert(__il.begin(), __il.end());
14953e519524SHoward Hinnant}
14963e519524SHoward Hinnant
14973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
14983e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(
14993e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
15003e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
15012a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
15023e519524SHoward Hinnant{
1503b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1504b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
1505b24c8024SHoward Hinnant#endif
15063e519524SHoward Hinnant    __table_.rehash(__n);
15073e519524SHoward Hinnant    insert(__il.begin(), __il.end());
15083e519524SHoward Hinnant}
15093e519524SHoward Hinnant
15103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1511cd31b434SEvgeniy Stepanovinline
15123e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
15133e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u)
15143714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
15153e519524SHoward Hinnant{
1516ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
15173e519524SHoward Hinnant    return *this;
15183e519524SHoward Hinnant}
15193e519524SHoward Hinnant
15203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1521cd31b434SEvgeniy Stepanovinline
15223e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&
15233e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
15243e519524SHoward Hinnant        initializer_list<value_type> __il)
15253e519524SHoward Hinnant{
15263e519524SHoward Hinnant    __table_.__assign_unique(__il.begin(), __il.end());
15273e519524SHoward Hinnant    return *this;
15283e519524SHoward Hinnant}
15293e519524SHoward Hinnant
15306a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
15313e519524SHoward Hinnant
15323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15333e519524SHoward Hinnanttemplate <class _InputIterator>
1534cd31b434SEvgeniy Stepanovinline
15353e519524SHoward Hinnantvoid
15363e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
15373e519524SHoward Hinnant                                                       _InputIterator __last)
15383e519524SHoward Hinnant{
15393e519524SHoward Hinnant    for (; __first != __last; ++__first)
15403e519524SHoward Hinnant        __table_.__insert_unique(*__first);
15413e519524SHoward Hinnant}
15423e519524SHoward Hinnant
15436a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
15443e519524SHoward Hinnant
15450f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15460f905677SEric Fiselier_Tp&
15470f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
15480f905677SEric Fiselier{
15490f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
15500f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(__k),
1551f52318b4SErik Pilkington                                  std::forward_as_tuple()).first->__get_value().second;
15520f905677SEric Fiselier}
15533e519524SHoward Hinnant
15543e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15553e519524SHoward Hinnant_Tp&
15563e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k)
15573e519524SHoward Hinnant{
15580f905677SEric Fiselier    return __table_.__emplace_unique_key_args(__k,
15590f905677SEric Fiselier        std::piecewise_construct, std::forward_as_tuple(std::move(__k)),
1560f52318b4SErik Pilkington                                  std::forward_as_tuple()).first->__get_value().second;
15613e519524SHoward Hinnant}
15626a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG
15633e519524SHoward Hinnant
15646a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15656a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder
15666a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k)
15676a470bcbSEric Fiselier{
15686a470bcbSEric Fiselier    __node_allocator& __na = __table_.__node_alloc();
15696a470bcbSEric Fiselier    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1570f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
15716a470bcbSEric Fiselier    __h.get_deleter().__first_constructed = true;
1572f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
15736a470bcbSEric Fiselier    __h.get_deleter().__second_constructed = true;
15746a470bcbSEric Fiselier    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
15756a470bcbSEric Fiselier}
15766a470bcbSEric Fiselier
15776a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15786a470bcbSEric Fiselier_Tp&
15796a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k)
15806a470bcbSEric Fiselier{
15816a470bcbSEric Fiselier    iterator __i = find(__k);
15826a470bcbSEric Fiselier    if (__i != end())
15836a470bcbSEric Fiselier        return __i->second;
15846a470bcbSEric Fiselier    __node_holder __h = __construct_node_with_key(__k);
15856a470bcbSEric Fiselier    pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
15866a470bcbSEric Fiselier    __h.release();
15876a470bcbSEric Fiselier    return __r.first->second;
15886a470bcbSEric Fiselier}
15896a470bcbSEric Fiselier
15906a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_MODE
15913e519524SHoward Hinnant
15923e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
15933e519524SHoward Hinnant_Tp&
15943e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k)
15953e519524SHoward Hinnant{
15963e519524SHoward Hinnant    iterator __i = find(__k);
15973e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15983e519524SHoward Hinnant    if (__i == end())
15993e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1600b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
16013e519524SHoward Hinnant    return __i->second;
16023e519524SHoward Hinnant}
16033e519524SHoward Hinnant
16043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16053e519524SHoward Hinnantconst _Tp&
16063e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const
16073e519524SHoward Hinnant{
16083e519524SHoward Hinnant    const_iterator __i = find(__k);
16093e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
16103e519524SHoward Hinnant    if (__i == end())
16113e519524SHoward Hinnant        throw out_of_range("unordered_map::at: key not found");
1612b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
16133e519524SHoward Hinnant    return __i->second;
16143e519524SHoward Hinnant}
16153e519524SHoward Hinnant
16163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1617789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16183e519524SHoward Hinnantvoid
16193e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
16203e519524SHoward Hinnant     unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
16213714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
16223e519524SHoward Hinnant{
16233e519524SHoward Hinnant    __x.swap(__y);
16243e519524SHoward Hinnant}
16253e519524SHoward Hinnant
16263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
16273e519524SHoward Hinnantbool
16283e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
16293e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
16303e519524SHoward Hinnant{
16313e519524SHoward Hinnant    if (__x.size() != __y.size())
16323e519524SHoward Hinnant        return false;
16333e519524SHoward Hinnant    typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
16343e519524SHoward Hinnant                                                                 const_iterator;
16353e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
16363e519524SHoward Hinnant            __i != __ex; ++__i)
16373e519524SHoward Hinnant    {
16383e519524SHoward Hinnant        const_iterator __j = __y.find(__i->first);
16393e519524SHoward Hinnant        if (__j == __ey || !(*__i == *__j))
16403e519524SHoward Hinnant            return false;
16413e519524SHoward Hinnant    }
16423e519524SHoward Hinnant    return true;
16433e519524SHoward Hinnant}
16443e519524SHoward Hinnant
16453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
1646789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16473e519524SHoward Hinnantbool
16483e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
16493e519524SHoward Hinnant           const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
16503e519524SHoward Hinnant{
16513e519524SHoward Hinnant    return !(__x == __y);
16523e519524SHoward Hinnant}
16533e519524SHoward Hinnant
16543e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
16553e519524SHoward Hinnant          class _Alloc = allocator<pair<const _Key, _Tp> > >
1656e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap
16573e519524SHoward Hinnant{
16583e519524SHoward Hinnantpublic:
16593e519524SHoward Hinnant    // types
16603e519524SHoward Hinnant    typedef _Key                                           key_type;
16613e519524SHoward Hinnant    typedef _Tp                                            mapped_type;
16623e519524SHoward Hinnant    typedef _Hash                                          hasher;
16633e519524SHoward Hinnant    typedef _Pred                                          key_equal;
16643e519524SHoward Hinnant    typedef _Alloc                                         allocator_type;
16653e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>              value_type;
16663e519524SHoward Hinnant    typedef value_type&                                    reference;
16673e519524SHoward Hinnant    typedef const value_type&                              const_reference;
1668b24c8024SHoward Hinnant    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
1669b24c8024SHoward Hinnant                  "Invalid allocator::value_type");
16703e519524SHoward Hinnant
16713e519524SHoward Hinnantprivate:
16729fd9f84fSHoward Hinnant    typedef __hash_value_type<key_type, mapped_type>                 __value_type;
1673abb160e6SHoward Hinnant    typedef __unordered_map_hasher<key_type, __value_type, hasher>   __hasher;
1674abb160e6SHoward Hinnant    typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal;
16751f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
16761f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
16773e519524SHoward Hinnant
16783e519524SHoward Hinnant    typedef __hash_table<__value_type, __hasher,
16793e519524SHoward Hinnant                         __key_equal,  __allocator_type>   __table;
16803e519524SHoward Hinnant
16813e519524SHoward Hinnant    __table __table_;
16823e519524SHoward Hinnant
1683fcd02211SEric Fiselier    typedef typename __table::_NodeTypes                   _NodeTypes;
16843e519524SHoward Hinnant    typedef typename __table::__node_traits                __node_traits;
16853e519524SHoward Hinnant    typedef typename __table::__node_allocator             __node_allocator;
16863e519524SHoward Hinnant    typedef typename __table::__node                       __node;
1687c003db1fSHoward Hinnant    typedef __hash_map_node_destructor<__node_allocator>   _Dp;
1688c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp>                         __node_holder;
16893e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
169075d0dcfdSEric Fiselier    static_assert((is_same<typename __node_traits::size_type,
169175d0dcfdSEric Fiselier                          typename __alloc_traits::size_type>::value),
169275d0dcfdSEric Fiselier                 "Allocator uses different size_type for different types");
16933e519524SHoward Hinnantpublic:
16943e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
16953e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
169675d0dcfdSEric Fiselier    typedef typename __table::size_type              size_type;
169775d0dcfdSEric Fiselier    typedef typename __table::difference_type        difference_type;
16983e519524SHoward Hinnant
16993e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::iterator>       iterator;
17003e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator;
17013e519524SHoward Hinnant    typedef __hash_map_iterator<typename __table::local_iterator> local_iterator;
17023e519524SHoward Hinnant    typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator;
17033e519524SHoward Hinnant
1704b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1705b0386a51SErik Pilkington    typedef __map_node_handle<__node, allocator_type> node_type;
1706b0386a51SErik Pilkington#endif
1707b0386a51SErik Pilkington
1708*5c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
1709*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_map;
1710*5c4e07aeSErik Pilkington    template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2>
1711*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
1712*5c4e07aeSErik Pilkington
1713789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17143714107eSHoward Hinnant    unordered_multimap()
17153714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
1716b24c8024SHoward Hinnant        {
1717b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
1718b24c8024SHoward Hinnant            __get_db()->__insert_c(this);
1719b24c8024SHoward Hinnant#endif
1720b24c8024SHoward Hinnant        }
17213e519524SHoward Hinnant    explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(),
17223e519524SHoward Hinnant                                const key_equal& __eql = key_equal());
17233e519524SHoward Hinnant    unordered_multimap(size_type __n, const hasher& __hf,
17243e519524SHoward Hinnant                                const key_equal& __eql,
17253e519524SHoward Hinnant                                const allocator_type& __a);
17263e519524SHoward Hinnant    template <class _InputIterator>
17273e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last);
17283e519524SHoward Hinnant    template <class _InputIterator>
17293e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
17303e519524SHoward Hinnant                      size_type __n, const hasher& __hf = hasher(),
17313e519524SHoward Hinnant                      const key_equal& __eql = key_equal());
17323e519524SHoward Hinnant    template <class _InputIterator>
17333e519524SHoward Hinnant        unordered_multimap(_InputIterator __first, _InputIterator __last,
17343e519524SHoward Hinnant                      size_type __n, const hasher& __hf,
17353e519524SHoward Hinnant                      const key_equal& __eql,
17363e519524SHoward Hinnant                      const allocator_type& __a);
1737cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
17383e519524SHoward Hinnant    explicit unordered_multimap(const allocator_type& __a);
17393e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u);
17403e519524SHoward Hinnant    unordered_multimap(const unordered_multimap& __u, const allocator_type& __a);
17416a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1742cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
17433714107eSHoward Hinnant    unordered_multimap(unordered_multimap&& __u)
17443714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
17453e519524SHoward Hinnant    unordered_multimap(unordered_multimap&& __u, const allocator_type& __a);
17463e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il);
17473e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
17483e519524SHoward Hinnant                       const hasher& __hf = hasher(),
17493e519524SHoward Hinnant                       const key_equal& __eql = key_equal());
17503e519524SHoward Hinnant    unordered_multimap(initializer_list<value_type> __il, size_type __n,
17513e519524SHoward Hinnant                       const hasher& __hf, const key_equal& __eql,
17523e519524SHoward Hinnant                       const allocator_type& __a);
17536a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
17543cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11
17553cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17563cd37e64SMarshall Clow    unordered_multimap(size_type __n, const allocator_type& __a)
17573cd37e64SMarshall Clow      : unordered_multimap(__n, hasher(), key_equal(), __a) {}
17583cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17593cd37e64SMarshall Clow    unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a)
17603cd37e64SMarshall Clow      : unordered_multimap(__n, __hf, key_equal(), __a) {}
17613cd37e64SMarshall Clow    template <class _InputIterator>
17623cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17633cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a)
17643cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {}
17653cd37e64SMarshall Clow    template <class _InputIterator>
17663cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17673cd37e64SMarshall Clow      unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf,
17683cd37e64SMarshall Clow        const allocator_type& __a)
17693cd37e64SMarshall Clow      : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {}
17703cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17713cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
17723cd37e64SMarshall Clow      : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {}
17733cd37e64SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
17743cd37e64SMarshall Clow    unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf,
17753cd37e64SMarshall Clow      const allocator_type& __a)
17763cd37e64SMarshall Clow      : unordered_multimap(__il, __n, __hf, key_equal(), __a) {}
17773cd37e64SMarshall Clow#endif
17783e519524SHoward Hinnant    // ~unordered_multimap() = default;
17795a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17805a33687dSHoward Hinnant    unordered_multimap& operator=(const unordered_multimap& __u)
17815a33687dSHoward Hinnant    {
17822ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
17835a33687dSHoward Hinnant        __table_ = __u.__table_;
1784307f8143SHoward Hinnant#else
178574cf6ff5SMarshall Clow        if (this != &__u) {
1786307f8143SHoward Hinnant            __table_.clear();
1787307f8143SHoward Hinnant            __table_.hash_function() = __u.__table_.hash_function();
1788307f8143SHoward Hinnant            __table_.key_eq() = __u.__table_.key_eq();
1789307f8143SHoward Hinnant            __table_.max_load_factor() = __u.__table_.max_load_factor();
1790307f8143SHoward Hinnant            __table_.__copy_assign_alloc(__u.__table_);
1791307f8143SHoward Hinnant            insert(__u.begin(), __u.end());
179274cf6ff5SMarshall Clow        }
1793307f8143SHoward Hinnant#endif
17945a33687dSHoward Hinnant        return *this;
17955a33687dSHoward Hinnant    }
17966a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1797cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
17983714107eSHoward Hinnant    unordered_multimap& operator=(unordered_multimap&& __u)
17993714107eSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
1800cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18013e519524SHoward Hinnant    unordered_multimap& operator=(initializer_list<value_type> __il);
18026a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18033e519524SHoward Hinnant
1804789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18053714107eSHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT
18063e519524SHoward Hinnant        {return allocator_type(__table_.__node_alloc());}
18073e519524SHoward Hinnant
180872c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
18093714107eSHoward Hinnant    bool      empty() const _NOEXCEPT {return __table_.size() == 0;}
1810789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18113714107eSHoward Hinnant    size_type size() const _NOEXCEPT  {return __table_.size();}
1812789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18133714107eSHoward Hinnant    size_type max_size() const _NOEXCEPT {return __table_.max_size();}
18143e519524SHoward Hinnant
1815789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18163714107eSHoward Hinnant    iterator       begin() _NOEXCEPT        {return __table_.begin();}
1817789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18183714107eSHoward Hinnant    iterator       end() _NOEXCEPT          {return __table_.end();}
1819789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18203714107eSHoward Hinnant    const_iterator begin()  const _NOEXCEPT {return __table_.begin();}
1821789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18223714107eSHoward Hinnant    const_iterator end()    const _NOEXCEPT {return __table_.end();}
1823789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18243714107eSHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
1825789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18263714107eSHoward Hinnant    const_iterator cend()   const _NOEXCEPT {return __table_.end();}
18273e519524SHoward Hinnant
18287a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18297a9f500fSEric Fiselier    iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
18307a9f500fSEric Fiselier
18317a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18327a9f500fSEric Fiselier    iterator insert(const_iterator __p, const value_type& __x)
18337a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, __x);}
18347a9f500fSEric Fiselier
18357a9f500fSEric Fiselier    template <class _InputIterator>
1836cd31b434SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
18377a9f500fSEric Fiselier    void insert(_InputIterator __first, _InputIterator __last);
18387a9f500fSEric Fiselier
18396a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
18407a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18417a9f500fSEric Fiselier    void insert(initializer_list<value_type> __il)
18427a9f500fSEric Fiselier        {insert(__il.begin(), __il.end());}
18437a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18447a9f500fSEric Fiselier    iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
18457a9f500fSEric Fiselier
18467a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18477a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __x)
18487a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));}
18497a9f500fSEric Fiselier
18507a9f500fSEric Fiselier    template <class _Pp,
18517a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
18527a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18537a9f500fSEric Fiselier    iterator insert(_Pp&& __x)
18547a9f500fSEric Fiselier        {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));}
18557a9f500fSEric Fiselier
18567a9f500fSEric Fiselier    template <class _Pp,
18577a9f500fSEric Fiselier              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
18587a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18597a9f500fSEric Fiselier    iterator insert(const_iterator __p, _Pp&& __x)
18607a9f500fSEric Fiselier        {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));}
18617a9f500fSEric Fiselier
1862fcd02211SEric Fiselier    template <class... _Args>
1863fcd02211SEric Fiselier    iterator emplace(_Args&&... __args) {
1864fcd02211SEric Fiselier        return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1865fcd02211SEric Fiselier    }
18667609c9b6SHoward Hinnant
18678b805c91SHoward Hinnant    template <class... _Args>
1868fcd02211SEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&&... __args) {
1869fcd02211SEric Fiselier        return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1870fcd02211SEric Fiselier    }
1871fcd02211SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18723e519524SHoward Hinnant
18733e519524SHoward Hinnant
1874789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18753e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);}
1876789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1877ec392968SMarshall Clow    iterator erase(iterator __p)       {return __table_.erase(__p.__i_);}
1878ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18793e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
1880789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18813e519524SHoward Hinnant    iterator erase(const_iterator __first, const_iterator __last)
18823e519524SHoward Hinnant        {return __table_.erase(__first.__i_, __last.__i_);}
1883789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18843714107eSHoward Hinnant    void clear() _NOEXCEPT {__table_.clear();}
18853e519524SHoward Hinnant
1886b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1887b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1888b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1889b0386a51SErik Pilkington    {
1890b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1891b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1892b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
1893b0386a51SErik Pilkington            _VSTD::move(__nh));
1894b0386a51SErik Pilkington    }
1895b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1896b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1897b0386a51SErik Pilkington    {
1898b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1899b0386a51SErik Pilkington            "node_type with incompatible allocator passed to unordered_multimap::insert()");
1900b0386a51SErik Pilkington        return __table_.template __node_handle_insert_multi<node_type>(
1901b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1902b0386a51SErik Pilkington    }
1903b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1904b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1905b0386a51SErik Pilkington    {
1906b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(__key);
1907b0386a51SErik Pilkington    }
1908b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1909b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1910b0386a51SErik Pilkington    {
1911b0386a51SErik Pilkington        return __table_.template __node_handle_extract<node_type>(
1912b0386a51SErik Pilkington            __it.__i_);
1913b0386a51SErik Pilkington    }
1914*5c4e07aeSErik Pilkington
1915*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1916*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1917*5c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1918*5c4e07aeSErik Pilkington    {
1919*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1920*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1921*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
1922*5c4e07aeSErik Pilkington    }
1923*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1924*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1925*5c4e07aeSErik Pilkington    void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1926*5c4e07aeSErik Pilkington    {
1927*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1928*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1929*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
1930*5c4e07aeSErik Pilkington    }
1931*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1932*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1933*5c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source)
1934*5c4e07aeSErik Pilkington    {
1935*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1936*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1937*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
1938*5c4e07aeSErik Pilkington    }
1939*5c4e07aeSErik Pilkington    template <class _H2, class _P2>
1940*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1941*5c4e07aeSErik Pilkington    void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source)
1942*5c4e07aeSErik Pilkington    {
1943*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1944*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1945*5c4e07aeSErik Pilkington        return __table_.__node_handle_merge_multi(__source.__table_);
1946*5c4e07aeSErik Pilkington    }
1947b0386a51SErik Pilkington#endif
1948b0386a51SErik Pilkington
1949789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19503714107eSHoward Hinnant    void swap(unordered_multimap& __u)
19513714107eSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
19523714107eSHoward Hinnant        {__table_.swap(__u.__table_);}
19533e519524SHoward Hinnant
1954789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19553e519524SHoward Hinnant    hasher hash_function() const
19563e519524SHoward Hinnant        {return __table_.hash_function().hash_function();}
1957789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19583e519524SHoward Hinnant    key_equal key_eq() const
19593e519524SHoward Hinnant        {return __table_.key_eq().key_eq();}
19603e519524SHoward Hinnant
1961789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19623e519524SHoward Hinnant    iterator       find(const key_type& __k)       {return __table_.find(__k);}
1963789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19643e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __table_.find(__k);}
1965789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19663e519524SHoward Hinnant    size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
1967789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19683e519524SHoward Hinnant    pair<iterator, iterator>             equal_range(const key_type& __k)
19693e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
1970789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19713e519524SHoward Hinnant    pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
19723e519524SHoward Hinnant        {return __table_.__equal_range_multi(__k);}
19733e519524SHoward Hinnant
1974789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19753714107eSHoward Hinnant    size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
1976789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19773714107eSHoward Hinnant    size_type max_bucket_count() const _NOEXCEPT
19783714107eSHoward Hinnant        {return __table_.max_bucket_count();}
19793e519524SHoward Hinnant
1980789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19813e519524SHoward Hinnant    size_type bucket_size(size_type __n) const
19823e519524SHoward Hinnant        {return __table_.bucket_size(__n);}
1983789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19843e519524SHoward Hinnant    size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
19853e519524SHoward Hinnant
1986789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19873e519524SHoward Hinnant    local_iterator       begin(size_type __n)        {return __table_.begin(__n);}
1988789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19893e519524SHoward Hinnant    local_iterator       end(size_type __n)          {return __table_.end(__n);}
1990789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19913e519524SHoward Hinnant    const_local_iterator begin(size_type __n) const  {return __table_.cbegin(__n);}
1992789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19933e519524SHoward Hinnant    const_local_iterator end(size_type __n) const    {return __table_.cend(__n);}
1994789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19953e519524SHoward Hinnant    const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
1996789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19973e519524SHoward Hinnant    const_local_iterator cend(size_type __n) const   {return __table_.cend(__n);}
19983e519524SHoward Hinnant
1999789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20003714107eSHoward Hinnant    float load_factor() const _NOEXCEPT {return __table_.load_factor();}
2001789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20023714107eSHoward Hinnant    float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
2003789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20043e519524SHoward Hinnant    void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
2005789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20063e519524SHoward Hinnant    void rehash(size_type __n) {__table_.rehash(__n);}
2007789847ddSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20083e519524SHoward Hinnant    void reserve(size_type __n) {__table_.reserve(__n);}
20093e519524SHoward Hinnant
2010b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2011b24c8024SHoward Hinnant
2012b24c8024SHoward Hinnant    bool __dereferenceable(const const_iterator* __i) const
2013b24c8024SHoward Hinnant        {return __table_.__dereferenceable(&__i->__i_);}
2014b24c8024SHoward Hinnant    bool __decrementable(const const_iterator* __i) const
2015b24c8024SHoward Hinnant        {return __table_.__decrementable(&__i->__i_);}
2016b24c8024SHoward Hinnant    bool __addable(const const_iterator* __i, ptrdiff_t __n) const
2017b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2018b24c8024SHoward Hinnant    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2019b24c8024SHoward Hinnant        {return __table_.__addable(&__i->__i_, __n);}
2020b24c8024SHoward Hinnant
2021b24c8024SHoward Hinnant#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2022b24c8024SHoward Hinnant
2023fcd02211SEric Fiselier
20243e519524SHoward Hinnant};
20253e519524SHoward Hinnant
20263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20273e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20283e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql)
20293e519524SHoward Hinnant    : __table_(__hf, __eql)
20303e519524SHoward Hinnant{
2031b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2032b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2033b24c8024SHoward Hinnant#endif
20343e519524SHoward Hinnant    __table_.rehash(__n);
20353e519524SHoward Hinnant}
20363e519524SHoward Hinnant
20373e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20383e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20393e519524SHoward Hinnant        size_type __n, const hasher& __hf, const key_equal& __eql,
20403e519524SHoward Hinnant        const allocator_type& __a)
20412a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
20423e519524SHoward Hinnant{
2043b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2044b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2045b24c8024SHoward Hinnant#endif
20463e519524SHoward Hinnant    __table_.rehash(__n);
20473e519524SHoward Hinnant}
20483e519524SHoward Hinnant
20493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20503e519524SHoward Hinnanttemplate <class _InputIterator>
20513e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20523e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last)
20533e519524SHoward Hinnant{
2054b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2055b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2056b24c8024SHoward Hinnant#endif
20573e519524SHoward Hinnant    insert(__first, __last);
20583e519524SHoward Hinnant}
20593e519524SHoward Hinnant
20603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20613e519524SHoward Hinnanttemplate <class _InputIterator>
20623e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20633e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
20643e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql)
20653e519524SHoward Hinnant    : __table_(__hf, __eql)
20663e519524SHoward Hinnant{
2067b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2068b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2069b24c8024SHoward Hinnant#endif
20703e519524SHoward Hinnant    __table_.rehash(__n);
20713e519524SHoward Hinnant    insert(__first, __last);
20723e519524SHoward Hinnant}
20733e519524SHoward Hinnant
20743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
20753e519524SHoward Hinnanttemplate <class _InputIterator>
20763e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20773e519524SHoward Hinnant        _InputIterator __first, _InputIterator __last, size_type __n,
20783e519524SHoward Hinnant        const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
20792a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
20803e519524SHoward Hinnant{
2081b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2082b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2083b24c8024SHoward Hinnant#endif
20843e519524SHoward Hinnant    __table_.rehash(__n);
20853e519524SHoward Hinnant    insert(__first, __last);
20863e519524SHoward Hinnant}
20873e519524SHoward Hinnant
20883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2089cd31b434SEvgeniy Stepanovinline
20903e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
20913e519524SHoward Hinnant        const allocator_type& __a)
20922a10c960SMarshall Clow    : __table_(typename __table::allocator_type(__a))
20933e519524SHoward Hinnant{
2094b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2095b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2096b24c8024SHoward Hinnant#endif
20973e519524SHoward Hinnant}
20983e519524SHoward Hinnant
20993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21003e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21013e519524SHoward Hinnant        const unordered_multimap& __u)
21023e519524SHoward Hinnant    : __table_(__u.__table_)
21033e519524SHoward Hinnant{
2104b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2105b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2106b24c8024SHoward Hinnant#endif
21073e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
21083e519524SHoward Hinnant    insert(__u.begin(), __u.end());
21093e519524SHoward Hinnant}
21103e519524SHoward Hinnant
21113e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21123e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21133e519524SHoward Hinnant        const unordered_multimap& __u, const allocator_type& __a)
21142a10c960SMarshall Clow    : __table_(__u.__table_, typename __table::allocator_type(__a))
21153e519524SHoward Hinnant{
2116b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2117b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2118b24c8024SHoward Hinnant#endif
21193e519524SHoward Hinnant    __table_.rehash(__u.bucket_count());
21203e519524SHoward Hinnant    insert(__u.begin(), __u.end());
21213e519524SHoward Hinnant}
21223e519524SHoward Hinnant
21236a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
21243e519524SHoward Hinnant
21253e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2126cd31b434SEvgeniy Stepanovinline
21273e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21283e519524SHoward Hinnant        unordered_multimap&& __u)
21293714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
2130ce48a113SHoward Hinnant    : __table_(_VSTD::move(__u.__table_))
21313e519524SHoward Hinnant{
2132b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2133b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
21344c80bfbdSHoward Hinnant    __get_db()->swap(this, &__u);
2135b24c8024SHoward Hinnant#endif
21363e519524SHoward Hinnant}
21373e519524SHoward Hinnant
21383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21393e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21403e519524SHoward Hinnant        unordered_multimap&& __u, const allocator_type& __a)
21412a10c960SMarshall Clow    : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a))
21423e519524SHoward Hinnant{
2143b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2144b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2145b24c8024SHoward Hinnant#endif
21463e519524SHoward Hinnant    if (__a != __u.get_allocator())
21473e519524SHoward Hinnant    {
21483e519524SHoward Hinnant        iterator __i = __u.begin();
21493e519524SHoward Hinnant        while (__u.size() != 0)
21503e519524SHoward Hinnant        {
21513e519524SHoward Hinnant            __table_.__insert_multi(
2152f52318b4SErik Pilkington                __u.__table_.remove((__i++).__i_)->__value_.__move());
21533e519524SHoward Hinnant        }
21543e519524SHoward Hinnant    }
21554c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
21564c80bfbdSHoward Hinnant    else
21574c80bfbdSHoward Hinnant        __get_db()->swap(this, &__u);
21584c80bfbdSHoward Hinnant#endif
21593e519524SHoward Hinnant}
21603e519524SHoward Hinnant
21613e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21623e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21633e519524SHoward Hinnant        initializer_list<value_type> __il)
21643e519524SHoward Hinnant{
2165b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2166b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2167b24c8024SHoward Hinnant#endif
21683e519524SHoward Hinnant    insert(__il.begin(), __il.end());
21693e519524SHoward Hinnant}
21703e519524SHoward Hinnant
21713e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21723e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21733e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
21743e519524SHoward Hinnant        const key_equal& __eql)
21753e519524SHoward Hinnant    : __table_(__hf, __eql)
21763e519524SHoward Hinnant{
2177b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2178b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2179b24c8024SHoward Hinnant#endif
21803e519524SHoward Hinnant    __table_.rehash(__n);
21813e519524SHoward Hinnant    insert(__il.begin(), __il.end());
21823e519524SHoward Hinnant}
21833e519524SHoward Hinnant
21843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
21853e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap(
21863e519524SHoward Hinnant        initializer_list<value_type> __il, size_type __n, const hasher& __hf,
21873e519524SHoward Hinnant        const key_equal& __eql, const allocator_type& __a)
21882a10c960SMarshall Clow    : __table_(__hf, __eql, typename __table::allocator_type(__a))
21893e519524SHoward Hinnant{
2190b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2
2191b24c8024SHoward Hinnant    __get_db()->__insert_c(this);
2192b24c8024SHoward Hinnant#endif
21933e519524SHoward Hinnant    __table_.rehash(__n);
21943e519524SHoward Hinnant    insert(__il.begin(), __il.end());
21953e519524SHoward Hinnant}
21963e519524SHoward Hinnant
21973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2198cd31b434SEvgeniy Stepanovinline
21993e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
22003e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u)
22013714107eSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
22023e519524SHoward Hinnant{
2203ce48a113SHoward Hinnant    __table_ = _VSTD::move(__u.__table_);
22043e519524SHoward Hinnant    return *this;
22053e519524SHoward Hinnant}
22063e519524SHoward Hinnant
22073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2208cd31b434SEvgeniy Stepanovinline
22093e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>&
22103e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(
22113e519524SHoward Hinnant        initializer_list<value_type> __il)
22123e519524SHoward Hinnant{
22133e519524SHoward Hinnant    __table_.__assign_multi(__il.begin(), __il.end());
22143e519524SHoward Hinnant    return *this;
22153e519524SHoward Hinnant}
22163e519524SHoward Hinnant
22176a470bcbSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
221854976f26SHoward Hinnant
22193e519524SHoward Hinnant
22203e519524SHoward Hinnant
22213e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22223e519524SHoward Hinnanttemplate <class _InputIterator>
2223cd31b434SEvgeniy Stepanovinline
22243e519524SHoward Hinnantvoid
22253e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
22263e519524SHoward Hinnant                                                            _InputIterator __last)
22273e519524SHoward Hinnant{
22283e519524SHoward Hinnant    for (; __first != __last; ++__first)
22293e519524SHoward Hinnant        __table_.__insert_multi(*__first);
22303e519524SHoward Hinnant}
22313e519524SHoward Hinnant
22323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2233789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22343e519524SHoward Hinnantvoid
22353e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
22363e519524SHoward Hinnant     unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22373714107eSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
22383e519524SHoward Hinnant{
22393e519524SHoward Hinnant    __x.swap(__y);
22403e519524SHoward Hinnant}
22413e519524SHoward Hinnant
22423e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
22433e519524SHoward Hinnantbool
22443e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
22453e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22463e519524SHoward Hinnant{
22473e519524SHoward Hinnant    if (__x.size() != __y.size())
22483e519524SHoward Hinnant        return false;
22493e519524SHoward Hinnant    typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator
22503e519524SHoward Hinnant                                                                 const_iterator;
22513e519524SHoward Hinnant    typedef pair<const_iterator, const_iterator> _EqRng;
22523e519524SHoward Hinnant    for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
22533e519524SHoward Hinnant    {
22543e519524SHoward Hinnant        _EqRng __xeq = __x.equal_range(__i->first);
22553e519524SHoward Hinnant        _EqRng __yeq = __y.equal_range(__i->first);
2256ce48a113SHoward Hinnant        if (_VSTD::distance(__xeq.first, __xeq.second) !=
2257ce48a113SHoward Hinnant            _VSTD::distance(__yeq.first, __yeq.second) ||
2258ce48a113SHoward Hinnant                  !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
22593e519524SHoward Hinnant            return false;
22603e519524SHoward Hinnant        __i = __xeq.second;
22613e519524SHoward Hinnant    }
22623e519524SHoward Hinnant    return true;
22633e519524SHoward Hinnant}
22643e519524SHoward Hinnant
22653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2266789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22673e519524SHoward Hinnantbool
22683e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
22693e519524SHoward Hinnant           const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
22703e519524SHoward Hinnant{
22713e519524SHoward Hinnant    return !(__x == __y);
22723e519524SHoward Hinnant}
22733e519524SHoward Hinnant
22743e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
22753e519524SHoward Hinnant
22763e519524SHoward Hinnant#endif  // _LIBCPP_UNORDERED_MAP
2277