100db7afdSDavid E. O'Brien// Hashing map 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_map
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_MAP
62ffeaf689SAlexander Kabaev#define _HASH_MAP 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::_Select1st;
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 _Key, class _Tp, class _HashFn = hash<_Key>,
81*f8a1b7d9SAlexander Kabaev	   class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> >
8200db7afdSDavid E. O'Brien    class hash_map
8300db7afdSDavid E. O'Brien    {
8400db7afdSDavid E. O'Brien    private:
85*f8a1b7d9SAlexander Kabaev      typedef hashtable<pair<const _Key, _Tp>,_Key, _HashFn,
86*f8a1b7d9SAlexander Kabaev			_Select1st<pair<const _Key, _Tp> >,
87*f8a1b7d9SAlexander Kabaev			_EqualKey, _Alloc> _Ht;
88*f8a1b7d9SAlexander Kabaev
8900db7afdSDavid E. O'Brien      _Ht _M_ht;
9000db7afdSDavid E. O'Brien
9100db7afdSDavid E. O'Brien    public:
9200db7afdSDavid E. O'Brien      typedef typename _Ht::key_type key_type;
9300db7afdSDavid E. O'Brien      typedef _Tp data_type;
9400db7afdSDavid E. O'Brien      typedef _Tp mapped_type;
9500db7afdSDavid E. O'Brien      typedef typename _Ht::value_type value_type;
9600db7afdSDavid E. O'Brien      typedef typename _Ht::hasher hasher;
9700db7afdSDavid E. O'Brien      typedef typename _Ht::key_equal key_equal;
9800db7afdSDavid E. O'Brien
9900db7afdSDavid E. O'Brien      typedef typename _Ht::size_type size_type;
10000db7afdSDavid E. O'Brien      typedef typename _Ht::difference_type difference_type;
10100db7afdSDavid E. O'Brien      typedef typename _Ht::pointer pointer;
10200db7afdSDavid E. O'Brien      typedef typename _Ht::const_pointer const_pointer;
10300db7afdSDavid E. O'Brien      typedef typename _Ht::reference reference;
10400db7afdSDavid E. O'Brien      typedef typename _Ht::const_reference const_reference;
10500db7afdSDavid E. O'Brien
10600db7afdSDavid E. O'Brien      typedef typename _Ht::iterator iterator;
10700db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator const_iterator;
10800db7afdSDavid E. O'Brien
10900db7afdSDavid E. O'Brien      typedef typename _Ht::allocator_type allocator_type;
11000db7afdSDavid E. O'Brien
111*f8a1b7d9SAlexander Kabaev      hasher
112*f8a1b7d9SAlexander Kabaev      hash_funct() const
113*f8a1b7d9SAlexander Kabaev      { return _M_ht.hash_funct(); }
114*f8a1b7d9SAlexander Kabaev
115*f8a1b7d9SAlexander Kabaev      key_equal
116*f8a1b7d9SAlexander Kabaev      key_eq() const
117*f8a1b7d9SAlexander Kabaev      { return _M_ht.key_eq(); }
118*f8a1b7d9SAlexander Kabaev
119*f8a1b7d9SAlexander Kabaev      allocator_type
120*f8a1b7d9SAlexander Kabaev      get_allocator() const
121*f8a1b7d9SAlexander Kabaev      { return _M_ht.get_allocator(); }
12200db7afdSDavid E. O'Brien
12300db7afdSDavid E. O'Brien    public:
124*f8a1b7d9SAlexander Kabaev      hash_map()
125*f8a1b7d9SAlexander Kabaev      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
126*f8a1b7d9SAlexander Kabaev
127*f8a1b7d9SAlexander Kabaev      explicit
128*f8a1b7d9SAlexander Kabaev      hash_map(size_type __n)
12900db7afdSDavid E. O'Brien      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
130*f8a1b7d9SAlexander Kabaev
13100db7afdSDavid E. O'Brien      hash_map(size_type __n, const hasher& __hf)
13200db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
133*f8a1b7d9SAlexander Kabaev
13400db7afdSDavid E. O'Brien      hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
13500db7afdSDavid E. O'Brien	       const allocator_type& __a = allocator_type())
13600db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, __eql, __a) {}
13700db7afdSDavid E. O'Brien
13800db7afdSDavid E. O'Brien      template<class _InputIterator>
13900db7afdSDavid E. O'Brien        hash_map(_InputIterator __f, _InputIterator __l)
14000db7afdSDavid E. O'Brien	: _M_ht(100, hasher(), key_equal(), allocator_type())
14100db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
142*f8a1b7d9SAlexander Kabaev
14300db7afdSDavid E. O'Brien      template<class _InputIterator>
14400db7afdSDavid E. O'Brien        hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
14500db7afdSDavid E. O'Brien	: _M_ht(__n, hasher(), key_equal(), allocator_type())
14600db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
147*f8a1b7d9SAlexander Kabaev
14800db7afdSDavid E. O'Brien      template<class _InputIterator>
14900db7afdSDavid E. O'Brien        hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
15000db7afdSDavid E. O'Brien		 const hasher& __hf)
15100db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, key_equal(), allocator_type())
15200db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
153*f8a1b7d9SAlexander Kabaev
15400db7afdSDavid E. O'Brien      template<class _InputIterator>
15500db7afdSDavid E. O'Brien        hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
15600db7afdSDavid E. O'Brien		 const hasher& __hf, const key_equal& __eql,
15700db7afdSDavid E. O'Brien		 const allocator_type& __a = allocator_type())
15800db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, __eql, __a)
15900db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
16000db7afdSDavid E. O'Brien
16100db7afdSDavid E. O'Brien    public:
162*f8a1b7d9SAlexander Kabaev      size_type
163*f8a1b7d9SAlexander Kabaev      size() const
164*f8a1b7d9SAlexander Kabaev      { return _M_ht.size(); }
165*f8a1b7d9SAlexander Kabaev
166*f8a1b7d9SAlexander Kabaev      size_type
167*f8a1b7d9SAlexander Kabaev      max_size() const
168*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_size(); }
169*f8a1b7d9SAlexander Kabaev
170*f8a1b7d9SAlexander Kabaev      bool
171*f8a1b7d9SAlexander Kabaev      empty() const
172*f8a1b7d9SAlexander Kabaev      { return _M_ht.empty(); }
173*f8a1b7d9SAlexander Kabaev
174*f8a1b7d9SAlexander Kabaev      void
175*f8a1b7d9SAlexander Kabaev      swap(hash_map& __hs)
176*f8a1b7d9SAlexander Kabaev      { _M_ht.swap(__hs._M_ht); }
17700db7afdSDavid E. O'Brien
17800db7afdSDavid E. O'Brien      template<class _K1, class _T1, class _HF, class _EqK, class _Al>
179*f8a1b7d9SAlexander Kabaev        friend bool
180*f8a1b7d9SAlexander Kabaev        operator== (const hash_map<_K1, _T1, _HF, _EqK, _Al>&,
18100db7afdSDavid E. O'Brien		    const hash_map<_K1, _T1, _HF, _EqK, _Al>&);
18200db7afdSDavid E. O'Brien
183*f8a1b7d9SAlexander Kabaev      iterator
184*f8a1b7d9SAlexander Kabaev      begin()
185*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
186*f8a1b7d9SAlexander Kabaev
187*f8a1b7d9SAlexander Kabaev      iterator
188*f8a1b7d9SAlexander Kabaev      end()
189*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
190*f8a1b7d9SAlexander Kabaev
191*f8a1b7d9SAlexander Kabaev      const_iterator
192*f8a1b7d9SAlexander Kabaev      begin() const
193*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
194*f8a1b7d9SAlexander Kabaev
195*f8a1b7d9SAlexander Kabaev      const_iterator
196*f8a1b7d9SAlexander Kabaev      end() const
197*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
19800db7afdSDavid E. O'Brien
19900db7afdSDavid E. O'Brien    public:
200*f8a1b7d9SAlexander Kabaev      pair<iterator, bool>
201*f8a1b7d9SAlexander Kabaev      insert(const value_type& __obj)
20200db7afdSDavid E. O'Brien      { return _M_ht.insert_unique(__obj); }
203*f8a1b7d9SAlexander Kabaev
20400db7afdSDavid E. O'Brien      template<class _InputIterator>
205*f8a1b7d9SAlexander Kabaev        void
206*f8a1b7d9SAlexander Kabaev        insert(_InputIterator __f, _InputIterator __l)
20700db7afdSDavid E. O'Brien        { _M_ht.insert_unique(__f, __l); }
208*f8a1b7d9SAlexander Kabaev
209*f8a1b7d9SAlexander Kabaev      pair<iterator, bool>
210*f8a1b7d9SAlexander Kabaev      insert_noresize(const value_type& __obj)
21100db7afdSDavid E. O'Brien      { return _M_ht.insert_unique_noresize(__obj); }
21200db7afdSDavid E. O'Brien
213*f8a1b7d9SAlexander Kabaev      iterator
214*f8a1b7d9SAlexander Kabaev      find(const key_type& __key)
21500db7afdSDavid E. O'Brien      { return _M_ht.find(__key); }
21600db7afdSDavid E. O'Brien
217*f8a1b7d9SAlexander Kabaev      const_iterator
218*f8a1b7d9SAlexander Kabaev      find(const key_type& __key) const
219*f8a1b7d9SAlexander Kabaev      { return _M_ht.find(__key); }
22000db7afdSDavid E. O'Brien
221*f8a1b7d9SAlexander Kabaev      _Tp&
222*f8a1b7d9SAlexander Kabaev      operator[](const key_type& __key)
223*f8a1b7d9SAlexander Kabaev      { return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
22400db7afdSDavid E. O'Brien
225*f8a1b7d9SAlexander Kabaev      size_type
226*f8a1b7d9SAlexander Kabaev      count(const key_type& __key) const
227*f8a1b7d9SAlexander Kabaev      { return _M_ht.count(__key); }
228*f8a1b7d9SAlexander Kabaev
229*f8a1b7d9SAlexander Kabaev      pair<iterator, iterator>
230*f8a1b7d9SAlexander Kabaev      equal_range(const key_type& __key)
23100db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
232*f8a1b7d9SAlexander Kabaev
23300db7afdSDavid E. O'Brien      pair<const_iterator, const_iterator>
23400db7afdSDavid E. O'Brien      equal_range(const key_type& __key) const
23500db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
23600db7afdSDavid E. O'Brien
237*f8a1b7d9SAlexander Kabaev      size_type
238*f8a1b7d9SAlexander Kabaev      erase(const key_type& __key)
239*f8a1b7d9SAlexander Kabaev      {return _M_ht.erase(__key); }
24000db7afdSDavid E. O'Brien
241*f8a1b7d9SAlexander Kabaev      void
242*f8a1b7d9SAlexander Kabaev      erase(iterator __it)
243*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__it); }
244*f8a1b7d9SAlexander Kabaev
245*f8a1b7d9SAlexander Kabaev      void
246*f8a1b7d9SAlexander Kabaev      erase(iterator __f, iterator __l)
247*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__f, __l); }
248*f8a1b7d9SAlexander Kabaev
249*f8a1b7d9SAlexander Kabaev      void
250*f8a1b7d9SAlexander Kabaev      clear()
251*f8a1b7d9SAlexander Kabaev      { _M_ht.clear(); }
252*f8a1b7d9SAlexander Kabaev
253*f8a1b7d9SAlexander Kabaev      void
254*f8a1b7d9SAlexander Kabaev      resize(size_type __hint)
255*f8a1b7d9SAlexander Kabaev      { _M_ht.resize(__hint); }
256*f8a1b7d9SAlexander Kabaev
257*f8a1b7d9SAlexander Kabaev      size_type
258*f8a1b7d9SAlexander Kabaev      bucket_count() const
259*f8a1b7d9SAlexander Kabaev      { return _M_ht.bucket_count(); }
260*f8a1b7d9SAlexander Kabaev
261*f8a1b7d9SAlexander Kabaev      size_type
262*f8a1b7d9SAlexander Kabaev      max_bucket_count() const
263*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_bucket_count(); }
264*f8a1b7d9SAlexander Kabaev
265*f8a1b7d9SAlexander Kabaev      size_type
266*f8a1b7d9SAlexander Kabaev      elems_in_bucket(size_type __n) const
26700db7afdSDavid E. O'Brien      { return _M_ht.elems_in_bucket(__n); }
26800db7afdSDavid E. O'Brien    };
26900db7afdSDavid E. O'Brien
270*f8a1b7d9SAlexander Kabaev  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
27100db7afdSDavid E. O'Brien    inline bool
272*f8a1b7d9SAlexander Kabaev    operator==(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
273*f8a1b7d9SAlexander Kabaev	       const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
274*f8a1b7d9SAlexander Kabaev    { return __hm1._M_ht == __hm2._M_ht; }
27500db7afdSDavid E. O'Brien
276*f8a1b7d9SAlexander Kabaev  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
27700db7afdSDavid E. O'Brien    inline bool
278*f8a1b7d9SAlexander Kabaev    operator!=(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
279*f8a1b7d9SAlexander Kabaev	       const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
280*f8a1b7d9SAlexander Kabaev    { return !(__hm1 == __hm2); }
28100db7afdSDavid E. O'Brien
282*f8a1b7d9SAlexander Kabaev  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
28300db7afdSDavid E. O'Brien    inline void
284*f8a1b7d9SAlexander Kabaev    swap(hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
285*f8a1b7d9SAlexander Kabaev	 hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
286*f8a1b7d9SAlexander Kabaev    { __hm1.swap(__hm2); }
28700db7afdSDavid E. O'Brien
28800db7afdSDavid E. O'Brien
289ca6500fcSAlexander Kabaev  /**
290ca6500fcSAlexander Kabaev   *  This is an SGI extension.
291ca6500fcSAlexander Kabaev   *  @ingroup SGIextensions
292ca6500fcSAlexander Kabaev   *  @doctodo
293ca6500fcSAlexander Kabaev   */
294*f8a1b7d9SAlexander Kabaev  template<class _Key, class _Tp,
295*f8a1b7d9SAlexander Kabaev	   class _HashFn = hash<_Key>,
296*f8a1b7d9SAlexander Kabaev	   class _EqualKey = equal_to<_Key>,
297*f8a1b7d9SAlexander Kabaev	   class _Alloc = allocator<_Tp> >
29800db7afdSDavid E. O'Brien    class hash_multimap
29900db7afdSDavid E. O'Brien    {
30000db7afdSDavid E. O'Brien      // concept requirements
301ffeaf689SAlexander Kabaev      __glibcxx_class_requires(_Key, _SGIAssignableConcept)
302ffeaf689SAlexander Kabaev      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
303*f8a1b7d9SAlexander Kabaev      __glibcxx_class_requires3(_HashFn, size_t, _Key, _UnaryFunctionConcept)
304ffeaf689SAlexander Kabaev      __glibcxx_class_requires3(_EqualKey, _Key, _Key, _BinaryPredicateConcept)
30500db7afdSDavid E. O'Brien
30600db7afdSDavid E. O'Brien    private:
307*f8a1b7d9SAlexander Kabaev      typedef hashtable<pair<const _Key, _Tp>, _Key, _HashFn,
30800db7afdSDavid E. O'Brien			_Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc>
30900db7afdSDavid E. O'Brien          _Ht;
310*f8a1b7d9SAlexander Kabaev
31100db7afdSDavid E. O'Brien      _Ht _M_ht;
31200db7afdSDavid E. O'Brien
31300db7afdSDavid E. O'Brien    public:
31400db7afdSDavid E. O'Brien      typedef typename _Ht::key_type key_type;
31500db7afdSDavid E. O'Brien      typedef _Tp data_type;
31600db7afdSDavid E. O'Brien      typedef _Tp mapped_type;
31700db7afdSDavid E. O'Brien      typedef typename _Ht::value_type value_type;
31800db7afdSDavid E. O'Brien      typedef typename _Ht::hasher hasher;
31900db7afdSDavid E. O'Brien      typedef typename _Ht::key_equal key_equal;
32000db7afdSDavid E. O'Brien
32100db7afdSDavid E. O'Brien      typedef typename _Ht::size_type size_type;
32200db7afdSDavid E. O'Brien      typedef typename _Ht::difference_type difference_type;
32300db7afdSDavid E. O'Brien      typedef typename _Ht::pointer pointer;
32400db7afdSDavid E. O'Brien      typedef typename _Ht::const_pointer const_pointer;
32500db7afdSDavid E. O'Brien      typedef typename _Ht::reference reference;
32600db7afdSDavid E. O'Brien      typedef typename _Ht::const_reference const_reference;
32700db7afdSDavid E. O'Brien
32800db7afdSDavid E. O'Brien      typedef typename _Ht::iterator iterator;
32900db7afdSDavid E. O'Brien      typedef typename _Ht::const_iterator const_iterator;
33000db7afdSDavid E. O'Brien
33100db7afdSDavid E. O'Brien      typedef typename _Ht::allocator_type allocator_type;
33200db7afdSDavid E. O'Brien
333*f8a1b7d9SAlexander Kabaev      hasher
334*f8a1b7d9SAlexander Kabaev      hash_funct() const
335*f8a1b7d9SAlexander Kabaev      { return _M_ht.hash_funct(); }
336*f8a1b7d9SAlexander Kabaev
337*f8a1b7d9SAlexander Kabaev      key_equal
338*f8a1b7d9SAlexander Kabaev      key_eq() const
339*f8a1b7d9SAlexander Kabaev      { return _M_ht.key_eq(); }
340*f8a1b7d9SAlexander Kabaev
341*f8a1b7d9SAlexander Kabaev      allocator_type
342*f8a1b7d9SAlexander Kabaev      get_allocator() const
343*f8a1b7d9SAlexander Kabaev      { return _M_ht.get_allocator(); }
34400db7afdSDavid E. O'Brien
34500db7afdSDavid E. O'Brien    public:
346*f8a1b7d9SAlexander Kabaev      hash_multimap()
347*f8a1b7d9SAlexander Kabaev      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
348*f8a1b7d9SAlexander Kabaev
349*f8a1b7d9SAlexander Kabaev      explicit
350*f8a1b7d9SAlexander Kabaev      hash_multimap(size_type __n)
35100db7afdSDavid E. O'Brien      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
352*f8a1b7d9SAlexander Kabaev
35300db7afdSDavid E. O'Brien      hash_multimap(size_type __n, const hasher& __hf)
35400db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
355*f8a1b7d9SAlexander Kabaev
35600db7afdSDavid E. O'Brien      hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
35700db7afdSDavid E. O'Brien		    const allocator_type& __a = allocator_type())
35800db7afdSDavid E. O'Brien      : _M_ht(__n, __hf, __eql, __a) {}
35900db7afdSDavid E. O'Brien
36000db7afdSDavid E. O'Brien      template<class _InputIterator>
36100db7afdSDavid E. O'Brien        hash_multimap(_InputIterator __f, _InputIterator __l)
36200db7afdSDavid E. O'Brien	: _M_ht(100, hasher(), key_equal(), allocator_type())
36300db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
364*f8a1b7d9SAlexander Kabaev
36500db7afdSDavid E. O'Brien      template<class _InputIterator>
36600db7afdSDavid E. O'Brien        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
36700db7afdSDavid E. O'Brien	: _M_ht(__n, hasher(), key_equal(), allocator_type())
36800db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
369*f8a1b7d9SAlexander Kabaev
37000db7afdSDavid E. O'Brien      template<class _InputIterator>
37100db7afdSDavid E. O'Brien        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
37200db7afdSDavid E. O'Brien		      const hasher& __hf)
37300db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, key_equal(), allocator_type())
37400db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
375*f8a1b7d9SAlexander Kabaev
37600db7afdSDavid E. O'Brien      template<class _InputIterator>
37700db7afdSDavid E. O'Brien        hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
37800db7afdSDavid E. O'Brien		      const hasher& __hf, const key_equal& __eql,
37900db7afdSDavid E. O'Brien		      const allocator_type& __a = allocator_type())
38000db7afdSDavid E. O'Brien	: _M_ht(__n, __hf, __eql, __a)
38100db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f, __l); }
38200db7afdSDavid E. O'Brien
38300db7afdSDavid E. O'Brien    public:
384*f8a1b7d9SAlexander Kabaev      size_type
385*f8a1b7d9SAlexander Kabaev      size() const
386*f8a1b7d9SAlexander Kabaev      { return _M_ht.size(); }
387*f8a1b7d9SAlexander Kabaev
388*f8a1b7d9SAlexander Kabaev      size_type
389*f8a1b7d9SAlexander Kabaev      max_size() const
390*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_size(); }
391*f8a1b7d9SAlexander Kabaev
392*f8a1b7d9SAlexander Kabaev      bool
393*f8a1b7d9SAlexander Kabaev      empty() const
394*f8a1b7d9SAlexander Kabaev      { return _M_ht.empty(); }
395*f8a1b7d9SAlexander Kabaev
396*f8a1b7d9SAlexander Kabaev      void
397*f8a1b7d9SAlexander Kabaev      swap(hash_multimap& __hs)
398*f8a1b7d9SAlexander Kabaev      { _M_ht.swap(__hs._M_ht); }
39900db7afdSDavid E. O'Brien
40000db7afdSDavid E. O'Brien      template<class _K1, class _T1, class _HF, class _EqK, class _Al>
401*f8a1b7d9SAlexander Kabaev        friend bool
402*f8a1b7d9SAlexander Kabaev        operator==(const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&,
40300db7afdSDavid E. O'Brien		   const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&);
40400db7afdSDavid E. O'Brien
405*f8a1b7d9SAlexander Kabaev      iterator
406*f8a1b7d9SAlexander Kabaev      begin()
407*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
408*f8a1b7d9SAlexander Kabaev
409*f8a1b7d9SAlexander Kabaev      iterator
410*f8a1b7d9SAlexander Kabaev      end()
411*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
412*f8a1b7d9SAlexander Kabaev
413*f8a1b7d9SAlexander Kabaev      const_iterator
414*f8a1b7d9SAlexander Kabaev      begin() const
415*f8a1b7d9SAlexander Kabaev      { return _M_ht.begin(); }
416*f8a1b7d9SAlexander Kabaev
417*f8a1b7d9SAlexander Kabaev      const_iterator
418*f8a1b7d9SAlexander Kabaev      end() const
419*f8a1b7d9SAlexander Kabaev      { return _M_ht.end(); }
42000db7afdSDavid E. O'Brien
42100db7afdSDavid E. O'Brien    public:
422*f8a1b7d9SAlexander Kabaev      iterator
423*f8a1b7d9SAlexander Kabaev      insert(const value_type& __obj)
42400db7afdSDavid E. O'Brien      { return _M_ht.insert_equal(__obj); }
425*f8a1b7d9SAlexander Kabaev
42600db7afdSDavid E. O'Brien      template<class _InputIterator>
427*f8a1b7d9SAlexander Kabaev        void
428*f8a1b7d9SAlexander Kabaev        insert(_InputIterator __f, _InputIterator __l)
42900db7afdSDavid E. O'Brien        { _M_ht.insert_equal(__f,__l); }
430*f8a1b7d9SAlexander Kabaev
431*f8a1b7d9SAlexander Kabaev      iterator
432*f8a1b7d9SAlexander Kabaev      insert_noresize(const value_type& __obj)
43300db7afdSDavid E. O'Brien      { return _M_ht.insert_equal_noresize(__obj); }
43400db7afdSDavid E. O'Brien
435*f8a1b7d9SAlexander Kabaev      iterator
436*f8a1b7d9SAlexander Kabaev      find(const key_type& __key)
43700db7afdSDavid E. O'Brien      { return _M_ht.find(__key); }
43800db7afdSDavid E. O'Brien
439*f8a1b7d9SAlexander Kabaev      const_iterator
440*f8a1b7d9SAlexander Kabaev      find(const key_type& __key) const
441*f8a1b7d9SAlexander Kabaev      { return _M_ht.find(__key); }
44200db7afdSDavid E. O'Brien
443*f8a1b7d9SAlexander Kabaev      size_type
444*f8a1b7d9SAlexander Kabaev      count(const key_type& __key) const
445*f8a1b7d9SAlexander Kabaev      { return _M_ht.count(__key); }
446*f8a1b7d9SAlexander Kabaev
447*f8a1b7d9SAlexander Kabaev      pair<iterator, iterator>
448*f8a1b7d9SAlexander Kabaev      equal_range(const key_type& __key)
44900db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
450*f8a1b7d9SAlexander Kabaev
45100db7afdSDavid E. O'Brien      pair<const_iterator, const_iterator>
45200db7afdSDavid E. O'Brien      equal_range(const key_type& __key) const
45300db7afdSDavid E. O'Brien      { return _M_ht.equal_range(__key); }
45400db7afdSDavid E. O'Brien
455*f8a1b7d9SAlexander Kabaev      size_type
456*f8a1b7d9SAlexander Kabaev      erase(const key_type& __key)
457*f8a1b7d9SAlexander Kabaev      { return _M_ht.erase(__key); }
458*f8a1b7d9SAlexander Kabaev
459*f8a1b7d9SAlexander Kabaev      void
460*f8a1b7d9SAlexander Kabaev      erase(iterator __it)
461*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__it); }
462*f8a1b7d9SAlexander Kabaev
463*f8a1b7d9SAlexander Kabaev      void
464*f8a1b7d9SAlexander Kabaev      erase(iterator __f, iterator __l)
465*f8a1b7d9SAlexander Kabaev      { _M_ht.erase(__f, __l); }
466*f8a1b7d9SAlexander Kabaev
467*f8a1b7d9SAlexander Kabaev      void
468*f8a1b7d9SAlexander Kabaev      clear()
469*f8a1b7d9SAlexander Kabaev      { _M_ht.clear(); }
47000db7afdSDavid E. O'Brien
47100db7afdSDavid E. O'Brien    public:
472*f8a1b7d9SAlexander Kabaev      void
473*f8a1b7d9SAlexander Kabaev      resize(size_type __hint)
474*f8a1b7d9SAlexander Kabaev      { _M_ht.resize(__hint); }
475*f8a1b7d9SAlexander Kabaev
476*f8a1b7d9SAlexander Kabaev      size_type
477*f8a1b7d9SAlexander Kabaev      bucket_count() const
478*f8a1b7d9SAlexander Kabaev      { return _M_ht.bucket_count(); }
479*f8a1b7d9SAlexander Kabaev
480*f8a1b7d9SAlexander Kabaev      size_type
481*f8a1b7d9SAlexander Kabaev      max_bucket_count() const
482*f8a1b7d9SAlexander Kabaev      { return _M_ht.max_bucket_count(); }
483*f8a1b7d9SAlexander Kabaev
484*f8a1b7d9SAlexander Kabaev      size_type
485*f8a1b7d9SAlexander Kabaev      elems_in_bucket(size_type __n) const
48600db7afdSDavid E. O'Brien      { return _M_ht.elems_in_bucket(__n); }
48700db7afdSDavid E. O'Brien    };
48800db7afdSDavid E. O'Brien
48900db7afdSDavid E. O'Brien  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
49000db7afdSDavid E. O'Brien    inline bool
49100db7afdSDavid E. O'Brien    operator==(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
49200db7afdSDavid E. O'Brien	       const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
493*f8a1b7d9SAlexander Kabaev    { return __hm1._M_ht == __hm2._M_ht; }
49400db7afdSDavid E. O'Brien
49500db7afdSDavid E. O'Brien  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
49600db7afdSDavid E. O'Brien    inline bool
49700db7afdSDavid E. O'Brien    operator!=(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
498*f8a1b7d9SAlexander Kabaev	       const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
499*f8a1b7d9SAlexander Kabaev    { return !(__hm1 == __hm2); }
50000db7afdSDavid E. O'Brien
501*f8a1b7d9SAlexander Kabaev  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
50200db7afdSDavid E. O'Brien    inline void
503*f8a1b7d9SAlexander Kabaev    swap(hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
504*f8a1b7d9SAlexander Kabaev	 hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
505*f8a1b7d9SAlexander Kabaev    { __hm1.swap(__hm2); }
50600db7afdSDavid E. O'Brien
507*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NESTED_NAMESPACE
50800db7afdSDavid E. O'Brien
509*f8a1b7d9SAlexander Kabaev#ifdef _GLIBCXX_DEBUG
510*f8a1b7d9SAlexander Kabaev# include <debug/hash_map>
511*f8a1b7d9SAlexander Kabaev#endif
512*f8a1b7d9SAlexander Kabaev
513*f8a1b7d9SAlexander Kabaev_GLIBCXX_BEGIN_NAMESPACE(std)
514*f8a1b7d9SAlexander Kabaev
51500db7afdSDavid E. O'Brien  // Specialization of insert_iterator so that it will work for hash_map
51600db7afdSDavid E. O'Brien  // and hash_multimap.
51700db7afdSDavid E. O'Brien  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
518*f8a1b7d9SAlexander Kabaev    class insert_iterator<__gnu_cxx::hash_map<_Key, _Tp, _HashFn,
519*f8a1b7d9SAlexander Kabaev					      _EqKey, _Alloc> >
520*f8a1b7d9SAlexander Kabaev    {
52100db7afdSDavid E. O'Brien    protected:
522*f8a1b7d9SAlexander Kabaev      typedef __gnu_cxx::hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc>
523*f8a1b7d9SAlexander Kabaev        _Container;
52400db7afdSDavid E. O'Brien      _Container* container;
525*f8a1b7d9SAlexander Kabaev
52600db7afdSDavid E. O'Brien    public:
52700db7afdSDavid E. O'Brien      typedef _Container          container_type;
52800db7afdSDavid E. O'Brien      typedef output_iterator_tag iterator_category;
52900db7afdSDavid E. O'Brien      typedef void                value_type;
53000db7afdSDavid E. O'Brien      typedef void                difference_type;
53100db7afdSDavid E. O'Brien      typedef void                pointer;
53200db7afdSDavid E. O'Brien      typedef void                reference;
53300db7afdSDavid E. O'Brien
534*f8a1b7d9SAlexander Kabaev      insert_iterator(_Container& __x)
535*f8a1b7d9SAlexander Kabaev      : container(&__x) {}
536*f8a1b7d9SAlexander Kabaev
53700db7afdSDavid E. O'Brien      insert_iterator(_Container& __x, typename _Container::iterator)
53800db7afdSDavid E. O'Brien      : container(&__x) {}
539*f8a1b7d9SAlexander Kabaev
54000db7afdSDavid E. O'Brien      insert_iterator<_Container>&
541*f8a1b7d9SAlexander Kabaev      operator=(const typename _Container::value_type& __value)
542*f8a1b7d9SAlexander Kabaev      {
54300db7afdSDavid E. O'Brien	container->insert(__value);
54400db7afdSDavid E. O'Brien	return *this;
54500db7afdSDavid E. O'Brien      }
546*f8a1b7d9SAlexander Kabaev
547*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
548*f8a1b7d9SAlexander Kabaev      operator*()
549*f8a1b7d9SAlexander Kabaev      { return *this; }
550*f8a1b7d9SAlexander Kabaev
551*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
552*f8a1b7d9SAlexander Kabaev      operator++() { return *this; }
553*f8a1b7d9SAlexander Kabaev
554*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
555*f8a1b7d9SAlexander Kabaev      operator++(int)
556*f8a1b7d9SAlexander Kabaev      { return *this; }
55700db7afdSDavid E. O'Brien    };
55800db7afdSDavid E. O'Brien
55900db7afdSDavid E. O'Brien  template<class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
560*f8a1b7d9SAlexander Kabaev    class insert_iterator<__gnu_cxx::hash_multimap<_Key, _Tp, _HashFn,
561*f8a1b7d9SAlexander Kabaev						   _EqKey, _Alloc> >
562*f8a1b7d9SAlexander Kabaev    {
56300db7afdSDavid E. O'Brien    protected:
564*f8a1b7d9SAlexander Kabaev      typedef __gnu_cxx::hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc>
565*f8a1b7d9SAlexander Kabaev        _Container;
56600db7afdSDavid E. O'Brien      _Container* container;
56700db7afdSDavid E. O'Brien      typename _Container::iterator iter;
568*f8a1b7d9SAlexander Kabaev
56900db7afdSDavid E. O'Brien    public:
57000db7afdSDavid E. O'Brien      typedef _Container          container_type;
57100db7afdSDavid E. O'Brien      typedef output_iterator_tag iterator_category;
57200db7afdSDavid E. O'Brien      typedef void                value_type;
57300db7afdSDavid E. O'Brien      typedef void                difference_type;
57400db7afdSDavid E. O'Brien      typedef void                pointer;
57500db7afdSDavid E. O'Brien      typedef void                reference;
57600db7afdSDavid E. O'Brien
577*f8a1b7d9SAlexander Kabaev      insert_iterator(_Container& __x)
578*f8a1b7d9SAlexander Kabaev      : container(&__x) {}
579*f8a1b7d9SAlexander Kabaev
58000db7afdSDavid E. O'Brien      insert_iterator(_Container& __x, typename _Container::iterator)
58100db7afdSDavid E. O'Brien      : container(&__x) {}
582*f8a1b7d9SAlexander Kabaev
58300db7afdSDavid E. O'Brien      insert_iterator<_Container>&
584*f8a1b7d9SAlexander Kabaev      operator=(const typename _Container::value_type& __value)
585*f8a1b7d9SAlexander Kabaev      {
58600db7afdSDavid E. O'Brien	container->insert(__value);
58700db7afdSDavid E. O'Brien	return *this;
58800db7afdSDavid E. O'Brien      }
589*f8a1b7d9SAlexander Kabaev
590*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
591*f8a1b7d9SAlexander Kabaev      operator*()
592*f8a1b7d9SAlexander Kabaev      { return *this; }
593*f8a1b7d9SAlexander Kabaev
594*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
595*f8a1b7d9SAlexander Kabaev      operator++()
596*f8a1b7d9SAlexander Kabaev      { return *this; }
597*f8a1b7d9SAlexander Kabaev
598*f8a1b7d9SAlexander Kabaev      insert_iterator<_Container>&
599*f8a1b7d9SAlexander Kabaev      operator++(int)
600*f8a1b7d9SAlexander Kabaev      { return *this; }
60100db7afdSDavid E. O'Brien    };
602*f8a1b7d9SAlexander Kabaev
603*f8a1b7d9SAlexander Kabaev_GLIBCXX_END_NAMESPACE
60400db7afdSDavid E. O'Brien
605ffeaf689SAlexander Kabaev#endif
606