246 lines
4.1 KiB
C++
246 lines
4.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__
|