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