// 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__