Windows2000/private/windows/shell/lmui/ntshrui.new/strhash.hxx
2020-09-30 17:12:32 +02:00

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__