 |
OpenNI 1.5.4
|
Go to the documentation of this file.
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
XnUInt16 m_nCurrentBin
Definition: XnHash.h:236
Iterator end()
Definition: XnHash.h:623
XnUInt8 XnHashValue
Definition: XnHash.h:46
XnStatus Remove(const XnKey &key, XnValue &value)
Definition: XnHash.h:467
XnBool operator!=(const ConstIterator &other) const
Definition: XnHash.h:165
XnKey & Key() const
Definition: XnHash.h:295
XnStatus GetInitStatus() const
Definition: XnHash.h:364
XnList ** m_Bins
Definition: XnHash.h:718
XnNode *& Previous()
Definition: XnNode.h:80
XnStatus Get(const XnKey &key, XnValue &value) const
Definition: XnHash.h:444
XnStatus Find(const XnKey &key, Iterator &hiter)
Definition: XnHash.h:593
#define XN_VALIDATE_ALLOC_PTR(x)
Definition: XnOS.h:128
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:60
#define XN_STATUS_OK
Definition: XnStatus.h:37
XnStatus m_nInitStatus
Definition: XnHash.h:723
XnBool operator==(const ConstIterator &other) const
Definition: XnHash.h:155
Iterator(const ConstIterator &other)
Definition: XnHash.h:321
static XnNode * Allocate()
Definition: XnNode.h:60
XnStatus Clear()
Definition: XnHash.h:544
Iterator operator--(int)
Definition: XnHash.h:285
Iterator & operator++()
Definition: XnHash.h:259
XnList::Iterator m_Iterator
Definition: XnHash.h:238
XnUInt32 XnStatus
Definition: XnStatus.h:34
XnHashFunction m_HashFunction
Definition: XnHash.h:726
const XnNode * GetNode() const
Definition: XnHash.h:197
Iterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:310
XnNode *& Next()
Definition: XnNode.h:71
XnStatus SetHashFunction(XnHashFunction hashFunction)
Definition: XnHash.h:643
Iterator begin()
Definition: XnList.h:453
XnInt32(* XnCompareFunction)(const XnKey &key1, const XnKey &key2)
Definition: XnHash.h:334
XnStatus Remove(ConstIterator iter, XnKey &key, XnValue &value)
Definition: XnHash.h:493
ConstIterator(const XnHash *pHash, XnUInt16 nBin, XnList::Iterator listIterator)
Definition: XnHash.h:210
Iterator end()
Definition: XnList.h:469
XnStatus AddLast(const XnValue &value)
Definition: XnList.h:282
virtual XnStatus Remove(ConstIterator iter)
Definition: XnHash.h:515
XnStatus Find(const XnKey &key, ConstIterator &hiter) const
Definition: XnHash.h:580
XnStatus Init()
Definition: XnHash.h:672
friend class ConstIterator
Definition: XnHash.h:324
ConstIterator(const ConstIterator &other)
Definition: XnHash.h:83
ConstIterator & operator++()
Definition: XnHash.h:89
#define XN_NEW(type, arg)
Definition: XnOS.h:332
ConstIterator operator++(int)
Definition: XnHash.h:108
XnValue & Data()
Definition: XnNode.h:89
XnStatus SetCompareFunction(XnCompareFunction compareFunction)
Definition: XnHash.h:660
XnCompareFunction m_CompareFunction
Definition: XnHash.h:728
XnValue & Value() const
Definition: XnHash.h:300
XnStatus Set(const XnKey &key, const XnValue &value)
Definition: XnHash.h:375
#define XN_HASH_NUM_BINS
Definition: XnHash.h:34
#define XN_DELETE_ARR(p)
Definition: XnOS.h:337
ConstIterator operator--(int)
Definition: XnHash.h:143
XnHash()
Definition: XnHash.h:339
static void Deallocate(XnNode *pNode)
Definition: XnNode.h:61
XnBool IsEmpty() const
Definition: XnHash.h:555
XnStatus Find(const XnKey &key, XnHashValue hashValue, ConstIterator &hiter) const
Definition: XnHash.h:700
const XnNode * GetNode() const
Definition: XnList.h:165
#define XN_DISABLE_COPY_AND_ASSIGN(TypeName)
Definition: XnMacros.h:119
ConstIterator end() const
Definition: XnHash.h:631
Iterator rbegin()
Definition: XnList.h:485
#define XN_NEW_ARR(type, count)
Definition: XnOS.h:335
Iterator(const XnHash *pHash)
Definition: XnHash.h:319
XnValue XnKey
Definition: XnHash.h:41
Iterator(const Iterator &other)
Definition: XnHash.h:254
const XnKey & Key() const
Definition: XnHash.h:173
XnHashValue(* XnHashFunction)(const XnKey &key)
Definition: XnHash.h:330
Iterator & operator--()
Definition: XnHash.h:277
ConstIterator begin() const
Definition: XnHash.h:615
XnNode * GetNode()
Definition: XnHash.h:189
ConstIterator & operator--()
Definition: XnHash.h:118
Iterator operator++(int)
Definition: XnHash.h:267
Iterator begin()
Definition: XnHash.h:607
ConstIterator(const XnHash *pHash)
Definition: XnHash.h:230
#define XN_DELETE(p)
Definition: XnOS.h:336
XnUInt32 Size() const
Definition: XnHash.h:563
XnUInt16 m_nMinBin
Definition: XnHash.h:720
const XnHash * m_pHash
Definition: XnHash.h:234
virtual ~XnHash()
Definition: XnHash.h:347
#define XN_HASH_LAST_BIN
Definition: XnHash.h:33
void * XnValue
Definition: XnDataTypes.h:36
const XnValue & Value() const
Definition: XnHash.h:181