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