 |
OpenNI 1.5.7
|
Go to the documentation of this file.
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)
381 Iterator hiter(
this);
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;
446 Iterator hiter(
this);
453 value = hiter.Value();
469 Iterator hiter(
this);
479 value = hiter.Value();
497 return XN_STATUS_ILLEGAL_POSITION;
501 value = iter.Value();
519 return XN_STATUS_ILLEGAL_POSITION;
522 XnNode* pNode = iter.GetNode();
562 XnUInt32
Size()
const
565 for (Iterator iter =
begin(); iter !=
end(); ++iter, ++nSize)
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
XnUInt16 m_nCurrentBin
Definition: XnHash.h:234
Iterator end()
Definition: XnHash.h:621
XnUInt8 XnHashValue
Definition: XnHash.h:44
XnStatus Remove(const XnKey &key, XnValue &value)
Definition: XnHash.h:465
XnBool operator!=(const ConstIterator &other) const
Definition: XnHash.h:163
XnKey & Key() const
Definition: XnHash.h:293
XnStatus GetInitStatus() const
Definition: XnHash.h:362
XnList ** m_Bins
Definition: XnHash.h:716
XnNode *& Previous()
Definition: XnNode.h:76
XnStatus Get(const XnKey &key, XnValue &value) const
Definition: XnHash.h:442
#define XN_VALIDATE_ALLOC_PTR(x)
Definition: XnOS.h:130
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:58
#define XN_STATUS_OK
Definition: XnStatus.h:35
XnStatus m_nInitStatus
Definition: XnHash.h:721
XnBool operator==(const ConstIterator &other) const
Definition: XnHash.h:153
static XnNode * Allocate()
Definition: XnNode.h:56
XnStatus Clear()
Definition: XnHash.h:542
Iterator & operator++()
Definition: XnHash.h:257
XnList::Iterator m_Iterator
Definition: XnHash.h:236
XnUInt32 XnStatus
Definition: XnStatus.h:32
XnHashFunction m_HashFunction
Definition: XnHash.h:724
XnNode *& Next()
Definition: XnNode.h:67
XnStatus SetHashFunction(XnHashFunction hashFunction)
Definition: XnHash.h:641
Iterator begin()
Definition: XnList.h:449
XnInt32(* XnCompareFunction)(const XnKey &key1, const XnKey &key2)
Definition: XnHash.h:332
Iterator end()
Definition: XnList.h:465
XnStatus AddLast(const XnValue &value)
Definition: XnList.h:278
#define XN_NEW(type,...)
Definition: XnOS.h:328
XnStatus Find(const XnKey &key, ConstIterator &hiter) const
Definition: XnHash.h:578
XnStatus Init()
Definition: XnHash.h:670
friend class ConstIterator
Definition: XnHash.h:322
ConstIterator(const ConstIterator &other)
Definition: XnHash.h:81
ConstIterator & operator++()
Definition: XnHash.h:87
XnValue & Data()
Definition: XnNode.h:85
XnStatus SetCompareFunction(XnCompareFunction compareFunction)
Definition: XnHash.h:658
XnCompareFunction m_CompareFunction
Definition: XnHash.h:726
XnValue & Value() const
Definition: XnHash.h:298
XnStatus Set(const XnKey &key, const XnValue &value)
Definition: XnHash.h:373
#define XN_HASH_NUM_BINS
Definition: XnHash.h:32
#define XN_DELETE_ARR(p)
Definition: XnOS.h:339
XnHash()
Definition: XnHash.h:337
static void Deallocate(XnNode *pNode)
Definition: XnNode.h:57
XnBool IsEmpty() const
Definition: XnHash.h:553
const XnNode * GetNode() const
Definition: XnList.h:159
#define XN_DISABLE_COPY_AND_ASSIGN(TypeName)
Definition: XnMacros.h:117
Iterator rbegin()
Definition: XnList.h:481
#define XN_NEW_ARR(type, count)
Definition: XnOS.h:337
XnValue XnKey
Definition: XnHash.h:39
Iterator(const Iterator &other)
Definition: XnHash.h:252
const XnKey & Key() const
Definition: XnHash.h:171
XnHashValue(* XnHashFunction)(const XnKey &key)
Definition: XnHash.h:328
Iterator & operator--()
Definition: XnHash.h:275
XnNode * GetNode()
Definition: XnHash.h:187
ConstIterator & operator--()
Definition: XnHash.h:116
Iterator begin()
Definition: XnHash.h:605
#define XN_DELETE(p)
Definition: XnOS.h:338
XnUInt32 Size() const
Definition: XnHash.h:561
XnUInt16 m_nMinBin
Definition: XnHash.h:718
const XnHash * m_pHash
Definition: XnHash.h:232
virtual ~XnHash()
Definition: XnHash.h:345
#define XN_HASH_LAST_BIN
Definition: XnHash.h:31
void * XnValue
Definition: XnDataTypes.h:35
const XnValue & Value() const
Definition: XnHash.h:179