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

其他游戏

开发平台:

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. hkQueue<T>::hkQueue()
  10. : m_data( HK_NULL ),
  11. m_capacity( 0 ),
  12. m_head(0),
  13. m_tail(0),
  14. m_elementsInUse(0)
  15. {
  16. }
  17. template <typename T>
  18. hkQueue<T>::hkQueue( int n  )
  19. : m_data(hkAllocateChunk<T>( n , HK_MEMORY_CLASS_ARRAY )),
  20. m_capacity(n),
  21. m_head(0),
  22. m_tail(0),
  23. m_elementsInUse(0)
  24. {
  25. HK_ASSERT2( 0x4091ba45, n > 0, "this constructor is not appropriate for zero initial capacity" );
  26. }
  27. template <typename T>
  28. hkQueue<T>::~hkQueue()
  29. {
  30. releaseMemory();
  31. }
  32. template <typename T>
  33. inline hkBool hkQueue<T>::isEmpty() const
  34. {
  35. return m_elementsInUse == 0;
  36. }
  37. template <typename T>
  38. inline int hkQueue<T>::getSize() const
  39. {
  40. return m_elementsInUse;
  41. }
  42. template <typename T>
  43. inline int hkQueue<T>::getCapacity() const
  44. {
  45. return m_capacity;
  46. }
  47. template <typename T>
  48. inline void hkQueue<T>::clear()
  49. {
  50. m_head = 0;
  51. m_tail = 0;
  52. m_elementsInUse = 0;
  53. }
  54. template <typename T>
  55. inline void hkQueue<T>::releaseMemory()
  56. {
  57. if( m_capacity )
  58. {
  59. hkDeallocateChunk<T>( m_data, m_capacity, HK_MEMORY_CLASS_ARRAY );
  60. }
  61. }
  62. template <typename T>
  63. inline void hkQueue<T>::setCapacity( int n )
  64. {
  65. if( m_capacity < n)
  66. {
  67. // allocate a new buffer and copy existing data over
  68. if ( m_capacity * 2 >= n)
  69. {
  70. n = m_capacity * 2;
  71. }
  72. T* p = hkAllocateChunk<T>( n , HK_MEMORY_CLASS_ARRAY );
  73. if( m_data != HK_NULL )
  74. {
  75. if ( m_elementsInUse)
  76. {
  77. if ( m_tail <= m_head )
  78. {
  79. // split
  80. int numHead = m_capacity - m_head;
  81. int numTail = m_tail;
  82. hkString::memCpy( p, m_data+m_head, ( sizeof(T) * numHead ) );
  83. hkString::memCpy( p + numHead, m_data, ( sizeof(T) * numTail ) );
  84. }
  85. else
  86. {
  87. // one block
  88. hkString::memCpy( p, m_data+m_head, ( sizeof(T) * m_elementsInUse ) );
  89. }
  90. }
  91. m_head = 0;
  92. m_tail = m_elementsInUse;
  93. }
  94. // release the old buffer
  95. releaseMemory();
  96. // assign to new buffer and set capacity
  97. m_data = (T*)p;
  98. m_capacity = n;
  99. }
  100. }
  101. template <typename T>
  102. inline void hkQueue<T>::increaseCapacity( )
  103. {
  104. if( m_capacity == 0 )
  105. {
  106. // if there is no current capacity default to 8 elements
  107. setCapacity( 8 );
  108. }
  109. else
  110. {
  111. setCapacity( m_capacity * 2 );
  112. }
  113. }
  114. // Places a new element to the back of the queue and expand storage if necessary.
  115. template <typename T>
  116. inline void hkQueue<T>::enqueue( const T& element )
  117. {
  118.     if( m_elementsInUse >= m_capacity )
  119.     {
  120.     increaseCapacity();
  121.     }
  122. if( m_tail == m_capacity )
  123. {
  124. m_tail = 0;
  125. }
  126. m_data[m_tail++] = element;
  127. m_elementsInUse++;
  128. }
  129. // Places a new element to the front of the queue and expand storage if necessary.
  130. template <typename T>
  131. inline void hkQueue<T>::enqueueInFront( const T& element )
  132. {
  133.     if( m_elementsInUse >= m_capacity )
  134.     {
  135.     increaseCapacity();
  136.     }
  137.     if( m_head == 0 )
  138.     {
  139.     m_head = m_capacity;
  140.     }
  141.     m_data[--m_head] = element;
  142.     m_elementsInUse++;
  143. }
  144. template <typename T>
  145. inline void hkQueue<T>::dequeue( T& data )
  146. {
  147.     HK_ASSERT(0xf032ed23, m_elementsInUse );
  148.     {
  149.     data = m_data[m_head];
  150. #if defined(HK_PLATFORM_SIM)
  151. hkString::memSet(&m_data[m_head], 0xdf, sizeof(T));
  152. #endif
  153.     if( ++m_head == m_capacity )
  154.     {
  155.     m_head = 0;
  156.     }
  157.     m_elementsInUse--;
  158.     }
  159. }
  160. template <typename T>
  161. inline void hkQueue<T>::peek( T& data ) const
  162. {
  163. data = m_data[m_head];
  164. }
  165. /*
  166. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  167. * Confidential Information of Havok.  (C) Copyright 1999-2009
  168. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  169. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  170. * rights, and intellectual property rights in the Havok software remain in
  171. * Havok and/or its suppliers.
  172. * Use of this software for evaluation purposes is subject to and indicates
  173. * acceptance of the End User licence Agreement for this product. A copy of
  174. * the license is included with this software and is also available at www.havok.com/tryhavok.
  175. */