Initial commit
This commit is contained in:
128
Torque/SDK/engine/core/resDictionary.cc
Normal file
128
Torque/SDK/engine/core/resDictionary.cc
Normal file
@@ -0,0 +1,128 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Torque Game Engine
|
||||
// Copyright (C) GarageGames.com, Inc.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "platform/platform.h"
|
||||
#include "core/resManager.h"
|
||||
#include "core/tAlgorithm.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
ResDictionary::ResDictionary()
|
||||
{
|
||||
entryCount = 0;
|
||||
hashTableSize = 1023; //DefaultTableSize;
|
||||
hashTable = new ResourceObject *[hashTableSize];
|
||||
S32 i;
|
||||
for(i = 0; i < hashTableSize; i++)
|
||||
hashTable[i] = NULL;
|
||||
}
|
||||
|
||||
ResDictionary::~ResDictionary()
|
||||
{
|
||||
// we assume the resources are purged before we destroy
|
||||
// the dictionary
|
||||
|
||||
delete[] hashTable;
|
||||
}
|
||||
|
||||
S32 ResDictionary::hash(StringTableEntry path, StringTableEntry file)
|
||||
{
|
||||
return ((S32)((((dsize_t)path) >> 2) + (((dsize_t)file) >> 2) )) % hashTableSize;
|
||||
}
|
||||
|
||||
void ResDictionary::insert(ResourceObject *obj, StringTableEntry path, StringTableEntry file)
|
||||
{
|
||||
obj->name = file;
|
||||
obj->path = path;
|
||||
|
||||
S32 idx = hash(path, file);
|
||||
obj->nextEntry = hashTable[idx];
|
||||
hashTable[idx] = obj;
|
||||
entryCount++;
|
||||
|
||||
if(entryCount > hashTableSize) {
|
||||
ResourceObject *head = NULL, *temp, *walk;
|
||||
for(idx = 0; idx < hashTableSize;idx++) {
|
||||
walk = hashTable[idx];
|
||||
while(walk)
|
||||
{
|
||||
temp = walk->nextEntry;
|
||||
walk->nextEntry = head;
|
||||
head = walk;
|
||||
walk = temp;
|
||||
}
|
||||
}
|
||||
delete[] hashTable;
|
||||
hashTableSize = 2 * hashTableSize - 1;
|
||||
hashTable = new ResourceObject *[hashTableSize];
|
||||
for(idx = 0; idx < hashTableSize; idx++)
|
||||
hashTable[idx] = NULL;
|
||||
walk = head;
|
||||
while(walk)
|
||||
{
|
||||
temp = walk->nextEntry;
|
||||
idx = hash(walk);
|
||||
walk->nextEntry = hashTable[idx];
|
||||
hashTable[idx] = walk;
|
||||
walk = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ResourceObject* ResDictionary::find(StringTableEntry path, StringTableEntry name)
|
||||
{
|
||||
for(ResourceObject *walk = hashTable[hash(path, name)]; walk; walk = walk->nextEntry)
|
||||
if(walk->name == name && walk->path == path)
|
||||
return walk;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ResourceObject* ResDictionary::find(StringTableEntry path, StringTableEntry name, StringTableEntry zipPath, StringTableEntry zipName)
|
||||
{
|
||||
for(ResourceObject *walk = hashTable[hash(path, name)]; walk; walk = walk->nextEntry)
|
||||
if(walk->name == name && walk->path == path && walk->zipName == zipName && walk->zipPath == zipPath)
|
||||
return walk;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ResourceObject* ResDictionary::find(StringTableEntry path, StringTableEntry name, U32 flags)
|
||||
{
|
||||
for(ResourceObject *walk = hashTable[hash(path, name)]; walk; walk = walk->nextEntry)
|
||||
if(walk->name == name && walk->path == path && U32(walk->flags) == flags)
|
||||
return walk;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ResDictionary::pushBehind(ResourceObject *resObj, S32 flagMask)
|
||||
{
|
||||
remove(resObj);
|
||||
entryCount++;
|
||||
ResourceObject **walk = &hashTable[hash(resObj)];
|
||||
for(; *walk; walk = &(*walk)->nextEntry)
|
||||
{
|
||||
if(!((*walk)->flags & flagMask))
|
||||
{
|
||||
resObj->nextEntry = *walk;
|
||||
*walk = resObj;
|
||||
return;
|
||||
}
|
||||
}
|
||||
resObj->nextEntry = NULL;
|
||||
*walk = resObj;
|
||||
}
|
||||
|
||||
void ResDictionary::remove(ResourceObject *resObj)
|
||||
{
|
||||
for(ResourceObject **walk = &hashTable[hash(resObj)]; *walk; walk = &(*walk)->nextEntry)
|
||||
{
|
||||
if(*walk == resObj)
|
||||
{
|
||||
entryCount--;
|
||||
*walk = resObj->nextEntry;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user