_hashtable.c revision 9720d5f59b9c1f5d1b9ecbc9173dbcb71bd557be
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_HASHTABLE_C 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_HASHTABLE_C 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_HASHTABLE_H 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_hashtable.h> 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __PRIME_LIST_BODY { \ 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 7ul, 23ul, \ 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 53ul, 97ul, 193ul, 389ul, 769ul, \ 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, \ 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, \ 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul, \ 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,\ 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1610612741ul, 3221225473ul, 4294967291ul \ 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Dummy> 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocksize_t _STLP_CALL 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Stl_prime<_Dummy>::_S_max_nb_buckets() { 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t _list[] = __PRIME_LIST_BODY; 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef __MWERKS__ 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _list[(sizeof(_list)/sizeof(_list[0])) - 1]; 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _list[30/sizeof(size_t) - 1]; // stupid MWERKS! 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Dummy> 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocksize_t _STLP_CALL 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Stl_prime<_Dummy>::_S_next_size(size_t __n) { 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static const size_t _list[] = __PRIME_LIST_BODY; 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t* __first = _list; 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# ifndef __MWERKS__ 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t* __last = _list + (sizeof(_list)/sizeof(_list[0])); 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# else 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t* __last = _list + (30/sizeof(size_t)); // stupid MWERKS 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_t* pos = __lower_bound(__first, __last, __n, 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __less((size_t*)0), __less((size_t*)0), (ptrdiff_t*)0); 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return (pos == __last ? *(__last - 1) : *pos); 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# undef __PRIME_LIST_BODY 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG) 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define hashtable _STLP_NON_DBG_NAME(hashtable) 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// fbp: these defines are for outline methods definitions. 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// needed to definitions to be portable. Should not be used in method bodies. 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined ( _STLP_NESTED_TYPE_PARAM_BUG ) 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __size_type__ size_t 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define size_type size_t 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define value_type _Val 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define key_type _Key 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __reference__ _Val& 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __iterator__ _Ht_iterator<_Val, _STLP_HEADER_TYPENAME _Traits::_NonConstTraits, \ 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Key, _HF, _ExK, _EqK, _All> 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __const_iterator__ _Ht_iterator<_Val, _STLP_HEADER_TYPENAME _Traits::_ConstTraits, \ 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Key, _HF, _ExK, _EqK, _All> 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::size_type 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __reference__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::reference 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __iterator__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::iterator 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# define __const_iterator__ _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::const_iterator 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This method is too difficult to implement for hashtable that do not 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * require a sorted operation on the stored type. 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_equal( 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht1, 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht2) { 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __ht1._M_buckets == __ht2._M_buckets && 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ht1._M_elems == __ht2._M_elems; 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block*/ 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* Returns the iterator before the first iterator of the bucket __n and set 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * __n to the first previous bucket having the same first iterator as bucket 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * __n. 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_M_before_begin(size_type &__n) const { 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _S_before_begin(_M_elems, _M_buckets, __n); 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_S_before_begin(const _ElemsCont& __elems, const _BucketVector& __buckets, 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type &__n) { 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsCont &__mutable_elems = __CONST_CAST(_ElemsCont&, __elems); 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _BucketVector::const_iterator __bpos(__buckets.begin() + __n); 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __pos(*__bpos); 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__pos == __mutable_elems.begin()) { 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __n = 0; 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __mutable_elems.before_begin(); 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _BucketVector::const_iterator __bcur(__bpos); 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BucketType *__pos_node = __pos._M_node; 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (--__bcur; __pos_node == *__bcur; --__bcur); 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __n = __bcur - __buckets.begin() + 1; 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(*__bcur); 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = __cur++; 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __pos; ++__prev, ++__cur); 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __prev; 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_M_insert_noresize(size_type __n, const value_type& __obj) { 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We always insert this element as 1st in the bucket to not break 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //the elements order as equal elements must be kept next to each other. 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __prev = __n; 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __pos = _M_before_begin(__prev)._M_ite; 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(_M_buckets.begin() + __prev, _M_buckets.begin() + __n + 1, 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.insert_after(__pos, __obj)._M_node); 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++_M_num_elements; 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return iterator(_ElemsIte(_M_buckets[__n])); 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpair<__iterator__, bool> 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::insert_unique_noresize(const value_type& __obj) { 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __n = _M_bkt_num(__obj); 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__n]); 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __last(_M_buckets[__n + 1]); 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__cur != __last) { 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __last; ++__cur) { 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_equals(_M_get_key(*__cur), _M_get_key(__obj))) { 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We check that equivalent keys have equals hash code as otherwise, on resize, 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //equivalent value might not be in the same bucket 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(_M_hash(_M_get_key(*__cur)) == _M_hash(_M_get_key(__obj))) 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return pair<iterator, bool>(iterator(__cur), false); 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* Here we do not rely on the _M_insert_noresize method as we know 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * that we cannot break element orders, elements are unique, and 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * insertion after the first bucket element is faster than what is 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * done in _M_insert_noresize. 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __cur = _M_elems.insert_after(_ElemsIte(_M_buckets[__n]), __obj); 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++_M_num_elements; 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return pair<iterator, bool>(iterator(__cur), true); 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return pair<iterator, bool>(_M_insert_noresize(__n, __obj), true); 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::insert_equal_noresize(const value_type& __obj) { 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __n = _M_bkt_num(__obj); 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__n]); 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __last(_M_buckets[__n + 1]); 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __last; ++__cur) { 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_equals(_M_get_key(*__cur), _M_get_key(__obj))) { 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We check that equivalent keys have equals hash code as otherwise, on resize, 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //equivalent value might not be in the same bucket 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT(_M_hash(_M_get_key(*__cur)) == _M_hash(_M_get_key(__obj))) 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++_M_num_elements; 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_elems.insert_after(__cur, __obj); 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_insert_noresize(__n, __obj); 2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__reference__ 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_M_insert(const value_type& __obj) { 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block resize(_M_num_elements + 1); 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return *insert_unique_noresize(__obj).first; 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__reference__ 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::find_or_insert(const value_type& __obj) { 2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Node* __first = _M_find(_M_get_key(__obj)); 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__first) 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __first->_M_val; 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _M_insert(__obj); 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block*/ 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__size_type__ 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::erase(const key_type& __key) { 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __n = _M_bkt_num_key(__key); 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__n]); 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __last(_M_buckets[__n + 1]); 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__cur == __last) 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __erased = 0; 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_equals(_M_get_key(*__cur), __key)) { 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We look for the pos before __cur: 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __prev_b = __n; 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = _M_before_begin(__prev_b)._M_ite; 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block do { 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __cur = _M_elems.erase_after(__prev); 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__erased; 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } while ((__cur != __last) && _M_equals(_M_get_key(*__cur), __key)); 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(_M_buckets.begin() + __prev_b, _M_buckets.begin() + __n + 1, __cur._M_node); 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = __cur++; 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __last; ++__prev, ++__cur) { 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_M_equals(_M_get_key(*__cur), __key)) { 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block do { 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __cur = _M_elems.erase_after(__prev); 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__erased; 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } while ((__cur != __last) && _M_equals(_M_get_key(*__cur), __key)); 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_num_elements -= __erased; 2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __erased; 2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::erase(const_iterator __it) { 2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const size_type __n = _M_bkt_num(*__it); 2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__n]); 2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__cur == __it._M_ite) { 2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __prev_b = __n; 3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = _M_before_begin(__prev_b)._M_ite; 3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(_M_buckets.begin() + __prev_b, _M_buckets.begin() + __n + 1, 3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.erase_after(__prev)._M_node); 3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block --_M_num_elements; 3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = __cur++; 3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __last(_M_buckets[__n + 1]); 3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __last; ++__prev, ++__cur) { 3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__cur == __it._M_ite) { 3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.erase_after(__prev); 3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block --_M_num_elements; 3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::erase(const_iterator __first, const_iterator __last) { 3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__first == __last) 3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return; 3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __f_bucket = _M_bkt_num(*__first); 3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __l_bucket = __last != end() ? _M_bkt_num(*__last) : (_M_buckets.size() - 1); 3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__f_bucket]); 3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev; 3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__cur == __first._M_ite) { 3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __prev = _M_before_begin(__f_bucket)._M_ite; 3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __last(_M_buckets[++__f_bucket]); 3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __prev = __cur++; 3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; (__cur != __last) && (__cur != __first._M_ite); ++__prev, ++__cur); 3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We do not use the slist::erase_after method taking a range to count the 3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //number of erased elements: 3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (__cur != __last._M_ite) { 3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __cur = _M_elems.erase_after(__prev); 3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block --_M_num_elements; 3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(_M_buckets.begin() + __f_bucket, _M_buckets.begin() + __l_bucket + 1, __cur._M_node); 3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::rehash(size_type __num_buckets_hint) { 3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if ((bucket_count() >= __num_buckets_hint) && 3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (max_load_factor() > load_factor())) 3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return; 3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //Here if max_load_factor is lower than 1.0 the resulting value might not be representable 3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //as a size_type. The result concerning the respect of the max_load_factor will then be 3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //undefined. 3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __num_buckets_hint = (max) (__num_buckets_hint, (size_type)((float)size() / max_load_factor())); 3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __num_buckets = _STLP_PRIV _Stl_prime_type::_S_next_size(__num_buckets_hint); 3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_rehash(__num_buckets); 3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::resize(size_type __num_elements_hint) { 3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (((float)__num_elements_hint / (float)bucket_count() <= max_load_factor()) && 3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (max_load_factor() >= load_factor())) { 3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return; 3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __num_buckets_hint = (size_type)((float)(max) (__num_elements_hint, size()) / max_load_factor()); 3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __num_buckets = _STLP_PRIV _Stl_prime_type::_S_next_size(__num_buckets_hint); 3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG) 3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_check(); 3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_rehash(__num_buckets); 3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_M_rehash(size_type __num_buckets) { 3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsCont __tmp_elems(_M_elems.get_allocator()); 3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BucketVector __tmp(__num_buckets + 1, __STATIC_CAST(_BucketType*, 0), _M_buckets.get_allocator()); 3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur, __last(_M_elems.end()); 3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (!_M_elems.empty()) { 3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __cur = _M_elems.begin(); 3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __new_bucket = _M_bkt_num(*__cur, __num_buckets); 3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __ite(__cur), __before_ite(__cur); 3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (++__ite; 3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ite != __last && _M_equals(_M_get_key(*__cur), _M_get_key(*__ite)); 3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__ite, ++__before_ite); 3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __prev_bucket = __new_bucket; 3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __prev = _S_before_begin(__tmp_elems, __tmp, __prev_bucket)._M_ite; 3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __tmp_elems.splice_after(__prev, _M_elems, _M_elems.before_begin(), __before_ite); 3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(__tmp.begin() + __prev_bucket, __tmp.begin() + __new_bucket + 1, __cur._M_node); 3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.swap(__tmp_elems); 3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buckets.swap(__tmp); 4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG) 4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_check() const { 4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //We check that hash code of stored keys haven't change and also that equivalent 4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //relation hasn't been modified 4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_t __num_buckets = bucket_count(); 4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (size_t __b = 0; __b < __num_buckets; ++__b) { 4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __cur(_M_buckets[__b]), __last(_M_buckets[__b + 1]); 4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __fst(__cur), __snd(__cur); 4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __cur != __last; ++__cur) { 4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT( _M_bkt_num(*__cur, __num_buckets) == __b ) 4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT( !_M_equals(_M_get_key(*__fst), _M_get_key(*__cur)) || _M_equals(_M_get_key(*__snd), _M_get_key(*__cur)) ) 4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__fst != __snd) 4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__fst; 4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__snd != __cur) 4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__snd; 4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::clear() { 4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.clear(); 4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buckets.assign(_M_buckets.size(), __STATIC_CAST(_BucketType*, 0)); 4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_num_elements = 0; 4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Val, class _Key, class _HF, 4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _Traits, class _ExK, class _EqK, class _All> 4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All> 4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ::_M_copy_from(const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht) { 4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.clear(); 4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_elems.insert(_M_elems.end(), __ht._M_elems.begin(), __ht._M_elems.end()); 4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_buckets.resize(__ht._M_buckets.size()); 4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsConstIte __src(__ht._M_elems.begin()), __src_end(__ht._M_elems.end()); 4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _ElemsIte __dst(_M_elems.begin()); 4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _BucketVector::const_iterator __src_b(__ht._M_buckets.begin()), 4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __src_end_b(__ht._M_buckets.end()); 4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _BucketVector::iterator __dst_b(_M_buckets.begin()), __dst_end_b(_M_buckets.end()); 4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __src != __src_end; ++__src, ++__dst) { 4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (; __src_b != __src_end_b; ++__src_b, ++__dst_b) { 4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (*__src_b == __src._M_node) { 4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *__dst_b = __dst._M_node; 4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block fill(__dst_b, __dst_end_b, __STATIC_CAST(_BucketType*, 0)); 4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_num_elements = __ht._M_num_elements; 4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_max_load_factor = __ht._M_max_load_factor; 4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __iterator__ 4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef const_iterator 4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __size_type__ 4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __reference__ 4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef size_type 4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef value_type 4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef key_type 4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __stl_num_primes 4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG) 4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# undef hashtable 4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_HASHTABLE_C */ 4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 479