#ifndef _XN_STRINGS_HASH_T_H_ #define _XN_STRINGS_HASH_T_H_ //--------------------------------------------------------------------------- // Includes //--------------------------------------------------------------------------- #include "XnHashT.h" //--------------------------------------------------------------------------- // Code //--------------------------------------------------------------------------- class XnStringsHashKeyManager { public: static XnHashCode Hash(const XnChar* const& key) { XnUInt32 nCRC = 0; xnOSStrCRC32(key, &nCRC); // convert from UINT32 to XnHashValue return nCRC % (1 << (sizeof(XnHashCode)*8)); } static XnInt32 Compare(const XnChar* const& key1, const XnChar* const& key2) { return strcmp(key1, key2); } }; template class XnStringsNodeAllocator { public: typedef XnKeyValuePair TPair; typedef XnLinkedNodeT TLinkedNode; static TLinkedNode* Allocate(TPair const& pair) { XnChar* pKeyCopy = xnOSStrDup(pair.Key()); if (pKeyCopy == NULL) { return NULL; } return XN_NEW(TLinkedNode, TPair(pKeyCopy, pair.Value())); } static void Deallocate(TLinkedNode* pNode) { XN_ASSERT(pNode != NULL); XN_ASSERT(pNode->value.Key() != NULL); xnOSFree(pNode->value.Key()); XN_DELETE(pNode); } }; template class XnStringsHashT : public XnHashT > { typedef XnHashT > Base; public: XnStringsHashT() : Base() {} XnStringsHashT(const XnStringsHashT& other) : Base() { *this = other; } XnStringsHashT& operator=(const XnStringsHashT& other) { Base::operator=(other); // no other members return *this; } }; class XnStringsSet : public XnStringsHashT { typedef XnStringsHashT Base; public: XnStatus Set(const XnChar* key) { return Base::Set(key, NULL); } }; #endif // _XN_STRINGS_HASH_T_H_