33 #define XN_HASH_LAST_BIN 256 34 #define XN_HASH_NUM_BINS (XN_HASH_LAST_BIN + 1) 53 return (XnSizeT(key) & 0xff);
59 static XnInt32 XnDefaultCompareFunction(
const XnKey& key1,
const XnKey& key2)
61 return XnInt32(XnSizeT(key1)-XnSizeT(key2));
357 if (other.
m_Bins[i] != NULL)
407 if (
m_Bins[HashValue] != NULL)
413 hiter.
Value() = value;
421 if (
m_Bins[HashValue] == NULL)
423 return XN_STATUS_ALLOC_FAILED;
431 if (pKeyNode == NULL)
433 return XN_STATUS_ALLOC_FAILED;
435 pKeyNode->
Data() = key;
439 if (pValueNode == NULL)
442 return XN_STATUS_ALLOC_FAILED;
444 pValueNode->
Data() = value;
447 pKeyNode->
Next() = pValueNode;
448 pValueNode->
Next() = NULL;
481 value = hiter.
Value();
507 value = hiter.
Value();
525 return XN_STATUS_ILLEGAL_POSITION;
529 value = iter.
Value();
547 return XN_STATUS_ILLEGAL_POSITION;
609 return ConstFind(key, hiter);
625 nRetVal = ConstFind(key, it);
674 return XN_STATUS_IS_NOT_EMPTY;
691 return XN_STATUS_IS_NOT_EMPTY;
729 if (
m_Bins[hashValue] != NULL)
733 iter !=
m_Bins[hashValue]->
end(); ++iter, ++hiter)
740 return XN_STATUS_NO_MATCH;
761 return Find(key, HashValue, hiter);
769 #define XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, ClassName, KeyTranslator) \ 770 class decl ClassName \ 773 inline static XnHashValue Hash(KeyType const& key) \ 775 const XnKey _key = KeyTranslator::GetAsValue(key); \ 776 return XnDefaultHashFunction(_key); \ 778 inline static XnInt32 Compare(KeyType const& key1, KeyType const& key2) \ 780 const XnKey _key1 = KeyTranslator::GetAsValue(key1); \ 781 const XnKey _key2 = KeyTranslator::GetAsValue(key2); \ 782 return XnDefaultCompareFunction(_key1, _key2); \ 790 #define XN_DECLARE_DEFAULT_KEY_MANAGER(KeyType, ClassName, KeyTranslator) \ 791 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(, KeyType, ClassName, KeyTranslator) 798 #define XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 799 class decl ClassName : public XnHash \ 802 class decl ConstIterator : public XnHash::ConstIterator \ 805 friend class ClassName; \ 806 inline ConstIterator(const ConstIterator& other) : XnHash::ConstIterator(other) {} \ 807 inline ConstIterator& operator++() \ 809 ++(*(XnHash::ConstIterator*)this); \ 812 inline ConstIterator operator++(int) \ 814 ConstIterator result = *this; \ 818 inline ConstIterator& operator--() \ 820 --(*(XnHash::ConstIterator*)this); \ 823 inline ConstIterator operator--(int) \ 825 ConstIterator result = *this; \ 829 inline KeyType const& Key() const \ 831 return KeyTranslator::GetFromValue(XnHash::ConstIterator::Key()); \ 833 inline ValueType const& Value() const \ 835 return ValueTranslator::GetFromValue(XnHash::ConstIterator::Value()); \ 838 inline ConstIterator(const XnHash::ConstIterator& other) : \ 839 XnHash::ConstIterator(other) {} \ 841 class decl Iterator : public ConstIterator \ 844 friend class ClassName; \ 845 inline Iterator(const Iterator& other) : ConstIterator(other) {} \ 846 inline Iterator& operator++() \ 848 ++(*(ConstIterator*)this); \ 851 inline Iterator operator++(int) \ 853 Iterator result = *this; \ 857 inline Iterator& operator--() \ 859 --(*(ConstIterator*)this); \ 862 inline Iterator operator--(int) \ 864 Iterator result = *this; \ 868 inline KeyType& Key() const \ 870 return (KeyType&)ConstIterator::Key(); \ 872 inline ValueType& Value() const \ 874 return (ValueType&)ConstIterator::Value(); \ 877 inline Iterator(const XnHash::Iterator& other) : ConstIterator(other) {} \ 882 SetHashFunction(Hash); \ 883 SetCompareFunction(Compare); \ 885 ClassName(const ClassName& other) \ 887 SetHashFunction(Hash); \ 888 SetCompareFunction(Compare); \ 891 virtual ~ClassName() \ 896 ClassName& operator=(const ClassName& other) \ 899 for (ConstIterator it = other.begin(); it != other.end(); it++) \ 901 m_nInitStatus = Set(it.Key(), it.Value()); \ 902 if (m_nInitStatus != XN_STATUS_OK) \ 909 XnStatus Set(KeyType const& key, ValueType const& value) \ 911 Iterator oldIt = begin(); \ 912 if (Find(key, oldIt) == XN_STATUS_OK) \ 914 oldIt.Value() = value; \ 918 XnKey _key = KeyTranslator::CreateValueCopy(key); \ 919 XnValue _value = ValueTranslator::CreateValueCopy(value); \ 920 XnStatus nRetVal = XnHash::Set(_key, _value); \ 921 if (nRetVal != XN_STATUS_OK) \ 923 KeyTranslator::FreeValue(_key); \ 924 ValueTranslator::FreeValue(_value); \ 928 return XN_STATUS_OK; \ 930 XnStatus Get(KeyType const& key, ValueType& value) const \ 932 XnKey _key = KeyTranslator::GetAsValue(key); \ 934 XnStatus nRetVal = XnHash::Get(_key, _value); \ 935 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 936 value = ValueTranslator::GetFromValue(_value); \ 937 return XN_STATUS_OK; \ 939 XnStatus Get(KeyType const& key, ValueType*& pValue) const \ 941 XnKey _key = KeyTranslator::GetAsValue(key); \ 943 XnStatus nRetVal = XnHash::Get(_key, _value); \ 944 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 945 pValue = &ValueTranslator::GetFromValue(_value); \ 946 return XN_STATUS_OK; \ 948 XnStatus Remove(KeyType const& key) \ 951 return Remove(key, dummy); \ 953 XnStatus Remove(KeyType const& key, ValueType& value) \ 955 ConstIterator it = end(); \ 956 XnStatus nRetVal = Find(key, it); \ 957 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 958 value = it.Value(); \ 961 inline XnStatus Remove(ConstIterator iter) \ 963 XnKey key = KeyTranslator::GetAsValue(iter.Key()); \ 964 XnValue value = ValueTranslator::GetAsValue(iter.Value()); \ 965 XnStatus nRetVal = XnHash::Remove(iter); \ 966 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 967 KeyTranslator::FreeValue(key); \ 968 ValueTranslator::FreeValue(value); \ 969 return XN_STATUS_OK; \ 971 XnStatus Find(KeyType const& key, ConstIterator& hiter) const \ 973 XnKey _key = KeyTranslator::GetAsValue(key); \ 974 XnHash::ConstIterator it = XnHash::end(); \ 975 XnStatus nRetVal = XnHash::Find(_key, it); \ 976 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 978 return XN_STATUS_OK; \ 980 XnStatus Find(KeyType const& key, Iterator& hiter) \ 982 XnKey _key = KeyTranslator::GetAsValue(key); \ 983 XnHash::Iterator it = XnHash::end(); \ 984 XnStatus nRetVal = XnHash::Find(_key, it); \ 985 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 987 return XN_STATUS_OK; \ 989 inline Iterator begin() { return XnHash::begin(); } \ 990 inline ConstIterator begin() const { return XnHash::begin(); } \ 991 inline Iterator end() { return XnHash::end(); } \ 992 inline ConstIterator end() const { return XnHash::end(); } \ 994 virtual XnStatus Remove(XnHash::ConstIterator iter) \ 996 return Remove(ConstIterator(iter)); \ 998 inline static XnHashValue Hash(const XnKey& key) \ 1000 KeyType const& _key = KeyTranslator::GetFromValue(key); \ 1001 return KeyManager::Hash(_key); \ 1003 inline static XnInt32 Compare(const XnKey& key1, const XnKey& key2) \ 1005 KeyType const _key1 = KeyTranslator::GetFromValue(key1); \ 1006 KeyType const _key2 = KeyTranslator::GetFromValue(key2); \ 1007 return KeyManager::Compare(_key1, _key2); \ 1015 #define XN_DECLARE_HASH(KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 1016 XN_DECLARE_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) 1018 #define _XN_DEFAULT_KEY_MANAGER_NAME(ClassName) _##ClassName##Manager 1025 #define XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 1026 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName), KeyTranslator) \ 1027 XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName)) 1033 #define XN_DECLARE_DEFAULT_MANAGER_HASH(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 1034 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) 1036 #define _XN_DEFAULT_KEY_TRANSLATOR(ClassName) _##ClassName##KeyTranslator 1037 #define _XN_DEFAULT_VALUE_TRANSLATOR(ClassName) _##ClassName##ValueTranslator 1044 #define XN_DECLARE_DEFAULT_HASH_DECL(decl, KeyType, ValueType, ClassName) \ 1045 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, KeyType, _XN_DEFAULT_KEY_TRANSLATOR(ClassName)) \ 1046 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, ValueType, _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) \ 1047 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, _XN_DEFAULT_KEY_TRANSLATOR(ClassName), _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) 1053 #define XN_DECLARE_DEFAULT_HASH(KeyType, ValueType, ClassName) \ 1054 XN_DECLARE_DEFAULT_HASH_DECL(, KeyType, ValueType, ClassName) 1056 #endif // _XN_HASH_H static void Deallocate(XnNode *pNode)
Definition: XnNode.h:41
XnStatus Find(const XnKey &key, Iterator &hiter)
Definition: XnHash.h:620
XnValue & Data()
Definition: XnNode.h:69
XnList ** m_Bins
Definition: XnHash.h:745
ConstIterator end() const
Definition: XnHash.h:658
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:60
#define XN_VALIDATE_ALLOC_PTR(x)
Definition: XnOS.h:128
XnStatus SetHashFunction(XnHashFunction hashFunction)
Definition: XnHash.h:670
Iterator & operator--()
Definition: XnHash.h:277
XnHash(const XnHash &other)
Definition: XnHash.h:347
Iterator(const XnHash *pHash)
Definition: XnHash.h:319
Iterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:310
#define XN_STATUS_OK
Definition: XnStatus.h:37
XnNode * GetNode()
Definition: XnHash.h:189
XnList::Iterator m_Iterator
Definition: XnHash.h:238
XnHashFunction m_HashFunction
Definition: XnHash.h:753
XnUInt16 m_nMinBin
Definition: XnHash.h:747
const XnNode * GetNode() const
Definition: XnHash.h:197
virtual XnStatus Remove(ConstIterator iter)
Definition: XnHash.h:542
XnUInt16 m_nCurrentBin
Definition: XnHash.h:236
const XnHash * m_pHash
Definition: XnHash.h:234
XnStatus Remove(const XnKey &key, XnValue &value)
Definition: XnHash.h:494
XnStatus Get(const XnKey &key, XnValue &value) const
Definition: XnHash.h:471
XnStatus Init()
Definition: XnHash.h:699
XnUInt32 XnStatus
Definition: XnStatus.h:34
Iterator(const Iterator &other)
Definition: XnHash.h:254
XnInt32(* XnCompareFunction)(const XnKey &key1, const XnKey &key2)
Definition: XnHash.h:334
XnStatus Find(const XnKey &key, ConstIterator &hiter) const
Definition: XnHash.h:607
XnStatus GetInitStatus() const
Definition: XnHash.h:391
XnValue & Value() const
Definition: XnHash.h:300
ConstIterator(const ConstIterator &other)
Definition: XnHash.h:83
XnStatus Find(const XnKey &key, XnHashValue hashValue, ConstIterator &hiter) const
Definition: XnHash.h:727
XnBool IsEmpty() const
Definition: XnHash.h:582
XnStatus Clear()
Definition: XnHash.h:571
void * XnValue
Definition: XnDataTypes.h:36
XnStatus Remove(ConstIterator iter, XnKey &key, XnValue &value)
Definition: XnHash.h:520
ConstIterator begin() const
Definition: XnHash.h:642
#define XN_NEW(type,...)
Definition: XnOS.h:326
XnStatus SetCompareFunction(XnCompareFunction compareFunction)
Definition: XnHash.h:687
Iterator rbegin()
Definition: XnList.h:465
XnStatus Set(const XnKey &key, const XnValue &value)
Definition: XnHash.h:402
XnStatus m_nInitStatus
Definition: XnHash.h:750
#define XN_NEW_ARR(type, count)
Definition: XnOS.h:335
XnValue XnKey
Definition: XnHash.h:41
#define XN_DELETE_ARR(p)
Definition: XnOS.h:337
XnNode *& Previous()
Definition: XnNode.h:60
Iterator(const ConstIterator &other)
Definition: XnHash.h:321
XnUInt32 Size() const
Definition: XnHash.h:590
ConstIterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:210
ConstIterator(const XnHash *pHash)
Definition: XnHash.h:230
XnKey & Key() const
Definition: XnHash.h:295
XnBool operator!=(const ConstIterator &other) const
Definition: XnHash.h:165
const XnValue & Value() const
Definition: XnHash.h:181
#define XN_DELETE(p)
Definition: XnOS.h:336
const XnKey & Key() const
Definition: XnHash.h:173
Iterator begin()
Definition: XnHash.h:634
XnStatus AddLast(const XnValue &value)
Definition: XnList.h:262
ConstIterator & operator--()
Definition: XnHash.h:118
ConstIterator & operator++()
Definition: XnHash.h:89
#define XN_HASH_LAST_BIN
Definition: XnHash.h:33
#define XN_HASH_NUM_BINS
Definition: XnHash.h:34
XnHash()
Definition: XnHash.h:339
XnCompareFunction m_CompareFunction
Definition: XnHash.h:755
ConstIterator operator--(int)
Definition: XnHash.h:143
virtual ~XnHash()
Definition: XnHash.h:374
const XnNode * GetNode() const
Definition: XnList.h:125
Iterator & operator++()
Definition: XnHash.h:259
XnUInt8 XnHashValue
Definition: XnHash.h:46
XnNode *& Next()
Definition: XnNode.h:51
XnHashValue(* XnHashFunction)(const XnKey &key)
Definition: XnHash.h:330
XnBool operator==(const ConstIterator &other) const
Definition: XnHash.h:155
Iterator end()
Definition: XnHash.h:650
Iterator end()
Definition: XnList.h:449
Iterator begin()
Definition: XnList.h:433
Iterator operator++(int)
Definition: XnHash.h:267
ConstIterator operator++(int)
Definition: XnHash.h:108
Iterator operator--(int)
Definition: XnHash.h:285
static XnNode * Allocate()
Definition: XnNode.h:40