100db7afdSDavid E. O'Brien// Hashing set implementation -*- C++ -*-
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev// Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
400db7afdSDavid E. O'Brien//
500db7afdSDavid E. O'Brien// This file is part of the GNU ISO C++ Library.  This library is free
600db7afdSDavid E. O'Brien// software; you can redistribute it and/or modify it under the
700db7afdSDavid E. O'Brien// terms of the GNU General Public License as published by the
800db7afdSDavid E. O'Brien// Free Software Foundation; either version 2, or (at your option)
900db7afdSDavid E. O'Brien// any later version.
1000db7afdSDavid E. O'Brien
1100db7afdSDavid E. O'Brien// This library is distributed in the hope that it will be useful,
1200db7afdSDavid E. O'Brien// but WITHOUT ANY WARRANTY; without even the implied warranty of
1300db7afdSDavid E. O'Brien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1400db7afdSDavid E. O'Brien// GNU General Public License for more details.
1500db7afdSDavid E. O'Brien
1600db7afdSDavid E. O'Brien// You should have received a copy of the GNU General Public License along
1700db7afdSDavid E. O'Brien// with this library; see the file COPYING.  If not, write to the Free
18*f8a1b7d9SAlexander Kabaev// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1900db7afdSDavid E. O'Brien// USA.
2000db7afdSDavid E. O'Brien
2100db7afdSDavid E. O'Brien// As a special exception, you may use this file as part of a free software
2200db7afdSDavid E. O'Brien// library without restriction.  Specifically, if other files instantiate
2300db7afdSDavid E. O'Brien// templates or use macros or inline functions from this file, or you compile
2400db7afdSDavid E. O'Brien// this file and link it with other files to produce an executable, this
2500db7afdSDavid E. O'Brien// file does not by itself cause the resulting executable to be covered by
2600db7afdSDavid E. O'Brien// the GNU General Public License.  This exception does not however
2700db7afdSDavid E. O'Brien// invalidate any other reasons why the executable file might be covered by
2800db7afdSDavid E. O'Brien// the GNU General Public License.
2900db7afdSDavid E. O'Brien
3000db7afdSDavid E. O'Brien/*
3100db7afdSDavid E. O'Brien * Copyright (c) 1996
3200db7afdSDavid E. O'Brien * Silicon Graphics Computer Systems, Inc.
3300db7afdSDavid E. O'Brien *
3400db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software
3500db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee,
3600db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and
3700db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear
3800db7afdSDavid E. O'Brien * in supporting documentation.  Silicon Graphics makes no
3900db7afdSDavid E. O'Brien * representations about the suitability of this software for any
4000db7afdSDavid E. O'Brien * purpose.  It is provided "as is" without express or implied warranty.
4100db7afdSDavid E. O'Brien *
4200db7afdSDavid E. O'Brien *
4300db7afdSDavid E. O'Brien * Copyright (c) 1994
4400db7afdSDavid E. O'Brien * Hewlett-Packard Company
4500db7afdSDavid E. O'Brien *
4600db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software
4700db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee,
4800db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and
4900db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear
5000db7afdSDavid E. O'Brien * in supporting documentation.  Hewlett-Packard Company makes no
5100db7afdSDavid E. O'Brien * representations about the suitability of this software for any
5200db7afdSDavid E. O'Brien * purpose.  It is provided "as is" without express or implied warranty.
5300db7afdSDavid E. O'Brien *
5400db7afdSDavid E. O'Brien */
5500db7afdSDavid E. O'Brien
5600db7afdSDavid E. O'Brien/** @file ext/hash_set
5700db7afdSDavid E. O'Brien *  This file is a GNU extension to the Standard C++ Library (possibly
58*f8a1b7d9SAlexander Kabaev *  containing extensions from the HP/SGI STL subset).
5900db7afdSDavid E. O'Brien */
6000db7afdSDavid E. O'Brien
61ffeaf689SAlexander Kabaev#ifndef _HASH_SET
62ffeaf689SAlexander Kabaev#define _HASH_SET 1
6300db7afdSDavid E. O'Brien
64*f8a1b7d9SAlexander Kabaev#include <bits/c++config.h>
65ffeaf689SAlexander Kabaev#include <ext/hashtable.h>
6600db7afdSDavid E. O'Brien#include <bits/concept_check.h>
6700db7afdSDavid E. O'Brien
68*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NESTED_NAMESPACE(__gnu_cxx, _GLIBCXX_EXT)
69*f8a1b7d9SAlexander Kabaev
7000db7afdSDavid E. O'Brien  using std::equal_to;
7100db7afdSDavid E. O'Brien  using std::allocator;
7200db7afdSDavid E. O'Brien  using std::pair;
7300db7afdSDavid E. O'Brien  using std::_Identity;
7400db7afdSDavid E. O'Brien
75ca6500fcSAlexander Kabaev  /**
76ca6500fcSAlexander Kabaev   *  This is an SGI extension.
77ca6500fcSAlexander Kabaev   *  @ingroup SGIextensions
78ca6500fcSAlexander Kabaev   *  @doctodo
79ca6500fcSAlexander Kabaev   */
80*f8a1b7d9SAlexander Kabaev  template<class _Value, class _HashFcn  = hash<_Value>,
81*f8a1b7d9SAlexander Kabaev	   class _EqualKey = equal_to<_Value>,
82*f8a1b7d9SAlexander Kabaev	   class _Alloc = allocator<_Value> >
8300db7afdSDavid E. O'Brien    class hash_set
8400db7afdSDavid E. O'Brien    {
8500db7afdSDavid E. O'Brien      // concept requirements
86ffeaf689SAlexander Kabaev      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
87ffeaf689SAlexander Kabaev      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
88ffeaf689SAlexander Kabaev      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
8900db7afdSDavid E. O'Brien
9000db7afdSDavid E. O'Brien    private:
9100db7afdSDavid E. O'Brien      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
9200db7afdSDavid E. O'Brien			_EqualKey, _Alloc> _Ht;
9300db7afdSDavid E. O'Brien      _Ht _M_ht;
9400db7afdSDavid E. O'Brien
9500db7afdSDavid E. O'Brien    public:
9600db7afdSDavid E. O'Brien      typedef typename _Ht::key_type key_type;
9700db7afdSDavid E. O'Brien      typedef typename _Ht::value_type value_type;
9800db7afdSDavid E. O'Brien      typedef typename _Ht::hasher hasher;
9900db7afdSDavid E. O'Brien      typedef typename _Ht::key_equal key_equal;
10000db7afdSDavid E. O'Brien
10100db7afdSDavid E. O'Brien      typedef typename _Ht::size_type size_type;
10200db7afdSDavid E. O'Brien      typedef typename _Ht::difference_type difference_type;
103ffeaf689SAlexander Kabaev      typedef typename _Alloc::pointer pointer;
104ffeaf689SAlexander Kabaev      typedef typename _Alloc::const_pointer const_pointer;
105ffeaf689SAlexander Kabaev      typedef typename _Alloc::reference reference;
106ffeaf689SAlexander Kabaev      typedef typename _Alloc::const_reference const_reference;
10700db7afdSDavid E. O'Brien
10800db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator iterator;
10900db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator const_iterator;
11000db7afdSDavid E. O'Brien
11100db7afdSDavid E. O'Brien      typedef typename _Ht::allocator_type allocator_type;
11200db7afdSDavid E. O'Brien
113*f8a1b7d9SAlexander Kabaev      hasher
114*f8a1b7d9SAlexander Kabaev      hash_funct() const
115*f8a1b7d9SAlexander Kabaev      { return _M_ht.hash_funct(); }
116*f8a1b7d9SAlexander Kabaev
117*f8a1b7d9SAlexander Kabaev      key_equal
118*f8a1b7d9SAlexander Kabaev      key_eq() const
119*f8a1b7d9SAlexander Kabaev      { return _M_ht.key_eq(); }
120*f8a1b7d9SAlexander Kabaev
121*f8a1b7d9SAlexander Kabaev      allocator_type
122*f8a1b7d9SAlexander Kabaev      get_allocator() const
123*f8a1b7d9SAlexander Kabaev      { return _M_ht.get_allocator(); }
12400db7afdSDavid E. O'Brien
12500db7afdSDavid E. O'Brien    public:
12600db7afdSDavid E. O'Brien      hash_set()
12700db7afdSDavid E. O'Brien      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
128*f8a1b7d9SAlexander Kabaev
129*f8a1b7d9SAlexander Kabaev      explicit
130*f8a1b7d9SAlexander Kabaev      hash_set(size_type __n)
13100db7afdSDavid E. O'Brien      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
132*f8a1b7d9SAlexander Kabaev
13300db7afdSDavid E. O'Brien      hash_set(size_type __n, const hasher& __hf)
13400db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
135*f8a1b7d9SAlexander Kabaev
13600db7afdSDavid E. O'Brien      hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
13700db7afdSDavid E. O'Brien	       const allocator_type& __a = allocator_type())
13800db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, __eql, __a) {}
13900db7afdSDavid E. O'Brien
14000db7afdSDavid E. O'Brien      template<class _InputIterator>
14100db7afdSDavid E. O'Brien        hash_set(_InputIterator __f, _InputIterator __l)
14200db7afdSDavid E. O'Brien	: _M_ht(100, hasher(), key_equal(), allocator_type())
14300db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
144*f8a1b7d9SAlexander Kabaev
14500db7afdSDavid E. O'Brien      template<class _InputIterator>
14600db7afdSDavid E. O'Brien        hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
14700db7afdSDavid E. O'Brien	: _M_ht(__n, hasher(), key_equal(), allocator_type())
14800db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
149*f8a1b7d9SAlexander Kabaev
15000db7afdSDavid E. O'Brien      template<class _InputIterator>
15100db7afdSDavid E. O'Brien        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
15200db7afdSDavid E. O'Brien		 const hasher& __hf)
15300db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, key_equal(), allocator_type())
15400db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
155*f8a1b7d9SAlexander Kabaev
15600db7afdSDavid E. O'Brien      template<class _InputIterator>
15700db7afdSDavid E. O'Brien        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
15800db7afdSDavid E. O'Brien		 const hasher& __hf, const key_equal& __eql,
15900db7afdSDavid E. O'Brien		 const allocator_type& __a = allocator_type())
16000db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, __eql, __a)
16100db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
16200db7afdSDavid E. O'Brien
16300db7afdSDavid E. O'Brien    public:
164*f8a1b7d9SAlexander Kabaev      size_type
165*f8a1b7d9SAlexander Kabaev      size() const
166*f8a1b7d9SAlexander Kabaev      { return _M_ht.size(); }
167*f8a1b7d9SAlexander Kabaev
168*f8a1b7d9SAlexander Kabaev      size_type
169*f8a1b7d9SAlexander Kabaev      max_size() const
170*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_size(); }
171*f8a1b7d9SAlexander Kabaev
172*f8a1b7d9SAlexander Kabaev      bool
173*f8a1b7d9SAlexander Kabaev      empty() const
174*f8a1b7d9SAlexander Kabaev      { return _M_ht.empty(); }
175*f8a1b7d9SAlexander Kabaev
176*f8a1b7d9SAlexander Kabaev      void
177*f8a1b7d9SAlexander Kabaev      swap(hash_set& __hs)
178*f8a1b7d9SAlexander Kabaev      { _M_ht.swap(__hs._M_ht); }
17900db7afdSDavid E. O'Brien
18000db7afdSDavid E. O'Brien      template<class _Val, class _HF, class _EqK, class _Al>
181*f8a1b7d9SAlexander Kabaev        friend bool
182*f8a1b7d9SAlexander Kabaev        operator==(const hash_set<_Val, _HF, _EqK, _Al>&,
18300db7afdSDavid E. O'Brien		   const hash_set<_Val, _HF, _EqK, _Al>&);
18400db7afdSDavid E. O'Brien
185*f8a1b7d9SAlexander Kabaev      iterator
186*f8a1b7d9SAlexander Kabaev      begin() const
187*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
188*f8a1b7d9SAlexander Kabaev
189*f8a1b7d9SAlexander Kabaev      iterator
190*f8a1b7d9SAlexander Kabaev      end() const
191*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
19200db7afdSDavid E. O'Brien
19300db7afdSDavid E. O'Brien    public:
194*f8a1b7d9SAlexander Kabaev      pair<iterator, bool>
195*f8a1b7d9SAlexander Kabaev      insert(const value_type& __obj)
19600db7afdSDavid E. O'Brien      {
19700db7afdSDavid E. O'Brien	pair<typename _Ht::iterator, bool> __p = _M_ht.insert_unique(__obj);
19800db7afdSDavid E. O'Brien	return pair<iterator,bool>(__p.first, __p.second);
19900db7afdSDavid E. O'Brien      }
200*f8a1b7d9SAlexander Kabaev
20100db7afdSDavid E. O'Brien      template<class _InputIterator>
202*f8a1b7d9SAlexander Kabaev        void
203*f8a1b7d9SAlexander Kabaev        insert(_InputIterator __f, _InputIterator __l)
20400db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
205*f8a1b7d9SAlexander Kabaev
206*f8a1b7d9SAlexander Kabaev      pair<iterator, bool>
207*f8a1b7d9SAlexander Kabaev      insert_noresize(const value_type& __obj)
20800db7afdSDavid E. O'Brien      {
209*f8a1b7d9SAlexander Kabaev	pair<typename _Ht::iterator, bool> __p
210*f8a1b7d9SAlexander Kabaev	  = _M_ht.insert_unique_noresize(__obj);
21100db7afdSDavid E. O'Brien	return pair<iterator, bool>(__p.first, __p.second);
21200db7afdSDavid E. O'Brien      }
21300db7afdSDavid E. O'Brien
214*f8a1b7d9SAlexander Kabaev      iterator
215*f8a1b7d9SAlexander Kabaev      find(const key_type& __key) const
216*f8a1b7d9SAlexander Kabaev      { return _M_ht.find(__key); }
21700db7afdSDavid E. O'Brien
218*f8a1b7d9SAlexander Kabaev      size_type
219*f8a1b7d9SAlexander Kabaev      count(const key_type& __key) const
220*f8a1b7d9SAlexander Kabaev      { return _M_ht.count(__key); }
22100db7afdSDavid E. O'Brien
222*f8a1b7d9SAlexander Kabaev      pair<iterator, iterator>
223*f8a1b7d9SAlexander Kabaev      equal_range(const key_type& __key) const
22400db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
22500db7afdSDavid E. O'Brien
226*f8a1b7d9SAlexander Kabaev      size_type
227*f8a1b7d9SAlexander Kabaev      erase(const key_type& __key)
228*f8a1b7d9SAlexander Kabaev      {return _M_ht.erase(__key); }
229*f8a1b7d9SAlexander Kabaev
230*f8a1b7d9SAlexander Kabaev      void
231*f8a1b7d9SAlexander Kabaev      erase(iterator __it)
232*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__it); }
233*f8a1b7d9SAlexander Kabaev
234*f8a1b7d9SAlexander Kabaev      void
235*f8a1b7d9SAlexander Kabaev      erase(iterator __f, iterator __l)
236*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__f, __l); }
237*f8a1b7d9SAlexander Kabaev
238*f8a1b7d9SAlexander Kabaev      void
239*f8a1b7d9SAlexander Kabaev      clear()
240*f8a1b7d9SAlexander Kabaev      { _M_ht.clear(); }
24100db7afdSDavid E. O'Brien
24200db7afdSDavid E. O'Brien    public:
243*f8a1b7d9SAlexander Kabaev      void
244*f8a1b7d9SAlexander Kabaev      resize(size_type __hint)
245*f8a1b7d9SAlexander Kabaev      { _M_ht.resize(__hint); }
246*f8a1b7d9SAlexander Kabaev
247*f8a1b7d9SAlexander Kabaev      size_type
248*f8a1b7d9SAlexander Kabaev      bucket_count() const
249*f8a1b7d9SAlexander Kabaev      { return _M_ht.bucket_count(); }
250*f8a1b7d9SAlexander Kabaev
251*f8a1b7d9SAlexander Kabaev      size_type
252*f8a1b7d9SAlexander Kabaev      max_bucket_count() const
253*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_bucket_count(); }
254*f8a1b7d9SAlexander Kabaev
255*f8a1b7d9SAlexander Kabaev      size_type
256*f8a1b7d9SAlexander Kabaev      elems_in_bucket(size_type __n) const
25700db7afdSDavid E. O'Brien      { return _M_ht.elems_in_bucket(__n); }
25800db7afdSDavid E. O'Brien    };
25900db7afdSDavid E. O'Brien
26000db7afdSDavid E. O'Brien  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
26100db7afdSDavid E. O'Brien    inline bool
26200db7afdSDavid E. O'Brien    operator==(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
26300db7afdSDavid E. O'Brien	       const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
264*f8a1b7d9SAlexander Kabaev    { return __hs1._M_ht == __hs2._M_ht; }
26500db7afdSDavid E. O'Brien
26600db7afdSDavid E. O'Brien  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
26700db7afdSDavid E. O'Brien    inline bool
26800db7afdSDavid E. O'Brien    operator!=(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
269*f8a1b7d9SAlexander Kabaev	       const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
270*f8a1b7d9SAlexander Kabaev    { return !(__hs1 == __hs2); }
27100db7afdSDavid E. O'Brien
27200db7afdSDavid E. O'Brien  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
27300db7afdSDavid E. O'Brien    inline void
27400db7afdSDavid E. O'Brien    swap(hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
27500db7afdSDavid E. O'Brien	 hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
276*f8a1b7d9SAlexander Kabaev    { __hs1.swap(__hs2); }
27700db7afdSDavid E. O'Brien
27800db7afdSDavid E. O'Brien
279ca6500fcSAlexander Kabaev  /**
280ca6500fcSAlexander Kabaev   *  This is an SGI extension.
281ca6500fcSAlexander Kabaev   *  @ingroup SGIextensions
282ca6500fcSAlexander Kabaev   *  @doctodo
283ca6500fcSAlexander Kabaev   */
284*f8a1b7d9SAlexander Kabaev  template<class _Value,
285*f8a1b7d9SAlexander Kabaev	   class _HashFcn = hash<_Value>,
286*f8a1b7d9SAlexander Kabaev	   class _EqualKey = equal_to<_Value>,
287*f8a1b7d9SAlexander Kabaev	   class _Alloc = allocator<_Value> >
28800db7afdSDavid E. O'Brien    class hash_multiset
28900db7afdSDavid E. O'Brien    {
29000db7afdSDavid E. O'Brien      // concept requirements
291ffeaf689SAlexander Kabaev      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
292ffeaf689SAlexander Kabaev      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
293ffeaf689SAlexander Kabaev      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
29400db7afdSDavid E. O'Brien
29500db7afdSDavid E. O'Brien    private:
29600db7afdSDavid E. O'Brien      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
29700db7afdSDavid E. O'Brien			_EqualKey, _Alloc> _Ht;
29800db7afdSDavid E. O'Brien      _Ht _M_ht;
29900db7afdSDavid E. O'Brien
30000db7afdSDavid E. O'Brien    public:
30100db7afdSDavid E. O'Brien      typedef typename _Ht::key_type key_type;
30200db7afdSDavid E. O'Brien      typedef typename _Ht::value_type value_type;
30300db7afdSDavid E. O'Brien      typedef typename _Ht::hasher hasher;
30400db7afdSDavid E. O'Brien      typedef typename _Ht::key_equal key_equal;
30500db7afdSDavid E. O'Brien
30600db7afdSDavid E. O'Brien      typedef typename _Ht::size_type size_type;
30700db7afdSDavid E. O'Brien      typedef typename _Ht::difference_type difference_type;
308ffeaf689SAlexander Kabaev      typedef typename _Alloc::pointer pointer;
309ffeaf689SAlexander Kabaev      typedef typename _Alloc::const_pointer const_pointer;
310ffeaf689SAlexander Kabaev      typedef typename _Alloc::reference reference;
311ffeaf689SAlexander Kabaev      typedef typename _Alloc::const_reference const_reference;
31200db7afdSDavid E. O'Brien
31300db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator iterator;
31400db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator const_iterator;
31500db7afdSDavid E. O'Brien
31600db7afdSDavid E. O'Brien      typedef typename _Ht::allocator_type allocator_type;
31700db7afdSDavid E. O'Brien
318*f8a1b7d9SAlexander Kabaev      hasher
319*f8a1b7d9SAlexander Kabaev      hash_funct() const
320*f8a1b7d9SAlexander Kabaev      { return _M_ht.hash_funct(); }
321*f8a1b7d9SAlexander Kabaev
322*f8a1b7d9SAlexander Kabaev      key_equal
323*f8a1b7d9SAlexander Kabaev      key_eq() const
324*f8a1b7d9SAlexander Kabaev      { return _M_ht.key_eq(); }
325*f8a1b7d9SAlexander Kabaev
326*f8a1b7d9SAlexander Kabaev      allocator_type
327*f8a1b7d9SAlexander Kabaev      get_allocator() const
328*f8a1b7d9SAlexander Kabaev      { return _M_ht.get_allocator(); }
32900db7afdSDavid E. O'Brien
33000db7afdSDavid E. O'Brien    public:
33100db7afdSDavid E. O'Brien      hash_multiset()
33200db7afdSDavid E. O'Brien      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
333*f8a1b7d9SAlexander Kabaev
334*f8a1b7d9SAlexander Kabaev      explicit
335*f8a1b7d9SAlexander Kabaev      hash_multiset(size_type __n)
33600db7afdSDavid E. O'Brien      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
337*f8a1b7d9SAlexander Kabaev
33800db7afdSDavid E. O'Brien      hash_multiset(size_type __n, const hasher& __hf)
33900db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
340*f8a1b7d9SAlexander Kabaev
34100db7afdSDavid E. O'Brien      hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
34200db7afdSDavid E. O'Brien		    const allocator_type& __a = allocator_type())
34300db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, __eql, __a) {}
34400db7afdSDavid E. O'Brien
34500db7afdSDavid E. O'Brien      template<class _InputIterator>
34600db7afdSDavid E. O'Brien        hash_multiset(_InputIterator __f, _InputIterator __l)
34700db7afdSDavid E. O'Brien	: _M_ht(100, hasher(), key_equal(), allocator_type())
34800db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
349*f8a1b7d9SAlexander Kabaev
35000db7afdSDavid E. O'Brien      template<class _InputIterator>
35100db7afdSDavid E. O'Brien        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
35200db7afdSDavid E. O'Brien	: _M_ht(__n, hasher(), key_equal(), allocator_type())
35300db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
354*f8a1b7d9SAlexander Kabaev
35500db7afdSDavid E. O'Brien      template<class _InputIterator>
35600db7afdSDavid E. O'Brien        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
35700db7afdSDavid E. O'Brien		      const hasher& __hf)
35800db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, key_equal(), allocator_type())
35900db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
360*f8a1b7d9SAlexander Kabaev
36100db7afdSDavid E. O'Brien      template<class _InputIterator>
36200db7afdSDavid E. O'Brien        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
36300db7afdSDavid E. O'Brien		      const hasher& __hf, const key_equal& __eql,
36400db7afdSDavid E. O'Brien		      const allocator_type& __a = allocator_type())
36500db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, __eql, __a)
36600db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
36700db7afdSDavid E. O'Brien
36800db7afdSDavid E. O'Brien    public:
369*f8a1b7d9SAlexander Kabaev      size_type
370*f8a1b7d9SAlexander Kabaev      size() const
371*f8a1b7d9SAlexander Kabaev      { return _M_ht.size(); }
372*f8a1b7d9SAlexander Kabaev
373*f8a1b7d9SAlexander Kabaev      size_type
374*f8a1b7d9SAlexander Kabaev      max_size() const
375*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_size(); }
376*f8a1b7d9SAlexander Kabaev
377*f8a1b7d9SAlexander Kabaev      bool
378*f8a1b7d9SAlexander Kabaev      empty() const
379*f8a1b7d9SAlexander Kabaev      { return _M_ht.empty(); }
380*f8a1b7d9SAlexander Kabaev
381*f8a1b7d9SAlexander Kabaev      void
382*f8a1b7d9SAlexander Kabaev      swap(hash_multiset& hs)
383*f8a1b7d9SAlexander Kabaev      { _M_ht.swap(hs._M_ht); }
38400db7afdSDavid E. O'Brien
38500db7afdSDavid E. O'Brien      template<class _Val, class _HF, class _EqK, class _Al>
386*f8a1b7d9SAlexander Kabaev        friend bool
387*f8a1b7d9SAlexander Kabaev        operator==(const hash_multiset<_Val, _HF, _EqK, _Al>&,
38800db7afdSDavid E. O'Brien		   const hash_multiset<_Val, _HF, _EqK, _Al>&);
38900db7afdSDavid E. O'Brien
390*f8a1b7d9SAlexander Kabaev      iterator
391*f8a1b7d9SAlexander Kabaev      begin() const
392*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
393*f8a1b7d9SAlexander Kabaev
394*f8a1b7d9SAlexander Kabaev      iterator
395*f8a1b7d9SAlexander Kabaev      end() const
396*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
39700db7afdSDavid E. O'Brien
39800db7afdSDavid E. O'Brien    public:
399*f8a1b7d9SAlexander Kabaev      iterator
400*f8a1b7d9SAlexander Kabaev      insert(const value_type& __obj)
40100db7afdSDavid E. O'Brien      { return _M_ht.insert_equal(__obj); }
402*f8a1b7d9SAlexander Kabaev
40300db7afdSDavid E. O'Brien      template<class _InputIterator>
404*f8a1b7d9SAlexander Kabaev        void
405*f8a1b7d9SAlexander Kabaev        insert(_InputIterator __f, _InputIterator __l)
40600db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f,__l); }
407*f8a1b7d9SAlexander Kabaev
408*f8a1b7d9SAlexander Kabaev      iterator
409*f8a1b7d9SAlexander Kabaev      insert_noresize(const value_type& __obj)
41000db7afdSDavid E. O'Brien      { return _M_ht.insert_equal_noresize(__obj); }
41100db7afdSDavid E. O'Brien
412*f8a1b7d9SAlexander Kabaev      iterator
413*f8a1b7d9SAlexander Kabaev      find(const key_type& __key) const
414*f8a1b7d9SAlexander Kabaev      { return _M_ht.find(__key); }
41500db7afdSDavid E. O'Brien
416*f8a1b7d9SAlexander Kabaev      size_type
417*f8a1b7d9SAlexander Kabaev      count(const key_type& __key) const
418*f8a1b7d9SAlexander Kabaev      { return _M_ht.count(__key); }
41900db7afdSDavid E. O'Brien
420*f8a1b7d9SAlexander Kabaev      pair<iterator, iterator>
421*f8a1b7d9SAlexander Kabaev      equal_range(const key_type& __key) const
42200db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
42300db7afdSDavid E. O'Brien
424*f8a1b7d9SAlexander Kabaev      size_type
425*f8a1b7d9SAlexander Kabaev      erase(const key_type& __key)
426*f8a1b7d9SAlexander Kabaev      { return _M_ht.erase(__key); }
427*f8a1b7d9SAlexander Kabaev
428*f8a1b7d9SAlexander Kabaev      void
429*f8a1b7d9SAlexander Kabaev      erase(iterator __it)
430*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__it); }
431*f8a1b7d9SAlexander Kabaev
432*f8a1b7d9SAlexander Kabaev      void
433*f8a1b7d9SAlexander Kabaev      erase(iterator __f, iterator __l)
434*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__f, __l); }
435*f8a1b7d9SAlexander Kabaev
436*f8a1b7d9SAlexander Kabaev      void
437*f8a1b7d9SAlexander Kabaev      clear()
438*f8a1b7d9SAlexander Kabaev      { _M_ht.clear(); }
43900db7afdSDavid E. O'Brien
44000db7afdSDavid E. O'Brien    public:
441*f8a1b7d9SAlexander Kabaev      void
442*f8a1b7d9SAlexander Kabaev      resize(size_type __hint)
443*f8a1b7d9SAlexander Kabaev      { _M_ht.resize(__hint); }
444*f8a1b7d9SAlexander Kabaev
445*f8a1b7d9SAlexander Kabaev      size_type
446*f8a1b7d9SAlexander Kabaev      bucket_count() const
447*f8a1b7d9SAlexander Kabaev      { return _M_ht.bucket_count(); }
448*f8a1b7d9SAlexander Kabaev
449*f8a1b7d9SAlexander Kabaev      size_type
450*f8a1b7d9SAlexander Kabaev      max_bucket_count() const
451*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_bucket_count(); }
452*f8a1b7d9SAlexander Kabaev
453*f8a1b7d9SAlexander Kabaev      size_type
454*f8a1b7d9SAlexander Kabaev      elems_in_bucket(size_type __n) const
45500db7afdSDavid E. O'Brien      { return _M_ht.elems_in_bucket(__n); }
45600db7afdSDavid E. O'Brien    };
45700db7afdSDavid E. O'Brien
45800db7afdSDavid E. O'Brien  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
45900db7afdSDavid E. O'Brien    inline bool
46000db7afdSDavid E. O'Brien    operator==(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
46100db7afdSDavid E. O'Brien	       const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
462*f8a1b7d9SAlexander Kabaev    { return __hs1._M_ht == __hs2._M_ht; }
46300db7afdSDavid E. O'Brien
46400db7afdSDavid E. O'Brien  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
46500db7afdSDavid E. O'Brien    inline bool
46600db7afdSDavid E. O'Brien    operator!=(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
467*f8a1b7d9SAlexander Kabaev	       const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
468*f8a1b7d9SAlexander Kabaev    { return !(__hs1 == __hs2); }
46900db7afdSDavid E. O'Brien
47000db7afdSDavid E. O'Brien  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
47100db7afdSDavid E. O'Brien    inline void
47200db7afdSDavid E. O'Brien    swap(hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
473*f8a1b7d9SAlexander Kabaev	 hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
474*f8a1b7d9SAlexander Kabaev    { __hs1.swap(__hs2); }
47500db7afdSDavid E. O'Brien
476*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NESTED_NAMESPACE
47700db7afdSDavid E. O'Brien
478*f8a1b7d9SAlexander Kabaev#ifdef _GLIBCXX_DEBUG
479*f8a1b7d9SAlexander Kabaev# include <debug/hash_set>
480*f8a1b7d9SAlexander Kabaev#endif
481*f8a1b7d9SAlexander Kabaev
482*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NAMESPACE(std)
483*f8a1b7d9SAlexander Kabaev
48400db7afdSDavid E. O'Brien  // Specialization of insert_iterator so that it will work for hash_set
48500db7afdSDavid E. O'Brien  // and hash_multiset.
48600db7afdSDavid E. O'Brien  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
487*f8a1b7d9SAlexander Kabaev    class insert_iterator<__gnu_cxx::hash_set<_Value, _HashFcn,
488*f8a1b7d9SAlexander Kabaev					      _EqualKey, _Alloc> >
489*f8a1b7d9SAlexander Kabaev    {
49000db7afdSDavid E. O'Brien    protected:
491*f8a1b7d9SAlexander Kabaev      typedef __gnu_cxx::hash_set<_Value, _HashFcn, _EqualKey, _Alloc>
492*f8a1b7d9SAlexander Kabaev        _Container;
49300db7afdSDavid E. O'Brien      _Container* container;
494*f8a1b7d9SAlexander Kabaev
49500db7afdSDavid E. O'Brien    public:
49600db7afdSDavid E. O'Brien      typedef _Container          container_type;
49700db7afdSDavid E. O'Brien      typedef output_iterator_tag iterator_category;
49800db7afdSDavid E. O'Brien      typedef void                value_type;
49900db7afdSDavid E. O'Brien      typedef void                difference_type;
50000db7afdSDavid E. O'Brien      typedef void                pointer;
50100db7afdSDavid E. O'Brien      typedef void                reference;
50200db7afdSDavid E. O'Brien
503*f8a1b7d9SAlexander Kabaev      insert_iterator(_Container& __x)
504*f8a1b7d9SAlexander Kabaev      : container(&__x) {}
505*f8a1b7d9SAlexander Kabaev
50600db7afdSDavid E. O'Brien      insert_iterator(_Container& __x, typename _Container::iterator)
50700db7afdSDavid E. O'Brien      : container(&__x) {}
508*f8a1b7d9SAlexander Kabaev
50900db7afdSDavid E. O'Brien      insert_iterator<_Container>&
510*f8a1b7d9SAlexander Kabaev      operator=(const typename _Container::value_type& __value)
511*f8a1b7d9SAlexander Kabaev      {
51200db7afdSDavid E. O'Brien	container->insert(__value);
51300db7afdSDavid E. O'Brien	return *this;
51400db7afdSDavid E. O'Brien      }
515*f8a1b7d9SAlexander Kabaev
516*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
517*f8a1b7d9SAlexander Kabaev      operator*()
518*f8a1b7d9SAlexander Kabaev      { return *this; }
519*f8a1b7d9SAlexander Kabaev
520*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
521*f8a1b7d9SAlexander Kabaev      operator++()
522*f8a1b7d9SAlexander Kabaev      { return *this; }
523*f8a1b7d9SAlexander Kabaev
524*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
525*f8a1b7d9SAlexander Kabaev      operator++(int)
526*f8a1b7d9SAlexander Kabaev      { return *this; }
52700db7afdSDavid E. O'Brien    };
52800db7afdSDavid E. O'Brien
52900db7afdSDavid E. O'Brien  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
530*f8a1b7d9SAlexander Kabaev    class insert_iterator<__gnu_cxx::hash_multiset<_Value, _HashFcn,
531*f8a1b7d9SAlexander Kabaev						   _EqualKey, _Alloc> >
532*f8a1b7d9SAlexander Kabaev    {
53300db7afdSDavid E. O'Brien    protected:
534*f8a1b7d9SAlexander Kabaev      typedef __gnu_cxx::hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc>
535*f8a1b7d9SAlexander Kabaev        _Container;
53600db7afdSDavid E. O'Brien      _Container* container;
53700db7afdSDavid E. O'Brien      typename _Container::iterator iter;
538*f8a1b7d9SAlexander Kabaev
53900db7afdSDavid E. O'Brien    public:
54000db7afdSDavid E. O'Brien      typedef _Container          container_type;
54100db7afdSDavid E. O'Brien      typedef output_iterator_tag iterator_category;
54200db7afdSDavid E. O'Brien      typedef void                value_type;
54300db7afdSDavid E. O'Brien      typedef void                difference_type;
54400db7afdSDavid E. O'Brien      typedef void                pointer;
54500db7afdSDavid E. O'Brien      typedef void                reference;
54600db7afdSDavid E. O'Brien
547*f8a1b7d9SAlexander Kabaev      insert_iterator(_Container& __x)
548*f8a1b7d9SAlexander Kabaev      : container(&__x) {}
549*f8a1b7d9SAlexander Kabaev
55000db7afdSDavid E. O'Brien      insert_iterator(_Container& __x, typename _Container::iterator)
55100db7afdSDavid E. O'Brien      : container(&__x) {}
552*f8a1b7d9SAlexander Kabaev
55300db7afdSDavid E. O'Brien      insert_iterator<_Container>&
554*f8a1b7d9SAlexander Kabaev      operator=(const typename _Container::value_type& __value)
555*f8a1b7d9SAlexander Kabaev      {
55600db7afdSDavid E. O'Brien	container->insert(__value);
55700db7afdSDavid E. O'Brien	return *this;
55800db7afdSDavid E. O'Brien      }
559*f8a1b7d9SAlexander Kabaev
560*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
561*f8a1b7d9SAlexander Kabaev      operator*()
562*f8a1b7d9SAlexander Kabaev      { return *this; }
563*f8a1b7d9SAlexander Kabaev
564*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
565*f8a1b7d9SAlexander Kabaev      operator++()
566*f8a1b7d9SAlexander Kabaev      { return *this; }
567*f8a1b7d9SAlexander Kabaev
568*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
569*f8a1b7d9SAlexander Kabaev      operator++(int) { return *this; }
57000db7afdSDavid E. O'Brien    };
571*f8a1b7d9SAlexander Kabaev
572*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE
57300db7afdSDavid E. O'Brien
574ffeaf689SAlexander Kabaev#endif
575