32 #define XN_HASH_LAST_BIN 256 33 #define XN_HASH_NUM_BINS (XN_HASH_LAST_BIN + 1) 52 return (XnSizeT(key) & 0xff);
58 static XnInt32 XnDefaultCompareFunction(
const XnKey& key1,
const XnKey& key2)
60 return XnInt32(XnSizeT(key1)-XnSizeT(key2));
379 if (
m_Bins[HashValue] != NULL)
385 hiter.
Value() = value;
393 if (
m_Bins[HashValue] == NULL)
395 return XN_STATUS_ALLOC_FAILED;
403 if (pKeyNode == NULL)
405 return XN_STATUS_ALLOC_FAILED;
407 pKeyNode->
Data() = key;
411 if (pValueNode == NULL)
414 return XN_STATUS_ALLOC_FAILED;
416 pValueNode->
Data() = value;
419 pKeyNode->
Next() = pValueNode;
420 pValueNode->
Next() = NULL;
453 value = hiter.
Value();
479 value = hiter.
Value();
497 return XN_STATUS_ILLEGAL_POSITION;
501 value = iter.
Value();
519 return XN_STATUS_ILLEGAL_POSITION;
581 return ConstFind(key, hiter);
597 nRetVal = ConstFind(key, it);
646 return XN_STATUS_IS_NOT_EMPTY;
663 return XN_STATUS_IS_NOT_EMPTY;
701 if (
m_Bins[hashValue] != NULL)
705 iter !=
m_Bins[hashValue]->
end(); ++iter, ++hiter)
712 return XN_STATUS_NO_MATCH;
735 return Find(key, HashValue, hiter);
743 #define XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, ClassName, KeyTranslator) \ 744 class decl ClassName \ 747 inline static XnHashValue Hash(KeyType const& key) \ 749 const XnKey _key = KeyTranslator::GetAsValue(key); \ 750 return XnDefaultHashFunction(_key); \ 752 inline static XnInt32 Compare(KeyType const& key1, KeyType const& key2) \ 754 const XnKey _key1 = KeyTranslator::GetAsValue(key1); \ 755 const XnKey _key2 = KeyTranslator::GetAsValue(key2); \ 756 return XnDefaultCompareFunction(_key1, _key2); \ 764 #define XN_DECLARE_DEFAULT_KEY_MANAGER(KeyType, ClassName, KeyTranslator) \ 765 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(, KeyType, ClassName, KeyTranslator) 772 #define XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 773 class decl ClassName : public XnHash \ 776 class decl ConstIterator : public XnHash::ConstIterator \ 779 friend class ClassName; \ 780 inline ConstIterator(const ConstIterator& other) : XnHash::ConstIterator(other) {} \ 781 inline ConstIterator& operator++() \ 783 ++(*(XnHash::ConstIterator*)this); \ 786 inline ConstIterator operator++(int) \ 788 ConstIterator result = *this; \ 792 inline ConstIterator& operator--() \ 794 --(*(XnHash::ConstIterator*)this); \ 797 inline ConstIterator operator--(int) \ 799 ConstIterator result = *this; \ 803 inline KeyType const& Key() const \ 805 return KeyTranslator::GetFromValue(XnHash::ConstIterator::Key()); \ 807 inline ValueType const& Value() const \ 809 return ValueTranslator::GetFromValue(XnHash::ConstIterator::Value()); \ 812 inline ConstIterator(const XnHash::ConstIterator& other) : \ 813 XnHash::ConstIterator(other) {} \ 815 class decl Iterator : public ConstIterator \ 818 friend class ClassName; \ 819 inline Iterator(const Iterator& other) : ConstIterator(other) {} \ 820 inline Iterator& operator++() \ 822 ++(*(ConstIterator*)this); \ 825 inline Iterator operator++(int) \ 827 Iterator result = *this; \ 831 inline Iterator& operator--() \ 833 --(*(ConstIterator*)this); \ 836 inline Iterator operator--(int) \ 838 Iterator result = *this; \ 842 inline KeyType& Key() const \ 844 return (KeyType&)ConstIterator::Key(); \ 846 inline ValueType& Value() const \ 848 return (ValueType&)ConstIterator::Value(); \ 851 inline Iterator(const XnHash::Iterator& other) : ConstIterator(other) {} \ 856 SetHashFunction(Hash); \ 857 SetCompareFunction(Compare); \ 859 virtual ~ClassName() \ 864 XnStatus Set(KeyType const& key, ValueType const& value) \ 866 Iterator oldIt = begin(); \ 867 if (Find(key, oldIt) == XN_STATUS_OK) \ 869 oldIt.Value() = value; \ 873 XnKey _key = KeyTranslator::CreateValueCopy(key); \ 874 XnValue _value = ValueTranslator::CreateValueCopy(value); \ 875 XnStatus nRetVal = XnHash::Set(_key, _value); \ 876 if (nRetVal != XN_STATUS_OK) \ 878 KeyTranslator::FreeValue(_key); \ 879 ValueTranslator::FreeValue(_value); \ 883 return XN_STATUS_OK; \ 885 XnStatus Get(KeyType const& key, ValueType& value) const \ 887 XnKey _key = KeyTranslator::GetAsValue(key); \ 889 XnStatus nRetVal = XnHash::Get(_key, _value); \ 890 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 891 value = ValueTranslator::GetFromValue(_value); \ 892 return XN_STATUS_OK; \ 894 XnStatus Get(KeyType const& key, ValueType*& pValue) const \ 896 XnKey _key = KeyTranslator::GetAsValue(key); \ 898 XnStatus nRetVal = XnHash::Get(_key, _value); \ 899 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 900 pValue = &ValueTranslator::GetFromValue(_value); \ 901 return XN_STATUS_OK; \ 903 XnStatus Remove(KeyType const& key) \ 906 return Remove(key, dummy); \ 908 XnStatus Remove(KeyType const& key, ValueType& value) \ 910 ConstIterator it = end(); \ 911 XnStatus nRetVal = Find(key, it); \ 912 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 913 value = it.Value(); \ 916 inline XnStatus Remove(ConstIterator iter) \ 918 XnKey key = KeyTranslator::GetAsValue(iter.Key()); \ 919 XnValue value = ValueTranslator::GetAsValue(iter.Value()); \ 920 XnStatus nRetVal = XnHash::Remove(iter); \ 921 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 922 KeyTranslator::FreeValue(key); \ 923 ValueTranslator::FreeValue(value); \ 924 return XN_STATUS_OK; \ 926 XnStatus Find(KeyType const& key, ConstIterator& hiter) const \ 928 XnKey _key = KeyTranslator::GetAsValue(key); \ 929 XnHash::ConstIterator it = XnHash::end(); \ 930 XnStatus nRetVal = XnHash::Find(_key, it); \ 931 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 933 return XN_STATUS_OK; \ 935 XnStatus Find(KeyType const& key, Iterator& hiter) \ 937 XnKey _key = KeyTranslator::GetAsValue(key); \ 938 XnHash::Iterator it = XnHash::end(); \ 939 XnStatus nRetVal = XnHash::Find(_key, it); \ 940 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 942 return XN_STATUS_OK; \ 944 inline Iterator begin() { return XnHash::begin(); } \ 945 inline ConstIterator begin() const { return XnHash::begin(); } \ 946 inline Iterator end() { return XnHash::end(); } \ 947 inline ConstIterator end() const { return XnHash::end(); } \ 949 virtual XnStatus Remove(XnHash::ConstIterator iter) \ 951 return Remove(ConstIterator(iter)); \ 953 inline static XnHashValue Hash(const XnKey& key) \ 955 KeyType const& _key = KeyTranslator::GetFromValue(key); \ 956 return KeyManager::Hash(_key); \ 958 inline static XnInt32 Compare(const XnKey& key1, const XnKey& key2) \ 960 KeyType const _key1 = KeyTranslator::GetFromValue(key1); \ 961 KeyType const _key2 = KeyTranslator::GetFromValue(key2); \ 962 return KeyManager::Compare(_key1, _key2); \ 965 XN_DISABLE_COPY_AND_ASSIGN(ClassName); \ 972 #define XN_DECLARE_HASH(KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) \ 973 XN_DECLARE_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, KeyManager) 975 #define _XN_DEFAULT_KEY_MANAGER_NAME(ClassName) _##ClassName##Manager 982 #define XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 983 XN_DECLARE_DEFAULT_KEY_MANAGER_DECL(decl, KeyType, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName), KeyTranslator) \ 984 XN_DECLARE_HASH_DECL(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator, _XN_DEFAULT_KEY_MANAGER_NAME(ClassName)) 990 #define XN_DECLARE_DEFAULT_MANAGER_HASH(decl, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) \ 991 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(, KeyType, ValueType, ClassName, KeyTranslator, ValueTranslator) 993 #define _XN_DEFAULT_KEY_TRANSLATOR(ClassName) _##ClassName##KeyTranslator 994 #define _XN_DEFAULT_VALUE_TRANSLATOR(ClassName) _##ClassName##ValueTranslator 1001 #define XN_DECLARE_DEFAULT_HASH_DECL(decl, KeyType, ValueType, ClassName) \ 1002 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, KeyType, _XN_DEFAULT_KEY_TRANSLATOR(ClassName)) \ 1003 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, ValueType, _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) \ 1004 XN_DECLARE_DEFAULT_MANAGER_HASH_DECL(decl, KeyType, ValueType, ClassName, _XN_DEFAULT_KEY_TRANSLATOR(ClassName), _XN_DEFAULT_VALUE_TRANSLATOR(ClassName)) 1010 #define XN_DECLARE_DEFAULT_HASH(KeyType, ValueType, ClassName) \ 1011 XN_DECLARE_DEFAULT_HASH_DECL(, KeyType, ValueType, ClassName) 1013 #endif // _XN_HASH_H static void Deallocate(XnNode *pNode)
Definition: XnNode.h:40
XnStatus Find(const XnKey &key, Iterator &hiter)
Definition: XnHash.h:592
XnValue & Data()
Definition: XnNode.h:68
XnList ** m_Bins
Definition: XnHash.h:717
ConstIterator end() const
Definition: XnHash.h:630
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:59
#define XN_VALIDATE_ALLOC_PTR(x)
Definition: XnOS.h:131
XnStatus SetHashFunction(XnHashFunction hashFunction)
Definition: XnHash.h:642
Iterator & operator--()
Definition: XnHash.h:276
Iterator(const XnHash *pHash)
Definition: XnHash.h:318
Iterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:309
#define XN_STATUS_OK
Definition: XnStatus.h:36
XnNode * GetNode()
Definition: XnHash.h:188
XnList::Iterator m_Iterator
Definition: XnHash.h:237
XnHashFunction m_HashFunction
Definition: XnHash.h:725
XnUInt16 m_nMinBin
Definition: XnHash.h:719
const XnNode * GetNode() const
Definition: XnHash.h:196
virtual XnStatus Remove(ConstIterator iter)
Definition: XnHash.h:514
XnUInt16 m_nCurrentBin
Definition: XnHash.h:235
const XnHash * m_pHash
Definition: XnHash.h:233
XnStatus Remove(const XnKey &key, XnValue &value)
Definition: XnHash.h:466
XnStatus Get(const XnKey &key, XnValue &value) const
Definition: XnHash.h:443
XnStatus Init()
Definition: XnHash.h:671
XnUInt32 XnStatus
Definition: XnStatus.h:33
Iterator(const Iterator &other)
Definition: XnHash.h:253
XnInt32(* XnCompareFunction)(const XnKey &key1, const XnKey &key2)
Definition: XnHash.h:333
XnStatus Find(const XnKey &key, ConstIterator &hiter) const
Definition: XnHash.h:579
XnStatus GetInitStatus() const
Definition: XnHash.h:363
XnValue & Value() const
Definition: XnHash.h:299
ConstIterator(const ConstIterator &other)
Definition: XnHash.h:82
XnStatus Find(const XnKey &key, XnHashValue hashValue, ConstIterator &hiter) const
Definition: XnHash.h:699
XnBool IsEmpty() const
Definition: XnHash.h:554
XnStatus Clear()
Definition: XnHash.h:543
void * XnValue
Definition: XnDataTypes.h:35
XnStatus Remove(ConstIterator iter, XnKey &key, XnValue &value)
Definition: XnHash.h:492
ConstIterator begin() const
Definition: XnHash.h:614
#define XN_NEW(type,...)
Definition: XnOS.h:329
XnStatus SetCompareFunction(XnCompareFunction compareFunction)
Definition: XnHash.h:659
Iterator rbegin()
Definition: XnList.h:464
XnStatus Set(const XnKey &key, const XnValue &value)
Definition: XnHash.h:374
XnStatus m_nInitStatus
Definition: XnHash.h:722
#define XN_NEW_ARR(type, count)
Definition: XnOS.h:338
XnValue XnKey
Definition: XnHash.h:40
#define XN_DELETE_ARR(p)
Definition: XnOS.h:340
XnNode *& Previous()
Definition: XnNode.h:59
Iterator(const ConstIterator &other)
Definition: XnHash.h:320
XnUInt32 Size() const
Definition: XnHash.h:562
ConstIterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:209
ConstIterator(const XnHash *pHash)
Definition: XnHash.h:229
XnKey & Key() const
Definition: XnHash.h:294
XnBool operator!=(const ConstIterator &other) const
Definition: XnHash.h:164
const XnValue & Value() const
Definition: XnHash.h:180
#define XN_DELETE(p)
Definition: XnOS.h:339
const XnKey & Key() const
Definition: XnHash.h:172
Iterator begin()
Definition: XnHash.h:606
XnStatus AddLast(const XnValue &value)
Definition: XnList.h:261
ConstIterator & operator--()
Definition: XnHash.h:117
ConstIterator & operator++()
Definition: XnHash.h:88
#define XN_HASH_LAST_BIN
Definition: XnHash.h:32
#define XN_HASH_NUM_BINS
Definition: XnHash.h:33
XnHash()
Definition: XnHash.h:338
XnCompareFunction m_CompareFunction
Definition: XnHash.h:727
ConstIterator operator--(int)
Definition: XnHash.h:142
virtual ~XnHash()
Definition: XnHash.h:346
const XnNode * GetNode() const
Definition: XnList.h:124
Iterator & operator++()
Definition: XnHash.h:258
XnUInt8 XnHashValue
Definition: XnHash.h:45
XnNode *& Next()
Definition: XnNode.h:50
XnHashValue(* XnHashFunction)(const XnKey &key)
Definition: XnHash.h:329
XnBool operator==(const ConstIterator &other) const
Definition: XnHash.h:154
Iterator end()
Definition: XnHash.h:622
Iterator end()
Definition: XnList.h:448
Iterator begin()
Definition: XnList.h:432
Iterator operator++(int)
Definition: XnHash.h:266
#define XN_DISABLE_COPY_AND_ASSIGN(TypeName)
Definition: XnMacros.h:118
ConstIterator operator++(int)
Definition: XnHash.h:107
Iterator operator--(int)
Definition: XnHash.h:284
static XnNode * Allocate()
Definition: XnNode.h:39