xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/profile/unordered_set (revision c0a68be459da21030695f60d10265c2fc49758f8)
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