Changeset 32609 in webkit for trunk/JavaScriptCore/wtf/HashTable.h
- Timestamp:
- Apr 27, 2008, 10:59:07 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/HashTable.h
r27711 r32609 1 1 // -*- mode: c++; c-basic-offset: 4 -*- 2 2 /* 3 * This file is part of the KDE libraries 4 * Copyright (C) 2005, 2006 Apple Computer, Inc. 3 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 5 4 * 6 5 * This library is free software; you can redistribute it and/or … … 326 325 327 326 static bool isEmptyBucket(const ValueType& value) { return Extractor::extract(value) == KeyTraits::emptyValue(); } 328 static bool isDeletedBucket(const ValueType& value) { return Extractor::extract(value) == KeyTraits::deletedValue(); }327 static bool isDeletedBucket(const ValueType& value) { return KeyTraits::isDeletedValue(Extractor::extract(value)); } 329 328 static bool isEmptyOrDeletedBucket(const ValueType& value) { return isEmptyBucket(value) || isDeletedBucket(value); } 330 329 331 330 ValueType* lookup(const Key& key) { return lookup<Key, IdentityTranslatorType>(key); } 331 template<typename T, typename HashTranslator> ValueType* lookup(const T&); 332 332 333 333 #if CHECK_HASHTABLE_CONSISTENCY … … 344 344 typedef pair<LookupType, unsigned> FullLookupType; 345 345 346 template<typename T, typename HashTranslator> ValueType* lookup(const T&);347 346 LookupType lookupForWriting(const Key& key) { return lookupForWriting<Key, IdentityTranslatorType>(key); }; 348 347 template<typename T, typename HashTranslator> FullLookupType fullLookupForWriting(const T&); 349 348 template<typename T, typename HashTranslator> LookupType lookupForWriting(const T&); 349 350 template<typename T, typename HashTranslator> void checkKey(const T&); 350 351 351 352 void removeAndInvalidateWithoutEntryConsistencyCheck(ValueType*); … … 363 364 364 365 static void initializeBucket(ValueType& bucket) { new (&bucket) ValueType(Traits::emptyValue()); } 365 static void deleteBucket(ValueType& bucket) { assignDeleted<ValueType, Traits>(bucket); }366 static void deleteBucket(ValueType& bucket) { bucket.~ValueType(); Traits::constructDeletedValue(&bucket); } 366 367 367 368 FullLookupType makeLookupResult(ValueType* position, bool found, unsigned hash) … … 424 425 } 425 426 427 #if ASSERT_DISABLED 428 429 template<typename Key, typename Value, typename Extractor, typename HashFunctions, typename Traits, typename KeyTraits> 430 template<typename T, typename HashTranslator> 431 inline void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::checkKey(const T&) 432 { 433 } 434 435 #else 436 437 template<typename Key, typename Value, typename Extractor, typename HashFunctions, typename Traits, typename KeyTraits> 438 template<typename T, typename HashTranslator> 439 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::checkKey(const T& key) 440 { 441 if (!HashFunctions::safeToCompareToEmptyOrDeleted) 442 return; 443 ASSERT(!HashTranslator::equal(KeyTraits::emptyValue(), key)); 444 ValueType deletedValue = Traits::emptyValue(); 445 Traits::constructDeletedValue(&deletedValue); 446 ASSERT(!HashTranslator::equal(Extractor::extract(deletedValue), key)); 447 new (&deletedValue) ValueType(Traits::emptyValue()); 448 } 449 450 #endif 451 426 452 template<typename Key, typename Value, typename Extractor, typename HashFunctions, typename Traits, typename KeyTraits> 427 453 template<typename T, typename HashTranslator> 428 454 inline Value* HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::lookup(const T& key) 429 455 { 430 ASSERT(m_table); 431 #if !ASSERT_DISABLED 432 if (HashFunctions::safeToCompareToEmptyOrDeleted) { 433 ASSERT(!HashTranslator::equal(KeyTraits::emptyValue(), key)); 434 ASSERT(!HashTranslator::equal(KeyTraits::deletedValue(), key)); 435 } 436 #endif 456 checkKey<T, HashTranslator>(key); 437 457 438 458 int k = 0; … … 441 461 unsigned h = HashTranslator::hash(key); 442 462 int i = h & sizeMask; 463 464 if (!table) 465 return 0; 443 466 444 467 #if DUMP_HASHTABLE_STATS … … 479 502 { 480 503 ASSERT(m_table); 481 #if !ASSERT_DISABLED 482 if (HashFunctions::safeToCompareToEmptyOrDeleted) { 483 ASSERT(!HashTranslator::equal(KeyTraits::emptyValue(), key)); 484 ASSERT(!HashTranslator::equal(KeyTraits::deletedValue(), key)); 485 } 486 #endif 504 checkKey<T, HashTranslator>(key); 487 505 488 506 int k = 0; … … 536 554 { 537 555 ASSERT(m_table); 538 #if !ASSERT_DISABLED 539 if (HashFunctions::safeToCompareToEmptyOrDeleted) { 540 ASSERT(!HashTranslator::equal(KeyTraits::emptyValue(), key)); 541 ASSERT(!HashTranslator::equal(KeyTraits::deletedValue(), key)); 542 } 543 #endif 556 checkKey<T, HashTranslator>(key); 544 557 545 558 int k = 0; … … 592 605 inline pair<typename HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::iterator, bool> HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::add(const T& key, const Extra& extra) 593 606 { 594 #if !ASSERT_DISABLED 595 if (HashFunctions::safeToCompareToEmptyOrDeleted) { 596 ASSERT(!HashTranslator::equal(KeyTraits::emptyValue(), key)); 597 ASSERT(!HashTranslator::equal(KeyTraits::deletedValue(), key)); 598 } 599 #endif 607 checkKey<T, HashTranslator>(key); 600 608 601 609 invalidateIterators(); … … 653 661 654 662 if (deletedEntry) { 663 initializeBucket(*deletedEntry); 655 664 entry = deletedEntry; 656 665 --m_deletedCount; … … 679 688 inline pair<typename HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::iterator, bool> HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::addPassingHashCode(const T& key, const Extra& extra) 680 689 { 690 checkKey<T, HashTranslator>(key); 691 681 692 invalidateIterators(); 682 693 … … 695 706 return std::make_pair(makeKnownGoodIterator(entry), false); 696 707 697 if (isDeletedBucket(*entry)) 708 if (isDeletedBucket(*entry)) { 709 initializeBucket(*entry); 698 710 --m_deletedCount; 711 } 699 712 700 713 HashTranslator::translate(*entry, key, extra, h); … … 837 850 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::deallocateTable(ValueType *table, int size) 838 851 { 839 if (Traits::needsDestruction) 840 for (int i = 0; i < size; ++i) 841 table[i].~ValueType(); 852 if (Traits::needsDestruction) { 853 for (int i = 0; i < size; ++i) { 854 if (!isDeletedBucket(table[i])) 855 table[i].~ValueType(); 856 } 857 } 842 858 fastFree(table); 843 859 }
Note:
See TracChangeset
for help on using the changeset viewer.