ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

_hashtable.c
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1994
00003  * Hewlett-Packard Company
00004  *
00005  * Copyright (c) 1996,1997
00006  * Silicon Graphics Computer Systems, Inc.
00007  *
00008  * Copyright (c) 1997
00009  * Moscow Center for SPARC Technology
00010  *
00011  * Copyright (c) 1999
00012  * Boris Fomitchev
00013  *
00014  * This material is provided "as is", with absolutely no warranty expressed
00015  * or implied. Any use is at your own risk.
00016  *
00017  * Permission to use or copy this software for any purpose is hereby granted
00018  * without fee, provided the above notices are retained on all copies.
00019  * Permission to modify the code and to distribute modified code is granted,
00020  * provided the above notices are retained, and a notice that the code was
00021  * modified is included with the above copyright notice.
00022  *
00023  */
00024 #ifndef _STLP_HASHTABLE_C
00025 #define _STLP_HASHTABLE_C
00026 
00027 #ifndef _STLP_INTERNAL_HASHTABLE_H
00028 #  include <stl/_hashtable.h>
00029 #endif
00030 
00031 _STLP_BEGIN_NAMESPACE
00032 
00033 #if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
00034 
00035 _STLP_MOVE_TO_PRIV_NAMESPACE
00036 
00037 #  define __PRIME_LIST_BODY { \
00038   7ul,          23ul, \
00039   53ul,         97ul,         193ul,       389ul,       769ul,      \
00040   1543ul,       3079ul,       6151ul,      12289ul,     24593ul,    \
00041   49157ul,      98317ul,      196613ul,    393241ul,    786433ul,   \
00042   1572869ul,    3145739ul,    6291469ul,   12582917ul,  25165843ul, \
00043   50331653ul,   100663319ul,  201326611ul, 402653189ul, 805306457ul,\
00044   1610612741ul, 3221225473ul, 4294967291ul  \
00045 }
00046 
00047 template <class _Dummy>
00048 const size_t* _STLP_CALL
00049 _Stl_prime<_Dummy>::_S_primes(size_t &__size) {
00050   static const size_t _list[] = __PRIME_LIST_BODY;
00051 #  ifndef __MWERKS__
00052   __size =  sizeof(_list) / sizeof(_list[0]);
00053 #  else
00054   __size =  30;
00055 #  endif
00056   return _list;
00057 }
00058 
00059 template <class _Dummy>
00060 size_t _STLP_CALL
00061 _Stl_prime<_Dummy>::_S_max_nb_buckets() {
00062   size_t __size;
00063   const size_t* __first = _S_primes(__size);
00064   return *(__first + __size - 1);
00065 }
00066 
00067 template <class _Dummy>
00068 size_t _STLP_CALL
00069 _Stl_prime<_Dummy>::_S_next_size(size_t __n) {
00070   size_t __size;
00071   const size_t* __first = _S_primes(__size);
00072   const size_t* __last =  __first + __size;
00073   const size_t* pos = __lower_bound(__first, __last, __n, 
00074                                     __less((size_t*)0), __less((size_t*)0), (ptrdiff_t*)0);
00075   return (pos == __last ? *(__last - 1) : *pos);
00076 }
00077 
00078 template <class _Dummy>
00079 void _STLP_CALL
00080 _Stl_prime<_Dummy>::_S_prev_sizes(size_t __n, size_t const*&__begin, size_t const*&__pos) {
00081   size_t __size;
00082   __begin = _S_primes(__size);
00083   const size_t* __last =  __begin + __size;
00084   __pos = __lower_bound(__begin, __last, __n, 
00085                         __less((size_t*)0), __less((size_t*)0), (ptrdiff_t*)0);
00086 
00087   if (__pos== __last)
00088     --__pos;
00089   else if (*__pos == __n) {
00090     if (__pos != __begin)
00091       --__pos;
00092   }
00093 }
00094 
00095 #  undef __PRIME_LIST_BODY
00096 
00097 _STLP_MOVE_TO_STD_NAMESPACE
00098 
00099 #endif
00100 
00101 #if defined (_STLP_DEBUG)
00102 #  define hashtable _STLP_NON_DBG_NAME(hashtable)
00103 _STLP_MOVE_TO_PRIV_NAMESPACE
00104 #endif
00105 
00106 // fbp: these defines are for outline methods definitions.
00107 // needed to definitions to be portable. Should not be used in method bodies.
00108 
00109 #if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
00110 #  define __size_type__       size_t
00111 #  define size_type           size_t
00112 #  define value_type          _Val
00113 #  define key_type            _Key
00114 #  define __reference__       _Val&
00115 
00116 #  define __iterator__        _Ht_iterator<_Val, _STLP_HEADER_TYPENAME _Traits::_NonConstTraits, \
00117                                            _Key, _HF, _ExK, _EqK, _All>
00118 #  define __const_iterator__  _Ht_iterator<_Val, _STLP_HEADER_TYPENAME _Traits::_ConstTraits, \
00119                                            _Key, _HF, _ExK, _EqK, _All>
00120 #else
00121 #  define __size_type__       _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::size_type
00122 #  define __reference__       _STLP_TYPENAME_ON_RETURN_TYPE  hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::reference
00123 #  define __iterator__        _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::iterator
00124 #  define __const_iterator__  _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _Traits, _ExK, _EqK, _All>::const_iterator
00125 #endif
00126 
00127 /*
00128  * This method is too difficult to implement for hashtable that do not
00129  * require a sorted operation on the stored type.
00130 template <class _Val, class _Key, class _HF,
00131           class _Traits, class _ExK, class _EqK, class _All>
00132 bool hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_equal(
00133               const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht1,
00134               const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht2) {
00135   return __ht1._M_buckets == __ht2._M_buckets &&
00136          __ht1._M_elems == __ht2._M_elems;
00137 }
00138 */
00139 
00140 /* Returns the iterator before the first iterator of the bucket __n and set
00141  * __n to the first previous bucket having the same first iterator as bucket
00142  * __n.
00143  */
00144 template <class _Val, class _Key, class _HF,
00145           class _Traits, class _ExK, class _EqK, class _All>
00146 __iterator__
00147 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00148   ::_M_before_begin(size_type &__n) const {
00149   return _S_before_begin(_M_elems, _M_buckets, __n);
00150 }
00151 
00152 template <class _Val, class _Key, class _HF,
00153           class _Traits, class _ExK, class _EqK, class _All>
00154 __iterator__
00155 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00156   ::_S_before_begin(const _ElemsCont& __elems, const _BucketVector& __buckets,
00157                     size_type &__n) {
00158   _ElemsCont &__mutable_elems = __CONST_CAST(_ElemsCont&, __elems);
00159   typename _BucketVector::const_iterator __bpos(__buckets.begin() + __n);
00160 
00161   _ElemsIte __pos(*__bpos);
00162   if (__pos == __mutable_elems.begin()) {
00163     __n = 0;
00164     return __mutable_elems.before_begin();
00165   }
00166 
00167   typename _BucketVector::const_iterator __bcur(__bpos);
00168   _BucketType *__pos_node = __pos._M_node;
00169   for (--__bcur; __pos_node == *__bcur; --__bcur);
00170 
00171   __n = __bcur - __buckets.begin() + 1;
00172   _ElemsIte __cur(*__bcur);
00173   _ElemsIte __prev = __cur++;
00174   for (; __cur != __pos; ++__prev, ++__cur);
00175   return __prev;
00176 }
00177 
00178 
00179 template <class _Val, class _Key, class _HF,
00180           class _Traits, class _ExK, class _EqK, class _All>
00181 __iterator__
00182 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00183   ::_M_insert_noresize(size_type __n, const value_type& __obj) {
00184   //We always insert this element as 1st in the bucket to not break
00185   //the elements order as equal elements must be kept next to each other.
00186   size_type __prev = __n;
00187   _ElemsIte __pos = _M_before_begin(__prev)._M_ite;
00188 
00189   fill(_M_buckets.begin() + __prev, _M_buckets.begin() + __n + 1,
00190        _M_elems.insert_after(__pos, __obj)._M_node);
00191   ++_M_num_elements;
00192   return iterator(_ElemsIte(_M_buckets[__n]));
00193 }
00194 
00195 template <class _Val, class _Key, class _HF,
00196           class _Traits, class _ExK, class _EqK, class _All>
00197 pair<__iterator__, bool>
00198 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00199   ::insert_unique_noresize(const value_type& __obj) {
00200   const size_type __n = _M_bkt_num(__obj);
00201   _ElemsIte __cur(_M_buckets[__n]);
00202   _ElemsIte __last(_M_buckets[__n + 1]);
00203 
00204   if (__cur != __last) {
00205     for (; __cur != __last; ++__cur) {
00206       if (_M_equals(_M_get_key(*__cur), _M_get_key(__obj))) {
00207         //We check that equivalent keys have equals hash code as otherwise, on resize,
00208         //equivalent value might not be in the same bucket
00209         _STLP_ASSERT(_M_hash(_M_get_key(*__cur)) == _M_hash(_M_get_key(__obj)))
00210         return pair<iterator, bool>(iterator(__cur), false);
00211       }
00212     }
00213     /* Here we do not rely on the _M_insert_noresize method as we know
00214      * that we cannot break element orders, elements are unique, and
00215      * insertion after the first bucket element is faster than what is
00216      * done in _M_insert_noresize.
00217      */
00218     __cur = _M_elems.insert_after(_ElemsIte(_M_buckets[__n]), __obj);
00219     ++_M_num_elements;
00220     return pair<iterator, bool>(iterator(__cur), true);
00221   }
00222 
00223   return pair<iterator, bool>(_M_insert_noresize(__n, __obj), true);
00224 }
00225 
00226 template <class _Val, class _Key, class _HF,
00227           class _Traits, class _ExK, class _EqK, class _All>
00228 __iterator__
00229 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00230   ::insert_equal_noresize(const value_type& __obj) {
00231   const size_type __n = _M_bkt_num(__obj);
00232   {
00233     _ElemsIte __cur(_M_buckets[__n]);
00234     _ElemsIte __last(_M_buckets[__n + 1]);
00235 
00236     for (; __cur != __last; ++__cur) {
00237       if (_M_equals(_M_get_key(*__cur), _M_get_key(__obj))) {
00238         //We check that equivalent keys have equals hash code as otherwise, on resize,
00239         //equivalent value might not be in the same bucket
00240         _STLP_ASSERT(_M_hash(_M_get_key(*__cur)) == _M_hash(_M_get_key(__obj)))
00241         ++_M_num_elements;
00242         return _M_elems.insert_after(__cur, __obj);
00243       }
00244     }
00245   }
00246 
00247   return _M_insert_noresize(__n, __obj);
00248 }
00249 
00250 template <class _Val, class _Key, class _HF,
00251           class _Traits, class _ExK, class _EqK, class _All>
00252 __reference__
00253 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00254   ::_M_insert(const value_type& __obj) {
00255   _M_enlarge(_M_num_elements + 1);
00256   return *insert_unique_noresize(__obj).first;
00257 }
00258 
00259 template <class _Val, class _Key, class _HF,
00260           class _Traits, class _ExK, class _EqK, class _All>
00261 __size_type__
00262 hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00263   ::erase(const key_type& __key) {
00264   const size_type __n = _M_bkt_num_key(__key);
00265 
00266   _ElemsIte __cur(_M_buckets[__n]);
00267   _ElemsIte __last(_M_buckets[__n + 1]);
00268   if (__cur == __last)
00269     return 0;
00270 
00271   size_type __erased = 0;
00272   if (_M_equals(_M_get_key(*__cur), __key)) {
00273     //We look for the pos before __cur:
00274     size_type __prev_b = __n;
00275     _ElemsIte __prev = _M_before_begin(__prev_b)._M_ite;
00276     do {
00277       __cur = _M_elems.erase_after(__prev);
00278       ++__erased;
00279     } while ((__cur != __last) && _M_equals(_M_get_key(*__cur), __key));
00280     fill(_M_buckets.begin() + __prev_b, _M_buckets.begin() + __n + 1, __cur._M_node);
00281   }
00282   else {
00283     _ElemsIte __prev = __cur++;
00284     for (; __cur != __last; ++__prev, ++__cur) {
00285       if (_M_equals(_M_get_key(*__cur), __key)) {
00286         do {
00287           __cur = _M_elems.erase_after(__prev);
00288           ++__erased;
00289         } while ((__cur != __last) && _M_equals(_M_get_key(*__cur), __key));
00290         break;
00291       }
00292     }
00293   }
00294 
00295   _M_num_elements -= __erased;
00296   _M_reduce();
00297   return __erased;
00298 }
00299 
00300 template <class _Val, class _Key, class _HF,
00301           class _Traits, class _ExK, class _EqK, class _All>
00302 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00303   ::erase(const_iterator __it) {
00304   const size_type __n = _M_bkt_num(*__it);
00305   _ElemsIte __cur(_M_buckets[__n]);
00306 
00307   size_type __erased = 0;
00308   if (__cur == __it._M_ite) {
00309     size_type __prev_b = __n;
00310     _ElemsIte __prev = _M_before_begin(__prev_b)._M_ite;
00311     fill(_M_buckets.begin() + __prev_b, _M_buckets.begin() + __n + 1,
00312          _M_elems.erase_after(__prev)._M_node);
00313     ++__erased;
00314   }
00315   else {
00316     _ElemsIte __prev = __cur++;
00317     _ElemsIte __last(_M_buckets[__n + 1]);
00318     for (; __cur != __last; ++__prev, ++__cur) {
00319       if (__cur == __it._M_ite) {
00320         _M_elems.erase_after(__prev);
00321         ++__erased;
00322         break;
00323       }
00324     }
00325   }
00326 
00327   _M_num_elements -= __erased;
00328   _M_reduce();
00329 }
00330 
00331 template <class _Val, class _Key, class _HF,
00332           class _Traits, class _ExK, class _EqK, class _All>
00333 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00334   ::erase(const_iterator __first, const_iterator __last) {
00335   if (__first == __last)
00336     return;
00337   size_type __f_bucket = _M_bkt_num(*__first);
00338   size_type __l_bucket = __last != end() ? _M_bkt_num(*__last) : (_M_buckets.size() - 1);
00339 
00340   _ElemsIte __cur(_M_buckets[__f_bucket]);
00341   _ElemsIte __prev;
00342   if (__cur == __first._M_ite) {
00343     __prev = _M_before_begin(__f_bucket)._M_ite;
00344   }
00345   else {
00346     _ElemsIte __last(_M_buckets[++__f_bucket]);
00347     __prev = __cur++;
00348     for (; (__cur != __last) && (__cur != __first._M_ite); ++__prev, ++__cur);
00349   }
00350   size_type __erased = 0;
00351   //We do not use the slist::erase_after method taking a range to count the
00352   //number of erased elements:
00353   while (__cur != __last._M_ite) {
00354     __cur = _M_elems.erase_after(__prev);
00355     ++__erased;
00356   }
00357   fill(_M_buckets.begin() + __f_bucket, _M_buckets.begin() + __l_bucket + 1, __cur._M_node);
00358   _M_num_elements -= __erased;
00359   _M_reduce();
00360 }
00361 
00362 template <class _Val, class _Key, class _HF,
00363           class _Traits, class _ExK, class _EqK, class _All>
00364 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00365   ::rehash(size_type __num_buckets_hint) {
00366   if (bucket_count() >= __num_buckets_hint) {
00367     // We are trying to reduce number of buckets, we have to validate it:
00368     size_type __limit_num_buckets = (size_type)((float)size() / max_load_factor());
00369     if (__num_buckets_hint < __limit_num_buckets) {
00370       // Targetted number of buckets __num_buckets_hint would break
00371       // load_factor() <= max_load_factor() rule.
00372       return;
00373     }
00374   }
00375 
00376   _M_rehash(__num_buckets_hint);
00377 }
00378 
00379 template <class _Val, class _Key, class _HF,
00380           class _Traits, class _ExK, class _EqK, class _All>
00381 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00382   ::_M_enlarge(size_type __to_size) {
00383   size_type __num_buckets = bucket_count();
00384   size_type __num_buckets_hint = (size_type)((float)__to_size / max_load_factor());
00385   if (__num_buckets_hint <= __num_buckets) {
00386     return;
00387   }
00388   __num_buckets = _STLP_PRIV _Stl_prime_type::_S_next_size(__num_buckets_hint);
00389 
00390   _M_rehash(__num_buckets);
00391 }
00392 
00393 template <class _Val, class _Key, class _HF,
00394           class _Traits, class _ExK, class _EqK, class _All>
00395 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00396   ::_M_reduce() {
00397   size_type __num_buckets = bucket_count();
00398   // We only try to reduce the hashtable if the theorical load factor
00399   // is lower than a fraction of the max load factor:
00400   // 4 factor is coming from the fact that prime number list is almost a
00401   // geometrical suite with reason 2, as we try to jump 2 levels is means
00402   // a 4 factor.
00403   if ((float)size() / (float)__num_buckets > max_load_factor() / 4.0f)
00404     return;
00405 
00406   const size_type *__first;
00407   const size_type *__prev;
00408   _STLP_PRIV _Stl_prime_type::_S_prev_sizes(__num_buckets, __first, __prev);
00409 
00410   /* We are only going to reduce number of buckets if moving to yet the previous number
00411    * of buckets in the prime numbers would respect the load rule. Otherwise algorithm
00412    * successively removing and adding an element would each time perform an expensive
00413    * rehash operation. */
00414   const size_type *__prev_prev = __prev;
00415   if (__prev_prev != __first) {
00416     --__prev_prev;
00417     if ((float)size() / (float)*__prev_prev > max_load_factor())
00418       return;
00419   }
00420   else {
00421     if (*__prev >= __num_buckets)
00422       return;
00423   }
00424 
00425   // Can we reduce further:
00426   while (__prev_prev != __first) {
00427     --__prev_prev;
00428     if ((float)size() / (float)*__prev_prev > max_load_factor())
00429       // We cannot reduce further.
00430       break;
00431     --__prev;
00432   }
00433 
00434   _M_rehash(*__prev);
00435 }
00436 
00437 template <class _Val, class _Key, class _HF,
00438           class _Traits, class _ExK, class _EqK, class _All>
00439 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00440   ::_M_resize() {
00441   if (load_factor() > max_load_factor()) {
00442     // We have to enlarge
00443     _M_enlarge(size());
00444   }
00445   else {
00446     // We can try to reduce size:
00447     _M_reduce();
00448   }
00449 }
00450 
00451 template <class _Val, class _Key, class _HF,
00452           class _Traits, class _ExK, class _EqK, class _All>
00453 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00454   ::_M_rehash(size_type __num_buckets) {
00455 #if defined (_STLP_DEBUG)
00456   _M_check();
00457 #endif
00458   _ElemsCont __tmp_elems(_M_elems.get_allocator());
00459   _BucketVector __tmp(__num_buckets + 1, __STATIC_CAST(_BucketType*, 0), _M_buckets.get_allocator());
00460   _ElemsIte __cur, __last(_M_elems.end());
00461   while (!_M_elems.empty()) {
00462     __cur = _M_elems.begin();
00463     size_type __new_bucket = _M_bkt_num(*__cur, __num_buckets);
00464     _ElemsIte __ite(__cur), __before_ite(__cur);
00465     for (++__ite;
00466          __ite != __last && _M_equals(_M_get_key(*__cur), _M_get_key(*__ite));
00467          ++__ite, ++__before_ite);
00468     size_type __prev_bucket = __new_bucket;
00469     _ElemsIte  __prev = _S_before_begin(__tmp_elems, __tmp, __prev_bucket)._M_ite;
00470     __tmp_elems.splice_after(__prev, _M_elems, _M_elems.before_begin(), __before_ite);
00471     fill(__tmp.begin() + __prev_bucket, __tmp.begin() + __new_bucket + 1, __cur._M_node);
00472   }
00473   _M_elems.swap(__tmp_elems);
00474   _M_buckets.swap(__tmp);
00475 }
00476 
00477 #if defined (_STLP_DEBUG)
00478 template <class _Val, class _Key, class _HF,
00479           class _Traits, class _ExK, class _EqK, class _All>
00480 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::_M_check() const {
00481   //We check that hash code of stored keys haven't change and also that equivalent
00482   //relation hasn't been modified
00483   size_t __num_buckets = bucket_count();
00484   for (size_t __b = 0; __b < __num_buckets; ++__b) {
00485     _ElemsIte __cur(_M_buckets[__b]), __last(_M_buckets[__b + 1]);
00486     _ElemsIte __fst(__cur), __snd(__cur);
00487     for (; __cur != __last; ++__cur) {
00488       _STLP_ASSERT( _M_bkt_num(*__cur, __num_buckets) == __b )
00489       _STLP_ASSERT( !_M_equals(_M_get_key(*__fst), _M_get_key(*__cur)) || _M_equals(_M_get_key(*__snd), _M_get_key(*__cur)) )
00490       if (__fst != __snd)
00491         ++__fst;
00492       if (__snd != __cur)
00493         ++__snd;
00494     }
00495   }
00496 }
00497 #endif
00498 
00499 template <class _Val, class _Key, class _HF,
00500           class _Traits, class _ExK, class _EqK, class _All>
00501 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>::clear() {
00502   _M_elems.clear();
00503   _M_buckets.assign(_M_buckets.size(), __STATIC_CAST(_BucketType*, 0));
00504   _M_num_elements = 0;
00505 }
00506 
00507 template <class _Val, class _Key, class _HF,
00508           class _Traits, class _ExK, class _EqK, class _All>
00509 void hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>
00510   ::_M_copy_from(const hashtable<_Val,_Key,_HF,_Traits,_ExK,_EqK,_All>& __ht) {
00511   _M_elems.clear();
00512   _M_elems.insert(_M_elems.end(), __ht._M_elems.begin(), __ht._M_elems.end());
00513   _M_buckets.resize(__ht._M_buckets.size());
00514   _ElemsConstIte __src(__ht._M_elems.begin()), __src_end(__ht._M_elems.end());
00515   _ElemsIte __dst(_M_elems.begin());
00516   typename _BucketVector::const_iterator __src_b(__ht._M_buckets.begin()),
00517                                          __src_end_b(__ht._M_buckets.end());
00518   typename _BucketVector::iterator __dst_b(_M_buckets.begin()), __dst_end_b(_M_buckets.end());
00519   for (; __src != __src_end; ++__src, ++__dst) {
00520     for (; __src_b != __src_end_b; ++__src_b, ++__dst_b) {
00521       if (*__src_b == __src._M_node) {
00522         *__dst_b = __dst._M_node;
00523       }
00524       else
00525         break;
00526     }
00527   }
00528   fill(__dst_b, __dst_end_b, __STATIC_CAST(_BucketType*, 0));
00529   _M_num_elements = __ht._M_num_elements;
00530   _M_max_load_factor = __ht._M_max_load_factor;
00531 }
00532 
00533 #undef __iterator__
00534 #undef const_iterator
00535 #undef __size_type__
00536 #undef __reference__
00537 #undef size_type
00538 #undef value_type
00539 #undef key_type
00540 #undef __stl_num_primes
00541 
00542 #if defined (_STLP_DEBUG)
00543 #  undef hashtable
00544 _STLP_MOVE_TO_STD_NAMESPACE
00545 #endif
00546 
00547 _STLP_END_NAMESPACE
00548 
00549 #endif /*  _STLP_HASHTABLE_C */
00550 
00551 // Local Variables:
00552 // mode:C++
00553 // End:

Generated on Fri May 25 2012 04:27:36 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.