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