#ifndef STORM_HASH_TS_HASH_TABLE_REUSE_HPP #define STORM_HASH_TS_HASH_TABLE_REUSE_HPP #include "storm/hash/TSHashObjectChunk.hpp" #include "storm/hash/TSHashTable.hpp" #include "storm/Error.hpp" #include "storm/List.hpp" #include #include template class TSHashTableReuse : public TSHashTable { public: // Virtual member functions virtual ~TSHashTableReuse(); virtual void Destroy(); private: using object_chunk_t = TSHashObjectChunk; // Member variables STORM_EXPLICIT_LIST(T, m_linktoslot) m_reuseList; uint32_t m_chunkSize = 16; STORM_EXPLICIT_LIST(object_chunk_t, m_link) m_chunkList; // Virtual member functions virtual void InternalDelete(T* ptr); virtual T* InternalNew(STORM_EXPLICIT_LIST(T, m_linktoslot)* listptr, size_t extrabytes, uint32_t flags); // Member functions void Destructor(); }; template TSHashTableReuse::~TSHashTableReuse() { this->Destructor(); } template void TSHashTableReuse::Destroy() { this->Clear(); this->Destructor(); } template void TSHashTableReuse::Destructor() { this->m_chunkList.Clear(); this->m_reuseList.Clear(); this->m_chunkSize = 16; } template void TSHashTableReuse::InternalDelete(T* ptr) { this->m_fulllist.UnlinkNode(ptr); this->m_reuseList.LinkNode(ptr, 1, nullptr); } template T* TSHashTableReuse::InternalNew(STORM_EXPLICIT_LIST(T, m_linktoslot)* listptr, size_t extrabytes, uint32_t flags) { STORM_ASSERT(!extrabytes); auto node = this->m_reuseList.Head(); if (!node) { object_chunk_t* chunk; while (true) { chunk = this->m_chunkList.Head(); if (chunk && chunk->m_array.Reserved()) { break; } chunk = this->m_chunkList.NewNode(1, 0, 0x0); chunk->m_array.Reserve(this->m_chunkSize, 0); } node = chunk->m_array.New(); } listptr->LinkNode(node, 1, nullptr); return node; } #endif