177 lines
3.1 KiB
C++
177 lines
3.1 KiB
C++
|
|
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
|
|
|
// File: strhash.hxx
|
|
|
|
// Contents: A hash table for strings
|
|
|
|
// History: 7-Nov-94 BruceFo Created
|
|
|
|
|
|
|
|
#ifndef __STRHASH_HXX__
|
|
#define __STRHASH_HXX__
|
|
|
|
|
|
#define HASH_DEFAULT_NUM_BUCKETS 47
|
|
|
|
|
|
// Forward definitions
|
|
|
|
class CStrHashBucketElem;
|
|
class CStrHashBucket;
|
|
class CStrHashTable;
|
|
|
|
|
|
// Class definitions
|
|
|
|
#define ITERATE_END ((DWORD)-1)
|
|
|
|
class CIterateData
|
|
{
|
|
friend class CStrHashTable;
|
|
|
|
public:
|
|
CIterateData(
|
|
VOID
|
|
)
|
|
:
|
|
m_pCurrentElem(NULL),
|
|
m_CurrentBucket(0)
|
|
{
|
|
}
|
|
|
|
private:
|
|
CStrHashBucketElem* m_pCurrentElem;
|
|
DWORD m_CurrentBucket;
|
|
};
|
|
|
|
|
|
|
|
class CStrHashBucketElem
|
|
{
|
|
DECLARE_SIG;
|
|
|
|
friend class CStrHashBucket;
|
|
friend class CStrHashTable;
|
|
|
|
public:
|
|
|
|
CStrHashBucketElem(
|
|
IN const WCHAR* pszKey
|
|
);
|
|
|
|
~CStrHashBucketElem();
|
|
|
|
BOOL
|
|
IsEqual(
|
|
IN const WCHAR* pszKey
|
|
);
|
|
|
|
#if DBG == 1
|
|
VOID Print()
|
|
{
|
|
appAssert(NULL != m_pszKey);
|
|
appDebugOut((DEB_TRACE,"%ws\n", m_pszKey));
|
|
}
|
|
#endif DBG == 1
|
|
|
|
private:
|
|
|
|
CStrHashBucketElem* m_next;
|
|
const WCHAR* m_pszKey;
|
|
};
|
|
|
|
|
|
|
|
class CStrHashBucket
|
|
{
|
|
DECLARE_SIG;
|
|
|
|
friend class CStrHashTable;
|
|
|
|
public:
|
|
|
|
CStrHashBucket(VOID);
|
|
|
|
~CStrHashBucket();
|
|
|
|
HRESULT Insert(IN const WCHAR* pszKey);
|
|
BOOL Remove(IN const WCHAR* pszKey);
|
|
BOOL IsMember(IN const WCHAR* pszKey);
|
|
|
|
#if DBG == 1
|
|
VOID Print()
|
|
{
|
|
for (CStrHashBucketElem* x = m_head; NULL != x; x = x->m_next)
|
|
{
|
|
x->Print();
|
|
}
|
|
}
|
|
#endif DBG == 1
|
|
|
|
private:
|
|
CStrHashBucketElem* m_head;
|
|
};
|
|
|
|
|
|
|
|
class CStrHashTable
|
|
{
|
|
DECLARE_SIG;
|
|
|
|
public:
|
|
CStrHashTable(IN DWORD cNumBuckets = HASH_DEFAULT_NUM_BUCKETS);
|
|
|
|
// Returns the status of the object after construction: S_OK or an error
|
|
// code.
|
|
HRESULT QueryError(VOID);
|
|
|
|
~CStrHashTable();
|
|
|
|
// Three basic operations: insert, remove, and check membership. The
|
|
// strings may not be NULL.
|
|
|
|
HRESULT Insert(IN const WCHAR* pszKey);
|
|
HRESULT Remove(IN const WCHAR* pszKey);
|
|
BOOL IsMember(IN const WCHAR* pszKey);
|
|
DWORD Count(VOID);
|
|
|
|
// Iteration routines
|
|
|
|
CIterateData* IterateStart(VOID);
|
|
VOID IterateGetNext(IN OUT CIterateData* pCurrent);
|
|
VOID IterateEnd(IN CIterateData* pCurrent);
|
|
BOOL IterateDone(IN CIterateData* pCurrent);
|
|
const WCHAR* IterateGetData(IN OUT CIterateData* pCurrent);
|
|
|
|
#if DBG == 1
|
|
VOID Print()
|
|
{
|
|
appAssert(NULL != m_ht);
|
|
|
|
for (DWORD i = 0; i < m_cNumBuckets; i++)
|
|
{
|
|
appDebugOut((DEB_TRACE,"======== bucket %d\n",i));
|
|
m_ht[i].Print();
|
|
}
|
|
}
|
|
#endif DBG == 1
|
|
|
|
private:
|
|
|
|
VOID IterateGetBucket(IN OUT CIterateData* pCurrent);
|
|
DWORD HashFunction(IN const WCHAR* pszKey);
|
|
HRESULT CheckRehash(VOID);
|
|
HRESULT Rehash(IN DWORD cNumBuckets);
|
|
|
|
CStrHashBucket* m_ht;
|
|
DWORD m_cMinNumBuckets;
|
|
DWORD m_cNumBuckets;
|
|
DWORD m_cElems;
|
|
};
|
|
|
|
#endif // __STRHASH_HXX__
|