125 lines
3.3 KiB
C++
125 lines
3.3 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Abstract: Definition of Template CHashTable32<> and class CHashTable32PVOID.
|
|
//
|
|
// NOTE: The keys 0 and ~0 are both reserved for internal use.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
//////////////////////////////////////////////////////////////// Base Classes.
|
|
//
|
|
class CHashTable32PVOID
|
|
{
|
|
public:
|
|
CHashTable32PVOID();
|
|
CHashTable32PVOID(INT nInitialSize);
|
|
~CHashTable32PVOID();
|
|
|
|
BOOL Insert(UINT32 key, PVOID value);
|
|
BOOL Change(UINT32 key, PVOID value);
|
|
BOOL Delete(UINT32 key);
|
|
|
|
PVOID Find(UINT32 key);
|
|
PVOID Enumerate(UINT32& key, INT& nIterator);
|
|
|
|
INT Count(void) { return m_nValid; }
|
|
|
|
protected:
|
|
struct Entry
|
|
{
|
|
UINT32 key;
|
|
PVOID value;
|
|
};
|
|
|
|
INT Offset(UINT32 key) { return (INT)((key*1000000007L)%m_nSize); }
|
|
VOID Swap(Entry& a, Entry& b) { Entry t = a; a = b; b = t; }
|
|
BOOL Resize(INT nNewSize);
|
|
Entry * FindEntry(UINT32 key);
|
|
|
|
protected:
|
|
Entry * m_pTable;
|
|
INT m_nSize;
|
|
INT m_nValid;
|
|
};
|
|
|
|
class CHashTable64PVOID
|
|
{
|
|
public:
|
|
CHashTable64PVOID();
|
|
CHashTable64PVOID(INT nInitialSize);
|
|
~CHashTable64PVOID();
|
|
|
|
BOOL Insert(UINT64 key, PVOID value);
|
|
BOOL Change(UINT64 key, PVOID value);
|
|
BOOL Delete(UINT64 key);
|
|
|
|
PVOID Find(UINT64 key);
|
|
PVOID Enumerate(UINT64& key, INT& nIterator);
|
|
|
|
INT Count(void) { return m_nValid; }
|
|
|
|
protected:
|
|
struct Entry
|
|
{
|
|
UINT64 key;
|
|
PVOID value;
|
|
};
|
|
|
|
INT Offset(UINT64 key) { return (INT)((key*1000000007UL)%m_nSize); }
|
|
VOID Swap(Entry& a, Entry& b) { Entry t = a; a = b; b = t; }
|
|
BOOL Resize(INT nNewSize);
|
|
Entry * FindEntry(UINT64 key);
|
|
|
|
protected:
|
|
Entry * m_pTable;
|
|
INT m_nSize;
|
|
INT m_nValid;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////// Templates.
|
|
//
|
|
template<class T> class CHashTable32 : public CHashTable32PVOID
|
|
{
|
|
public:
|
|
CHashTable32()
|
|
: CHashTable32PVOID() {}
|
|
CHashTable32(INT nInitialSize)
|
|
: CHashTable32PVOID(nInitializeSize) {}
|
|
|
|
BOOL Insert(UINT32 key, T value)
|
|
{ return CHashTable32PVOID::Insert(key, (PVOID)value); }
|
|
|
|
BOOL Change(UINT32 key, T value)
|
|
{ return CHashTable32PVOID::Change(key, (PVOID)value); }
|
|
|
|
T Find(UINT32 key)
|
|
{ return (T)CHashTable32PVOID::Find(key); }
|
|
|
|
T Enumerate(UINT32& key, INT& nIterator)
|
|
{ return (T)CHashTable32PVOID::Enumerate(key, nIterator); }
|
|
};
|
|
|
|
template<class T> class CHashTable64 : public CHashTable64PVOID
|
|
{
|
|
public:
|
|
CHashTable64()
|
|
: CHashTable64PVOID() {}
|
|
CHashTable64(INT nInitialSize)
|
|
: CHashTable64PVOID(nInitializeSize) {}
|
|
|
|
BOOL Insert(UINT64 key, T value)
|
|
{ return CHashTable64PVOID::Insert(key, (PVOID)value); }
|
|
|
|
BOOL Change(UINT64 key, T value)
|
|
{ return CHashTable64PVOID::Change(key, (PVOID)value); }
|
|
|
|
T Find(UINT64 key)
|
|
{ return (T)CHashTable64PVOID::Find(key); }
|
|
|
|
T Enumerate(UINT64& key, INT& nIterator)
|
|
{ return (T)CHashTable64PVOID::Enumerate(key, nIterator); }
|
|
};
|
|
//
|
|
///////////////////////////////////////////////////////////////// End of File.
|