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; 176e5ec94a1SRuslan Arutyunyan template<typename K> 177e5ec94a1SRuslan Arutyunyan iterator find(const K& x); // C++20 178e5ec94a1SRuslan Arutyunyan template<typename K> 179e5ec94a1SRuslan Arutyunyan const_iterator find(const K& x) const; // C++20 1803e519524SHoward Hinnant size_type count(const key_type& k) const; 181e5ec94a1SRuslan Arutyunyan template<typename K> 182e5ec94a1SRuslan Arutyunyan size_type count(const K& k) const; // C++20 183a17b1aedSZoe Carver bool contains(const key_type& k) const; // C++20 184e5ec94a1SRuslan Arutyunyan template<typename K> 185e5ec94a1SRuslan Arutyunyan bool contains(const K& k) const; // C++20 1863e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 1873e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 188e5ec94a1SRuslan Arutyunyan template<typename K> 189e5ec94a1SRuslan Arutyunyan pair<iterator, iterator> equal_range(const K& k); // C++20 190e5ec94a1SRuslan Arutyunyan template<typename K> 191e5ec94a1SRuslan Arutyunyan pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20 1923e519524SHoward Hinnant 1933e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1943e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1953e519524SHoward Hinnant 1963e519524SHoward Hinnant mapped_type& at(const key_type& k); 1973e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1983e519524SHoward Hinnant 1993714107eSHoward Hinnant size_type bucket_count() const noexcept; 2003714107eSHoward Hinnant size_type max_bucket_count() const noexcept; 2013e519524SHoward Hinnant 2023e519524SHoward Hinnant size_type bucket_size(size_type n) const; 2033e519524SHoward Hinnant size_type bucket(const key_type& k) const; 2043e519524SHoward Hinnant 2053e519524SHoward Hinnant local_iterator begin(size_type n); 2063e519524SHoward Hinnant local_iterator end(size_type n); 2073e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 2083e519524SHoward Hinnant const_local_iterator end(size_type n) const; 2093e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 2103e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 2113e519524SHoward Hinnant 2123714107eSHoward Hinnant float load_factor() const noexcept; 2133714107eSHoward Hinnant float max_load_factor() const noexcept; 2143e519524SHoward Hinnant void max_load_factor(float z); 2153e519524SHoward Hinnant void rehash(size_type n); 2163e519524SHoward Hinnant void reserve(size_type n); 2173e519524SHoward Hinnant}; 2183e519524SHoward Hinnant 2193e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2203e519524SHoward Hinnant void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 2213714107eSHoward Hinnant unordered_map<Key, T, Hash, Pred, Alloc>& y) 2223714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 2233e519524SHoward Hinnant 2243e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2253e519524SHoward Hinnant bool 2263e519524SHoward Hinnant operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2273e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2283e519524SHoward Hinnant 2293e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2303e519524SHoward Hinnant bool 2313e519524SHoward Hinnant operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2323e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2333e519524SHoward Hinnant 2343e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 2353e519524SHoward Hinnant class Alloc = allocator<pair<const Key, T>>> 2363e519524SHoward Hinnantclass unordered_multimap 2373e519524SHoward Hinnant{ 2383e519524SHoward Hinnantpublic: 2393e519524SHoward Hinnant // types 2403e519524SHoward Hinnant typedef Key key_type; 2413e519524SHoward Hinnant typedef T mapped_type; 2423e519524SHoward Hinnant typedef Hash hasher; 2433e519524SHoward Hinnant typedef Pred key_equal; 2443e519524SHoward Hinnant typedef Alloc allocator_type; 2453e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 2463e519524SHoward Hinnant typedef value_type& reference; 2473e519524SHoward Hinnant typedef const value_type& const_reference; 2483e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 2493e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 2503e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 2513e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 2523e519524SHoward Hinnant 2533e519524SHoward Hinnant typedef /unspecified/ iterator; 2543e519524SHoward Hinnant typedef /unspecified/ const_iterator; 2553e519524SHoward Hinnant typedef /unspecified/ local_iterator; 2563e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 2573e519524SHoward Hinnant 258b0386a51SErik Pilkington typedef unspecified node_type; // C++17 259b0386a51SErik Pilkington 2603714107eSHoward Hinnant unordered_multimap() 2613714107eSHoward Hinnant noexcept( 2623714107eSHoward Hinnant is_nothrow_default_constructible<hasher>::value && 2633714107eSHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 2643714107eSHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 2653714107eSHoward Hinnant explicit unordered_multimap(size_type n, const hasher& hf = hasher(), 2663e519524SHoward Hinnant const key_equal& eql = key_equal(), 2673e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2683e519524SHoward Hinnant template <class InputIterator> 2693e519524SHoward Hinnant unordered_multimap(InputIterator f, InputIterator l, 2703e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 2713e519524SHoward Hinnant const key_equal& eql = key_equal(), 2723e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2733e519524SHoward Hinnant explicit unordered_multimap(const allocator_type&); 2743e519524SHoward Hinnant unordered_multimap(const unordered_multimap&); 2753e519524SHoward Hinnant unordered_multimap(const unordered_multimap&, const Allocator&); 2763714107eSHoward Hinnant unordered_multimap(unordered_multimap&&) 2773714107eSHoward Hinnant noexcept( 2783714107eSHoward Hinnant is_nothrow_move_constructible<hasher>::value && 2793714107eSHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 2803714107eSHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 2813e519524SHoward Hinnant unordered_multimap(unordered_multimap&&, const Allocator&); 2823e519524SHoward Hinnant unordered_multimap(initializer_list<value_type>, size_type n = 0, 2833e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 2843e519524SHoward Hinnant const allocator_type& a = allocator_type()); 2853cd37e64SMarshall Clow unordered_multimap(size_type n, const allocator_type& a) 2863cd37e64SMarshall Clow : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14 2873cd37e64SMarshall Clow unordered_multimap(size_type n, const hasher& hf, const allocator_type& a) 2883cd37e64SMarshall Clow : unordered_multimap(n, hf, key_equal(), a) {} // C++14 2893cd37e64SMarshall Clow template <class InputIterator> 2903cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 2913cd37e64SMarshall Clow : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14 2923cd37e64SMarshall Clow template <class InputIterator> 2933cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, 2943cd37e64SMarshall Clow const allocator_type& a) 2953cd37e64SMarshall Clow : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14 2963cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a) 2973cd37e64SMarshall Clow : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14 2983cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, 2993cd37e64SMarshall Clow const allocator_type& a) 3003cd37e64SMarshall Clow : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14 3013e519524SHoward Hinnant ~unordered_multimap(); 3023e519524SHoward Hinnant unordered_multimap& operator=(const unordered_multimap&); 3033714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&&) 3043714107eSHoward Hinnant noexcept( 3053714107eSHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3063714107eSHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3073714107eSHoward Hinnant is_nothrow_move_assignable<hasher>::value && 3083714107eSHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 3093e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type>); 3103e519524SHoward Hinnant 3113714107eSHoward Hinnant allocator_type get_allocator() const noexcept; 3123e519524SHoward Hinnant 3133714107eSHoward Hinnant bool empty() const noexcept; 3143714107eSHoward Hinnant size_type size() const noexcept; 3153714107eSHoward Hinnant size_type max_size() const noexcept; 3163e519524SHoward Hinnant 3173714107eSHoward Hinnant iterator begin() noexcept; 3183714107eSHoward Hinnant iterator end() noexcept; 3193714107eSHoward Hinnant const_iterator begin() const noexcept; 3203714107eSHoward Hinnant const_iterator end() const noexcept; 3213714107eSHoward Hinnant const_iterator cbegin() const noexcept; 3223714107eSHoward Hinnant const_iterator cend() const noexcept; 3233e519524SHoward Hinnant 3243e519524SHoward Hinnant template <class... Args> 3253e519524SHoward Hinnant iterator emplace(Args&&... args); 3263e519524SHoward Hinnant template <class... Args> 3273e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3283e519524SHoward Hinnant iterator insert(const value_type& obj); 3293e519524SHoward Hinnant template <class P> 3303e519524SHoward Hinnant iterator insert(P&& obj); 3313e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 3323e519524SHoward Hinnant template <class P> 3333e519524SHoward Hinnant iterator insert(const_iterator hint, P&& obj); 3343e519524SHoward Hinnant template <class InputIterator> 3353e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3363e519524SHoward Hinnant void insert(initializer_list<value_type>); 3373e519524SHoward Hinnant 338b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 339b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 340b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 341b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 342b0386a51SErik Pilkington 3433e519524SHoward Hinnant iterator erase(const_iterator position); 344ec392968SMarshall Clow iterator erase(iterator position); // C++14 3453e519524SHoward Hinnant size_type erase(const key_type& k); 3463e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3473714107eSHoward Hinnant void clear() noexcept; 3483e519524SHoward Hinnant 3495c4e07aeSErik Pilkington template<class H2, class P2> 3505c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17 3515c4e07aeSErik Pilkington template<class H2, class P2> 3525c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17 3535c4e07aeSErik Pilkington template<class H2, class P2> 3545c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17 3555c4e07aeSErik Pilkington template<class H2, class P2> 3565c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17 3575c4e07aeSErik Pilkington 3583714107eSHoward Hinnant void swap(unordered_multimap&) 3593714107eSHoward Hinnant noexcept( 3603714107eSHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 3613714107eSHoward Hinnant __is_nothrow_swappable<allocator_type>::value) && 3623714107eSHoward Hinnant __is_nothrow_swappable<hasher>::value && 3633714107eSHoward Hinnant __is_nothrow_swappable<key_equal>::value); 3643e519524SHoward Hinnant 3653e519524SHoward Hinnant hasher hash_function() const; 3663e519524SHoward Hinnant key_equal key_eq() const; 3673e519524SHoward Hinnant 3683e519524SHoward Hinnant iterator find(const key_type& k); 3693e519524SHoward Hinnant const_iterator find(const key_type& k) const; 370e5ec94a1SRuslan Arutyunyan template<typename K> 371e5ec94a1SRuslan Arutyunyan iterator find(const K& x); // C++20 372e5ec94a1SRuslan Arutyunyan template<typename K> 373e5ec94a1SRuslan Arutyunyan const_iterator find(const K& x) const; // C++20 3743e519524SHoward Hinnant size_type count(const key_type& k) const; 375e5ec94a1SRuslan Arutyunyan template<typename K> 376e5ec94a1SRuslan Arutyunyan size_type count(const K& k) const; // C++20 377a17b1aedSZoe Carver bool contains(const key_type& k) const; // C++20 378e5ec94a1SRuslan Arutyunyan template<typename K> 379e5ec94a1SRuslan Arutyunyan bool contains(const K& k) const; // C++20 3803e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 3813e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 382e5ec94a1SRuslan Arutyunyan template<typename K> 383e5ec94a1SRuslan Arutyunyan pair<iterator, iterator> equal_range(const K& k); // C++20 384e5ec94a1SRuslan Arutyunyan template<typename K> 385e5ec94a1SRuslan Arutyunyan pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20 3863e519524SHoward Hinnant 3873714107eSHoward Hinnant size_type bucket_count() const noexcept; 3883714107eSHoward Hinnant size_type max_bucket_count() const noexcept; 3893e519524SHoward Hinnant 3903e519524SHoward Hinnant size_type bucket_size(size_type n) const; 3913e519524SHoward Hinnant size_type bucket(const key_type& k) const; 3923e519524SHoward Hinnant 3933e519524SHoward Hinnant local_iterator begin(size_type n); 3943e519524SHoward Hinnant local_iterator end(size_type n); 3953e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 3963e519524SHoward Hinnant const_local_iterator end(size_type n) const; 3973e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 3983e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 3993e519524SHoward Hinnant 4003714107eSHoward Hinnant float load_factor() const noexcept; 4013714107eSHoward Hinnant float max_load_factor() const noexcept; 4023e519524SHoward Hinnant void max_load_factor(float z); 4033e519524SHoward Hinnant void rehash(size_type n); 4043e519524SHoward Hinnant void reserve(size_type n); 4053e519524SHoward Hinnant}; 4063e519524SHoward Hinnant 4073e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 4083e519524SHoward Hinnant void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 4093714107eSHoward Hinnant unordered_multimap<Key, T, Hash, Pred, Alloc>& y) 4103714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 4113e519524SHoward Hinnant 412f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 4133e895085SMarek Kurdej typename unordered_map<K, T, H, P, A>::size_type 4143e895085SMarek Kurdej erase_if(unordered_map<K, T, H, P, A>& c, Predicate pred); // C++20 415f60c63c0SMarshall Clow 416f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 4173e895085SMarek Kurdej typename unordered_multimap<K, T, H, P, A>::size_type 4183e895085SMarek Kurdej erase_if(unordered_multimap<K, T, H, P, A>& c, Predicate pred); // C++20 419f60c63c0SMarshall Clow 4203e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 4213e519524SHoward Hinnant bool 4223e519524SHoward Hinnant operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 4233e519524SHoward Hinnant const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 4243e519524SHoward Hinnant 4253e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 4263e519524SHoward Hinnant bool 4273e519524SHoward Hinnant operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 4283e519524SHoward Hinnant const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 4293e519524SHoward Hinnant 4303e519524SHoward Hinnant} // std 4313e519524SHoward Hinnant 4323e519524SHoward Hinnant*/ 4333e519524SHoward Hinnant 4343e519524SHoward Hinnant#include <__config> 435bfbd73f8SArthur O'Dwyer#include <__debug> 436050b064fSChristopher Di Bella#include <__functional/is_transparent.h> 4373e519524SHoward Hinnant#include <__hash_table> 438b0386a51SErik Pilkington#include <__node_handle> 4396adbc83eSChristopher Di Bella#include <__utility/forward.h> 4402d0f1fa4SArthur O'Dwyer#include <compare> 4413e519524SHoward Hinnant#include <functional> 4422ac6babcSArthur O'Dwyer#include <iterator> // __libcpp_erase_if_container 4433e519524SHoward Hinnant#include <stdexcept> 4440f905677SEric Fiselier#include <tuple> 445f56972e2SMarshall Clow#include <version> 4463e519524SHoward Hinnant 447073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4483e519524SHoward Hinnant#pragma GCC system_header 449073458b1SHoward Hinnant#endif 4503e519524SHoward Hinnant 4513e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 4523e519524SHoward Hinnant 453e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, 4543560fbf3SLouis Dionne bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value> 4553e519524SHoward Hinnantclass __unordered_map_hasher 4563e519524SHoward Hinnant : private _Hash 4573e519524SHoward Hinnant{ 4583e519524SHoward Hinnantpublic: 459789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4603714107eSHoward Hinnant __unordered_map_hasher() 4613714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 4623714107eSHoward Hinnant : _Hash() {} 463789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4643714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 4653714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 4663714107eSHoward Hinnant : _Hash(__h) {} 467789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4683714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return *this;} 469789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 470a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 471f52318b4SErik Pilkington {return static_cast<const _Hash&>(*this)(__x.__get_value().first);} 472a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 473a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 4743e519524SHoward Hinnant {return static_cast<const _Hash&>(*this)(__x);} 475e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 476*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 477e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 478e5ec94a1SRuslan Arutyunyan size_t operator()(const _K2& __x) const 479e5ec94a1SRuslan Arutyunyan {return static_cast<const _Hash&>(*this)(__x);} 480e5ec94a1SRuslan Arutyunyan#endif 481e3fbe143SMarshall Clow void swap(__unordered_map_hasher& __y) 482e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 483e3fbe143SMarshall Clow { 484e3fbe143SMarshall Clow using _VSTD::swap; 485b3f57425SEric Fiselier swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y)); 486e3fbe143SMarshall Clow } 4873e519524SHoward Hinnant}; 4883e519524SHoward Hinnant 489e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred> 490e5ec94a1SRuslan Arutyunyanclass __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, false> 4913e519524SHoward Hinnant{ 4923e519524SHoward Hinnant _Hash __hash_; 4933e519524SHoward Hinnantpublic: 494789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4953714107eSHoward Hinnant __unordered_map_hasher() 4963714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 4973714107eSHoward Hinnant : __hash_() {} 498789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4993714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 5003714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 5013714107eSHoward Hinnant : __hash_(__h) {} 502789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5033714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return __hash_;} 504789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 505a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 506f52318b4SErik Pilkington {return __hash_(__x.__get_value().first);} 507a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 508a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 5093e519524SHoward Hinnant {return __hash_(__x);} 510e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 511*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 512e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 513e5ec94a1SRuslan Arutyunyan size_t operator()(const _K2& __x) const 514e5ec94a1SRuslan Arutyunyan {return __hash_(__x);} 515e5ec94a1SRuslan Arutyunyan#endif 516e3fbe143SMarshall Clow void swap(__unordered_map_hasher& __y) 517e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 518e3fbe143SMarshall Clow { 519e3fbe143SMarshall Clow using _VSTD::swap; 520e3fbe143SMarshall Clow swap(__hash_, __y.__hash_); 521e3fbe143SMarshall Clow } 5223e519524SHoward Hinnant}; 5233e519524SHoward Hinnant 524e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, bool __b> 525e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 526e3fbe143SMarshall Clowvoid 527e5ec94a1SRuslan Arutyunyanswap(__unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __x, 528e5ec94a1SRuslan Arutyunyan __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __y) 529e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 530e3fbe143SMarshall Clow{ 531e3fbe143SMarshall Clow __x.swap(__y); 532e3fbe143SMarshall Clow} 533e3fbe143SMarshall Clow 534e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, 5353560fbf3SLouis Dionne bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value> 5363e519524SHoward Hinnantclass __unordered_map_equal 5373e519524SHoward Hinnant : private _Pred 5383e519524SHoward Hinnant{ 5393e519524SHoward Hinnantpublic: 540789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5413714107eSHoward Hinnant __unordered_map_equal() 5423714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 5433714107eSHoward Hinnant : _Pred() {} 544789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5453714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 5463714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 5473714107eSHoward Hinnant : _Pred(__p) {} 548789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5493714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return *this;} 550789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 551a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 552f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);} 553a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 554a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 555f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);} 556a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 557a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 558f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);} 559e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 560*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 561e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 562e5ec94a1SRuslan Arutyunyan bool operator()(const _Cp& __x, const _K2& __y) const 563e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);} 564*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 565e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 566e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Cp& __y) const 567e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);} 568*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 569e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 570e5ec94a1SRuslan Arutyunyan bool operator()(const _Key& __x, const _K2& __y) const 571e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y);} 572*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 573e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 574e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Key& __y) const 575e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y);} 576e5ec94a1SRuslan Arutyunyan#endif 577e3fbe143SMarshall Clow void swap(__unordered_map_equal& __y) 578e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 579e3fbe143SMarshall Clow { 580e3fbe143SMarshall Clow using _VSTD::swap; 581b3f57425SEric Fiselier swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y)); 582e3fbe143SMarshall Clow } 5833e519524SHoward Hinnant}; 5843e519524SHoward Hinnant 585e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash> 586e5ec94a1SRuslan Arutyunyanclass __unordered_map_equal<_Key, _Cp, _Pred, _Hash, false> 5873e519524SHoward Hinnant{ 5883e519524SHoward Hinnant _Pred __pred_; 5893e519524SHoward Hinnantpublic: 590789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5913714107eSHoward Hinnant __unordered_map_equal() 5923714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 5933714107eSHoward Hinnant : __pred_() {} 594789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5953714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 5963714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 5973714107eSHoward Hinnant : __pred_(__p) {} 598789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5993714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return __pred_;} 600789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 601a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 602f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y.__get_value().first);} 603a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 604a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 605f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y);} 606a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 607a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 608f52318b4SErik Pilkington {return __pred_(__x, __y.__get_value().first);} 609e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 610*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 611e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 612e5ec94a1SRuslan Arutyunyan bool operator()(const _Cp& __x, const _K2& __y) const 613e5ec94a1SRuslan Arutyunyan {return __pred_(__x.__get_value().first, __y);} 614*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 615e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 616e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Cp& __y) const 617e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y.__get_value().first);} 618*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 619e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 620e5ec94a1SRuslan Arutyunyan bool operator()(const _Key& __x, const _K2& __y) const 621e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y);} 622*4e0ea2cfSLouis Dionne template <typename _K2, typename = enable_if_t<__is_transparent<_Hash, _K2>::value && __is_transparent<_Pred, _K2>::value>> 623e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 624e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Key& __y) const 625e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y);} 626e5ec94a1SRuslan Arutyunyan#endif 627e3fbe143SMarshall Clow void swap(__unordered_map_equal& __y) 628e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 629e3fbe143SMarshall Clow { 630e3fbe143SMarshall Clow using _VSTD::swap; 631e3fbe143SMarshall Clow swap(__pred_, __y.__pred_); 632e3fbe143SMarshall Clow } 6333e519524SHoward Hinnant}; 6343e519524SHoward Hinnant 635e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, bool __b> 636e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 637e3fbe143SMarshall Clowvoid 638e5ec94a1SRuslan Arutyunyanswap(__unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __x, 639e5ec94a1SRuslan Arutyunyan __unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __y) 640e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 641e3fbe143SMarshall Clow{ 642e3fbe143SMarshall Clow __x.swap(__y); 643e3fbe143SMarshall Clow} 644e3fbe143SMarshall Clow 6453e519524SHoward Hinnanttemplate <class _Alloc> 6463e519524SHoward Hinnantclass __hash_map_node_destructor 6473e519524SHoward Hinnant{ 6483e519524SHoward Hinnant typedef _Alloc allocator_type; 6493e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 65075d0dcfdSEric Fiselier 6513e519524SHoward Hinnantpublic: 65275d0dcfdSEric Fiselier 6533e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 6543e519524SHoward Hinnantprivate: 6553e519524SHoward Hinnant 6563e519524SHoward Hinnant allocator_type& __na_; 6573e519524SHoward Hinnant 6583e519524SHoward Hinnant __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); 6593e519524SHoward Hinnant 6603e519524SHoward Hinnantpublic: 6613e519524SHoward Hinnant bool __first_constructed; 6623e519524SHoward Hinnant bool __second_constructed; 6633e519524SHoward Hinnant 664789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6653714107eSHoward Hinnant explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT 6663e519524SHoward Hinnant : __na_(__na), 6673e519524SHoward Hinnant __first_constructed(false), 6683e519524SHoward Hinnant __second_constructed(false) 6693e519524SHoward Hinnant {} 6703e519524SHoward Hinnant 6716a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 672789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6733e519524SHoward Hinnant __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) 6743714107eSHoward Hinnant _NOEXCEPT 6753e519524SHoward Hinnant : __na_(__x.__na_), 6763e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6773e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6783e519524SHoward Hinnant { 6793e519524SHoward Hinnant __x.__value_constructed = false; 6803e519524SHoward Hinnant } 6816a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 682789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6833e519524SHoward Hinnant __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) 6843e519524SHoward Hinnant : __na_(__x.__na_), 6853e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6863e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6873e519524SHoward Hinnant { 6883e519524SHoward Hinnant const_cast<bool&>(__x.__value_constructed) = false; 6893e519524SHoward Hinnant } 6906a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 6913e519524SHoward Hinnant 692789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6933714107eSHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6943e519524SHoward Hinnant { 6953e519524SHoward Hinnant if (__second_constructed) 696f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 6973e519524SHoward Hinnant if (__first_constructed) 698f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 6993e519524SHoward Hinnant if (__p) 7003e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 7013e519524SHoward Hinnant } 7023e519524SHoward Hinnant}; 7033e519524SHoward Hinnant 704fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 7059fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7067c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __hash_value_type 7079fd9f84fSHoward Hinnant{ 7089fd9f84fSHoward Hinnant typedef _Key key_type; 7099fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7109fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 711f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 712f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 7139fd9f84fSHoward Hinnant 714f52318b4SErik Pilkingtonprivate: 7159fd9f84fSHoward Hinnant value_type __cc; 716f52318b4SErik Pilkington 717f52318b4SErik Pilkingtonpublic: 718f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 719f52318b4SErik Pilkington value_type& __get_value() 720f52318b4SErik Pilkington { 721f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 722f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 723f52318b4SErik Pilkington#else 724f52318b4SErik Pilkington return __cc; 725f52318b4SErik Pilkington#endif 726f52318b4SErik Pilkington } 727f52318b4SErik Pilkington 728f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 729f52318b4SErik Pilkington const value_type& __get_value() const 730f52318b4SErik Pilkington { 731f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 732f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 733f52318b4SErik Pilkington#else 734f52318b4SErik Pilkington return __cc; 735f52318b4SErik Pilkington#endif 736f52318b4SErik Pilkington } 737f52318b4SErik Pilkington 738f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 739f52318b4SErik Pilkington __nc_ref_pair_type __ref() 740f52318b4SErik Pilkington { 741f52318b4SErik Pilkington value_type& __v = __get_value(); 742f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 743f52318b4SErik Pilkington } 744f52318b4SErik Pilkington 745f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 746f52318b4SErik Pilkington __nc_rref_pair_type __move() 747f52318b4SErik Pilkington { 748f52318b4SErik Pilkington value_type& __v = __get_value(); 749f52318b4SErik Pilkington return __nc_rref_pair_type( 750f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 751f52318b4SErik Pilkington _VSTD::move(__v.second)); 752f52318b4SErik Pilkington } 7539fd9f84fSHoward Hinnant 7549fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7559fd9f84fSHoward Hinnant __hash_value_type& operator=(const __hash_value_type& __v) 756f52318b4SErik Pilkington { 757f52318b4SErik Pilkington __ref() = __v.__get_value(); 758f52318b4SErik Pilkington return *this; 759f52318b4SErik Pilkington } 7609fd9f84fSHoward Hinnant 7619fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7629fd9f84fSHoward Hinnant __hash_value_type& operator=(__hash_value_type&& __v) 763f52318b4SErik Pilkington { 764f52318b4SErik Pilkington __ref() = __v.__move(); 765f52318b4SErik Pilkington return *this; 766f52318b4SErik Pilkington } 7679fd9f84fSHoward Hinnant 768fcd02211SEric Fiselier template <class _ValueTp, 769fcd02211SEric Fiselier class = typename enable_if< 770fcd02211SEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 771fcd02211SEric Fiselier >::type 772fcd02211SEric Fiselier > 7739fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 774f52318b4SErik Pilkington __hash_value_type& operator=(_ValueTp&& __v) 775f52318b4SErik Pilkington { 776f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 777f52318b4SErik Pilkington return *this; 778fcd02211SEric Fiselier } 779fcd02211SEric Fiselier 780fcd02211SEric Fiselierprivate: 781fcd02211SEric Fiselier __hash_value_type(const __hash_value_type& __v) = delete; 782fcd02211SEric Fiselier __hash_value_type(__hash_value_type&& __v) = delete; 783fcd02211SEric Fiselier template <class ..._Args> 784fcd02211SEric Fiselier explicit __hash_value_type(_Args&& ...__args) = delete; 785fcd02211SEric Fiselier 786fcd02211SEric Fiselier ~__hash_value_type() = delete; 7879fd9f84fSHoward Hinnant}; 7889fd9f84fSHoward Hinnant 7899fd9f84fSHoward Hinnant#else 7909fd9f84fSHoward Hinnant 7919fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7929fd9f84fSHoward Hinnantstruct __hash_value_type 7939fd9f84fSHoward Hinnant{ 7949fd9f84fSHoward Hinnant typedef _Key key_type; 7959fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7969fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 7979fd9f84fSHoward Hinnant 798f52318b4SErik Pilkingtonprivate: 7999fd9f84fSHoward Hinnant value_type __cc; 8009fd9f84fSHoward Hinnant 801f52318b4SErik Pilkingtonpublic: 802f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 803f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 804f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 805f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 806f52318b4SErik Pilkington 807fcd02211SEric Fiselierprivate: 808fcd02211SEric Fiselier ~__hash_value_type(); 8099fd9f84fSHoward Hinnant}; 8109fd9f84fSHoward Hinnant 8119fd9f84fSHoward Hinnant#endif 8129fd9f84fSHoward Hinnant 8133e519524SHoward Hinnanttemplate <class _HashIterator> 814e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator 8153e519524SHoward Hinnant{ 8163e519524SHoward Hinnant _HashIterator __i_; 8173e519524SHoward Hinnant 81875d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 81975d0dcfdSEric Fiselier 8203e519524SHoward Hinnantpublic: 8213e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 82275d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 82375d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 8243e519524SHoward Hinnant typedef value_type& reference; 82575d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 8263e519524SHoward Hinnant 827789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8283714107eSHoward Hinnant __hash_map_iterator() _NOEXCEPT {} 8293e519524SHoward Hinnant 830789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8313714107eSHoward Hinnant __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 8323e519524SHoward Hinnant 833789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 834f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 835789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 836f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8373e519524SHoward Hinnant 838789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8393e519524SHoward Hinnant __hash_map_iterator& operator++() {++__i_; return *this;} 840789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8413e519524SHoward Hinnant __hash_map_iterator operator++(int) 8423e519524SHoward Hinnant { 8433e519524SHoward Hinnant __hash_map_iterator __t(*this); 8443e519524SHoward Hinnant ++(*this); 8453e519524SHoward Hinnant return __t; 8463e519524SHoward Hinnant } 8473e519524SHoward Hinnant 848789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 849789847ddSHoward Hinnant bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 8503e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 851789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 852789847ddSHoward Hinnant bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 8533e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8543e519524SHoward Hinnant 855e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 856e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 857e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 858e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 859e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; 8603e519524SHoward Hinnant}; 8613e519524SHoward Hinnant 8623e519524SHoward Hinnanttemplate <class _HashIterator> 863e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator 8643e519524SHoward Hinnant{ 8653e519524SHoward Hinnant _HashIterator __i_; 8663e519524SHoward Hinnant 86775d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 86875d0dcfdSEric Fiselier 8693e519524SHoward Hinnantpublic: 8703e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 87175d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 87275d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 8733e519524SHoward Hinnant typedef const value_type& reference; 87475d0dcfdSEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 8753e519524SHoward Hinnant 876789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8773714107eSHoward Hinnant __hash_map_const_iterator() _NOEXCEPT {} 8783e519524SHoward Hinnant 879789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8803714107eSHoward Hinnant __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 881789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8823e519524SHoward Hinnant __hash_map_const_iterator( 8833e519524SHoward Hinnant __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) 8843714107eSHoward Hinnant _NOEXCEPT 8853e519524SHoward Hinnant : __i_(__i.__i_) {} 8863e519524SHoward Hinnant 887789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 888f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 889789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 890f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8913e519524SHoward Hinnant 892789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8933e519524SHoward Hinnant __hash_map_const_iterator& operator++() {++__i_; return *this;} 894789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8953e519524SHoward Hinnant __hash_map_const_iterator operator++(int) 8963e519524SHoward Hinnant { 8973e519524SHoward Hinnant __hash_map_const_iterator __t(*this); 8983e519524SHoward Hinnant ++(*this); 8993e519524SHoward Hinnant return __t; 9003e519524SHoward Hinnant } 9013e519524SHoward Hinnant 902789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 903789847ddSHoward Hinnant bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 9043e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 905789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 906789847ddSHoward Hinnant bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 9073e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 9083e519524SHoward Hinnant 909e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 910e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 911e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 912e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 9133e519524SHoward Hinnant}; 9143e519524SHoward Hinnant 9155c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 9165c4e07aeSErik Pilkingtonclass unordered_multimap; 9175c4e07aeSErik Pilkington 9183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 9193e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 920e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map 9213e519524SHoward Hinnant{ 9223e519524SHoward Hinnantpublic: 9233e519524SHoward Hinnant // types 9243e519524SHoward Hinnant typedef _Key key_type; 9253e519524SHoward Hinnant typedef _Tp mapped_type; 92609fa1d0eSArthur O'Dwyer typedef __identity_t<_Hash> hasher; 92709fa1d0eSArthur O'Dwyer typedef __identity_t<_Pred> key_equal; 92809fa1d0eSArthur O'Dwyer typedef __identity_t<_Alloc> allocator_type; 9293e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 9303e519524SHoward Hinnant typedef value_type& reference; 9313e519524SHoward Hinnant typedef const value_type& const_reference; 932b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 933b24c8024SHoward Hinnant "Invalid allocator::value_type"); 9343e519524SHoward Hinnant 9353e519524SHoward Hinnantprivate: 9369fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 937e5ec94a1SRuslan Arutyunyan typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher; 938e5ec94a1SRuslan Arutyunyan typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher> __key_equal; 9391f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 9401f508014SMarshall Clow __value_type>::type __allocator_type; 9413e519524SHoward Hinnant 9423e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 9433e519524SHoward Hinnant __key_equal, __allocator_type> __table; 9443e519524SHoward Hinnant 9453e519524SHoward Hinnant __table __table_; 9463e519524SHoward Hinnant 947fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 9483e519524SHoward Hinnant typedef typename __table::__node_pointer __node_pointer; 9493e519524SHoward Hinnant typedef typename __table::__node_const_pointer __node_const_pointer; 9503e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 9513e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 9523e519524SHoward Hinnant typedef typename __table::__node __node; 953c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 954c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 9553e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 956fcd02211SEric Fiselier 957fcd02211SEric Fiselier static_assert((is_same<typename __table::__container_value_type, value_type>::value), ""); 958fcd02211SEric Fiselier static_assert((is_same<typename __table::__node_value_type, __value_type>::value), ""); 9593e519524SHoward Hinnantpublic: 9603e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 9613e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 96275d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 96375d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 9643e519524SHoward Hinnant 9653e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 9663e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 9673e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 9683e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 9693e519524SHoward Hinnant 970b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 971b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 972b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 973b0386a51SErik Pilkington#endif 974b0386a51SErik Pilkington 9755c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 9765c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 9775c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 9785c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 9795c4e07aeSErik Pilkington 980789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9813714107eSHoward Hinnant unordered_map() 9823714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 983b24c8024SHoward Hinnant { 98431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 985b24c8024SHoward Hinnant __get_db()->__insert_c(this); 986b24c8024SHoward Hinnant#endif 987b24c8024SHoward Hinnant } 9883e519524SHoward Hinnant explicit unordered_map(size_type __n, const hasher& __hf = hasher(), 9893e519524SHoward Hinnant const key_equal& __eql = key_equal()); 9903e519524SHoward Hinnant unordered_map(size_type __n, const hasher& __hf, 9913e519524SHoward Hinnant const key_equal& __eql, 9923e519524SHoward Hinnant const allocator_type& __a); 9933e519524SHoward Hinnant template <class _InputIterator> 9943e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last); 9953e519524SHoward Hinnant template <class _InputIterator> 9963e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 9973e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 9983e519524SHoward Hinnant const key_equal& __eql = key_equal()); 9993e519524SHoward Hinnant template <class _InputIterator> 10003e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 10013e519524SHoward Hinnant size_type __n, const hasher& __hf, 10023e519524SHoward Hinnant const key_equal& __eql, 10033e519524SHoward Hinnant const allocator_type& __a); 1004cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 10053e519524SHoward Hinnant explicit unordered_map(const allocator_type& __a); 10063e519524SHoward Hinnant unordered_map(const unordered_map& __u); 10073e519524SHoward Hinnant unordered_map(const unordered_map& __u, const allocator_type& __a); 10086a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1009cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 10103714107eSHoward Hinnant unordered_map(unordered_map&& __u) 10113714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 10123e519524SHoward Hinnant unordered_map(unordered_map&& __u, const allocator_type& __a); 10133e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il); 10143e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 10153e519524SHoward Hinnant const hasher& __hf = hasher(), const key_equal& __eql = key_equal()); 10163e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 10173e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 10183e519524SHoward Hinnant const allocator_type& __a); 10196a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 10203cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 10213cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10223cd37e64SMarshall Clow unordered_map(size_type __n, const allocator_type& __a) 10233cd37e64SMarshall Clow : unordered_map(__n, hasher(), key_equal(), __a) {} 10243cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10253cd37e64SMarshall Clow unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a) 10263cd37e64SMarshall Clow : unordered_map(__n, __hf, key_equal(), __a) {} 10273cd37e64SMarshall Clow template <class _InputIterator> 10283cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10293cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 10303cd37e64SMarshall Clow : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {} 10313cd37e64SMarshall Clow template <class _InputIterator> 10323cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10333cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 10343cd37e64SMarshall Clow const allocator_type& __a) 10353cd37e64SMarshall Clow : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {} 10363cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10373cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 10383cd37e64SMarshall Clow : unordered_map(__il, __n, hasher(), key_equal(), __a) {} 10393cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10403cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 10413cd37e64SMarshall Clow const allocator_type& __a) 10423cd37e64SMarshall Clow : unordered_map(__il, __n, __hf, key_equal(), __a) {} 10433cd37e64SMarshall Clow#endif 10447c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 10457c142fccSLouis Dionne ~unordered_map() { 10467c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 10477c142fccSLouis Dionne } 10487c142fccSLouis Dionne 10495a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10505a33687dSHoward Hinnant unordered_map& operator=(const unordered_map& __u) 10515a33687dSHoward Hinnant { 10522ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 10535a33687dSHoward Hinnant __table_ = __u.__table_; 1054307f8143SHoward Hinnant#else 105574cf6ff5SMarshall Clow if (this != &__u) { 1056307f8143SHoward Hinnant __table_.clear(); 1057307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 1058307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 1059307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 1060307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 1061307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 106274cf6ff5SMarshall Clow } 1063307f8143SHoward Hinnant#endif 10645a33687dSHoward Hinnant return *this; 10655a33687dSHoward Hinnant } 10666a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1067cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 10683714107eSHoward Hinnant unordered_map& operator=(unordered_map&& __u) 10693714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 1070cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 10713e519524SHoward Hinnant unordered_map& operator=(initializer_list<value_type> __il); 10726a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 10733e519524SHoward Hinnant 1074789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10753714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 10763e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 10773e519524SHoward Hinnant 107872c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 10793714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1080789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10813714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 1082789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10833714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 10843e519524SHoward Hinnant 1085789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10863714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 1087789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10883714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 1089789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10903714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1091789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10923714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 1093789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10943714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1095789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10963714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 10973e519524SHoward Hinnant 10987a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10997a9f500fSEric Fiselier pair<iterator, bool> insert(const value_type& __x) 11007a9f500fSEric Fiselier {return __table_.__insert_unique(__x);} 11017a9f500fSEric Fiselier 11027a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) { 110331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 11047a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 11057a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 11067a9f500fSEric Fiselier " referring to this unordered_map"); 1107fd838227SEric Fiselier#else 1108fd838227SEric Fiselier ((void)__p); 11097a9f500fSEric Fiselier#endif 11107a9f500fSEric Fiselier return insert(__x).first; 11117a9f500fSEric Fiselier } 11127a9f500fSEric Fiselier 11137a9f500fSEric Fiselier template <class _InputIterator> 1114cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 11157a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 11167a9f500fSEric Fiselier 11176a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11187a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11197a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 11207a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 11217a9f500fSEric Fiselier 11227a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11237a9f500fSEric Fiselier pair<iterator, bool> insert(value_type&& __x) 11247a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::move(__x));} 11257a9f500fSEric Fiselier 11267a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) { 112731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 11287a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 11297a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 11307a9f500fSEric Fiselier " referring to this unordered_map"); 1131fd838227SEric Fiselier#else 1132fd838227SEric Fiselier ((void)__p); 11337a9f500fSEric Fiselier#endif 11347a9f500fSEric Fiselier return __table_.__insert_unique(_VSTD::move(__x)).first; 11357a9f500fSEric Fiselier } 11367a9f500fSEric Fiselier 11377a9f500fSEric Fiselier template <class _Pp, 11387a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 11397a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11407a9f500fSEric Fiselier pair<iterator, bool> insert(_Pp&& __x) 11417a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} 11427a9f500fSEric Fiselier 11437a9f500fSEric Fiselier template <class _Pp, 11447a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 11457a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11467a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 11477a9f500fSEric Fiselier { 114831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 11497a9f500fSEric Fiselier _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 11507a9f500fSEric Fiselier "unordered_map::insert(const_iterator, value_type&&) called with an iterator not" 11517a9f500fSEric Fiselier " referring to this unordered_map"); 1152fd838227SEric Fiselier#else 1153fd838227SEric Fiselier ((void)__p); 11547a9f500fSEric Fiselier#endif 11557a9f500fSEric Fiselier return insert(_VSTD::forward<_Pp>(__x)).first; 11567a9f500fSEric Fiselier } 11577a9f500fSEric Fiselier 11588b805c91SHoward Hinnant template <class... _Args> 1159fcd02211SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1160fcd02211SEric Fiselier pair<iterator, bool> emplace(_Args&&... __args) { 1161fcd02211SEric Fiselier return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 1162fcd02211SEric Fiselier } 11633e519524SHoward Hinnant 11648b805c91SHoward Hinnant template <class... _Args> 1165789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1166fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 116731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 11684c80bfbdSHoward Hinnant _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, 11694c80bfbdSHoward Hinnant "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not" 11704c80bfbdSHoward Hinnant " referring to this unordered_map"); 1171fd838227SEric Fiselier#else 1172fd838227SEric Fiselier ((void)__p); 1173fcd02211SEric Fiselier#endif 1174ad783ce9SDuncan P. N. Exon Smith return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; 11754c80bfbdSHoward Hinnant } 1176fcd02211SEric Fiselier 1177fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 1178fcd02211SEric Fiselier 1179bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14 1180bc4c89a9SMarshall Clow template <class... _Args> 1181bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1182bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 1183bc4c89a9SMarshall Clow { 1184d586f92cSArthur O'Dwyer return __table_.__emplace_unique_key_args(__k, piecewise_construct, 118587c4104dSEric Fiselier _VSTD::forward_as_tuple(__k), 118687c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1187bc4c89a9SMarshall Clow } 1188bc4c89a9SMarshall Clow 1189bc4c89a9SMarshall Clow template <class... _Args> 1190bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1191bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 1192bc4c89a9SMarshall Clow { 1193d586f92cSArthur O'Dwyer return __table_.__emplace_unique_key_args(__k, piecewise_construct, 119487c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 119587c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1196bc4c89a9SMarshall Clow } 1197bc4c89a9SMarshall Clow 1198bc4c89a9SMarshall Clow template <class... _Args> 1199bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1200bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 1201bc4c89a9SMarshall Clow { 120231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1203eef9b35cSOleg Ranevskyy _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this, 120487c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 120587c4104dSEric Fiselier " referring to this unordered_map"); 1206fd838227SEric Fiselier#else 1207fd838227SEric Fiselier ((void)__h); 120887c4104dSEric Fiselier#endif 120987c4104dSEric Fiselier return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first; 1210bc4c89a9SMarshall Clow } 1211bc4c89a9SMarshall Clow 1212bc4c89a9SMarshall Clow template <class... _Args> 1213bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1214bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 1215bc4c89a9SMarshall Clow { 121631e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1217eef9b35cSOleg Ranevskyy _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__h) == this, 121887c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 121987c4104dSEric Fiselier " referring to this unordered_map"); 1220fd838227SEric Fiselier#else 1221fd838227SEric Fiselier ((void)__h); 122287c4104dSEric Fiselier#endif 122387c4104dSEric Fiselier return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first; 1224bc4c89a9SMarshall Clow } 1225bc4c89a9SMarshall Clow 1226bc4c89a9SMarshall Clow template <class _Vp> 1227bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1228bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 1229bc4c89a9SMarshall Clow { 123087c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 123187c4104dSEric Fiselier __k, _VSTD::forward<_Vp>(__v)); 123287c4104dSEric Fiselier if (!__res.second) { 123387c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1234bc4c89a9SMarshall Clow } 123587c4104dSEric Fiselier return __res; 1236bc4c89a9SMarshall Clow } 1237bc4c89a9SMarshall Clow 1238bc4c89a9SMarshall Clow template <class _Vp> 1239bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1240bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 1241bc4c89a9SMarshall Clow { 124287c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 124387c4104dSEric Fiselier _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 124487c4104dSEric Fiselier if (!__res.second) { 124587c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1246bc4c89a9SMarshall Clow } 124787c4104dSEric Fiselier return __res; 1248bc4c89a9SMarshall Clow } 1249bc4c89a9SMarshall Clow 1250bc4c89a9SMarshall Clow template <class _Vp> 1251bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1252fd838227SEric Fiselier iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v) 1253bc4c89a9SMarshall Clow { 1254fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 125587c4104dSEric Fiselier return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first; 1256bc4c89a9SMarshall Clow } 1257bc4c89a9SMarshall Clow 1258bc4c89a9SMarshall Clow template <class _Vp> 1259bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1260fd838227SEric Fiselier iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v) 1261bc4c89a9SMarshall Clow { 1262fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 126387c4104dSEric Fiselier return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first; 1264bc4c89a9SMarshall Clow } 12656a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14 1266bc4c89a9SMarshall Clow 1267789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12683e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 1269789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1270ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 1271ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12723e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 1273789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12743e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 12753e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 1276789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12773714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 12783e519524SHoward Hinnant 1279b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1280b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1281b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1282b0386a51SErik Pilkington { 1283b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1284b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1285b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique< 1286b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1287b0386a51SErik Pilkington } 1288b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1289b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1290b0386a51SErik Pilkington { 1291b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1292b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1293b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique<node_type>( 1294b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1295b0386a51SErik Pilkington } 1296b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1297b0386a51SErik Pilkington node_type extract(key_type const& __key) 1298b0386a51SErik Pilkington { 1299b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 1300b0386a51SErik Pilkington } 1301b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1302b0386a51SErik Pilkington node_type extract(const_iterator __it) 1303b0386a51SErik Pilkington { 1304b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 1305b0386a51SErik Pilkington __it.__i_); 1306b0386a51SErik Pilkington } 13075c4e07aeSErik Pilkington 13085c4e07aeSErik Pilkington template <class _H2, class _P2> 13095c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13105c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 13115c4e07aeSErik Pilkington { 13125c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13135c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13145c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 13155c4e07aeSErik Pilkington } 13165c4e07aeSErik Pilkington template <class _H2, class _P2> 13175c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13185c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 13195c4e07aeSErik Pilkington { 13205c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13215c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13225c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 13235c4e07aeSErik Pilkington } 13245c4e07aeSErik Pilkington template <class _H2, class _P2> 13255c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13265c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 13275c4e07aeSErik Pilkington { 13285c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13295c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13305c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 13315c4e07aeSErik Pilkington } 13325c4e07aeSErik Pilkington template <class _H2, class _P2> 13335c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13345c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 13355c4e07aeSErik Pilkington { 13365c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13375c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13385c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 13395c4e07aeSErik Pilkington } 1340b0386a51SErik Pilkington#endif 1341b0386a51SErik Pilkington 1342789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13433714107eSHoward Hinnant void swap(unordered_map& __u) 13443714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 13453714107eSHoward Hinnant { __table_.swap(__u.__table_);} 13463e519524SHoward Hinnant 1347789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13483e519524SHoward Hinnant hasher hash_function() const 13493e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 1350789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13513e519524SHoward Hinnant key_equal key_eq() const 13523e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 13533e519524SHoward Hinnant 1354789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13553e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 1356789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13573e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1358e5ec94a1SRuslan Arutyunyan 1359e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 1360e5ec94a1SRuslan Arutyunyan template <typename _K2> 1361e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1362*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, iterator> 1363e5ec94a1SRuslan Arutyunyan find(const _K2& __k) {return __table_.find(__k);} 1364e5ec94a1SRuslan Arutyunyan template <typename _K2> 1365e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1366*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, const_iterator> 1367e5ec94a1SRuslan Arutyunyan find(const _K2& __k) const {return __table_.find(__k);} 1368e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 1369e5ec94a1SRuslan Arutyunyan 1370789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13713e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 1372a17b1aedSZoe Carver #if _LIBCPP_STD_VER > 17 1373e5ec94a1SRuslan Arutyunyan template <typename _K2> 1374e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1375*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, size_type> 1376e5ec94a1SRuslan Arutyunyan count(const _K2& __k) const {return __table_.__count_unique(__k);} 1377e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 1378e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 1379a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 1380a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 1381e5ec94a1SRuslan Arutyunyan 1382e5ec94a1SRuslan Arutyunyan template <typename _K2> 1383e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1384*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, bool> 1385e5ec94a1SRuslan Arutyunyan contains(const _K2& __k) const {return find(__k) != end();} 1386a17b1aedSZoe Carver #endif // _LIBCPP_STD_VER > 17 1387789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13883e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 13893e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 1390789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13913e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 13923e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 1393e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 1394e5ec94a1SRuslan Arutyunyan template <typename _K2> 1395e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1396*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<iterator, iterator>> 1397e5ec94a1SRuslan Arutyunyan equal_range(const _K2& __k) {return __table_.__equal_range_unique(__k);} 1398e5ec94a1SRuslan Arutyunyan template <typename _K2> 1399e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1400*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<const_iterator, const_iterator>> 1401e5ec94a1SRuslan Arutyunyan equal_range(const _K2& __k) const {return __table_.__equal_range_unique(__k);} 1402e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 14033e519524SHoward Hinnant 14043e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 14050f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 14063e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 14073e519524SHoward Hinnant#endif 14083e519524SHoward Hinnant 14093e519524SHoward Hinnant mapped_type& at(const key_type& __k); 14103e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 14113e519524SHoward Hinnant 1412789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14133714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1414789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14153714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 14163e519524SHoward Hinnant 1417789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14183e519524SHoward Hinnant size_type bucket_size(size_type __n) const 14193e519524SHoward Hinnant {return __table_.bucket_size(__n);} 1420789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14213e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 14223e519524SHoward Hinnant 1423789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14243e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 1425789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14263e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 1427789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14283e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1429789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14303e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1431789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14323e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1433789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14343e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 14353e519524SHoward Hinnant 1436789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14373714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1438789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14393714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1440789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14413e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1442789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14433e519524SHoward Hinnant void rehash(size_type __n) {__table_.rehash(__n);} 1444789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14453e519524SHoward Hinnant void reserve(size_type __n) {__table_.reserve(__n);} 14463e519524SHoward Hinnant 144731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1448b24c8024SHoward Hinnant 1449b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 1450b24c8024SHoward Hinnant {return __table_.__dereferenceable(&__i->__i_);} 1451b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 1452b24c8024SHoward Hinnant {return __table_.__decrementable(&__i->__i_);} 1453b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1454b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 1455b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1456b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 1457b24c8024SHoward Hinnant 145831e82037SLouis Dionne#endif // _LIBCPP_DEBUG_LEVEL == 2 1459b24c8024SHoward Hinnant 14603e519524SHoward Hinnantprivate: 14610f905677SEric Fiselier 14620f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 14634a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 14640f905677SEric Fiselier#endif 14653e519524SHoward Hinnant}; 14663e519524SHoward Hinnant 146701666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 1468dfcd4384SLouis Dionnetemplate<class _InputIterator, 1469dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 1470dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 1471dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 1472*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 1473*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 1474*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 1475*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1476dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 1477dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1478dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 1479dfcd4384SLouis Dionne 1480dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 1481dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 1482dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 1483*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 1484*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 1485*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 1486*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1487dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 1488dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1489dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 1490dfcd4384SLouis Dionne 1491dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 1492*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1493dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 1494dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1495dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1496dfcd4384SLouis Dionne 1497dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 1498*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1499dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator) 1500dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1501dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1502dfcd4384SLouis Dionne 1503dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 1504*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 1505*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 1506*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1507dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1508dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1509dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1510dfcd4384SLouis Dionne 1511dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 1512*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1513dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 1514dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1515dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1516dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1517dfcd4384SLouis Dionne 1518dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 1519*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1520dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator) 1521dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1522dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1523dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1524dfcd4384SLouis Dionne 1525dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 1526*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 1527*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 1528*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1529dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1530dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, 1531dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1532dfcd4384SLouis Dionne#endif 1533dfcd4384SLouis Dionne 15343e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15353e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15363e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 15373e519524SHoward Hinnant : __table_(__hf, __eql) 15383e519524SHoward Hinnant{ 153931e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1540b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1541b24c8024SHoward Hinnant#endif 15423e519524SHoward Hinnant __table_.rehash(__n); 15433e519524SHoward Hinnant} 15443e519524SHoward Hinnant 15453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15463e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15473e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 15483e519524SHoward Hinnant const allocator_type& __a) 15492a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 15503e519524SHoward Hinnant{ 155131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1552b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1553b24c8024SHoward Hinnant#endif 15543e519524SHoward Hinnant __table_.rehash(__n); 15553e519524SHoward Hinnant} 15563e519524SHoward Hinnant 15573e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1558cd31b434SEvgeniy Stepanovinline 15593e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15603e519524SHoward Hinnant const allocator_type& __a) 15612a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 15623e519524SHoward Hinnant{ 156331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1564b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1565b24c8024SHoward Hinnant#endif 15663e519524SHoward Hinnant} 15673e519524SHoward Hinnant 15683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15693e519524SHoward Hinnanttemplate <class _InputIterator> 15703e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15713e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 15723e519524SHoward Hinnant{ 157331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1574b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1575b24c8024SHoward Hinnant#endif 15763e519524SHoward Hinnant insert(__first, __last); 15773e519524SHoward Hinnant} 15783e519524SHoward Hinnant 15793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15803e519524SHoward Hinnanttemplate <class _InputIterator> 15813e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15823e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 15833e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 15843e519524SHoward Hinnant : __table_(__hf, __eql) 15853e519524SHoward Hinnant{ 158631e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1587b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1588b24c8024SHoward Hinnant#endif 15893e519524SHoward Hinnant __table_.rehash(__n); 15903e519524SHoward Hinnant insert(__first, __last); 15913e519524SHoward Hinnant} 15923e519524SHoward Hinnant 15933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 15943e519524SHoward Hinnanttemplate <class _InputIterator> 15953e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 15963e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 15973e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 15982a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 15993e519524SHoward Hinnant{ 160031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1601b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1602b24c8024SHoward Hinnant#endif 16033e519524SHoward Hinnant __table_.rehash(__n); 16043e519524SHoward Hinnant insert(__first, __last); 16053e519524SHoward Hinnant} 16063e519524SHoward Hinnant 16073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16083e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16093e519524SHoward Hinnant const unordered_map& __u) 16103e519524SHoward Hinnant : __table_(__u.__table_) 16113e519524SHoward Hinnant{ 161231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1613b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1614b24c8024SHoward Hinnant#endif 16153e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 16163e519524SHoward Hinnant insert(__u.begin(), __u.end()); 16173e519524SHoward Hinnant} 16183e519524SHoward Hinnant 16193e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16203e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16213e519524SHoward Hinnant const unordered_map& __u, const allocator_type& __a) 16222a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 16233e519524SHoward Hinnant{ 162431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1625b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1626b24c8024SHoward Hinnant#endif 16273e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 16283e519524SHoward Hinnant insert(__u.begin(), __u.end()); 16293e519524SHoward Hinnant} 16303e519524SHoward Hinnant 16316a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 16323e519524SHoward Hinnant 16333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1634cd31b434SEvgeniy Stepanovinline 16353e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16363e519524SHoward Hinnant unordered_map&& __u) 16373714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1638ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 16393e519524SHoward Hinnant{ 164031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1641b24c8024SHoward Hinnant __get_db()->__insert_c(this); 16424c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 1643b24c8024SHoward Hinnant#endif 16443e519524SHoward Hinnant} 16453e519524SHoward Hinnant 16463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16473e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16483e519524SHoward Hinnant unordered_map&& __u, const allocator_type& __a) 16492a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 16503e519524SHoward Hinnant{ 165131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1652b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1653b24c8024SHoward Hinnant#endif 16543e519524SHoward Hinnant if (__a != __u.get_allocator()) 16553e519524SHoward Hinnant { 16563e519524SHoward Hinnant iterator __i = __u.begin(); 1657fcd02211SEric Fiselier while (__u.size() != 0) { 1658f52318b4SErik Pilkington __table_.__emplace_unique( 1659f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 1660fcd02211SEric Fiselier } 16613e519524SHoward Hinnant } 166231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 16634c80bfbdSHoward Hinnant else 16644c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 16654c80bfbdSHoward Hinnant#endif 16663e519524SHoward Hinnant} 16673e519524SHoward Hinnant 16683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16693e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16703e519524SHoward Hinnant initializer_list<value_type> __il) 16713e519524SHoward Hinnant{ 167231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1673b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1674b24c8024SHoward Hinnant#endif 16753e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16763e519524SHoward Hinnant} 16773e519524SHoward Hinnant 16783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16793e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16803e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 16813e519524SHoward Hinnant const key_equal& __eql) 16823e519524SHoward Hinnant : __table_(__hf, __eql) 16833e519524SHoward Hinnant{ 168431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1685b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1686b24c8024SHoward Hinnant#endif 16873e519524SHoward Hinnant __table_.rehash(__n); 16883e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16893e519524SHoward Hinnant} 16903e519524SHoward Hinnant 16913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16923e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16933e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 16943e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 16952a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 16963e519524SHoward Hinnant{ 169731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1698b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1699b24c8024SHoward Hinnant#endif 17003e519524SHoward Hinnant __table_.rehash(__n); 17013e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17023e519524SHoward Hinnant} 17033e519524SHoward Hinnant 17043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1705cd31b434SEvgeniy Stepanovinline 17063e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 17073e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u) 17083714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 17093e519524SHoward Hinnant{ 1710ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 17113e519524SHoward Hinnant return *this; 17123e519524SHoward Hinnant} 17133e519524SHoward Hinnant 17143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1715cd31b434SEvgeniy Stepanovinline 17163e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 17173e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 17183e519524SHoward Hinnant initializer_list<value_type> __il) 17193e519524SHoward Hinnant{ 17203e519524SHoward Hinnant __table_.__assign_unique(__il.begin(), __il.end()); 17213e519524SHoward Hinnant return *this; 17223e519524SHoward Hinnant} 17233e519524SHoward Hinnant 17246a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 17253e519524SHoward Hinnant 17263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17273e519524SHoward Hinnanttemplate <class _InputIterator> 1728cd31b434SEvgeniy Stepanovinline 17293e519524SHoward Hinnantvoid 17303e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 17313e519524SHoward Hinnant _InputIterator __last) 17323e519524SHoward Hinnant{ 17333e519524SHoward Hinnant for (; __first != __last; ++__first) 17343e519524SHoward Hinnant __table_.__insert_unique(*__first); 17353e519524SHoward Hinnant} 17363e519524SHoward Hinnant 17376a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17383e519524SHoward Hinnant 17390f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17400f905677SEric Fiselier_Tp& 17410f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 17420f905677SEric Fiselier{ 17430f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 1744d586f92cSArthur O'Dwyer piecewise_construct, _VSTD::forward_as_tuple(__k), 1745d586f92cSArthur O'Dwyer _VSTD::forward_as_tuple()).first->__get_value().second; 17460f905677SEric Fiselier} 17473e519524SHoward Hinnant 17483e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17493e519524SHoward Hinnant_Tp& 17503e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) 17513e519524SHoward Hinnant{ 17520f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 1753d586f92cSArthur O'Dwyer piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), 1754d586f92cSArthur O'Dwyer _VSTD::forward_as_tuple()).first->__get_value().second; 17553e519524SHoward Hinnant} 17566a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 17573e519524SHoward Hinnant 17586a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17596a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 17606a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k) 17616a470bcbSEric Fiselier{ 17626a470bcbSEric Fiselier __node_allocator& __na = __table_.__node_alloc(); 17636a470bcbSEric Fiselier __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1764f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 17656a470bcbSEric Fiselier __h.get_deleter().__first_constructed = true; 1766f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 17676a470bcbSEric Fiselier __h.get_deleter().__second_constructed = true; 17688d4860aaSLouis Dionne return __h; 17696a470bcbSEric Fiselier} 17706a470bcbSEric Fiselier 17716a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17726a470bcbSEric Fiselier_Tp& 17736a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 17746a470bcbSEric Fiselier{ 17756a470bcbSEric Fiselier iterator __i = find(__k); 17766a470bcbSEric Fiselier if (__i != end()) 17776a470bcbSEric Fiselier return __i->second; 17786a470bcbSEric Fiselier __node_holder __h = __construct_node_with_key(__k); 17796a470bcbSEric Fiselier pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 17806a470bcbSEric Fiselier __h.release(); 17816a470bcbSEric Fiselier return __r.first->second; 17826a470bcbSEric Fiselier} 17836a470bcbSEric Fiselier 1784e6972024SArthur O'Dwyer#endif // _LIBCPP_CXX03_LANG 17853e519524SHoward Hinnant 17863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17873e519524SHoward Hinnant_Tp& 17883e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) 17893e519524SHoward Hinnant{ 17903e519524SHoward Hinnant iterator __i = find(__k); 17913e519524SHoward Hinnant if (__i == end()) 17927232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 17933e519524SHoward Hinnant return __i->second; 17943e519524SHoward Hinnant} 17953e519524SHoward Hinnant 17963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17973e519524SHoward Hinnantconst _Tp& 17983e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const 17993e519524SHoward Hinnant{ 18003e519524SHoward Hinnant const_iterator __i = find(__k); 18013e519524SHoward Hinnant if (__i == end()) 18027232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 18033e519524SHoward Hinnant return __i->second; 18043e519524SHoward Hinnant} 18053e519524SHoward Hinnant 18063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1807789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18083e519524SHoward Hinnantvoid 18093e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 18103e519524SHoward Hinnant unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 18113714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 18123e519524SHoward Hinnant{ 18133e519524SHoward Hinnant __x.swap(__y); 18143e519524SHoward Hinnant} 18153e519524SHoward Hinnant 1816f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 18173e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 18183e895085SMarek Kurdej class _Predicate> 1819f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 18203e895085SMarek Kurdej typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type 18213e895085SMarek Kurdej erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, 18223e895085SMarek Kurdej _Predicate __pred) { 18232ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 18243e895085SMarek Kurdej} 1825f60c63c0SMarshall Clow#endif 1826f60c63c0SMarshall Clow 18273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18283e519524SHoward Hinnantbool 18293e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 18303e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 18313e519524SHoward Hinnant{ 18323e519524SHoward Hinnant if (__x.size() != __y.size()) 18333e519524SHoward Hinnant return false; 18343e519524SHoward Hinnant typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 18353e519524SHoward Hinnant const_iterator; 18363e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 18373e519524SHoward Hinnant __i != __ex; ++__i) 18383e519524SHoward Hinnant { 18393e519524SHoward Hinnant const_iterator __j = __y.find(__i->first); 18403e519524SHoward Hinnant if (__j == __ey || !(*__i == *__j)) 18413e519524SHoward Hinnant return false; 18423e519524SHoward Hinnant } 18433e519524SHoward Hinnant return true; 18443e519524SHoward Hinnant} 18453e519524SHoward Hinnant 18463e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1847789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18483e519524SHoward Hinnantbool 18493e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 18503e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 18513e519524SHoward Hinnant{ 18523e519524SHoward Hinnant return !(__x == __y); 18533e519524SHoward Hinnant} 18543e519524SHoward Hinnant 18553e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 18563e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 1857e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap 18583e519524SHoward Hinnant{ 18593e519524SHoward Hinnantpublic: 18603e519524SHoward Hinnant // types 18613e519524SHoward Hinnant typedef _Key key_type; 18623e519524SHoward Hinnant typedef _Tp mapped_type; 186309fa1d0eSArthur O'Dwyer typedef __identity_t<_Hash> hasher; 186409fa1d0eSArthur O'Dwyer typedef __identity_t<_Pred> key_equal; 186509fa1d0eSArthur O'Dwyer typedef __identity_t<_Alloc> allocator_type; 18663e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 18673e519524SHoward Hinnant typedef value_type& reference; 18683e519524SHoward Hinnant typedef const value_type& const_reference; 1869b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1870b24c8024SHoward Hinnant "Invalid allocator::value_type"); 18713e519524SHoward Hinnant 18723e519524SHoward Hinnantprivate: 18739fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 1874e5ec94a1SRuslan Arutyunyan typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher; 1875e5ec94a1SRuslan Arutyunyan typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher> __key_equal; 18761f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 18771f508014SMarshall Clow __value_type>::type __allocator_type; 18783e519524SHoward Hinnant 18793e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 18803e519524SHoward Hinnant __key_equal, __allocator_type> __table; 18813e519524SHoward Hinnant 18823e519524SHoward Hinnant __table __table_; 18833e519524SHoward Hinnant 1884fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 18853e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 18863e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 18873e519524SHoward Hinnant typedef typename __table::__node __node; 1888c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 1889c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 18903e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 189175d0dcfdSEric Fiselier static_assert((is_same<typename __node_traits::size_type, 189275d0dcfdSEric Fiselier typename __alloc_traits::size_type>::value), 189375d0dcfdSEric Fiselier "Allocator uses different size_type for different types"); 18943e519524SHoward Hinnantpublic: 18953e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 18963e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 189775d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 189875d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 18993e519524SHoward Hinnant 19003e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 19013e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 19023e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 19033e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 19043e519524SHoward Hinnant 1905b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1906b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 1907b0386a51SErik Pilkington#endif 1908b0386a51SErik Pilkington 19095c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 19105c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 19115c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 19125c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 19135c4e07aeSErik Pilkington 1914789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19153714107eSHoward Hinnant unordered_multimap() 19163714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1917b24c8024SHoward Hinnant { 191831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 1919b24c8024SHoward Hinnant __get_db()->__insert_c(this); 1920b24c8024SHoward Hinnant#endif 1921b24c8024SHoward Hinnant } 19223e519524SHoward Hinnant explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(), 19233e519524SHoward Hinnant const key_equal& __eql = key_equal()); 19243e519524SHoward Hinnant unordered_multimap(size_type __n, const hasher& __hf, 19253e519524SHoward Hinnant const key_equal& __eql, 19263e519524SHoward Hinnant const allocator_type& __a); 19273e519524SHoward Hinnant template <class _InputIterator> 19283e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last); 19293e519524SHoward Hinnant template <class _InputIterator> 19303e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 19313e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 19323e519524SHoward Hinnant const key_equal& __eql = key_equal()); 19333e519524SHoward Hinnant template <class _InputIterator> 19343e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 19353e519524SHoward Hinnant size_type __n, const hasher& __hf, 19363e519524SHoward Hinnant const key_equal& __eql, 19373e519524SHoward Hinnant const allocator_type& __a); 1938cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 19393e519524SHoward Hinnant explicit unordered_multimap(const allocator_type& __a); 19403e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u); 19413e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u, const allocator_type& __a); 19426a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1943cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 19443714107eSHoward Hinnant unordered_multimap(unordered_multimap&& __u) 19453714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 19463e519524SHoward Hinnant unordered_multimap(unordered_multimap&& __u, const allocator_type& __a); 19473e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il); 19483e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 19493e519524SHoward Hinnant const hasher& __hf = hasher(), 19503e519524SHoward Hinnant const key_equal& __eql = key_equal()); 19513e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 19523e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 19533e519524SHoward Hinnant const allocator_type& __a); 19546a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 19553cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 19563cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19573cd37e64SMarshall Clow unordered_multimap(size_type __n, const allocator_type& __a) 19583cd37e64SMarshall Clow : unordered_multimap(__n, hasher(), key_equal(), __a) {} 19593cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19603cd37e64SMarshall Clow unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a) 19613cd37e64SMarshall Clow : unordered_multimap(__n, __hf, key_equal(), __a) {} 19623cd37e64SMarshall Clow template <class _InputIterator> 19633cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19643cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 19653cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {} 19663cd37e64SMarshall Clow template <class _InputIterator> 19673cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19683cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 19693cd37e64SMarshall Clow const allocator_type& __a) 19703cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {} 19713cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19723cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 19733cd37e64SMarshall Clow : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {} 19743cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19753cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 19763cd37e64SMarshall Clow const allocator_type& __a) 19773cd37e64SMarshall Clow : unordered_multimap(__il, __n, __hf, key_equal(), __a) {} 19783cd37e64SMarshall Clow#endif 19797c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 19807c142fccSLouis Dionne ~unordered_multimap() { 19817c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 19827c142fccSLouis Dionne } 19837c142fccSLouis Dionne 19845a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19855a33687dSHoward Hinnant unordered_multimap& operator=(const unordered_multimap& __u) 19865a33687dSHoward Hinnant { 19872ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 19885a33687dSHoward Hinnant __table_ = __u.__table_; 1989307f8143SHoward Hinnant#else 199074cf6ff5SMarshall Clow if (this != &__u) { 1991307f8143SHoward Hinnant __table_.clear(); 1992307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 1993307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 1994307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 1995307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 1996307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 199774cf6ff5SMarshall Clow } 1998307f8143SHoward Hinnant#endif 19995a33687dSHoward Hinnant return *this; 20005a33687dSHoward Hinnant } 20016a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2002cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20033714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&& __u) 20043714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 2005cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20063e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type> __il); 20076a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 20083e519524SHoward Hinnant 2009789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20103714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 20113e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 20123e519524SHoward Hinnant 201372c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 20143714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 2015789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20163714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 2017789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20183714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 20193e519524SHoward Hinnant 2020789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20213714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 2022789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20233714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 2024789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20253714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 2026789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20273714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 2028789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20293714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 2030789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20313714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 20323e519524SHoward Hinnant 20337a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20347a9f500fSEric Fiselier iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 20357a9f500fSEric Fiselier 20367a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20377a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) 20387a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, __x);} 20397a9f500fSEric Fiselier 20407a9f500fSEric Fiselier template <class _InputIterator> 2041cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20427a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 20437a9f500fSEric Fiselier 20446a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 20457a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20467a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 20477a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 20487a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20497a9f500fSEric Fiselier iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} 20507a9f500fSEric Fiselier 20517a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20527a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) 20537a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));} 20547a9f500fSEric Fiselier 20557a9f500fSEric Fiselier template <class _Pp, 20567a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 20577a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20587a9f500fSEric Fiselier iterator insert(_Pp&& __x) 20597a9f500fSEric Fiselier {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} 20607a9f500fSEric Fiselier 20617a9f500fSEric Fiselier template <class _Pp, 20627a9f500fSEric Fiselier class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 20637a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20647a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 20657a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} 20667a9f500fSEric Fiselier 2067fcd02211SEric Fiselier template <class... _Args> 2068fcd02211SEric Fiselier iterator emplace(_Args&&... __args) { 2069fcd02211SEric Fiselier return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 2070fcd02211SEric Fiselier } 20717609c9b6SHoward Hinnant 20728b805c91SHoward Hinnant template <class... _Args> 2073fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 2074fcd02211SEric Fiselier return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 2075fcd02211SEric Fiselier } 2076fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 20773e519524SHoward Hinnant 20783e519524SHoward Hinnant 2079789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20803e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 2081789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2082ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 2083ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20843e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 2085789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20863e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 20873e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 2088789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20893714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 20903e519524SHoward Hinnant 2091b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 2092b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2093b0386a51SErik Pilkington iterator insert(node_type&& __nh) 2094b0386a51SErik Pilkington { 2095b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2096b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 2097b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 2098b0386a51SErik Pilkington _VSTD::move(__nh)); 2099b0386a51SErik Pilkington } 2100b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2101b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 2102b0386a51SErik Pilkington { 2103b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2104b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 2105b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 2106b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 2107b0386a51SErik Pilkington } 2108b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2109b0386a51SErik Pilkington node_type extract(key_type const& __key) 2110b0386a51SErik Pilkington { 2111b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 2112b0386a51SErik Pilkington } 2113b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2114b0386a51SErik Pilkington node_type extract(const_iterator __it) 2115b0386a51SErik Pilkington { 2116b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 2117b0386a51SErik Pilkington __it.__i_); 2118b0386a51SErik Pilkington } 21195c4e07aeSErik Pilkington 21205c4e07aeSErik Pilkington template <class _H2, class _P2> 21215c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21225c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 21235c4e07aeSErik Pilkington { 21245c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21255c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21265c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21275c4e07aeSErik Pilkington } 21285c4e07aeSErik Pilkington template <class _H2, class _P2> 21295c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21305c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 21315c4e07aeSErik Pilkington { 21325c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21335c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21345c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21355c4e07aeSErik Pilkington } 21365c4e07aeSErik Pilkington template <class _H2, class _P2> 21375c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21385c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 21395c4e07aeSErik Pilkington { 21405c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21415c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21425c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21435c4e07aeSErik Pilkington } 21445c4e07aeSErik Pilkington template <class _H2, class _P2> 21455c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21465c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 21475c4e07aeSErik Pilkington { 21485c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21495c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21505c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21515c4e07aeSErik Pilkington } 2152b0386a51SErik Pilkington#endif 2153b0386a51SErik Pilkington 2154789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21553714107eSHoward Hinnant void swap(unordered_multimap& __u) 21563714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 21573714107eSHoward Hinnant {__table_.swap(__u.__table_);} 21583e519524SHoward Hinnant 2159789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21603e519524SHoward Hinnant hasher hash_function() const 21613e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 2162789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21633e519524SHoward Hinnant key_equal key_eq() const 21643e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 21653e519524SHoward Hinnant 2166789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21673e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 2168789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21693e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 2170e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 2171e5ec94a1SRuslan Arutyunyan template <typename _K2> 2172e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2173*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, iterator> 2174e5ec94a1SRuslan Arutyunyan find(const _K2& __k) {return __table_.find(__k);} 2175e5ec94a1SRuslan Arutyunyan template <typename _K2> 2176e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2177*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, const_iterator> 2178e5ec94a1SRuslan Arutyunyan find(const _K2& __k) const {return __table_.find(__k);} 2179e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 2180789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21813e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 2182a17b1aedSZoe Carver #if _LIBCPP_STD_VER > 17 2183e5ec94a1SRuslan Arutyunyan template <typename _K2> 2184e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2185*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, size_type> 2186e5ec94a1SRuslan Arutyunyan count(const _K2& __k) const {return __table_.__count_multi(__k);} 2187e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 2188e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 2189a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 2190a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 2191e5ec94a1SRuslan Arutyunyan 2192e5ec94a1SRuslan Arutyunyan template <typename _K2> 2193e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2194*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, bool> 2195e5ec94a1SRuslan Arutyunyan contains(const _K2& __k) const {return find(__k) != end();} 2196a17b1aedSZoe Carver #endif // _LIBCPP_STD_VER > 17 2197789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21983e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 21993e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 2200789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22013e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 22023e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 2203e5ec94a1SRuslan Arutyunyan #if _LIBCPP_STD_VER > 17 2204e5ec94a1SRuslan Arutyunyan template <typename _K2> 2205e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2206*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<iterator, iterator>> 2207e5ec94a1SRuslan Arutyunyan equal_range(const _K2& __k) {return __table_.__equal_range_multi(__k);} 2208e5ec94a1SRuslan Arutyunyan template <typename _K2> 2209e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2210*4e0ea2cfSLouis Dionne enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value, pair<const_iterator, const_iterator>> 2211e5ec94a1SRuslan Arutyunyan equal_range(const _K2& __k) const {return __table_.__equal_range_multi(__k);} 2212e5ec94a1SRuslan Arutyunyan #endif // _LIBCPP_STD_VER > 17 22133e519524SHoward Hinnant 2214789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22153714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 2216789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22173714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT 22183714107eSHoward Hinnant {return __table_.max_bucket_count();} 22193e519524SHoward Hinnant 2220789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22213e519524SHoward Hinnant size_type bucket_size(size_type __n) const 22223e519524SHoward Hinnant {return __table_.bucket_size(__n);} 2223789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22243e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 22253e519524SHoward Hinnant 2226789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22273e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 2228789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22293e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 2230789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22313e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 2232789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22333e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 2234789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22353e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 2236789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22373e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 22383e519524SHoward Hinnant 2239789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22403714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 2241789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22423714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 2243789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22443e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 2245789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22463e519524SHoward Hinnant void rehash(size_type __n) {__table_.rehash(__n);} 2247789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22483e519524SHoward Hinnant void reserve(size_type __n) {__table_.reserve(__n);} 22493e519524SHoward Hinnant 225031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2251b24c8024SHoward Hinnant 2252b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 2253b24c8024SHoward Hinnant {return __table_.__dereferenceable(&__i->__i_);} 2254b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 2255b24c8024SHoward Hinnant {return __table_.__decrementable(&__i->__i_);} 2256b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 2257b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 2258b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 2259b24c8024SHoward Hinnant {return __table_.__addable(&__i->__i_, __n);} 2260b24c8024SHoward Hinnant 226131e82037SLouis Dionne#endif // _LIBCPP_DEBUG_LEVEL == 2 2262b24c8024SHoward Hinnant 2263fcd02211SEric Fiselier 22643e519524SHoward Hinnant}; 22653e519524SHoward Hinnant 226601666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 2267dfcd4384SLouis Dionnetemplate<class _InputIterator, 2268dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 2269dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 2270dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 2271*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 2272*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 2273*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 2274*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2275dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 2276dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2277dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 2278dfcd4384SLouis Dionne 2279dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 2280dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 2281dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 2282*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 2283*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 2284*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 2285*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2286dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 2287dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2288dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 2289dfcd4384SLouis Dionne 2290dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 2291*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2292dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 2293dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2294dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2295dfcd4384SLouis Dionne 2296dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 2297*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2298dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator) 2299dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2300dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2301dfcd4384SLouis Dionne 2302dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 2303*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 2304*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 2305*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2306dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2307dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2308dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2309dfcd4384SLouis Dionne 2310dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 2311*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2312dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 2313dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2314dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2315dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2316dfcd4384SLouis Dionne 2317dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 2318*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2319dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2320dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2321dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2322dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2323dfcd4384SLouis Dionne 2324dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 2325*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 2326*4e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 2327*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2328dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2329dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, 2330dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2331dfcd4384SLouis Dionne#endif 2332dfcd4384SLouis Dionne 23333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23353e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 23363e519524SHoward Hinnant : __table_(__hf, __eql) 23373e519524SHoward Hinnant{ 233831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2339b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2340b24c8024SHoward Hinnant#endif 23413e519524SHoward Hinnant __table_.rehash(__n); 23423e519524SHoward Hinnant} 23433e519524SHoward Hinnant 23443e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23453e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23463e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 23473e519524SHoward Hinnant const allocator_type& __a) 23482a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 23493e519524SHoward Hinnant{ 235031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2351b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2352b24c8024SHoward Hinnant#endif 23533e519524SHoward Hinnant __table_.rehash(__n); 23543e519524SHoward Hinnant} 23553e519524SHoward Hinnant 23563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23573e519524SHoward Hinnanttemplate <class _InputIterator> 23583e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23593e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 23603e519524SHoward Hinnant{ 236131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2362b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2363b24c8024SHoward Hinnant#endif 23643e519524SHoward Hinnant insert(__first, __last); 23653e519524SHoward Hinnant} 23663e519524SHoward Hinnant 23673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23683e519524SHoward Hinnanttemplate <class _InputIterator> 23693e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23703e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 23713e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 23723e519524SHoward Hinnant : __table_(__hf, __eql) 23733e519524SHoward Hinnant{ 237431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2375b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2376b24c8024SHoward Hinnant#endif 23773e519524SHoward Hinnant __table_.rehash(__n); 23783e519524SHoward Hinnant insert(__first, __last); 23793e519524SHoward Hinnant} 23803e519524SHoward Hinnant 23813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23823e519524SHoward Hinnanttemplate <class _InputIterator> 23833e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23843e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 23853e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 23862a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 23873e519524SHoward Hinnant{ 238831e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2389b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2390b24c8024SHoward Hinnant#endif 23913e519524SHoward Hinnant __table_.rehash(__n); 23923e519524SHoward Hinnant insert(__first, __last); 23933e519524SHoward Hinnant} 23943e519524SHoward Hinnant 23953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2396cd31b434SEvgeniy Stepanovinline 23973e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23983e519524SHoward Hinnant const allocator_type& __a) 23992a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 24003e519524SHoward Hinnant{ 240131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2402b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2403b24c8024SHoward Hinnant#endif 24043e519524SHoward Hinnant} 24053e519524SHoward Hinnant 24063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24083e519524SHoward Hinnant const unordered_multimap& __u) 24093e519524SHoward Hinnant : __table_(__u.__table_) 24103e519524SHoward Hinnant{ 241131e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2412b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2413b24c8024SHoward Hinnant#endif 24143e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 24153e519524SHoward Hinnant insert(__u.begin(), __u.end()); 24163e519524SHoward Hinnant} 24173e519524SHoward Hinnant 24183e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24193e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24203e519524SHoward Hinnant const unordered_multimap& __u, const allocator_type& __a) 24212a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 24223e519524SHoward Hinnant{ 242331e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2424b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2425b24c8024SHoward Hinnant#endif 24263e519524SHoward Hinnant __table_.rehash(__u.bucket_count()); 24273e519524SHoward Hinnant insert(__u.begin(), __u.end()); 24283e519524SHoward Hinnant} 24293e519524SHoward Hinnant 24306a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 24313e519524SHoward Hinnant 24323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2433cd31b434SEvgeniy Stepanovinline 24343e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24353e519524SHoward Hinnant unordered_multimap&& __u) 24363714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 2437ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 24383e519524SHoward Hinnant{ 243931e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2440b24c8024SHoward Hinnant __get_db()->__insert_c(this); 24414c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 2442b24c8024SHoward Hinnant#endif 24433e519524SHoward Hinnant} 24443e519524SHoward Hinnant 24453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24463e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24473e519524SHoward Hinnant unordered_multimap&& __u, const allocator_type& __a) 24482a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 24493e519524SHoward Hinnant{ 245031e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2451b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2452b24c8024SHoward Hinnant#endif 24533e519524SHoward Hinnant if (__a != __u.get_allocator()) 24543e519524SHoward Hinnant { 24553e519524SHoward Hinnant iterator __i = __u.begin(); 24563e519524SHoward Hinnant while (__u.size() != 0) 24573e519524SHoward Hinnant { 24583e519524SHoward Hinnant __table_.__insert_multi( 2459f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 24603e519524SHoward Hinnant } 24613e519524SHoward Hinnant } 246231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 24634c80bfbdSHoward Hinnant else 24644c80bfbdSHoward Hinnant __get_db()->swap(this, &__u); 24654c80bfbdSHoward Hinnant#endif 24663e519524SHoward Hinnant} 24673e519524SHoward Hinnant 24683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24693e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24703e519524SHoward Hinnant initializer_list<value_type> __il) 24713e519524SHoward Hinnant{ 247231e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2473b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2474b24c8024SHoward Hinnant#endif 24753e519524SHoward Hinnant insert(__il.begin(), __il.end()); 24763e519524SHoward Hinnant} 24773e519524SHoward Hinnant 24783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24793e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24803e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 24813e519524SHoward Hinnant const key_equal& __eql) 24823e519524SHoward Hinnant : __table_(__hf, __eql) 24833e519524SHoward Hinnant{ 248431e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2485b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2486b24c8024SHoward Hinnant#endif 24873e519524SHoward Hinnant __table_.rehash(__n); 24883e519524SHoward Hinnant insert(__il.begin(), __il.end()); 24893e519524SHoward Hinnant} 24903e519524SHoward Hinnant 24913e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24923e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24933e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 24943e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 24952a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 24963e519524SHoward Hinnant{ 249731e82037SLouis Dionne#if _LIBCPP_DEBUG_LEVEL == 2 2498b24c8024SHoward Hinnant __get_db()->__insert_c(this); 2499b24c8024SHoward Hinnant#endif 25003e519524SHoward Hinnant __table_.rehash(__n); 25013e519524SHoward Hinnant insert(__il.begin(), __il.end()); 25023e519524SHoward Hinnant} 25033e519524SHoward Hinnant 25043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2505cd31b434SEvgeniy Stepanovinline 25063e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 25073e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u) 25083714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 25093e519524SHoward Hinnant{ 2510ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 25113e519524SHoward Hinnant return *this; 25123e519524SHoward Hinnant} 25133e519524SHoward Hinnant 25143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2515cd31b434SEvgeniy Stepanovinline 25163e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 25173e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 25183e519524SHoward Hinnant initializer_list<value_type> __il) 25193e519524SHoward Hinnant{ 25203e519524SHoward Hinnant __table_.__assign_multi(__il.begin(), __il.end()); 25213e519524SHoward Hinnant return *this; 25223e519524SHoward Hinnant} 25233e519524SHoward Hinnant 25246a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 252554976f26SHoward Hinnant 25263e519524SHoward Hinnant 25273e519524SHoward Hinnant 25283e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25293e519524SHoward Hinnanttemplate <class _InputIterator> 2530cd31b434SEvgeniy Stepanovinline 25313e519524SHoward Hinnantvoid 25323e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 25333e519524SHoward Hinnant _InputIterator __last) 25343e519524SHoward Hinnant{ 25353e519524SHoward Hinnant for (; __first != __last; ++__first) 25363e519524SHoward Hinnant __table_.__insert_multi(*__first); 25373e519524SHoward Hinnant} 25383e519524SHoward Hinnant 25393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2540789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 25413e519524SHoward Hinnantvoid 25423e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 25433e519524SHoward Hinnant unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 25443714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 25453e519524SHoward Hinnant{ 25463e519524SHoward Hinnant __x.swap(__y); 25473e519524SHoward Hinnant} 25483e519524SHoward Hinnant 2549f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 25503e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 25513e895085SMarek Kurdej class _Predicate> 2552f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 25533e895085SMarek Kurdej typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type 25543e895085SMarek Kurdej erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, 25553e895085SMarek Kurdej _Predicate __pred) { 25562ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 25573e895085SMarek Kurdej} 2558f60c63c0SMarshall Clow#endif 2559f60c63c0SMarshall Clow 25603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25613e519524SHoward Hinnantbool 25623e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 25633e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 25643e519524SHoward Hinnant{ 25653e519524SHoward Hinnant if (__x.size() != __y.size()) 25663e519524SHoward Hinnant return false; 25673e519524SHoward Hinnant typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 25683e519524SHoward Hinnant const_iterator; 25693e519524SHoward Hinnant typedef pair<const_iterator, const_iterator> _EqRng; 25703e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 25713e519524SHoward Hinnant { 25723e519524SHoward Hinnant _EqRng __xeq = __x.equal_range(__i->first); 25733e519524SHoward Hinnant _EqRng __yeq = __y.equal_range(__i->first); 2574ce48a113SHoward Hinnant if (_VSTD::distance(__xeq.first, __xeq.second) != 2575ce48a113SHoward Hinnant _VSTD::distance(__yeq.first, __yeq.second) || 2576ce48a113SHoward Hinnant !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 25773e519524SHoward Hinnant return false; 25783e519524SHoward Hinnant __i = __xeq.second; 25793e519524SHoward Hinnant } 25803e519524SHoward Hinnant return true; 25813e519524SHoward Hinnant} 25823e519524SHoward Hinnant 25833e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2584789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 25853e519524SHoward Hinnantbool 25863e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 25873e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 25883e519524SHoward Hinnant{ 25893e519524SHoward Hinnant return !(__x == __y); 25903e519524SHoward Hinnant} 25913e519524SHoward Hinnant 25923e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 25933e519524SHoward Hinnant 25943e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_MAP 2595