13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===-------------------------- unordered_map -----------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_UNORDERED_MAP 113e519524SHoward Hinnant#define _LIBCPP_UNORDERED_MAP 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant 153e519524SHoward Hinnant unordered_map synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnant#include <initializer_list> 183e519524SHoward Hinnant 193e519524SHoward Hinnantnamespace std 203e519524SHoward Hinnant{ 213e519524SHoward Hinnant 223e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 233e519524SHoward Hinnant class Alloc = allocator<pair<const Key, T>>> 243e519524SHoward Hinnantclass unordered_map 253e519524SHoward Hinnant{ 263e519524SHoward Hinnantpublic: 273e519524SHoward Hinnant // types 283e519524SHoward Hinnant typedef Key key_type; 293e519524SHoward Hinnant typedef T mapped_type; 303e519524SHoward Hinnant typedef Hash hasher; 313e519524SHoward Hinnant typedef Pred key_equal; 323e519524SHoward Hinnant typedef Alloc allocator_type; 333e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 343e519524SHoward Hinnant typedef value_type& reference; 353e519524SHoward Hinnant typedef const value_type& const_reference; 363e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 373e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 383e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 393e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 403e519524SHoward Hinnant 413e519524SHoward Hinnant typedef /unspecified/ iterator; 423e519524SHoward Hinnant typedef /unspecified/ const_iterator; 433e519524SHoward Hinnant typedef /unspecified/ local_iterator; 443e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 453e519524SHoward Hinnant 46b0386a51SErik Pilkington typedef unspecified node_type; // C++17 47b0386a51SErik Pilkington typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17 48b0386a51SErik Pilkington 493714107eSHoward Hinnant unordered_map() 503714107eSHoward Hinnant noexcept( 513714107eSHoward Hinnant is_nothrow_default_constructible<hasher>::value && 523714107eSHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 533714107eSHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 543714107eSHoward Hinnant explicit unordered_map(size_type n, const hasher& hf = hasher(), 553e519524SHoward Hinnant const key_equal& eql = key_equal(), 563e519524SHoward Hinnant const allocator_type& a = allocator_type()); 573e519524SHoward Hinnant template <class InputIterator> 583e519524SHoward Hinnant unordered_map(InputIterator f, InputIterator l, 593e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 603e519524SHoward Hinnant const key_equal& eql = key_equal(), 613e519524SHoward Hinnant const allocator_type& a = allocator_type()); 623e519524SHoward Hinnant explicit unordered_map(const allocator_type&); 633e519524SHoward Hinnant unordered_map(const unordered_map&); 643e519524SHoward Hinnant unordered_map(const unordered_map&, const Allocator&); 653714107eSHoward Hinnant unordered_map(unordered_map&&) 663714107eSHoward Hinnant noexcept( 673714107eSHoward Hinnant is_nothrow_move_constructible<hasher>::value && 683714107eSHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 693714107eSHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 703e519524SHoward Hinnant unordered_map(unordered_map&&, const Allocator&); 713e519524SHoward Hinnant unordered_map(initializer_list<value_type>, size_type n = 0, 723e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 733e519524SHoward Hinnant const allocator_type& a = allocator_type()); 743cd37e64SMarshall Clow unordered_map(size_type n, const allocator_type& a) 753cd37e64SMarshall Clow : unordered_map(n, hasher(), key_equal(), a) {} // C++14 763cd37e64SMarshall Clow unordered_map(size_type n, const hasher& hf, const allocator_type& a) 773cd37e64SMarshall Clow : unordered_map(n, hf, key_equal(), a) {} // C++14 783cd37e64SMarshall Clow template <class InputIterator> 793cd37e64SMarshall Clow unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 803cd37e64SMarshall Clow : unordered_map(f, l, n, hasher(), key_equal(), a) {} // C++14 813cd37e64SMarshall Clow template <class InputIterator> 823cd37e64SMarshall Clow unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf, 833cd37e64SMarshall Clow const allocator_type& a) 843cd37e64SMarshall Clow : unordered_map(f, l, n, hf, key_equal(), a) {} // C++14 853cd37e64SMarshall Clow unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a) 863cd37e64SMarshall Clow : unordered_map(il, n, hasher(), key_equal(), a) {} // C++14 873cd37e64SMarshall Clow unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf, 883cd37e64SMarshall Clow const allocator_type& a) 893cd37e64SMarshall Clow : unordered_map(il, n, hf, key_equal(), a) {} // C++14 903e519524SHoward Hinnant ~unordered_map(); 913e519524SHoward Hinnant unordered_map& operator=(const unordered_map&); 923714107eSHoward Hinnant unordered_map& operator=(unordered_map&&) 933714107eSHoward Hinnant noexcept( 943714107eSHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 953714107eSHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 963714107eSHoward Hinnant is_nothrow_move_assignable<hasher>::value && 973714107eSHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 983e519524SHoward Hinnant unordered_map& operator=(initializer_list<value_type>); 993e519524SHoward Hinnant 1003714107eSHoward Hinnant allocator_type get_allocator() const noexcept; 1013e519524SHoward Hinnant 1023714107eSHoward Hinnant bool empty() const noexcept; 1033714107eSHoward Hinnant size_type size() const noexcept; 1043714107eSHoward Hinnant size_type max_size() const noexcept; 1053e519524SHoward Hinnant 1063714107eSHoward Hinnant iterator begin() noexcept; 1073714107eSHoward Hinnant iterator end() noexcept; 1083714107eSHoward Hinnant const_iterator begin() const noexcept; 1093714107eSHoward Hinnant const_iterator end() const noexcept; 1103714107eSHoward Hinnant const_iterator cbegin() const noexcept; 1113714107eSHoward Hinnant const_iterator cend() const noexcept; 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant template <class... Args> 1143e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1153e519524SHoward Hinnant template <class... Args> 1163e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1173e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& obj); 1183e519524SHoward Hinnant template <class P> 1193e519524SHoward Hinnant pair<iterator, bool> insert(P&& obj); 1203e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 1213e519524SHoward Hinnant template <class P> 1223e519524SHoward Hinnant iterator insert(const_iterator hint, P&& obj); 1233e519524SHoward Hinnant template <class InputIterator> 1243e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1253e519524SHoward Hinnant void insert(initializer_list<value_type>); 1263e519524SHoward Hinnant 127b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 128b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 129b0386a51SErik Pilkington insert_return_type insert(node_type&& nh); // C++17 130b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 131b0386a51SErik Pilkington 132bc4c89a9SMarshall Clow template <class... Args> 133bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 134bc4c89a9SMarshall Clow template <class... Args> 135bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 136bc4c89a9SMarshall Clow template <class... Args> 137bc4c89a9SMarshall Clow iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 138bc4c89a9SMarshall Clow template <class... Args> 139bc4c89a9SMarshall Clow iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 140bc4c89a9SMarshall Clow template <class M> 141bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 142bc4c89a9SMarshall Clow template <class M> 143bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 144bc4c89a9SMarshall Clow template <class M> 145bc4c89a9SMarshall Clow iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 146bc4c89a9SMarshall Clow template <class M> 147bc4c89a9SMarshall Clow iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 148bc4c89a9SMarshall Clow 1493e519524SHoward Hinnant iterator erase(const_iterator position); 150ec392968SMarshall Clow iterator erase(iterator position); // C++14 1513e519524SHoward Hinnant size_type erase(const key_type& k); 1523e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1533714107eSHoward Hinnant void clear() noexcept; 1543e519524SHoward Hinnant 1555c4e07aeSErik Pilkington template<class H2, class P2> 1565c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17 1575c4e07aeSErik Pilkington template<class H2, class P2> 1585c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17 1595c4e07aeSErik Pilkington template<class H2, class P2> 1605c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17 1615c4e07aeSErik Pilkington template<class H2, class P2> 1625c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17 1635c4e07aeSErik Pilkington 1643714107eSHoward Hinnant void swap(unordered_map&) 1653714107eSHoward Hinnant noexcept( 1663714107eSHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 1673714107eSHoward Hinnant __is_nothrow_swappable<allocator_type>::value) && 1683714107eSHoward Hinnant __is_nothrow_swappable<hasher>::value && 1693714107eSHoward Hinnant __is_nothrow_swappable<key_equal>::value); 1703e519524SHoward Hinnant 1713e519524SHoward Hinnant hasher hash_function() const; 1723e519524SHoward Hinnant key_equal key_eq() const; 1733e519524SHoward Hinnant 1743e519524SHoward Hinnant iterator find(const key_type& k); 1753e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1763e519524SHoward Hinnant size_type count(const key_type& k) const; 1773e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 1783e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 1793e519524SHoward Hinnant 1803e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1813e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1823e519524SHoward Hinnant 1833e519524SHoward Hinnant mapped_type& at(const key_type& k); 1843e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1853e519524SHoward Hinnant 1863714107eSHoward Hinnant size_type bucket_count() const noexcept; 1873714107eSHoward Hinnant size_type max_bucket_count() const noexcept; 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant size_type bucket_size(size_type n) const; 1903e519524SHoward Hinnant size_type bucket(const key_type& k) const; 1913e519524SHoward Hinnant 1923e519524SHoward Hinnant local_iterator begin(size_type n); 1933e519524SHoward Hinnant local_iterator end(size_type n); 1943e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 1953e519524SHoward Hinnant const_local_iterator end(size_type n) const; 1963e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 1973e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 1983e519524SHoward Hinnant 1993714107eSHoward Hinnant float load_factor() const noexcept; 2003714107eSHoward Hinnant float max_load_factor() const noexcept; 2013e519524SHoward Hinnant void max_load_factor(float z); 2023e519524SHoward Hinnant void rehash(size_type n); 2033e519524SHoward Hinnant void reserve(size_type n); 2043e519524SHoward Hinnant}; 2053e519524SHoward Hinnant 2063e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2073e519524SHoward Hinnant void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 2083714107eSHoward Hinnant unordered_map<Key, T, Hash, Pred, Alloc>& y) 2093714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 2103e519524SHoward Hinnant 2113e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2123e519524SHoward Hinnant bool 2133e519524SHoward Hinnant operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2143e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2153e519524SHoward Hinnant 2163e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2173e519524SHoward Hinnant bool 2183e519524SHoward Hinnant operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2193e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2203e519524SHoward Hinnant 2213e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 2223e519524SHoward Hinnant class Alloc = allocator<pair<const Key, T>>> 2233e519524SHoward Hinnantclass unordered_multimap 2243e519524SHoward Hinnant{ 2253e519524SHoward Hinnantpublic: 2263e519524SHoward Hinnant // types 2273e519524SHoward Hinnant typedef Key key_type; 2283e519524SHoward Hinnant typedef T mapped_type; 2293e519524SHoward Hinnant typedef Hash hasher; 2303e519524SHoward Hinnant typedef Pred key_equal; 2313e519524SHoward Hinnant typedef Alloc allocator_type; 2323e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 2333e519524SHoward Hinnant typedef value_type& reference; 2343e519524SHoward Hinnant typedef const value_type& const_reference; 2353e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 2363e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 2373e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 2383e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 2393e519524SHoward Hinnant 2403e519524SHoward Hinnant typedef /unspecified/ iterator; 2413e519524SHoward Hinnant typedef /unspecified/ const_iterator; 2423e519524SHoward Hinnant typedef /unspecified/ local_iterator; 2433e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 2443e519524SHoward Hinnant 245b0386a51SErik Pilkington typedef unspecified node_type; // C++17 246b0386a51SErik Pilkington 2473714107eSHoward Hinnant unordered_multimap() 2483714107eSHoward Hinnant noexcept( 2493714107eSHoward Hinnant is_nothrow_default_constructible<hasher>::value && 2503714107eSHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 2513714107eSHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 2523714107eSHoward Hinnant explicit unordered_multimap(size_type n, const hasher& hf = hasher(), 2533e519524SHoward Hinnant const key_equal& eql = key_equal(), 2543e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2553e519524SHoward Hinnant template <class InputIterator> 2563e519524SHoward Hinnant unordered_multimap(InputIterator f, InputIterator l, 2573e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 2583e519524SHoward Hinnant const key_equal& eql = key_equal(), 2593e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2603e519524SHoward Hinnant explicit unordered_multimap(const allocator_type&); 2613e519524SHoward Hinnant unordered_multimap(const unordered_multimap&); 2623e519524SHoward Hinnant unordered_multimap(const unordered_multimap&, const Allocator&); 2633714107eSHoward Hinnant unordered_multimap(unordered_multimap&&) 2643714107eSHoward Hinnant noexcept( 2653714107eSHoward Hinnant is_nothrow_move_constructible<hasher>::value && 2663714107eSHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 2673714107eSHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 2683e519524SHoward Hinnant unordered_multimap(unordered_multimap&&, const Allocator&); 2693e519524SHoward Hinnant unordered_multimap(initializer_list<value_type>, size_type n = 0, 2703e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 2713e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2723cd37e64SMarshall Clow unordered_multimap(size_type n, const allocator_type& a) 2733cd37e64SMarshall Clow : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14 2743cd37e64SMarshall Clow unordered_multimap(size_type n, const hasher& hf, const allocator_type& a) 2753cd37e64SMarshall Clow : unordered_multimap(n, hf, key_equal(), a) {} // C++14 2763cd37e64SMarshall Clow template <class InputIterator> 2773cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 2783cd37e64SMarshall Clow : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14 2793cd37e64SMarshall Clow template <class InputIterator> 2803cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, 2813cd37e64SMarshall Clow const allocator_type& a) 2823cd37e64SMarshall Clow : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14 2833cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a) 2843cd37e64SMarshall Clow : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14 2853cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, 2863cd37e64SMarshall Clow const allocator_type& a) 2873cd37e64SMarshall Clow : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14 2883e519524SHoward Hinnant ~unordered_multimap(); 2893e519524SHoward Hinnant unordered_multimap& operator=(const unordered_multimap&); 2903714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&&) 2913714107eSHoward Hinnant noexcept( 2923714107eSHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 2933714107eSHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 2943714107eSHoward Hinnant is_nothrow_move_assignable<hasher>::value && 2953714107eSHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 2963e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type>); 2973e519524SHoward Hinnant 2983714107eSHoward Hinnant allocator_type get_allocator() const noexcept; 2993e519524SHoward Hinnant 3003714107eSHoward Hinnant bool empty() const noexcept; 3013714107eSHoward Hinnant size_type size() const noexcept; 3023714107eSHoward Hinnant size_type max_size() const noexcept; 3033e519524SHoward Hinnant 3043714107eSHoward Hinnant iterator begin() noexcept; 3053714107eSHoward Hinnant iterator end() noexcept; 3063714107eSHoward Hinnant const_iterator begin() const noexcept; 3073714107eSHoward Hinnant const_iterator end() const noexcept; 3083714107eSHoward Hinnant const_iterator cbegin() const noexcept; 3093714107eSHoward Hinnant const_iterator cend() const noexcept; 3103e519524SHoward Hinnant 3113e519524SHoward Hinnant template <class... Args> 3123e519524SHoward Hinnant iterator emplace(Args&&... args); 3133e519524SHoward Hinnant template <class... Args> 3143e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3153e519524SHoward Hinnant iterator insert(const value_type& obj); 3163e519524SHoward Hinnant template <class P> 3173e519524SHoward Hinnant iterator insert(P&& obj); 3183e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 3193e519524SHoward Hinnant template <class P> 3203e519524SHoward Hinnant iterator insert(const_iterator hint, P&& obj); 3213e519524SHoward Hinnant template <class InputIterator> 3223e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3233e519524SHoward Hinnant void insert(initializer_list<value_type>); 3243e519524SHoward Hinnant 325b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 326b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 327b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 328b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 329b0386a51SErik Pilkington 3303e519524SHoward Hinnant iterator erase(const_iterator position); 331ec392968SMarshall Clow iterator erase(iterator position); // C++14 3323e519524SHoward Hinnant size_type erase(const key_type& k); 3333e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3343714107eSHoward Hinnant void clear() noexcept; 3353e519524SHoward Hinnant 3365c4e07aeSErik Pilkington template<class H2, class P2> 3375c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17 3385c4e07aeSErik Pilkington template<class H2, class P2> 3395c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17 3405c4e07aeSErik Pilkington template<class H2, class P2> 3415c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17 3425c4e07aeSErik Pilkington template<class H2, class P2> 3435c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17 3445c4e07aeSErik Pilkington 3453714107eSHoward Hinnant void swap(unordered_multimap&) 3463714107eSHoward Hinnant noexcept( 3473714107eSHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 3483714107eSHoward Hinnant __is_nothrow_swappable<allocator_type>::value) && 3493714107eSHoward Hinnant __is_nothrow_swappable<hasher>::value && 3503714107eSHoward Hinnant __is_nothrow_swappable<key_equal>::value); 3513e519524SHoward Hinnant 3523e519524SHoward Hinnant hasher hash_function() const; 3533e519524SHoward Hinnant key_equal key_eq() const; 3543e519524SHoward Hinnant 3553e519524SHoward Hinnant iterator find(const key_type& k); 3563e519524SHoward Hinnant const_iterator find(const key_type& k) const; 3573e519524SHoward Hinnant size_type count(const key_type& k) const; 3583e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 3593e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 3603e519524SHoward Hinnant 3613714107eSHoward Hinnant size_type bucket_count() const noexcept; 3623714107eSHoward Hinnant size_type max_bucket_count() const noexcept; 3633e519524SHoward Hinnant 3643e519524SHoward Hinnant size_type bucket_size(size_type n) const; 3653e519524SHoward Hinnant size_type bucket(const key_type& k) const; 3663e519524SHoward Hinnant 3673e519524SHoward Hinnant local_iterator begin(size_type n); 3683e519524SHoward Hinnant local_iterator end(size_type n); 3693e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 3703e519524SHoward Hinnant const_local_iterator end(size_type n) const; 3713e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 3723e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 3733e519524SHoward Hinnant 3743714107eSHoward Hinnant float load_factor() const noexcept; 3753714107eSHoward Hinnant float max_load_factor() const noexcept; 3763e519524SHoward Hinnant void max_load_factor(float z); 3773e519524SHoward Hinnant void rehash(size_type n); 3783e519524SHoward Hinnant void reserve(size_type n); 3793e519524SHoward Hinnant}; 3803e519524SHoward Hinnant 3813e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 3823e519524SHoward Hinnant void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 3833714107eSHoward Hinnant unordered_multimap<Key, T, Hash, Pred, Alloc>& y) 3843714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 3853e519524SHoward Hinnant 386f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 387f60c63c0SMarshall Clow void erase_if(unordered_set<K, T, H, P, A>& c, Predicate pred); // C++20 388f60c63c0SMarshall Clow 389f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 390f60c63c0SMarshall Clow void erase_if(unordered_multiset<K, T, H, P, A>& c, Predicate pred); // C++20 391f60c63c0SMarshall Clow 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 Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 3983e519524SHoward Hinnant bool 3993e519524SHoward Hinnant operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 4003e519524SHoward Hinnant const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 4013e519524SHoward Hinnant 4023e519524SHoward Hinnant} // std 4033e519524SHoward Hinnant 4043e519524SHoward Hinnant*/ 4053e519524SHoward Hinnant 4063e519524SHoward Hinnant#include <__config> 4073e519524SHoward Hinnant#include <__hash_table> 408b0386a51SErik Pilkington#include <__node_handle> 4093e519524SHoward Hinnant#include <functional> 4103e519524SHoward Hinnant#include <stdexcept> 4110f905677SEric Fiselier#include <tuple> 412f56972e2SMarshall Clow#include <version> 4133e519524SHoward Hinnant 414c1bd9197SEric Fiselier#include <__debug> 415c1bd9197SEric Fiselier 416073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4173e519524SHoward Hinnant#pragma GCC system_header 418073458b1SHoward Hinnant#endif 4193e519524SHoward Hinnant 4203e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 4213e519524SHoward Hinnant 4223560fbf3SLouis Dionnetemplate <class _Key, class _Cp, class _Hash, 4233560fbf3SLouis Dionne bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value> 4243e519524SHoward Hinnantclass __unordered_map_hasher 4253e519524SHoward Hinnant : private _Hash 4263e519524SHoward Hinnant{ 4273e519524SHoward Hinnantpublic: 428789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4293714107eSHoward Hinnant __unordered_map_hasher() 4303714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 4313714107eSHoward Hinnant : _Hash() {} 432789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4333714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 4343714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 4353714107eSHoward Hinnant : _Hash(__h) {} 436789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4373714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return *this;} 438789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 439a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 440f52318b4SErik Pilkington {return static_cast<const _Hash&>(*this)(__x.__get_value().first);} 441a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 442a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 4433e519524SHoward Hinnant {return static_cast<const _Hash&>(*this)(__x);} 444e3fbe143SMarshall Clow void swap(__unordered_map_hasher&__y) 445e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 446e3fbe143SMarshall Clow { 447e3fbe143SMarshall Clow using _VSTD::swap; 448b3f57425SEric Fiselier swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y)); 449e3fbe143SMarshall Clow } 4503e519524SHoward Hinnant}; 4513e519524SHoward Hinnant 452abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Hash> 453abb160e6SHoward Hinnantclass __unordered_map_hasher<_Key, _Cp, _Hash, false> 4543e519524SHoward Hinnant{ 4553e519524SHoward Hinnant _Hash __hash_; 4563e519524SHoward Hinnantpublic: 457789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4583714107eSHoward Hinnant __unordered_map_hasher() 4593714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 4603714107eSHoward Hinnant : __hash_() {} 461789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4623714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 4633714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 4643714107eSHoward Hinnant : __hash_(__h) {} 465789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4663714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return __hash_;} 467789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 468a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 469f52318b4SErik Pilkington {return __hash_(__x.__get_value().first);} 470a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 471a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 4723e519524SHoward Hinnant {return __hash_(__x);} 473e3fbe143SMarshall Clow void swap(__unordered_map_hasher&__y) 474e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 475e3fbe143SMarshall Clow { 476e3fbe143SMarshall Clow using _VSTD::swap; 477e3fbe143SMarshall Clow swap(__hash_, __y.__hash_); 478e3fbe143SMarshall Clow } 4793e519524SHoward Hinnant}; 4803e519524SHoward Hinnant 481e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Hash, bool __b> 482e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 483e3fbe143SMarshall Clowvoid 484e3fbe143SMarshall Clowswap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x, 485e3fbe143SMarshall Clow __unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y) 486e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 487e3fbe143SMarshall Clow{ 488e3fbe143SMarshall Clow __x.swap(__y); 489e3fbe143SMarshall Clow} 490e3fbe143SMarshall Clow 4913560fbf3SLouis Dionnetemplate <class _Key, class _Cp, class _Pred, 4923560fbf3SLouis Dionne bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value> 4933e519524SHoward Hinnantclass __unordered_map_equal 4943e519524SHoward Hinnant : private _Pred 4953e519524SHoward Hinnant{ 4963e519524SHoward Hinnantpublic: 497789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4983714107eSHoward Hinnant __unordered_map_equal() 4993714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 5003714107eSHoward Hinnant : _Pred() {} 501789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5023714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 5033714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 5043714107eSHoward Hinnant : _Pred(__p) {} 505789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5063714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return *this;} 507789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 508a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 509f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);} 510a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 511a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 512f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);} 513a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 514a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 515f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);} 516e3fbe143SMarshall Clow void swap(__unordered_map_equal&__y) 517e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 518e3fbe143SMarshall Clow { 519e3fbe143SMarshall Clow using _VSTD::swap; 520b3f57425SEric Fiselier swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y)); 521e3fbe143SMarshall Clow } 5223e519524SHoward Hinnant}; 5233e519524SHoward Hinnant 524abb160e6SHoward Hinnanttemplate <class _Key, class _Cp, class _Pred> 525abb160e6SHoward Hinnantclass __unordered_map_equal<_Key, _Cp, _Pred, false> 5263e519524SHoward Hinnant{ 5273e519524SHoward Hinnant _Pred __pred_; 5283e519524SHoward Hinnantpublic: 529789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5303714107eSHoward Hinnant __unordered_map_equal() 5313714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 5323714107eSHoward Hinnant : __pred_() {} 533789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5343714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 5353714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 5363714107eSHoward Hinnant : __pred_(__p) {} 537789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5383714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return __pred_;} 539789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 540a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 541f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y.__get_value().first);} 542a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 543a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 544f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y);} 545a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 546a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 547f52318b4SErik Pilkington {return __pred_(__x, __y.__get_value().first);} 548e3fbe143SMarshall Clow void swap(__unordered_map_equal&__y) 549e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 550e3fbe143SMarshall Clow { 551e3fbe143SMarshall Clow using _VSTD::swap; 552e3fbe143SMarshall Clow swap(__pred_, __y.__pred_); 553e3fbe143SMarshall Clow } 5543e519524SHoward Hinnant}; 5553e519524SHoward Hinnant 556e3fbe143SMarshall Clowtemplate <class _Key, class _Cp, class _Pred, bool __b> 557e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 558e3fbe143SMarshall Clowvoid 559e3fbe143SMarshall Clowswap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x, 560e3fbe143SMarshall Clow __unordered_map_equal<_Key, _Cp, _Pred, __b>& __y) 561e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 562e3fbe143SMarshall Clow{ 563e3fbe143SMarshall Clow __x.swap(__y); 564e3fbe143SMarshall Clow} 565e3fbe143SMarshall Clow 5663e519524SHoward Hinnanttemplate <class _Alloc> 5673e519524SHoward Hinnantclass __hash_map_node_destructor 5683e519524SHoward Hinnant{ 5693e519524SHoward Hinnant typedef _Alloc allocator_type; 5703e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 57175d0dcfdSEric Fiselier 5723e519524SHoward Hinnantpublic: 57375d0dcfdSEric Fiselier 5743e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 5753e519524SHoward Hinnantprivate: 5763e519524SHoward Hinnant 5773e519524SHoward Hinnant allocator_type& __na_; 5783e519524SHoward Hinnant 5793e519524SHoward Hinnant __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); 5803e519524SHoward Hinnant 5813e519524SHoward Hinnantpublic: 5823e519524SHoward Hinnant bool __first_constructed; 5833e519524SHoward Hinnant bool __second_constructed; 5843e519524SHoward Hinnant 585789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5863714107eSHoward Hinnant explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT 5873e519524SHoward Hinnant : __na_(__na), 5883e519524SHoward Hinnant __first_constructed(false), 5893e519524SHoward Hinnant __second_constructed(false) 5903e519524SHoward Hinnant {} 5913e519524SHoward Hinnant 5926a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 593789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5943e519524SHoward Hinnant __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) 5953714107eSHoward Hinnant _NOEXCEPT 5963e519524SHoward Hinnant : __na_(__x.__na_), 5973e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 5983e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 5993e519524SHoward Hinnant { 6003e519524SHoward Hinnant __x.__value_constructed = false; 6013e519524SHoward Hinnant } 6026a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 603789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6043e519524SHoward Hinnant __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) 6053e519524SHoward Hinnant : __na_(__x.__na_), 6063e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6073e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6083e519524SHoward Hinnant { 6093e519524SHoward Hinnant const_cast<bool&>(__x.__value_constructed) = false; 6103e519524SHoward Hinnant } 6116a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 6123e519524SHoward Hinnant 613789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6143714107eSHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6153e519524SHoward Hinnant { 6163e519524SHoward Hinnant if (__second_constructed) 617f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 6183e519524SHoward Hinnant if (__first_constructed) 619f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 6203e519524SHoward Hinnant if (__p) 6213e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 6223e519524SHoward Hinnant } 6233e519524SHoward Hinnant}; 6243e519524SHoward Hinnant 625fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6269fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 627f52318b4SErik Pilkingtonstruct __hash_value_type 6289fd9f84fSHoward Hinnant{ 6299fd9f84fSHoward Hinnant typedef _Key key_type; 6309fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6319fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 632f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 633f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 6349fd9f84fSHoward Hinnant 635f52318b4SErik Pilkingtonprivate: 6369fd9f84fSHoward Hinnant value_type __cc; 637f52318b4SErik Pilkington 638f52318b4SErik Pilkingtonpublic: 639f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 640f52318b4SErik Pilkington value_type& __get_value() 641f52318b4SErik Pilkington { 642f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 643f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 644f52318b4SErik Pilkington#else 645f52318b4SErik Pilkington return __cc; 646f52318b4SErik Pilkington#endif 647f52318b4SErik Pilkington } 648f52318b4SErik Pilkington 649f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 650f52318b4SErik Pilkington const value_type& __get_value() const 651f52318b4SErik Pilkington { 652f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 653f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 654f52318b4SErik Pilkington#else 655f52318b4SErik Pilkington return __cc; 656f52318b4SErik Pilkington#endif 657f52318b4SErik Pilkington } 658f52318b4SErik Pilkington 659f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 660f52318b4SErik Pilkington __nc_ref_pair_type __ref() 661f52318b4SErik Pilkington { 662f52318b4SErik Pilkington value_type& __v = __get_value(); 663f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 664f52318b4SErik Pilkington } 665f52318b4SErik Pilkington 666f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 667f52318b4SErik Pilkington __nc_rref_pair_type __move() 668f52318b4SErik Pilkington { 669f52318b4SErik Pilkington value_type& __v = __get_value(); 670f52318b4SErik Pilkington return __nc_rref_pair_type( 671f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 672f52318b4SErik Pilkington _VSTD::move(__v.second)); 673f52318b4SErik Pilkington } 6749fd9f84fSHoward Hinnant 6759fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6769fd9f84fSHoward Hinnant __hash_value_type& operator=(const __hash_value_type& __v) 677f52318b4SErik Pilkington { 678f52318b4SErik Pilkington __ref() = __v.__get_value(); 679f52318b4SErik Pilkington return *this; 680f52318b4SErik Pilkington } 6819fd9f84fSHoward Hinnant 6829fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6839fd9f84fSHoward Hinnant __hash_value_type& operator=(__hash_value_type&& __v) 684f52318b4SErik Pilkington { 685f52318b4SErik Pilkington __ref() = __v.__move(); 686f52318b4SErik Pilkington return *this; 687f52318b4SErik Pilkington } 6889fd9f84fSHoward Hinnant 689fcd02211SEric Fiselier template <class _ValueTp, 690fcd02211SEric Fiselier class = typename enable_if< 691fcd02211SEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 692fcd02211SEric Fiselier >::type 693fcd02211SEric Fiselier > 6949fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 695f52318b4SErik Pilkington __hash_value_type& operator=(_ValueTp&& __v) 696f52318b4SErik Pilkington { 697f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 698f52318b4SErik Pilkington return *this; 699fcd02211SEric Fiselier } 700fcd02211SEric Fiselier 701fcd02211SEric Fiselierprivate: 702fcd02211SEric Fiselier __hash_value_type(const __hash_value_type& __v) = delete; 703fcd02211SEric Fiselier __hash_value_type(__hash_value_type&& __v) = delete; 704fcd02211SEric Fiselier template <class ..._Args> 705fcd02211SEric Fiselier explicit __hash_value_type(_Args&& ...__args) = delete; 706fcd02211SEric Fiselier 707fcd02211SEric Fiselier ~__hash_value_type() = delete; 7089fd9f84fSHoward Hinnant}; 7099fd9f84fSHoward Hinnant 7109fd9f84fSHoward Hinnant#else 7119fd9f84fSHoward Hinnant 7129fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7139fd9f84fSHoward Hinnantstruct __hash_value_type 7149fd9f84fSHoward Hinnant{ 7159fd9f84fSHoward Hinnant typedef _Key key_type; 7169fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7179fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 7189fd9f84fSHoward Hinnant 719f52318b4SErik Pilkingtonprivate: 7209fd9f84fSHoward Hinnant value_type __cc; 7219fd9f84fSHoward Hinnant 722f52318b4SErik Pilkingtonpublic: 723f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 724f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 725f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 726f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 727f52318b4SErik Pilkington 728fcd02211SEric Fiselierprivate: 729fcd02211SEric Fiselier ~__hash_value_type(); 7309fd9f84fSHoward Hinnant}; 7319fd9f84fSHoward Hinnant 7329fd9f84fSHoward Hinnant#endif 7339fd9f84fSHoward Hinnant 7343e519524SHoward Hinnanttemplate <class _HashIterator> 735e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator 7363e519524SHoward Hinnant{ 7373e519524SHoward Hinnant _HashIterator __i_; 7383e519524SHoward Hinnant 73975d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 74075d0dcfdSEric Fiselier 7413e519524SHoward Hinnantpublic: 7423e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 74375d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 74475d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 7453e519524SHoward Hinnant typedef value_type& reference; 74675d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 7473e519524SHoward Hinnant 748789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7493714107eSHoward Hinnant __hash_map_iterator() _NOEXCEPT {} 7503e519524SHoward Hinnant 751789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7523714107eSHoward Hinnant __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 7533e519524SHoward Hinnant 754789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 755f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 756789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 757f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 7583e519524SHoward Hinnant 759789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7603e519524SHoward Hinnant __hash_map_iterator& operator++() {++__i_; return *this;} 761789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7623e519524SHoward Hinnant __hash_map_iterator operator++(int) 7633e519524SHoward Hinnant { 7643e519524SHoward Hinnant __hash_map_iterator __t(*this); 7653e519524SHoward Hinnant ++(*this); 7663e519524SHoward Hinnant return __t; 7673e519524SHoward Hinnant } 7683e519524SHoward Hinnant 769789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 770789847ddSHoward Hinnant bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 7713e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 772789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 773789847ddSHoward Hinnant bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 7743e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 7753e519524SHoward Hinnant 776e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 777e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 778e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 779e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 780e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; 7813e519524SHoward Hinnant}; 7823e519524SHoward Hinnant 7833e519524SHoward Hinnanttemplate <class _HashIterator> 784e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator 7853e519524SHoward Hinnant{ 7863e519524SHoward Hinnant _HashIterator __i_; 7873e519524SHoward Hinnant 78875d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 78975d0dcfdSEric Fiselier 7903e519524SHoward Hinnantpublic: 7913e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 79275d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 79375d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 7943e519524SHoward Hinnant typedef const value_type& reference; 79575d0dcfdSEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 7963e519524SHoward Hinnant 797789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7983714107eSHoward Hinnant __hash_map_const_iterator() _NOEXCEPT {} 7993e519524SHoward Hinnant 800789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8013714107eSHoward Hinnant __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 802789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8033e519524SHoward Hinnant __hash_map_const_iterator( 8043e519524SHoward Hinnant __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) 8053714107eSHoward Hinnant _NOEXCEPT 8063e519524SHoward Hinnant : __i_(__i.__i_) {} 8073e519524SHoward Hinnant 808789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 809f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 810789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 811f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8123e519524SHoward Hinnant 813789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8143e519524SHoward Hinnant __hash_map_const_iterator& operator++() {++__i_; return *this;} 815789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8163e519524SHoward Hinnant __hash_map_const_iterator operator++(int) 8173e519524SHoward Hinnant { 8183e519524SHoward Hinnant __hash_map_const_iterator __t(*this); 8193e519524SHoward Hinnant ++(*this); 8203e519524SHoward Hinnant return __t; 8213e519524SHoward Hinnant } 8223e519524SHoward Hinnant 823789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 824789847ddSHoward Hinnant bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 8253e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 826789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 827789847ddSHoward Hinnant bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 8283e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8293e519524SHoward Hinnant 830e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 831e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 832e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 833e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 8343e519524SHoward Hinnant}; 8353e519524SHoward Hinnant 8365c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 8375c4e07aeSErik Pilkingtonclass unordered_multimap; 8385c4e07aeSErik Pilkington 8393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 8403e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 841e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map 8423e519524SHoward Hinnant{ 8433e519524SHoward Hinnantpublic: 8443e519524SHoward Hinnant // types 8453e519524SHoward Hinnant typedef _Key key_type; 8463e519524SHoward Hinnant typedef _Tp mapped_type; 847*dfcd4384SLouis Dionne typedef typename __identity<_Hash>::type hasher; 848*dfcd4384SLouis Dionne typedef typename __identity<_Pred>::type key_equal; 849*dfcd4384SLouis Dionne typedef typename __identity<_Alloc>::type allocator_type; 8503e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 8513e519524SHoward Hinnant typedef value_type& reference; 8523e519524SHoward Hinnant typedef const value_type& const_reference; 853b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 854b24c8024SHoward Hinnant "Invalid allocator::value_type"); 8553e519524SHoward Hinnant 8563e519524SHoward Hinnantprivate: 8579fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 858abb160e6SHoward Hinnant typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; 859abb160e6SHoward Hinnant typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; 8601f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 8611f508014SMarshall Clow __value_type>::type __allocator_type; 8623e519524SHoward Hinnant 8633e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 8643e519524SHoward Hinnant __key_equal, __allocator_type> __table; 8653e519524SHoward Hinnant 8663e519524SHoward Hinnant __table __table_; 8673e519524SHoward Hinnant 868fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 8693e519524SHoward Hinnant typedef typename __table::__node_pointer __node_pointer; 8703e519524SHoward Hinnant typedef typename __table::__node_const_pointer __node_const_pointer; 8713e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 8723e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 8733e519524SHoward Hinnant typedef typename __table::__node __node; 874c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 875c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 8763e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 877fcd02211SEric Fiselier 878fcd02211SEric Fiselier static_assert((is_same<typename __table::__container_value_type, value_type>::value), ""); 879fcd02211SEric Fiselier static_assert((is_same<typename __table::__node_value_type, __value_type>::value), ""); 8803e519524SHoward Hinnantpublic: 8813e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 8823e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 88375d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 88475d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 8853e519524SHoward Hinnant 8863e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 8873e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 8883e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 8893e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 8903e519524SHoward Hinnant 891b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 892b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 893b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 894b0386a51SErik Pilkington#endif 895b0386a51SErik Pilkington 8965c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 8975c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 8985c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 8995c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 9005c4e07aeSErik Pilkington 901789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9023714107eSHoward Hinnant unordered_map() 9033714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 904b24c8024SHoward Hinnant { 905b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 906b24c8024SHoward Hinnant __get_db()->__insert_c(this); 907b24c8024SHoward Hinnant#endif 908b24c8024SHoward Hinnant } 9093e519524SHoward Hinnant explicit unordered_map(size_type __n, const hasher& __hf = hasher(), 9103e519524SHoward Hinnant const key_equal& __eql = key_equal()); 9113e519524SHoward Hinnant unordered_map(size_type __n, const hasher& __hf, 9123e519524SHoward Hinnant const key_equal& __eql, 9133e519524SHoward Hinnant const allocator_type& __a); 9143e519524SHoward Hinnant template <class _InputIterator> 9153e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last); 9163e519524SHoward Hinnant template <class _InputIterator> 9173e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 9183e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 9193e519524SHoward Hinnant const key_equal& __eql = key_equal()); 9203e519524SHoward Hinnant template <class _InputIterator> 9213e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 9223e519524SHoward Hinnant size_type __n, const hasher& __hf, 9233e519524SHoward Hinnant const key_equal& __eql, 9243e519524SHoward Hinnant const allocator_type& __a); 925cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 9263e519524SHoward Hinnant explicit unordered_map(const allocator_type& __a); 9273e519524SHoward Hinnant unordered_map(const unordered_map& __u); 9283e519524SHoward Hinnant unordered_map(const unordered_map& __u, const allocator_type& __a); 9296a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 930cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 9313714107eSHoward Hinnant unordered_map(unordered_map&& __u) 9323714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 9333e519524SHoward Hinnant unordered_map(unordered_map&& __u, const allocator_type& __a); 9343e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il); 9353e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 9363e519524SHoward Hinnant const hasher& __hf = hasher(), const key_equal& __eql = key_equal()); 9373e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 9383e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 9393e519524SHoward Hinnant const allocator_type& __a); 9406a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 9413cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 9423cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9433cd37e64SMarshall Clow unordered_map(size_type __n, const allocator_type& __a) 9443cd37e64SMarshall Clow : unordered_map(__n, hasher(), key_equal(), __a) {} 9453cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9463cd37e64SMarshall Clow unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a) 9473cd37e64SMarshall Clow : unordered_map(__n, __hf, key_equal(), __a) {} 9483cd37e64SMarshall Clow template <class _InputIterator> 9493cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9503cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 9513cd37e64SMarshall Clow : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {} 9523cd37e64SMarshall Clow template <class _InputIterator> 9533cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9543cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 9553cd37e64SMarshall Clow const allocator_type& __a) 9563cd37e64SMarshall Clow : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {} 9573cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9583cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 9593cd37e64SMarshall Clow : unordered_map(__il, __n, hasher(), key_equal(), __a) {} 9603cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 9613cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 9623cd37e64SMarshall Clow const allocator_type& __a) 9633cd37e64SMarshall Clow : unordered_map(__il, __n, __hf, key_equal(), __a) {} 9643cd37e64SMarshall Clow#endif 9657c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 9667c142fccSLouis Dionne ~unordered_map() { 9677c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 9687c142fccSLouis Dionne } 9697c142fccSLouis Dionne 9705a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9715a33687dSHoward Hinnant unordered_map& operator=(const unordered_map& __u) 9725a33687dSHoward Hinnant { 9732ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 9745a33687dSHoward Hinnant __table_ = __u.__table_; 975307f8143SHoward Hinnant#else 97674cf6ff5SMarshall Clow if (this != &__u) { 977307f8143SHoward Hinnant __table_.clear(); 978307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 979307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 980307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 981307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 982307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 98374cf6ff5SMarshall Clow } 984307f8143SHoward Hinnant#endif 9855a33687dSHoward Hinnant return *this; 9865a33687dSHoward Hinnant } 9876a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 988cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 9893714107eSHoward Hinnant unordered_map& operator=(unordered_map&& __u) 9903714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 991cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 9923e519524SHoward Hinnant unordered_map& operator=(initializer_list<value_type> __il); 9936a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 9943e519524SHoward Hinnant 995789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9963714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 9973e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 9983e519524SHoward Hinnant 99972c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 10003714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1001789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10023714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 1003789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10043714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 10053e519524SHoward Hinnant 1006789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10073714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 1008789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10093714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 1010789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10113714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1012789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10133714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 1014789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10153714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1016789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10173714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 10183e519524SHoward Hinnant 10197a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10207a9f500fSEric Fiselier pair<iterator, bool> insert(const value_type& __x) 10217a9f500fSEric Fiselier {return __table_.__insert_unique(__x);} 10227a9f500fSEric Fiselier 10237a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) { 10247a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2 10257a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 10267a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 10277a9f500fSEric Fiselier " referring to this unordered_map"); 1028fd838227SEric Fiselier#else 1029fd838227SEric Fiselier ((void)__p); 10307a9f500fSEric Fiselier#endif 10317a9f500fSEric Fiselier return insert(__x).first; 10327a9f500fSEric Fiselier } 10337a9f500fSEric Fiselier 10347a9f500fSEric Fiselier template <class _InputIterator> 1035cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 10367a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 10377a9f500fSEric Fiselier 10386a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10397a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10407a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 10417a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 10427a9f500fSEric Fiselier 10437a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10447a9f500fSEric Fiselier pair<iterator, bool> insert(value_type&& __x) 10457a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::move(__x));} 10467a9f500fSEric Fiselier 10477a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) { 10487a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2 10497a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 10507a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 10517a9f500fSEric Fiselier " referring to this unordered_map"); 1052fd838227SEric Fiselier#else 1053fd838227SEric Fiselier ((void)__p); 10547a9f500fSEric Fiselier#endif 10557a9f500fSEric Fiselier return __table_.__insert_unique(_VSTD::move(__x)).first; 10567a9f500fSEric Fiselier } 10577a9f500fSEric Fiselier 10587a9f500fSEric Fiselier template <class _Pp, 10597a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 10607a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10617a9f500fSEric Fiselier pair<iterator, bool> insert(_Pp&& __x) 10627a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} 10637a9f500fSEric Fiselier 10647a9f500fSEric Fiselier template <class _Pp, 10657a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 10667a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10677a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 10687a9f500fSEric Fiselier { 10697a9f500fSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2 10707a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 10717a9f500fSEric Fiselier "unordered_map::insert(const_iterator, value_type&&) called with an iterator not" 10727a9f500fSEric Fiselier " referring to this unordered_map"); 1073fd838227SEric Fiselier#else 1074fd838227SEric Fiselier ((void)__p); 10757a9f500fSEric Fiselier#endif 10767a9f500fSEric Fiselier return insert(_VSTD::forward<_Pp>(__x)).first; 10777a9f500fSEric Fiselier } 10787a9f500fSEric Fiselier 10798b805c91SHoward Hinnant template <class... _Args> 1080fcd02211SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1081fcd02211SEric Fiselier pair<iterator, bool> emplace(_Args&&... __args) { 1082fcd02211SEric Fiselier return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 1083fcd02211SEric Fiselier } 10843e519524SHoward Hinnant 10858b805c91SHoward Hinnant template <class... _Args> 1086789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1087fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 10884c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 10894c80bfbdSHoward Hinnant _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 10904c80bfbdSHoward Hinnant "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not" 10914c80bfbdSHoward Hinnant " referring to this unordered_map"); 1092fd838227SEric Fiselier#else 1093fd838227SEric Fiselier ((void)__p); 1094fcd02211SEric Fiselier#endif 1095ad783ce9SDuncan P. N. Exon Smith return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; 10964c80bfbdSHoward Hinnant } 1097fcd02211SEric Fiselier 1098fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 1099fcd02211SEric Fiselier 1100bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14 1101bc4c89a9SMarshall Clow template <class... _Args> 1102bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1103bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 1104bc4c89a9SMarshall Clow { 110587c4104dSEric Fiselier return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct, 110687c4104dSEric Fiselier _VSTD::forward_as_tuple(__k), 110787c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1108bc4c89a9SMarshall Clow } 1109bc4c89a9SMarshall Clow 1110bc4c89a9SMarshall Clow template <class... _Args> 1111bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1112bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 1113bc4c89a9SMarshall Clow { 111487c4104dSEric Fiselier return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct, 111587c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 111687c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1117bc4c89a9SMarshall Clow } 1118bc4c89a9SMarshall Clow 1119bc4c89a9SMarshall Clow template <class... _Args> 1120bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1121bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 1122bc4c89a9SMarshall Clow { 112387c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2 1124eef9b35cSOleg Ranevskyy _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this, 112587c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 112687c4104dSEric Fiselier " referring to this unordered_map"); 1127fd838227SEric Fiselier#else 1128fd838227SEric Fiselier ((void)__h); 112987c4104dSEric Fiselier#endif 113087c4104dSEric Fiselier return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first; 1131bc4c89a9SMarshall Clow } 1132bc4c89a9SMarshall Clow 1133bc4c89a9SMarshall Clow template <class... _Args> 1134bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1135bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 1136bc4c89a9SMarshall Clow { 113787c4104dSEric Fiselier#if _LIBCPP_DEBUG_LEVEL >= 2 1138eef9b35cSOleg Ranevskyy _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this, 113987c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 114087c4104dSEric Fiselier " referring to this unordered_map"); 1141fd838227SEric Fiselier#else 1142fd838227SEric Fiselier ((void)__h); 114387c4104dSEric Fiselier#endif 114487c4104dSEric Fiselier return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first; 1145bc4c89a9SMarshall Clow } 1146bc4c89a9SMarshall Clow 1147bc4c89a9SMarshall Clow template <class _Vp> 1148bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1149bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 1150bc4c89a9SMarshall Clow { 115187c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 115287c4104dSEric Fiselier __k, _VSTD::forward<_Vp>(__v)); 115387c4104dSEric Fiselier if (!__res.second) { 115487c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1155bc4c89a9SMarshall Clow } 115687c4104dSEric Fiselier return __res; 1157bc4c89a9SMarshall Clow } 1158bc4c89a9SMarshall Clow 1159bc4c89a9SMarshall Clow template <class _Vp> 1160bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1161bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 1162bc4c89a9SMarshall Clow { 116387c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 116487c4104dSEric Fiselier _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 116587c4104dSEric Fiselier if (!__res.second) { 116687c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1167bc4c89a9SMarshall Clow } 116887c4104dSEric Fiselier return __res; 1169bc4c89a9SMarshall Clow } 1170bc4c89a9SMarshall Clow 1171bc4c89a9SMarshall Clow template <class _Vp> 1172bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1173fd838227SEric Fiselier iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v) 1174bc4c89a9SMarshall Clow { 1175fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 117687c4104dSEric Fiselier return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first; 1177bc4c89a9SMarshall Clow } 1178bc4c89a9SMarshall Clow 1179bc4c89a9SMarshall Clow template <class _Vp> 1180bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1181fd838227SEric Fiselier iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v) 1182bc4c89a9SMarshall Clow { 1183fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 118487c4104dSEric Fiselier return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first; 1185bc4c89a9SMarshall Clow } 11866a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14 1187bc4c89a9SMarshall Clow 1188789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11893e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 1190789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1191ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 1192ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11933e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 1194789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11953e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 11963e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 1197789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11983714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 11993e519524SHoward Hinnant 1200b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1201b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1202b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1203b0386a51SErik Pilkington { 1204b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1205b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1206b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique< 1207b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1208b0386a51SErik Pilkington } 1209b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1210b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1211b0386a51SErik Pilkington { 1212b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1213b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1214b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique<node_type>( 1215b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1216b0386a51SErik Pilkington } 1217b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1218b0386a51SErik Pilkington node_type extract(key_type const& __key) 1219b0386a51SErik Pilkington { 1220b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 1221b0386a51SErik Pilkington } 1222b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1223b0386a51SErik Pilkington node_type extract(const_iterator __it) 1224b0386a51SErik Pilkington { 1225b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 1226b0386a51SErik Pilkington __it.__i_); 1227b0386a51SErik Pilkington } 12285c4e07aeSErik Pilkington 12295c4e07aeSErik Pilkington template <class _H2, class _P2> 12305c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 12315c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 12325c4e07aeSErik Pilkington { 12335c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 12345c4e07aeSErik Pilkington "merging container with incompatible allocator"); 12355c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 12365c4e07aeSErik Pilkington } 12375c4e07aeSErik Pilkington template <class _H2, class _P2> 12385c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 12395c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 12405c4e07aeSErik Pilkington { 12415c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 12425c4e07aeSErik Pilkington "merging container with incompatible allocator"); 12435c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 12445c4e07aeSErik Pilkington } 12455c4e07aeSErik Pilkington template <class _H2, class _P2> 12465c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 12475c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 12485c4e07aeSErik Pilkington { 12495c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 12505c4e07aeSErik Pilkington "merging container with incompatible allocator"); 12515c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 12525c4e07aeSErik Pilkington } 12535c4e07aeSErik Pilkington template <class _H2, class _P2> 12545c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 12555c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 12565c4e07aeSErik Pilkington { 12575c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 12585c4e07aeSErik Pilkington "merging container with incompatible allocator"); 12595c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 12605c4e07aeSErik Pilkington } 1261b0386a51SErik Pilkington#endif 1262b0386a51SErik Pilkington 1263789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12643714107eSHoward Hinnant void swap(unordered_map& __u) 12653714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 12663714107eSHoward Hinnant { __table_.swap(__u.__table_);} 12673e519524SHoward Hinnant 1268789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12693e519524SHoward Hinnant hasher hash_function() const 12703e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 1271789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12723e519524SHoward Hinnant key_equal key_eq() const 12733e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 12743e519524SHoward Hinnant 1275789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12763e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 1277789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12783e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1279789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12803e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 1281789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12823e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 12833e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 1284789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12853e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 12863e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 12873e519524SHoward Hinnant 12883e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 12890f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 12903e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 12913e519524SHoward Hinnant#endif 12923e519524SHoward Hinnant 12933e519524SHoward Hinnant mapped_type& at(const key_type& __k); 12943e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 12953e519524SHoward Hinnant 1296789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12973714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1298789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12993714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 13003e519524SHoward Hinnant 1301789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13023e519524SHoward Hinnant size_type bucket_size(size_type __n) const 13033e519524SHoward Hinnant {return __table_.bucket_size(__n);} 1304789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13053e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 13063e519524SHoward Hinnant 1307789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13083e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 1309789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13103e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 1311789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13123e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1313789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13143e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1315789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13163e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1317789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13183e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 13193e519524SHoward Hinnant 1320789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13213714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1322789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13233714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1324789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13253e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1326789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13273e519524SHoward Hinnant void rehash(size_type __n) {__table_.rehash(__n);} 1328789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13293e519524SHoward Hinnant void reserve(size_type __n) {__table_.reserve(__n);} 13303e519524SHoward Hinnant 1331b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1332b24c8024SHoward Hinnant 1333b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 1334b24c8024SHoward Hinnant {return __table_.__dereferenceable(&__i->__i_);} 1335b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 1336b24c8024SHoward Hinnant {return __table_.__decrementable(&__i->__i_);} 1337b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1338b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 1339b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1340b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 1341b24c8024SHoward Hinnant 1342b24c8024SHoward Hinnant#endif // _LIBCPP_DEBUG_LEVEL >= 2 1343b24c8024SHoward Hinnant 13443e519524SHoward Hinnantprivate: 13450f905677SEric Fiselier 13460f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 13474a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 13480f905677SEric Fiselier#endif 13493e519524SHoward Hinnant}; 13503e519524SHoward Hinnant 1351*dfcd4384SLouis Dionne#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 1352*dfcd4384SLouis Dionnetemplate<class _InputIterator, 1353*dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 1354*dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 1355*dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 1356*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 1357*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 1358*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Pred>::value>, 1359*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1360*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 1361*dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1362*dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 1363*dfcd4384SLouis Dionne 1364*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 1365*dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 1366*dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 1367*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 1368*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 1369*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Pred>::value>, 1370*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1371*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 1372*dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1373*dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 1374*dfcd4384SLouis Dionne 1375*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 1376*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1377*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 1378*dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1379*dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1380*dfcd4384SLouis Dionne 1381*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 1382*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1383*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator) 1384*dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1385*dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1386*dfcd4384SLouis Dionne 1387*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 1388*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 1389*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 1390*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1391*dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1392*dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1393*dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1394*dfcd4384SLouis Dionne 1395*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 1396*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1397*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 1398*dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1399*dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1400*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1401*dfcd4384SLouis Dionne 1402*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 1403*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1404*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator) 1405*dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1406*dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1407*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1408*dfcd4384SLouis Dionne 1409*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 1410*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 1411*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 1412*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 1413*dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1414*dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, 1415*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1416*dfcd4384SLouis Dionne#endif 1417*dfcd4384SLouis Dionne 14183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14193e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14203e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 14213e519524SHoward Hinnant : __table_(__hf, __eql) 14223e519524SHoward Hinnant{ 1423b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1424b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1425b24c8024SHoward Hinnant#endif 14263e519524SHoward Hinnant __table_.rehash(__n); 14273e519524SHoward Hinnant} 14283e519524SHoward Hinnant 14293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14303e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14313e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 14323e519524SHoward Hinnant const allocator_type& __a) 14332a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 14343e519524SHoward Hinnant{ 1435b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1436b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1437b24c8024SHoward Hinnant#endif 14383e519524SHoward Hinnant __table_.rehash(__n); 14393e519524SHoward Hinnant} 14403e519524SHoward Hinnant 14413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1442cd31b434SEvgeniy Stepanovinline 14433e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14443e519524SHoward Hinnant const allocator_type& __a) 14452a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 14463e519524SHoward Hinnant{ 1447b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1448b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1449b24c8024SHoward Hinnant#endif 14503e519524SHoward Hinnant} 14513e519524SHoward Hinnant 14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14533e519524SHoward Hinnanttemplate <class _InputIterator> 14543e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14553e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 14563e519524SHoward Hinnant{ 1457b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1458b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1459b24c8024SHoward Hinnant#endif 14603e519524SHoward Hinnant insert(__first, __last); 14613e519524SHoward Hinnant} 14623e519524SHoward Hinnant 14633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14643e519524SHoward Hinnanttemplate <class _InputIterator> 14653e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14663e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 14673e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 14683e519524SHoward Hinnant : __table_(__hf, __eql) 14693e519524SHoward Hinnant{ 1470b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1471b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1472b24c8024SHoward Hinnant#endif 14733e519524SHoward Hinnant __table_.rehash(__n); 14743e519524SHoward Hinnant insert(__first, __last); 14753e519524SHoward Hinnant} 14763e519524SHoward Hinnant 14773e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14783e519524SHoward Hinnanttemplate <class _InputIterator> 14793e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14803e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 14813e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 14822a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 14833e519524SHoward Hinnant{ 1484b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1485b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1486b24c8024SHoward Hinnant#endif 14873e519524SHoward Hinnant __table_.rehash(__n); 14883e519524SHoward Hinnant insert(__first, __last); 14893e519524SHoward Hinnant} 14903e519524SHoward Hinnant 14913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 14923e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 14933e519524SHoward Hinnant const unordered_map& __u) 14943e519524SHoward Hinnant : __table_(__u.__table_) 14953e519524SHoward Hinnant{ 1496b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1497b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1498b24c8024SHoward Hinnant#endif 14993e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 15003e519524SHoward Hinnant insert(__u.begin(), __u.end()); 15013e519524SHoward Hinnant} 15023e519524SHoward Hinnant 15033e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15043e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15053e519524SHoward Hinnant const unordered_map& __u, const allocator_type& __a) 15062a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 15073e519524SHoward Hinnant{ 1508b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1509b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1510b24c8024SHoward Hinnant#endif 15113e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 15123e519524SHoward Hinnant insert(__u.begin(), __u.end()); 15133e519524SHoward Hinnant} 15143e519524SHoward Hinnant 15156a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15163e519524SHoward Hinnant 15173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1518cd31b434SEvgeniy Stepanovinline 15193e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15203e519524SHoward Hinnant unordered_map&& __u) 15213714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1522ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 15233e519524SHoward Hinnant{ 1524b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1525b24c8024SHoward Hinnant __get_db()->__insert_c(this); 15264c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 1527b24c8024SHoward Hinnant#endif 15283e519524SHoward Hinnant} 15293e519524SHoward Hinnant 15303e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15313e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15323e519524SHoward Hinnant unordered_map&& __u, const allocator_type& __a) 15332a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 15343e519524SHoward Hinnant{ 1535b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1536b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1537b24c8024SHoward Hinnant#endif 15383e519524SHoward Hinnant if (__a != __u.get_allocator()) 15393e519524SHoward Hinnant { 15403e519524SHoward Hinnant iterator __i = __u.begin(); 1541fcd02211SEric Fiselier while (__u.size() != 0) { 1542f52318b4SErik Pilkington __table_.__emplace_unique( 1543f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 1544fcd02211SEric Fiselier } 15453e519524SHoward Hinnant } 15464c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 15474c80bfbdSHoward Hinnant else 15484c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 15494c80bfbdSHoward Hinnant#endif 15503e519524SHoward Hinnant} 15513e519524SHoward Hinnant 15523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15533e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15543e519524SHoward Hinnant initializer_list<value_type> __il) 15553e519524SHoward Hinnant{ 1556b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1557b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1558b24c8024SHoward Hinnant#endif 15593e519524SHoward Hinnant insert(__il.begin(), __il.end()); 15603e519524SHoward Hinnant} 15613e519524SHoward Hinnant 15623e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15633e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15643e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 15653e519524SHoward Hinnant const key_equal& __eql) 15663e519524SHoward Hinnant : __table_(__hf, __eql) 15673e519524SHoward Hinnant{ 1568b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1569b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1570b24c8024SHoward Hinnant#endif 15713e519524SHoward Hinnant __table_.rehash(__n); 15723e519524SHoward Hinnant insert(__il.begin(), __il.end()); 15733e519524SHoward Hinnant} 15743e519524SHoward Hinnant 15753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15763e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15773e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 15783e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 15792a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 15803e519524SHoward Hinnant{ 1581b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1582b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1583b24c8024SHoward Hinnant#endif 15843e519524SHoward Hinnant __table_.rehash(__n); 15853e519524SHoward Hinnant insert(__il.begin(), __il.end()); 15863e519524SHoward Hinnant} 15873e519524SHoward Hinnant 15883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1589cd31b434SEvgeniy Stepanovinline 15903e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 15913e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u) 15923714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 15933e519524SHoward Hinnant{ 1594ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 15953e519524SHoward Hinnant return *this; 15963e519524SHoward Hinnant} 15973e519524SHoward Hinnant 15983e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1599cd31b434SEvgeniy Stepanovinline 16003e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 16013e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 16023e519524SHoward Hinnant initializer_list<value_type> __il) 16033e519524SHoward Hinnant{ 16043e519524SHoward Hinnant __table_.__assign_unique(__il.begin(), __il.end()); 16053e519524SHoward Hinnant return *this; 16063e519524SHoward Hinnant} 16073e519524SHoward Hinnant 16086a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 16093e519524SHoward Hinnant 16103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16113e519524SHoward Hinnanttemplate <class _InputIterator> 1612cd31b434SEvgeniy Stepanovinline 16133e519524SHoward Hinnantvoid 16143e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 16153e519524SHoward Hinnant _InputIterator __last) 16163e519524SHoward Hinnant{ 16173e519524SHoward Hinnant for (; __first != __last; ++__first) 16183e519524SHoward Hinnant __table_.__insert_unique(*__first); 16193e519524SHoward Hinnant} 16203e519524SHoward Hinnant 16216a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 16223e519524SHoward Hinnant 16230f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16240f905677SEric Fiselier_Tp& 16250f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 16260f905677SEric Fiselier{ 16270f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 16280f905677SEric Fiselier std::piecewise_construct, std::forward_as_tuple(__k), 1629f52318b4SErik Pilkington std::forward_as_tuple()).first->__get_value().second; 16300f905677SEric Fiselier} 16313e519524SHoward Hinnant 16323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16333e519524SHoward Hinnant_Tp& 16343e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) 16353e519524SHoward Hinnant{ 16360f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 16370f905677SEric Fiselier std::piecewise_construct, std::forward_as_tuple(std::move(__k)), 1638f52318b4SErik Pilkington std::forward_as_tuple()).first->__get_value().second; 16393e519524SHoward Hinnant} 16406a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 16413e519524SHoward Hinnant 16426a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16436a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 16446a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k) 16456a470bcbSEric Fiselier{ 16466a470bcbSEric Fiselier __node_allocator& __na = __table_.__node_alloc(); 16476a470bcbSEric Fiselier __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1648f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 16496a470bcbSEric Fiselier __h.get_deleter().__first_constructed = true; 1650f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 16516a470bcbSEric Fiselier __h.get_deleter().__second_constructed = true; 16526a470bcbSEric Fiselier return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 16536a470bcbSEric Fiselier} 16546a470bcbSEric Fiselier 16556a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16566a470bcbSEric Fiselier_Tp& 16576a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 16586a470bcbSEric Fiselier{ 16596a470bcbSEric Fiselier iterator __i = find(__k); 16606a470bcbSEric Fiselier if (__i != end()) 16616a470bcbSEric Fiselier return __i->second; 16626a470bcbSEric Fiselier __node_holder __h = __construct_node_with_key(__k); 16636a470bcbSEric Fiselier pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 16646a470bcbSEric Fiselier __h.release(); 16656a470bcbSEric Fiselier return __r.first->second; 16666a470bcbSEric Fiselier} 16676a470bcbSEric Fiselier 16686a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_MODE 16693e519524SHoward Hinnant 16703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16713e519524SHoward Hinnant_Tp& 16723e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) 16733e519524SHoward Hinnant{ 16743e519524SHoward Hinnant iterator __i = find(__k); 16753e519524SHoward Hinnant if (__i == end()) 16767232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 16773e519524SHoward Hinnant return __i->second; 16783e519524SHoward Hinnant} 16793e519524SHoward Hinnant 16803e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16813e519524SHoward Hinnantconst _Tp& 16823e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const 16833e519524SHoward Hinnant{ 16843e519524SHoward Hinnant const_iterator __i = find(__k); 16853e519524SHoward Hinnant if (__i == end()) 16867232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 16873e519524SHoward Hinnant return __i->second; 16883e519524SHoward Hinnant} 16893e519524SHoward Hinnant 16903e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1691789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16923e519524SHoward Hinnantvoid 16933e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 16943e519524SHoward Hinnant unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 16953714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 16963e519524SHoward Hinnant{ 16973e519524SHoward Hinnant __x.swap(__y); 16983e519524SHoward Hinnant} 16993e519524SHoward Hinnant 1700f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 1701f60c63c0SMarshall Clowtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate> 1702f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 1703f60c63c0SMarshall Clowvoid erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred) 1704f60c63c0SMarshall Clow{ __libcpp_erase_if_container(__c, __pred); } 1705f60c63c0SMarshall Clow#endif 1706f60c63c0SMarshall Clow 17073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17083e519524SHoward Hinnantbool 17093e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 17103e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 17113e519524SHoward Hinnant{ 17123e519524SHoward Hinnant if (__x.size() != __y.size()) 17133e519524SHoward Hinnant return false; 17143e519524SHoward Hinnant typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 17153e519524SHoward Hinnant const_iterator; 17163e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 17173e519524SHoward Hinnant __i != __ex; ++__i) 17183e519524SHoward Hinnant { 17193e519524SHoward Hinnant const_iterator __j = __y.find(__i->first); 17203e519524SHoward Hinnant if (__j == __ey || !(*__i == *__j)) 17213e519524SHoward Hinnant return false; 17223e519524SHoward Hinnant } 17233e519524SHoward Hinnant return true; 17243e519524SHoward Hinnant} 17253e519524SHoward Hinnant 17263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1727789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17283e519524SHoward Hinnantbool 17293e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 17303e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 17313e519524SHoward Hinnant{ 17323e519524SHoward Hinnant return !(__x == __y); 17333e519524SHoward Hinnant} 17343e519524SHoward Hinnant 17353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 17363e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 1737e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap 17383e519524SHoward Hinnant{ 17393e519524SHoward Hinnantpublic: 17403e519524SHoward Hinnant // types 17413e519524SHoward Hinnant typedef _Key key_type; 17423e519524SHoward Hinnant typedef _Tp mapped_type; 1743*dfcd4384SLouis Dionne typedef typename __identity<_Hash>::type hasher; 1744*dfcd4384SLouis Dionne typedef typename __identity<_Pred>::type key_equal; 1745*dfcd4384SLouis Dionne typedef typename __identity<_Alloc>::type allocator_type; 17463e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 17473e519524SHoward Hinnant typedef value_type& reference; 17483e519524SHoward Hinnant typedef const value_type& const_reference; 1749b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1750b24c8024SHoward Hinnant "Invalid allocator::value_type"); 17513e519524SHoward Hinnant 17523e519524SHoward Hinnantprivate: 17539fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 1754abb160e6SHoward Hinnant typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; 1755abb160e6SHoward Hinnant typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; 17561f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 17571f508014SMarshall Clow __value_type>::type __allocator_type; 17583e519524SHoward Hinnant 17593e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 17603e519524SHoward Hinnant __key_equal, __allocator_type> __table; 17613e519524SHoward Hinnant 17623e519524SHoward Hinnant __table __table_; 17633e519524SHoward Hinnant 1764fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 17653e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 17663e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 17673e519524SHoward Hinnant typedef typename __table::__node __node; 1768c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 1769c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 17703e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 177175d0dcfdSEric Fiselier static_assert((is_same<typename __node_traits::size_type, 177275d0dcfdSEric Fiselier typename __alloc_traits::size_type>::value), 177375d0dcfdSEric Fiselier "Allocator uses different size_type for different types"); 17743e519524SHoward Hinnantpublic: 17753e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 17763e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 177775d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 177875d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 17793e519524SHoward Hinnant 17803e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 17813e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 17823e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 17833e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 17843e519524SHoward Hinnant 1785b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1786b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 1787b0386a51SErik Pilkington#endif 1788b0386a51SErik Pilkington 17895c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 17905c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 17915c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 17925c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 17935c4e07aeSErik Pilkington 1794789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17953714107eSHoward Hinnant unordered_multimap() 17963714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1797b24c8024SHoward Hinnant { 1798b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 1799b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1800b24c8024SHoward Hinnant#endif 1801b24c8024SHoward Hinnant } 18023e519524SHoward Hinnant explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(), 18033e519524SHoward Hinnant const key_equal& __eql = key_equal()); 18043e519524SHoward Hinnant unordered_multimap(size_type __n, const hasher& __hf, 18053e519524SHoward Hinnant const key_equal& __eql, 18063e519524SHoward Hinnant const allocator_type& __a); 18073e519524SHoward Hinnant template <class _InputIterator> 18083e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last); 18093e519524SHoward Hinnant template <class _InputIterator> 18103e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 18113e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 18123e519524SHoward Hinnant const key_equal& __eql = key_equal()); 18133e519524SHoward Hinnant template <class _InputIterator> 18143e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 18153e519524SHoward Hinnant size_type __n, const hasher& __hf, 18163e519524SHoward Hinnant const key_equal& __eql, 18173e519524SHoward Hinnant const allocator_type& __a); 1818cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 18193e519524SHoward Hinnant explicit unordered_multimap(const allocator_type& __a); 18203e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u); 18213e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u, const allocator_type& __a); 18226a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1823cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 18243714107eSHoward Hinnant unordered_multimap(unordered_multimap&& __u) 18253714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 18263e519524SHoward Hinnant unordered_multimap(unordered_multimap&& __u, const allocator_type& __a); 18273e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il); 18283e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 18293e519524SHoward Hinnant const hasher& __hf = hasher(), 18303e519524SHoward Hinnant const key_equal& __eql = key_equal()); 18313e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 18323e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 18333e519524SHoward Hinnant const allocator_type& __a); 18346a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 18353cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 18363cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18373cd37e64SMarshall Clow unordered_multimap(size_type __n, const allocator_type& __a) 18383cd37e64SMarshall Clow : unordered_multimap(__n, hasher(), key_equal(), __a) {} 18393cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18403cd37e64SMarshall Clow unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a) 18413cd37e64SMarshall Clow : unordered_multimap(__n, __hf, key_equal(), __a) {} 18423cd37e64SMarshall Clow template <class _InputIterator> 18433cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18443cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 18453cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {} 18463cd37e64SMarshall Clow template <class _InputIterator> 18473cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18483cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 18493cd37e64SMarshall Clow const allocator_type& __a) 18503cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {} 18513cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18523cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 18533cd37e64SMarshall Clow : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {} 18543cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18553cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 18563cd37e64SMarshall Clow const allocator_type& __a) 18573cd37e64SMarshall Clow : unordered_multimap(__il, __n, __hf, key_equal(), __a) {} 18583cd37e64SMarshall Clow#endif 18597c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 18607c142fccSLouis Dionne ~unordered_multimap() { 18617c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 18627c142fccSLouis Dionne } 18637c142fccSLouis Dionne 18645a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18655a33687dSHoward Hinnant unordered_multimap& operator=(const unordered_multimap& __u) 18665a33687dSHoward Hinnant { 18672ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 18685a33687dSHoward Hinnant __table_ = __u.__table_; 1869307f8143SHoward Hinnant#else 187074cf6ff5SMarshall Clow if (this != &__u) { 1871307f8143SHoward Hinnant __table_.clear(); 1872307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 1873307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 1874307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 1875307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 1876307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 187774cf6ff5SMarshall Clow } 1878307f8143SHoward Hinnant#endif 18795a33687dSHoward Hinnant return *this; 18805a33687dSHoward Hinnant } 18816a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1882cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 18833714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&& __u) 18843714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 1885cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 18863e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type> __il); 18876a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 18883e519524SHoward Hinnant 1889789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18903714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 18913e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 18923e519524SHoward Hinnant 189372c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 18943714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1895789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18963714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 1897789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18983714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 18993e519524SHoward Hinnant 1900789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19013714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 1902789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19033714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 1904789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19053714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1906789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19073714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 1908789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19093714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1910789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19113714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 19123e519524SHoward Hinnant 19137a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19147a9f500fSEric Fiselier iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 19157a9f500fSEric Fiselier 19167a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19177a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) 19187a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, __x);} 19197a9f500fSEric Fiselier 19207a9f500fSEric Fiselier template <class _InputIterator> 1921cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 19227a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 19237a9f500fSEric Fiselier 19246a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 19257a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19267a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 19277a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 19287a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19297a9f500fSEric Fiselier iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} 19307a9f500fSEric Fiselier 19317a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19327a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) 19337a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));} 19347a9f500fSEric Fiselier 19357a9f500fSEric Fiselier template <class _Pp, 19367a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 19377a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19387a9f500fSEric Fiselier iterator insert(_Pp&& __x) 19397a9f500fSEric Fiselier {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} 19407a9f500fSEric Fiselier 19417a9f500fSEric Fiselier template <class _Pp, 19427a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 19437a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19447a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 19457a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} 19467a9f500fSEric Fiselier 1947fcd02211SEric Fiselier template <class... _Args> 1948fcd02211SEric Fiselier iterator emplace(_Args&&... __args) { 1949fcd02211SEric Fiselier return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 1950fcd02211SEric Fiselier } 19517609c9b6SHoward Hinnant 19528b805c91SHoward Hinnant template <class... _Args> 1953fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 1954fcd02211SEric Fiselier return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 1955fcd02211SEric Fiselier } 1956fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 19573e519524SHoward Hinnant 19583e519524SHoward Hinnant 1959789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19603e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 1961789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1962ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 1963ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19643e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 1965789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19663e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 19673e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 1968789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19693714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 19703e519524SHoward Hinnant 1971b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1972b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1973b0386a51SErik Pilkington iterator insert(node_type&& __nh) 1974b0386a51SErik Pilkington { 1975b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1976b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 1977b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 1978b0386a51SErik Pilkington _VSTD::move(__nh)); 1979b0386a51SErik Pilkington } 1980b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1981b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1982b0386a51SErik Pilkington { 1983b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1984b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 1985b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 1986b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1987b0386a51SErik Pilkington } 1988b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1989b0386a51SErik Pilkington node_type extract(key_type const& __key) 1990b0386a51SErik Pilkington { 1991b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 1992b0386a51SErik Pilkington } 1993b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1994b0386a51SErik Pilkington node_type extract(const_iterator __it) 1995b0386a51SErik Pilkington { 1996b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 1997b0386a51SErik Pilkington __it.__i_); 1998b0386a51SErik Pilkington } 19995c4e07aeSErik Pilkington 20005c4e07aeSErik Pilkington template <class _H2, class _P2> 20015c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20025c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 20035c4e07aeSErik Pilkington { 20045c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20055c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20065c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 20075c4e07aeSErik Pilkington } 20085c4e07aeSErik Pilkington template <class _H2, class _P2> 20095c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20105c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 20115c4e07aeSErik Pilkington { 20125c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20135c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20145c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 20155c4e07aeSErik Pilkington } 20165c4e07aeSErik Pilkington template <class _H2, class _P2> 20175c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20185c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 20195c4e07aeSErik Pilkington { 20205c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20215c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20225c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 20235c4e07aeSErik Pilkington } 20245c4e07aeSErik Pilkington template <class _H2, class _P2> 20255c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20265c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 20275c4e07aeSErik Pilkington { 20285c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20295c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20305c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 20315c4e07aeSErik Pilkington } 2032b0386a51SErik Pilkington#endif 2033b0386a51SErik Pilkington 2034789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20353714107eSHoward Hinnant void swap(unordered_multimap& __u) 20363714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 20373714107eSHoward Hinnant {__table_.swap(__u.__table_);} 20383e519524SHoward Hinnant 2039789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20403e519524SHoward Hinnant hasher hash_function() const 20413e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 2042789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20433e519524SHoward Hinnant key_equal key_eq() const 20443e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 20453e519524SHoward Hinnant 2046789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20473e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 2048789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20493e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 2050789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20513e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 2052789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20533e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 20543e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 2055789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20563e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 20573e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 20583e519524SHoward Hinnant 2059789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20603714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 2061789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20623714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT 20633714107eSHoward Hinnant {return __table_.max_bucket_count();} 20643e519524SHoward Hinnant 2065789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20663e519524SHoward Hinnant size_type bucket_size(size_type __n) const 20673e519524SHoward Hinnant {return __table_.bucket_size(__n);} 2068789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20693e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 20703e519524SHoward Hinnant 2071789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20723e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 2073789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20743e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 2075789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20763e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 2077789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20783e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 2079789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20803e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 2081789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20823e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 20833e519524SHoward Hinnant 2084789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20853714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 2086789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20873714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 2088789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20893e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 2090789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20913e519524SHoward Hinnant void rehash(size_type __n) {__table_.rehash(__n);} 2092789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20933e519524SHoward Hinnant void reserve(size_type __n) {__table_.reserve(__n);} 20943e519524SHoward Hinnant 2095b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2096b24c8024SHoward Hinnant 2097b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 2098b24c8024SHoward Hinnant {return __table_.__dereferenceable(&__i->__i_);} 2099b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 2100b24c8024SHoward Hinnant {return __table_.__decrementable(&__i->__i_);} 2101b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 2102b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 2103b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 2104b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 2105b24c8024SHoward Hinnant 2106b24c8024SHoward Hinnant#endif // _LIBCPP_DEBUG_LEVEL >= 2 2107b24c8024SHoward Hinnant 2108fcd02211SEric Fiselier 21093e519524SHoward Hinnant}; 21103e519524SHoward Hinnant 2111*dfcd4384SLouis Dionne#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 2112*dfcd4384SLouis Dionnetemplate<class _InputIterator, 2113*dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 2114*dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 2115*dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 2116*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 2117*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 2118*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Pred>::value>, 2119*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2120*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 2121*dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2122*dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 2123*dfcd4384SLouis Dionne 2124*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 2125*dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 2126*dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 2127*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 2128*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 2129*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Pred>::value>, 2130*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2131*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 2132*dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2133*dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 2134*dfcd4384SLouis Dionne 2135*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 2136*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2137*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 2138*dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2139*dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2140*dfcd4384SLouis Dionne 2141*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 2142*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2143*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator) 2144*dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2145*dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2146*dfcd4384SLouis Dionne 2147*dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 2148*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 2149*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 2150*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2151*dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2152*dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2153*dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2154*dfcd4384SLouis Dionne 2155*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 2156*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2157*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 2158*dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2159*dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2160*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2161*dfcd4384SLouis Dionne 2162*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 2163*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2164*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2165*dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2166*dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2167*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2168*dfcd4384SLouis Dionne 2169*dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 2170*dfcd4384SLouis Dionne class = _EnableIf<!__is_allocator<_Hash>::value>, 2171*dfcd4384SLouis Dionne class = _EnableIf<!is_integral<_Hash>::value>, 2172*dfcd4384SLouis Dionne class = _EnableIf<__is_allocator<_Allocator>::value>> 2173*dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2174*dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, 2175*dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2176*dfcd4384SLouis Dionne#endif 2177*dfcd4384SLouis Dionne 21783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 21793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 21803e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 21813e519524SHoward Hinnant : __table_(__hf, __eql) 21823e519524SHoward Hinnant{ 2183b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2184b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2185b24c8024SHoward Hinnant#endif 21863e519524SHoward Hinnant __table_.rehash(__n); 21873e519524SHoward Hinnant} 21883e519524SHoward Hinnant 21893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 21903e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 21913e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 21923e519524SHoward Hinnant const allocator_type& __a) 21932a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 21943e519524SHoward Hinnant{ 2195b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2196b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2197b24c8024SHoward Hinnant#endif 21983e519524SHoward Hinnant __table_.rehash(__n); 21993e519524SHoward Hinnant} 22003e519524SHoward Hinnant 22013e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22023e519524SHoward Hinnanttemplate <class _InputIterator> 22033e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22043e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 22053e519524SHoward Hinnant{ 2206b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2207b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2208b24c8024SHoward Hinnant#endif 22093e519524SHoward Hinnant insert(__first, __last); 22103e519524SHoward Hinnant} 22113e519524SHoward Hinnant 22123e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22133e519524SHoward Hinnanttemplate <class _InputIterator> 22143e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22153e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 22163e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 22173e519524SHoward Hinnant : __table_(__hf, __eql) 22183e519524SHoward Hinnant{ 2219b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2220b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2221b24c8024SHoward Hinnant#endif 22223e519524SHoward Hinnant __table_.rehash(__n); 22233e519524SHoward Hinnant insert(__first, __last); 22243e519524SHoward Hinnant} 22253e519524SHoward Hinnant 22263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22273e519524SHoward Hinnanttemplate <class _InputIterator> 22283e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22293e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 22303e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 22312a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 22323e519524SHoward Hinnant{ 2233b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2234b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2235b24c8024SHoward Hinnant#endif 22363e519524SHoward Hinnant __table_.rehash(__n); 22373e519524SHoward Hinnant insert(__first, __last); 22383e519524SHoward Hinnant} 22393e519524SHoward Hinnant 22403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2241cd31b434SEvgeniy Stepanovinline 22423e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22433e519524SHoward Hinnant const allocator_type& __a) 22442a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 22453e519524SHoward Hinnant{ 2246b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2247b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2248b24c8024SHoward Hinnant#endif 22493e519524SHoward Hinnant} 22503e519524SHoward Hinnant 22513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22523e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22533e519524SHoward Hinnant const unordered_multimap& __u) 22543e519524SHoward Hinnant : __table_(__u.__table_) 22553e519524SHoward Hinnant{ 2256b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2257b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2258b24c8024SHoward Hinnant#endif 22593e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 22603e519524SHoward Hinnant insert(__u.begin(), __u.end()); 22613e519524SHoward Hinnant} 22623e519524SHoward Hinnant 22633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22643e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22653e519524SHoward Hinnant const unordered_multimap& __u, const allocator_type& __a) 22662a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 22673e519524SHoward Hinnant{ 2268b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2269b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2270b24c8024SHoward Hinnant#endif 22713e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 22723e519524SHoward Hinnant insert(__u.begin(), __u.end()); 22733e519524SHoward Hinnant} 22743e519524SHoward Hinnant 22756a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 22763e519524SHoward Hinnant 22773e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2278cd31b434SEvgeniy Stepanovinline 22793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22803e519524SHoward Hinnant unordered_multimap&& __u) 22813714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 2282ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 22833e519524SHoward Hinnant{ 2284b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2285b24c8024SHoward Hinnant __get_db()->__insert_c(this); 22864c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 2287b24c8024SHoward Hinnant#endif 22883e519524SHoward Hinnant} 22893e519524SHoward Hinnant 22903e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 22913e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 22923e519524SHoward Hinnant unordered_multimap&& __u, const allocator_type& __a) 22932a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 22943e519524SHoward Hinnant{ 2295b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2296b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2297b24c8024SHoward Hinnant#endif 22983e519524SHoward Hinnant if (__a != __u.get_allocator()) 22993e519524SHoward Hinnant { 23003e519524SHoward Hinnant iterator __i = __u.begin(); 23013e519524SHoward Hinnant while (__u.size() != 0) 23023e519524SHoward Hinnant { 23033e519524SHoward Hinnant __table_.__insert_multi( 2304f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 23053e519524SHoward Hinnant } 23063e519524SHoward Hinnant } 23074c80bfbdSHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 23084c80bfbdSHoward Hinnant else 23094c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 23104c80bfbdSHoward Hinnant#endif 23113e519524SHoward Hinnant} 23123e519524SHoward Hinnant 23133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23143e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23153e519524SHoward Hinnant initializer_list<value_type> __il) 23163e519524SHoward Hinnant{ 2317b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2318b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2319b24c8024SHoward Hinnant#endif 23203e519524SHoward Hinnant insert(__il.begin(), __il.end()); 23213e519524SHoward Hinnant} 23223e519524SHoward Hinnant 23233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23243e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23253e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 23263e519524SHoward Hinnant const key_equal& __eql) 23273e519524SHoward Hinnant : __table_(__hf, __eql) 23283e519524SHoward Hinnant{ 2329b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2330b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2331b24c8024SHoward Hinnant#endif 23323e519524SHoward Hinnant __table_.rehash(__n); 23333e519524SHoward Hinnant insert(__il.begin(), __il.end()); 23343e519524SHoward Hinnant} 23353e519524SHoward Hinnant 23363e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23373e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23383e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 23393e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 23402a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 23413e519524SHoward Hinnant{ 2342b24c8024SHoward Hinnant#if _LIBCPP_DEBUG_LEVEL >= 2 2343b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2344b24c8024SHoward Hinnant#endif 23453e519524SHoward Hinnant __table_.rehash(__n); 23463e519524SHoward Hinnant insert(__il.begin(), __il.end()); 23473e519524SHoward Hinnant} 23483e519524SHoward Hinnant 23493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2350cd31b434SEvgeniy Stepanovinline 23513e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 23523e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u) 23533714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 23543e519524SHoward Hinnant{ 2355ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 23563e519524SHoward Hinnant return *this; 23573e519524SHoward Hinnant} 23583e519524SHoward Hinnant 23593e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2360cd31b434SEvgeniy Stepanovinline 23613e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 23623e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 23633e519524SHoward Hinnant initializer_list<value_type> __il) 23643e519524SHoward Hinnant{ 23653e519524SHoward Hinnant __table_.__assign_multi(__il.begin(), __il.end()); 23663e519524SHoward Hinnant return *this; 23673e519524SHoward Hinnant} 23683e519524SHoward Hinnant 23696a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 237054976f26SHoward Hinnant 23713e519524SHoward Hinnant 23723e519524SHoward Hinnant 23733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23743e519524SHoward Hinnanttemplate <class _InputIterator> 2375cd31b434SEvgeniy Stepanovinline 23763e519524SHoward Hinnantvoid 23773e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 23783e519524SHoward Hinnant _InputIterator __last) 23793e519524SHoward Hinnant{ 23803e519524SHoward Hinnant for (; __first != __last; ++__first) 23813e519524SHoward Hinnant __table_.__insert_multi(*__first); 23823e519524SHoward Hinnant} 23833e519524SHoward Hinnant 23843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2385789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 23863e519524SHoward Hinnantvoid 23873e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 23883e519524SHoward Hinnant unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 23893714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 23903e519524SHoward Hinnant{ 23913e519524SHoward Hinnant __x.swap(__y); 23923e519524SHoward Hinnant} 23933e519524SHoward Hinnant 2394f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 2395f60c63c0SMarshall Clowtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, class _Predicate> 2396f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 2397f60c63c0SMarshall Clowvoid erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, _Predicate __pred) 2398f60c63c0SMarshall Clow{ __libcpp_erase_if_container(__c, __pred); } 2399f60c63c0SMarshall Clow#endif 2400f60c63c0SMarshall Clow 24013e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24023e519524SHoward Hinnantbool 24033e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 24043e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 24053e519524SHoward Hinnant{ 24063e519524SHoward Hinnant if (__x.size() != __y.size()) 24073e519524SHoward Hinnant return false; 24083e519524SHoward Hinnant typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 24093e519524SHoward Hinnant const_iterator; 24103e519524SHoward Hinnant typedef pair<const_iterator, const_iterator> _EqRng; 24113e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 24123e519524SHoward Hinnant { 24133e519524SHoward Hinnant _EqRng __xeq = __x.equal_range(__i->first); 24143e519524SHoward Hinnant _EqRng __yeq = __y.equal_range(__i->first); 2415ce48a113SHoward Hinnant if (_VSTD::distance(__xeq.first, __xeq.second) != 2416ce48a113SHoward Hinnant _VSTD::distance(__yeq.first, __yeq.second) || 2417ce48a113SHoward Hinnant !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 24183e519524SHoward Hinnant return false; 24193e519524SHoward Hinnant __i = __xeq.second; 24203e519524SHoward Hinnant } 24213e519524SHoward Hinnant return true; 24223e519524SHoward Hinnant} 24233e519524SHoward Hinnant 24243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2425789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24263e519524SHoward Hinnantbool 24273e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 24283e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 24293e519524SHoward Hinnant{ 24303e519524SHoward Hinnant return !(__x == __y); 24313e519524SHoward Hinnant} 24323e519524SHoward Hinnant 24333e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 24343e519524SHoward Hinnant 24353e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_MAP 2436