diff options
Diffstat (limited to 'thirdparty/bullet/Bullet3Common/b3HashMap.h')
-rw-r--r-- | thirdparty/bullet/Bullet3Common/b3HashMap.h | 252 |
1 files changed, 124 insertions, 128 deletions
diff --git a/thirdparty/bullet/Bullet3Common/b3HashMap.h b/thirdparty/bullet/Bullet3Common/b3HashMap.h index 24a59d9baa..3009e2cf2f 100644 --- a/thirdparty/bullet/Bullet3Common/b3HashMap.h +++ b/thirdparty/bullet/Bullet3Common/b3HashMap.h @@ -13,86 +13,80 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ - #ifndef B3_HASH_MAP_H #define B3_HASH_MAP_H #include "b3AlignedObjectArray.h" - #include <string> ///very basic hashable string implementation, compatible with b3HashMap struct b3HashString { std::string m_string; - unsigned int m_hash; + unsigned int m_hash; - B3_FORCE_INLINE unsigned int getHash()const + B3_FORCE_INLINE unsigned int getHash() const { return m_hash; } - b3HashString(const char* name) - :m_string(name) + : m_string(name) { - /* magic numbers from http://www.isthe.com/chongo/tech/comp/fnv/ */ - static const unsigned int InitialFNV = 2166136261u; + static const unsigned int InitialFNV = 2166136261u; static const unsigned int FNVMultiple = 16777619u; /* Fowler / Noll / Vo (FNV) Hash */ unsigned int hash = InitialFNV; int len = m_string.length(); - for(int i = 0; i<len; i++) + for (int i = 0; i < len; i++) { - hash = hash ^ (m_string[i]); /* xor the low 8 bits */ - hash = hash * FNVMultiple; /* multiply by the magic number */ + hash = hash ^ (m_string[i]); /* xor the low 8 bits */ + hash = hash * FNVMultiple; /* multiply by the magic number */ } m_hash = hash; } - int portableStringCompare(const char* src, const char* dst) const + int portableStringCompare(const char* src, const char* dst) const { - int ret = 0 ; + int ret = 0; - while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) - ++src, ++dst; + while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst) + ++src, ++dst; - if ( ret < 0 ) - ret = -1 ; - else if ( ret > 0 ) - ret = 1 ; + if (ret < 0) + ret = -1; + else if (ret > 0) + ret = 1; - return( ret ); + return (ret); } bool equals(const b3HashString& other) const { return (m_string == other.m_string); } - }; - -const int B3_HASH_NULL=0xffffffff; - +const int B3_HASH_NULL = 0xffffffff; class b3HashInt { - int m_uid; + int m_uid; + public: - b3HashInt(int uid) :m_uid(uid) + b3HashInt(int uid) : m_uid(uid) { } - int getUid1() const + int getUid1() const { return m_uid; } - void setUid1(int uid) + void setUid1(int uid) { m_uid = uid; } @@ -102,34 +96,34 @@ public: return getUid1() == other.getUid1(); } //to our success - B3_FORCE_INLINE unsigned int getHash()const + B3_FORCE_INLINE unsigned int getHash() const { int key = m_uid; // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); return key; } }; - - class b3HashPtr { - - union - { - const void* m_pointer; - int m_hashValues[2]; + union { + const void* m_pointer; + int m_hashValues[2]; }; public: - b3HashPtr(const void* ptr) - :m_pointer(ptr) + : m_pointer(ptr) { } - const void* getPointer() const + const void* getPointer() const { return m_pointer; } @@ -140,65 +134,69 @@ public: } //to our success - B3_FORCE_INLINE unsigned int getHash()const + B3_FORCE_INLINE unsigned int getHash() const { - const bool VOID_IS_8 = ((sizeof(void*)==8)); - - int key = VOID_IS_8? m_hashValues[0]+m_hashValues[1] : m_hashValues[0]; - + const bool VOID_IS_8 = ((sizeof(void*) == 8)); + + int key = VOID_IS_8 ? m_hashValues[0] + m_hashValues[1] : m_hashValues[0]; + // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); return key; } - - }; - template <class Value> class b3HashKeyPtr { - int m_uid; + int m_uid; + public: + b3HashKeyPtr(int uid) : m_uid(uid) + { + } - b3HashKeyPtr(int uid) :m_uid(uid) - { - } - - int getUid1() const - { - return m_uid; - } - - bool equals(const b3HashKeyPtr<Value>& other) const - { - return getUid1() == other.getUid1(); - } - - //to our success - B3_FORCE_INLINE unsigned int getHash()const - { - int key = m_uid; - // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); - return key; - } - - -}; + int getUid1() const + { + return m_uid; + } + bool equals(const b3HashKeyPtr<Value>& other) const + { + return getUid1() == other.getUid1(); + } + + //to our success + B3_FORCE_INLINE unsigned int getHash() const + { + int key = m_uid; + // Thomas Wang's hash + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; + } +}; template <class Value> class b3HashKey { - int m_uid; -public: + int m_uid; - b3HashKey(int uid) :m_uid(uid) +public: + b3HashKey(int uid) : m_uid(uid) { } - int getUid1() const + int getUid1() const { return m_uid; } @@ -208,30 +206,33 @@ public: return getUid1() == other.getUid1(); } //to our success - B3_FORCE_INLINE unsigned int getHash()const + B3_FORCE_INLINE unsigned int getHash() const { int key = m_uid; // Thomas Wang's hash - key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); return key; } }; - ///The b3HashMap template class implements a generic and lightweight hashmap. ///A basic sample of how to use b3HashMap is located in Demos\BasicDemo\main.cpp template <class Key, class Value> class b3HashMap { - protected: - b3AlignedObjectArray<int> m_hashTable; - b3AlignedObjectArray<int> m_next; - - b3AlignedObjectArray<Value> m_valueArray; - b3AlignedObjectArray<Key> m_keyArray; + b3AlignedObjectArray<int> m_hashTable; + b3AlignedObjectArray<int> m_next; + + b3AlignedObjectArray<Value> m_valueArray; + b3AlignedObjectArray<Key> m_keyArray; - void growTables(const Key& /*key*/) + void growTables(const Key& /*key*/) { int newCapacity = m_valueArray.capacity(); @@ -245,7 +246,7 @@ protected: int i; - for (i= 0; i < newCapacity; ++i) + for (i = 0; i < newCapacity; ++i) { m_hashTable[i] = B3_HASH_NULL; } @@ -254,30 +255,28 @@ protected: m_next[i] = B3_HASH_NULL; } - for(i=0;i<curHashtableSize;i++) + for (i = 0; i < curHashtableSize; i++) { //const Value& value = m_valueArray[i]; //const Key& key = m_keyArray[i]; - int hashValue = m_keyArray[i].getHash() & (m_valueArray.capacity()-1); // New hash value with new mask + int hashValue = m_keyArray[i].getHash() & (m_valueArray.capacity() - 1); // New hash value with new mask m_next[i] = m_hashTable[hashValue]; m_hashTable[hashValue] = i; } - - } } - public: - - void insert(const Key& key, const Value& value) { - int hash = key.getHash() & (m_valueArray.capacity()-1); +public: + void insert(const Key& key, const Value& value) + { + int hash = key.getHash() & (m_valueArray.capacity() - 1); //replace value if the key is already there int index = findIndex(key); if (index != B3_HASH_NULL) { - m_valueArray[index]=value; + m_valueArray[index] = value; return; } @@ -291,19 +290,19 @@ protected: { growTables(key); //hash with new capacity - hash = key.getHash() & (m_valueArray.capacity()-1); + hash = key.getHash() & (m_valueArray.capacity() - 1); } m_next[count] = m_hashTable[hash]; m_hashTable[hash] = count; } - void remove(const Key& key) { - - int hash = key.getHash() & (m_valueArray.capacity()-1); + void remove(const Key& key) + { + int hash = key.getHash() & (m_valueArray.capacity() - 1); int pairIndex = findIndex(key); - - if (pairIndex ==B3_HASH_NULL) + + if (pairIndex == B3_HASH_NULL) { return; } @@ -344,7 +343,7 @@ protected: } // Remove the last pair from the hash table. - int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity()-1); + int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity() - 1); index = m_hashTable[lastHash]; b3Assert(index != B3_HASH_NULL); @@ -376,10 +375,8 @@ protected: m_valueArray.pop_back(); m_keyArray.pop_back(); - } - int size() const { return m_valueArray.size(); @@ -399,23 +396,24 @@ protected: return &m_valueArray[index]; } - Key getKeyAtIndex(int index) - { - b3Assert(index < m_keyArray.size()); - return m_keyArray[index]; - } - - const Key getKeyAtIndex(int index) const - { - b3Assert(index < m_keyArray.size()); - return m_keyArray[index]; - } + Key getKeyAtIndex(int index) + { + b3Assert(index < m_keyArray.size()); + return m_keyArray[index]; + } + + const Key getKeyAtIndex(int index) const + { + b3Assert(index < m_keyArray.size()); + return m_keyArray[index]; + } - Value* operator[](const Key& key) { + Value* operator[](const Key& key) + { return find(key); } - const Value* find(const Key& key) const + const Value* find(const Key& key) const { int index = findIndex(key); if (index == B3_HASH_NULL) @@ -425,7 +423,7 @@ protected: return &m_valueArray[index]; } - Value* find(const Key& key) + Value* find(const Key& key) { int index = findIndex(key); if (index == B3_HASH_NULL) @@ -435,10 +433,9 @@ protected: return &m_valueArray[index]; } - - int findIndex(const Key& key) const + int findIndex(const Key& key) const { - unsigned int hash = key.getHash() & (m_valueArray.capacity()-1); + unsigned int hash = key.getHash() & (m_valueArray.capacity() - 1); if (hash >= (unsigned int)m_hashTable.size()) { @@ -453,14 +450,13 @@ protected: return index; } - void clear() + void clear() { m_hashTable.clear(); m_next.clear(); m_valueArray.clear(); m_keyArray.clear(); } - }; -#endif //B3_HASH_MAP_H +#endif //B3_HASH_MAP_H |