hkPointerMapBase.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HKBASE_HKPOINTERMAPBASE_H
  9. #define HKBASE_HKPOINTERMAPBASE_H
  10. template <typename KEY, typename VAL>
  11. struct hkPointerMapOperations
  12. {
  13. inline unsigned hash( KEY key, unsigned mod )
  14. {
  15. // We ignore the lowest four bits on the address, since most addresses will be 16-byte aligned
  16. // knuths multiplicative golden hash
  17. return unsigned((hkUlong(key) >> 4) * 2654435761U) & mod;
  18. }
  19. inline void invalidate( KEY& key )
  20. {
  21. key = KEY(-1);
  22. }
  23. inline hkBool32 isValid( KEY key )
  24. {
  25. return key != KEY(-1);
  26. }
  27. inline hkBool32 equal( KEY key0, KEY key1 )
  28. {
  29. return key0 == key1;
  30. }
  31. };
  32. /// A class to map between POD type keys and values.
  33. /// Note that the key must have an invalid or reserved state which is used to mark
  34. /// empty slots. For instance by default -1 is disallowed as a integer key. You can override
  35. /// this behavior by instantiating with a custom operations structure.
  36. template <typename KEY, typename VAL=KEY, typename OPS=hkPointerMapOperations<KEY,VAL> >
  37. class hkPointerMapBase
  38. {
  39. public:
  40. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_MAP, hkPointerMapBase );
  41. /// Iterator type.
  42. /// All iterators are invalidated after a mutating operation. i.e. insertion,removal
  43. typedef class Dummy* Iterator;
  44. # define HK_POINTERMAP_INDEX_TO_ITERATOR(i) reinterpret_cast<Iterator>( hkUlong(i) )
  45. # define HK_POINTERMAP_ITERATOR_TO_INDEX(it) static_cast<int>( reinterpret_cast<hkUlong>(it) )
  46. /// Create an empty pointer map.
  47. hkPointerMapBase();
  48. /// Create an empty pointer map with a pre-allocated amount of space.
  49. hkPointerMapBase(int numElements);
  50. /// Create pointer map initially using preallocated memory block.
  51. /// Use the getSizeInBytesFor(int numKeys) method to find the buffer size
  52. /// required for a given number of keys.
  53. hkPointerMapBase(void* ptr, int sizeInBytes);
  54. /// Destroy a pointer map.
  55. ~hkPointerMapBase();
  56. /// Get an iterator over the keys of this map.
  57. Iterator getIterator() const;
  58. /// Get the key at iterator i.
  59. KEY getKey( Iterator i ) const;
  60. /// Get the value at iterator i.
  61. VAL getValue( Iterator i ) const;
  62. /// Overwrite the value at iterator i.
  63. void setValue( Iterator i, VAL val );
  64. /// Get the next iterator after i.
  65. Iterator getNext( Iterator i ) const;
  66. /// Return if the iterator has not reached the end.
  67. hkBool isValid( Iterator i ) const;
  68. /// Insert key with associated value val. Keys are unique and non zero.
  69. /// If key already exists it is overwritten.
  70. hkBool32 insert( KEY key, VAL val );
  71. /// Get an iterator at 'key'. Check if key was found with isValid().
  72. Iterator findKey( KEY key ) const;
  73. /// If key is present return its iterator, else insert (key,val) and return the new iterator.
  74. /// Thus the returned iterator is always valid.
  75. Iterator findOrInsertKey( KEY key, VAL def );
  76. /// Shortcut for isValid(findKey(key)).
  77. hkBool hasKey( KEY key ) const { return isValid(findKey(key)); }
  78. /// Return the value associated with key or def if not present.
  79. VAL getWithDefault( KEY key, VAL def ) const;
  80. /// If key present, write value into out and return HK_SUCCESS. Otherwise return HK_FAILURE.
  81. hkResult get( KEY key, VAL* out ) const;
  82. /// Remove pair at iterator.
  83. void remove( Iterator it );
  84. /// If key present, remove it and return HK_SUCCESS. Otherwise return HK_FAILURE.
  85. hkResult remove( KEY key );
  86. /// Return the number of keys.
  87. int getSize() const { return m_numElems & static_cast<int>(NUM_ELEMS_MASK); }
  88. /// Return the number of keys possible to store without reallocation.
  89. int getCapacity() const { return (m_hashMod + 1) & static_cast<int>(NUM_ELEMS_MASK); }
  90. /// Return the amount of allocated memory in bytes. Use for statistics.
  91. int getMemSize() const;
  92. /// Return the start address in memory of the hashmap. Use for statistics.
  93. void* getMemStart() const { return m_elem; }
  94. /// Perform an internal consistency check.
  95. hkBool isOk() const;
  96. /// Remove all keys from the map.
  97. void clear();
  98. /// Swap all data with another map.
  99. void swap(hkPointerMapBase& other);
  100. // Estimates and sets the appropriate table size for a given number of elements.
  101. void reserve( int numElements );
  102. /// Return true if the map was constructed with a buffer which was too small.
  103. inline hkBool wasReallocated() const { return ( (m_numElems & static_cast<int>(DONT_DEALLOCATE_FLAG)) == 0 ); }
  104. /// Calculates buffer size required to store the specified number of keys.
  105. static int HK_CALL getSizeInBytesFor(int numOfKeys);
  106. protected:
  107. void resizeTable(int capacity);
  108. protected:
  109. // Internal flags, set in constructor.
  110. enum
  111. {
  112. NUM_ELEMS_MASK = int(0x7FFFFFFF),
  113. DONT_DEALLOCATE_FLAG = int(0x80000000) // Indicates that the storage is not the array's to delete
  114. };
  115. struct Pair
  116. {
  117. KEY key;
  118. VAL val;
  119. };
  120. Pair* m_elem;
  121. int m_numElems; // high bits are flags
  122. int m_hashMod; // capacity - 1
  123. };
  124. #define HK_POINTERMAP_EMPTY_KEY -1
  125. template < typename KEY, typename VAL, typename OPS >
  126. inline typename hkPointerMapBase<KEY,VAL,OPS>::Iterator hkPointerMapBase<KEY,VAL,OPS>::getIterator() const
  127. {
  128. int i;
  129. OPS ops;
  130. for( i = 0; i <= m_hashMod; ++i )
  131. {
  132. if( ops.isValid( m_elem[i].key ) )
  133. {
  134. break;
  135. }
  136. }
  137. return HK_POINTERMAP_INDEX_TO_ITERATOR(i);
  138. }
  139. template < typename KEY, typename VAL, typename OPS >
  140. inline KEY hkPointerMapBase<KEY,VAL,OPS>::getKey(Iterator it) const
  141. {
  142. int i = HK_POINTERMAP_ITERATOR_TO_INDEX(it);
  143. HK_ASSERT(0x7f305156, i>=0 && i<=m_hashMod);
  144. return m_elem[i].key;
  145. }
  146. template < typename KEY, typename VAL, typename OPS >
  147. inline VAL hkPointerMapBase<KEY,VAL,OPS>::getValue(Iterator it) const
  148. {
  149. int i = HK_POINTERMAP_ITERATOR_TO_INDEX(it);
  150. HK_ASSERT(0x7f305156, i>=0 && i<=m_hashMod);
  151. return m_elem[i].val;
  152. }
  153. template < typename KEY, typename VAL, typename OPS >
  154. inline void hkPointerMapBase<KEY,VAL,OPS>::setValue(Iterator it, VAL val)
  155. {
  156. int i = HK_POINTERMAP_ITERATOR_TO_INDEX(it);
  157. HK_ASSERT(0x7f305156, i>=0 && i<=m_hashMod);
  158. m_elem[i].val = val;
  159. }
  160. template < typename KEY, typename VAL, typename OPS >
  161. inline typename hkPointerMapBase<KEY,VAL,OPS>::Iterator hkPointerMapBase<KEY,VAL,OPS>::getNext( Iterator it ) const
  162. {
  163. int i = HK_POINTERMAP_ITERATOR_TO_INDEX(it);
  164. HK_ASSERT(0x7f305156, i>=0 && i<=m_hashMod);
  165. OPS ops;
  166. for( i += 1; i <= m_hashMod; ++i )
  167. {
  168. if( ops.isValid( m_elem[i].key ) )
  169. {
  170. break;
  171. }
  172. }
  173. return HK_POINTERMAP_INDEX_TO_ITERATOR(i);
  174. }
  175. template < typename KEY, typename VAL, typename OPS >
  176. inline hkBool hkPointerMapBase<KEY,VAL,OPS>::isValid( Iterator it ) const
  177. {
  178. // range [0, hashMod] is valid
  179. // hashMod+1 invalid
  180. // anything else is bad input
  181. int i = HK_POINTERMAP_ITERATOR_TO_INDEX(it);
  182. HK_ASSERT(0x7f305156, i>=0 && i<=m_hashMod+1);
  183. return i <= m_hashMod;
  184. }
  185. #endif // HKBASE_HKPOINTERMAPBASE_H
  186. /*
  187. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  188. * Confidential Information of Havok.  (C) Copyright 1999-2009
  189. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  190. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  191. * rights, and intellectual property rights in the Havok software remain in
  192. * Havok and/or its suppliers.
  193. * Use of this software for evaluation purposes is subject to and indicates
  194. * acceptance of the End User licence Agreement for this product. A copy of
  195. * the license is included with this software and is also available at www.havok.com/tryhavok.
  196. */