hkPointerMultiMap.inl
上传用户: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. template <typename KEY, typename VALUE>
  9. int hkPointerMultiMap<KEY,VALUE>::getFreeIndex()
  10. {
  11. int i;
  12. if( m_freeChainStart != -1 )
  13. {
  14. i = m_freeChainStart;
  15. m_freeChainStart = m_valueChain[m_freeChainStart].next;
  16. }
  17. else
  18. {
  19. i = m_valueChain.getSize();
  20. m_valueChain.expandOne();
  21. }
  22. return i;
  23. }
  24. template <typename KEY, typename VALUE>
  25. int hkPointerMultiMap<KEY,VALUE>::getFirstIndex( KEY k ) const
  26. {
  27. return m_indexMap.getWithDefault(k, -1);
  28. }
  29. template <typename KEY, typename VALUE>
  30. hkBool32 hkPointerMultiMap<KEY,VALUE>::insert( KEY k, const VALUE& value )
  31. {
  32. int chainIndex = m_indexMap.getWithDefault(k, -1);
  33. int thisIndex = getFreeIndex();
  34. Value& ref = m_valueChain[thisIndex];
  35. ref.value = value;
  36. ref.next = chainIndex;
  37. return m_indexMap.insert( k, thisIndex );
  38. }
  39. template <typename KEY, typename VALUE>
  40. int hkPointerMultiMap<KEY,VALUE>::addPendingValue( const VALUE& value, int nextIndex )
  41. {
  42. int thisIndex = getFreeIndex();
  43. Value& v = m_valueChain[thisIndex];
  44. v.value = value;
  45. v.next = nextIndex;
  46. return thisIndex;
  47. }
  48. template <typename KEY, typename VALUE>
  49. void hkPointerMultiMap<KEY,VALUE>::realizePendingKey( KEY k, int index )
  50. {
  51. HK_ASSERT(0x66e29b43, m_indexMap.hasKey(k) == false );
  52. HK_ASSERT(0x71031385, m_valueChain[index].next || 1 ); // assert index ok
  53. m_indexMap.insert(k, index);
  54. }
  55. template <typename KEY, typename VALUE>
  56. int hkPointerMultiMap<KEY,VALUE>::getNumKeys() const
  57. {
  58. return m_indexMap.getSize();
  59. }
  60. template <typename KEY, typename VALUE>
  61. void hkPointerMultiMap<KEY,VALUE>::clear()
  62. {
  63. m_valueChain.clear();
  64. m_indexMap.clear();
  65. m_freeChainStart = -1;
  66. }
  67. template <typename KEY, typename VALUE>
  68. int hkPointerMultiMap<KEY,VALUE>::removeByIndex( KEY key, int removeIndex )
  69. {
  70. #ifdef HK_DEBUG
  71. {
  72. int i = m_indexMap.getWithDefault( key, -2 );
  73. HK_ASSERT2(0, i != -2, "key is not in map");
  74. while( i != -1 && i != removeIndex )
  75. {
  76. i = m_valueChain[i].next;
  77. }
  78. HK_ASSERT2(0, i != -1, "value is not accessible from key");
  79. }
  80. #endif
  81. // To remove from singly linked list, overwrite
  82. // current with next and actually remove next.
  83. // Thus we avoid linear search for parent pointer.
  84. int nextIndex = m_valueChain[removeIndex].next; // retIndex == index to return
  85. int freeIndex = nextIndex; // freeIndex == index to add to free list at end
  86. if( nextIndex != -1 )
  87. {
  88. m_valueChain[removeIndex] = m_valueChain[nextIndex];
  89. nextIndex = removeIndex;
  90. }
  91. else // we are the tail element in chain
  92. {
  93. hkPointerMap<void*, int>::Iterator it = m_indexMap.findKey(key);
  94. int headIndex = m_indexMap.getValue(it);
  95. if( headIndex == removeIndex )
  96. {
  97. // head == tail. list empty after removal
  98. m_indexMap.setValue(it, -1);
  99. freeIndex = removeIndex;
  100. removeIndex = -1;
  101. }
  102. else if( m_valueChain[headIndex].next == removeIndex )
  103. {
  104. // head.next == tail. only one element (head) left after removal, we can take a shortcut
  105. m_valueChain[headIndex].next = -1;
  106. freeIndex = removeIndex;
  107. }
  108. else
  109. {
  110. // >=1 elements between head and tail. head moves to tail.
  111. m_indexMap.setValue(it, m_valueChain[headIndex].next);
  112. m_valueChain[removeIndex].value = m_valueChain[headIndex].value;
  113. freeIndex = headIndex;
  114. }
  115. }
  116. // add the freed index to the free list
  117. m_valueChain[freeIndex].next = m_freeChainStart;
  118. m_freeChainStart = freeIndex;
  119. return nextIndex;
  120. }
  121. template <typename KEY, typename VALUE>
  122. void hkPointerMultiMap<KEY,VALUE>::removeByValue( KEY key, const VALUE& v )
  123. {
  124. for( int i = getFirstIndex(key);
  125. i != -1;
  126. i = getNextIndex(i) )
  127. {
  128. if( getValue(i) == v )
  129. {
  130. removeByIndex(key, i);
  131. return;
  132. }
  133. }
  134. HK_ASSERT2(0x72ca9f58, 0, "value not in map");
  135. }
  136. template <typename KEY, typename VALUE>
  137. void hkPointerMultiMap<KEY,VALUE>::removeKey( KEY key )
  138. {
  139. hkPointerMap<void*, int>::Iterator it = m_indexMap.findKey(key);
  140. HK_ASSERT(0x17f621ad, m_indexMap.isValid(it) );
  141. int start = m_indexMap.getValue(it);
  142. m_indexMap.remove(it);
  143. if( start != -1 )
  144. {
  145. int end = start;
  146. while( m_valueChain[end].next != -1 )
  147. {
  148. end = m_valueChain[end].next;
  149. }
  150. m_valueChain[end].next = m_freeChainStart;
  151. m_freeChainStart = start;
  152. }
  153. }
  154. template <typename KEY, typename VALUE>
  155. void hkPointerMultiMap<KEY,VALUE>::changeKey( KEY oldKey, KEY newKey )
  156. {
  157. hkPointerMap<void*, int>::Iterator it = m_indexMap.findKey(oldKey);
  158. HK_ASSERT(0x17f621ad, m_indexMap.isValid(it) );
  159. int start = m_indexMap.getValue(it);
  160. m_indexMap.remove(it);
  161. HK_ASSERT(0x6ebd7acf, m_indexMap.hasKey(newKey) == false);
  162. m_indexMap.insert( newKey, start );
  163. }
  164. /*
  165. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  166. * Confidential Information of Havok.  (C) Copyright 1999-2009
  167. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  168. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  169. * rights, and intellectual property rights in the Havok software remain in
  170. * Havok and/or its suppliers.
  171. * Use of this software for evaluation purposes is subject to and indicates
  172. * acceptance of the End User licence Agreement for this product. A copy of
  173. * the license is included with this software and is also available at www.havok.com/tryhavok.
  174. */