136ac495dSmrg// Profiling unordered_set/unordered_multiset implementation -*- C++ -*- 236ac495dSmrg 3*c0a68be4Smrg// Copyright (C) 2009-2019 Free Software Foundation, Inc. 436ac495dSmrg// 536ac495dSmrg// This file is part of the GNU ISO C++ Library. This library is free 636ac495dSmrg// software; you can redistribute it and/or modify it under the 736ac495dSmrg// terms of the GNU General Public License as published by the 836ac495dSmrg// Free Software Foundation; either version 3, or (at your option) 936ac495dSmrg// any later version. 1036ac495dSmrg// 1136ac495dSmrg// This library is distributed in the hope that it will be useful, 1236ac495dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 1336ac495dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1436ac495dSmrg// GNU General Public License for more details. 1536ac495dSmrg 1636ac495dSmrg// Under Section 7 of GPL version 3, you are granted additional 1736ac495dSmrg// permissions described in the GCC Runtime Library Exception, version 1836ac495dSmrg// 3.1, as published by the Free Software Foundation. 1936ac495dSmrg 2036ac495dSmrg// You should have received a copy of the GNU General Public License along 2136ac495dSmrg// with this library; see the file COPYING3. If not see 2236ac495dSmrg// <http://www.gnu.org/licenses/>. 2336ac495dSmrg 2436ac495dSmrg/** @file profile/unordered_set 2536ac495dSmrg * This file is a GNU profile extension to the Standard C++ Library. 2636ac495dSmrg */ 2736ac495dSmrg 2836ac495dSmrg#ifndef _GLIBCXX_PROFILE_UNORDERED_SET 2936ac495dSmrg#define _GLIBCXX_PROFILE_UNORDERED_SET 1 3036ac495dSmrg 3136ac495dSmrg#if __cplusplus < 201103L 3236ac495dSmrg# include <bits/c++0x_warning.h> 3336ac495dSmrg#else 3436ac495dSmrg# include <unordered_set> 3536ac495dSmrg 3636ac495dSmrg#include <profile/base.h> 3736ac495dSmrg#include <profile/unordered_base.h> 3836ac495dSmrg 3936ac495dSmrg#define _GLIBCXX_BASE unordered_set<_Key, _Hash, _Pred, _Alloc> 4036ac495dSmrg#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE 4136ac495dSmrg 4236ac495dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 4336ac495dSmrg{ 4436ac495dSmrgnamespace __profile 4536ac495dSmrg{ 4636ac495dSmrg /** @brief Unordered_set wrapper with performance instrumentation. */ 4736ac495dSmrg template<typename _Key, 4836ac495dSmrg typename _Hash = std::hash<_Key>, 4936ac495dSmrg typename _Pred = std::equal_to<_Key>, 5036ac495dSmrg typename _Alloc = std::allocator<_Key> > 5136ac495dSmrg class unordered_set 5236ac495dSmrg : public _GLIBCXX_STD_BASE, 5336ac495dSmrg public _Unordered_profile<unordered_set<_Key, _Hash, _Pred, _Alloc>, 5436ac495dSmrg true> 5536ac495dSmrg { 5636ac495dSmrg typedef _GLIBCXX_STD_BASE _Base; 5736ac495dSmrg 5836ac495dSmrg _Base& 5936ac495dSmrg _M_base() noexcept { return *this; } 6036ac495dSmrg 6136ac495dSmrg const _Base& 6236ac495dSmrg _M_base() const noexcept { return *this; } 6336ac495dSmrg 6436ac495dSmrg public: 6536ac495dSmrg typedef typename _Base::size_type size_type; 6636ac495dSmrg typedef typename _Base::hasher hasher; 6736ac495dSmrg typedef typename _Base::key_equal key_equal; 6836ac495dSmrg typedef typename _Base::allocator_type allocator_type; 6936ac495dSmrg typedef typename _Base::key_type key_type; 7036ac495dSmrg typedef typename _Base::value_type value_type; 7136ac495dSmrg typedef typename _Base::difference_type difference_type; 7236ac495dSmrg typedef typename _Base::reference reference; 7336ac495dSmrg typedef typename _Base::const_reference const_reference; 7436ac495dSmrg 7536ac495dSmrg typedef typename _Base::iterator iterator; 7636ac495dSmrg typedef typename _Base::const_iterator const_iterator; 7736ac495dSmrg 7836ac495dSmrg unordered_set() = default; 7936ac495dSmrg 8036ac495dSmrg explicit 8136ac495dSmrg unordered_set(size_type __n, 8236ac495dSmrg const hasher& __hf = hasher(), 8336ac495dSmrg const key_equal& __eql = key_equal(), 8436ac495dSmrg const allocator_type& __a = allocator_type()) 8536ac495dSmrg : _Base(__n, __hf, __eql, __a) 8636ac495dSmrg { } 8736ac495dSmrg 8836ac495dSmrg template<typename _InputIterator> 8936ac495dSmrg unordered_set(_InputIterator __f, _InputIterator __l, 9036ac495dSmrg size_type __n = 0, 9136ac495dSmrg const hasher& __hf = hasher(), 9236ac495dSmrg const key_equal& __eql = key_equal(), 9336ac495dSmrg const allocator_type& __a = allocator_type()) 9436ac495dSmrg : _Base(__f, __l, __n, __hf, __eql, __a) 9536ac495dSmrg { } 9636ac495dSmrg 9736ac495dSmrg unordered_set(const unordered_set&) = default; 9836ac495dSmrg 9936ac495dSmrg unordered_set(const _Base& __x) 10036ac495dSmrg : _Base(__x) 10136ac495dSmrg { } 10236ac495dSmrg 10336ac495dSmrg unordered_set(unordered_set&&) = default; 10436ac495dSmrg 10536ac495dSmrg explicit 10636ac495dSmrg unordered_set(const allocator_type& __a) 10736ac495dSmrg : _Base(__a) 10836ac495dSmrg { } 10936ac495dSmrg 11036ac495dSmrg unordered_set(const unordered_set& __uset, 11136ac495dSmrg const allocator_type& __a) 11236ac495dSmrg : _Base(__uset._M_base(), __a) 11336ac495dSmrg { } 11436ac495dSmrg 11536ac495dSmrg unordered_set(unordered_set&& __uset, 11636ac495dSmrg const allocator_type& __a) 11736ac495dSmrg : _Base(std::move(__uset._M_base()), __a) 11836ac495dSmrg { } 11936ac495dSmrg 12036ac495dSmrg unordered_set(initializer_list<value_type> __l, 12136ac495dSmrg size_type __n = 0, 12236ac495dSmrg const hasher& __hf = hasher(), 12336ac495dSmrg const key_equal& __eql = key_equal(), 12436ac495dSmrg const allocator_type& __a = allocator_type()) 12536ac495dSmrg : _Base(__l, __n, __hf, __eql, __a) 12636ac495dSmrg { } 12736ac495dSmrg 12836ac495dSmrg unordered_set(size_type __n, const allocator_type& __a) 12936ac495dSmrg : unordered_set(__n, hasher(), key_equal(), __a) 13036ac495dSmrg { } 13136ac495dSmrg 13236ac495dSmrg unordered_set(size_type __n, const hasher& __hf, 13336ac495dSmrg const allocator_type& __a) 13436ac495dSmrg : unordered_set(__n, __hf, key_equal(), __a) 13536ac495dSmrg { } 13636ac495dSmrg 13736ac495dSmrg template<typename _InputIterator> 13836ac495dSmrg unordered_set(_InputIterator __first, _InputIterator __last, 13936ac495dSmrg size_type __n, 14036ac495dSmrg const allocator_type& __a) 14136ac495dSmrg : unordered_set(__first, __last, __n, hasher(), key_equal(), __a) 14236ac495dSmrg { } 14336ac495dSmrg 14436ac495dSmrg template<typename _InputIterator> 14536ac495dSmrg unordered_set(_InputIterator __first, _InputIterator __last, 14636ac495dSmrg size_type __n, const hasher& __hf, 14736ac495dSmrg const allocator_type& __a) 14836ac495dSmrg : unordered_set(__first, __last, __n, __hf, key_equal(), __a) 14936ac495dSmrg { } 15036ac495dSmrg 15136ac495dSmrg unordered_set(initializer_list<value_type> __l, 15236ac495dSmrg size_type __n, 15336ac495dSmrg const allocator_type& __a) 15436ac495dSmrg : unordered_set(__l, __n, hasher(), key_equal(), __a) 15536ac495dSmrg { } 15636ac495dSmrg 15736ac495dSmrg unordered_set(initializer_list<value_type> __l, 15836ac495dSmrg size_type __n, const hasher& __hf, 15936ac495dSmrg const allocator_type& __a) 16036ac495dSmrg : unordered_set(__l, __n, __hf, key_equal(), __a) 16136ac495dSmrg { } 16236ac495dSmrg 16336ac495dSmrg unordered_set& 16436ac495dSmrg operator=(const unordered_set&) = default; 16536ac495dSmrg 16636ac495dSmrg unordered_set& 16736ac495dSmrg operator=(unordered_set&&) = default; 16836ac495dSmrg 16936ac495dSmrg unordered_set& 17036ac495dSmrg operator=(initializer_list<value_type> __l) 17136ac495dSmrg { 17236ac495dSmrg this->_M_profile_destruct(); 17336ac495dSmrg _M_base() = __l; 17436ac495dSmrg this->_M_profile_construct(); 17536ac495dSmrg return *this; 17636ac495dSmrg } 17736ac495dSmrg 17836ac495dSmrg void 17936ac495dSmrg swap(unordered_set& __x) 18036ac495dSmrg noexcept( noexcept(__x._M_base().swap(__x)) ) 18136ac495dSmrg { 18236ac495dSmrg _Base::swap(__x); 18336ac495dSmrg this->_M_swap(__x); 18436ac495dSmrg } 18536ac495dSmrg 18636ac495dSmrg void 18736ac495dSmrg clear() noexcept 18836ac495dSmrg { 18936ac495dSmrg this->_M_profile_destruct(); 19036ac495dSmrg _Base::clear(); 19136ac495dSmrg this->_M_profile_construct(); 19236ac495dSmrg } 19336ac495dSmrg 19436ac495dSmrg template<typename... _Args> 19536ac495dSmrg std::pair<iterator, bool> 19636ac495dSmrg emplace(_Args&&... __args) 19736ac495dSmrg { 19836ac495dSmrg size_type __old_size = _Base::bucket_count(); 19936ac495dSmrg std::pair<iterator, bool> __res 20036ac495dSmrg = _Base::emplace(std::forward<_Args>(__args)...); 20136ac495dSmrg this->_M_profile_resize(__old_size); 20236ac495dSmrg return __res; 20336ac495dSmrg } 20436ac495dSmrg 20536ac495dSmrg template<typename... _Args> 20636ac495dSmrg iterator 20736ac495dSmrg emplace_hint(const_iterator __it, _Args&&... __args) 20836ac495dSmrg { 20936ac495dSmrg size_type __old_size = _Base::bucket_count(); 21036ac495dSmrg iterator __res 21136ac495dSmrg = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); 21236ac495dSmrg this->_M_profile_resize(__old_size); 21336ac495dSmrg return __res; 21436ac495dSmrg } 21536ac495dSmrg 21636ac495dSmrg void 21736ac495dSmrg insert(std::initializer_list<value_type> __l) 21836ac495dSmrg { 21936ac495dSmrg size_type __old_size = _Base::bucket_count(); 22036ac495dSmrg _Base::insert(__l); 22136ac495dSmrg this->_M_profile_resize(__old_size); 22236ac495dSmrg } 22336ac495dSmrg 22436ac495dSmrg std::pair<iterator, bool> 22536ac495dSmrg insert(const value_type& __obj) 22636ac495dSmrg { 22736ac495dSmrg size_type __old_size = _Base::bucket_count(); 22836ac495dSmrg std::pair<iterator, bool> __res = _Base::insert(__obj); 22936ac495dSmrg this->_M_profile_resize(__old_size); 23036ac495dSmrg return __res; 23136ac495dSmrg } 23236ac495dSmrg 23336ac495dSmrg iterator 23436ac495dSmrg insert(const_iterator __iter, const value_type& __v) 23536ac495dSmrg { 23636ac495dSmrg size_type __old_size = _Base::bucket_count(); 23736ac495dSmrg iterator __res = _Base::insert(__iter, __v); 23836ac495dSmrg this->_M_profile_resize(__old_size); 23936ac495dSmrg return __res; 24036ac495dSmrg } 24136ac495dSmrg 24236ac495dSmrg std::pair<iterator, bool> 24336ac495dSmrg insert(value_type&& __obj) 24436ac495dSmrg { 24536ac495dSmrg size_type __old_size = _Base::bucket_count(); 24636ac495dSmrg std::pair<iterator, bool> __res = _Base::insert(std::move(__obj)); 24736ac495dSmrg this->_M_profile_resize(__old_size); 24836ac495dSmrg return __res; 24936ac495dSmrg } 25036ac495dSmrg 25136ac495dSmrg iterator 25236ac495dSmrg insert(const_iterator __iter, value_type&& __v) 25336ac495dSmrg { 25436ac495dSmrg size_type __old_size = _Base::bucket_count(); 25536ac495dSmrg iterator __res = _Base::insert(__iter, std::move(__v)); 25636ac495dSmrg this->_M_profile_resize(__old_size); 25736ac495dSmrg return __res; 25836ac495dSmrg } 25936ac495dSmrg 26036ac495dSmrg template<typename _InputIter> 26136ac495dSmrg void 26236ac495dSmrg insert(_InputIter __first, _InputIter __last) 26336ac495dSmrg { 26436ac495dSmrg size_type __old_size = _Base::bucket_count(); 26536ac495dSmrg _Base::insert(__first, __last); 26636ac495dSmrg this->_M_profile_resize(__old_size); 26736ac495dSmrg } 26836ac495dSmrg 26936ac495dSmrg void 27036ac495dSmrg rehash(size_type __n) 27136ac495dSmrg { 27236ac495dSmrg size_type __old_size = _Base::bucket_count(); 27336ac495dSmrg _Base::rehash(__n); 27436ac495dSmrg this->_M_profile_resize(__old_size); 27536ac495dSmrg } 27636ac495dSmrg }; 27736ac495dSmrg 27836ac495dSmrg template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> 27936ac495dSmrg inline void 28036ac495dSmrg swap(unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, 28136ac495dSmrg unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) 28236ac495dSmrg noexcept(noexcept(__x.swap(__y))) 28336ac495dSmrg { __x.swap(__y); } 28436ac495dSmrg 28536ac495dSmrg template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> 28636ac495dSmrg inline bool 28736ac495dSmrg operator==(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, 28836ac495dSmrg const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) 28936ac495dSmrg { return static_cast<const _GLIBCXX_STD_BASE&>(__x) == __y; } 29036ac495dSmrg 29136ac495dSmrg template<typename _Key, typename _Hash, typename _Pred, typename _Alloc> 29236ac495dSmrg inline bool 29336ac495dSmrg operator!=(const unordered_set<_Key, _Hash, _Pred, _Alloc>& __x, 29436ac495dSmrg const unordered_set<_Key, _Hash, _Pred, _Alloc>& __y) 29536ac495dSmrg { return !(__x == __y); } 29636ac495dSmrg 29736ac495dSmrg#undef _GLIBCXX_BASE 29836ac495dSmrg#undef _GLIBCXX_STD_BASE 29936ac495dSmrg#define _GLIBCXX_STD_BASE _GLIBCXX_STD_C::_GLIBCXX_BASE 30036ac495dSmrg#define _GLIBCXX_BASE unordered_multiset<_Value, _Hash, _Pred, _Alloc> 30136ac495dSmrg 30236ac495dSmrg /** @brief Unordered_multiset wrapper with performance instrumentation. */ 30336ac495dSmrg template<typename _Value, 30436ac495dSmrg typename _Hash = std::hash<_Value>, 30536ac495dSmrg typename _Pred = std::equal_to<_Value>, 30636ac495dSmrg typename _Alloc = std::allocator<_Value> > 30736ac495dSmrg class unordered_multiset 30836ac495dSmrg : public _GLIBCXX_STD_BASE, 30936ac495dSmrg public _Unordered_profile<unordered_multiset<_Value, 31036ac495dSmrg _Hash, _Pred, _Alloc>, 31136ac495dSmrg false> 31236ac495dSmrg { 31336ac495dSmrg typedef _GLIBCXX_STD_BASE _Base; 31436ac495dSmrg 31536ac495dSmrg _Base& 31636ac495dSmrg _M_base() noexcept { return *this; } 31736ac495dSmrg 31836ac495dSmrg const _Base& 31936ac495dSmrg _M_base() const noexcept { return *this; } 32036ac495dSmrg 32136ac495dSmrg public: 32236ac495dSmrg typedef typename _Base::size_type size_type; 32336ac495dSmrg typedef typename _Base::hasher hasher; 32436ac495dSmrg typedef typename _Base::key_equal key_equal; 32536ac495dSmrg typedef typename _Base::allocator_type allocator_type; 32636ac495dSmrg typedef typename _Base::key_type key_type; 32736ac495dSmrg typedef typename _Base::value_type value_type; 32836ac495dSmrg typedef typename _Base::difference_type difference_type; 32936ac495dSmrg typedef typename _Base::reference reference; 33036ac495dSmrg typedef typename _Base::const_reference const_reference; 33136ac495dSmrg 33236ac495dSmrg typedef typename _Base::iterator iterator; 33336ac495dSmrg typedef typename _Base::const_iterator const_iterator; 33436ac495dSmrg 33536ac495dSmrg unordered_multiset() = default; 33636ac495dSmrg 33736ac495dSmrg explicit 33836ac495dSmrg unordered_multiset(size_type __n, 33936ac495dSmrg const hasher& __hf = hasher(), 34036ac495dSmrg const key_equal& __eql = key_equal(), 34136ac495dSmrg const allocator_type& __a = allocator_type()) 34236ac495dSmrg : _Base(__n, __hf, __eql, __a) 34336ac495dSmrg { } 34436ac495dSmrg 34536ac495dSmrg template<typename _InputIterator> 34636ac495dSmrg unordered_multiset(_InputIterator __f, _InputIterator __l, 34736ac495dSmrg size_type __n = 0, 34836ac495dSmrg const hasher& __hf = hasher(), 34936ac495dSmrg const key_equal& __eql = key_equal(), 35036ac495dSmrg const allocator_type& __a = allocator_type()) 35136ac495dSmrg : _Base(__f, __l, __n, __hf, __eql, __a) 35236ac495dSmrg { } 35336ac495dSmrg 35436ac495dSmrg unordered_multiset(const unordered_multiset&) = default; 35536ac495dSmrg 35636ac495dSmrg unordered_multiset(const _Base& __x) 35736ac495dSmrg : _Base(__x) 35836ac495dSmrg { } 35936ac495dSmrg 36036ac495dSmrg unordered_multiset(unordered_multiset&&) = default; 36136ac495dSmrg 36236ac495dSmrg explicit 36336ac495dSmrg unordered_multiset(const allocator_type& __a) 36436ac495dSmrg : _Base(__a) 36536ac495dSmrg { } 36636ac495dSmrg 36736ac495dSmrg unordered_multiset(const unordered_multiset& __umset, 36836ac495dSmrg const allocator_type& __a) 36936ac495dSmrg : _Base(__umset._M_base(), __a) 37036ac495dSmrg { } 37136ac495dSmrg 37236ac495dSmrg unordered_multiset(unordered_multiset&& __umset, 37336ac495dSmrg const allocator_type& __a) 37436ac495dSmrg : _Base(std::move(__umset._M_base()), __a) 37536ac495dSmrg { } 37636ac495dSmrg 37736ac495dSmrg unordered_multiset(initializer_list<value_type> __l, 37836ac495dSmrg size_type __n = 0, 37936ac495dSmrg const hasher& __hf = hasher(), 38036ac495dSmrg const key_equal& __eql = key_equal(), 38136ac495dSmrg const allocator_type& __a = allocator_type()) 38236ac495dSmrg : _Base(__l, __n, __hf, __eql, __a) 38336ac495dSmrg { } 38436ac495dSmrg 38536ac495dSmrg unordered_multiset(size_type __n, const allocator_type& __a) 38636ac495dSmrg : unordered_multiset(__n, hasher(), key_equal(), __a) 38736ac495dSmrg { } 38836ac495dSmrg 38936ac495dSmrg unordered_multiset(size_type __n, const hasher& __hf, 39036ac495dSmrg const allocator_type& __a) 39136ac495dSmrg : unordered_multiset(__n, __hf, key_equal(), __a) 39236ac495dSmrg { } 39336ac495dSmrg 39436ac495dSmrg template<typename _InputIterator> 39536ac495dSmrg unordered_multiset(_InputIterator __first, _InputIterator __last, 39636ac495dSmrg size_type __n, 39736ac495dSmrg const allocator_type& __a) 39836ac495dSmrg : unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) 39936ac495dSmrg { } 40036ac495dSmrg 40136ac495dSmrg template<typename _InputIterator> 40236ac495dSmrg unordered_multiset(_InputIterator __first, _InputIterator __last, 40336ac495dSmrg size_type __n, const hasher& __hf, 40436ac495dSmrg const allocator_type& __a) 40536ac495dSmrg : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) 40636ac495dSmrg { } 40736ac495dSmrg 40836ac495dSmrg unordered_multiset(initializer_list<value_type> __l, 40936ac495dSmrg size_type __n, 41036ac495dSmrg const allocator_type& __a) 41136ac495dSmrg : unordered_multiset(__l, __n, hasher(), key_equal(), __a) 41236ac495dSmrg { } 41336ac495dSmrg 41436ac495dSmrg unordered_multiset(initializer_list<value_type> __l, 41536ac495dSmrg size_type __n, const hasher& __hf, 41636ac495dSmrg const allocator_type& __a) 41736ac495dSmrg : unordered_multiset(__l, __n, __hf, key_equal(), __a) 41836ac495dSmrg { } 41936ac495dSmrg 42036ac495dSmrg unordered_multiset& 42136ac495dSmrg operator=(const unordered_multiset&) = default; 42236ac495dSmrg 42336ac495dSmrg unordered_multiset& 42436ac495dSmrg operator=(unordered_multiset&&) = default; 42536ac495dSmrg 42636ac495dSmrg unordered_multiset& 42736ac495dSmrg operator=(initializer_list<value_type> __l) 42836ac495dSmrg { 42936ac495dSmrg this->_M_profile_destruct(); 43036ac495dSmrg _M_base() = __l; 43136ac495dSmrg this->_M_profile_construct(); 43236ac495dSmrg return *this; 43336ac495dSmrg } 43436ac495dSmrg 43536ac495dSmrg void 43636ac495dSmrg swap(unordered_multiset& __x) 43736ac495dSmrg noexcept( noexcept(__x._M_base().swap(__x)) ) 43836ac495dSmrg { 43936ac495dSmrg _Base::swap(__x); 44036ac495dSmrg this->_M_swap(__x); 44136ac495dSmrg } 44236ac495dSmrg 44336ac495dSmrg void 44436ac495dSmrg clear() noexcept 44536ac495dSmrg { 44636ac495dSmrg this->_M_profile_destruct(); 44736ac495dSmrg _Base::clear(); 44836ac495dSmrg this->_M_profile_construct(); 44936ac495dSmrg } 45036ac495dSmrg 45136ac495dSmrg template<typename... _Args> 45236ac495dSmrg iterator 45336ac495dSmrg emplace(_Args&&... __args) 45436ac495dSmrg { 45536ac495dSmrg size_type __old_size = _Base::bucket_count(); 45636ac495dSmrg iterator __res = _Base::emplace(std::forward<_Args>(__args)...); 45736ac495dSmrg this->_M_profile_resize(__old_size); 45836ac495dSmrg return __res; 45936ac495dSmrg } 46036ac495dSmrg 46136ac495dSmrg template<typename... _Args> 46236ac495dSmrg iterator 46336ac495dSmrg emplace_hint(const_iterator __it, _Args&&... __args) 46436ac495dSmrg { 46536ac495dSmrg size_type __old_size = _Base::bucket_count(); 46636ac495dSmrg iterator __res 46736ac495dSmrg = _Base::emplace_hint(__it, std::forward<_Args>(__args)...); 46836ac495dSmrg this->_M_profile_resize(__old_size); 46936ac495dSmrg return __res; 47036ac495dSmrg } 47136ac495dSmrg 47236ac495dSmrg void 47336ac495dSmrg insert(std::initializer_list<value_type> __l) 47436ac495dSmrg { 47536ac495dSmrg size_type __old_size = _Base::bucket_count(); 47636ac495dSmrg _Base::insert(__l); 47736ac495dSmrg this->_M_profile_resize(__old_size); 47836ac495dSmrg } 47936ac495dSmrg 48036ac495dSmrg iterator 48136ac495dSmrg insert(const value_type& __obj) 48236ac495dSmrg { 48336ac495dSmrg size_type __old_size = _Base::bucket_count(); 48436ac495dSmrg iterator __res = _Base::insert(__obj); 48536ac495dSmrg this->_M_profile_resize(__old_size); 48636ac495dSmrg return __res; 48736ac495dSmrg } 48836ac495dSmrg 48936ac495dSmrg iterator 49036ac495dSmrg insert(const_iterator __iter, const value_type& __v) 49136ac495dSmrg { 49236ac495dSmrg size_type __old_size = _Base::bucket_count(); 49336ac495dSmrg iterator __res = _Base::insert(__iter, __v); 49436ac495dSmrg this->_M_profile_resize(__old_size); 49536ac495dSmrg return __res; 49636ac495dSmrg } 49736ac495dSmrg 49836ac495dSmrg iterator 49936ac495dSmrg insert(value_type&& __obj) 50036ac495dSmrg { 50136ac495dSmrg size_type __old_size = _Base::bucket_count(); 50236ac495dSmrg iterator __res = _Base::insert(std::move(__obj)); 50336ac495dSmrg this->_M_profile_resize(__old_size); 50436ac495dSmrg return __res; 50536ac495dSmrg } 50636ac495dSmrg 50736ac495dSmrg iterator 50836ac495dSmrg insert(const_iterator __iter, value_type&& __v) 50936ac495dSmrg { 51036ac495dSmrg size_type __old_size = _Base::bucket_count(); 51136ac495dSmrg iterator __res = _Base::insert(__iter, std::move(__v)); 51236ac495dSmrg this->_M_profile_resize(__old_size); 51336ac495dSmrg return __res; 51436ac495dSmrg } 51536ac495dSmrg 51636ac495dSmrg template<typename _InputIter> 51736ac495dSmrg void 51836ac495dSmrg insert(_InputIter __first, _InputIter __last) 51936ac495dSmrg { 52036ac495dSmrg size_type __old_size = _Base::bucket_count(); 52136ac495dSmrg _Base::insert(__first, __last); 52236ac495dSmrg this->_M_profile_resize(__old_size); 52336ac495dSmrg } 52436ac495dSmrg 52536ac495dSmrg void 52636ac495dSmrg rehash(size_type __n) 52736ac495dSmrg { 52836ac495dSmrg size_type __old_size = _Base::bucket_count(); 52936ac495dSmrg _Base::rehash(__n); 53036ac495dSmrg this->_M_profile_resize(__old_size); 53136ac495dSmrg } 53236ac495dSmrg }; 53336ac495dSmrg 53436ac495dSmrg template<typename _Value, typename _Hash, typename _Pred, typename _Alloc> 53536ac495dSmrg inline void 53636ac495dSmrg swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 53736ac495dSmrg unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 53836ac495dSmrg noexcept(noexcept(__x.swap(__y))) 53936ac495dSmrg { __x.swap(__y); } 54036ac495dSmrg 54136ac495dSmrg template<typename _Value, typename _Hash, typename _Pred, typename _Alloc> 54236ac495dSmrg inline bool 54336ac495dSmrg operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 54436ac495dSmrg const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 54536ac495dSmrg { return static_cast<const _GLIBCXX_STD_BASE&>(__x) == __y; } 54636ac495dSmrg 54736ac495dSmrg template<typename _Value, typename _Hash, typename _Pred, typename _Alloc> 54836ac495dSmrg inline bool 54936ac495dSmrg operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, 55036ac495dSmrg const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) 55136ac495dSmrg { return !(__x == __y); } 55236ac495dSmrg 55336ac495dSmrg} // namespace __profile 55436ac495dSmrg} // namespace std 55536ac495dSmrg 55636ac495dSmrg#undef _GLIBCXX_BASE 55736ac495dSmrg#undef _GLIBCXX_STD_BASE 55836ac495dSmrg 55936ac495dSmrg#endif // C++11 56036ac495dSmrg 56136ac495dSmrg#endif 562