xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/backward/hash_map (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// Hashing map 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_map
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_MAP
58*e4b17023SJohn Marino#define _BACKWARD_HASH_MAP 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::_Select1st;
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 _Key, class _Tp, class _HashFn = hash<_Key>,
83*e4b17023SJohn Marino	   class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> >
84*e4b17023SJohn Marino    class hash_map
85*e4b17023SJohn Marino    {
86*e4b17023SJohn Marino    private:
87*e4b17023SJohn Marino      typedef hashtable<pair<const _Key, _Tp>,_Key, _HashFn,
88*e4b17023SJohn Marino			_Select1st<pair<const _Key, _Tp> >,
89*e4b17023SJohn Marino			_EqualKey, _Alloc> _Ht;
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino      _Ht _M_ht;
92*e4b17023SJohn Marino
93*e4b17023SJohn Marino    public:
94*e4b17023SJohn Marino      typedef typename _Ht::key_type key_type;
95*e4b17023SJohn Marino      typedef _Tp data_type;
96*e4b17023SJohn Marino      typedef _Tp mapped_type;
97*e4b17023SJohn Marino      typedef typename _Ht::value_type value_type;
98*e4b17023SJohn Marino      typedef typename _Ht::hasher hasher;
99*e4b17023SJohn Marino      typedef typename _Ht::key_equal key_equal;
100*e4b17023SJohn Marino
101*e4b17023SJohn Marino      typedef typename _Ht::size_type size_type;
102*e4b17023SJohn Marino      typedef typename _Ht::difference_type difference_type;
103*e4b17023SJohn Marino      typedef typename _Ht::pointer pointer;
104*e4b17023SJohn Marino      typedef typename _Ht::const_pointer const_pointer;
105*e4b17023SJohn Marino      typedef typename _Ht::reference reference;
106*e4b17023SJohn Marino      typedef typename _Ht::const_reference const_reference;
107*e4b17023SJohn Marino
108*e4b17023SJohn Marino      typedef typename _Ht::iterator iterator;
109*e4b17023SJohn Marino      typedef typename _Ht::const_iterator const_iterator;
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino      typedef typename _Ht::allocator_type allocator_type;
112*e4b17023SJohn Marino
113*e4b17023SJohn Marino      hasher
114*e4b17023SJohn Marino      hash_funct() const
115*e4b17023SJohn Marino      { return _M_ht.hash_funct(); }
116*e4b17023SJohn Marino
117*e4b17023SJohn Marino      key_equal
118*e4b17023SJohn Marino      key_eq() const
119*e4b17023SJohn Marino      { return _M_ht.key_eq(); }
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino      allocator_type
122*e4b17023SJohn Marino      get_allocator() const
123*e4b17023SJohn Marino      { return _M_ht.get_allocator(); }
124*e4b17023SJohn Marino
125*e4b17023SJohn Marino      hash_map()
126*e4b17023SJohn Marino      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
127*e4b17023SJohn Marino
128*e4b17023SJohn Marino      explicit
129*e4b17023SJohn Marino      hash_map(size_type __n)
130*e4b17023SJohn Marino      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
131*e4b17023SJohn Marino
132*e4b17023SJohn Marino      hash_map(size_type __n, const hasher& __hf)
133*e4b17023SJohn Marino      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
134*e4b17023SJohn Marino
135*e4b17023SJohn Marino      hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
136*e4b17023SJohn Marino	       const allocator_type& __a = allocator_type())
137*e4b17023SJohn Marino      : _M_ht(__n, __hf, __eql, __a) {}
138*e4b17023SJohn Marino
139*e4b17023SJohn Marino      template<class _InputIterator>
140*e4b17023SJohn Marino        hash_map(_InputIterator __f, _InputIterator __l)
141*e4b17023SJohn Marino	: _M_ht(100, hasher(), key_equal(), allocator_type())
142*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
143*e4b17023SJohn Marino
144*e4b17023SJohn Marino      template<class _InputIterator>
145*e4b17023SJohn Marino        hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
146*e4b17023SJohn Marino	: _M_ht(__n, hasher(), key_equal(), allocator_type())
147*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
148*e4b17023SJohn Marino
149*e4b17023SJohn Marino      template<class _InputIterator>
150*e4b17023SJohn Marino        hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
151*e4b17023SJohn Marino		 const hasher& __hf)
152*e4b17023SJohn Marino	: _M_ht(__n, __hf, key_equal(), allocator_type())
153*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino      template<class _InputIterator>
156*e4b17023SJohn Marino        hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
157*e4b17023SJohn Marino		 const hasher& __hf, const key_equal& __eql,
158*e4b17023SJohn Marino		 const allocator_type& __a = allocator_type())
159*e4b17023SJohn Marino	: _M_ht(__n, __hf, __eql, __a)
160*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
161*e4b17023SJohn Marino
162*e4b17023SJohn Marino      size_type
163*e4b17023SJohn Marino      size() const
164*e4b17023SJohn Marino      { return _M_ht.size(); }
165*e4b17023SJohn Marino
166*e4b17023SJohn Marino      size_type
167*e4b17023SJohn Marino      max_size() const
168*e4b17023SJohn Marino      { return _M_ht.max_size(); }
169*e4b17023SJohn Marino
170*e4b17023SJohn Marino      bool
171*e4b17023SJohn Marino      empty() const
172*e4b17023SJohn Marino      { return _M_ht.empty(); }
173*e4b17023SJohn Marino
174*e4b17023SJohn Marino      void
175*e4b17023SJohn Marino      swap(hash_map& __hs)
176*e4b17023SJohn Marino      { _M_ht.swap(__hs._M_ht); }
177*e4b17023SJohn Marino
178*e4b17023SJohn Marino      template<class _K1, class _T1, class _HF, class _EqK, class _Al>
179*e4b17023SJohn Marino        friend bool
180*e4b17023SJohn Marino        operator== (const hash_map<_K1, _T1, _HF, _EqK, _Al>&,
181*e4b17023SJohn Marino		    const hash_map<_K1, _T1, _HF, _EqK, _Al>&);
182*e4b17023SJohn Marino
183*e4b17023SJohn Marino      iterator
184*e4b17023SJohn Marino      begin()
185*e4b17023SJohn Marino      { return _M_ht.begin(); }
186*e4b17023SJohn Marino
187*e4b17023SJohn Marino      iterator
188*e4b17023SJohn Marino      end()
189*e4b17023SJohn Marino      { return _M_ht.end(); }
190*e4b17023SJohn Marino
191*e4b17023SJohn Marino      const_iterator
192*e4b17023SJohn Marino      begin() const
193*e4b17023SJohn Marino      { return _M_ht.begin(); }
194*e4b17023SJohn Marino
195*e4b17023SJohn Marino      const_iterator
196*e4b17023SJohn Marino      end() const
197*e4b17023SJohn Marino      { return _M_ht.end(); }
198*e4b17023SJohn Marino
199*e4b17023SJohn Marino      pair<iterator, bool>
200*e4b17023SJohn Marino      insert(const value_type& __obj)
201*e4b17023SJohn Marino      { return _M_ht.insert_unique(__obj); }
202*e4b17023SJohn Marino
203*e4b17023SJohn Marino      template<class _InputIterator>
204*e4b17023SJohn Marino        void
205*e4b17023SJohn Marino        insert(_InputIterator __f, _InputIterator __l)
206*e4b17023SJohn Marino        { _M_ht.insert_unique(__f, __l); }
207*e4b17023SJohn Marino
208*e4b17023SJohn Marino      pair<iterator, bool>
209*e4b17023SJohn Marino      insert_noresize(const value_type& __obj)
210*e4b17023SJohn Marino      { return _M_ht.insert_unique_noresize(__obj); }
211*e4b17023SJohn Marino
212*e4b17023SJohn Marino      iterator
213*e4b17023SJohn Marino      find(const key_type& __key)
214*e4b17023SJohn Marino      { return _M_ht.find(__key); }
215*e4b17023SJohn Marino
216*e4b17023SJohn Marino      const_iterator
217*e4b17023SJohn Marino      find(const key_type& __key) const
218*e4b17023SJohn Marino      { return _M_ht.find(__key); }
219*e4b17023SJohn Marino
220*e4b17023SJohn Marino      _Tp&
221*e4b17023SJohn Marino      operator[](const key_type& __key)
222*e4b17023SJohn Marino      { return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
223*e4b17023SJohn Marino
224*e4b17023SJohn Marino      size_type
225*e4b17023SJohn Marino      count(const key_type& __key) const
226*e4b17023SJohn Marino      { return _M_ht.count(__key); }
227*e4b17023SJohn Marino
228*e4b17023SJohn Marino      pair<iterator, iterator>
229*e4b17023SJohn Marino      equal_range(const key_type& __key)
230*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
231*e4b17023SJohn Marino
232*e4b17023SJohn Marino      pair<const_iterator, const_iterator>
233*e4b17023SJohn Marino      equal_range(const key_type& __key) const
234*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
235*e4b17023SJohn Marino
236*e4b17023SJohn Marino      size_type
237*e4b17023SJohn Marino      erase(const key_type& __key)
238*e4b17023SJohn Marino      {return _M_ht.erase(__key); }
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino      void
241*e4b17023SJohn Marino      erase(iterator __it)
242*e4b17023SJohn Marino      { _M_ht.erase(__it); }
243*e4b17023SJohn Marino
244*e4b17023SJohn Marino      void
245*e4b17023SJohn Marino      erase(iterator __f, iterator __l)
246*e4b17023SJohn Marino      { _M_ht.erase(__f, __l); }
247*e4b17023SJohn Marino
248*e4b17023SJohn Marino      void
249*e4b17023SJohn Marino      clear()
250*e4b17023SJohn Marino      { _M_ht.clear(); }
251*e4b17023SJohn Marino
252*e4b17023SJohn Marino      void
253*e4b17023SJohn Marino      resize(size_type __hint)
254*e4b17023SJohn Marino      { _M_ht.resize(__hint); }
255*e4b17023SJohn Marino
256*e4b17023SJohn Marino      size_type
257*e4b17023SJohn Marino      bucket_count() const
258*e4b17023SJohn Marino      { return _M_ht.bucket_count(); }
259*e4b17023SJohn Marino
260*e4b17023SJohn Marino      size_type
261*e4b17023SJohn Marino      max_bucket_count() const
262*e4b17023SJohn Marino      { return _M_ht.max_bucket_count(); }
263*e4b17023SJohn Marino
264*e4b17023SJohn Marino      size_type
265*e4b17023SJohn Marino      elems_in_bucket(size_type __n) const
266*e4b17023SJohn Marino      { return _M_ht.elems_in_bucket(__n); }
267*e4b17023SJohn Marino    };
268*e4b17023SJohn Marino
269*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
270*e4b17023SJohn Marino    inline bool
271*e4b17023SJohn Marino    operator==(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
272*e4b17023SJohn Marino	       const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
273*e4b17023SJohn Marino    { return __hm1._M_ht == __hm2._M_ht; }
274*e4b17023SJohn Marino
275*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
276*e4b17023SJohn Marino    inline bool
277*e4b17023SJohn Marino    operator!=(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
278*e4b17023SJohn Marino	       const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
279*e4b17023SJohn Marino    { return !(__hm1 == __hm2); }
280*e4b17023SJohn Marino
281*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
282*e4b17023SJohn Marino    inline void
283*e4b17023SJohn Marino    swap(hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
284*e4b17023SJohn Marino	 hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
285*e4b17023SJohn Marino    { __hm1.swap(__hm2); }
286*e4b17023SJohn Marino
287*e4b17023SJohn Marino
288*e4b17023SJohn Marino  /**
289*e4b17023SJohn Marino   *  This is an SGI extension.
290*e4b17023SJohn Marino   *  @ingroup SGIextensions
291*e4b17023SJohn Marino   *  @doctodo
292*e4b17023SJohn Marino   */
293*e4b17023SJohn Marino  template<class _Key, class _Tp,
294*e4b17023SJohn Marino	   class _HashFn = hash<_Key>,
295*e4b17023SJohn Marino	   class _EqualKey = equal_to<_Key>,
296*e4b17023SJohn Marino	   class _Alloc = allocator<_Tp> >
297*e4b17023SJohn Marino    class hash_multimap
298*e4b17023SJohn Marino    {
299*e4b17023SJohn Marino      // concept requirements
300*e4b17023SJohn Marino      __glibcxx_class_requires(_Key, _SGIAssignableConcept)
301*e4b17023SJohn Marino      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
302*e4b17023SJohn Marino      __glibcxx_class_requires3(_HashFn, size_t, _Key, _UnaryFunctionConcept)
303*e4b17023SJohn Marino      __glibcxx_class_requires3(_EqualKey, _Key, _Key, _BinaryPredicateConcept)
304*e4b17023SJohn Marino
305*e4b17023SJohn Marino    private:
306*e4b17023SJohn Marino      typedef hashtable<pair<const _Key, _Tp>, _Key, _HashFn,
307*e4b17023SJohn Marino			_Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc>
308*e4b17023SJohn Marino          _Ht;
309*e4b17023SJohn Marino
310*e4b17023SJohn Marino      _Ht _M_ht;
311*e4b17023SJohn Marino
312*e4b17023SJohn Marino    public:
313*e4b17023SJohn Marino      typedef typename _Ht::key_type key_type;
314*e4b17023SJohn Marino      typedef _Tp data_type;
315*e4b17023SJohn Marino      typedef _Tp mapped_type;
316*e4b17023SJohn Marino      typedef typename _Ht::value_type value_type;
317*e4b17023SJohn Marino      typedef typename _Ht::hasher hasher;
318*e4b17023SJohn Marino      typedef typename _Ht::key_equal key_equal;
319*e4b17023SJohn Marino
320*e4b17023SJohn Marino      typedef typename _Ht::size_type size_type;
321*e4b17023SJohn Marino      typedef typename _Ht::difference_type difference_type;
322*e4b17023SJohn Marino      typedef typename _Ht::pointer pointer;
323*e4b17023SJohn Marino      typedef typename _Ht::const_pointer const_pointer;
324*e4b17023SJohn Marino      typedef typename _Ht::reference reference;
325*e4b17023SJohn Marino      typedef typename _Ht::const_reference const_reference;
326*e4b17023SJohn Marino
327*e4b17023SJohn Marino      typedef typename _Ht::iterator iterator;
328*e4b17023SJohn Marino      typedef typename _Ht::const_iterator const_iterator;
329*e4b17023SJohn Marino
330*e4b17023SJohn Marino      typedef typename _Ht::allocator_type allocator_type;
331*e4b17023SJohn Marino
332*e4b17023SJohn Marino      hasher
333*e4b17023SJohn Marino      hash_funct() const
334*e4b17023SJohn Marino      { return _M_ht.hash_funct(); }
335*e4b17023SJohn Marino
336*e4b17023SJohn Marino      key_equal
337*e4b17023SJohn Marino      key_eq() const
338*e4b17023SJohn Marino      { return _M_ht.key_eq(); }
339*e4b17023SJohn Marino
340*e4b17023SJohn Marino      allocator_type
341*e4b17023SJohn Marino      get_allocator() const
342*e4b17023SJohn Marino      { return _M_ht.get_allocator(); }
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino      hash_multimap()
345*e4b17023SJohn Marino      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
346*e4b17023SJohn Marino
347*e4b17023SJohn Marino      explicit
348*e4b17023SJohn Marino      hash_multimap(size_type __n)
349*e4b17023SJohn Marino      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
350*e4b17023SJohn Marino
351*e4b17023SJohn Marino      hash_multimap(size_type __n, const hasher& __hf)
352*e4b17023SJohn Marino      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
353*e4b17023SJohn Marino
354*e4b17023SJohn Marino      hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
355*e4b17023SJohn Marino		    const allocator_type& __a = allocator_type())
356*e4b17023SJohn Marino      : _M_ht(__n, __hf, __eql, __a) {}
357*e4b17023SJohn Marino
358*e4b17023SJohn Marino      template<class _InputIterator>
359*e4b17023SJohn Marino        hash_multimap(_InputIterator __f, _InputIterator __l)
360*e4b17023SJohn Marino	: _M_ht(100, hasher(), key_equal(), allocator_type())
361*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
362*e4b17023SJohn Marino
363*e4b17023SJohn Marino      template<class _InputIterator>
364*e4b17023SJohn Marino        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
365*e4b17023SJohn Marino	: _M_ht(__n, hasher(), key_equal(), allocator_type())
366*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
367*e4b17023SJohn Marino
368*e4b17023SJohn Marino      template<class _InputIterator>
369*e4b17023SJohn Marino        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
370*e4b17023SJohn Marino		      const hasher& __hf)
371*e4b17023SJohn Marino	: _M_ht(__n, __hf, key_equal(), allocator_type())
372*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
373*e4b17023SJohn Marino
374*e4b17023SJohn Marino      template<class _InputIterator>
375*e4b17023SJohn Marino        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
376*e4b17023SJohn Marino		      const hasher& __hf, const key_equal& __eql,
377*e4b17023SJohn Marino		      const allocator_type& __a = allocator_type())
378*e4b17023SJohn Marino	: _M_ht(__n, __hf, __eql, __a)
379*e4b17023SJohn Marino        { _M_ht.insert_equal(__f, __l); }
380*e4b17023SJohn Marino
381*e4b17023SJohn Marino      size_type
382*e4b17023SJohn Marino      size() const
383*e4b17023SJohn Marino      { return _M_ht.size(); }
384*e4b17023SJohn Marino
385*e4b17023SJohn Marino      size_type
386*e4b17023SJohn Marino      max_size() const
387*e4b17023SJohn Marino      { return _M_ht.max_size(); }
388*e4b17023SJohn Marino
389*e4b17023SJohn Marino      bool
390*e4b17023SJohn Marino      empty() const
391*e4b17023SJohn Marino      { return _M_ht.empty(); }
392*e4b17023SJohn Marino
393*e4b17023SJohn Marino      void
394*e4b17023SJohn Marino      swap(hash_multimap& __hs)
395*e4b17023SJohn Marino      { _M_ht.swap(__hs._M_ht); }
396*e4b17023SJohn Marino
397*e4b17023SJohn Marino      template<class _K1, class _T1, class _HF, class _EqK, class _Al>
398*e4b17023SJohn Marino        friend bool
399*e4b17023SJohn Marino        operator==(const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&,
400*e4b17023SJohn Marino		   const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&);
401*e4b17023SJohn Marino
402*e4b17023SJohn Marino      iterator
403*e4b17023SJohn Marino      begin()
404*e4b17023SJohn Marino      { return _M_ht.begin(); }
405*e4b17023SJohn Marino
406*e4b17023SJohn Marino      iterator
407*e4b17023SJohn Marino      end()
408*e4b17023SJohn Marino      { return _M_ht.end(); }
409*e4b17023SJohn Marino
410*e4b17023SJohn Marino      const_iterator
411*e4b17023SJohn Marino      begin() const
412*e4b17023SJohn Marino      { return _M_ht.begin(); }
413*e4b17023SJohn Marino
414*e4b17023SJohn Marino      const_iterator
415*e4b17023SJohn Marino      end() const
416*e4b17023SJohn Marino      { return _M_ht.end(); }
417*e4b17023SJohn Marino
418*e4b17023SJohn Marino      iterator
419*e4b17023SJohn Marino      insert(const value_type& __obj)
420*e4b17023SJohn Marino      { return _M_ht.insert_equal(__obj); }
421*e4b17023SJohn Marino
422*e4b17023SJohn Marino      template<class _InputIterator>
423*e4b17023SJohn Marino        void
424*e4b17023SJohn Marino        insert(_InputIterator __f, _InputIterator __l)
425*e4b17023SJohn Marino        { _M_ht.insert_equal(__f,__l); }
426*e4b17023SJohn Marino
427*e4b17023SJohn Marino      iterator
428*e4b17023SJohn Marino      insert_noresize(const value_type& __obj)
429*e4b17023SJohn Marino      { return _M_ht.insert_equal_noresize(__obj); }
430*e4b17023SJohn Marino
431*e4b17023SJohn Marino      iterator
432*e4b17023SJohn Marino      find(const key_type& __key)
433*e4b17023SJohn Marino      { return _M_ht.find(__key); }
434*e4b17023SJohn Marino
435*e4b17023SJohn Marino      const_iterator
436*e4b17023SJohn Marino      find(const key_type& __key) const
437*e4b17023SJohn Marino      { return _M_ht.find(__key); }
438*e4b17023SJohn Marino
439*e4b17023SJohn Marino      size_type
440*e4b17023SJohn Marino      count(const key_type& __key) const
441*e4b17023SJohn Marino      { return _M_ht.count(__key); }
442*e4b17023SJohn Marino
443*e4b17023SJohn Marino      pair<iterator, iterator>
444*e4b17023SJohn Marino      equal_range(const key_type& __key)
445*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
446*e4b17023SJohn Marino
447*e4b17023SJohn Marino      pair<const_iterator, const_iterator>
448*e4b17023SJohn Marino      equal_range(const key_type& __key) const
449*e4b17023SJohn Marino      { return _M_ht.equal_range(__key); }
450*e4b17023SJohn Marino
451*e4b17023SJohn Marino      size_type
452*e4b17023SJohn Marino      erase(const key_type& __key)
453*e4b17023SJohn Marino      { return _M_ht.erase(__key); }
454*e4b17023SJohn Marino
455*e4b17023SJohn Marino      void
456*e4b17023SJohn Marino      erase(iterator __it)
457*e4b17023SJohn Marino      { _M_ht.erase(__it); }
458*e4b17023SJohn Marino
459*e4b17023SJohn Marino      void
460*e4b17023SJohn Marino      erase(iterator __f, iterator __l)
461*e4b17023SJohn Marino      { _M_ht.erase(__f, __l); }
462*e4b17023SJohn Marino
463*e4b17023SJohn Marino      void
464*e4b17023SJohn Marino      clear()
465*e4b17023SJohn Marino      { _M_ht.clear(); }
466*e4b17023SJohn Marino
467*e4b17023SJohn Marino      void
468*e4b17023SJohn Marino      resize(size_type __hint)
469*e4b17023SJohn Marino      { _M_ht.resize(__hint); }
470*e4b17023SJohn Marino
471*e4b17023SJohn Marino      size_type
472*e4b17023SJohn Marino      bucket_count() const
473*e4b17023SJohn Marino      { return _M_ht.bucket_count(); }
474*e4b17023SJohn Marino
475*e4b17023SJohn Marino      size_type
476*e4b17023SJohn Marino      max_bucket_count() const
477*e4b17023SJohn Marino      { return _M_ht.max_bucket_count(); }
478*e4b17023SJohn Marino
479*e4b17023SJohn Marino      size_type
480*e4b17023SJohn Marino      elems_in_bucket(size_type __n) const
481*e4b17023SJohn Marino      { return _M_ht.elems_in_bucket(__n); }
482*e4b17023SJohn Marino    };
483*e4b17023SJohn Marino
484*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
485*e4b17023SJohn Marino    inline bool
486*e4b17023SJohn Marino    operator==(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
487*e4b17023SJohn Marino	       const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
488*e4b17023SJohn Marino    { return __hm1._M_ht == __hm2._M_ht; }
489*e4b17023SJohn Marino
490*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
491*e4b17023SJohn Marino    inline bool
492*e4b17023SJohn Marino    operator!=(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
493*e4b17023SJohn Marino	       const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
494*e4b17023SJohn Marino    { return !(__hm1 == __hm2); }
495*e4b17023SJohn Marino
496*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
497*e4b17023SJohn Marino    inline void
498*e4b17023SJohn Marino    swap(hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
499*e4b17023SJohn Marino	 hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
500*e4b17023SJohn Marino    { __hm1.swap(__hm2); }
501*e4b17023SJohn Marino
502*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
503*e4b17023SJohn Marino} // namespace
504*e4b17023SJohn Marino
505*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
506*e4b17023SJohn Marino{
507*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION
508*e4b17023SJohn Marino
509*e4b17023SJohn Marino  // Specialization of insert_iterator so that it will work for hash_map
510*e4b17023SJohn Marino  // and hash_multimap.
511*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
512*e4b17023SJohn Marino    class insert_iterator<__gnu_cxx::hash_map<_Key, _Tp, _HashFn,
513*e4b17023SJohn Marino					      _EqKey, _Alloc> >
514*e4b17023SJohn Marino    {
515*e4b17023SJohn Marino    protected:
516*e4b17023SJohn Marino      typedef __gnu_cxx::hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc>
517*e4b17023SJohn Marino        _Container;
518*e4b17023SJohn Marino      _Container* container;
519*e4b17023SJohn Marino
520*e4b17023SJohn Marino    public:
521*e4b17023SJohn Marino      typedef _Container          container_type;
522*e4b17023SJohn Marino      typedef output_iterator_tag iterator_category;
523*e4b17023SJohn Marino      typedef void                value_type;
524*e4b17023SJohn Marino      typedef void                difference_type;
525*e4b17023SJohn Marino      typedef void                pointer;
526*e4b17023SJohn Marino      typedef void                reference;
527*e4b17023SJohn Marino
528*e4b17023SJohn Marino      insert_iterator(_Container& __x)
529*e4b17023SJohn Marino      : container(&__x) {}
530*e4b17023SJohn Marino
531*e4b17023SJohn Marino      insert_iterator(_Container& __x, typename _Container::iterator)
532*e4b17023SJohn Marino      : container(&__x) {}
533*e4b17023SJohn Marino
534*e4b17023SJohn Marino      insert_iterator<_Container>&
535*e4b17023SJohn Marino      operator=(const typename _Container::value_type& __value)
536*e4b17023SJohn Marino      {
537*e4b17023SJohn Marino	container->insert(__value);
538*e4b17023SJohn Marino	return *this;
539*e4b17023SJohn Marino      }
540*e4b17023SJohn Marino
541*e4b17023SJohn Marino      insert_iterator<_Container>&
542*e4b17023SJohn Marino      operator*()
543*e4b17023SJohn Marino      { return *this; }
544*e4b17023SJohn Marino
545*e4b17023SJohn Marino      insert_iterator<_Container>&
546*e4b17023SJohn Marino      operator++() { return *this; }
547*e4b17023SJohn Marino
548*e4b17023SJohn Marino      insert_iterator<_Container>&
549*e4b17023SJohn Marino      operator++(int)
550*e4b17023SJohn Marino      { return *this; }
551*e4b17023SJohn Marino    };
552*e4b17023SJohn Marino
553*e4b17023SJohn Marino  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
554*e4b17023SJohn Marino    class insert_iterator<__gnu_cxx::hash_multimap<_Key, _Tp, _HashFn,
555*e4b17023SJohn Marino						   _EqKey, _Alloc> >
556*e4b17023SJohn Marino    {
557*e4b17023SJohn Marino    protected:
558*e4b17023SJohn Marino      typedef __gnu_cxx::hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc>
559*e4b17023SJohn Marino        _Container;
560*e4b17023SJohn Marino      _Container* container;
561*e4b17023SJohn Marino      typename _Container::iterator iter;
562*e4b17023SJohn Marino
563*e4b17023SJohn Marino    public:
564*e4b17023SJohn Marino      typedef _Container          container_type;
565*e4b17023SJohn Marino      typedef output_iterator_tag iterator_category;
566*e4b17023SJohn Marino      typedef void                value_type;
567*e4b17023SJohn Marino      typedef void                difference_type;
568*e4b17023SJohn Marino      typedef void                pointer;
569*e4b17023SJohn Marino      typedef void                reference;
570*e4b17023SJohn Marino
571*e4b17023SJohn Marino      insert_iterator(_Container& __x)
572*e4b17023SJohn Marino      : container(&__x) {}
573*e4b17023SJohn Marino
574*e4b17023SJohn Marino      insert_iterator(_Container& __x, typename _Container::iterator)
575*e4b17023SJohn Marino      : container(&__x) {}
576*e4b17023SJohn Marino
577*e4b17023SJohn Marino      insert_iterator<_Container>&
578*e4b17023SJohn Marino      operator=(const typename _Container::value_type& __value)
579*e4b17023SJohn Marino      {
580*e4b17023SJohn Marino	container->insert(__value);
581*e4b17023SJohn Marino	return *this;
582*e4b17023SJohn Marino      }
583*e4b17023SJohn Marino
584*e4b17023SJohn Marino      insert_iterator<_Container>&
585*e4b17023SJohn Marino      operator*()
586*e4b17023SJohn Marino      { return *this; }
587*e4b17023SJohn Marino
588*e4b17023SJohn Marino      insert_iterator<_Container>&
589*e4b17023SJohn Marino      operator++()
590*e4b17023SJohn Marino      { return *this; }
591*e4b17023SJohn Marino
592*e4b17023SJohn Marino      insert_iterator<_Container>&
593*e4b17023SJohn Marino      operator++(int)
594*e4b17023SJohn Marino      { return *this; }
595*e4b17023SJohn Marino    };
596*e4b17023SJohn Marino
597*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION
598*e4b17023SJohn Marino} // namespace
599*e4b17023SJohn Marino
600*e4b17023SJohn Marino#endif
601