13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 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 21968072a71SKonstantin Varlamovtemplate<class InputIterator, 22068072a71SKonstantin Varlamov class Hash = hash<iter_key_t<InputIterator>>, class Pred = equal_to<iter_key_t<InputIterator>>, 22168072a71SKonstantin Varlamov class Allocator = allocator<iter_to_alloc_t<InputIterator>>> 22268072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type = see below, 22368072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 22468072a71SKonstantin Varlamov -> unordered_map<iter_key_t<InputIterator>, iter_value_t<InputIterator>, Hash, Pred, 22568072a71SKonstantin Varlamov Allocator>; // C++17 22668072a71SKonstantin Varlamov 22768072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash = hash<Key>, 22868072a71SKonstantin Varlamov class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>> 22968072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type = see below, 23068072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 23168072a71SKonstantin Varlamov -> unordered_map<Key, T, Hash, Pred, Allocator>; // C++17 23268072a71SKonstantin Varlamov 23368072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 23468072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type, Allocator) 23568072a71SKonstantin Varlamov -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, 23668072a71SKonstantin Varlamov hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 23768072a71SKonstantin Varlamov 23868072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 23968072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, Allocator) 24068072a71SKonstantin Varlamov -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, 24168072a71SKonstantin Varlamov hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 24268072a71SKonstantin Varlamov 24368072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator> 24468072a71SKonstantin Varlamovunordered_map(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator) 24568072a71SKonstantin Varlamov -> unordered_map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Hash, 24668072a71SKonstantin Varlamov equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 24768072a71SKonstantin Varlamov 24868072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator> 24968072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type, Allocator) 25068072a71SKonstantin Varlamov -> unordered_map<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17 25168072a71SKonstantin Varlamov 25268072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator> 25368072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, Allocator) 25468072a71SKonstantin Varlamov -> unordered_map<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17 25568072a71SKonstantin Varlamov 25668072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash, class Allocator> 25768072a71SKonstantin Varlamovunordered_map(initializer_list<pair<const Key, T>>, typename see below::size_type, Hash, Allocator) 25868072a71SKonstantin Varlamov -> unordered_map<Key, T, Hash, equal_to<Key>, Allocator>; // C++17 25968072a71SKonstantin Varlamov 2603e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2613e519524SHoward Hinnant void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, 2623714107eSHoward Hinnant unordered_map<Key, T, Hash, Pred, Alloc>& y) 2633714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 2643e519524SHoward Hinnant 2653e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2663e519524SHoward Hinnant bool 2673e519524SHoward Hinnant operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2683e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2693e519524SHoward Hinnant 2703e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 2713e519524SHoward Hinnant bool 2723e519524SHoward Hinnant operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x, 2733e519524SHoward Hinnant const unordered_map<Key, T, Hash, Pred, Alloc>& y); 2743e519524SHoward Hinnant 2753e519524SHoward Hinnanttemplate <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, 2763e519524SHoward Hinnant class Alloc = allocator<pair<const Key, T>>> 2773e519524SHoward Hinnantclass unordered_multimap 2783e519524SHoward Hinnant{ 2793e519524SHoward Hinnantpublic: 2803e519524SHoward Hinnant // types 2813e519524SHoward Hinnant typedef Key key_type; 2823e519524SHoward Hinnant typedef T mapped_type; 2833e519524SHoward Hinnant typedef Hash hasher; 2843e519524SHoward Hinnant typedef Pred key_equal; 2853e519524SHoward Hinnant typedef Alloc allocator_type; 2863e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 2873e519524SHoward Hinnant typedef value_type& reference; 2883e519524SHoward Hinnant typedef const value_type& const_reference; 2893e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::pointer pointer; 2903e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; 2913e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::size_type size_type; 2923e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::difference_type difference_type; 2933e519524SHoward Hinnant 2943e519524SHoward Hinnant typedef /unspecified/ iterator; 2953e519524SHoward Hinnant typedef /unspecified/ const_iterator; 2963e519524SHoward Hinnant typedef /unspecified/ local_iterator; 2973e519524SHoward Hinnant typedef /unspecified/ const_local_iterator; 2983e519524SHoward Hinnant 299b0386a51SErik Pilkington typedef unspecified node_type; // C++17 300b0386a51SErik Pilkington 3013714107eSHoward Hinnant unordered_multimap() 3023714107eSHoward Hinnant noexcept( 3033714107eSHoward Hinnant is_nothrow_default_constructible<hasher>::value && 3043714107eSHoward Hinnant is_nothrow_default_constructible<key_equal>::value && 3053714107eSHoward Hinnant is_nothrow_default_constructible<allocator_type>::value); 3063714107eSHoward Hinnant explicit unordered_multimap(size_type n, const hasher& hf = hasher(), 3073e519524SHoward Hinnant const key_equal& eql = key_equal(), 3083e519524SHoward Hinnant const allocator_type& a = allocator_type()); 3093e519524SHoward Hinnant template <class InputIterator> 3103e519524SHoward Hinnant unordered_multimap(InputIterator f, InputIterator l, 3113e519524SHoward Hinnant size_type n = 0, const hasher& hf = hasher(), 3123e519524SHoward Hinnant const key_equal& eql = key_equal(), 3133e519524SHoward Hinnant const allocator_type& a = allocator_type()); 3143e519524SHoward Hinnant explicit unordered_multimap(const allocator_type&); 3153e519524SHoward Hinnant unordered_multimap(const unordered_multimap&); 3163e519524SHoward Hinnant unordered_multimap(const unordered_multimap&, const Allocator&); 3173714107eSHoward Hinnant unordered_multimap(unordered_multimap&&) 3183714107eSHoward Hinnant noexcept( 3193714107eSHoward Hinnant is_nothrow_move_constructible<hasher>::value && 3203714107eSHoward Hinnant is_nothrow_move_constructible<key_equal>::value && 3213714107eSHoward Hinnant is_nothrow_move_constructible<allocator_type>::value); 3223e519524SHoward Hinnant unordered_multimap(unordered_multimap&&, const Allocator&); 3233e519524SHoward Hinnant unordered_multimap(initializer_list<value_type>, size_type n = 0, 3243e519524SHoward Hinnant const hasher& hf = hasher(), const key_equal& eql = key_equal(), 3253e519524SHoward Hinnant const allocator_type& a = allocator_type()); 3263cd37e64SMarshall Clow unordered_multimap(size_type n, const allocator_type& a) 3273cd37e64SMarshall Clow : unordered_multimap(n, hasher(), key_equal(), a) {} // C++14 3283cd37e64SMarshall Clow unordered_multimap(size_type n, const hasher& hf, const allocator_type& a) 3293cd37e64SMarshall Clow : unordered_multimap(n, hf, key_equal(), a) {} // C++14 3303cd37e64SMarshall Clow template <class InputIterator> 3313cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a) 3323cd37e64SMarshall Clow : unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14 3333cd37e64SMarshall Clow template <class InputIterator> 3343cd37e64SMarshall Clow unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, 3353cd37e64SMarshall Clow const allocator_type& a) 3363cd37e64SMarshall Clow : unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14 3373cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a) 3383cd37e64SMarshall Clow : unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14 3393cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, 3403cd37e64SMarshall Clow const allocator_type& a) 3413cd37e64SMarshall Clow : unordered_multimap(il, n, hf, key_equal(), a) {} // C++14 3423e519524SHoward Hinnant ~unordered_multimap(); 3433e519524SHoward Hinnant unordered_multimap& operator=(const unordered_multimap&); 3443714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&&) 3453714107eSHoward Hinnant noexcept( 3463714107eSHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3473714107eSHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3483714107eSHoward Hinnant is_nothrow_move_assignable<hasher>::value && 3493714107eSHoward Hinnant is_nothrow_move_assignable<key_equal>::value); 3503e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type>); 3513e519524SHoward Hinnant 3523714107eSHoward Hinnant allocator_type get_allocator() const noexcept; 3533e519524SHoward Hinnant 3543714107eSHoward Hinnant bool empty() const noexcept; 3553714107eSHoward Hinnant size_type size() const noexcept; 3563714107eSHoward Hinnant size_type max_size() const noexcept; 3573e519524SHoward Hinnant 3583714107eSHoward Hinnant iterator begin() noexcept; 3593714107eSHoward Hinnant iterator end() noexcept; 3603714107eSHoward Hinnant const_iterator begin() const noexcept; 3613714107eSHoward Hinnant const_iterator end() const noexcept; 3623714107eSHoward Hinnant const_iterator cbegin() const noexcept; 3633714107eSHoward Hinnant const_iterator cend() const noexcept; 3643e519524SHoward Hinnant 3653e519524SHoward Hinnant template <class... Args> 3663e519524SHoward Hinnant iterator emplace(Args&&... args); 3673e519524SHoward Hinnant template <class... Args> 3683e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3693e519524SHoward Hinnant iterator insert(const value_type& obj); 3703e519524SHoward Hinnant template <class P> 3713e519524SHoward Hinnant iterator insert(P&& obj); 3723e519524SHoward Hinnant iterator insert(const_iterator hint, const value_type& obj); 3733e519524SHoward Hinnant template <class P> 3743e519524SHoward Hinnant iterator insert(const_iterator hint, P&& obj); 3753e519524SHoward Hinnant template <class InputIterator> 3763e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3773e519524SHoward Hinnant void insert(initializer_list<value_type>); 3783e519524SHoward Hinnant 379b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 380b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 381b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 382b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 383b0386a51SErik Pilkington 3843e519524SHoward Hinnant iterator erase(const_iterator position); 385ec392968SMarshall Clow iterator erase(iterator position); // C++14 3863e519524SHoward Hinnant size_type erase(const key_type& k); 3873e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3883714107eSHoward Hinnant void clear() noexcept; 3893e519524SHoward Hinnant 3905c4e07aeSErik Pilkington template<class H2, class P2> 3915c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>& source); // C++17 3925c4e07aeSErik Pilkington template<class H2, class P2> 3935c4e07aeSErik Pilkington void merge(unordered_multimap<Key, T, H2, P2, Allocator>&& source); // C++17 3945c4e07aeSErik Pilkington template<class H2, class P2> 3955c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>& source); // C++17 3965c4e07aeSErik Pilkington template<class H2, class P2> 3975c4e07aeSErik Pilkington void merge(unordered_map<Key, T, H2, P2, Allocator>&& source); // C++17 3985c4e07aeSErik Pilkington 3993714107eSHoward Hinnant void swap(unordered_multimap&) 4003714107eSHoward Hinnant noexcept( 4013714107eSHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 4023714107eSHoward Hinnant __is_nothrow_swappable<allocator_type>::value) && 4033714107eSHoward Hinnant __is_nothrow_swappable<hasher>::value && 4043714107eSHoward Hinnant __is_nothrow_swappable<key_equal>::value); 4053e519524SHoward Hinnant 4063e519524SHoward Hinnant hasher hash_function() const; 4073e519524SHoward Hinnant key_equal key_eq() const; 4083e519524SHoward Hinnant 4093e519524SHoward Hinnant iterator find(const key_type& k); 4103e519524SHoward Hinnant const_iterator find(const key_type& k) const; 411e5ec94a1SRuslan Arutyunyan template<typename K> 412e5ec94a1SRuslan Arutyunyan iterator find(const K& x); // C++20 413e5ec94a1SRuslan Arutyunyan template<typename K> 414e5ec94a1SRuslan Arutyunyan const_iterator find(const K& x) const; // C++20 4153e519524SHoward Hinnant size_type count(const key_type& k) const; 416e5ec94a1SRuslan Arutyunyan template<typename K> 417e5ec94a1SRuslan Arutyunyan size_type count(const K& k) const; // C++20 418a17b1aedSZoe Carver bool contains(const key_type& k) const; // C++20 419e5ec94a1SRuslan Arutyunyan template<typename K> 420e5ec94a1SRuslan Arutyunyan bool contains(const K& k) const; // C++20 4213e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& k); 4223e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& k) const; 423e5ec94a1SRuslan Arutyunyan template<typename K> 424e5ec94a1SRuslan Arutyunyan pair<iterator, iterator> equal_range(const K& k); // C++20 425e5ec94a1SRuslan Arutyunyan template<typename K> 426e5ec94a1SRuslan Arutyunyan pair<const_iterator, const_iterator> equal_range(const K& k) const; // C++20 4273e519524SHoward Hinnant 4283714107eSHoward Hinnant size_type bucket_count() const noexcept; 4293714107eSHoward Hinnant size_type max_bucket_count() const noexcept; 4303e519524SHoward Hinnant 4313e519524SHoward Hinnant size_type bucket_size(size_type n) const; 4323e519524SHoward Hinnant size_type bucket(const key_type& k) const; 4333e519524SHoward Hinnant 4343e519524SHoward Hinnant local_iterator begin(size_type n); 4353e519524SHoward Hinnant local_iterator end(size_type n); 4363e519524SHoward Hinnant const_local_iterator begin(size_type n) const; 4373e519524SHoward Hinnant const_local_iterator end(size_type n) const; 4383e519524SHoward Hinnant const_local_iterator cbegin(size_type n) const; 4393e519524SHoward Hinnant const_local_iterator cend(size_type n) const; 4403e519524SHoward Hinnant 4413714107eSHoward Hinnant float load_factor() const noexcept; 4423714107eSHoward Hinnant float max_load_factor() const noexcept; 4433e519524SHoward Hinnant void max_load_factor(float z); 4443e519524SHoward Hinnant void rehash(size_type n); 4453e519524SHoward Hinnant void reserve(size_type n); 4463e519524SHoward Hinnant}; 4473e519524SHoward Hinnant 44868072a71SKonstantin Varlamovtemplate<class InputIterator, 44968072a71SKonstantin Varlamov class Hash = hash<iter_key_t<InputIterator>>, class Pred = equal_to<iter_key_t<InputIterator>>, 45068072a71SKonstantin Varlamov class Allocator = allocator<iter_to_alloc_t<InputIterator>>> 45168072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type = see below, 45268072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 45368072a71SKonstantin Varlamov -> unordered_multimap<iter_key_t<InputIterator>, iter_value_t<InputIterator>, Hash, Pred, 45468072a71SKonstantin Varlamov Allocator>; // C++17 45568072a71SKonstantin Varlamov 45668072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash = hash<Key>, 45768072a71SKonstantin Varlamov class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>> 45868072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type = see below, 45968072a71SKonstantin Varlamov Hash = Hash(), Pred = Pred(), Allocator = Allocator()) 46068072a71SKonstantin Varlamov -> unordered_multimap<Key, T, Hash, Pred, Allocator>; // C++17 46168072a71SKonstantin Varlamov 46268072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 46368072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type, Allocator) 46468072a71SKonstantin Varlamov -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, 46568072a71SKonstantin Varlamov hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 46668072a71SKonstantin Varlamov 46768072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator> 46868072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, Allocator) 46968072a71SKonstantin Varlamov -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, 47068072a71SKonstantin Varlamov hash<iter_key_t<InputIterator>>, equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 47168072a71SKonstantin Varlamov 47268072a71SKonstantin Varlamovtemplate<class InputIterator, class Hash, class Allocator> 47368072a71SKonstantin Varlamovunordered_multimap(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator) 47468072a71SKonstantin Varlamov -> unordered_multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Hash, 47568072a71SKonstantin Varlamov equal_to<iter_key_t<InputIterator>>, Allocator>; // C++17 47668072a71SKonstantin Varlamov 47768072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator> 47868072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type, Allocator) 47968072a71SKonstantin Varlamov -> unordered_multimap<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17 48068072a71SKonstantin Varlamov 48168072a71SKonstantin Varlamovtemplate<class Key, class T, typename Allocator> 48268072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, Allocator) 48368072a71SKonstantin Varlamov -> unordered_multimap<Key, T, hash<Key>, equal_to<Key>, Allocator>; // C++17 48468072a71SKonstantin Varlamov 48568072a71SKonstantin Varlamovtemplate<class Key, class T, class Hash, class Allocator> 48668072a71SKonstantin Varlamovunordered_multimap(initializer_list<pair<const Key, T>>, typename see below::size_type, Hash, 48768072a71SKonstantin Varlamov Allocator) 48868072a71SKonstantin Varlamov -> unordered_multimap<Key, T, Hash, equal_to<Key>, Allocator>; // C++17 48968072a71SKonstantin Varlamov 4903e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 4913e519524SHoward Hinnant void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 4923714107eSHoward Hinnant unordered_multimap<Key, T, Hash, Pred, Alloc>& y) 4933714107eSHoward Hinnant noexcept(noexcept(x.swap(y))); 4943e519524SHoward Hinnant 495f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 4963e895085SMarek Kurdej typename unordered_map<K, T, H, P, A>::size_type 4973e895085SMarek Kurdej erase_if(unordered_map<K, T, H, P, A>& c, Predicate pred); // C++20 498f60c63c0SMarshall Clow 499f60c63c0SMarshall Clowtemplate <class K, class T, class H, class P, class A, class Predicate> 5003e895085SMarek Kurdej typename unordered_multimap<K, T, H, P, A>::size_type 5013e895085SMarek Kurdej erase_if(unordered_multimap<K, T, H, P, A>& c, Predicate pred); // C++20 502f60c63c0SMarshall Clow 5033e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 5043e519524SHoward Hinnant bool 5053e519524SHoward Hinnant operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 5063e519524SHoward Hinnant const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 5073e519524SHoward Hinnant 5083e519524SHoward Hinnanttemplate <class Key, class T, class Hash, class Pred, class Alloc> 5093e519524SHoward Hinnant bool 5103e519524SHoward Hinnant operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, 5113e519524SHoward Hinnant const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); 5123e519524SHoward Hinnant 5133e519524SHoward Hinnant} // std 5143e519524SHoward Hinnant 5153e519524SHoward Hinnant*/ 5163e519524SHoward Hinnant 5172e2f3158SNikolas Klauser#include <__algorithm/is_permutation.h> 518385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 5193e519524SHoward Hinnant#include <__config> 520bfbd73f8SArthur O'Dwyer#include <__debug> 521050b064fSChristopher Di Bella#include <__functional/is_transparent.h> 52234f73804SNikolas Klauser#include <__functional/operations.h> 5233e519524SHoward Hinnant#include <__hash_table> 5243cd4531bSNikolas Klauser#include <__iterator/distance.h> 5253cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h> 5264d81a46fSArthur O'Dwyer#include <__iterator/iterator_traits.h> 527d6e2c95dSMark de Wever#include <__memory/addressof.h> 528b0386a51SErik Pilkington#include <__node_handle> 5296adbc83eSChristopher Di Bella#include <__utility/forward.h> 5303e519524SHoward Hinnant#include <stdexcept> 5310f905677SEric Fiselier#include <tuple> 532f56972e2SMarshall Clow#include <version> 5333e519524SHoward Hinnant 534de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 535de4a57cbSLouis Dionne# include <algorithm> 536de4a57cbSLouis Dionne# include <bit> 537de4a57cbSLouis Dionne# include <iterator> 538de4a57cbSLouis Dionne#endif 539de4a57cbSLouis Dionne 540db1978b6SNikolas Klauser// standard-mandated includes 541db1978b6SNikolas Klauser 542db1978b6SNikolas Klauser// [iterator.range] 543db1978b6SNikolas Klauser#include <__iterator/access.h> 544db1978b6SNikolas Klauser#include <__iterator/data.h> 545db1978b6SNikolas Klauser#include <__iterator/empty.h> 546db1978b6SNikolas Klauser#include <__iterator/reverse_access.h> 547db1978b6SNikolas Klauser#include <__iterator/size.h> 548db1978b6SNikolas Klauser 549db1978b6SNikolas Klauser// [unord.map.syn] 550db1978b6SNikolas Klauser#include <compare> 551db1978b6SNikolas Klauser#include <initializer_list> 552db1978b6SNikolas Klauser 553073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 5543e519524SHoward Hinnant# pragma GCC system_header 555073458b1SHoward Hinnant#endif 5563e519524SHoward Hinnant 5573e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 5583e519524SHoward Hinnant 559e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, 5603560fbf3SLouis Dionne bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value> 5613e519524SHoward Hinnantclass __unordered_map_hasher 5623e519524SHoward Hinnant : private _Hash 5633e519524SHoward Hinnant{ 5643e519524SHoward Hinnantpublic: 565789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5663714107eSHoward Hinnant __unordered_map_hasher() 5673714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 5683714107eSHoward Hinnant : _Hash() {} 569789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5703714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 5713714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 5723714107eSHoward Hinnant : _Hash(__h) {} 573789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5743714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return *this;} 575789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 576a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 577f52318b4SErik Pilkington {return static_cast<const _Hash&>(*this)(__x.__get_value().first);} 578a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 579a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 5803e519524SHoward Hinnant {return static_cast<const _Hash&>(*this)(__x);} 581e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 582d5db71d1SArthur O'Dwyer template <typename _K2> 583e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 584e5ec94a1SRuslan Arutyunyan size_t operator()(const _K2& __x) const 585e5ec94a1SRuslan Arutyunyan {return static_cast<const _Hash&>(*this)(__x);} 586e5ec94a1SRuslan Arutyunyan#endif 587d5db71d1SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY 588e3fbe143SMarshall Clow void swap(__unordered_map_hasher& __y) 589e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 590e3fbe143SMarshall Clow { 591e3fbe143SMarshall Clow using _VSTD::swap; 592b3f57425SEric Fiselier swap(static_cast<_Hash&>(*this), static_cast<_Hash&>(__y)); 593e3fbe143SMarshall Clow } 5943e519524SHoward Hinnant}; 5953e519524SHoward Hinnant 596e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred> 597e5ec94a1SRuslan Arutyunyanclass __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, false> 5983e519524SHoward Hinnant{ 5993e519524SHoward Hinnant _Hash __hash_; 6003e519524SHoward Hinnantpublic: 601789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6023714107eSHoward Hinnant __unordered_map_hasher() 6033714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) 6043714107eSHoward Hinnant : __hash_() {} 605789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6063714107eSHoward Hinnant __unordered_map_hasher(const _Hash& __h) 6073714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) 6083714107eSHoward Hinnant : __hash_(__h) {} 609789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6103714107eSHoward Hinnant const _Hash& hash_function() const _NOEXCEPT {return __hash_;} 611789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 612a1a9e771SHoward Hinnant size_t operator()(const _Cp& __x) const 613f52318b4SErik Pilkington {return __hash_(__x.__get_value().first);} 614a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 615a1a9e771SHoward Hinnant size_t operator()(const _Key& __x) const 6163e519524SHoward Hinnant {return __hash_(__x);} 617e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 618d5db71d1SArthur O'Dwyer template <typename _K2> 619e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 620e5ec94a1SRuslan Arutyunyan size_t operator()(const _K2& __x) const 621e5ec94a1SRuslan Arutyunyan {return __hash_(__x);} 622e5ec94a1SRuslan Arutyunyan#endif 623d5db71d1SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY 624e3fbe143SMarshall Clow void swap(__unordered_map_hasher& __y) 625e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) 626e3fbe143SMarshall Clow { 627e3fbe143SMarshall Clow using _VSTD::swap; 628e3fbe143SMarshall Clow swap(__hash_, __y.__hash_); 629e3fbe143SMarshall Clow } 6303e519524SHoward Hinnant}; 6313e519524SHoward Hinnant 632e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Hash, class _Pred, bool __b> 633e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 634e3fbe143SMarshall Clowvoid 635e5ec94a1SRuslan Arutyunyanswap(__unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __x, 636e5ec94a1SRuslan Arutyunyan __unordered_map_hasher<_Key, _Cp, _Hash, _Pred, __b>& __y) 637e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 638e3fbe143SMarshall Clow{ 639e3fbe143SMarshall Clow __x.swap(__y); 640e3fbe143SMarshall Clow} 641e3fbe143SMarshall Clow 642e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, 6433560fbf3SLouis Dionne bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value> 6443e519524SHoward Hinnantclass __unordered_map_equal 6453e519524SHoward Hinnant : private _Pred 6463e519524SHoward Hinnant{ 6473e519524SHoward Hinnantpublic: 648789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6493714107eSHoward Hinnant __unordered_map_equal() 6503714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 6513714107eSHoward Hinnant : _Pred() {} 652789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6533714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 6543714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 6553714107eSHoward Hinnant : _Pred(__p) {} 656789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6573714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return *this;} 658789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 659a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 660f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y.__get_value().first);} 661a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 662a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 663f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);} 664a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 665a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 666f52318b4SErik Pilkington {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);} 667e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 668d5db71d1SArthur O'Dwyer template <typename _K2> 669e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 670e5ec94a1SRuslan Arutyunyan bool operator()(const _Cp& __x, const _K2& __y) const 671e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x.__get_value().first, __y);} 672d5db71d1SArthur O'Dwyer template <typename _K2> 673e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 674e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Cp& __y) const 675e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y.__get_value().first);} 676d5db71d1SArthur O'Dwyer template <typename _K2> 677e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 678e5ec94a1SRuslan Arutyunyan bool operator()(const _Key& __x, const _K2& __y) const 679e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y);} 680d5db71d1SArthur O'Dwyer template <typename _K2> 681e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 682e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Key& __y) const 683e5ec94a1SRuslan Arutyunyan {return static_cast<const _Pred&>(*this)(__x, __y);} 684e5ec94a1SRuslan Arutyunyan#endif 685d5db71d1SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY 686e3fbe143SMarshall Clow void swap(__unordered_map_equal& __y) 687e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 688e3fbe143SMarshall Clow { 689e3fbe143SMarshall Clow using _VSTD::swap; 690b3f57425SEric Fiselier swap(static_cast<_Pred&>(*this), static_cast<_Pred&>(__y)); 691e3fbe143SMarshall Clow } 6923e519524SHoward Hinnant}; 6933e519524SHoward Hinnant 694e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash> 695e5ec94a1SRuslan Arutyunyanclass __unordered_map_equal<_Key, _Cp, _Pred, _Hash, false> 6963e519524SHoward Hinnant{ 6973e519524SHoward Hinnant _Pred __pred_; 6983e519524SHoward Hinnantpublic: 699789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7003714107eSHoward Hinnant __unordered_map_equal() 7013714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) 7023714107eSHoward Hinnant : __pred_() {} 703789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7043714107eSHoward Hinnant __unordered_map_equal(const _Pred& __p) 7053714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) 7063714107eSHoward Hinnant : __pred_(__p) {} 707789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7083714107eSHoward Hinnant const _Pred& key_eq() const _NOEXCEPT {return __pred_;} 709789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 710a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Cp& __y) const 711f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y.__get_value().first);} 712a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 713a1a9e771SHoward Hinnant bool operator()(const _Cp& __x, const _Key& __y) const 714f52318b4SErik Pilkington {return __pred_(__x.__get_value().first, __y);} 715a1a9e771SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 716a1a9e771SHoward Hinnant bool operator()(const _Key& __x, const _Cp& __y) const 717f52318b4SErik Pilkington {return __pred_(__x, __y.__get_value().first);} 718e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 719d5db71d1SArthur O'Dwyer template <typename _K2> 720e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 721e5ec94a1SRuslan Arutyunyan bool operator()(const _Cp& __x, const _K2& __y) const 722e5ec94a1SRuslan Arutyunyan {return __pred_(__x.__get_value().first, __y);} 723d5db71d1SArthur O'Dwyer template <typename _K2> 724e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 725e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Cp& __y) const 726e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y.__get_value().first);} 727d5db71d1SArthur O'Dwyer template <typename _K2> 728e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 729e5ec94a1SRuslan Arutyunyan bool operator()(const _Key& __x, const _K2& __y) const 730e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y);} 731d5db71d1SArthur O'Dwyer template <typename _K2> 732e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 733e5ec94a1SRuslan Arutyunyan bool operator()(const _K2& __x, const _Key& __y) const 734e5ec94a1SRuslan Arutyunyan {return __pred_(__x, __y);} 735e5ec94a1SRuslan Arutyunyan#endif 736d5db71d1SArthur O'Dwyer _LIBCPP_INLINE_VISIBILITY 737e3fbe143SMarshall Clow void swap(__unordered_map_equal& __y) 738e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) 739e3fbe143SMarshall Clow { 740e3fbe143SMarshall Clow using _VSTD::swap; 741e3fbe143SMarshall Clow swap(__pred_, __y.__pred_); 742e3fbe143SMarshall Clow } 7433e519524SHoward Hinnant}; 7443e519524SHoward Hinnant 745e5ec94a1SRuslan Arutyunyantemplate <class _Key, class _Cp, class _Pred, class _Hash, bool __b> 746e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 747e3fbe143SMarshall Clowvoid 748e5ec94a1SRuslan Arutyunyanswap(__unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __x, 749e5ec94a1SRuslan Arutyunyan __unordered_map_equal<_Key, _Cp, _Pred, _Hash, __b>& __y) 750e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 751e3fbe143SMarshall Clow{ 752e3fbe143SMarshall Clow __x.swap(__y); 753e3fbe143SMarshall Clow} 754e3fbe143SMarshall Clow 7553e519524SHoward Hinnanttemplate <class _Alloc> 7563e519524SHoward Hinnantclass __hash_map_node_destructor 7573e519524SHoward Hinnant{ 7583e519524SHoward Hinnant typedef _Alloc allocator_type; 7593e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 76075d0dcfdSEric Fiselier 7613e519524SHoward Hinnantpublic: 76275d0dcfdSEric Fiselier 7633e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 7643e519524SHoward Hinnantprivate: 7653e519524SHoward Hinnant 7663e519524SHoward Hinnant allocator_type& __na_; 7673e519524SHoward Hinnant 7683e519524SHoward Hinnant __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); 7693e519524SHoward Hinnant 7703e519524SHoward Hinnantpublic: 7713e519524SHoward Hinnant bool __first_constructed; 7723e519524SHoward Hinnant bool __second_constructed; 7733e519524SHoward Hinnant 774789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7753714107eSHoward Hinnant explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT 7763e519524SHoward Hinnant : __na_(__na), 7773e519524SHoward Hinnant __first_constructed(false), 7783e519524SHoward Hinnant __second_constructed(false) 7793e519524SHoward Hinnant {} 7803e519524SHoward Hinnant 7816a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 782789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7833e519524SHoward Hinnant __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) 7843714107eSHoward Hinnant _NOEXCEPT 7853e519524SHoward Hinnant : __na_(__x.__na_), 7863e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 7873e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 7883e519524SHoward Hinnant { 7893e519524SHoward Hinnant __x.__value_constructed = false; 7903e519524SHoward Hinnant } 7916a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 792789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7933e519524SHoward Hinnant __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) 7943e519524SHoward Hinnant : __na_(__x.__na_), 7953e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 7963e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 7973e519524SHoward Hinnant { 7983e519524SHoward Hinnant const_cast<bool&>(__x.__value_constructed) = false; 7993e519524SHoward Hinnant } 8006a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 8013e519524SHoward Hinnant 802789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8033714107eSHoward Hinnant void operator()(pointer __p) _NOEXCEPT 8043e519524SHoward Hinnant { 8053e519524SHoward Hinnant if (__second_constructed) 806f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 8073e519524SHoward Hinnant if (__first_constructed) 808f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 8093e519524SHoward Hinnant if (__p) 8103e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 8113e519524SHoward Hinnant } 8123e519524SHoward Hinnant}; 8133e519524SHoward Hinnant 814fcd02211SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8159fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 8167c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __hash_value_type 8179fd9f84fSHoward Hinnant{ 8189fd9f84fSHoward Hinnant typedef _Key key_type; 8199fd9f84fSHoward Hinnant typedef _Tp mapped_type; 8209fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 821f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 822f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 8239fd9f84fSHoward Hinnant 824f52318b4SErik Pilkingtonprivate: 8259fd9f84fSHoward Hinnant value_type __cc; 826f52318b4SErik Pilkington 827f52318b4SErik Pilkingtonpublic: 828f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 829f52318b4SErik Pilkington value_type& __get_value() 830f52318b4SErik Pilkington { 831f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 832f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 833f52318b4SErik Pilkington#else 834f52318b4SErik Pilkington return __cc; 835f52318b4SErik Pilkington#endif 836f52318b4SErik Pilkington } 837f52318b4SErik Pilkington 838f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 839f52318b4SErik Pilkington const value_type& __get_value() const 840f52318b4SErik Pilkington { 841f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 842f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 843f52318b4SErik Pilkington#else 844f52318b4SErik Pilkington return __cc; 845f52318b4SErik Pilkington#endif 846f52318b4SErik Pilkington } 847f52318b4SErik Pilkington 848f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 849f52318b4SErik Pilkington __nc_ref_pair_type __ref() 850f52318b4SErik Pilkington { 851f52318b4SErik Pilkington value_type& __v = __get_value(); 852f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 853f52318b4SErik Pilkington } 854f52318b4SErik Pilkington 855f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 856f52318b4SErik Pilkington __nc_rref_pair_type __move() 857f52318b4SErik Pilkington { 858f52318b4SErik Pilkington value_type& __v = __get_value(); 859f52318b4SErik Pilkington return __nc_rref_pair_type( 860f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 861f52318b4SErik Pilkington _VSTD::move(__v.second)); 862f52318b4SErik Pilkington } 8639fd9f84fSHoward Hinnant 8649fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8659fd9f84fSHoward Hinnant __hash_value_type& operator=(const __hash_value_type& __v) 866f52318b4SErik Pilkington { 867f52318b4SErik Pilkington __ref() = __v.__get_value(); 868f52318b4SErik Pilkington return *this; 869f52318b4SErik Pilkington } 8709fd9f84fSHoward Hinnant 8719fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8729fd9f84fSHoward Hinnant __hash_value_type& operator=(__hash_value_type&& __v) 873f52318b4SErik Pilkington { 874f52318b4SErik Pilkington __ref() = __v.__move(); 875f52318b4SErik Pilkington return *this; 876f52318b4SErik Pilkington } 8779fd9f84fSHoward Hinnant 878fcd02211SEric Fiselier template <class _ValueTp, 8794887d047SNikolas Klauser class = __enable_if_t<__is_same_uncvref<_ValueTp, value_type>::value> 880fcd02211SEric Fiselier > 8819fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 882f52318b4SErik Pilkington __hash_value_type& operator=(_ValueTp&& __v) 883f52318b4SErik Pilkington { 884f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 885f52318b4SErik Pilkington return *this; 886fcd02211SEric Fiselier } 887fcd02211SEric Fiselier 888fcd02211SEric Fiselierprivate: 889fcd02211SEric Fiselier __hash_value_type(const __hash_value_type& __v) = delete; 890fcd02211SEric Fiselier __hash_value_type(__hash_value_type&& __v) = delete; 891fcd02211SEric Fiselier template <class ..._Args> 892fcd02211SEric Fiselier explicit __hash_value_type(_Args&& ...__args) = delete; 893fcd02211SEric Fiselier 894fcd02211SEric Fiselier ~__hash_value_type() = delete; 8959fd9f84fSHoward Hinnant}; 8969fd9f84fSHoward Hinnant 8979fd9f84fSHoward Hinnant#else 8989fd9f84fSHoward Hinnant 8999fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 9009fd9f84fSHoward Hinnantstruct __hash_value_type 9019fd9f84fSHoward Hinnant{ 9029fd9f84fSHoward Hinnant typedef _Key key_type; 9039fd9f84fSHoward Hinnant typedef _Tp mapped_type; 9049fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 9059fd9f84fSHoward Hinnant 906f52318b4SErik Pilkingtonprivate: 9079fd9f84fSHoward Hinnant value_type __cc; 9089fd9f84fSHoward Hinnant 909f52318b4SErik Pilkingtonpublic: 910f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 911f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 912f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 913f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 914f52318b4SErik Pilkington 915fcd02211SEric Fiselierprivate: 916fcd02211SEric Fiselier ~__hash_value_type(); 9179fd9f84fSHoward Hinnant}; 9189fd9f84fSHoward Hinnant 9199fd9f84fSHoward Hinnant#endif 9209fd9f84fSHoward Hinnant 9213e519524SHoward Hinnanttemplate <class _HashIterator> 922e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_iterator 9233e519524SHoward Hinnant{ 9243e519524SHoward Hinnant _HashIterator __i_; 9253e519524SHoward Hinnant 92675d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 92775d0dcfdSEric Fiselier 9283e519524SHoward Hinnantpublic: 9293e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 93075d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 93175d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 9323e519524SHoward Hinnant typedef value_type& reference; 93375d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 9343e519524SHoward Hinnant 935789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9363714107eSHoward Hinnant __hash_map_iterator() _NOEXCEPT {} 9373e519524SHoward Hinnant 938789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9393714107eSHoward Hinnant __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 9403e519524SHoward Hinnant 941789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 942f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 943789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 944f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 9453e519524SHoward Hinnant 946789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9473e519524SHoward Hinnant __hash_map_iterator& operator++() {++__i_; return *this;} 948789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9493e519524SHoward Hinnant __hash_map_iterator operator++(int) 9503e519524SHoward Hinnant { 9513e519524SHoward Hinnant __hash_map_iterator __t(*this); 9523e519524SHoward Hinnant ++(*this); 9533e519524SHoward Hinnant return __t; 9543e519524SHoward Hinnant } 9553e519524SHoward Hinnant 956789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 957789847ddSHoward Hinnant bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 9583e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 959789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 960789847ddSHoward Hinnant bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) 9613e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 9623e519524SHoward Hinnant 963e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 964e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 965e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 966e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 967e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; 9683e519524SHoward Hinnant}; 9693e519524SHoward Hinnant 9703e519524SHoward Hinnanttemplate <class _HashIterator> 971e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator 9723e519524SHoward Hinnant{ 9733e519524SHoward Hinnant _HashIterator __i_; 9743e519524SHoward Hinnant 97575d0dcfdSEric Fiselier typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; 97675d0dcfdSEric Fiselier 9773e519524SHoward Hinnantpublic: 9783e519524SHoward Hinnant typedef forward_iterator_tag iterator_category; 97975d0dcfdSEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 98075d0dcfdSEric Fiselier typedef typename _NodeTypes::difference_type difference_type; 9813e519524SHoward Hinnant typedef const value_type& reference; 98275d0dcfdSEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 9833e519524SHoward Hinnant 984789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9853714107eSHoward Hinnant __hash_map_const_iterator() _NOEXCEPT {} 9863e519524SHoward Hinnant 987789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9883714107eSHoward Hinnant __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} 989789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9903e519524SHoward Hinnant __hash_map_const_iterator( 9913e519524SHoward Hinnant __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) 9923714107eSHoward Hinnant _NOEXCEPT 9933e519524SHoward Hinnant : __i_(__i.__i_) {} 9943e519524SHoward Hinnant 995789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 996f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 997789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 998f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 9993e519524SHoward Hinnant 1000789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10013e519524SHoward Hinnant __hash_map_const_iterator& operator++() {++__i_; return *this;} 1002789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10033e519524SHoward Hinnant __hash_map_const_iterator operator++(int) 10043e519524SHoward Hinnant { 10053e519524SHoward Hinnant __hash_map_const_iterator __t(*this); 10063e519524SHoward Hinnant ++(*this); 10073e519524SHoward Hinnant return __t; 10083e519524SHoward Hinnant } 10093e519524SHoward Hinnant 1010789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 1011789847ddSHoward Hinnant bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 10123e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 1013789847ddSHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 1014789847ddSHoward Hinnant bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) 10153e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 10163e519524SHoward Hinnant 1017e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map; 1018e2f2d1edSEric Fiselier template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 1019e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; 1020e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; 10213e519524SHoward Hinnant}; 10223e519524SHoward Hinnant 10235c4e07aeSErik Pilkingtontemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 10245c4e07aeSErik Pilkingtonclass unordered_multimap; 10255c4e07aeSErik Pilkington 10263e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 10273e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 1028e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_map 10293e519524SHoward Hinnant{ 10303e519524SHoward Hinnantpublic: 10313e519524SHoward Hinnant // types 10323e519524SHoward Hinnant typedef _Key key_type; 10333e519524SHoward Hinnant typedef _Tp mapped_type; 10343c6bd176SNikolas Klauser typedef __type_identity_t<_Hash> hasher; 10353c6bd176SNikolas Klauser typedef __type_identity_t<_Pred> key_equal; 10363c6bd176SNikolas Klauser typedef __type_identity_t<_Alloc> allocator_type; 10373e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 10383e519524SHoward Hinnant typedef value_type& reference; 10393e519524SHoward Hinnant typedef const value_type& const_reference; 1040b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1041b24c8024SHoward Hinnant "Invalid allocator::value_type"); 10423e519524SHoward Hinnant 10433e519524SHoward Hinnantprivate: 10449fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 1045e5ec94a1SRuslan Arutyunyan typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher; 1046e5ec94a1SRuslan Arutyunyan typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher> __key_equal; 10471f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 10481f508014SMarshall Clow __value_type>::type __allocator_type; 10493e519524SHoward Hinnant 10503e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 10513e519524SHoward Hinnant __key_equal, __allocator_type> __table; 10523e519524SHoward Hinnant 10533e519524SHoward Hinnant __table __table_; 10543e519524SHoward Hinnant 1055fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 10563e519524SHoward Hinnant typedef typename __table::__node_pointer __node_pointer; 10573e519524SHoward Hinnant typedef typename __table::__node_const_pointer __node_const_pointer; 10583e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 10593e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 10603e519524SHoward Hinnant typedef typename __table::__node __node; 1061c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 1062c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 10633e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 1064fcd02211SEric Fiselier 1065fcd02211SEric Fiselier static_assert((is_same<typename __table::__container_value_type, value_type>::value), ""); 1066fcd02211SEric Fiselier static_assert((is_same<typename __table::__node_value_type, __value_type>::value), ""); 10673e519524SHoward Hinnantpublic: 10683e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 10693e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 107075d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 107175d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 10723e519524SHoward Hinnant 10733e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 10743e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 10753e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 10763e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 10773e519524SHoward Hinnant 1078b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1079b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 1080b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 1081b0386a51SErik Pilkington#endif 1082b0386a51SErik Pilkington 10835c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 10845c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 10855c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 10865c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 10875c4e07aeSErik Pilkington 1088789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10893714107eSHoward Hinnant unordered_map() 10903714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1091b24c8024SHoward Hinnant { 1092e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1093b24c8024SHoward Hinnant } 10943e519524SHoward Hinnant explicit unordered_map(size_type __n, const hasher& __hf = hasher(), 10953e519524SHoward Hinnant const key_equal& __eql = key_equal()); 10963e519524SHoward Hinnant unordered_map(size_type __n, const hasher& __hf, 10973e519524SHoward Hinnant const key_equal& __eql, 10983e519524SHoward Hinnant const allocator_type& __a); 10993e519524SHoward Hinnant template <class _InputIterator> 11003e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last); 11013e519524SHoward Hinnant template <class _InputIterator> 11023e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 11033e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 11043e519524SHoward Hinnant const key_equal& __eql = key_equal()); 11053e519524SHoward Hinnant template <class _InputIterator> 11063e519524SHoward Hinnant unordered_map(_InputIterator __first, _InputIterator __last, 11073e519524SHoward Hinnant size_type __n, const hasher& __hf, 11083e519524SHoward Hinnant const key_equal& __eql, 11093e519524SHoward Hinnant const allocator_type& __a); 1110cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 11113e519524SHoward Hinnant explicit unordered_map(const allocator_type& __a); 11123e519524SHoward Hinnant unordered_map(const unordered_map& __u); 11133e519524SHoward Hinnant unordered_map(const unordered_map& __u, const allocator_type& __a); 11146a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1115cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 11163714107eSHoward Hinnant unordered_map(unordered_map&& __u) 11173714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 11183e519524SHoward Hinnant unordered_map(unordered_map&& __u, const allocator_type& __a); 11193e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il); 11203e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 11213e519524SHoward Hinnant const hasher& __hf = hasher(), const key_equal& __eql = key_equal()); 11223e519524SHoward Hinnant unordered_map(initializer_list<value_type> __il, size_type __n, 11233e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 11243e519524SHoward Hinnant const allocator_type& __a); 11256a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 11263cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 11273cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11283cd37e64SMarshall Clow unordered_map(size_type __n, const allocator_type& __a) 11293cd37e64SMarshall Clow : unordered_map(__n, hasher(), key_equal(), __a) {} 11303cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11313cd37e64SMarshall Clow unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a) 11323cd37e64SMarshall Clow : unordered_map(__n, __hf, key_equal(), __a) {} 11333cd37e64SMarshall Clow template <class _InputIterator> 11343cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11353cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 11363cd37e64SMarshall Clow : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {} 11373cd37e64SMarshall Clow template <class _InputIterator> 11383cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11393cd37e64SMarshall Clow unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 11403cd37e64SMarshall Clow const allocator_type& __a) 11413cd37e64SMarshall Clow : unordered_map(__first, __last, __n, __hf, key_equal(), __a) {} 11423cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11433cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 11443cd37e64SMarshall Clow : unordered_map(__il, __n, hasher(), key_equal(), __a) {} 11453cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11463cd37e64SMarshall Clow unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 11473cd37e64SMarshall Clow const allocator_type& __a) 11483cd37e64SMarshall Clow : unordered_map(__il, __n, __hf, key_equal(), __a) {} 11493cd37e64SMarshall Clow#endif 11507c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 11517c142fccSLouis Dionne ~unordered_map() { 11527c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 11537c142fccSLouis Dionne } 11547c142fccSLouis Dionne 11555a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11565a33687dSHoward Hinnant unordered_map& operator=(const unordered_map& __u) 11575a33687dSHoward Hinnant { 11582ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 11595a33687dSHoward Hinnant __table_ = __u.__table_; 1160307f8143SHoward Hinnant#else 1161b8608b87SMark de Wever if (this != _VSTD::addressof(__u)) { 1162307f8143SHoward Hinnant __table_.clear(); 1163307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 1164307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 1165307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 1166307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 1167307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 116874cf6ff5SMarshall Clow } 1169307f8143SHoward Hinnant#endif 11705a33687dSHoward Hinnant return *this; 11715a33687dSHoward Hinnant } 11726a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1173cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 11743714107eSHoward Hinnant unordered_map& operator=(unordered_map&& __u) 11753714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 1176cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 11773e519524SHoward Hinnant unordered_map& operator=(initializer_list<value_type> __il); 11786a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 11793e519524SHoward Hinnant 1180789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11813714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 11823e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 11833e519524SHoward Hinnant 118472c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 11853714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 1186789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11873714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 1188789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11893714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 11903e519524SHoward Hinnant 1191789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11923714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 1193789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11943714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 1195789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11963714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 1197789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11983714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 1199789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12003714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 1201789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12023714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 12033e519524SHoward Hinnant 12047a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12057a9f500fSEric Fiselier pair<iterator, bool> insert(const value_type& __x) 12067a9f500fSEric Fiselier {return __table_.__insert_unique(__x);} 12077a9f500fSEric Fiselier 12087a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) { 1209d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 12107a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not " 12117a9f500fSEric Fiselier "referring to this unordered_map"); 1212fd838227SEric Fiselier ((void)__p); 12137a9f500fSEric Fiselier return insert(__x).first; 12147a9f500fSEric Fiselier } 12157a9f500fSEric Fiselier 12167a9f500fSEric Fiselier template <class _InputIterator> 1217cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 12187a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 12197a9f500fSEric Fiselier 12206a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 12217a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12227a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 12237a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 12247a9f500fSEric Fiselier 12257a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12267a9f500fSEric Fiselier pair<iterator, bool> insert(value_type&& __x) 12277a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::move(__x));} 12287a9f500fSEric Fiselier 12297a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) { 1230d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 12317a9f500fSEric Fiselier "unordered_map::insert(const_iterator, const value_type&) called with an iterator not" 12327a9f500fSEric Fiselier " referring to this unordered_map"); 1233fd838227SEric Fiselier ((void)__p); 12347a9f500fSEric Fiselier return __table_.__insert_unique(_VSTD::move(__x)).first; 12357a9f500fSEric Fiselier } 12367a9f500fSEric Fiselier 12377a9f500fSEric Fiselier template <class _Pp, 12384887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 12397a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12407a9f500fSEric Fiselier pair<iterator, bool> insert(_Pp&& __x) 12417a9f500fSEric Fiselier {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} 12427a9f500fSEric Fiselier 12437a9f500fSEric Fiselier template <class _Pp, 12444887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 12457a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12467a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 12477a9f500fSEric Fiselier { 1248d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 12497a9f500fSEric Fiselier "unordered_map::insert(const_iterator, value_type&&) called with an iterator not" 12507a9f500fSEric Fiselier " referring to this unordered_map"); 1251fd838227SEric Fiselier ((void)__p); 12527a9f500fSEric Fiselier return insert(_VSTD::forward<_Pp>(__x)).first; 12537a9f500fSEric Fiselier } 12547a9f500fSEric Fiselier 12558b805c91SHoward Hinnant template <class... _Args> 1256fcd02211SEric Fiselier _LIBCPP_INLINE_VISIBILITY 1257fcd02211SEric Fiselier pair<iterator, bool> emplace(_Args&&... __args) { 1258fcd02211SEric Fiselier return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 1259fcd02211SEric Fiselier } 12603e519524SHoward Hinnant 12618b805c91SHoward Hinnant template <class... _Args> 1262789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1263fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 1264d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 12654c80bfbdSHoward Hinnant "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not" 12664c80bfbdSHoward Hinnant " referring to this unordered_map"); 1267fd838227SEric Fiselier ((void)__p); 1268ad783ce9SDuncan P. N. Exon Smith return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; 12694c80bfbdSHoward Hinnant } 1270fcd02211SEric Fiselier 1271fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 1272fcd02211SEric Fiselier 1273bc4c89a9SMarshall Clow#if _LIBCPP_STD_VER > 14 1274bc4c89a9SMarshall Clow template <class... _Args> 1275bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1276bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 1277bc4c89a9SMarshall Clow { 1278d586f92cSArthur O'Dwyer return __table_.__emplace_unique_key_args(__k, piecewise_construct, 127987c4104dSEric Fiselier _VSTD::forward_as_tuple(__k), 128087c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1281bc4c89a9SMarshall Clow } 1282bc4c89a9SMarshall Clow 1283bc4c89a9SMarshall Clow template <class... _Args> 1284bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1285bc4c89a9SMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 1286bc4c89a9SMarshall Clow { 1287d586f92cSArthur O'Dwyer return __table_.__emplace_unique_key_args(__k, piecewise_construct, 128887c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 128987c4104dSEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 1290bc4c89a9SMarshall Clow } 1291bc4c89a9SMarshall Clow 1292bc4c89a9SMarshall Clow template <class... _Args> 1293bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1294bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 1295bc4c89a9SMarshall Clow { 1296d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__h)) == this, 129787c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 129887c4104dSEric Fiselier " referring to this unordered_map"); 1299fd838227SEric Fiselier ((void)__h); 130087c4104dSEric Fiselier return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first; 1301bc4c89a9SMarshall Clow } 1302bc4c89a9SMarshall Clow 1303bc4c89a9SMarshall Clow template <class... _Args> 1304bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1305bc4c89a9SMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 1306bc4c89a9SMarshall Clow { 1307d6e2c95dSMark de Wever _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__h)) == this, 130887c4104dSEric Fiselier "unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" 130987c4104dSEric Fiselier " referring to this unordered_map"); 1310fd838227SEric Fiselier ((void)__h); 131187c4104dSEric Fiselier return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first; 1312bc4c89a9SMarshall Clow } 1313bc4c89a9SMarshall Clow 1314bc4c89a9SMarshall Clow template <class _Vp> 1315bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1316bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 1317bc4c89a9SMarshall Clow { 131887c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 131987c4104dSEric Fiselier __k, _VSTD::forward<_Vp>(__v)); 132087c4104dSEric Fiselier if (!__res.second) { 132187c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1322bc4c89a9SMarshall Clow } 132387c4104dSEric Fiselier return __res; 1324bc4c89a9SMarshall Clow } 1325bc4c89a9SMarshall Clow 1326bc4c89a9SMarshall Clow template <class _Vp> 1327bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1328bc4c89a9SMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 1329bc4c89a9SMarshall Clow { 133087c4104dSEric Fiselier pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, 133187c4104dSEric Fiselier _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 133287c4104dSEric Fiselier if (!__res.second) { 133387c4104dSEric Fiselier __res.first->second = _VSTD::forward<_Vp>(__v); 1334bc4c89a9SMarshall Clow } 133587c4104dSEric Fiselier return __res; 1336bc4c89a9SMarshall Clow } 1337bc4c89a9SMarshall Clow 1338bc4c89a9SMarshall Clow template <class _Vp> 1339bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1340fd838227SEric Fiselier iterator insert_or_assign(const_iterator, const key_type& __k, _Vp&& __v) 1341bc4c89a9SMarshall Clow { 1342fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 134387c4104dSEric Fiselier return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first; 1344bc4c89a9SMarshall Clow } 1345bc4c89a9SMarshall Clow 1346bc4c89a9SMarshall Clow template <class _Vp> 1347bc4c89a9SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1348fd838227SEric Fiselier iterator insert_or_assign(const_iterator, key_type&& __k, _Vp&& __v) 1349bc4c89a9SMarshall Clow { 1350fd838227SEric Fiselier // FIXME: Add debug mode checking for the iterator input 135187c4104dSEric Fiselier return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first; 1352bc4c89a9SMarshall Clow } 13536a470bcbSEric Fiselier#endif // _LIBCPP_STD_VER > 14 1354bc4c89a9SMarshall Clow 1355789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13563e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 1357789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1358ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 1359ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 13603e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} 1361789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13623e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 13633e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 1364789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13653714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 13663e519524SHoward Hinnant 1367b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1368b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1369b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1370b0386a51SErik Pilkington { 1371b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1372b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1373b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique< 1374b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1375b0386a51SErik Pilkington } 1376b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1377b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1378b0386a51SErik Pilkington { 1379b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1380b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_map::insert()"); 1381b0386a51SErik Pilkington return __table_.template __node_handle_insert_unique<node_type>( 1382b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1383b0386a51SErik Pilkington } 1384b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1385b0386a51SErik Pilkington node_type extract(key_type const& __key) 1386b0386a51SErik Pilkington { 1387b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 1388b0386a51SErik Pilkington } 1389b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1390b0386a51SErik Pilkington node_type extract(const_iterator __it) 1391b0386a51SErik Pilkington { 1392b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 1393b0386a51SErik Pilkington __it.__i_); 1394b0386a51SErik Pilkington } 13955c4e07aeSErik Pilkington 13965c4e07aeSErik Pilkington template <class _H2, class _P2> 13975c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13985c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 13995c4e07aeSErik Pilkington { 14005c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14015c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14025c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 14035c4e07aeSErik Pilkington } 14045c4e07aeSErik Pilkington template <class _H2, class _P2> 14055c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14065c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 14075c4e07aeSErik Pilkington { 14085c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14095c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14105c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 14115c4e07aeSErik Pilkington } 14125c4e07aeSErik Pilkington template <class _H2, class _P2> 14135c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14145c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 14155c4e07aeSErik Pilkington { 14165c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14175c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14185c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 14195c4e07aeSErik Pilkington } 14205c4e07aeSErik Pilkington template <class _H2, class _P2> 14215c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14225c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 14235c4e07aeSErik Pilkington { 14245c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14255c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14265c4e07aeSErik Pilkington return __table_.__node_handle_merge_unique(__source.__table_); 14275c4e07aeSErik Pilkington } 1428b0386a51SErik Pilkington#endif 1429b0386a51SErik Pilkington 1430789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14313714107eSHoward Hinnant void swap(unordered_map& __u) 14323714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 14333714107eSHoward Hinnant { __table_.swap(__u.__table_);} 14343e519524SHoward Hinnant 1435789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14363e519524SHoward Hinnant hasher hash_function() const 14373e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 1438789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14393e519524SHoward Hinnant key_equal key_eq() const 14403e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 14413e519524SHoward Hinnant 1442789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14433e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 1444789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14453e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 1446e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1447d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1448e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1449d5db71d1SArthur O'Dwyer iterator find(const _K2& __k) {return __table_.find(__k);} 1450d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1451e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1452d5db71d1SArthur O'Dwyer const_iterator find(const _K2& __k) const {return __table_.find(__k);} 1453e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 1454e5ec94a1SRuslan Arutyunyan 1455789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14563e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} 1457a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 1458d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1459e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1460d5db71d1SArthur O'Dwyer size_type count(const _K2& __k) const {return __table_.__count_unique(__k);} 1461e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 1462d5db71d1SArthur O'Dwyer 1463e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1464a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 1465a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 1466e5ec94a1SRuslan Arutyunyan 1467d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1468e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1469d5db71d1SArthur O'Dwyer bool contains(const _K2& __k) const {return find(__k) != end();} 1470a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 1471d5db71d1SArthur O'Dwyer 1472789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14733e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 14743e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 1475789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14763e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 14773e519524SHoward Hinnant {return __table_.__equal_range_unique(__k);} 1478e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 1479d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1480e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1481d5db71d1SArthur O'Dwyer pair<iterator, iterator> equal_range(const _K2& __k) 1482d5db71d1SArthur O'Dwyer {return __table_.__equal_range_unique(__k);} 1483d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 1484e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 1485d5db71d1SArthur O'Dwyer pair<const_iterator, const_iterator> equal_range(const _K2& __k) const 1486d5db71d1SArthur O'Dwyer {return __table_.__equal_range_unique(__k);} 1487e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 14883e519524SHoward Hinnant 14893e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 14900f905677SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 14913e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 14923e519524SHoward Hinnant#endif 14933e519524SHoward Hinnant 14943e519524SHoward Hinnant mapped_type& at(const key_type& __k); 14953e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 14963e519524SHoward Hinnant 1497789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14983714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 1499789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15003714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} 15013e519524SHoward Hinnant 1502789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15033e519524SHoward Hinnant size_type bucket_size(size_type __n) const 15043e519524SHoward Hinnant {return __table_.bucket_size(__n);} 1505789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15063e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 15073e519524SHoward Hinnant 1508789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15093e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 1510789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15113e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 1512789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15133e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 1514789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15153e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 1516789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15173e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 1518789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15193e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 15203e519524SHoward Hinnant 1521789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15223714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 1523789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15243714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 1525789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15263e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 1527789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1528*3085e42fSIvan Trofimov void rehash(size_type __n) {__table_.__rehash_unique(__n);} 1529789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1530*3085e42fSIvan Trofimov void reserve(size_type __n) {__table_.__reserve_unique(__n);} 15313e519524SHoward Hinnant 1532f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE 1533b24c8024SHoward Hinnant 1534b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 1535968e2739SMark de Wever {return __table_.__dereferenceable(_VSTD::addressof(__i->__i_));} 1536b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 1537968e2739SMark de Wever {return __table_.__decrementable(_VSTD::addressof(__i->__i_));} 1538b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 1539968e2739SMark de Wever {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);} 1540b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1541968e2739SMark de Wever {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);} 1542b24c8024SHoward Hinnant 1543f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE 1544b24c8024SHoward Hinnant 15453e519524SHoward Hinnantprivate: 15460f905677SEric Fiselier 15470f905677SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 15484a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 15490f905677SEric Fiselier#endif 15503e519524SHoward Hinnant}; 15513e519524SHoward Hinnant 155201666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 1553dfcd4384SLouis Dionnetemplate<class _InputIterator, 1554dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 1555dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 1556dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 155768072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15584e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15594e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15604e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 15614e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1562dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 1563dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1564dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 1565dfcd4384SLouis Dionne 1566dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 1567dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 1568dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 15694e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15704e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15714e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 15724e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1573dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 1574dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1575dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 1576dfcd4384SLouis Dionne 1577dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 157868072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15794e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1580dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 1581dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1582dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1583dfcd4384SLouis Dionne 1584dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 158568072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15864e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1587dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, _Allocator) 1588dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1589dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1590dfcd4384SLouis Dionne 1591dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 159268072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 15934e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 15944e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 15954e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1596dfcd4384SLouis Dionneunordered_map(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1597dfcd4384SLouis Dionne -> unordered_map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1598dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 1599dfcd4384SLouis Dionne 1600dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 16014e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1602dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 1603dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1604dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1605dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1606dfcd4384SLouis Dionne 1607dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 16084e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1609dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator) 1610dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, 1611dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 1612dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1613dfcd4384SLouis Dionne 1614dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 16154e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 16164e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 16174e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 1618dfcd4384SLouis Dionneunordered_map(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 1619dfcd4384SLouis Dionne -> unordered_map<remove_const_t<_Key>, _Tp, _Hash, 1620dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 1621dfcd4384SLouis Dionne#endif 1622dfcd4384SLouis Dionne 16233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16243e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16253e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 16263e519524SHoward Hinnant : __table_(__hf, __eql) 16273e519524SHoward Hinnant{ 1628e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1629*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 16303e519524SHoward Hinnant} 16313e519524SHoward Hinnant 16323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16333e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16343e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 16353e519524SHoward Hinnant const allocator_type& __a) 16362a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 16373e519524SHoward Hinnant{ 1638e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1639*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 16403e519524SHoward Hinnant} 16413e519524SHoward Hinnant 16423e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1643cd31b434SEvgeniy Stepanovinline 16443e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16453e519524SHoward Hinnant const allocator_type& __a) 16462a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 16473e519524SHoward Hinnant{ 1648e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16493e519524SHoward Hinnant} 16503e519524SHoward Hinnant 16513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16523e519524SHoward Hinnanttemplate <class _InputIterator> 16533e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16543e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 16553e519524SHoward Hinnant{ 1656e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 16573e519524SHoward Hinnant insert(__first, __last); 16583e519524SHoward Hinnant} 16593e519524SHoward Hinnant 16603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16613e519524SHoward Hinnanttemplate <class _InputIterator> 16623e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16633e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 16643e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 16653e519524SHoward Hinnant : __table_(__hf, __eql) 16663e519524SHoward Hinnant{ 1667e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1668*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 16693e519524SHoward Hinnant insert(__first, __last); 16703e519524SHoward Hinnant} 16713e519524SHoward Hinnant 16723e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16733e519524SHoward Hinnanttemplate <class _InputIterator> 16743e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16753e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 16763e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 16772a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 16783e519524SHoward Hinnant{ 1679e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1680*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 16813e519524SHoward Hinnant insert(__first, __last); 16823e519524SHoward Hinnant} 16833e519524SHoward Hinnant 16843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16853e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16863e519524SHoward Hinnant const unordered_map& __u) 16873e519524SHoward Hinnant : __table_(__u.__table_) 16883e519524SHoward Hinnant{ 1689e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1690*3085e42fSIvan Trofimov __table_.__rehash_unique(__u.bucket_count()); 16913e519524SHoward Hinnant insert(__u.begin(), __u.end()); 16923e519524SHoward Hinnant} 16933e519524SHoward Hinnant 16943e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 16953e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 16963e519524SHoward Hinnant const unordered_map& __u, const allocator_type& __a) 16972a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 16983e519524SHoward Hinnant{ 1699e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1700*3085e42fSIvan Trofimov __table_.__rehash_unique(__u.bucket_count()); 17013e519524SHoward Hinnant insert(__u.begin(), __u.end()); 17023e519524SHoward Hinnant} 17033e519524SHoward Hinnant 17046a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17053e519524SHoward Hinnant 17063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1707cd31b434SEvgeniy Stepanovinline 17083e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 17093e519524SHoward Hinnant unordered_map&& __u) 17103714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 1711ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 17123e519524SHoward Hinnant{ 1713e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 171408f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 17153e519524SHoward Hinnant} 17163e519524SHoward Hinnant 17173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17183e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 17193e519524SHoward Hinnant unordered_map&& __u, const allocator_type& __a) 17202a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 17213e519524SHoward Hinnant{ 1722e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 17233e519524SHoward Hinnant if (__a != __u.get_allocator()) 17243e519524SHoward Hinnant { 17253e519524SHoward Hinnant iterator __i = __u.begin(); 1726fcd02211SEric Fiselier while (__u.size() != 0) { 1727f52318b4SErik Pilkington __table_.__emplace_unique( 1728f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 1729fcd02211SEric Fiselier } 17303e519524SHoward Hinnant } 17314c80bfbdSHoward Hinnant else 173208f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 17333e519524SHoward Hinnant} 17343e519524SHoward Hinnant 17353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17363e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 17373e519524SHoward Hinnant initializer_list<value_type> __il) 17383e519524SHoward Hinnant{ 1739e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 17403e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17413e519524SHoward Hinnant} 17423e519524SHoward Hinnant 17433e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17443e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 17453e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 17463e519524SHoward Hinnant const key_equal& __eql) 17473e519524SHoward Hinnant : __table_(__hf, __eql) 17483e519524SHoward Hinnant{ 1749e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1750*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 17513e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17523e519524SHoward Hinnant} 17533e519524SHoward Hinnant 17543e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17553e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( 17563e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 17573e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 17582a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 17593e519524SHoward Hinnant{ 1760e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1761*3085e42fSIvan Trofimov __table_.__rehash_unique(__n); 17623e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17633e519524SHoward Hinnant} 17643e519524SHoward Hinnant 17653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1766cd31b434SEvgeniy Stepanovinline 17673e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 17683e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u) 17693714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 17703e519524SHoward Hinnant{ 1771ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 17723e519524SHoward Hinnant return *this; 17733e519524SHoward Hinnant} 17743e519524SHoward Hinnant 17753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1776cd31b434SEvgeniy Stepanovinline 17773e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& 17783e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 17793e519524SHoward Hinnant initializer_list<value_type> __il) 17803e519524SHoward Hinnant{ 17813e519524SHoward Hinnant __table_.__assign_unique(__il.begin(), __il.end()); 17823e519524SHoward Hinnant return *this; 17833e519524SHoward Hinnant} 17843e519524SHoward Hinnant 17856a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 17863e519524SHoward Hinnant 17873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 17883e519524SHoward Hinnanttemplate <class _InputIterator> 1789cd31b434SEvgeniy Stepanovinline 17903e519524SHoward Hinnantvoid 17913e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 17923e519524SHoward Hinnant _InputIterator __last) 17933e519524SHoward Hinnant{ 17943e519524SHoward Hinnant for (; __first != __last; ++__first) 17953e519524SHoward Hinnant __table_.__insert_unique(*__first); 17963e519524SHoward Hinnant} 17973e519524SHoward Hinnant 17986a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17993e519524SHoward Hinnant 18000f905677SEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18010f905677SEric Fiselier_Tp& 18020f905677SEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 18030f905677SEric Fiselier{ 18040f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 1805d586f92cSArthur O'Dwyer piecewise_construct, _VSTD::forward_as_tuple(__k), 1806d586f92cSArthur O'Dwyer _VSTD::forward_as_tuple()).first->__get_value().second; 18070f905677SEric Fiselier} 18083e519524SHoward Hinnant 18093e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18103e519524SHoward Hinnant_Tp& 18113e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) 18123e519524SHoward Hinnant{ 18130f905677SEric Fiselier return __table_.__emplace_unique_key_args(__k, 1814d586f92cSArthur O'Dwyer piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), 1815d586f92cSArthur O'Dwyer _VSTD::forward_as_tuple()).first->__get_value().second; 18163e519524SHoward Hinnant} 18176a470bcbSEric Fiselier#else // _LIBCPP_CXX03_LANG 18183e519524SHoward Hinnant 18196a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18206a470bcbSEric Fiseliertypename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder 18216a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node_with_key(const key_type& __k) 18226a470bcbSEric Fiselier{ 18236a470bcbSEric Fiselier __node_allocator& __na = __table_.__node_alloc(); 18246a470bcbSEric Fiselier __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1825f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 18266a470bcbSEric Fiselier __h.get_deleter().__first_constructed = true; 1827f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 18286a470bcbSEric Fiselier __h.get_deleter().__second_constructed = true; 18298d4860aaSLouis Dionne return __h; 18306a470bcbSEric Fiselier} 18316a470bcbSEric Fiselier 18326a470bcbSEric Fiseliertemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18336a470bcbSEric Fiselier_Tp& 18346a470bcbSEric Fiselierunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) 18356a470bcbSEric Fiselier{ 18366a470bcbSEric Fiselier iterator __i = find(__k); 18376a470bcbSEric Fiselier if (__i != end()) 18386a470bcbSEric Fiselier return __i->second; 18396a470bcbSEric Fiselier __node_holder __h = __construct_node_with_key(__k); 18406a470bcbSEric Fiselier pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); 18416a470bcbSEric Fiselier __h.release(); 18426a470bcbSEric Fiselier return __r.first->second; 18436a470bcbSEric Fiselier} 18446a470bcbSEric Fiselier 1845e6972024SArthur O'Dwyer#endif // _LIBCPP_CXX03_LANG 18463e519524SHoward Hinnant 18473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18483e519524SHoward Hinnant_Tp& 18493e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) 18503e519524SHoward Hinnant{ 18513e519524SHoward Hinnant iterator __i = find(__k); 18523e519524SHoward Hinnant if (__i == end()) 18537232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 18543e519524SHoward Hinnant return __i->second; 18553e519524SHoward Hinnant} 18563e519524SHoward Hinnant 18573e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18583e519524SHoward Hinnantconst _Tp& 18593e519524SHoward Hinnantunordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const 18603e519524SHoward Hinnant{ 18613e519524SHoward Hinnant const_iterator __i = find(__k); 18623e519524SHoward Hinnant if (__i == end()) 18637232a84eSLouis Dionne __throw_out_of_range("unordered_map::at: key not found"); 18643e519524SHoward Hinnant return __i->second; 18653e519524SHoward Hinnant} 18663e519524SHoward Hinnant 18673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1868789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18693e519524SHoward Hinnantvoid 18703e519524SHoward Hinnantswap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 18713e519524SHoward Hinnant unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 18723714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 18733e519524SHoward Hinnant{ 18743e519524SHoward Hinnant __x.swap(__y); 18753e519524SHoward Hinnant} 18763e519524SHoward Hinnant 1877f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 18783e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 18793e895085SMarek Kurdej class _Predicate> 1880f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 18813e895085SMarek Kurdej typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type 18823e895085SMarek Kurdej erase_if(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, 18833e895085SMarek Kurdej _Predicate __pred) { 18842ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 18853e895085SMarek Kurdej} 1886f60c63c0SMarshall Clow#endif 1887f60c63c0SMarshall Clow 18883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 18893e519524SHoward Hinnantbool 18903e519524SHoward Hinnantoperator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 18913e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 18923e519524SHoward Hinnant{ 18933e519524SHoward Hinnant if (__x.size() != __y.size()) 18943e519524SHoward Hinnant return false; 18953e519524SHoward Hinnant typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 18963e519524SHoward Hinnant const_iterator; 18973e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); 18983e519524SHoward Hinnant __i != __ex; ++__i) 18993e519524SHoward Hinnant { 19003e519524SHoward Hinnant const_iterator __j = __y.find(__i->first); 19013e519524SHoward Hinnant if (__j == __ey || !(*__i == *__j)) 19023e519524SHoward Hinnant return false; 19033e519524SHoward Hinnant } 19043e519524SHoward Hinnant return true; 19053e519524SHoward Hinnant} 19063e519524SHoward Hinnant 19073e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 1908789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19093e519524SHoward Hinnantbool 19103e519524SHoward Hinnantoperator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 19113e519524SHoward Hinnant const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 19123e519524SHoward Hinnant{ 19133e519524SHoward Hinnant return !(__x == __y); 19143e519524SHoward Hinnant} 19153e519524SHoward Hinnant 19163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, 19173e519524SHoward Hinnant class _Alloc = allocator<pair<const _Key, _Tp> > > 1918e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unordered_multimap 19193e519524SHoward Hinnant{ 19203e519524SHoward Hinnantpublic: 19213e519524SHoward Hinnant // types 19223e519524SHoward Hinnant typedef _Key key_type; 19233e519524SHoward Hinnant typedef _Tp mapped_type; 19243c6bd176SNikolas Klauser typedef __type_identity_t<_Hash> hasher; 19253c6bd176SNikolas Klauser typedef __type_identity_t<_Pred> key_equal; 19263c6bd176SNikolas Klauser typedef __type_identity_t<_Alloc> allocator_type; 19273e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 19283e519524SHoward Hinnant typedef value_type& reference; 19293e519524SHoward Hinnant typedef const value_type& const_reference; 1930b24c8024SHoward Hinnant static_assert((is_same<value_type, typename allocator_type::value_type>::value), 1931b24c8024SHoward Hinnant "Invalid allocator::value_type"); 19323e519524SHoward Hinnant 19333e519524SHoward Hinnantprivate: 19349fd9f84fSHoward Hinnant typedef __hash_value_type<key_type, mapped_type> __value_type; 1935e5ec94a1SRuslan Arutyunyan typedef __unordered_map_hasher<key_type, __value_type, hasher, key_equal> __hasher; 1936e5ec94a1SRuslan Arutyunyan typedef __unordered_map_equal<key_type, __value_type, key_equal, hasher> __key_equal; 19371f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 19381f508014SMarshall Clow __value_type>::type __allocator_type; 19393e519524SHoward Hinnant 19403e519524SHoward Hinnant typedef __hash_table<__value_type, __hasher, 19413e519524SHoward Hinnant __key_equal, __allocator_type> __table; 19423e519524SHoward Hinnant 19433e519524SHoward Hinnant __table __table_; 19443e519524SHoward Hinnant 1945fcd02211SEric Fiselier typedef typename __table::_NodeTypes _NodeTypes; 19463e519524SHoward Hinnant typedef typename __table::__node_traits __node_traits; 19473e519524SHoward Hinnant typedef typename __table::__node_allocator __node_allocator; 19483e519524SHoward Hinnant typedef typename __table::__node __node; 1949c003db1fSHoward Hinnant typedef __hash_map_node_destructor<__node_allocator> _Dp; 1950c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 19513e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 195275d0dcfdSEric Fiselier static_assert((is_same<typename __node_traits::size_type, 195375d0dcfdSEric Fiselier typename __alloc_traits::size_type>::value), 195475d0dcfdSEric Fiselier "Allocator uses different size_type for different types"); 19553e519524SHoward Hinnantpublic: 19563e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 19573e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 195875d0dcfdSEric Fiselier typedef typename __table::size_type size_type; 195975d0dcfdSEric Fiselier typedef typename __table::difference_type difference_type; 19603e519524SHoward Hinnant 19613e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::iterator> iterator; 19623e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; 19633e519524SHoward Hinnant typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; 19643e519524SHoward Hinnant typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; 19653e519524SHoward Hinnant 1966b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1967b0386a51SErik Pilkington typedef __map_node_handle<__node, allocator_type> node_type; 1968b0386a51SErik Pilkington#endif 1969b0386a51SErik Pilkington 19705c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 19715c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_map; 19725c4e07aeSErik Pilkington template <class _Key2, class _Tp2, class _Hash2, class _Pred2, class _Alloc2> 19735c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; 19745c4e07aeSErik Pilkington 1975789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19763714107eSHoward Hinnant unordered_multimap() 19773714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) 1978b24c8024SHoward Hinnant { 1979e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 1980b24c8024SHoward Hinnant } 19813e519524SHoward Hinnant explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(), 19823e519524SHoward Hinnant const key_equal& __eql = key_equal()); 19833e519524SHoward Hinnant unordered_multimap(size_type __n, const hasher& __hf, 19843e519524SHoward Hinnant const key_equal& __eql, 19853e519524SHoward Hinnant const allocator_type& __a); 19863e519524SHoward Hinnant template <class _InputIterator> 19873e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last); 19883e519524SHoward Hinnant template <class _InputIterator> 19893e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 19903e519524SHoward Hinnant size_type __n, const hasher& __hf = hasher(), 19913e519524SHoward Hinnant const key_equal& __eql = key_equal()); 19923e519524SHoward Hinnant template <class _InputIterator> 19933e519524SHoward Hinnant unordered_multimap(_InputIterator __first, _InputIterator __last, 19943e519524SHoward Hinnant size_type __n, const hasher& __hf, 19953e519524SHoward Hinnant const key_equal& __eql, 19963e519524SHoward Hinnant const allocator_type& __a); 1997cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 19983e519524SHoward Hinnant explicit unordered_multimap(const allocator_type& __a); 19993e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u); 20003e519524SHoward Hinnant unordered_multimap(const unordered_multimap& __u, const allocator_type& __a); 20016a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2002cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20033714107eSHoward Hinnant unordered_multimap(unordered_multimap&& __u) 20043714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); 20053e519524SHoward Hinnant unordered_multimap(unordered_multimap&& __u, const allocator_type& __a); 20063e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il); 20073e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 20083e519524SHoward Hinnant const hasher& __hf = hasher(), 20093e519524SHoward Hinnant const key_equal& __eql = key_equal()); 20103e519524SHoward Hinnant unordered_multimap(initializer_list<value_type> __il, size_type __n, 20113e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, 20123e519524SHoward Hinnant const allocator_type& __a); 20136a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 20143cd37e64SMarshall Clow#if _LIBCPP_STD_VER > 11 20153cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20163cd37e64SMarshall Clow unordered_multimap(size_type __n, const allocator_type& __a) 20173cd37e64SMarshall Clow : unordered_multimap(__n, hasher(), key_equal(), __a) {} 20183cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20193cd37e64SMarshall Clow unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a) 20203cd37e64SMarshall Clow : unordered_multimap(__n, __hf, key_equal(), __a) {} 20213cd37e64SMarshall Clow template <class _InputIterator> 20223cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20233cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) 20243cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {} 20253cd37e64SMarshall Clow template <class _InputIterator> 20263cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20273cd37e64SMarshall Clow unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, 20283cd37e64SMarshall Clow const allocator_type& __a) 20293cd37e64SMarshall Clow : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {} 20303cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20313cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) 20323cd37e64SMarshall Clow : unordered_multimap(__il, __n, hasher(), key_equal(), __a) {} 20333cd37e64SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20343cd37e64SMarshall Clow unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, 20353cd37e64SMarshall Clow const allocator_type& __a) 20363cd37e64SMarshall Clow : unordered_multimap(__il, __n, __hf, key_equal(), __a) {} 20373cd37e64SMarshall Clow#endif 20387c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 20397c142fccSLouis Dionne ~unordered_multimap() { 20407c142fccSLouis Dionne static_assert(sizeof(__diagnose_unordered_container_requirements<_Key, _Hash, _Pred>(0)), ""); 20417c142fccSLouis Dionne } 20427c142fccSLouis Dionne 20435a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20445a33687dSHoward Hinnant unordered_multimap& operator=(const unordered_multimap& __u) 20455a33687dSHoward Hinnant { 20462ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 20475a33687dSHoward Hinnant __table_ = __u.__table_; 2048307f8143SHoward Hinnant#else 2049b8608b87SMark de Wever if (this != _VSTD::addressof(__u)) { 2050307f8143SHoward Hinnant __table_.clear(); 2051307f8143SHoward Hinnant __table_.hash_function() = __u.__table_.hash_function(); 2052307f8143SHoward Hinnant __table_.key_eq() = __u.__table_.key_eq(); 2053307f8143SHoward Hinnant __table_.max_load_factor() = __u.__table_.max_load_factor(); 2054307f8143SHoward Hinnant __table_.__copy_assign_alloc(__u.__table_); 2055307f8143SHoward Hinnant insert(__u.begin(), __u.end()); 205674cf6ff5SMarshall Clow } 2057307f8143SHoward Hinnant#endif 20585a33687dSHoward Hinnant return *this; 20595a33687dSHoward Hinnant } 20606a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2061cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20623714107eSHoward Hinnant unordered_multimap& operator=(unordered_multimap&& __u) 20633714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); 2064cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 20653e519524SHoward Hinnant unordered_multimap& operator=(initializer_list<value_type> __il); 20666a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 20673e519524SHoward Hinnant 2068789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20693714107eSHoward Hinnant allocator_type get_allocator() const _NOEXCEPT 20703e519524SHoward Hinnant {return allocator_type(__table_.__node_alloc());} 20713e519524SHoward Hinnant 207272c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 20733714107eSHoward Hinnant bool empty() const _NOEXCEPT {return __table_.size() == 0;} 2074789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20753714107eSHoward Hinnant size_type size() const _NOEXCEPT {return __table_.size();} 2076789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20773714107eSHoward Hinnant size_type max_size() const _NOEXCEPT {return __table_.max_size();} 20783e519524SHoward Hinnant 2079789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20803714107eSHoward Hinnant iterator begin() _NOEXCEPT {return __table_.begin();} 2081789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20823714107eSHoward Hinnant iterator end() _NOEXCEPT {return __table_.end();} 2083789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20843714107eSHoward Hinnant const_iterator begin() const _NOEXCEPT {return __table_.begin();} 2085789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20863714107eSHoward Hinnant const_iterator end() const _NOEXCEPT {return __table_.end();} 2087789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20883714107eSHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} 2089789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20903714107eSHoward Hinnant const_iterator cend() const _NOEXCEPT {return __table_.end();} 20913e519524SHoward Hinnant 20927a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20937a9f500fSEric Fiselier iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} 20947a9f500fSEric Fiselier 20957a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20967a9f500fSEric Fiselier iterator insert(const_iterator __p, const value_type& __x) 20977a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, __x);} 20987a9f500fSEric Fiselier 20997a9f500fSEric Fiselier template <class _InputIterator> 2100cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 21017a9f500fSEric Fiselier void insert(_InputIterator __first, _InputIterator __last); 21027a9f500fSEric Fiselier 21036a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21047a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 21057a9f500fSEric Fiselier void insert(initializer_list<value_type> __il) 21067a9f500fSEric Fiselier {insert(__il.begin(), __il.end());} 21077a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 21087a9f500fSEric Fiselier iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} 21097a9f500fSEric Fiselier 21107a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 21117a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __x) 21127a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));} 21137a9f500fSEric Fiselier 21147a9f500fSEric Fiselier template <class _Pp, 21154887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 21167a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 21177a9f500fSEric Fiselier iterator insert(_Pp&& __x) 21187a9f500fSEric Fiselier {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} 21197a9f500fSEric Fiselier 21207a9f500fSEric Fiselier template <class _Pp, 21214887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 21227a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 21237a9f500fSEric Fiselier iterator insert(const_iterator __p, _Pp&& __x) 21247a9f500fSEric Fiselier {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} 21257a9f500fSEric Fiselier 2126fcd02211SEric Fiselier template <class... _Args> 2127fcd02211SEric Fiselier iterator emplace(_Args&&... __args) { 2128fcd02211SEric Fiselier return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 2129fcd02211SEric Fiselier } 21307609c9b6SHoward Hinnant 21318b805c91SHoward Hinnant template <class... _Args> 2132fcd02211SEric Fiselier iterator emplace_hint(const_iterator __p, _Args&&... __args) { 2133fcd02211SEric Fiselier return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 2134fcd02211SEric Fiselier } 2135fcd02211SEric Fiselier#endif // _LIBCPP_CXX03_LANG 21363e519524SHoward Hinnant 21373e519524SHoward Hinnant 2138789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21393e519524SHoward Hinnant iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} 2140789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2141ec392968SMarshall Clow iterator erase(iterator __p) {return __table_.erase(__p.__i_);} 2142ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 21433e519524SHoward Hinnant size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} 2144789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21453e519524SHoward Hinnant iterator erase(const_iterator __first, const_iterator __last) 21463e519524SHoward Hinnant {return __table_.erase(__first.__i_, __last.__i_);} 2147789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21483714107eSHoward Hinnant void clear() _NOEXCEPT {__table_.clear();} 21493e519524SHoward Hinnant 2150b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 2151b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2152b0386a51SErik Pilkington iterator insert(node_type&& __nh) 2153b0386a51SErik Pilkington { 2154b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2155b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 2156b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 2157b0386a51SErik Pilkington _VSTD::move(__nh)); 2158b0386a51SErik Pilkington } 2159b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2160b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 2161b0386a51SErik Pilkington { 2162b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2163b0386a51SErik Pilkington "node_type with incompatible allocator passed to unordered_multimap::insert()"); 2164b0386a51SErik Pilkington return __table_.template __node_handle_insert_multi<node_type>( 2165b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 2166b0386a51SErik Pilkington } 2167b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2168b0386a51SErik Pilkington node_type extract(key_type const& __key) 2169b0386a51SErik Pilkington { 2170b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>(__key); 2171b0386a51SErik Pilkington } 2172b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2173b0386a51SErik Pilkington node_type extract(const_iterator __it) 2174b0386a51SErik Pilkington { 2175b0386a51SErik Pilkington return __table_.template __node_handle_extract<node_type>( 2176b0386a51SErik Pilkington __it.__i_); 2177b0386a51SErik Pilkington } 21785c4e07aeSErik Pilkington 21795c4e07aeSErik Pilkington template <class _H2, class _P2> 21805c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21815c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 21825c4e07aeSErik Pilkington { 21835c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21845c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21855c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21865c4e07aeSErik Pilkington } 21875c4e07aeSErik Pilkington template <class _H2, class _P2> 21885c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21895c4e07aeSErik Pilkington void merge(unordered_multimap<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 21905c4e07aeSErik Pilkington { 21915c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21925c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21935c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 21945c4e07aeSErik Pilkington } 21955c4e07aeSErik Pilkington template <class _H2, class _P2> 21965c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21975c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>& __source) 21985c4e07aeSErik Pilkington { 21995c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 22005c4e07aeSErik Pilkington "merging container with incompatible allocator"); 22015c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 22025c4e07aeSErik Pilkington } 22035c4e07aeSErik Pilkington template <class _H2, class _P2> 22045c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 22055c4e07aeSErik Pilkington void merge(unordered_map<key_type, mapped_type, _H2, _P2, allocator_type>&& __source) 22065c4e07aeSErik Pilkington { 22075c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 22085c4e07aeSErik Pilkington "merging container with incompatible allocator"); 22095c4e07aeSErik Pilkington return __table_.__node_handle_merge_multi(__source.__table_); 22105c4e07aeSErik Pilkington } 2211b0386a51SErik Pilkington#endif 2212b0386a51SErik Pilkington 2213789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22143714107eSHoward Hinnant void swap(unordered_multimap& __u) 22153714107eSHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__table>::value) 22163714107eSHoward Hinnant {__table_.swap(__u.__table_);} 22173e519524SHoward Hinnant 2218789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22193e519524SHoward Hinnant hasher hash_function() const 22203e519524SHoward Hinnant {return __table_.hash_function().hash_function();} 2221789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22223e519524SHoward Hinnant key_equal key_eq() const 22233e519524SHoward Hinnant {return __table_.key_eq().key_eq();} 22243e519524SHoward Hinnant 2225789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22263e519524SHoward Hinnant iterator find(const key_type& __k) {return __table_.find(__k);} 2227789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22283e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __table_.find(__k);} 2229e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 2230d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2231e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2232d5db71d1SArthur O'Dwyer iterator find(const _K2& __k) {return __table_.find(__k);} 2233d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2234e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2235d5db71d1SArthur O'Dwyer const_iterator find(const _K2& __k) const {return __table_.find(__k);} 2236e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 2237d5db71d1SArthur O'Dwyer 2238789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22393e519524SHoward Hinnant size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} 2240a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 2241d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2242e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2243d5db71d1SArthur O'Dwyer size_type count(const _K2& __k) const {return __table_.__count_multi(__k);} 2244e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 2245d5db71d1SArthur O'Dwyer 2246e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 2247a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 2248a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 2249e5ec94a1SRuslan Arutyunyan 2250d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2251e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2252d5db71d1SArthur O'Dwyer bool contains(const _K2& __k) const {return find(__k) != end();} 2253a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 2254d5db71d1SArthur O'Dwyer 2255789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22563e519524SHoward Hinnant pair<iterator, iterator> equal_range(const key_type& __k) 22573e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 2258789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22593e519524SHoward Hinnant pair<const_iterator, const_iterator> equal_range(const key_type& __k) const 22603e519524SHoward Hinnant {return __table_.__equal_range_multi(__k);} 2261e5ec94a1SRuslan Arutyunyan#if _LIBCPP_STD_VER > 17 2262d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2263e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2264d5db71d1SArthur O'Dwyer pair<iterator, iterator> equal_range(const _K2& __k) 2265d5db71d1SArthur O'Dwyer {return __table_.__equal_range_multi(__k);} 2266d5db71d1SArthur O'Dwyer template <class _K2, enable_if_t<__is_transparent<hasher, _K2>::value && __is_transparent<key_equal, _K2>::value>* = nullptr> 2267e5ec94a1SRuslan Arutyunyan _LIBCPP_INLINE_VISIBILITY 2268d5db71d1SArthur O'Dwyer pair<const_iterator, const_iterator> equal_range(const _K2& __k) const 2269d5db71d1SArthur O'Dwyer {return __table_.__equal_range_multi(__k);} 2270e5ec94a1SRuslan Arutyunyan#endif // _LIBCPP_STD_VER > 17 22713e519524SHoward Hinnant 2272789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22733714107eSHoward Hinnant size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} 2274789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22753714107eSHoward Hinnant size_type max_bucket_count() const _NOEXCEPT 22763714107eSHoward Hinnant {return __table_.max_bucket_count();} 22773e519524SHoward Hinnant 2278789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22793e519524SHoward Hinnant size_type bucket_size(size_type __n) const 22803e519524SHoward Hinnant {return __table_.bucket_size(__n);} 2281789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22823e519524SHoward Hinnant size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} 22833e519524SHoward Hinnant 2284789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22853e519524SHoward Hinnant local_iterator begin(size_type __n) {return __table_.begin(__n);} 2286789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22873e519524SHoward Hinnant local_iterator end(size_type __n) {return __table_.end(__n);} 2288789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22893e519524SHoward Hinnant const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} 2290789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22913e519524SHoward Hinnant const_local_iterator end(size_type __n) const {return __table_.cend(__n);} 2292789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22933e519524SHoward Hinnant const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} 2294789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22953e519524SHoward Hinnant const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} 22963e519524SHoward Hinnant 2297789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22983714107eSHoward Hinnant float load_factor() const _NOEXCEPT {return __table_.load_factor();} 2299789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23003714107eSHoward Hinnant float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} 2301789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23023e519524SHoward Hinnant void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} 2303789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2304*3085e42fSIvan Trofimov void rehash(size_type __n) {__table_.__rehash_multi(__n);} 2305789847ddSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2306*3085e42fSIvan Trofimov void reserve(size_type __n) {__table_.__reserve_multi(__n);} 23073e519524SHoward Hinnant 2308f3966eafSLouis Dionne#ifdef _LIBCPP_ENABLE_DEBUG_MODE 2309b24c8024SHoward Hinnant 2310b24c8024SHoward Hinnant bool __dereferenceable(const const_iterator* __i) const 2311968e2739SMark de Wever {return __table_.__dereferenceable(_VSTD::addressof(__i->__i_));} 2312b24c8024SHoward Hinnant bool __decrementable(const const_iterator* __i) const 2313968e2739SMark de Wever {return __table_.__decrementable(_VSTD::addressof(__i->__i_));} 2314b24c8024SHoward Hinnant bool __addable(const const_iterator* __i, ptrdiff_t __n) const 2315968e2739SMark de Wever {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);} 2316b24c8024SHoward Hinnant bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const 2317968e2739SMark de Wever {return __table_.__addable(_VSTD::addressof(__i->__i_), __n);} 2318b24c8024SHoward Hinnant 2319f3966eafSLouis Dionne#endif // _LIBCPP_ENABLE_DEBUG_MODE 2320b24c8024SHoward Hinnant 2321fcd02211SEric Fiselier 23223e519524SHoward Hinnant}; 23233e519524SHoward Hinnant 232401666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 2325dfcd4384SLouis Dionnetemplate<class _InputIterator, 2326dfcd4384SLouis Dionne class _Hash = hash<__iter_key_type<_InputIterator>>, 2327dfcd4384SLouis Dionne class _Pred = equal_to<__iter_key_type<_InputIterator>>, 2328dfcd4384SLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 232968072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 23304e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 23314e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 23324e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 23334e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2334dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type = 0, 2335dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2336dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Hash, _Pred, _Allocator>; 2337dfcd4384SLouis Dionne 2338dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash = hash<remove_const_t<_Key>>, 2339dfcd4384SLouis Dionne class _Pred = equal_to<remove_const_t<_Key>>, 2340dfcd4384SLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 23414e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 23424e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 23434e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Pred>::value>, 23444e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2345dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type = 0, 2346dfcd4384SLouis Dionne _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 2347dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, _Pred, _Allocator>; 2348dfcd4384SLouis Dionne 2349dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 235068072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 23514e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2352dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Allocator) 2353dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2354dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2355dfcd4384SLouis Dionne 2356dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Allocator, 235768072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 23584e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2359dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, _Allocator) 2360dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2361dfcd4384SLouis Dionne hash<__iter_key_type<_InputIterator>>, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2362dfcd4384SLouis Dionne 2363dfcd4384SLouis Dionnetemplate<class _InputIterator, class _Hash, class _Allocator, 236468072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 23654e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 23664e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 23674e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2368dfcd4384SLouis Dionneunordered_multimap(_InputIterator, _InputIterator, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2369dfcd4384SLouis Dionne -> unordered_multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2370dfcd4384SLouis Dionne _Hash, equal_to<__iter_key_type<_InputIterator>>, _Allocator>; 2371dfcd4384SLouis Dionne 2372dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 23734e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2374dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Allocator) 2375dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2376dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2377dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2378dfcd4384SLouis Dionne 2379dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 23804e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2381dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2382dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, 2383dfcd4384SLouis Dionne hash<remove_const_t<_Key>>, 2384dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2385dfcd4384SLouis Dionne 2386dfcd4384SLouis Dionnetemplate<class _Key, class _Tp, class _Hash, class _Allocator, 23874e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Hash>::value>, 23884e0ea2cfSLouis Dionne class = enable_if_t<!is_integral<_Hash>::value>, 23894e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value>> 2390dfcd4384SLouis Dionneunordered_multimap(initializer_list<pair<_Key, _Tp>>, typename allocator_traits<_Allocator>::size_type, _Hash, _Allocator) 2391dfcd4384SLouis Dionne -> unordered_multimap<remove_const_t<_Key>, _Tp, _Hash, 2392dfcd4384SLouis Dionne equal_to<remove_const_t<_Key>>, _Allocator>; 2393dfcd4384SLouis Dionne#endif 2394dfcd4384SLouis Dionne 23953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 23963e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 23973e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql) 23983e519524SHoward Hinnant : __table_(__hf, __eql) 23993e519524SHoward Hinnant{ 2400e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2401*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 24023e519524SHoward Hinnant} 24033e519524SHoward Hinnant 24043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24053e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24063e519524SHoward Hinnant size_type __n, const hasher& __hf, const key_equal& __eql, 24073e519524SHoward Hinnant const allocator_type& __a) 24082a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 24093e519524SHoward Hinnant{ 2410e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2411*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 24123e519524SHoward Hinnant} 24133e519524SHoward Hinnant 24143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24153e519524SHoward Hinnanttemplate <class _InputIterator> 24163e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24173e519524SHoward Hinnant _InputIterator __first, _InputIterator __last) 24183e519524SHoward Hinnant{ 2419e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 24203e519524SHoward Hinnant insert(__first, __last); 24213e519524SHoward Hinnant} 24223e519524SHoward Hinnant 24233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24243e519524SHoward Hinnanttemplate <class _InputIterator> 24253e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24263e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 24273e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql) 24283e519524SHoward Hinnant : __table_(__hf, __eql) 24293e519524SHoward Hinnant{ 2430e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2431*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 24323e519524SHoward Hinnant insert(__first, __last); 24333e519524SHoward Hinnant} 24343e519524SHoward Hinnant 24353e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24363e519524SHoward Hinnanttemplate <class _InputIterator> 24373e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24383e519524SHoward Hinnant _InputIterator __first, _InputIterator __last, size_type __n, 24393e519524SHoward Hinnant const hasher& __hf, const key_equal& __eql, const allocator_type& __a) 24402a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 24413e519524SHoward Hinnant{ 2442e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2443*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 24443e519524SHoward Hinnant insert(__first, __last); 24453e519524SHoward Hinnant} 24463e519524SHoward Hinnant 24473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2448cd31b434SEvgeniy Stepanovinline 24493e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24503e519524SHoward Hinnant const allocator_type& __a) 24512a10c960SMarshall Clow : __table_(typename __table::allocator_type(__a)) 24523e519524SHoward Hinnant{ 2453e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 24543e519524SHoward Hinnant} 24553e519524SHoward Hinnant 24563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24573e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24583e519524SHoward Hinnant const unordered_multimap& __u) 24593e519524SHoward Hinnant : __table_(__u.__table_) 24603e519524SHoward Hinnant{ 2461e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2462*3085e42fSIvan Trofimov __table_.__rehash_multi(__u.bucket_count()); 24633e519524SHoward Hinnant insert(__u.begin(), __u.end()); 24643e519524SHoward Hinnant} 24653e519524SHoward Hinnant 24663e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24673e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24683e519524SHoward Hinnant const unordered_multimap& __u, const allocator_type& __a) 24692a10c960SMarshall Clow : __table_(__u.__table_, typename __table::allocator_type(__a)) 24703e519524SHoward Hinnant{ 2471e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2472*3085e42fSIvan Trofimov __table_.__rehash_multi(__u.bucket_count()); 24733e519524SHoward Hinnant insert(__u.begin(), __u.end()); 24743e519524SHoward Hinnant} 24753e519524SHoward Hinnant 24766a470bcbSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 24773e519524SHoward Hinnant 24783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2479cd31b434SEvgeniy Stepanovinline 24803e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24813e519524SHoward Hinnant unordered_multimap&& __u) 24823714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) 2483ce48a113SHoward Hinnant : __table_(_VSTD::move(__u.__table_)) 24843e519524SHoward Hinnant{ 2485e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 248608f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 24873e519524SHoward Hinnant} 24883e519524SHoward Hinnant 24893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 24903e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 24913e519524SHoward Hinnant unordered_multimap&& __u, const allocator_type& __a) 24922a10c960SMarshall Clow : __table_(_VSTD::move(__u.__table_), typename __table::allocator_type(__a)) 24933e519524SHoward Hinnant{ 2494e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 24953e519524SHoward Hinnant if (__a != __u.get_allocator()) 24963e519524SHoward Hinnant { 24973e519524SHoward Hinnant iterator __i = __u.begin(); 24983e519524SHoward Hinnant while (__u.size() != 0) 24993e519524SHoward Hinnant { 25003e519524SHoward Hinnant __table_.__insert_multi( 2501f52318b4SErik Pilkington __u.__table_.remove((__i++).__i_)->__value_.__move()); 25023e519524SHoward Hinnant } 25033e519524SHoward Hinnant } 25044c80bfbdSHoward Hinnant else 250508f68dfeSNikolas Klauser std::__debug_db_swap(this, std::addressof(__u)); 25063e519524SHoward Hinnant} 25073e519524SHoward Hinnant 25083e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25093e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 25103e519524SHoward Hinnant initializer_list<value_type> __il) 25113e519524SHoward Hinnant{ 2512e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 25133e519524SHoward Hinnant insert(__il.begin(), __il.end()); 25143e519524SHoward Hinnant} 25153e519524SHoward Hinnant 25163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25173e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 25183e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 25193e519524SHoward Hinnant const key_equal& __eql) 25203e519524SHoward Hinnant : __table_(__hf, __eql) 25213e519524SHoward Hinnant{ 2522e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2523*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 25243e519524SHoward Hinnant insert(__il.begin(), __il.end()); 25253e519524SHoward Hinnant} 25263e519524SHoward Hinnant 25273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25283e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( 25293e519524SHoward Hinnant initializer_list<value_type> __il, size_type __n, const hasher& __hf, 25303e519524SHoward Hinnant const key_equal& __eql, const allocator_type& __a) 25312a10c960SMarshall Clow : __table_(__hf, __eql, typename __table::allocator_type(__a)) 25323e519524SHoward Hinnant{ 2533e3cf7050SNikolas Klauser _VSTD::__debug_db_insert_c(this); 2534*3085e42fSIvan Trofimov __table_.__rehash_multi(__n); 25353e519524SHoward Hinnant insert(__il.begin(), __il.end()); 25363e519524SHoward Hinnant} 25373e519524SHoward Hinnant 25383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2539cd31b434SEvgeniy Stepanovinline 25403e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 25413e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u) 25423714107eSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) 25433e519524SHoward Hinnant{ 2544ce48a113SHoward Hinnant __table_ = _VSTD::move(__u.__table_); 25453e519524SHoward Hinnant return *this; 25463e519524SHoward Hinnant} 25473e519524SHoward Hinnant 25483e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2549cd31b434SEvgeniy Stepanovinline 25503e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& 25513e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( 25523e519524SHoward Hinnant initializer_list<value_type> __il) 25533e519524SHoward Hinnant{ 25543e519524SHoward Hinnant __table_.__assign_multi(__il.begin(), __il.end()); 25553e519524SHoward Hinnant return *this; 25563e519524SHoward Hinnant} 25573e519524SHoward Hinnant 25586a470bcbSEric Fiselier#endif // _LIBCPP_CXX03_LANG 255954976f26SHoward Hinnant 25603e519524SHoward Hinnant 25613e519524SHoward Hinnant 25623e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25633e519524SHoward Hinnanttemplate <class _InputIterator> 2564cd31b434SEvgeniy Stepanovinline 25653e519524SHoward Hinnantvoid 25663e519524SHoward Hinnantunordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, 25673e519524SHoward Hinnant _InputIterator __last) 25683e519524SHoward Hinnant{ 25693e519524SHoward Hinnant for (; __first != __last; ++__first) 25703e519524SHoward Hinnant __table_.__insert_multi(*__first); 25713e519524SHoward Hinnant} 25723e519524SHoward Hinnant 25733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2574789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 25753e519524SHoward Hinnantvoid 25763e519524SHoward Hinnantswap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 25773e519524SHoward Hinnant unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 25783714107eSHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 25793e519524SHoward Hinnant{ 25803e519524SHoward Hinnant __x.swap(__y); 25813e519524SHoward Hinnant} 25823e519524SHoward Hinnant 2583f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 25843e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc, 25853e895085SMarek Kurdej class _Predicate> 2586f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 25873e895085SMarek Kurdej typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type 25883e895085SMarek Kurdej erase_if(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __c, 25893e895085SMarek Kurdej _Predicate __pred) { 25902ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 25913e895085SMarek Kurdej} 2592f60c63c0SMarshall Clow#endif 2593f60c63c0SMarshall Clow 25943e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 25953e519524SHoward Hinnantbool 25963e519524SHoward Hinnantoperator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 25973e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 25983e519524SHoward Hinnant{ 25993e519524SHoward Hinnant if (__x.size() != __y.size()) 26003e519524SHoward Hinnant return false; 26013e519524SHoward Hinnant typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator 26023e519524SHoward Hinnant const_iterator; 26033e519524SHoward Hinnant typedef pair<const_iterator, const_iterator> _EqRng; 26043e519524SHoward Hinnant for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) 26053e519524SHoward Hinnant { 26063e519524SHoward Hinnant _EqRng __xeq = __x.equal_range(__i->first); 26073e519524SHoward Hinnant _EqRng __yeq = __y.equal_range(__i->first); 2608ce48a113SHoward Hinnant if (_VSTD::distance(__xeq.first, __xeq.second) != 2609ce48a113SHoward Hinnant _VSTD::distance(__yeq.first, __yeq.second) || 2610ce48a113SHoward Hinnant !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) 26113e519524SHoward Hinnant return false; 26123e519524SHoward Hinnant __i = __xeq.second; 26133e519524SHoward Hinnant } 26143e519524SHoward Hinnant return true; 26153e519524SHoward Hinnant} 26163e519524SHoward Hinnant 26173e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2618789847ddSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 26193e519524SHoward Hinnantbool 26203e519524SHoward Hinnantoperator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 26213e519524SHoward Hinnant const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 26223e519524SHoward Hinnant{ 26233e519524SHoward Hinnant return !(__x == __y); 26243e519524SHoward Hinnant} 26253e519524SHoward Hinnant 26263e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 26273e519524SHoward Hinnant 26283e519524SHoward Hinnant#endif // _LIBCPP_UNORDERED_MAP 2629