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