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