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

其他游戏

开发平台:

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_HKPOINTERMAP_H
  9. #define HKBASE_HKPOINTERMAP_H
  10. #include <Common/Base/Container/PointerMap/hkPointerMapBase.h>
  11. // Helpers to get the hkPointerMapBase implementation for a given key size.
  12. template<int N> 
  13. struct hkPointerMapStorage    
  14. typedef hkUlong Type; 
  15. };
  16. template<>      
  17. struct hkPointerMapStorage<8> 
  18. typedef hkUint64 Type; 
  19. };
  20. /// A class to map between non-zero pointer or integer keys and arbitrary pointer/integer values.
  21. template <typename K, typename V>
  22. class hkPointerMap
  23. {
  24. public:
  25. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_MAP, hkPointerMap );
  26. typedef typename hkPointerMapStorage<sizeof(K)>::Type Storage;
  27. /// Iterator class
  28. /// All iterators are invalidated after a mutating operation. i.e. insertion,removal
  29. typedef typename hkPointerMapBase<Storage, Storage>::Iterator Iterator;
  30. /// Create an empty pointermap.
  31. hkPointerMap()
  32. {
  33. }
  34. /// Create pointer map initially using preallocated memory block.
  35. /// Use the getSizeInBytesFor(int numKeys) method to find the buffer size
  36. /// required for a given number of keys.
  37. hkPointerMap(void* ptr, int sizeInBytes) : m_map(ptr, sizeInBytes)
  38. {
  39. }
  40. /// Insert key with associated value val. Keys are unique and non null.
  41. /// If key already exists it is overwritten. Returns true if the key is new
  42. /// and false if an existing key was overwritten.
  43. HK_FORCE_INLINE hkBool32 insert( K key, V val )
  44. {
  45. return m_map.insert( Storage(key), Storage(val) );
  46. }
  47. /// Return the iterator associated with key or the end iterator if not present.
  48. HK_FORCE_INLINE Iterator findKey( K key ) const
  49. {
  50. return m_map.findKey( Storage(key) );
  51. }
  52. /// If key is present return its iterator, else insert (key,val) and return the new iterator.
  53. /// Thus the returned iterator is always valid.
  54. HK_FORCE_INLINE Iterator findOrInsertKey( K key, V val )
  55. {
  56. return m_map.findOrInsertKey( Storage(key), Storage(val) );
  57. }
  58. /// Return if this map contains the given key.
  59. HK_FORCE_INLINE hkBool hasKey( K key ) const
  60. {
  61. return m_map.hasKey( Storage(key) );
  62. }
  63. /// Return the value associated with key or def if not present.
  64. HK_FORCE_INLINE V getWithDefault( K key, V def ) const
  65. {
  66. return (V)m_map.getWithDefault( Storage(key), Storage(def) );
  67. }
  68. /// If key present, write value into out and return HK_SUCCESS. Else return HK_FAILURE.
  69. hkResult get( K key, V* out ) const
  70. {
  71. Storage tmp;
  72. if( m_map.get( Storage(key), &tmp ) == HK_SUCCESS )
  73. {
  74. *out = V(tmp);
  75. return HK_SUCCESS;
  76. }
  77. return HK_FAILURE;
  78. }
  79. /// Remove pair at it.
  80. void remove( Iterator it )
  81. {
  82. m_map.remove( it );
  83. }
  84. /// If key present, remove it and return HK_SUCCESS. Otherwise return HK_FAILURE.
  85. hkResult remove( K key )
  86. {
  87. return m_map.remove( Storage(key) );
  88. }
  89. /// Return the number of elements in this map.
  90. int getSize() const
  91. {
  92. return m_map.getSize();
  93. }
  94. /// Return the number of elements that can be stored in this map without reallocation.
  95. int getCapacity() const
  96. {
  97. return m_map.getCapacity();
  98. }
  99. /// Return the amount of allocated memory in bytes. Use for statistics.
  100. int getMemSize() const 
  101. return m_map.getMemSize(); 
  102. }
  103. /// Return the start address in memory of the hashmap. Use for statistics.
  104. void* getMemStart() const 
  105. return m_map.getMemStart(); 
  106. }
  107. /// Perform internal consistency check.
  108. hkBool isOk() const
  109. {
  110. return m_map.isOk();
  111. }
  112. /// Get an iterator over the keys of this map.
  113. Iterator getIterator() const
  114. {
  115. return m_map.getIterator();
  116. }
  117. /// Get the key at iterator i.
  118. K getKey( Iterator i ) const
  119. {
  120. return (K)m_map.getKey(i);
  121. }
  122. /// Get the value at iterator i.
  123. V getValue( Iterator i ) const
  124. {
  125. return (V)m_map.getValue(i);
  126. }
  127. /// Overwrite the value at iterator i.
  128. void setValue( Iterator i, V val )
  129. {
  130. m_map.setValue(i, Storage(val) );
  131. }
  132. /// Get the next iterator after i.
  133. Iterator getNext( Iterator i ) const
  134. {
  135. return m_map.getNext(i);
  136. }
  137. /// Return if the iterator has reached the end.
  138. hkBool isValid( Iterator i ) const
  139. {
  140. return m_map.isValid(i);
  141. }
  142. /// clear the table
  143. void clear()
  144. {
  145. m_map.clear();
  146. }
  147. /// Estimates and sets the appropriate table size for a given number of elements.
  148. void reserve( int numElements )
  149. {
  150. m_map.reserve(numElements);
  151. }
  152. /// Swap the internal representation with another map.
  153. void swap( hkPointerMap& other )
  154. {
  155. m_map.swap( other.m_map );
  156. }
  157. /// Return true if the map was constructed with a buffer which was too small.
  158. inline hkBool wasReallocated() const { return m_map.wasReallocated(); }
  159. /// Calculates buffer size required to store the specified number of keys.
  160. static int HK_CALL getSizeInBytesFor(int numOfKeys) { return hkPointerMapBase<Storage,Storage>::getSizeInBytesFor(numOfKeys); }
  161. private:
  162. void operator = (const hkPointerMap<K,V>& map) {}
  163. hkPointerMap ( const hkPointerMap<K,V>& map ) {}
  164. public:
  165. protected:
  166. hkPointerMapBase<Storage,Storage> m_map;
  167. };
  168. #endif // HKBASE_HKPOINTERMAP_H
  169. /*
  170. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  171. * Confidential Information of Havok.  (C) Copyright 1999-2009
  172. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  173. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  174. * rights, and intellectual property rights in the Havok software remain in
  175. * Havok and/or its suppliers.
  176. * Use of this software for evaluation purposes is subject to and indicates
  177. * acceptance of the End User licence Agreement for this product. A copy of
  178. * the license is included with this software and is also available at www.havok.com/tryhavok.
  179. */