_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