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