hkSmallArray.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_HKSMALLARRAY_H
  9. #define HKBASE_HKSMALLARRAY_H
  10. /// A simple helper class to automatically add and remove references to classes
  11. template <typename TYPE>
  12. class hkRefPtr
  13. {
  14. public:
  15. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE, hkRefPtr<TYPE> );
  16. HK_FORCE_INLINE hkRefPtr()
  17. {
  18. m_pntr = HK_NULL;
  19. }
  20. hkRefPtr (hkFinishLoadedObjectFlag ) {}
  21. HK_FORCE_INLINE hkRefPtr(const hkRefPtr& rp)
  22. {
  23. if ( rp.m_pntr )
  24. {
  25. rp.m_pntr->addReference();
  26. }
  27. m_pntr = rp.m_pntr;
  28. }
  29. HK_FORCE_INLINE hkRefPtr(TYPE* e)
  30. {
  31. if ( e )
  32. {
  33. e->addReference();
  34. }
  35. m_pntr = e;
  36. }
  37. HK_FORCE_INLINE ~hkRefPtr()
  38. {
  39. if ( m_pntr )
  40. {
  41. m_pntr->removeReference();
  42. }
  43. m_pntr = HK_NULL;
  44. }
  45. HK_FORCE_INLINE void operator=(const hkRefPtr& rp)
  46. {
  47. if ( rp.m_pntr )
  48. {
  49. rp.m_pntr->addReference(); // add reference first to allow self-assignment
  50. }
  51. if ( m_pntr )
  52. {
  53. m_pntr->removeReference();
  54. }
  55. m_pntr = rp.m_pntr;
  56. }
  57. HK_FORCE_INLINE void operator=(TYPE* e)
  58. {
  59. if ( e )
  60. {
  61. e->addReference(); // add reference first to allow self-assignment
  62. }
  63. if ( m_pntr )
  64. {
  65. m_pntr->removeReference();
  66. }
  67. m_pntr = e;
  68. }
  69. HK_FORCE_INLINE TYPE* val() const
  70. {
  71. return m_pntr;
  72. }
  73. HK_FORCE_INLINE TYPE* operator->() const
  74. {
  75. return m_pntr;
  76. }
  77. HK_FORCE_INLINE void setAndDontIncrementRefCount( TYPE* e )
  78. {
  79. if ( m_pntr )
  80. {
  81. m_pntr->removeReference();
  82. }
  83. m_pntr = e;
  84. }
  85. HK_FORCE_INLINE operator TYPE*() const
  86. {
  87. return val();
  88. }
  89. private:
  90. TYPE* m_pntr;
  91. };
  92. #ifndef hkArrayAllocator
  93. # define hkArrayAllocator hkThreadMemory::getInstance()
  94. #endif
  95. /// Common functionality for all hkSmallArray types.
  96. /// These are out of line functions to avoid code bloat.
  97. namespace hkSmallArrayUtil
  98. {
  99. void HK_CALL _reserve(void*, int numElem, int sizeElem);
  100. void HK_CALL _reserveMore(void* array, int sizeElem);
  101. }
  102. /// A 14bit array. 
  103. /// Note that, for performance reasons, order may not be preserved when deleting elements.<br>
  104. /// <br>
  105. template <typename T>
  106. class hkSmallArray
  107. {
  108. friend void HK_CALL hkSmallArrayUtil::_reserve(void*, int numElem, int sizeElem);
  109. friend void HK_CALL hkSmallArrayUtil::_reserveMore(void* array, int sizeElem);
  110. public:
  111. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_ARRAY, hkSmallArray<T>);
  112. /// Creates a zero length array.
  113. HK_FORCE_INLINE hkSmallArray();
  114. /// Creates an array of size n. All elements are uninitialized.
  115. explicit HK_FORCE_INLINE hkSmallArray(int size);
  116. /// Deallocates array memory.
  117. HK_FORCE_INLINE ~hkSmallArray();
  118. /// Returns the size.
  119. HK_FORCE_INLINE int getSize() const;
  120. /// Returns the capacity.
  121. HK_FORCE_INLINE int getCapacity() const;
  122. /// Checks if the size is zero.
  123. HK_FORCE_INLINE hkBool isEmpty() const;
  124. /// Checks if the locked flag is set.
  125. /// If an array is locked, the storage has come from file
  126. /// (so the do not deallocate flag is set) but it also 
  127. /// means that the destructor will never be called so if you resize
  128. /// the array you will have to make sure and call clearAndDeallocate() 
  129. /// yourself.
  130. HK_FORCE_INLINE hkBool isLocked();
  131. /// Increments the size by 1 and returns a reference to the first element created.
  132. HK_FORCE_INLINE T& expandOne( );
  133. /// Inserts the array a at index i.
  134. /// See also getSubarray() and the constructor, which uses an existing
  135. /// C style array in place.
  136. void insertAt(int i, const T* p, int numElems );
  137. /// Inserts t at index i.
  138. /// Elements from i to the end are copied up one place.
  139. void insertAt(int i, const T& t);
  140. /// Removes the element at the specified index. The last array element is used to replace the removed element, and the size is reduced by 1.
  141. /// This is very fast, but note that the order of elements is changed.
  142. void removeAt(int index);
  143. /// Removes the element at the specified index, copying elements down one slot as in the STL array.
  144. /// Slower than removeAt(), but the order is unchanged.
  145. void removeAtAndCopy(int index);
  146. /// Read/write access to the i'th element.
  147. HK_FORCE_INLINE T& operator[] (int i);
  148. /// Read only access to the i'th element.
  149. HK_FORCE_INLINE const T& operator[] (int i) const;
  150. /// Returns the index of the first occurrence of t, or -1 if not found.
  151. int indexOf(const T& t) const;
  152. /// Removes the last element.
  153. HK_FORCE_INLINE void popBack( int numElemsToRemove = 1 );
  154. /// Adds an element to the end.
  155. HK_FORCE_INLINE void pushBack(const T& e);
  156. /// Read/write access to the last element.
  157. HK_FORCE_INLINE T& back();
  158. /// Read only access to the last element.
  159. HK_FORCE_INLINE const T& back() const;
  160. /// 
  161. typedef T* iterator;
  162. /// 
  163. typedef const T* const_iterator;
  164. /// Returns an STL-like iterator to the first element.
  165. HK_FORCE_INLINE iterator begin();
  166. /// Returns an STL-like iterator to the 'one past the last' element.
  167. HK_FORCE_INLINE iterator end();
  168. /// Returns an STL-like const iterator to the first element.
  169. HK_FORCE_INLINE const_iterator begin() const;
  170. /// Returns an STL-like const iterator to the 'one past the last' element.
  171. HK_FORCE_INLINE const_iterator end() const;
  172. /// Ensures no reallocation occurs until at least size n.
  173. HK_FORCE_INLINE void reserve(int n);
  174. static void HK_CALL copyBackwards(T* dst, const T* src, int n);
  175. /// Sets the size to zero and deallocates storage.
  176. void clearAndDeallocate();
  177. public:
  178. // Public so that the serialization can access it.
  179. enum
  180. {
  181. CAPACITY_MASK = hkUint16(0x3fff),
  182. FLAG_MASK = hkUint16(0xC000),
  183. DONT_DEALLOCATE_FLAG = hkUint16(0x8000), // Indicates that the storage is not the array's to delete
  184. LOCKED_FLAG = hkUint16(0x4000), // Indicates that the array will never have its dtor called (read in from packfile for instance)
  185. FORCE_SIGNED = -1
  186. };
  187. protected:
  188. friend class hkStatisticsCollector;
  189. hkSmallArray(const hkSmallArray&) { }
  190. void operator=(const hkSmallArray&) { }
  191. void releaseMemory();
  192. T* m_data;
  193. hkUint16 m_size; 
  194. hkUint16 m_capacityAndFlags; // highest 2 bits indicate any special considerations about the allocation for the array
  195. public:
  196. /// For serialization, we want to initialize the vtables 
  197. /// in classes post data load, and NOT call the default constructor 
  198. /// for the arrays (as the data has already been set).
  199. hkSmallArray(hkFinishLoadedObjectFlag f) { }
  200. };
  201. #include <Common/Base/Container/Array/hkSmallArray.inl>
  202. #undef hkArrayAllocator
  203. #endif // HKBASE_HKSMALLARRAY_H
  204. /*
  205. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  206. * Confidential Information of Havok.  (C) Copyright 1999-2009
  207. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  208. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  209. * rights, and intellectual property rights in the Havok software remain in
  210. * Havok and/or its suppliers.
  211. * Use of this software for evaluation purposes is subject to and indicates
  212. * acceptance of the End User licence Agreement for this product. A copy of
  213. * the license is included with this software and is also available at www.havok.com/tryhavok.
  214. */