Home | Info | Community | Development | myReactOS | Contact Us
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
1.7.6.1
|