1*38fd1498Szrj// Debugging unordered_map/unordered_multimap implementation -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj// Copyright (C) 2003-2018 Free Software Foundation, Inc. 4*38fd1498Szrj// 5*38fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj// software; you can redistribute it and/or modify it under the 7*38fd1498Szrj// terms of the GNU General Public License as published by the 8*38fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj// any later version. 10*38fd1498Szrj 11*38fd1498Szrj// This library is distributed in the hope that it will be useful, 12*38fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj// GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj// 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj// You should have received a copy of the GNU General Public License and 21*38fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj// <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj/** @file debug/unordered_map 26*38fd1498Szrj * This file is a GNU debug extension to the Standard C++ Library. 27*38fd1498Szrj */ 28*38fd1498Szrj 29*38fd1498Szrj#ifndef _GLIBCXX_DEBUG_UNORDERED_MAP 30*38fd1498Szrj#define _GLIBCXX_DEBUG_UNORDERED_MAP 1 31*38fd1498Szrj 32*38fd1498Szrj#pragma GCC system_header 33*38fd1498Szrj 34*38fd1498Szrj#if __cplusplus < 201103L 35*38fd1498Szrj# include <bits/c++0x_warning.h> 36*38fd1498Szrj#else 37*38fd1498Szrj# include <unordered_map> 38*38fd1498Szrj 39*38fd1498Szrj#include <debug/safe_unordered_container.h> 40*38fd1498Szrj#include <debug/safe_container.h> 41*38fd1498Szrj#include <debug/safe_iterator.h> 42*38fd1498Szrj#include <debug/safe_local_iterator.h> 43*38fd1498Szrj 44*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 45*38fd1498Szrj{ 46*38fd1498Szrjnamespace __debug 47*38fd1498Szrj{ 48*38fd1498Szrj /// Class std::unordered_map with safety/checking/debug instrumentation. 49*38fd1498Szrj template<typename _Key, typename _Tp, 50*38fd1498Szrj typename _Hash = std::hash<_Key>, 51*38fd1498Szrj typename _Pred = std::equal_to<_Key>, 52*38fd1498Szrj typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > 53*38fd1498Szrj class unordered_map 54*38fd1498Szrj : public __gnu_debug::_Safe_container< 55*38fd1498Szrj unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>, _Alloc, 56*38fd1498Szrj __gnu_debug::_Safe_unordered_container>, 57*38fd1498Szrj public _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc> 58*38fd1498Szrj { 59*38fd1498Szrj typedef _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, 60*38fd1498Szrj _Pred, _Alloc> _Base; 61*38fd1498Szrj typedef __gnu_debug::_Safe_container<unordered_map, 62*38fd1498Szrj _Alloc, __gnu_debug::_Safe_unordered_container> _Safe; 63*38fd1498Szrj typedef typename _Base::const_iterator _Base_const_iterator; 64*38fd1498Szrj typedef typename _Base::iterator _Base_iterator; 65*38fd1498Szrj typedef typename _Base::const_local_iterator 66*38fd1498Szrj _Base_const_local_iterator; 67*38fd1498Szrj typedef typename _Base::local_iterator _Base_local_iterator; 68*38fd1498Szrj 69*38fd1498Szrj public: 70*38fd1498Szrj typedef typename _Base::size_type size_type; 71*38fd1498Szrj typedef typename _Base::hasher hasher; 72*38fd1498Szrj typedef typename _Base::key_equal key_equal; 73*38fd1498Szrj typedef typename _Base::allocator_type allocator_type; 74*38fd1498Szrj 75*38fd1498Szrj typedef typename _Base::key_type key_type; 76*38fd1498Szrj typedef typename _Base::value_type value_type; 77*38fd1498Szrj 78*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 79*38fd1498Szrj _Base_iterator, unordered_map> iterator; 80*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 81*38fd1498Szrj _Base_const_iterator, unordered_map> const_iterator; 82*38fd1498Szrj typedef __gnu_debug::_Safe_local_iterator< 83*38fd1498Szrj _Base_local_iterator, unordered_map> local_iterator; 84*38fd1498Szrj typedef __gnu_debug::_Safe_local_iterator< 85*38fd1498Szrj _Base_const_local_iterator, unordered_map> const_local_iterator; 86*38fd1498Szrj 87*38fd1498Szrj unordered_map() = default; 88*38fd1498Szrj 89*38fd1498Szrj explicit 90*38fd1498Szrj unordered_map(size_type __n, 91*38fd1498Szrj const hasher& __hf = hasher(), 92*38fd1498Szrj const key_equal& __eql = key_equal(), 93*38fd1498Szrj const allocator_type& __a = allocator_type()) 94*38fd1498Szrj : _Base(__n, __hf, __eql, __a) { } 95*38fd1498Szrj 96*38fd1498Szrj template<typename _InputIterator> 97*38fd1498Szrj unordered_map(_InputIterator __first, _InputIterator __last, 98*38fd1498Szrj size_type __n = 0, 99*38fd1498Szrj const hasher& __hf = hasher(), 100*38fd1498Szrj const key_equal& __eql = key_equal(), 101*38fd1498Szrj const allocator_type& __a = allocator_type()) 102*38fd1498Szrj : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, 103*38fd1498Szrj __last)), 104*38fd1498Szrj __gnu_debug::__base(__last), __n, 105*38fd1498Szrj __hf, __eql, __a) { } 106*38fd1498Szrj 107*38fd1498Szrj unordered_map(const unordered_map&) = default; 108*38fd1498Szrj 109*38fd1498Szrj unordered_map(const _Base& __x) 110*38fd1498Szrj : _Base(__x) { } 111*38fd1498Szrj 112*38fd1498Szrj unordered_map(unordered_map&&) = default; 113*38fd1498Szrj 114*38fd1498Szrj explicit 115*38fd1498Szrj unordered_map(const allocator_type& __a) 116*38fd1498Szrj : _Base(__a) { } 117*38fd1498Szrj 118*38fd1498Szrj unordered_map(const unordered_map& __umap, 119*38fd1498Szrj const allocator_type& __a) 120*38fd1498Szrj : _Base(__umap, __a) { } 121*38fd1498Szrj 122*38fd1498Szrj unordered_map(unordered_map&& __umap, 123*38fd1498Szrj const allocator_type& __a) 124*38fd1498Szrj : _Safe(std::move(__umap._M_safe()), __a), 125*38fd1498Szrj _Base(std::move(__umap._M_base()), __a) { } 126*38fd1498Szrj 127*38fd1498Szrj unordered_map(initializer_list<value_type> __l, 128*38fd1498Szrj size_type __n = 0, 129*38fd1498Szrj const hasher& __hf = hasher(), 130*38fd1498Szrj const key_equal& __eql = key_equal(), 131*38fd1498Szrj const allocator_type& __a = allocator_type()) 132*38fd1498Szrj : _Base(__l, __n, __hf, __eql, __a) { } 133*38fd1498Szrj 134*38fd1498Szrj unordered_map(size_type __n, const allocator_type& __a) 135*38fd1498Szrj : unordered_map(__n, hasher(), key_equal(), __a) 136*38fd1498Szrj { } 137*38fd1498Szrj 138*38fd1498Szrj unordered_map(size_type __n, 139*38fd1498Szrj const hasher& __hf, 140*38fd1498Szrj const allocator_type& __a) 141*38fd1498Szrj : unordered_map(__n, __hf, key_equal(), __a) 142*38fd1498Szrj { } 143*38fd1498Szrj 144*38fd1498Szrj template<typename _InputIterator> 145*38fd1498Szrj unordered_map(_InputIterator __first, _InputIterator __last, 146*38fd1498Szrj size_type __n, 147*38fd1498Szrj const allocator_type& __a) 148*38fd1498Szrj : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) 149*38fd1498Szrj { } 150*38fd1498Szrj 151*38fd1498Szrj template<typename _InputIterator> 152*38fd1498Szrj unordered_map(_InputIterator __first, _InputIterator __last, 153*38fd1498Szrj size_type __n, 154*38fd1498Szrj const hasher& __hf, 155*38fd1498Szrj const allocator_type& __a) 156*38fd1498Szrj : unordered_map(__first, __last, __n, __hf, key_equal(), __a) 157*38fd1498Szrj { } 158*38fd1498Szrj 159*38fd1498Szrj unordered_map(initializer_list<value_type> __l, 160*38fd1498Szrj size_type __n, 161*38fd1498Szrj const allocator_type& __a) 162*38fd1498Szrj : unordered_map(__l, __n, hasher(), key_equal(), __a) 163*38fd1498Szrj { } 164*38fd1498Szrj 165*38fd1498Szrj unordered_map(initializer_list<value_type> __l, 166*38fd1498Szrj size_type __n, 167*38fd1498Szrj const hasher& __hf, 168*38fd1498Szrj const allocator_type& __a) 169*38fd1498Szrj : unordered_map(__l, __n, __hf, key_equal(), __a) 170*38fd1498Szrj { } 171*38fd1498Szrj 172*38fd1498Szrj ~unordered_map() = default; 173*38fd1498Szrj 174*38fd1498Szrj unordered_map& 175*38fd1498Szrj operator=(const unordered_map&) = default; 176*38fd1498Szrj 177*38fd1498Szrj unordered_map& 178*38fd1498Szrj operator=(unordered_map&&) = default; 179*38fd1498Szrj 180*38fd1498Szrj unordered_map& 181*38fd1498Szrj operator=(initializer_list<value_type> __l) 182*38fd1498Szrj { 183*38fd1498Szrj _M_base() = __l; 184*38fd1498Szrj this->_M_invalidate_all(); 185*38fd1498Szrj return *this; 186*38fd1498Szrj } 187*38fd1498Szrj 188*38fd1498Szrj void 189*38fd1498Szrj swap(unordered_map& __x) 190*38fd1498Szrj noexcept( noexcept(declval<_Base&>().swap(__x)) ) 191*38fd1498Szrj { 192*38fd1498Szrj _Safe::_M_swap(__x); 193*38fd1498Szrj _Base::swap(__x); 194*38fd1498Szrj } 195*38fd1498Szrj 196*38fd1498Szrj void 197*38fd1498Szrj clear() noexcept 198*38fd1498Szrj { 199*38fd1498Szrj _Base::clear(); 200*38fd1498Szrj this->_M_invalidate_all(); 201*38fd1498Szrj } 202*38fd1498Szrj 203*38fd1498Szrj iterator 204*38fd1498Szrj begin() noexcept 205*38fd1498Szrj { return iterator(_Base::begin(), this); } 206*38fd1498Szrj 207*38fd1498Szrj const_iterator 208*38fd1498Szrj begin() const noexcept 209*38fd1498Szrj { return const_iterator(_Base::begin(), this); } 210*38fd1498Szrj 211*38fd1498Szrj iterator 212*38fd1498Szrj end() noexcept 213*38fd1498Szrj { return iterator(_Base::end(), this); } 214*38fd1498Szrj 215*38fd1498Szrj const_iterator 216*38fd1498Szrj end() const noexcept 217*38fd1498Szrj { return const_iterator(_Base::end(), this); } 218*38fd1498Szrj 219*38fd1498Szrj const_iterator 220*38fd1498Szrj cbegin() const noexcept 221*38fd1498Szrj { return const_iterator(_Base::begin(), this); } 222*38fd1498Szrj 223*38fd1498Szrj const_iterator 224*38fd1498Szrj cend() const noexcept 225*38fd1498Szrj { return const_iterator(_Base::end(), this); } 226*38fd1498Szrj 227*38fd1498Szrj // local versions 228*38fd1498Szrj local_iterator 229*38fd1498Szrj begin(size_type __b) 230*38fd1498Szrj { 231*38fd1498Szrj __glibcxx_check_bucket_index(__b); 232*38fd1498Szrj return local_iterator(_Base::begin(__b), this); 233*38fd1498Szrj } 234*38fd1498Szrj 235*38fd1498Szrj local_iterator 236*38fd1498Szrj end(size_type __b) 237*38fd1498Szrj { 238*38fd1498Szrj __glibcxx_check_bucket_index(__b); 239*38fd1498Szrj return local_iterator(_Base::end(__b), this); 240*38fd1498Szrj } 241*38fd1498Szrj 242*38fd1498Szrj const_local_iterator 243*38fd1498Szrj begin(size_type __b) const 244*38fd1498Szrj { 245*38fd1498Szrj __glibcxx_check_bucket_index(__b); 246*38fd1498Szrj return const_local_iterator(_Base::begin(__b), this); 247*38fd1498Szrj } 248*38fd1498Szrj 249*38fd1498Szrj const_local_iterator 250*38fd1498Szrj end(size_type __b) const 251*38fd1498Szrj { 252*38fd1498Szrj __glibcxx_check_bucket_index(__b); 253*38fd1498Szrj return const_local_iterator(_Base::end(__b), this); 254*38fd1498Szrj } 255*38fd1498Szrj 256*38fd1498Szrj const_local_iterator 257*38fd1498Szrj cbegin(size_type __b) const 258*38fd1498Szrj { 259*38fd1498Szrj __glibcxx_check_bucket_index(__b); 260*38fd1498Szrj return const_local_iterator(_Base::cbegin(__b), this); 261*38fd1498Szrj } 262*38fd1498Szrj 263*38fd1498Szrj const_local_iterator 264*38fd1498Szrj cend(size_type __b) const 265*38fd1498Szrj { 266*38fd1498Szrj __glibcxx_check_bucket_index(__b); 267*38fd1498Szrj return const_local_iterator(_Base::cend(__b), this); 268*38fd1498Szrj } 269*38fd1498Szrj 270*38fd1498Szrj size_type 271*38fd1498Szrj bucket_size(size_type __b) const 272*38fd1498Szrj { 273*38fd1498Szrj __glibcxx_check_bucket_index(__b); 274*38fd1498Szrj return _Base::bucket_size(__b); 275*38fd1498Szrj } 276*38fd1498Szrj 277*38fd1498Szrj float 278*38fd1498Szrj max_load_factor() const noexcept 279*38fd1498Szrj { return _Base::max_load_factor(); } 280*38fd1498Szrj 281*38fd1498Szrj void 282*38fd1498Szrj max_load_factor(float __f) 283*38fd1498Szrj { 284*38fd1498Szrj __glibcxx_check_max_load_factor(__f); 285*38fd1498Szrj _Base::max_load_factor(__f); 286*38fd1498Szrj } 287*38fd1498Szrj 288*38fd1498Szrj template<typename... _Args> 289*38fd1498Szrj std::pair<iterator, bool> 290*38fd1498Szrj emplace(_Args&&... __args) 291*38fd1498Szrj { 292*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 293*38fd1498Szrj std::pair<_Base_iterator, bool> __res 294*38fd1498Szrj = _Base::emplace(std::forward<_Args>(__args)...); 295*38fd1498Szrj _M_check_rehashed(__bucket_count); 296*38fd1498Szrj return std::make_pair(iterator(__res.first, this), __res.second); 297*38fd1498Szrj } 298*38fd1498Szrj 299*38fd1498Szrj template<typename... _Args> 300*38fd1498Szrj iterator 301*38fd1498Szrj emplace_hint(const_iterator __hint, _Args&&... __args) 302*38fd1498Szrj { 303*38fd1498Szrj __glibcxx_check_insert(__hint); 304*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 305*38fd1498Szrj _Base_iterator __it = _Base::emplace_hint(__hint.base(), 306*38fd1498Szrj std::forward<_Args>(__args)...); 307*38fd1498Szrj _M_check_rehashed(__bucket_count); 308*38fd1498Szrj return iterator(__it, this); 309*38fd1498Szrj } 310*38fd1498Szrj 311*38fd1498Szrj std::pair<iterator, bool> 312*38fd1498Szrj insert(const value_type& __obj) 313*38fd1498Szrj { 314*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 315*38fd1498Szrj auto __res = _Base::insert(__obj); 316*38fd1498Szrj _M_check_rehashed(__bucket_count); 317*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 318*38fd1498Szrj } 319*38fd1498Szrj 320*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 321*38fd1498Szrj // 2354. Unnecessary copying when inserting into maps with braced-init 322*38fd1498Szrj std::pair<iterator, bool> 323*38fd1498Szrj insert(value_type&& __x) 324*38fd1498Szrj { 325*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 326*38fd1498Szrj auto __res = _Base::insert(std::move(__x)); 327*38fd1498Szrj _M_check_rehashed(__bucket_count); 328*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 329*38fd1498Szrj } 330*38fd1498Szrj 331*38fd1498Szrj template<typename _Pair, typename = typename 332*38fd1498Szrj std::enable_if<std::is_constructible<value_type, 333*38fd1498Szrj _Pair&&>::value>::type> 334*38fd1498Szrj std::pair<iterator, bool> 335*38fd1498Szrj insert(_Pair&& __obj) 336*38fd1498Szrj { 337*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 338*38fd1498Szrj std::pair<_Base_iterator, bool> __res = 339*38fd1498Szrj _Base::insert(std::forward<_Pair>(__obj)); 340*38fd1498Szrj _M_check_rehashed(__bucket_count); 341*38fd1498Szrj return std::make_pair(iterator(__res.first, this), __res.second); 342*38fd1498Szrj } 343*38fd1498Szrj 344*38fd1498Szrj iterator 345*38fd1498Szrj insert(const_iterator __hint, const value_type& __obj) 346*38fd1498Szrj { 347*38fd1498Szrj __glibcxx_check_insert(__hint); 348*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 349*38fd1498Szrj _Base_iterator __it = _Base::insert(__hint.base(), __obj); 350*38fd1498Szrj _M_check_rehashed(__bucket_count); 351*38fd1498Szrj return iterator(__it, this); 352*38fd1498Szrj } 353*38fd1498Szrj 354*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 355*38fd1498Szrj // 2354. Unnecessary copying when inserting into maps with braced-init 356*38fd1498Szrj iterator 357*38fd1498Szrj insert(const_iterator __hint, value_type&& __x) 358*38fd1498Szrj { 359*38fd1498Szrj __glibcxx_check_insert(__hint); 360*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 361*38fd1498Szrj auto __it = _Base::insert(__hint.base(), std::move(__x)); 362*38fd1498Szrj _M_check_rehashed(__bucket_count); 363*38fd1498Szrj return iterator(__it, this); 364*38fd1498Szrj } 365*38fd1498Szrj 366*38fd1498Szrj template<typename _Pair, typename = typename 367*38fd1498Szrj std::enable_if<std::is_constructible<value_type, 368*38fd1498Szrj _Pair&&>::value>::type> 369*38fd1498Szrj iterator 370*38fd1498Szrj insert(const_iterator __hint, _Pair&& __obj) 371*38fd1498Szrj { 372*38fd1498Szrj __glibcxx_check_insert(__hint); 373*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 374*38fd1498Szrj _Base_iterator __it = 375*38fd1498Szrj _Base::insert(__hint.base(), std::forward<_Pair>(__obj)); 376*38fd1498Szrj _M_check_rehashed(__bucket_count); 377*38fd1498Szrj return iterator(__it, this); 378*38fd1498Szrj } 379*38fd1498Szrj 380*38fd1498Szrj void 381*38fd1498Szrj insert(std::initializer_list<value_type> __l) 382*38fd1498Szrj { 383*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 384*38fd1498Szrj _Base::insert(__l); 385*38fd1498Szrj _M_check_rehashed(__bucket_count); 386*38fd1498Szrj } 387*38fd1498Szrj 388*38fd1498Szrj template<typename _InputIterator> 389*38fd1498Szrj void 390*38fd1498Szrj insert(_InputIterator __first, _InputIterator __last) 391*38fd1498Szrj { 392*38fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 393*38fd1498Szrj __glibcxx_check_valid_range2(__first, __last, __dist); 394*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 395*38fd1498Szrj 396*38fd1498Szrj if (__dist.second >= __gnu_debug::__dp_sign) 397*38fd1498Szrj _Base::insert(__gnu_debug::__unsafe(__first), 398*38fd1498Szrj __gnu_debug::__unsafe(__last)); 399*38fd1498Szrj else 400*38fd1498Szrj _Base::insert(__first, __last); 401*38fd1498Szrj 402*38fd1498Szrj _M_check_rehashed(__bucket_count); 403*38fd1498Szrj } 404*38fd1498Szrj 405*38fd1498Szrj#if __cplusplus > 201402L 406*38fd1498Szrj template <typename... _Args> 407*38fd1498Szrj pair<iterator, bool> 408*38fd1498Szrj try_emplace(const key_type& __k, _Args&&... __args) 409*38fd1498Szrj { 410*38fd1498Szrj auto __res = _Base::try_emplace(__k, 411*38fd1498Szrj std::forward<_Args>(__args)...); 412*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 413*38fd1498Szrj } 414*38fd1498Szrj 415*38fd1498Szrj template <typename... _Args> 416*38fd1498Szrj pair<iterator, bool> 417*38fd1498Szrj try_emplace(key_type&& __k, _Args&&... __args) 418*38fd1498Szrj { 419*38fd1498Szrj auto __res = _Base::try_emplace(std::move(__k), 420*38fd1498Szrj std::forward<_Args>(__args)...); 421*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 422*38fd1498Szrj } 423*38fd1498Szrj 424*38fd1498Szrj template <typename... _Args> 425*38fd1498Szrj iterator 426*38fd1498Szrj try_emplace(const_iterator __hint, const key_type& __k, 427*38fd1498Szrj _Args&&... __args) 428*38fd1498Szrj { 429*38fd1498Szrj __glibcxx_check_insert(__hint); 430*38fd1498Szrj return iterator(_Base::try_emplace(__hint.base(), __k, 431*38fd1498Szrj std::forward<_Args>(__args)...), 432*38fd1498Szrj this); 433*38fd1498Szrj } 434*38fd1498Szrj 435*38fd1498Szrj template <typename... _Args> 436*38fd1498Szrj iterator 437*38fd1498Szrj try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args) 438*38fd1498Szrj { 439*38fd1498Szrj __glibcxx_check_insert(__hint); 440*38fd1498Szrj return iterator(_Base::try_emplace(__hint.base(), std::move(__k), 441*38fd1498Szrj std::forward<_Args>(__args)...), 442*38fd1498Szrj this); 443*38fd1498Szrj } 444*38fd1498Szrj 445*38fd1498Szrj template <typename _Obj> 446*38fd1498Szrj pair<iterator, bool> 447*38fd1498Szrj insert_or_assign(const key_type& __k, _Obj&& __obj) 448*38fd1498Szrj { 449*38fd1498Szrj auto __res = _Base::insert_or_assign(__k, 450*38fd1498Szrj std::forward<_Obj>(__obj)); 451*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 452*38fd1498Szrj } 453*38fd1498Szrj 454*38fd1498Szrj template <typename _Obj> 455*38fd1498Szrj pair<iterator, bool> 456*38fd1498Szrj insert_or_assign(key_type&& __k, _Obj&& __obj) 457*38fd1498Szrj { 458*38fd1498Szrj auto __res = _Base::insert_or_assign(std::move(__k), 459*38fd1498Szrj std::forward<_Obj>(__obj)); 460*38fd1498Szrj return { iterator(__res.first, this), __res.second }; 461*38fd1498Szrj } 462*38fd1498Szrj 463*38fd1498Szrj template <typename _Obj> 464*38fd1498Szrj iterator 465*38fd1498Szrj insert_or_assign(const_iterator __hint, const key_type& __k, 466*38fd1498Szrj _Obj&& __obj) 467*38fd1498Szrj { 468*38fd1498Szrj __glibcxx_check_insert(__hint); 469*38fd1498Szrj return iterator(_Base::insert_or_assign(__hint.base(), __k, 470*38fd1498Szrj std::forward<_Obj>(__obj)), 471*38fd1498Szrj this); 472*38fd1498Szrj } 473*38fd1498Szrj 474*38fd1498Szrj template <typename _Obj> 475*38fd1498Szrj iterator 476*38fd1498Szrj insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj) 477*38fd1498Szrj { 478*38fd1498Szrj __glibcxx_check_insert(__hint); 479*38fd1498Szrj return iterator(_Base::insert_or_assign(__hint.base(), 480*38fd1498Szrj std::move(__k), 481*38fd1498Szrj std::forward<_Obj>(__obj)), 482*38fd1498Szrj this); 483*38fd1498Szrj } 484*38fd1498Szrj#endif // C++17 485*38fd1498Szrj 486*38fd1498Szrj#if __cplusplus > 201402L 487*38fd1498Szrj using node_type = typename _Base::node_type; 488*38fd1498Szrj using insert_return_type = _Node_insert_return<iterator, node_type>; 489*38fd1498Szrj 490*38fd1498Szrj node_type 491*38fd1498Szrj extract(const_iterator __position) 492*38fd1498Szrj { 493*38fd1498Szrj __glibcxx_check_erase(__position); 494*38fd1498Szrj _Base_const_iterator __victim = __position.base(); 495*38fd1498Szrj this->_M_invalidate_if( 496*38fd1498Szrj [__victim](_Base_const_iterator __it) { return __it == __victim; } 497*38fd1498Szrj ); 498*38fd1498Szrj this->_M_invalidate_local_if( 499*38fd1498Szrj [__victim](_Base_const_local_iterator __it) { 500*38fd1498Szrj return __it._M_curr() == __victim._M_cur; 501*38fd1498Szrj }); 502*38fd1498Szrj return _Base::extract(__position.base()); 503*38fd1498Szrj } 504*38fd1498Szrj 505*38fd1498Szrj node_type 506*38fd1498Szrj extract(const key_type& __key) 507*38fd1498Szrj { 508*38fd1498Szrj const auto __position = find(__key); 509*38fd1498Szrj if (__position != end()) 510*38fd1498Szrj return extract(__position); 511*38fd1498Szrj return {}; 512*38fd1498Szrj } 513*38fd1498Szrj 514*38fd1498Szrj insert_return_type 515*38fd1498Szrj insert(node_type&& __nh) 516*38fd1498Szrj { 517*38fd1498Szrj auto __ret = _Base::insert(std::move(__nh)); 518*38fd1498Szrj iterator __pos = iterator(__ret.position, this); 519*38fd1498Szrj return { __pos, __ret.inserted, std::move(__ret.node) }; 520*38fd1498Szrj } 521*38fd1498Szrj 522*38fd1498Szrj iterator 523*38fd1498Szrj insert(const_iterator __hint, node_type&& __nh) 524*38fd1498Szrj { 525*38fd1498Szrj __glibcxx_check_insert(__hint); 526*38fd1498Szrj return iterator(_Base::insert(__hint.base(), std::move(__nh)), this); 527*38fd1498Szrj } 528*38fd1498Szrj 529*38fd1498Szrj using _Base::merge; 530*38fd1498Szrj#endif // C++17 531*38fd1498Szrj 532*38fd1498Szrj iterator 533*38fd1498Szrj find(const key_type& __key) 534*38fd1498Szrj { return iterator(_Base::find(__key), this); } 535*38fd1498Szrj 536*38fd1498Szrj const_iterator 537*38fd1498Szrj find(const key_type& __key) const 538*38fd1498Szrj { return const_iterator(_Base::find(__key), this); } 539*38fd1498Szrj 540*38fd1498Szrj std::pair<iterator, iterator> 541*38fd1498Szrj equal_range(const key_type& __key) 542*38fd1498Szrj { 543*38fd1498Szrj std::pair<_Base_iterator, _Base_iterator> __res = 544*38fd1498Szrj _Base::equal_range(__key); 545*38fd1498Szrj return std::make_pair(iterator(__res.first, this), 546*38fd1498Szrj iterator(__res.second, this)); 547*38fd1498Szrj } 548*38fd1498Szrj 549*38fd1498Szrj std::pair<const_iterator, const_iterator> 550*38fd1498Szrj equal_range(const key_type& __key) const 551*38fd1498Szrj { 552*38fd1498Szrj std::pair<_Base_const_iterator, _Base_const_iterator> __res = 553*38fd1498Szrj _Base::equal_range(__key); 554*38fd1498Szrj return std::make_pair(const_iterator(__res.first, this), 555*38fd1498Szrj const_iterator(__res.second, this)); 556*38fd1498Szrj } 557*38fd1498Szrj 558*38fd1498Szrj size_type 559*38fd1498Szrj erase(const key_type& __key) 560*38fd1498Szrj { 561*38fd1498Szrj size_type __ret(0); 562*38fd1498Szrj _Base_iterator __victim(_Base::find(__key)); 563*38fd1498Szrj if (__victim != _Base::end()) 564*38fd1498Szrj { 565*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 566*38fd1498Szrj { return __it == __victim; }); 567*38fd1498Szrj this->_M_invalidate_local_if( 568*38fd1498Szrj [__victim](_Base_const_local_iterator __it) 569*38fd1498Szrj { return __it._M_curr() == __victim._M_cur; }); 570*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 571*38fd1498Szrj _Base::erase(__victim); 572*38fd1498Szrj _M_check_rehashed(__bucket_count); 573*38fd1498Szrj __ret = 1; 574*38fd1498Szrj } 575*38fd1498Szrj return __ret; 576*38fd1498Szrj } 577*38fd1498Szrj 578*38fd1498Szrj iterator 579*38fd1498Szrj erase(const_iterator __it) 580*38fd1498Szrj { 581*38fd1498Szrj __glibcxx_check_erase(__it); 582*38fd1498Szrj _Base_const_iterator __victim = __it.base(); 583*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 584*38fd1498Szrj { return __it == __victim; }); 585*38fd1498Szrj this->_M_invalidate_local_if( 586*38fd1498Szrj [__victim](_Base_const_local_iterator __it) 587*38fd1498Szrj { return __it._M_curr() == __victim._M_cur; }); 588*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 589*38fd1498Szrj _Base_iterator __next = _Base::erase(__it.base()); 590*38fd1498Szrj _M_check_rehashed(__bucket_count); 591*38fd1498Szrj return iterator(__next, this); 592*38fd1498Szrj } 593*38fd1498Szrj 594*38fd1498Szrj iterator 595*38fd1498Szrj erase(iterator __it) 596*38fd1498Szrj { return erase(const_iterator(__it)); } 597*38fd1498Szrj 598*38fd1498Szrj iterator 599*38fd1498Szrj erase(const_iterator __first, const_iterator __last) 600*38fd1498Szrj { 601*38fd1498Szrj __glibcxx_check_erase_range(__first, __last); 602*38fd1498Szrj for (_Base_const_iterator __tmp = __first.base(); 603*38fd1498Szrj __tmp != __last.base(); ++__tmp) 604*38fd1498Szrj { 605*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::end(), 606*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range) 607*38fd1498Szrj ._M_iterator(__first, "first") 608*38fd1498Szrj ._M_iterator(__last, "last")); 609*38fd1498Szrj this->_M_invalidate_if([__tmp](_Base_const_iterator __it) 610*38fd1498Szrj { return __it == __tmp; }); 611*38fd1498Szrj this->_M_invalidate_local_if( 612*38fd1498Szrj [__tmp](_Base_const_local_iterator __it) 613*38fd1498Szrj { return __it._M_curr() == __tmp._M_cur; }); 614*38fd1498Szrj } 615*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 616*38fd1498Szrj _Base_iterator __next = _Base::erase(__first.base(), __last.base()); 617*38fd1498Szrj _M_check_rehashed(__bucket_count); 618*38fd1498Szrj return iterator(__next, this); 619*38fd1498Szrj } 620*38fd1498Szrj 621*38fd1498Szrj _Base& 622*38fd1498Szrj _M_base() noexcept { return *this; } 623*38fd1498Szrj 624*38fd1498Szrj const _Base& 625*38fd1498Szrj _M_base() const noexcept { return *this; } 626*38fd1498Szrj 627*38fd1498Szrj private: 628*38fd1498Szrj void 629*38fd1498Szrj _M_check_rehashed(size_type __prev_count) 630*38fd1498Szrj { 631*38fd1498Szrj if (__prev_count != this->bucket_count()) 632*38fd1498Szrj this->_M_invalidate_locals(); 633*38fd1498Szrj } 634*38fd1498Szrj }; 635*38fd1498Szrj 636*38fd1498Szrj#if __cpp_deduction_guides >= 201606 637*38fd1498Szrj 638*38fd1498Szrj template<typename _InputIterator, 639*38fd1498Szrj typename _Hash = hash<__iter_key_t<_InputIterator>>, 640*38fd1498Szrj typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 641*38fd1498Szrj typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 642*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 643*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 644*38fd1498Szrj unordered_map(_InputIterator, _InputIterator, 645*38fd1498Szrj typename unordered_map<int, int>::size_type = {}, 646*38fd1498Szrj _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 647*38fd1498Szrj -> unordered_map<__iter_key_t<_InputIterator>, 648*38fd1498Szrj __iter_val_t<_InputIterator>, 649*38fd1498Szrj _Hash, _Pred, _Allocator>; 650*38fd1498Szrj 651*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash = hash<_Key>, 652*38fd1498Szrj typename _Pred = equal_to<_Key>, 653*38fd1498Szrj typename _Allocator = allocator<pair<const _Key, _Tp>>, 654*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 655*38fd1498Szrj unordered_map(initializer_list<pair<_Key, _Tp>>, 656*38fd1498Szrj typename unordered_map<int, int>::size_type = {}, 657*38fd1498Szrj _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 658*38fd1498Szrj -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>; 659*38fd1498Szrj 660*38fd1498Szrj template<typename _InputIterator, typename _Allocator, 661*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 662*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 663*38fd1498Szrj unordered_map(_InputIterator, _InputIterator, 664*38fd1498Szrj typename unordered_map<int, int>::size_type, _Allocator) 665*38fd1498Szrj -> unordered_map<__iter_key_t<_InputIterator>, 666*38fd1498Szrj __iter_val_t<_InputIterator>, 667*38fd1498Szrj hash<__iter_key_t<_InputIterator>>, 668*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, 669*38fd1498Szrj _Allocator>; 670*38fd1498Szrj 671*38fd1498Szrj template<typename _InputIterator, typename _Allocator, 672*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 673*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 674*38fd1498Szrj unordered_map(_InputIterator, _InputIterator, _Allocator) 675*38fd1498Szrj -> unordered_map<__iter_key_t<_InputIterator>, 676*38fd1498Szrj __iter_val_t<_InputIterator>, 677*38fd1498Szrj hash<__iter_key_t<_InputIterator>>, 678*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, 679*38fd1498Szrj _Allocator>; 680*38fd1498Szrj 681*38fd1498Szrj template<typename _InputIterator, typename _Hash, typename _Allocator, 682*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 683*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 684*38fd1498Szrj unordered_map(_InputIterator, _InputIterator, 685*38fd1498Szrj typename unordered_map<int, int>::size_type, 686*38fd1498Szrj _Hash, _Allocator) 687*38fd1498Szrj -> unordered_map<__iter_key_t<_InputIterator>, 688*38fd1498Szrj __iter_val_t<_InputIterator>, _Hash, 689*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 690*38fd1498Szrj 691*38fd1498Szrj template<typename _Key, typename _Tp, typename _Allocator, 692*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 693*38fd1498Szrj unordered_map(initializer_list<pair<_Key, _Tp>>, 694*38fd1498Szrj typename unordered_map<int, int>::size_type, 695*38fd1498Szrj _Allocator) 696*38fd1498Szrj -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 697*38fd1498Szrj 698*38fd1498Szrj template<typename _Key, typename _Tp, typename _Allocator, 699*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 700*38fd1498Szrj unordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator) 701*38fd1498Szrj -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 702*38fd1498Szrj 703*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, typename _Allocator, 704*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 705*38fd1498Szrj unordered_map(initializer_list<pair<_Key, _Tp>>, 706*38fd1498Szrj typename unordered_map<int, int>::size_type, 707*38fd1498Szrj _Hash, _Allocator) 708*38fd1498Szrj -> unordered_map<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 709*38fd1498Szrj 710*38fd1498Szrj#endif 711*38fd1498Szrj 712*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 713*38fd1498Szrj typename _Pred, typename _Alloc> 714*38fd1498Szrj inline void 715*38fd1498Szrj swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 716*38fd1498Szrj unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 717*38fd1498Szrj noexcept(noexcept(__x.swap(__y))) 718*38fd1498Szrj { __x.swap(__y); } 719*38fd1498Szrj 720*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 721*38fd1498Szrj typename _Pred, typename _Alloc> 722*38fd1498Szrj inline bool 723*38fd1498Szrj operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 724*38fd1498Szrj const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 725*38fd1498Szrj { return __x._M_base() == __y._M_base(); } 726*38fd1498Szrj 727*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 728*38fd1498Szrj typename _Pred, typename _Alloc> 729*38fd1498Szrj inline bool 730*38fd1498Szrj operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 731*38fd1498Szrj const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 732*38fd1498Szrj { return !(__x == __y); } 733*38fd1498Szrj 734*38fd1498Szrj 735*38fd1498Szrj /// Class std::unordered_multimap with safety/checking/debug instrumentation. 736*38fd1498Szrj template<typename _Key, typename _Tp, 737*38fd1498Szrj typename _Hash = std::hash<_Key>, 738*38fd1498Szrj typename _Pred = std::equal_to<_Key>, 739*38fd1498Szrj typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > 740*38fd1498Szrj class unordered_multimap 741*38fd1498Szrj : public __gnu_debug::_Safe_container< 742*38fd1498Szrj unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>, _Alloc, 743*38fd1498Szrj __gnu_debug::_Safe_unordered_container>, 744*38fd1498Szrj public _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc> 745*38fd1498Szrj { 746*38fd1498Szrj typedef _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, 747*38fd1498Szrj _Pred, _Alloc> _Base; 748*38fd1498Szrj typedef __gnu_debug::_Safe_container<unordered_multimap, 749*38fd1498Szrj _Alloc, __gnu_debug::_Safe_unordered_container> _Safe; 750*38fd1498Szrj typedef typename _Base::const_iterator _Base_const_iterator; 751*38fd1498Szrj typedef typename _Base::iterator _Base_iterator; 752*38fd1498Szrj typedef typename _Base::const_local_iterator _Base_const_local_iterator; 753*38fd1498Szrj typedef typename _Base::local_iterator _Base_local_iterator; 754*38fd1498Szrj 755*38fd1498Szrj public: 756*38fd1498Szrj typedef typename _Base::size_type size_type; 757*38fd1498Szrj typedef typename _Base::hasher hasher; 758*38fd1498Szrj typedef typename _Base::key_equal key_equal; 759*38fd1498Szrj typedef typename _Base::allocator_type allocator_type; 760*38fd1498Szrj 761*38fd1498Szrj typedef typename _Base::key_type key_type; 762*38fd1498Szrj typedef typename _Base::value_type value_type; 763*38fd1498Szrj 764*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 765*38fd1498Szrj _Base_iterator, unordered_multimap> iterator; 766*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 767*38fd1498Szrj _Base_const_iterator, unordered_multimap> const_iterator; 768*38fd1498Szrj typedef __gnu_debug::_Safe_local_iterator< 769*38fd1498Szrj _Base_local_iterator, unordered_multimap> local_iterator; 770*38fd1498Szrj typedef __gnu_debug::_Safe_local_iterator< 771*38fd1498Szrj _Base_const_local_iterator, unordered_multimap> const_local_iterator; 772*38fd1498Szrj 773*38fd1498Szrj unordered_multimap() = default; 774*38fd1498Szrj 775*38fd1498Szrj explicit 776*38fd1498Szrj unordered_multimap(size_type __n, 777*38fd1498Szrj const hasher& __hf = hasher(), 778*38fd1498Szrj const key_equal& __eql = key_equal(), 779*38fd1498Szrj const allocator_type& __a = allocator_type()) 780*38fd1498Szrj : _Base(__n, __hf, __eql, __a) { } 781*38fd1498Szrj 782*38fd1498Szrj template<typename _InputIterator> 783*38fd1498Szrj unordered_multimap(_InputIterator __first, _InputIterator __last, 784*38fd1498Szrj size_type __n = 0, 785*38fd1498Szrj const hasher& __hf = hasher(), 786*38fd1498Szrj const key_equal& __eql = key_equal(), 787*38fd1498Szrj const allocator_type& __a = allocator_type()) 788*38fd1498Szrj : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, 789*38fd1498Szrj __last)), 790*38fd1498Szrj __gnu_debug::__base(__last), __n, 791*38fd1498Szrj __hf, __eql, __a) { } 792*38fd1498Szrj 793*38fd1498Szrj unordered_multimap(const unordered_multimap&) = default; 794*38fd1498Szrj 795*38fd1498Szrj unordered_multimap(const _Base& __x) 796*38fd1498Szrj : _Base(__x) { } 797*38fd1498Szrj 798*38fd1498Szrj unordered_multimap(unordered_multimap&&) = default; 799*38fd1498Szrj 800*38fd1498Szrj explicit 801*38fd1498Szrj unordered_multimap(const allocator_type& __a) 802*38fd1498Szrj : _Base(__a) { } 803*38fd1498Szrj 804*38fd1498Szrj unordered_multimap(const unordered_multimap& __umap, 805*38fd1498Szrj const allocator_type& __a) 806*38fd1498Szrj : _Base(__umap, __a) { } 807*38fd1498Szrj 808*38fd1498Szrj unordered_multimap(unordered_multimap&& __umap, 809*38fd1498Szrj const allocator_type& __a) 810*38fd1498Szrj : _Safe(std::move(__umap._M_safe()), __a), 811*38fd1498Szrj _Base(std::move(__umap._M_base()), __a) { } 812*38fd1498Szrj 813*38fd1498Szrj unordered_multimap(initializer_list<value_type> __l, 814*38fd1498Szrj size_type __n = 0, 815*38fd1498Szrj const hasher& __hf = hasher(), 816*38fd1498Szrj const key_equal& __eql = key_equal(), 817*38fd1498Szrj const allocator_type& __a = allocator_type()) 818*38fd1498Szrj : _Base(__l, __n, __hf, __eql, __a) { } 819*38fd1498Szrj 820*38fd1498Szrj unordered_multimap(size_type __n, const allocator_type& __a) 821*38fd1498Szrj : unordered_multimap(__n, hasher(), key_equal(), __a) 822*38fd1498Szrj { } 823*38fd1498Szrj 824*38fd1498Szrj unordered_multimap(size_type __n, const hasher& __hf, 825*38fd1498Szrj const allocator_type& __a) 826*38fd1498Szrj : unordered_multimap(__n, __hf, key_equal(), __a) 827*38fd1498Szrj { } 828*38fd1498Szrj 829*38fd1498Szrj template<typename _InputIterator> 830*38fd1498Szrj unordered_multimap(_InputIterator __first, _InputIterator __last, 831*38fd1498Szrj size_type __n, 832*38fd1498Szrj const allocator_type& __a) 833*38fd1498Szrj : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) 834*38fd1498Szrj { } 835*38fd1498Szrj 836*38fd1498Szrj template<typename _InputIterator> 837*38fd1498Szrj unordered_multimap(_InputIterator __first, _InputIterator __last, 838*38fd1498Szrj size_type __n, const hasher& __hf, 839*38fd1498Szrj const allocator_type& __a) 840*38fd1498Szrj : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) 841*38fd1498Szrj { } 842*38fd1498Szrj 843*38fd1498Szrj unordered_multimap(initializer_list<value_type> __l, 844*38fd1498Szrj size_type __n, 845*38fd1498Szrj const allocator_type& __a) 846*38fd1498Szrj : unordered_multimap(__l, __n, hasher(), key_equal(), __a) 847*38fd1498Szrj { } 848*38fd1498Szrj 849*38fd1498Szrj unordered_multimap(initializer_list<value_type> __l, 850*38fd1498Szrj size_type __n, const hasher& __hf, 851*38fd1498Szrj const allocator_type& __a) 852*38fd1498Szrj : unordered_multimap(__l, __n, __hf, key_equal(), __a) 853*38fd1498Szrj { } 854*38fd1498Szrj 855*38fd1498Szrj ~unordered_multimap() = default; 856*38fd1498Szrj 857*38fd1498Szrj unordered_multimap& 858*38fd1498Szrj operator=(const unordered_multimap&) = default; 859*38fd1498Szrj 860*38fd1498Szrj unordered_multimap& 861*38fd1498Szrj operator=(unordered_multimap&&) = default; 862*38fd1498Szrj 863*38fd1498Szrj unordered_multimap& 864*38fd1498Szrj operator=(initializer_list<value_type> __l) 865*38fd1498Szrj { 866*38fd1498Szrj this->_M_base() = __l; 867*38fd1498Szrj this->_M_invalidate_all(); 868*38fd1498Szrj return *this; 869*38fd1498Szrj } 870*38fd1498Szrj 871*38fd1498Szrj void 872*38fd1498Szrj swap(unordered_multimap& __x) 873*38fd1498Szrj noexcept( noexcept(declval<_Base&>().swap(__x)) ) 874*38fd1498Szrj { 875*38fd1498Szrj _Safe::_M_swap(__x); 876*38fd1498Szrj _Base::swap(__x); 877*38fd1498Szrj } 878*38fd1498Szrj 879*38fd1498Szrj void 880*38fd1498Szrj clear() noexcept 881*38fd1498Szrj { 882*38fd1498Szrj _Base::clear(); 883*38fd1498Szrj this->_M_invalidate_all(); 884*38fd1498Szrj } 885*38fd1498Szrj 886*38fd1498Szrj iterator 887*38fd1498Szrj begin() noexcept 888*38fd1498Szrj { return iterator(_Base::begin(), this); } 889*38fd1498Szrj 890*38fd1498Szrj const_iterator 891*38fd1498Szrj begin() const noexcept 892*38fd1498Szrj { return const_iterator(_Base::begin(), this); } 893*38fd1498Szrj 894*38fd1498Szrj iterator 895*38fd1498Szrj end() noexcept 896*38fd1498Szrj { return iterator(_Base::end(), this); } 897*38fd1498Szrj 898*38fd1498Szrj const_iterator 899*38fd1498Szrj end() const noexcept 900*38fd1498Szrj { return const_iterator(_Base::end(), this); } 901*38fd1498Szrj 902*38fd1498Szrj const_iterator 903*38fd1498Szrj cbegin() const noexcept 904*38fd1498Szrj { return const_iterator(_Base::begin(), this); } 905*38fd1498Szrj 906*38fd1498Szrj const_iterator 907*38fd1498Szrj cend() const noexcept 908*38fd1498Szrj { return const_iterator(_Base::end(), this); } 909*38fd1498Szrj 910*38fd1498Szrj // local versions 911*38fd1498Szrj local_iterator 912*38fd1498Szrj begin(size_type __b) 913*38fd1498Szrj { 914*38fd1498Szrj __glibcxx_check_bucket_index(__b); 915*38fd1498Szrj return local_iterator(_Base::begin(__b), this); 916*38fd1498Szrj } 917*38fd1498Szrj 918*38fd1498Szrj local_iterator 919*38fd1498Szrj end(size_type __b) 920*38fd1498Szrj { 921*38fd1498Szrj __glibcxx_check_bucket_index(__b); 922*38fd1498Szrj return local_iterator(_Base::end(__b), this); 923*38fd1498Szrj } 924*38fd1498Szrj 925*38fd1498Szrj const_local_iterator 926*38fd1498Szrj begin(size_type __b) const 927*38fd1498Szrj { 928*38fd1498Szrj __glibcxx_check_bucket_index(__b); 929*38fd1498Szrj return const_local_iterator(_Base::begin(__b), this); 930*38fd1498Szrj } 931*38fd1498Szrj 932*38fd1498Szrj const_local_iterator 933*38fd1498Szrj end(size_type __b) const 934*38fd1498Szrj { 935*38fd1498Szrj __glibcxx_check_bucket_index(__b); 936*38fd1498Szrj return const_local_iterator(_Base::end(__b), this); 937*38fd1498Szrj } 938*38fd1498Szrj 939*38fd1498Szrj const_local_iterator 940*38fd1498Szrj cbegin(size_type __b) const 941*38fd1498Szrj { 942*38fd1498Szrj __glibcxx_check_bucket_index(__b); 943*38fd1498Szrj return const_local_iterator(_Base::cbegin(__b), this); 944*38fd1498Szrj } 945*38fd1498Szrj 946*38fd1498Szrj const_local_iterator 947*38fd1498Szrj cend(size_type __b) const 948*38fd1498Szrj { 949*38fd1498Szrj __glibcxx_check_bucket_index(__b); 950*38fd1498Szrj return const_local_iterator(_Base::cend(__b), this); 951*38fd1498Szrj } 952*38fd1498Szrj 953*38fd1498Szrj size_type 954*38fd1498Szrj bucket_size(size_type __b) const 955*38fd1498Szrj { 956*38fd1498Szrj __glibcxx_check_bucket_index(__b); 957*38fd1498Szrj return _Base::bucket_size(__b); 958*38fd1498Szrj } 959*38fd1498Szrj 960*38fd1498Szrj float 961*38fd1498Szrj max_load_factor() const noexcept 962*38fd1498Szrj { return _Base::max_load_factor(); } 963*38fd1498Szrj 964*38fd1498Szrj void 965*38fd1498Szrj max_load_factor(float __f) 966*38fd1498Szrj { 967*38fd1498Szrj __glibcxx_check_max_load_factor(__f); 968*38fd1498Szrj _Base::max_load_factor(__f); 969*38fd1498Szrj } 970*38fd1498Szrj 971*38fd1498Szrj template<typename... _Args> 972*38fd1498Szrj iterator 973*38fd1498Szrj emplace(_Args&&... __args) 974*38fd1498Szrj { 975*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 976*38fd1498Szrj _Base_iterator __it 977*38fd1498Szrj = _Base::emplace(std::forward<_Args>(__args)...); 978*38fd1498Szrj _M_check_rehashed(__bucket_count); 979*38fd1498Szrj return iterator(__it, this); 980*38fd1498Szrj } 981*38fd1498Szrj 982*38fd1498Szrj template<typename... _Args> 983*38fd1498Szrj iterator 984*38fd1498Szrj emplace_hint(const_iterator __hint, _Args&&... __args) 985*38fd1498Szrj { 986*38fd1498Szrj __glibcxx_check_insert(__hint); 987*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 988*38fd1498Szrj _Base_iterator __it = _Base::emplace_hint(__hint.base(), 989*38fd1498Szrj std::forward<_Args>(__args)...); 990*38fd1498Szrj _M_check_rehashed(__bucket_count); 991*38fd1498Szrj return iterator(__it, this); 992*38fd1498Szrj } 993*38fd1498Szrj 994*38fd1498Szrj iterator 995*38fd1498Szrj insert(const value_type& __obj) 996*38fd1498Szrj { 997*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 998*38fd1498Szrj _Base_iterator __it = _Base::insert(__obj); 999*38fd1498Szrj _M_check_rehashed(__bucket_count); 1000*38fd1498Szrj return iterator(__it, this); 1001*38fd1498Szrj } 1002*38fd1498Szrj 1003*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1004*38fd1498Szrj // 2354. Unnecessary copying when inserting into maps with braced-init 1005*38fd1498Szrj iterator 1006*38fd1498Szrj insert(value_type&& __x) 1007*38fd1498Szrj { 1008*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1009*38fd1498Szrj auto __it = _Base::insert(std::move(__x)); 1010*38fd1498Szrj _M_check_rehashed(__bucket_count); 1011*38fd1498Szrj return { __it, this }; 1012*38fd1498Szrj } 1013*38fd1498Szrj 1014*38fd1498Szrj iterator 1015*38fd1498Szrj insert(const_iterator __hint, const value_type& __obj) 1016*38fd1498Szrj { 1017*38fd1498Szrj __glibcxx_check_insert(__hint); 1018*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1019*38fd1498Szrj _Base_iterator __it = _Base::insert(__hint.base(), __obj); 1020*38fd1498Szrj _M_check_rehashed(__bucket_count); 1021*38fd1498Szrj return iterator(__it, this); 1022*38fd1498Szrj } 1023*38fd1498Szrj 1024*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1025*38fd1498Szrj // 2354. Unnecessary copying when inserting into maps with braced-init 1026*38fd1498Szrj iterator 1027*38fd1498Szrj insert(const_iterator __hint, value_type&& __x) 1028*38fd1498Szrj { 1029*38fd1498Szrj __glibcxx_check_insert(__hint); 1030*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1031*38fd1498Szrj auto __it = _Base::insert(__hint.base(), std::move(__x)); 1032*38fd1498Szrj _M_check_rehashed(__bucket_count); 1033*38fd1498Szrj return iterator(__it, this); 1034*38fd1498Szrj } 1035*38fd1498Szrj 1036*38fd1498Szrj template<typename _Pair, typename = typename 1037*38fd1498Szrj std::enable_if<std::is_constructible<value_type, 1038*38fd1498Szrj _Pair&&>::value>::type> 1039*38fd1498Szrj iterator 1040*38fd1498Szrj insert(_Pair&& __obj) 1041*38fd1498Szrj { 1042*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1043*38fd1498Szrj _Base_iterator __it = _Base::insert(std::forward<_Pair>(__obj)); 1044*38fd1498Szrj _M_check_rehashed(__bucket_count); 1045*38fd1498Szrj return iterator(__it, this); 1046*38fd1498Szrj } 1047*38fd1498Szrj 1048*38fd1498Szrj template<typename _Pair, typename = typename 1049*38fd1498Szrj std::enable_if<std::is_constructible<value_type, 1050*38fd1498Szrj _Pair&&>::value>::type> 1051*38fd1498Szrj iterator 1052*38fd1498Szrj insert(const_iterator __hint, _Pair&& __obj) 1053*38fd1498Szrj { 1054*38fd1498Szrj __glibcxx_check_insert(__hint); 1055*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1056*38fd1498Szrj _Base_iterator __it = 1057*38fd1498Szrj _Base::insert(__hint.base(), std::forward<_Pair>(__obj)); 1058*38fd1498Szrj _M_check_rehashed(__bucket_count); 1059*38fd1498Szrj return iterator(__it, this); 1060*38fd1498Szrj } 1061*38fd1498Szrj 1062*38fd1498Szrj void 1063*38fd1498Szrj insert(std::initializer_list<value_type> __l) 1064*38fd1498Szrj { _Base::insert(__l); } 1065*38fd1498Szrj 1066*38fd1498Szrj template<typename _InputIterator> 1067*38fd1498Szrj void 1068*38fd1498Szrj insert(_InputIterator __first, _InputIterator __last) 1069*38fd1498Szrj { 1070*38fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 1071*38fd1498Szrj __glibcxx_check_valid_range2(__first, __last, __dist); 1072*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1073*38fd1498Szrj 1074*38fd1498Szrj if (__dist.second >= __gnu_debug::__dp_sign) 1075*38fd1498Szrj _Base::insert(__gnu_debug::__unsafe(__first), 1076*38fd1498Szrj __gnu_debug::__unsafe(__last)); 1077*38fd1498Szrj else 1078*38fd1498Szrj _Base::insert(__first, __last); 1079*38fd1498Szrj 1080*38fd1498Szrj _M_check_rehashed(__bucket_count); 1081*38fd1498Szrj } 1082*38fd1498Szrj 1083*38fd1498Szrj#if __cplusplus > 201402L 1084*38fd1498Szrj using node_type = typename _Base::node_type; 1085*38fd1498Szrj 1086*38fd1498Szrj node_type 1087*38fd1498Szrj extract(const_iterator __position) 1088*38fd1498Szrj { 1089*38fd1498Szrj __glibcxx_check_erase(__position); 1090*38fd1498Szrj _Base_const_iterator __victim = __position.base(); 1091*38fd1498Szrj this->_M_invalidate_if( 1092*38fd1498Szrj [__victim](_Base_const_iterator __it) { return __it == __victim; } 1093*38fd1498Szrj ); 1094*38fd1498Szrj this->_M_invalidate_local_if( 1095*38fd1498Szrj [__victim](_Base_const_local_iterator __it) { 1096*38fd1498Szrj return __it._M_curr() == __victim._M_cur; 1097*38fd1498Szrj }); 1098*38fd1498Szrj return _Base::extract(__position.base()); 1099*38fd1498Szrj } 1100*38fd1498Szrj 1101*38fd1498Szrj node_type 1102*38fd1498Szrj extract(const key_type& __key) 1103*38fd1498Szrj { 1104*38fd1498Szrj const auto __position = find(__key); 1105*38fd1498Szrj if (__position != end()) 1106*38fd1498Szrj return extract(__position); 1107*38fd1498Szrj return {}; 1108*38fd1498Szrj } 1109*38fd1498Szrj 1110*38fd1498Szrj iterator 1111*38fd1498Szrj insert(node_type&& __nh) 1112*38fd1498Szrj { return iterator(_Base::insert(std::move(__nh)), this); } 1113*38fd1498Szrj 1114*38fd1498Szrj iterator 1115*38fd1498Szrj insert(const_iterator __hint, node_type&& __nh) 1116*38fd1498Szrj { 1117*38fd1498Szrj __glibcxx_check_insert(__hint); 1118*38fd1498Szrj return iterator(_Base::insert(__hint.base(), std::move(__nh)), this); 1119*38fd1498Szrj } 1120*38fd1498Szrj 1121*38fd1498Szrj using _Base::merge; 1122*38fd1498Szrj#endif // C++17 1123*38fd1498Szrj 1124*38fd1498Szrj iterator 1125*38fd1498Szrj find(const key_type& __key) 1126*38fd1498Szrj { return iterator(_Base::find(__key), this); } 1127*38fd1498Szrj 1128*38fd1498Szrj const_iterator 1129*38fd1498Szrj find(const key_type& __key) const 1130*38fd1498Szrj { return const_iterator(_Base::find(__key), this); } 1131*38fd1498Szrj 1132*38fd1498Szrj std::pair<iterator, iterator> 1133*38fd1498Szrj equal_range(const key_type& __key) 1134*38fd1498Szrj { 1135*38fd1498Szrj std::pair<_Base_iterator, _Base_iterator> __res = 1136*38fd1498Szrj _Base::equal_range(__key); 1137*38fd1498Szrj return std::make_pair(iterator(__res.first, this), 1138*38fd1498Szrj iterator(__res.second, this)); 1139*38fd1498Szrj } 1140*38fd1498Szrj 1141*38fd1498Szrj std::pair<const_iterator, const_iterator> 1142*38fd1498Szrj equal_range(const key_type& __key) const 1143*38fd1498Szrj { 1144*38fd1498Szrj std::pair<_Base_const_iterator, _Base_const_iterator> __res = 1145*38fd1498Szrj _Base::equal_range(__key); 1146*38fd1498Szrj return std::make_pair(const_iterator(__res.first, this), 1147*38fd1498Szrj const_iterator(__res.second, this)); 1148*38fd1498Szrj } 1149*38fd1498Szrj 1150*38fd1498Szrj size_type 1151*38fd1498Szrj erase(const key_type& __key) 1152*38fd1498Szrj { 1153*38fd1498Szrj size_type __ret(0); 1154*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1155*38fd1498Szrj std::pair<_Base_iterator, _Base_iterator> __pair = 1156*38fd1498Szrj _Base::equal_range(__key); 1157*38fd1498Szrj for (_Base_iterator __victim = __pair.first; __victim != __pair.second;) 1158*38fd1498Szrj { 1159*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 1160*38fd1498Szrj { return __it == __victim; }); 1161*38fd1498Szrj this->_M_invalidate_local_if( 1162*38fd1498Szrj [__victim](_Base_const_local_iterator __it) 1163*38fd1498Szrj { return __it._M_curr() == __victim._M_cur; }); 1164*38fd1498Szrj _Base::erase(__victim++); 1165*38fd1498Szrj ++__ret; 1166*38fd1498Szrj } 1167*38fd1498Szrj _M_check_rehashed(__bucket_count); 1168*38fd1498Szrj return __ret; 1169*38fd1498Szrj } 1170*38fd1498Szrj 1171*38fd1498Szrj iterator 1172*38fd1498Szrj erase(const_iterator __it) 1173*38fd1498Szrj { 1174*38fd1498Szrj __glibcxx_check_erase(__it); 1175*38fd1498Szrj _Base_const_iterator __victim = __it.base(); 1176*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 1177*38fd1498Szrj { return __it == __victim; }); 1178*38fd1498Szrj this->_M_invalidate_local_if( 1179*38fd1498Szrj [__victim](_Base_const_local_iterator __it) 1180*38fd1498Szrj { return __it._M_curr() == __victim._M_cur; }); 1181*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1182*38fd1498Szrj _Base_iterator __next = _Base::erase(__it.base()); 1183*38fd1498Szrj _M_check_rehashed(__bucket_count); 1184*38fd1498Szrj return iterator(__next, this); 1185*38fd1498Szrj } 1186*38fd1498Szrj 1187*38fd1498Szrj iterator 1188*38fd1498Szrj erase(iterator __it) 1189*38fd1498Szrj { return erase(const_iterator(__it)); } 1190*38fd1498Szrj 1191*38fd1498Szrj iterator 1192*38fd1498Szrj erase(const_iterator __first, const_iterator __last) 1193*38fd1498Szrj { 1194*38fd1498Szrj __glibcxx_check_erase_range(__first, __last); 1195*38fd1498Szrj for (_Base_const_iterator __tmp = __first.base(); 1196*38fd1498Szrj __tmp != __last.base(); ++__tmp) 1197*38fd1498Szrj { 1198*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::end(), 1199*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range) 1200*38fd1498Szrj ._M_iterator(__first, "first") 1201*38fd1498Szrj ._M_iterator(__last, "last")); 1202*38fd1498Szrj this->_M_invalidate_if([__tmp](_Base_const_iterator __it) 1203*38fd1498Szrj { return __it == __tmp; }); 1204*38fd1498Szrj this->_M_invalidate_local_if( 1205*38fd1498Szrj [__tmp](_Base_const_local_iterator __it) 1206*38fd1498Szrj { return __it._M_curr() == __tmp._M_cur; }); 1207*38fd1498Szrj } 1208*38fd1498Szrj size_type __bucket_count = this->bucket_count(); 1209*38fd1498Szrj _Base_iterator __next = _Base::erase(__first.base(), __last.base()); 1210*38fd1498Szrj _M_check_rehashed(__bucket_count); 1211*38fd1498Szrj return iterator(__next, this); 1212*38fd1498Szrj } 1213*38fd1498Szrj 1214*38fd1498Szrj _Base& 1215*38fd1498Szrj _M_base() noexcept { return *this; } 1216*38fd1498Szrj 1217*38fd1498Szrj const _Base& 1218*38fd1498Szrj _M_base() const noexcept { return *this; } 1219*38fd1498Szrj 1220*38fd1498Szrj private: 1221*38fd1498Szrj void 1222*38fd1498Szrj _M_check_rehashed(size_type __prev_count) 1223*38fd1498Szrj { 1224*38fd1498Szrj if (__prev_count != this->bucket_count()) 1225*38fd1498Szrj this->_M_invalidate_locals(); 1226*38fd1498Szrj } 1227*38fd1498Szrj }; 1228*38fd1498Szrj 1229*38fd1498Szrj#if __cpp_deduction_guides >= 201606 1230*38fd1498Szrj 1231*38fd1498Szrj template<typename _InputIterator, 1232*38fd1498Szrj typename _Hash = hash<__iter_key_t<_InputIterator>>, 1233*38fd1498Szrj typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 1234*38fd1498Szrj typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 1235*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 1236*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1237*38fd1498Szrj unordered_multimap(_InputIterator, _InputIterator, 1238*38fd1498Szrj unordered_multimap<int, int>::size_type = {}, 1239*38fd1498Szrj _Hash = _Hash(), _Pred = _Pred(), 1240*38fd1498Szrj _Allocator = _Allocator()) 1241*38fd1498Szrj -> unordered_multimap<__iter_key_t<_InputIterator>, 1242*38fd1498Szrj __iter_val_t<_InputIterator>, _Hash, _Pred, 1243*38fd1498Szrj _Allocator>; 1244*38fd1498Szrj 1245*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash = hash<_Key>, 1246*38fd1498Szrj typename _Pred = equal_to<_Key>, 1247*38fd1498Szrj typename _Allocator = allocator<pair<const _Key, _Tp>>, 1248*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1249*38fd1498Szrj unordered_multimap(initializer_list<pair<_Key, _Tp>>, 1250*38fd1498Szrj unordered_multimap<int, int>::size_type = {}, 1251*38fd1498Szrj _Hash = _Hash(), _Pred = _Pred(), 1252*38fd1498Szrj _Allocator = _Allocator()) 1253*38fd1498Szrj -> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Allocator>; 1254*38fd1498Szrj 1255*38fd1498Szrj template<typename _InputIterator, typename _Allocator, 1256*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 1257*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1258*38fd1498Szrj unordered_multimap(_InputIterator, _InputIterator, 1259*38fd1498Szrj unordered_multimap<int, int>::size_type, _Allocator) 1260*38fd1498Szrj -> unordered_multimap<__iter_key_t<_InputIterator>, 1261*38fd1498Szrj __iter_val_t<_InputIterator>, 1262*38fd1498Szrj hash<__iter_key_t<_InputIterator>>, 1263*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1264*38fd1498Szrj 1265*38fd1498Szrj template<typename _InputIterator, typename _Allocator, 1266*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 1267*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1268*38fd1498Szrj unordered_multimap(_InputIterator, _InputIterator, _Allocator) 1269*38fd1498Szrj -> unordered_multimap<__iter_key_t<_InputIterator>, 1270*38fd1498Szrj __iter_val_t<_InputIterator>, 1271*38fd1498Szrj hash<__iter_key_t<_InputIterator>>, 1272*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1273*38fd1498Szrj 1274*38fd1498Szrj template<typename _InputIterator, typename _Hash, typename _Allocator, 1275*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 1276*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1277*38fd1498Szrj unordered_multimap(_InputIterator, _InputIterator, 1278*38fd1498Szrj unordered_multimap<int, int>::size_type, _Hash, 1279*38fd1498Szrj _Allocator) 1280*38fd1498Szrj -> unordered_multimap<__iter_key_t<_InputIterator>, 1281*38fd1498Szrj __iter_val_t<_InputIterator>, _Hash, 1282*38fd1498Szrj equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1283*38fd1498Szrj 1284*38fd1498Szrj template<typename _Key, typename _Tp, typename _Allocator, 1285*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1286*38fd1498Szrj unordered_multimap(initializer_list<pair<_Key, _Tp>>, 1287*38fd1498Szrj unordered_multimap<int, int>::size_type, 1288*38fd1498Szrj _Allocator) 1289*38fd1498Szrj -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1290*38fd1498Szrj 1291*38fd1498Szrj template<typename _Key, typename _Tp, typename _Allocator, 1292*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1293*38fd1498Szrj unordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 1294*38fd1498Szrj -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1295*38fd1498Szrj 1296*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, typename _Allocator, 1297*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 1298*38fd1498Szrj unordered_multimap(initializer_list<pair<_Key, _Tp>>, 1299*38fd1498Szrj unordered_multimap<int, int>::size_type, 1300*38fd1498Szrj _Hash, _Allocator) 1301*38fd1498Szrj -> unordered_multimap<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 1302*38fd1498Szrj 1303*38fd1498Szrj#endif 1304*38fd1498Szrj 1305*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 1306*38fd1498Szrj typename _Pred, typename _Alloc> 1307*38fd1498Szrj inline void 1308*38fd1498Szrj swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1309*38fd1498Szrj unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1310*38fd1498Szrj noexcept(noexcept(__x.swap(__y))) 1311*38fd1498Szrj { __x.swap(__y); } 1312*38fd1498Szrj 1313*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 1314*38fd1498Szrj typename _Pred, typename _Alloc> 1315*38fd1498Szrj inline bool 1316*38fd1498Szrj operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1317*38fd1498Szrj const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1318*38fd1498Szrj { return __x._M_base() == __y._M_base(); } 1319*38fd1498Szrj 1320*38fd1498Szrj template<typename _Key, typename _Tp, typename _Hash, 1321*38fd1498Szrj typename _Pred, typename _Alloc> 1322*38fd1498Szrj inline bool 1323*38fd1498Szrj operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1324*38fd1498Szrj const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1325*38fd1498Szrj { return !(__x == __y); } 1326*38fd1498Szrj 1327*38fd1498Szrj} // namespace __debug 1328*38fd1498Szrj} // namespace std 1329*38fd1498Szrj 1330*38fd1498Szrj#endif // C++11 1331*38fd1498Szrj 1332*38fd1498Szrj#endif 1333