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));
380 if (
m_Bins[HashValue] != NULL)
386 hiter.
Value() = value;
394 if (
m_Bins[HashValue] == NULL)
396 return XN_STATUS_ALLOC_FAILED;
404 if (pKeyNode == NULL)
406 return XN_STATUS_ALLOC_FAILED;
408 pKeyNode->
Data() = key;
412 if (pValueNode == NULL)
415 return XN_STATUS_ALLOC_FAILED;
417 pValueNode->
Data() = value;
420 pKeyNode->
Next() = pValueNode;
421 pValueNode->
Next() = NULL;
454 value = hiter.
Value();
480 value = hiter.
Value();
498 return XN_STATUS_ILLEGAL_POSITION;
502 value = iter.
Value();
520 return XN_STATUS_ILLEGAL_POSITION;
582 return ConstFind(key, hiter);
598 nRetVal = ConstFind(key, it);
647 return XN_STATUS_IS_NOT_EMPTY;
664 return XN_STATUS_IS_NOT_EMPTY;
702 if (
m_Bins[hashValue] != NULL)
706 iter !=
m_Bins[hashValue]->
end(); ++iter, ++hiter)
713 return XN_STATUS_NO_MATCH;
736 return Find(key, HashValue, hiter);
744 #define XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, ClassName, KeyTranslator) \ 745 class decl ClassName \ 748 inline static XnHashValue Hash(KeyType const& key) \ 750 const XnKey _key = KeyTranslator::GetAsValue(key); \ 751 return XnDefaultHashFunction(_key); \ 753 inline static XnInt32 Compare(KeyType const& key1, KeyType const& key2) \ 755 const XnKey _key1 = KeyTranslator::GetAsValue(key1); \ 756 const XnKey _key2 = KeyTranslator::GetAsValue(key2); \ 757 return XnDefaultCompareFunction(_key1, _key2); \ 765 #define XN_DECLARE_DEFAULT_KEY_MANAGER(KeyType, ClassName, KeyTranslator) \ 766 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(, KeyType, ClassName, KeyTranslator) 773 #define XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 774 class decl ClassName : public XnHash \ 777 class decl ConstIterator : public XnHash::ConstIterator \ 780 friend class ClassName; \ 781 inline ConstIterator(const ConstIterator& other) : XnHash::ConstIterator(other) {} \ 782 inline ConstIterator& operator++() \ 784 ++(*(XnHash::ConstIterator*)this); \ 787 inline ConstIterator operator++(int) \ 789 ConstIterator result = *this; \ 793 inline ConstIterator& operator--() \ 795 --(*(XnHash::ConstIterator*)this); \ 798 inline ConstIterator operator--(int) \ 800 ConstIterator result = *this; \ 804 inline KeyType const& Key() const \ 806 return KeyTranslator::GetFromValue(XnHash::ConstIterator::Key()); \ 808 inline ValueType const& Value() const \ 810 return ValueTranslator::GetFromValue(XnHash::ConstIterator::Value()); \ 813 inline ConstIterator(const XnHash::ConstIterator& other) : \ 814 XnHash::ConstIterator(other) {} \ 816 class decl Iterator : public ConstIterator \ 819 friend class ClassName; \ 820 inline Iterator(const Iterator& other) : ConstIterator(other) {} \ 821 inline Iterator& operator++() \ 823 ++(*(ConstIterator*)this); \ 826 inline Iterator operator++(int) \ 828 Iterator result = *this; \ 832 inline Iterator& operator--() \ 834 --(*(ConstIterator*)this); \ 837 inline Iterator operator--(int) \ 839 Iterator result = *this; \ 843 inline KeyType& Key() const \ 845 return (KeyType&)ConstIterator::Key(); \ 847 inline ValueType& Value() const \ 849 return (ValueType&)ConstIterator::Value(); \ 852 inline Iterator(const XnHash::Iterator& other) : ConstIterator(other) {} \ 857 SetHashFunction(Hash); \ 858 SetCompareFunction(Compare); \ 860 virtual ~ClassName() \ 865 XnStatus Set(KeyType const& key, ValueType const& value) \ 867 Iterator oldIt = begin(); \ 868 if (Find(key, oldIt) == XN_STATUS_OK) \ 870 oldIt.Value() = value; \ 874 XnKey _key = KeyTranslator::CreateValueCopy(key); \ 875 XnValue _value = ValueTranslator::CreateValueCopy(value); \ 876 XnStatus nRetVal = XnHash::Set(_key, _value); \ 877 if (nRetVal != XN_STATUS_OK) \ 879 KeyTranslator::FreeValue(_key); \ 880 ValueTranslator::FreeValue(_value); \ 884 return XN_STATUS_OK; \ 886 XnStatus Get(KeyType const& key, ValueType& value) const \ 888 XnKey _key = KeyTranslator::GetAsValue(key); \ 890 XnStatus nRetVal = XnHash::Get(_key, _value); \ 891 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 892 value = ValueTranslator::GetFromValue(_value); \ 893 return XN_STATUS_OK; \ 895 XnStatus Get(KeyType const& key, ValueType*& pValue) const \ 897 XnKey _key = KeyTranslator::GetAsValue(key); \ 899 XnStatus nRetVal = XnHash::Get(_key, _value); \ 900 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 901 pValue = &ValueTranslator::GetFromValue(_value); \ 902 return XN_STATUS_OK; \ 904 XnStatus Remove(KeyType const& key) \ 907 return Remove(key, dummy); \ 909 XnStatus Remove(KeyType const& key, ValueType& value) \ 911 ConstIterator it = end(); \ 912 XnStatus nRetVal = Find(key, it); \ 913 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 914 value = it.Value(); \ 917 inline XnStatus Remove(ConstIterator iter) \ 919 XnKey key = KeyTranslator::GetAsValue(iter.Key()); \ 920 XnValue value = ValueTranslator::GetAsValue(iter.Value()); \ 921 XnStatus nRetVal = XnHash::Remove(iter); \ 922 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 923 KeyTranslator::FreeValue(key); \ 924 ValueTranslator::FreeValue(value); \ 925 return XN_STATUS_OK; \ 927 XnStatus Find(KeyType const& key, ConstIterator& hiter) const \ 929 XnKey _key = KeyTranslator::GetAsValue(key); \ 930 XnHash::ConstIterator it = XnHash::end(); \ 931 XnStatus nRetVal = XnHash::Find(_key, it); \ 932 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 934 return XN_STATUS_OK; \ 936 XnStatus Find(KeyType const& key, Iterator& hiter) \ 938 XnKey _key = KeyTranslator::GetAsValue(key); \ 939 XnHash::Iterator it = XnHash::end(); \ 940 XnStatus nRetVal = XnHash::Find(_key, it); \ 941 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 943 return XN_STATUS_OK; \ 945 inline Iterator begin() { return XnHash::begin(); } \ 946 inline ConstIterator begin() const { return XnHash::begin(); } \ 947 inline Iterator end() { return XnHash::end(); } \ 948 inline ConstIterator end() const { return XnHash::end(); } \ 950 virtual XnStatus Remove(XnHash::ConstIterator iter) \ 952 return Remove(ConstIterator(iter)); \ 954 inline static XnHashValue Hash(const XnKey& key) \ 956 KeyType const& _key = KeyTranslator::GetFromValue(key); \ 957 return KeyManager::Hash(_key); \ 959 inline static XnInt32 Compare(const XnKey& key1, const XnKey& key2) \ 961 KeyType const _key1 = KeyTranslator::GetFromValue(key1); \ 962 KeyType const _key2 = KeyTranslator::GetFromValue(key2); \ 963 return KeyManager::Compare(_key1, _key2); \ 966 XN_DISABLE_COPY_AND_ASSIGN(ClassName); \ 973 #define XN_DECLARE_HASH(KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 974 XN_DECLARE_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) 976 #define _XN_DEFAULT_KEY_MANAGER_NAME(ClassName) _##ClassName##Manager 983 #define XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 984 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName), KeyTranslator) \ 985 XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName)) 991 #define XN_DECLARE_DEFAULT_MANAGER_HASH(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 992 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) 994 #define _XN_DEFAULT_KEY_TRANSLATOR(ClassName) _##ClassName##KeyTranslator 995 #define _XN_DEFAULT_VALUE_TRANSLATOR(ClassName) _##ClassName##ValueTranslator 1002 #define XN_DECLARE_DEFAULT_HASH_DECL(decl, KeyType, ValueType, ClassName) \ 1003 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, KeyType, _XN_DEFAULT_KEY_TRANSLATOR(ClassName)) \ 1004 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, ValueType, _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) \ 1005 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, _XN_DEFAULT_KEY_TRANSLATOR(ClassName), _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) 1011 #define XN_DECLARE_DEFAULT_HASH(KeyType, ValueType, ClassName) \ 1012 XN_DECLARE_DEFAULT_HASH_DECL(, KeyType, ValueType, ClassName) 1014 #endif // _XN_HASH_H static void Deallocate(XnNode *pNode)
Definition: XnNode.h:41
XnStatus Find(const XnKey &key, Iterator &hiter)
Definition: XnHash.h:593
XnValue & Data()
Definition: XnNode.h:69
XnList ** m_Bins
Definition: XnHash.h:718
ConstIterator end() const
Definition: XnHash.h:631
#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:643
Iterator & operator--()
Definition: XnHash.h:277
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:726
XnUInt16 m_nMinBin
Definition: XnHash.h:720
const XnNode * GetNode() const
Definition: XnHash.h:197
virtual XnStatus Remove(ConstIterator iter)
Definition: XnHash.h:515
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:467
XnStatus Get(const XnKey &key, XnValue &value) const
Definition: XnHash.h:444
XnStatus Init()
Definition: XnHash.h:672
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:580
XnStatus GetInitStatus() const
Definition: XnHash.h:364
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:700
XnBool IsEmpty() const
Definition: XnHash.h:555
XnStatus Clear()
Definition: XnHash.h:544
void * XnValue
Definition: XnDataTypes.h:36
XnStatus Remove(ConstIterator iter, XnKey &key, XnValue &value)
Definition: XnHash.h:493
ConstIterator begin() const
Definition: XnHash.h:615
#define XN_NEW(type,...)
Definition: XnOS.h:326
XnStatus SetCompareFunction(XnCompareFunction compareFunction)
Definition: XnHash.h:660
Iterator rbegin()
Definition: XnList.h:465
XnStatus Set(const XnKey &key, const XnValue &value)
Definition: XnHash.h:375
XnStatus m_nInitStatus
Definition: XnHash.h:723
#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:563
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:607
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:728
ConstIterator operator--(int)
Definition: XnHash.h:143
virtual ~XnHash()
Definition: XnHash.h:347
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:623
Iterator end()
Definition: XnList.h:449
Iterator begin()
Definition: XnList.h:433
Iterator operator++(int)
Definition: XnHash.h:267
#define XN_DISABLE_COPY_AND_ASSIGN(TypeName)
Definition: XnMacros.h:119
ConstIterator operator++(int)
Definition: XnHash.h:108
Iterator operator--(int)
Definition: XnHash.h:285
static XnNode * Allocate()
Definition: XnNode.h:40