/* * C R C S Z . H * * CRC Implementation * * Copyright 1986-1997 Microsoft Corporation, All Rights Reserved */ #ifndef _CRCSZ_H_ #define _CRCSZ_H_ // Case Sensitive CRC'd string classes --------------------------------------- // // Encapsulation of a CRC'ed string. Use this class as the key type for // your cache class where a string key is called for. The benefit is // increased cache search performance because a full string compare // is done only when the CRCs match (which typically happens only // for the string you're looking for). // class CRCSz { public: DWORD m_dwCRC; LPCSTR m_lpsz; CRCSz(LPCSTR psz) : m_lpsz(psz), m_dwCRC(DwComputeCRC(0, const_cast(psz), static_cast(strlen(psz)))) { } // operators for use with the hash cache // int hash( const int rhs ) const { return (m_dwCRC % rhs); } bool isequal( const CRCSz& rhs ) const { return ((m_dwCRC == rhs.m_dwCRC) && !strcmp( m_lpsz, rhs.m_lpsz )); } }; class CRCWszN { public: UINT m_cch; DWORD m_dwCRC; LPCWSTR m_pwsz; CRCWszN(LPCWSTR pwsz, UINT cch) : m_cch(cch), m_pwsz(pwsz), m_dwCRC(DwComputeCRC (0, const_cast(pwsz), cch * sizeof(WCHAR))) { } // operators for use with the hash cache // int hash( const int rhs ) const { return (m_dwCRC % rhs); } bool isequal( const CRCWszN& rhs ) const { return ((m_cch == rhs.m_cch) && (m_dwCRC == rhs.m_dwCRC) && !wcsncmp( m_pwsz, rhs.m_pwsz, m_cch )); } }; class CRCWsz : public CRCWszN { // Not Implemented // CRCWsz(); public: CRCWsz(LPCWSTR pwsz) : CRCWszN(pwsz, static_cast(wcslen(pwsz))) { } CRCWsz( const CRCWszN& rhs ) : CRCWszN (rhs) { } }; // Case Insensitive CRC'd string classes ------------------------------------- // // Encapsulation of a CRC'ed string. Use this class as the key type for // your cache class where a string key is called for. The benefit is // increased cache search performance because a full string compare // is done only when the CRCs match (which typically happens only // for the string you're looking for). // class CRCSzi { public: DWORD m_dwCRC; LPCSTR m_lpsz; CRCSzi( LPCSTR lpsz ) : m_lpsz(lpsz) { UINT cch = static_cast(strlen(lpsz)); CHAR lpszLower[128]; // Note that the CRC only is taken from the first 127 characters. // cch = (UINT)min(cch, sizeof(lpszLower) - 1); CopyMemory(lpszLower, lpsz, cch); lpszLower[cch] = 0; _strlwr(lpszLower); m_dwCRC = DwComputeCRC (0, const_cast(lpszLower), cch); } // operators for use with the hash cache // int hash( const int rhs ) const { return (m_dwCRC % rhs); } bool isequal( const CRCSzi& rhs ) const { return ((m_dwCRC == rhs.m_dwCRC) && !lstrcmpiA( m_lpsz, rhs.m_lpsz )); } }; class CRCWsziN { public: UINT m_cch; DWORD m_dwCRC; LPCWSTR m_pwsz; CRCWsziN() : m_cch(0), m_dwCRC(0), m_pwsz(NULL) {} CRCWsziN(LPCWSTR pwsz, UINT cch) : m_cch(cch), m_pwsz(pwsz) { // Note that the CRC only is taken from the first 127 characters. // WCHAR pwszLower[128]; UINT cb = sizeof(WCHAR) * min(cch, (sizeof(pwszLower)/sizeof(WCHAR)) - 1); CopyMemory(pwszLower, pwsz, cb); pwszLower[cb / sizeof(WCHAR)] = L'\0'; _wcslwr(pwszLower); m_dwCRC = DwComputeCRC (0, const_cast(pwszLower), cb); } // operators for use with the hash cache // int hash( const int rhs ) const { return (m_dwCRC % rhs); } bool isequal( const CRCWsziN& rhs ) const { return ((m_cch == rhs.m_cch) && (m_dwCRC == rhs.m_dwCRC) && !_wcsnicmp( m_pwsz, rhs.m_pwsz, m_cch )); } }; class CRCWszi : public CRCWsziN { public: CRCWszi() {} CRCWszi( LPCWSTR pwsz ) : CRCWsziN (pwsz, static_cast(wcslen(pwsz))) { } // operators for use with list::sort // bool operator<( const CRCWszi& rhs ) const { INT lret = 1; if (m_dwCRC < rhs.m_dwCRC) return true; if (m_dwCRC == rhs.m_dwCRC) { lret = _wcsnicmp(m_pwsz, rhs.m_pwsz, min(m_cch, rhs.m_cch)); } return (lret ? (lret < 0) : (m_cch < rhs.m_cch)); } // operators for use with list::unique // bool operator==( const CRCWszi& rhs ) const { return isequal(rhs); } }; class CRCWsziLI : public CRCWszi { public: LARGE_INTEGER m_li; bool m_fFullCompare; CRCWsziLI( LPCWSTR pwsz, LARGE_INTEGER li, bool fFullCompare ) : CRCWszi (pwsz), m_li(li), m_fFullCompare(fFullCompare) { } bool isequal( const CRCWsziLI& rhs ) const { bool fIsEqual; fIsEqual = CRCWszi::isequal(rhs); if (fIsEqual) { if (m_fFullCompare) { fIsEqual = (m_li.QuadPart == rhs.m_li.QuadPart); } } return fIsEqual; } }; #endif // _CRCSZ_H_