tge/engine/console/simDictionary.cc
2025-02-17 23:17:30 -06:00

301 lines
7.1 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "console/simDictionary.h"
#include "console/simBase.h"
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
extern S32 HashPointer(StringTableEntry e);
SimNameDictionary::SimNameDictionary()
{
hashTable = NULL;
mutex = Mutex::createMutex();
}
SimNameDictionary::~SimNameDictionary()
{
delete[] hashTable;
Mutex::destroyMutex(mutex);
}
void SimNameDictionary::insert(SimObject* obj)
{
if(!obj->objectName)
return;
Mutex::lockMutex(mutex);
if(!hashTable)
{
hashTable = new SimObject *[DefaultTableSize];
hashTableSize = DefaultTableSize;
hashEntryCount = 0;
S32 i;
for(i = 0; i < hashTableSize; i++)
hashTable[i] = NULL;
}
S32 idx = HashPointer(obj->objectName) % hashTableSize;
obj->nextNameObject = hashTable[idx];
hashTable[idx] = obj;
hashEntryCount++;
if(hashEntryCount > hashTableSize)
{
// resize the hash table
S32 i;
SimObject *head = NULL, *walk, *temp;
for(i = 0; i < hashTableSize; i++) {
walk = hashTable[i];
while(walk)
{
temp = walk->nextNameObject;
walk->nextNameObject = head;
head = walk;
walk = temp;
}
}
delete[] hashTable;
hashTableSize = hashTableSize * 2 + 1;
hashTable = new SimObject *[hashTableSize];
for(i = 0; i < hashTableSize;i++)
hashTable[i] = NULL;
while(head)
{
temp = head->nextNameObject;
idx = HashPointer(head->objectName) % hashTableSize;
head->nextNameObject = hashTable[idx];
hashTable[idx] = head;
head = temp;
}
}
Mutex::unlockMutex(mutex);
}
SimObject* SimNameDictionary::find(StringTableEntry name)
{
// NULL is a valid lookup - it will always return NULL
if(!hashTable)
return NULL;
Mutex::lockMutex(mutex);
S32 idx = HashPointer(name) % hashTableSize;
SimObject *walk = hashTable[idx];
while(walk)
{
if(walk->objectName == name)
{
Mutex::unlockMutex(mutex);
return walk;
}
walk = walk->nextNameObject;
}
Mutex::unlockMutex(mutex);
return NULL;
}
void SimNameDictionary::remove(SimObject* obj)
{
if(!obj->objectName)
return;
Mutex::lockMutex(mutex);
SimObject **walk = &hashTable[HashPointer(obj->objectName) % hashTableSize];
while(*walk)
{
if(*walk == obj)
{
*walk = obj->nextNameObject;
obj->nextNameObject = (SimObject*)-1;
hashEntryCount--;
Mutex::unlockMutex(mutex);
return;
}
walk = &((*walk)->nextNameObject);
}
Mutex::unlockMutex(mutex);
}
//----------------------------------------------------------------------------
SimManagerNameDictionary::SimManagerNameDictionary()
{
hashTable = new SimObject *[DefaultTableSize];
hashTableSize = DefaultTableSize;
hashEntryCount = 0;
S32 i;
for(i = 0; i < hashTableSize; i++)
hashTable[i] = NULL;
mutex = Mutex::createMutex();
}
SimManagerNameDictionary::~SimManagerNameDictionary()
{
delete[] hashTable;
Mutex::destroyMutex(mutex);
}
void SimManagerNameDictionary::insert(SimObject* obj)
{
if(!obj->objectName)
return;
Mutex::lockMutex(mutex);
S32 idx = HashPointer(obj->objectName) % hashTableSize;
obj->nextManagerNameObject = hashTable[idx];
hashTable[idx] = obj;
hashEntryCount++;
if(hashEntryCount > hashTableSize)
{
// resize the hash table
S32 i;
SimObject *head = NULL, *walk, *temp;
for(i = 0; i < hashTableSize; i++) {
walk = hashTable[i];
while(walk)
{
temp = walk->nextManagerNameObject;
walk->nextManagerNameObject = head;
head = walk;
walk = temp;
}
}
delete[] hashTable;
hashTableSize = hashTableSize * 2 + 1;
hashTable = new SimObject *[hashTableSize];
for(i = 0; i < hashTableSize;i++)
hashTable[i] = NULL;
while(head)
{
temp = head->nextManagerNameObject;
idx = HashPointer(head->objectName) % hashTableSize;
head->nextManagerNameObject = hashTable[idx];
hashTable[idx] = head;
head = temp;
}
}
Mutex::unlockMutex(mutex);
}
SimObject* SimManagerNameDictionary::find(StringTableEntry name)
{
// NULL is a valid lookup - it will always return NULL
Mutex::lockMutex(mutex);
S32 idx = HashPointer(name) % hashTableSize;
SimObject *walk = hashTable[idx];
while(walk)
{
if(walk->objectName == name)
{
Mutex::unlockMutex(mutex);
return walk;
}
walk = walk->nextManagerNameObject;
}
Mutex::unlockMutex(mutex);
return NULL;
}
void SimManagerNameDictionary::remove(SimObject* obj)
{
if(!obj->objectName)
return;
Mutex::lockMutex(mutex);
SimObject **walk = &hashTable[HashPointer(obj->objectName) % hashTableSize];
while(*walk)
{
if(*walk == obj)
{
*walk = obj->nextManagerNameObject;
obj->nextManagerNameObject = (SimObject*)-1;
hashEntryCount--;
Mutex::unlockMutex(mutex);
return;
}
walk = &((*walk)->nextManagerNameObject);
}
Mutex::unlockMutex(mutex);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
SimIdDictionary::SimIdDictionary()
{
for(S32 i = 0; i < DefaultTableSize; i++)
table[i] = NULL;
mutex = Mutex::createMutex();
}
SimIdDictionary::~SimIdDictionary()
{
Mutex::destroyMutex(mutex);
}
void SimIdDictionary::insert(SimObject* obj)
{
Mutex::lockMutex(mutex);
S32 idx = obj->getId() & TableBitMask;
obj->nextIdObject = table[idx];
table[idx] = obj;
Mutex::unlockMutex(mutex);
}
SimObject* SimIdDictionary::find(S32 id)
{
Mutex::lockMutex(mutex);
S32 idx = id & TableBitMask;
SimObject *walk = table[idx];
while(walk)
{
if(walk->getId() == U32(id))
{
Mutex::unlockMutex(mutex);
return walk;
}
walk = walk->nextIdObject;
}
Mutex::unlockMutex(mutex);
return NULL;
}
void SimIdDictionary::remove(SimObject* obj)
{
Mutex::lockMutex(mutex);
SimObject **walk = &table[obj->getId() & TableBitMask];
while(*walk && *walk != obj)
walk = &((*walk)->nextIdObject);
if(*walk)
*walk = obj->nextIdObject;
Mutex::unlockMutex(mutex);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------