xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/backward/hash_set (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// Hashing set implementation -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 2001, 2002, 2004, 2005, 2006, 2009, 2010
4*e4b17023SJohn Marino// Free Software Foundation, Inc.
5*e4b17023SJohn Marino//
6*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino// any later version.
11*e4b17023SJohn Marino
12*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino// GNU General Public License for more details.
16*e4b17023SJohn Marino
17*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino
21*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino
26*e4b17023SJohn Marino/*
27*e4b17023SJohn Marino * Copyright (c) 1996
28*e4b17023SJohn Marino * Silicon Graphics Computer Systems, Inc.
29*e4b17023SJohn Marino *
30*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software
31*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee,
32*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and
33*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear
34*e4b17023SJohn Marino * in supporting documentation.  Silicon Graphics makes no
35*e4b17023SJohn Marino * representations about the suitability of this software for any
36*e4b17023SJohn Marino * purpose.  It is provided "as is" without express or implied warranty.
37*e4b17023SJohn Marino *
38*e4b17023SJohn Marino *
39*e4b17023SJohn Marino * Copyright (c) 1994
40*e4b17023SJohn Marino * Hewlett-Packard Company
41*e4b17023SJohn Marino *
42*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software
43*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee,
44*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and
45*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear
46*e4b17023SJohn Marino * in supporting documentation.  Hewlett-Packard Company makes no
47*e4b17023SJohn Marino * representations about the suitability of this software for any
48*e4b17023SJohn Marino * purpose.  It is provided "as is" without express or implied warranty.
49*e4b17023SJohn Marino *
50*e4b17023SJohn Marino */
51*e4b17023SJohn Marino
52*e4b17023SJohn Marino/** @file backward/hash_set
53*e4b17023SJohn Marino *  This file is a GNU extension to the Standard C++ Library (possibly
54*e4b17023SJohn Marino *  containing extensions from the HP/SGI STL subset).
55*e4b17023SJohn Marino */
56*e4b17023SJohn Marino
57*e4b17023SJohn Marino#ifndef _BACKWARD_HASH_SET
58*e4b17023SJohn Marino#define _BACKWARD_HASH_SET 1
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino#ifndef _GLIBCXX_PERMIT_BACKWARD_HASH
61*e4b17023SJohn Marino#include "backward_warning.h"
62*e4b17023SJohn Marino#endif
63*e4b17023SJohn Marino
64*e4b17023SJohn Marino#include <bits/c++config.h>
65*e4b17023SJohn Marino#include <backward/hashtable.h>
66*e4b17023SJohn Marino#include <bits/concept_check.h>
67*e4b17023SJohn Marino
68*e4b17023SJohn Marinonamespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
69*e4b17023SJohn Marino{
70*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
71*e4b17023SJohn Marino
72*e4b17023SJohn Marino  using std::equal_to;
73*e4b17023SJohn Marino  using std::allocator;
74*e4b17023SJohn Marino  using std::pair;
75*e4b17023SJohn Marino  using std::_Identity;
76*e4b17023SJohn Marino
77*e4b17023SJohn Marino  /**
78*e4b17023SJohn Marino   *  This is an SGI extension.
79*e4b17023SJohn Marino   *  @ingroup SGIextensions
80*e4b17023SJohn Marino   *  @doctodo
81*e4b17023SJohn Marino   */
82*e4b17023SJohn Marino  template<class _Value, class _HashFcn  = hash<_Value>,
83*e4b17023SJohn Marino	   class _EqualKey = equal_to<_Value>,
84*e4b17023SJohn Marino	   class _Alloc = allocator<_Value> >
85*e4b17023SJohn Marino    class hash_set
86*e4b17023SJohn Marino    {
87*e4b17023SJohn Marino      // concept requirements
88*e4b17023SJohn Marino      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
89*e4b17023SJohn Marino      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
90*e4b17023SJohn Marino      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
91*e4b17023SJohn Marino
92*e4b17023SJohn Marino    private:
93*e4b17023SJohn Marino      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
94*e4b17023SJohn Marino			_EqualKey, _Alloc> _Ht;
95*e4b17023SJohn Marino      _Ht _M_ht;
96*e4b17023SJohn Marino
97*e4b17023SJohn Marino    public:
98*e4b17023SJohn Marino      typedef typename _Ht::key_type key_type;
99*e4b17023SJohn Marino      typedef typename _Ht::value_type value_type;
100*e4b17023SJohn Marino      typedef typename _Ht::hasher hasher;
101*e4b17023SJohn Marino      typedef typename _Ht::key_equal key_equal;
102*e4b17023SJohn Marino
103*e4b17023SJohn Marino      typedef typename _Ht::size_type size_type;
104*e4b17023SJohn Marino      typedef typename _Ht::difference_type difference_type;
105*e4b17023SJohn Marino      typedef typename _Alloc::pointer pointer;
106*e4b17023SJohn Marino      typedef typename _Alloc::const_pointer const_pointer;
107*e4b17023SJohn Marino      typedef typename _Alloc::reference reference;
108*e4b17023SJohn Marino      typedef typename _Alloc::const_reference const_reference;
109*e4b17023SJohn Marino
110*e4b17023SJohn Marino      typedef typename _Ht::const_iterator iterator;
111*e4b17023SJohn Marino      typedef typename _Ht::const_iterator const_iterator;
112*e4b17023SJohn Marino
113*e4b17023SJohn Marino      typedef typename _Ht::allocator_type allocator_type;
114*e4b17023SJohn Marino
115*e4b17023SJohn Marino      hasher
116*e4b17023SJohn Marino      hash_funct() const
117*e4b17023SJohn Marino      { return _M_ht.hash_funct(); }
118*e4b17023SJohn Marino
119*e4b17023SJohn Marino      key_equal
120*e4b17023SJohn Marino      key_eq() const
121*e4b17023SJohn Marino      { return _M_ht.key_eq(); }
122*e4b17023SJohn Marino
123*e4b17023SJohn Marino      allocator_type
124*e4b17023SJohn Marino      get_allocator() const
125*e4b17023SJohn Marino      { return _M_ht.get_allocator(); }
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino      hash_set()
128*e4b17023SJohn Marino      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
129*e4b17023SJohn Marino
130*e4b17023SJohn Marino      explicit
131*e4b17023SJohn Marino      hash_set(size_type __n)
132*e4b17023SJohn Marino      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
133*e4b17023SJohn Marino
134*e4b17023SJohn Marino      hash_set(size_type __n, const hasher& __hf)
135*e4b17023SJohn Marino      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
136*e4b17023SJohn Marino
137*e4b17023SJohn Marino      hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
138*e4b17023SJohn Marino	       const allocator_type& __a = allocator_type())
139*e4b17023SJohn Marino      : _M_ht(__n, __hf, __eql, __a) {}
140*e4b17023SJohn Marino
141*e4b17023SJohn Marino      template<class _InputIterator>
142*e4b17023SJohn Marino        hash_set(_InputIterator __f, _InputIterator __l)
143*e4b17023SJohn Marino	: _M_ht(100, hasher(), key_equal(), allocator_type())
144*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
145*e4b17023SJohn Marino
146*e4b17023SJohn Marino      template<class _InputIterator>
147*e4b17023SJohn Marino        hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
148*e4b17023SJohn Marino	: _M_ht(__n, hasher(), key_equal(), allocator_type())
149*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
150*e4b17023SJohn Marino
151*e4b17023SJohn Marino      template<class _InputIterator>
152*e4b17023SJohn Marino        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
153*e4b17023SJohn Marino		 const hasher& __hf)
154*e4b17023SJohn Marino	: _M_ht(__n, __hf, key_equal(), allocator_type())
155*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
156*e4b17023SJohn Marino
157*e4b17023SJohn Marino      template<class _InputIterator>
158*e4b17023SJohn Marino        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
159*e4b17023SJohn Marino		 const hasher& __hf, const key_equal& __eql,
160*e4b17023SJohn Marino		 const allocator_type& __a = allocator_type())
161*e4b17023SJohn Marino	: _M_ht(__n, __hf, __eql, __a)
162*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
163*e4b17023SJohn Marino
164*e4b17023SJohn Marino      size_type
165*e4b17023SJohn Marino      size() const
166*e4b17023SJohn Marino      { return _M_ht.size(); }
167*e4b17023SJohn Marino
168*e4b17023SJohn Marino      size_type
169*e4b17023SJohn Marino      max_size() const
170*e4b17023SJohn Marino      { return _M_ht.max_size(); }
171*e4b17023SJohn Marino
172*e4b17023SJohn Marino      bool
173*e4b17023SJohn Marino      empty() const
174*e4b17023SJohn Marino      { return _M_ht.empty(); }
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino      void
177*e4b17023SJohn Marino      swap(hash_set& __hs)
178*e4b17023SJohn Marino      { _M_ht.swap(__hs._M_ht); }
179*e4b17023SJohn Marino
180*e4b17023SJohn Marino      template<class _Val, class _HF, class _EqK, class _Al>
181*e4b17023SJohn Marino        friend bool
182*e4b17023SJohn Marino        operator==(const hash_set<_Val, _HF, _EqK, _Al>&,
183*e4b17023SJohn Marino		   const hash_set<_Val, _HF, _EqK, _Al>&);
184*e4b17023SJohn Marino
185*e4b17023SJohn Marino      iterator
186*e4b17023SJohn Marino      begin() const
187*e4b17023SJohn Marino      { return _M_ht.begin(); }
188*e4b17023SJohn Marino
189*e4b17023SJohn Marino      iterator
190*e4b17023SJohn Marino      end() const
191*e4b17023SJohn Marino      { return _M_ht.end(); }
192*e4b17023SJohn Marino
193*e4b17023SJohn Marino      pair<iterator, bool>
194*e4b17023SJohn Marino      insert(const value_type& __obj)
195*e4b17023SJohn Marino      {
196*e4b17023SJohn Marino	pair<typename _Ht::iterator, bool> __p = _M_ht.insert_unique(__obj);
197*e4b17023SJohn Marino	return pair<iterator,bool>(__p.first, __p.second);
198*e4b17023SJohn Marino      }
199*e4b17023SJohn Marino
200*e4b17023SJohn Marino      template<class _InputIterator>
201*e4b17023SJohn Marino        void
202*e4b17023SJohn Marino        insert(_InputIterator __f, _InputIterator __l)
203*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
204*e4b17023SJohn Marino
205*e4b17023SJohn Marino      pair<iterator, bool>
206*e4b17023SJohn Marino      insert_noresize(const value_type& __obj)
207*e4b17023SJohn Marino      {
208*e4b17023SJohn Marino	pair<typename _Ht::iterator, bool> __p
209*e4b17023SJohn Marino	  = _M_ht.insert_unique_noresize(__obj);
210*e4b17023SJohn Marino	return pair<iterator, bool>(__p.first, __p.second);
211*e4b17023SJohn Marino      }
212*e4b17023SJohn Marino
213*e4b17023SJohn Marino      iterator
214*e4b17023SJohn Marino      find(const key_type& __key) const
215*e4b17023SJohn Marino      { return _M_ht.find(__key); }
216*e4b17023SJohn Marino
217*e4b17023SJohn Marino      size_type
218*e4b17023SJohn Marino      count(const key_type& __key) const
219*e4b17023SJohn Marino      { return _M_ht.count(__key); }
220*e4b17023SJohn Marino
221*e4b17023SJohn Marino      pair<iterator, iterator>
222*e4b17023SJohn Marino      equal_range(const key_type& __key) const
223*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
224*e4b17023SJohn Marino
225*e4b17023SJohn Marino      size_type
226*e4b17023SJohn Marino      erase(const key_type& __key)
227*e4b17023SJohn Marino      {return _M_ht.erase(__key); }
228*e4b17023SJohn Marino
229*e4b17023SJohn Marino      void
230*e4b17023SJohn Marino      erase(iterator __it)
231*e4b17023SJohn Marino      { _M_ht.erase(__it); }
232*e4b17023SJohn Marino
233*e4b17023SJohn Marino      void
234*e4b17023SJohn Marino      erase(iterator __f, iterator __l)
235*e4b17023SJohn Marino      { _M_ht.erase(__f, __l); }
236*e4b17023SJohn Marino
237*e4b17023SJohn Marino      void
238*e4b17023SJohn Marino      clear()
239*e4b17023SJohn Marino      { _M_ht.clear(); }
240*e4b17023SJohn Marino
241*e4b17023SJohn Marino      void
242*e4b17023SJohn Marino      resize(size_type __hint)
243*e4b17023SJohn Marino      { _M_ht.resize(__hint); }
244*e4b17023SJohn Marino
245*e4b17023SJohn Marino      size_type
246*e4b17023SJohn Marino      bucket_count() const
247*e4b17023SJohn Marino      { return _M_ht.bucket_count(); }
248*e4b17023SJohn Marino
249*e4b17023SJohn Marino      size_type
250*e4b17023SJohn Marino      max_bucket_count() const
251*e4b17023SJohn Marino      { return _M_ht.max_bucket_count(); }
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino      size_type
254*e4b17023SJohn Marino      elems_in_bucket(size_type __n) const
255*e4b17023SJohn Marino      { return _M_ht.elems_in_bucket(__n); }
256*e4b17023SJohn Marino    };
257*e4b17023SJohn Marino
258*e4b17023SJohn Marino  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
259*e4b17023SJohn Marino    inline bool
260*e4b17023SJohn Marino    operator==(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
261*e4b17023SJohn Marino	       const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
262*e4b17023SJohn Marino    { return __hs1._M_ht == __hs2._M_ht; }
263*e4b17023SJohn Marino
264*e4b17023SJohn Marino  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
265*e4b17023SJohn Marino    inline bool
266*e4b17023SJohn Marino    operator!=(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
267*e4b17023SJohn Marino	       const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
268*e4b17023SJohn Marino    { return !(__hs1 == __hs2); }
269*e4b17023SJohn Marino
270*e4b17023SJohn Marino  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
271*e4b17023SJohn Marino    inline void
272*e4b17023SJohn Marino    swap(hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
273*e4b17023SJohn Marino	 hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
274*e4b17023SJohn Marino    { __hs1.swap(__hs2); }
275*e4b17023SJohn Marino
276*e4b17023SJohn Marino
277*e4b17023SJohn Marino  /**
278*e4b17023SJohn Marino   *  This is an SGI extension.
279*e4b17023SJohn Marino   *  @ingroup SGIextensions
280*e4b17023SJohn Marino   *  @doctodo
281*e4b17023SJohn Marino   */
282*e4b17023SJohn Marino  template<class _Value,
283*e4b17023SJohn Marino	   class _HashFcn = hash<_Value>,
284*e4b17023SJohn Marino	   class _EqualKey = equal_to<_Value>,
285*e4b17023SJohn Marino	   class _Alloc = allocator<_Value> >
286*e4b17023SJohn Marino    class hash_multiset
287*e4b17023SJohn Marino    {
288*e4b17023SJohn Marino      // concept requirements
289*e4b17023SJohn Marino      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
290*e4b17023SJohn Marino      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
291*e4b17023SJohn Marino      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
292*e4b17023SJohn Marino
293*e4b17023SJohn Marino    private:
294*e4b17023SJohn Marino      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
295*e4b17023SJohn Marino			_EqualKey, _Alloc> _Ht;
296*e4b17023SJohn Marino      _Ht _M_ht;
297*e4b17023SJohn Marino
298*e4b17023SJohn Marino    public:
299*e4b17023SJohn Marino      typedef typename _Ht::key_type key_type;
300*e4b17023SJohn Marino      typedef typename _Ht::value_type value_type;
301*e4b17023SJohn Marino      typedef typename _Ht::hasher hasher;
302*e4b17023SJohn Marino      typedef typename _Ht::key_equal key_equal;
303*e4b17023SJohn Marino
304*e4b17023SJohn Marino      typedef typename _Ht::size_type size_type;
305*e4b17023SJohn Marino      typedef typename _Ht::difference_type difference_type;
306*e4b17023SJohn Marino      typedef typename _Alloc::pointer pointer;
307*e4b17023SJohn Marino      typedef typename _Alloc::const_pointer const_pointer;
308*e4b17023SJohn Marino      typedef typename _Alloc::reference reference;
309*e4b17023SJohn Marino      typedef typename _Alloc::const_reference const_reference;
310*e4b17023SJohn Marino
311*e4b17023SJohn Marino      typedef typename _Ht::const_iterator iterator;
312*e4b17023SJohn Marino      typedef typename _Ht::const_iterator const_iterator;
313*e4b17023SJohn Marino
314*e4b17023SJohn Marino      typedef typename _Ht::allocator_type allocator_type;
315*e4b17023SJohn Marino
316*e4b17023SJohn Marino      hasher
317*e4b17023SJohn Marino      hash_funct() const
318*e4b17023SJohn Marino      { return _M_ht.hash_funct(); }
319*e4b17023SJohn Marino
320*e4b17023SJohn Marino      key_equal
321*e4b17023SJohn Marino      key_eq() const
322*e4b17023SJohn Marino      { return _M_ht.key_eq(); }
323*e4b17023SJohn Marino
324*e4b17023SJohn Marino      allocator_type
325*e4b17023SJohn Marino      get_allocator() const
326*e4b17023SJohn Marino      { return _M_ht.get_allocator(); }
327*e4b17023SJohn Marino
328*e4b17023SJohn Marino      hash_multiset()
329*e4b17023SJohn Marino      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
330*e4b17023SJohn Marino
331*e4b17023SJohn Marino      explicit
332*e4b17023SJohn Marino      hash_multiset(size_type __n)
333*e4b17023SJohn Marino      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
334*e4b17023SJohn Marino
335*e4b17023SJohn Marino      hash_multiset(size_type __n, const hasher& __hf)
336*e4b17023SJohn Marino      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
337*e4b17023SJohn Marino
338*e4b17023SJohn Marino      hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
339*e4b17023SJohn Marino		    const allocator_type& __a = allocator_type())
340*e4b17023SJohn Marino      : _M_ht(__n, __hf, __eql, __a) {}
341*e4b17023SJohn Marino
342*e4b17023SJohn Marino      template<class _InputIterator>
343*e4b17023SJohn Marino        hash_multiset(_InputIterator __f, _InputIterator __l)
344*e4b17023SJohn Marino	: _M_ht(100, hasher(), key_equal(), allocator_type())
345*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
346*e4b17023SJohn Marino
347*e4b17023SJohn Marino      template<class _InputIterator>
348*e4b17023SJohn Marino        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
349*e4b17023SJohn Marino	: _M_ht(__n, hasher(), key_equal(), allocator_type())
350*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
351*e4b17023SJohn Marino
352*e4b17023SJohn Marino      template<class _InputIterator>
353*e4b17023SJohn Marino        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
354*e4b17023SJohn Marino		      const hasher& __hf)
355*e4b17023SJohn Marino	: _M_ht(__n, __hf, key_equal(), allocator_type())
356*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino      template<class _InputIterator>
359*e4b17023SJohn Marino        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
360*e4b17023SJohn Marino		      const hasher& __hf, const key_equal& __eql,
361*e4b17023SJohn Marino		      const allocator_type& __a = allocator_type())
362*e4b17023SJohn Marino	: _M_ht(__n, __hf, __eql, __a)
363*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
364*e4b17023SJohn Marino
365*e4b17023SJohn Marino      size_type
366*e4b17023SJohn Marino      size() const
367*e4b17023SJohn Marino      { return _M_ht.size(); }
368*e4b17023SJohn Marino
369*e4b17023SJohn Marino      size_type
370*e4b17023SJohn Marino      max_size() const
371*e4b17023SJohn Marino      { return _M_ht.max_size(); }
372*e4b17023SJohn Marino
373*e4b17023SJohn Marino      bool
374*e4b17023SJohn Marino      empty() const
375*e4b17023SJohn Marino      { return _M_ht.empty(); }
376*e4b17023SJohn Marino
377*e4b17023SJohn Marino      void
378*e4b17023SJohn Marino      swap(hash_multiset& hs)
379*e4b17023SJohn Marino      { _M_ht.swap(hs._M_ht); }
380*e4b17023SJohn Marino
381*e4b17023SJohn Marino      template<class _Val, class _HF, class _EqK, class _Al>
382*e4b17023SJohn Marino        friend bool
383*e4b17023SJohn Marino        operator==(const hash_multiset<_Val, _HF, _EqK, _Al>&,
384*e4b17023SJohn Marino		   const hash_multiset<_Val, _HF, _EqK, _Al>&);
385*e4b17023SJohn Marino
386*e4b17023SJohn Marino      iterator
387*e4b17023SJohn Marino      begin() const
388*e4b17023SJohn Marino      { return _M_ht.begin(); }
389*e4b17023SJohn Marino
390*e4b17023SJohn Marino      iterator
391*e4b17023SJohn Marino      end() const
392*e4b17023SJohn Marino      { return _M_ht.end(); }
393*e4b17023SJohn Marino
394*e4b17023SJohn Marino      iterator
395*e4b17023SJohn Marino      insert(const value_type& __obj)
396*e4b17023SJohn Marino      { return _M_ht.insert_equal(__obj); }
397*e4b17023SJohn Marino
398*e4b17023SJohn Marino      template<class _InputIterator>
399*e4b17023SJohn Marino        void
400*e4b17023SJohn Marino        insert(_InputIterator __f, _InputIterator __l)
401*e4b17023SJohn Marino        { _M_ht.insert_equal(__f,__l); }
402*e4b17023SJohn Marino
403*e4b17023SJohn Marino      iterator
404*e4b17023SJohn Marino      insert_noresize(const value_type& __obj)
405*e4b17023SJohn Marino      { return _M_ht.insert_equal_noresize(__obj); }
406*e4b17023SJohn Marino
407*e4b17023SJohn Marino      iterator
408*e4b17023SJohn Marino      find(const key_type& __key) const
409*e4b17023SJohn Marino      { return _M_ht.find(__key); }
410*e4b17023SJohn Marino
411*e4b17023SJohn Marino      size_type
412*e4b17023SJohn Marino      count(const key_type& __key) const
413*e4b17023SJohn Marino      { return _M_ht.count(__key); }
414*e4b17023SJohn Marino
415*e4b17023SJohn Marino      pair<iterator, iterator>
416*e4b17023SJohn Marino      equal_range(const key_type& __key) const
417*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
418*e4b17023SJohn Marino
419*e4b17023SJohn Marino      size_type
420*e4b17023SJohn Marino      erase(const key_type& __key)
421*e4b17023SJohn Marino      { return _M_ht.erase(__key); }
422*e4b17023SJohn Marino
423*e4b17023SJohn Marino      void
424*e4b17023SJohn Marino      erase(iterator __it)
425*e4b17023SJohn Marino      { _M_ht.erase(__it); }
426*e4b17023SJohn Marino
427*e4b17023SJohn Marino      void
428*e4b17023SJohn Marino      erase(iterator __f, iterator __l)
429*e4b17023SJohn Marino      { _M_ht.erase(__f, __l); }
430*e4b17023SJohn Marino
431*e4b17023SJohn Marino      void
432*e4b17023SJohn Marino      clear()
433*e4b17023SJohn Marino      { _M_ht.clear(); }
434*e4b17023SJohn Marino
435*e4b17023SJohn Marino      void
436*e4b17023SJohn Marino      resize(size_type __hint)
437*e4b17023SJohn Marino      { _M_ht.resize(__hint); }
438*e4b17023SJohn Marino
439*e4b17023SJohn Marino      size_type
440*e4b17023SJohn Marino      bucket_count() const
441*e4b17023SJohn Marino      { return _M_ht.bucket_count(); }
442*e4b17023SJohn Marino
443*e4b17023SJohn Marino      size_type
444*e4b17023SJohn Marino      max_bucket_count() const
445*e4b17023SJohn Marino      { return _M_ht.max_bucket_count(); }
446*e4b17023SJohn Marino
447*e4b17023SJohn Marino      size_type
448*e4b17023SJohn Marino      elems_in_bucket(size_type __n) const
449*e4b17023SJohn Marino      { return _M_ht.elems_in_bucket(__n); }
450*e4b17023SJohn Marino    };
451*e4b17023SJohn Marino
452*e4b17023SJohn Marino  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
453*e4b17023SJohn Marino    inline bool
454*e4b17023SJohn Marino    operator==(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
455*e4b17023SJohn Marino	       const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
456*e4b17023SJohn Marino    { return __hs1._M_ht == __hs2._M_ht; }
457*e4b17023SJohn Marino
458*e4b17023SJohn Marino  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
459*e4b17023SJohn Marino    inline bool
460*e4b17023SJohn Marino    operator!=(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
461*e4b17023SJohn Marino	       const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
462*e4b17023SJohn Marino    { return !(__hs1 == __hs2); }
463*e4b17023SJohn Marino
464*e4b17023SJohn Marino  template<class _Val, class _HashFcn, class _EqualKey, class _Alloc>
465*e4b17023SJohn Marino    inline void
466*e4b17023SJohn Marino    swap(hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
467*e4b17023SJohn Marino	 hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
468*e4b17023SJohn Marino    { __hs1.swap(__hs2); }
469*e4b17023SJohn Marino
470*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
471*e4b17023SJohn Marino} // namespace
472*e4b17023SJohn Marino
473*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
474*e4b17023SJohn Marino{
475*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
476*e4b17023SJohn Marino
477*e4b17023SJohn Marino  // Specialization of insert_iterator so that it will work for hash_set
478*e4b17023SJohn Marino  // and hash_multiset.
479*e4b17023SJohn Marino  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
480*e4b17023SJohn Marino    class insert_iterator<__gnu_cxx::hash_set<_Value, _HashFcn,
481*e4b17023SJohn Marino					      _EqualKey, _Alloc> >
482*e4b17023SJohn Marino    {
483*e4b17023SJohn Marino    protected:
484*e4b17023SJohn Marino      typedef __gnu_cxx::hash_set<_Value, _HashFcn, _EqualKey, _Alloc>
485*e4b17023SJohn Marino        _Container;
486*e4b17023SJohn Marino      _Container* container;
487*e4b17023SJohn Marino
488*e4b17023SJohn Marino    public:
489*e4b17023SJohn Marino      typedef _Container          container_type;
490*e4b17023SJohn Marino      typedef output_iterator_tag iterator_category;
491*e4b17023SJohn Marino      typedef void                value_type;
492*e4b17023SJohn Marino      typedef void                difference_type;
493*e4b17023SJohn Marino      typedef void                pointer;
494*e4b17023SJohn Marino      typedef void                reference;
495*e4b17023SJohn Marino
496*e4b17023SJohn Marino      insert_iterator(_Container& __x)
497*e4b17023SJohn Marino      : container(&__x) {}
498*e4b17023SJohn Marino
499*e4b17023SJohn Marino      insert_iterator(_Container& __x, typename _Container::iterator)
500*e4b17023SJohn Marino      : container(&__x) {}
501*e4b17023SJohn Marino
502*e4b17023SJohn Marino      insert_iterator<_Container>&
503*e4b17023SJohn Marino      operator=(const typename _Container::value_type& __value)
504*e4b17023SJohn Marino      {
505*e4b17023SJohn Marino	container->insert(__value);
506*e4b17023SJohn Marino	return *this;
507*e4b17023SJohn Marino      }
508*e4b17023SJohn Marino
509*e4b17023SJohn Marino      insert_iterator<_Container>&
510*e4b17023SJohn Marino      operator*()
511*e4b17023SJohn Marino      { return *this; }
512*e4b17023SJohn Marino
513*e4b17023SJohn Marino      insert_iterator<_Container>&
514*e4b17023SJohn Marino      operator++()
515*e4b17023SJohn Marino      { return *this; }
516*e4b17023SJohn Marino
517*e4b17023SJohn Marino      insert_iterator<_Container>&
518*e4b17023SJohn Marino      operator++(int)
519*e4b17023SJohn Marino      { return *this; }
520*e4b17023SJohn Marino    };
521*e4b17023SJohn Marino
522*e4b17023SJohn Marino  template<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
523*e4b17023SJohn Marino    class insert_iterator<__gnu_cxx::hash_multiset<_Value, _HashFcn,
524*e4b17023SJohn Marino						   _EqualKey, _Alloc> >
525*e4b17023SJohn Marino    {
526*e4b17023SJohn Marino    protected:
527*e4b17023SJohn Marino      typedef __gnu_cxx::hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc>
528*e4b17023SJohn Marino        _Container;
529*e4b17023SJohn Marino      _Container* container;
530*e4b17023SJohn Marino      typename _Container::iterator iter;
531*e4b17023SJohn Marino
532*e4b17023SJohn Marino    public:
533*e4b17023SJohn Marino      typedef _Container          container_type;
534*e4b17023SJohn Marino      typedef output_iterator_tag iterator_category;
535*e4b17023SJohn Marino      typedef void                value_type;
536*e4b17023SJohn Marino      typedef void                difference_type;
537*e4b17023SJohn Marino      typedef void                pointer;
538*e4b17023SJohn Marino      typedef void                reference;
539*e4b17023SJohn Marino
540*e4b17023SJohn Marino      insert_iterator(_Container& __x)
541*e4b17023SJohn Marino      : container(&__x) {}
542*e4b17023SJohn Marino
543*e4b17023SJohn Marino      insert_iterator(_Container& __x, typename _Container::iterator)
544*e4b17023SJohn Marino      : container(&__x) {}
545*e4b17023SJohn Marino
546*e4b17023SJohn Marino      insert_iterator<_Container>&
547*e4b17023SJohn Marino      operator=(const typename _Container::value_type& __value)
548*e4b17023SJohn Marino      {
549*e4b17023SJohn Marino	container->insert(__value);
550*e4b17023SJohn Marino	return *this;
551*e4b17023SJohn Marino      }
552*e4b17023SJohn Marino
553*e4b17023SJohn Marino      insert_iterator<_Container>&
554*e4b17023SJohn Marino      operator*()
555*e4b17023SJohn Marino      { return *this; }
556*e4b17023SJohn Marino
557*e4b17023SJohn Marino      insert_iterator<_Container>&
558*e4b17023SJohn Marino      operator++()
559*e4b17023SJohn Marino      { return *this; }
560*e4b17023SJohn Marino
561*e4b17023SJohn Marino      insert_iterator<_Container>&
562*e4b17023SJohn Marino      operator++(int) { return *this; }
563*e4b17023SJohn Marino    };
564*e4b17023SJohn Marino
565*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
566*e4b17023SJohn Marino} // namespace
567*e4b17023SJohn Marino
568*e4b17023SJohn Marino#endif
569