#ifndef __CASC_INDEX_MAP_H__
#define __CASC_INDEX_MAP_H__
class CASC_INDEX_MAP
{
public:
int Create(size_t MaxItems, size_t ObjectLength_, size_t KeyLength_, size_t KeyOffset_)
{
DWORD IndexBitSize = 8;
if(MaxItems >= 0x10000)
IndexBitSize = 16;
if(MaxItems >= 0x100000)
IndexBitSize = 20;
IndexTableSize = (1 << IndexBitSize);
IndexTableMask = IndexTableSize - 1;
ObjectLength = ObjectLength_;
KeyOffset = KeyOffset_;
KeyLength = KeyLength_;
IndexTable = CASC_ALLOC(void *, IndexTableSize);
if(IndexTable != NULL)
{
memset(IndexTable, 0, IndexTableSize * sizeof(void *));
return ERROR_SUCCESS;
}
return ERROR_NOT_ENOUGH_MEMORY;
}
void * FindObject(void * pvKey)
{
LPBYTE StartObject;
DWORD StartIndex;
if(IndexTable != NULL)
{
StartIndex = KeyToIndex(pvKey);
StartObject = (LPBYTE)IndexTable[StartIndex];
if(StartObject == NULL)
return NULL;
do
{
if(!memcmp(StartObject + KeyOffset, pvKey, KeyLength))
return StartObject;
StartObject = StartObject + ObjectLength;
}
while(KeyToIndex(StartObject + KeyOffset) == StartIndex);
}
return NULL;
}
protected:
inline DWORD KeyToIndex(void * pvKey)
{
return *((PDWORD)pvKey) & IndexTableMask;
}
void ** IndexTable; size_t ObjectLength; size_t KeyOffset; size_t KeyLength; DWORD IndexTableSize; DWORD IndexTableMask; };
typedef CASC_INDEX_MAP *PCASC_INDEX_MAP;
bool IndexMap_InsertObject(PCASC_INDEX_MAP pIndexMap, void * pvNewObject, void * pvKey);
void IndexMap_Free(PCASC_INDEX_MAP pIndexMap);
#endif