diff --git a/storm/hash/TSHashTable.hpp b/storm/hash/TSHashTable.hpp index 556d9e7..add2a89 100644 --- a/storm/hash/TSHashTable.hpp +++ b/storm/hash/TSHashTable.hpp @@ -25,8 +25,8 @@ class TSHashTable { void Initialize(void); bool Initialized(void); void Insert(T*, uint32_t, const TKey&); - void InternalClear(int32_t); - void InternalDelete(T*); + void InternalClear(int32_t warn); + void InternalDelete(T* ptr); void InternalLinkNode(T*, uint32_t); T* InternalNew(STORM_EXPLICIT_LIST(T, m_linktoslot)*, size_t, size_t); T* InternalNewNode(uint32_t, size_t, size_t); @@ -94,16 +94,30 @@ void TSHashTable::Insert(T* ptr, uint32_t hashval, const TKey& key) { } template -void TSHashTable::InternalClear(int32_t a2) { +void TSHashTable::InternalClear(int32_t warn) { + this->m_fullnessIndicator = 0; + this->m_fulllist.UnlinkAll(); - uint32_t slotlistCount = this->m_slotlistarray.Count(); + for (int32_t i = 0; i < this->m_slotlistarray.Count(); i++) { + auto& slotList = this->m_slotlistarray[i]; - if (slotlistCount) { - // TODO + for (auto node = slotList.Head(); node; node = slotList.Link(node)->Next()) { + if (warn) { + slotList.UnlinkNode(node); + } else { + this->InternalDelete(node); + } + } } } +template +void TSHashTable::InternalDelete(T* ptr) { + ptr->~T(); + SMemFree(ptr, __FILE__, __LINE__, 0x0); +} + template void TSHashTable::InternalLinkNode(T* ptr, uint32_t hashval) { if (!this->Initialized()) { diff --git a/test/Hash.cpp b/test/Hash.cpp index c421742..493df76 100644 --- a/test/Hash.cpp +++ b/test/Hash.cpp @@ -11,3 +11,18 @@ TEST_CASE("TSHashTable", "[hash]") { REQUIRE(hashTable.Head() == nullptr); } } + +TEST_CASE("TSHashTable::Clear", "[hash]") { + SECTION("clears empty hash table correctly") { + TSHashTable hashTable; + hashTable.Clear(); + REQUIRE(hashTable.Head() == nullptr); + } + + SECTION("clears hash table with entry correctly") { + TSHashTable hashTable; + hashTable.New("testKey", 0, 0x0); + hashTable.Clear(); + REQUIRE(hashTable.Head() == nullptr); + } +}