hkSmallArray.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 T>
  9. HK_FORCE_INLINE hkSmallArray<T>::hkSmallArray()
  10. : m_data(HK_NULL),
  11. m_size(0),
  12. m_capacityAndFlags(DONT_DEALLOCATE_FLAG)
  13. {
  14. }
  15. template <typename T>
  16. HK_FORCE_INLINE hkSmallArray<T>::hkSmallArray(int n)
  17. : m_data( static_cast<T*>(hkArrayAllocator.allocateChunk(n * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY))),
  18. m_size(hkUint16(n)),
  19. m_capacityAndFlags(hkUint16(n))
  20. {
  21. }
  22. template <typename T>
  23. HK_FORCE_INLINE hkSmallArray<T>::~hkSmallArray()
  24. {
  25. releaseMemory();
  26. }
  27. template <typename T>
  28. HK_FORCE_INLINE void hkSmallArray<T>::clearAndDeallocate()
  29. {
  30. releaseMemory();
  31. m_data = HK_NULL;
  32. m_size = 0;
  33. m_capacityAndFlags = hkUint16(DONT_DEALLOCATE_FLAG | (m_capacityAndFlags & LOCKED_FLAG));
  34. }
  35. template <typename T>
  36. HK_FORCE_INLINE T& hkSmallArray<T>::operator[] (int i)
  37. {
  38. HK_ASSERT(0x394e9c6c,  i >= 0 && i < m_size );
  39. return m_data[i];
  40. }
  41. template <typename T>
  42. HK_FORCE_INLINE const T& hkSmallArray<T>::operator[] (int i) const
  43. {
  44. HK_ASSERT(0x264718f3,  i >= 0 && i < m_size  );
  45. return m_data[i];
  46. }
  47. template <typename T>
  48. HK_FORCE_INLINE int hkSmallArray<T>::getSize() const
  49. {
  50. return m_size;
  51. }
  52. template <typename T>
  53. HK_FORCE_INLINE int hkSmallArray<T>::getCapacity() const
  54. {
  55. return (m_capacityAndFlags & static_cast<int>(CAPACITY_MASK));
  56. }
  57. template <typename T>
  58. HK_FORCE_INLINE T& hkSmallArray<T>::back()
  59. {
  60. HK_ASSERT(0x52595f9b, m_size );
  61. return m_data[ m_size - 1 ];
  62. }
  63. template <typename T>
  64. HK_FORCE_INLINE const T& hkSmallArray<T>::back() const
  65. {
  66. HK_ASSERT(0x6e984e36, m_size );
  67. return m_data[ m_size -1 ];
  68. }
  69. template <typename T>
  70. HK_FORCE_INLINE hkBool hkSmallArray<T>::isEmpty() const
  71. {
  72. return m_size == 0;
  73. }
  74. template <typename T>
  75. HK_FORCE_INLINE void hkSmallArray<T>::releaseMemory()
  76. {
  77. if( (m_capacityAndFlags & DONT_DEALLOCATE_FLAG) == 0)
  78. {
  79. hkArrayAllocator.deallocateChunk( m_data, getCapacity() * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY);
  80. }
  81. }
  82. template <typename T>
  83. HK_FORCE_INLINE void hkSmallArray<T>::removeAt(int i)
  84. {
  85. HK_ASSERT(0x63bab20a,  i >= 0 && i < m_size);
  86. m_size--;
  87. m_data[i] = m_data[m_size];
  88. }
  89. template <typename T>
  90. HK_FORCE_INLINE void hkSmallArray<T>::removeAtAndCopy(int index)
  91. {
  92. HK_ASSERT(0x453a6437,  index >= 0 && index < m_size);
  93. m_size--;
  94. for(int i = index; i < m_size; ++i)
  95. {
  96. m_data[i] = m_data[i+1];
  97. }
  98. }
  99. template <typename T>
  100. HK_FORCE_INLINE int hkSmallArray<T>::indexOf(const T& t) const
  101. {
  102. for(int i = 0; i < m_size; ++i)
  103. {
  104. if( m_data[i] == t )
  105. {
  106. return i;
  107. }
  108. }
  109. return -1;
  110. }
  111. template <typename T>
  112. HK_FORCE_INLINE T& hkSmallArray<T>::expandOne( )
  113. {
  114. if(m_size == getCapacity())
  115. {
  116. #ifdef HK_DEBUG
  117. if ( isLocked() )
  118. HK_WARN(0xf3768206, "hkSmallArray::expandOne on locked array. Destructor (memory dealloc) will not be called.");
  119. #endif
  120. hkSmallArrayUtil::_reserveMore( this, sizeof(T) );
  121. }
  122. return m_data[m_size++];
  123. }
  124. template <typename T>
  125. HK_FORCE_INLINE void hkSmallArray<T>::pushBack(const T& t)
  126. {
  127. if(m_size == getCapacity())
  128. {
  129. #ifdef HK_DEBUG
  130. if ( isLocked() )
  131. HK_WARN(0xf3768206, "hkArray::pushBack on locked array. Destructor (memory dealloc) will not be called.");
  132. #endif
  133. hkSmallArrayUtil::_reserveMore( this, sizeof(T) );
  134. }
  135. m_data[m_size++] = t;
  136. }
  137. template <typename T>
  138. typename hkSmallArray<T>::iterator hkSmallArray<T>::begin() 
  139. {
  140. return m_data;
  141. }
  142. template <typename T>
  143. typename hkSmallArray<T>::iterator hkSmallArray<T>::end()
  144. {
  145. return m_data + m_size;
  146. }
  147. template <typename T>
  148. typename hkSmallArray<T>::const_iterator hkSmallArray<T>::begin() const
  149. {
  150. return m_data;
  151. }
  152. template <typename T>
  153. typename hkSmallArray<T>::const_iterator hkSmallArray<T>::end() const
  154. {
  155. return m_data + m_size;
  156. }
  157. template <typename T>
  158. hkBool hkSmallArray<T>::isLocked()
  159. {
  160. return (m_capacityAndFlags & LOCKED_FLAG) != 0;
  161. }
  162. template <typename T>
  163. HK_FORCE_INLINE void HK_CALL hkSmallArray<T>::copyBackwards(T* dst, const T* src, int n)
  164. {
  165. for(int i = n-1; i >= 0; --i)
  166. {
  167. dst[i] = src[i];
  168. }
  169. }
  170. template <typename T>
  171. HK_FORCE_INLINE void hkSmallArray<T>::reserve(int n)
  172. {
  173. const int capacity = getCapacity();
  174. if( capacity < n)
  175. {
  176. #ifdef HK_DEBUG
  177. if ( isLocked() )
  178. HK_WARN(0xf3768206, "hkArray::reserve on locked array. Destructor (memory dealloc) will not be called.");
  179. #endif
  180. int cap2 = 2 * capacity;
  181. int newSize = (n < cap2) ? cap2 : n;
  182. hkSmallArrayUtil::_reserve(this, newSize, sizeof(T));
  183. }
  184. }
  185. template <typename T>
  186. void hkSmallArray<T>::insertAt(int index, const T* p, int numtoinsert)
  187. {
  188. HK_ASSERT(0x4cbc67c5,  index >= 0 && index <= getSize() );
  189. const int newsize     = numtoinsert + m_size;
  190. const int numtomove   = m_size - index;
  191. if(newsize > getCapacity())
  192. {
  193. // note double copy from [i:end] not a problem in practice
  194. reserve(newsize); // will warn if locked.
  195. }
  196. copyBackwards(m_data + index + numtoinsert, m_data + index, numtomove);
  197. copyBackwards(m_data + index,               p,  numtoinsert);
  198. m_size = hkUint16(newsize);
  199. }
  200. template <typename T>
  201. void hkSmallArray<T>::insertAt(int i, const T& t)
  202. {
  203. insertAt(i, &t, 1 );
  204. }
  205. template <typename T>
  206. HK_FORCE_INLINE void hkSmallArray<T>::popBack( int numRemove )
  207. {
  208. HK_ASSERT(0x5b57310e, m_size >= hkUint16(numRemove) );
  209. m_size = hkUint16(m_size - numRemove);
  210. }
  211. /*
  212. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  213. * Confidential Information of Havok.  (C) Copyright 1999-2009
  214. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  215. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  216. * rights, and intellectual property rights in the Havok software remain in
  217. * Havok and/or its suppliers.
  218. * Use of this software for evaluation purposes is subject to and indicates
  219. * acceptance of the End User licence Agreement for this product. A copy of
  220. * the license is included with this software and is also available at www.havok.com/tryhavok.
  221. */