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

其他游戏

开发平台:

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 T& hkArray<T>::operator[] (int i)
  10. {
  11. HK_ASSERT(0x394e9c6c,  i >= 0 && i < m_size );
  12. return m_data[i];
  13. }
  14. template <typename T>
  15. HK_FORCE_INLINE const T& hkArray<T>::operator[] (int i) const
  16. {
  17. HK_ASSERT(0x264718f3,  i >= 0 && i < m_size  );
  18. return m_data[i];
  19. }
  20. template <typename T>
  21. HK_FORCE_INLINE T& hkArray<T>::back()
  22. {
  23. HK_ASSERT(0x52595f9b, m_size );
  24. return m_data[ m_size - 1 ];
  25. }
  26. template <typename T>
  27. HK_FORCE_INLINE const T& hkArray<T>::back() const
  28. {
  29. HK_ASSERT(0x6e984e36, m_size );
  30. return m_data[ m_size -1 ];
  31. }
  32. template <typename T>
  33. HK_FORCE_INLINE int hkArray<T>::getSize() const
  34. {
  35. return m_size;
  36. }
  37. template <typename T>
  38. HK_FORCE_INLINE int hkArray<T>::getCapacity() const
  39. {
  40. return (m_capacityAndFlags & static_cast<int>(CAPACITY_MASK));
  41. }
  42. template <typename T>
  43. HK_FORCE_INLINE int hkArray<T>::getCapacityAndFlags() const
  44. {
  45.     return m_capacityAndFlags;
  46. }
  47. template <typename T>
  48. HK_FORCE_INLINE hkBool hkArray<T>::isEmpty() const
  49. {
  50. return m_size == 0;
  51. }
  52. template <typename T>
  53. HK_FORCE_INLINE void hkArray<T>::clear()
  54. {
  55. m_size = 0;
  56. }
  57. template <typename T>
  58. HK_FORCE_INLINE void HK_CALL hkArray<T>::copy(T* dst, const T* src, int n)
  59. {
  60. HK_ASSERT(0x4543e433, ( dst <= src) || (src+n <= dst) );
  61. for(int i = 0; i < n; ++i)
  62. {
  63. dst[i] = src[i];
  64. }
  65. }
  66. template <typename T>
  67. HK_FORCE_INLINE void HK_CALL hkArray<T>::copyBackwards(T* dst, const T* src, int n)
  68. {
  69. HK_ASSERT(0x4543e434, (dst >= src) || (dst+n <= src) );
  70. for(int i = n-1; i >= 0; --i)
  71. {
  72. dst[i] = src[i];
  73. }
  74. }
  75. template <typename T>
  76. HK_FORCE_INLINE hkArray<T>::hkArray()
  77. : m_data(HK_NULL),
  78. m_size(0),
  79. m_capacityAndFlags(DONT_DEALLOCATE_FLAG)
  80. {
  81. }
  82. template <typename T>
  83. HK_FORCE_INLINE hkArray<T>::hkArray(int n)
  84. : m_data( static_cast<T*>(hkArrayAllocator.allocateChunk(n * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY))),
  85. m_size(n),
  86. m_capacityAndFlags(n)
  87. {
  88. }
  89. template <typename T>
  90. HK_FORCE_INLINE hkArray<T>::hkArray(int n, const T& t)
  91. : m_data( static_cast<T*>(hkArrayAllocator.allocateChunk(n * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY))),
  92. m_size(n),
  93. m_capacityAndFlags(n)
  94. {
  95. for(int i = 0; i < n; ++i)
  96. {
  97. m_data[i] = t;
  98. }
  99. }
  100. template <typename T>
  101. HK_FORCE_INLINE hkArray<T>::hkArray(const hkArray& a)
  102. {
  103. m_data = static_cast<T*>( hkArrayAllocator.allocateChunk( a.getSize() * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY));
  104. m_size = a.m_size;
  105. m_capacityAndFlags = a.m_size;
  106. copy(m_data, a.m_data, a.m_size);
  107. }
  108. template <typename T>
  109. HK_FORCE_INLINE void hkArray<T>::releaseMemory()
  110. {
  111. if( (m_capacityAndFlags & DONT_DEALLOCATE_FLAG) == 0)
  112. {
  113. hkArrayAllocator.deallocateChunk( m_data, getCapacity() * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY);
  114. }
  115. }
  116. template <typename T>
  117. void hkArray<T>::useExternalArray(T* buf, int capacity)
  118. {
  119. HK_ASSERT(0x32f5348d, (m_data==HK_NULL) || (m_capacityAndFlags&DONT_DEALLOCATE_FLAG) );
  120. m_data = static_cast<T*>(buf);
  121. m_size = 0;
  122. m_capacityAndFlags = capacity | DONT_DEALLOCATE_FLAG;
  123. }
  124. template <typename T>
  125. void hkArray<T>::useExternalBuffer(void* buf, int numBytes)
  126. {
  127. useExternalArray( static_cast<T*>(buf), numBytes/sizeof(T) );
  128. }
  129. template <typename T>
  130. HK_FORCE_INLINE hkArray<T>& hkArray<T>::operator= (const hkArray<T>& a)
  131. {
  132. if(getCapacity() < a.m_size)
  133. {
  134. #ifdef HK_DEBUG
  135. if ( isLocked() )
  136. HK_WARN(0xf3768206, "hkArray::operator= to array of larger size on a locked array. Destructor (memory dealloc) will not be called.");
  137. #endif
  138. releaseMemory();
  139. m_data = static_cast<T*>( hkArrayAllocator.allocateChunk( a.m_size * hkSizeOf(T), HK_MEMORY_CLASS_ARRAY));
  140. m_capacityAndFlags = a.m_size | (m_capacityAndFlags & static_cast<int>(LOCKED_FLAG)); // keep locked flag
  141. }
  142. m_size = a.m_size;
  143. copy(m_data, a.m_data, m_size);
  144. return *this;
  145. }
  146. template <typename T, unsigned N>
  147. hkArray<T>& hkInplaceArray<T,N>::operator= (const hkArray<T>& a)
  148. {
  149. return hkArray<T>::operator=(a);
  150. }
  151. template <typename T, unsigned N>
  152. hkArray<T>& hkInplaceArray<T,N>::operator= (const hkInplaceArray<T,N>& a)
  153. {
  154. return hkArray<T>::operator=(a);
  155. }
  156. template <typename T, unsigned N>
  157. hkBool hkInplaceArray<T,N>::wasReallocated() const
  158. {
  159. return this->m_data != m_storage;
  160. }
  161. template <typename T, unsigned N>
  162. int hkInplaceArray<T,N>::stillInplaceUsingMask() const
  163. {
  164. return hkArray<T>::m_capacityAndFlags & hkArray<T>::DONT_DEALLOCATE_FLAG;
  165. }
  166. template <typename T, unsigned N>
  167. hkArray<T>& hkInplaceArrayAligned16<T,N>::operator= (const hkArray<T>& a)
  168. {
  169. return hkArray<T>::operator=(a);
  170. }
  171. template <typename T, unsigned N>
  172. hkBool hkInplaceArrayAligned16<T,N>::wasReallocated() const
  173. {
  174. return hkUlong(this->m_data) != hkUlong(m_storage);
  175. }
  176. template <typename T, unsigned N>
  177. hkArray<T>& hkInplaceArrayAligned16<T,N>::operator= (const hkInplaceArrayAligned16<T,N>& a)
  178. {
  179. return hkArray<T>::operator=(a);
  180. }
  181. template <typename T>
  182. HK_FORCE_INLINE hkArray<T>::hkArray(T* ptr, int size, int capacity)
  183. : m_data(ptr),
  184. m_size(size),
  185. m_capacityAndFlags(capacity | DONT_DEALLOCATE_FLAG)
  186. {
  187. }
  188. template <typename T>
  189. HK_FORCE_INLINE hkArray<T>::~hkArray()
  190. {
  191. releaseMemory();
  192. }
  193. template <typename T>
  194. HK_FORCE_INLINE void hkArray<T>::clearAndDeallocate()
  195. {
  196. releaseMemory();
  197. m_data = HK_NULL;
  198. m_size = 0;
  199. m_capacityAndFlags = DONT_DEALLOCATE_FLAG | (m_capacityAndFlags & LOCKED_FLAG);
  200. }
  201. #define HK_COMPUTE_OPTIMIZED_CAPACITY( size, numFreeElemsLeft, shrinkExact ) (shrinkExact) ? (size + numFreeElemsLeft) : hkNextPowerOf2(size + numFreeElemsLeft)
  202. template <typename T>
  203. HK_FORCE_INLINE void hkArray<T>::optimizeCapacity( int numFreeElemsLeft, hkBool32 shrinkExact )
  204. {
  205. int totalCapacity = HK_COMPUTE_OPTIMIZED_CAPACITY(m_size, numFreeElemsLeft, shrinkExact);
  206. if ( totalCapacity <= getCapacity() )
  207. {
  208. #ifdef HK_DEBUG
  209. if ( isLocked() )
  210. HK_WARN(0xf3768206, "hkArray::optimizeCapacity on locked array. Destructor (memory dealloc) will not be called.");
  211. #endif
  212. hkArrayUtil::_reduce( this, hkSizeOf(T), HK_NULL, totalCapacity );
  213. }
  214. }
  215. template <typename T>
  216. HK_FORCE_INLINE void hkArray<T>::removeAt(int i)
  217. {
  218. HK_ASSERT(0x63bab20a,  i >= 0 && i < m_size);
  219. m_size--;
  220. m_data[i] = m_data[m_size];
  221. }
  222. template <typename T>
  223. HK_FORCE_INLINE void hkArray<T>::removeAtAndCopy(int index)
  224. {
  225. HK_ASSERT(0x453a6437,  index >= 0 && index < m_size);
  226. m_size--;
  227. for(int i = index; i < m_size; ++i)
  228. {
  229. m_data[i] = m_data[i+1];
  230. }
  231. }
  232. template <typename T>
  233. HK_FORCE_INLINE void hkArray<T>::removeAtAndCopy(int index, int numToRemove)
  234. {
  235. HK_ASSERT(0x453a6436,  numToRemove >= 0);
  236. HK_ASSERT(0x453a6437,  index >= 0 && ( (index + numToRemove) <= m_size) );
  237. m_size -= numToRemove;
  238. for(int i = index; i < m_size; ++i)
  239. {
  240. m_data[i] = m_data[i+numToRemove];
  241. }
  242. }
  243. template <typename T>
  244. HK_FORCE_INLINE int hkArray<T>::indexOf(const T& t, int startIdx, int endIdx) const
  245. {
  246. if( endIdx < 0 )
  247. {
  248. endIdx = m_size;
  249. }
  250. for(int i = startIdx; i < endIdx; ++i)
  251. {
  252. if( m_data[i] == t )
  253. {
  254. return i;
  255. }
  256. }
  257. return -1;
  258. }
  259. template <typename T>
  260. HK_FORCE_INLINE int hkArray<T>::lastIndexOf(const T& t) const
  261. {
  262. for(int i = m_size-1; i >=0; --i)
  263. {
  264. if( m_data[i] == t )
  265. {
  266. return i;
  267. }
  268. }
  269. return -1;
  270. }
  271. template <typename T>
  272. HK_FORCE_INLINE void hkArray<T>::popBack( int numRemove )
  273. {
  274. HK_ASSERT(0x5b57310e, m_size >= numRemove );
  275. m_size -= numRemove;
  276. }
  277. template <typename T>
  278. HK_FORCE_INLINE hkArray<T> hkArray<T>::getSubarray(int b, int e)
  279. {
  280. HK_ASSERT(0x3068c6ab,  b >= 0 && b <= e && e < m_size);
  281. return hkArray(m_data+b, e-b);
  282. }
  283. template <typename T>
  284. HK_FORCE_INLINE void hkArray<T>::reserveExactly(int n)
  285. {
  286. if(getCapacity() < n)
  287. {
  288. #ifdef HK_DEBUG
  289. if ( isLocked() )
  290. HK_WARN(0xf3768206, "hkArray::reserveExactly on locked array. Destructor (memory dealloc) will not be called.");
  291. #endif
  292. hkArrayUtil::_reserve(this, n, sizeof(T));
  293. }
  294. }
  295. template <typename T>
  296. HK_FORCE_INLINE void hkArray<T>::reserve(int n)
  297. {
  298. const int capacity = getCapacity();
  299. if( capacity < n)
  300. {
  301. #ifdef HK_DEBUG
  302. if ( isLocked() )
  303. HK_WARN(0xf3768206, "hkArray::reserve on locked array. Destructor (memory dealloc) will not be called.");
  304. #endif
  305. int cap2 = 2 * capacity;
  306. int newSize = (n < cap2) ? cap2 : n;
  307. hkArrayUtil::_reserve(this, newSize, sizeof(T));
  308. }
  309. }
  310. template <typename T>
  311. HK_FORCE_INLINE void hkArray<T>::pushBack(const T& t)
  312. {
  313. if(m_size == getCapacity())
  314. {
  315. #ifdef HK_DEBUG
  316. if ( isLocked() )
  317. HK_WARN(0xf3768206, "hkArray::pushBack on locked array. Destructor (memory dealloc) will not be called.");
  318. #endif
  319. HK_ASSERT2( 0x76e453e4, ! ( ( &t >= m_data ) && ( &t < (m_data + m_size) ) ), "hkArray::pushBack can't push back element of same array during resize" );
  320. hkArrayUtil::_reserveMore( this, sizeof(T) );
  321. }
  322. m_data[m_size++] = t;
  323. }
  324. template <typename T>
  325. HK_FORCE_INLINE void hkArray<T>::pushBackUnchecked(const T& t)
  326. {
  327. HK_ASSERT(0x3a2b4abb, m_size < getCapacity());
  328. m_data[m_size++] = t;
  329. }
  330. template <typename T>
  331. HK_FORCE_INLINE void hkArray<T>::setSize(int n)
  332. {
  333. reserve(n); // will warn if locked
  334. m_size = n;
  335. }
  336. template <typename T>
  337. HK_FORCE_INLINE void hkArray<T>::setSizeUnchecked(int n)
  338. {
  339. HK_ASSERT(0x39192e68, n <= getCapacity());
  340. m_size = n;
  341. }
  342. template <typename T>
  343. HK_FORCE_INLINE T* hkArray<T>::expandBy( int n )
  344. {
  345. int oldsize = m_size;
  346. setSize( oldsize + n ); // will warn if too big.
  347. return m_data+oldsize;
  348. }
  349. template <typename T>
  350. HK_FORCE_INLINE T& hkArray<T>::expandOne( )
  351. {
  352. if(m_size == getCapacity())
  353. {
  354. #ifdef HK_DEBUG
  355. if ( isLocked() )
  356. HK_WARN(0xf3768206, "hkArray::expandOne on locked array. Destructor (memory dealloc) will not be called.");
  357. #endif
  358. hkArrayUtil::_reserveMore( this, sizeof(T) );
  359. }
  360. return m_data[m_size++];
  361. }
  362. template <typename T>
  363. HK_FORCE_INLINE T* hkArray<T>::expandByUnchecked( int n )
  364. {
  365. int oldsize = m_size;
  366. setSizeUnchecked( oldsize + n ); // will warn if locked.
  367. return m_data+oldsize;
  368. }
  369. template <typename T>
  370. HK_FORCE_INLINE void hkArray<T>::setSize(int n, const T& fill)
  371. {
  372. if(n > m_size)
  373. {
  374. int oldsize = m_size;
  375. reserve(n); // will warn if locked
  376. for(int i = oldsize; i < n; ++i)
  377. {
  378. m_data[i] = fill;
  379. }
  380. }
  381. m_size = n;
  382. }
  383. template <typename T>
  384. void hkArray<T>::spliceInto(int index, int numdel, const T* p, int numtoinsert)
  385. {
  386. HK_ASSERT(0x4cbc67c6, index >= 0 && index <= getSize() );
  387. HK_ASSERT(0x4cbc67c7, numdel >= 0 && (index+numdel) <= getSize() );
  388. const int newsize     = numtoinsert + m_size - numdel;
  389. const int numtomove   = m_size - index - numdel;
  390. if(newsize > getCapacity())
  391. {
  392. // note double copy from [i:end] not a problem in practice
  393. reserve(newsize); // will warn if locked.
  394. }
  395. if( numtoinsert >= numdel )
  396. {
  397. copyBackwards(m_data + index + numtoinsert, m_data + index + numdel, numtomove);
  398. }
  399. else
  400. {
  401. copy( m_data + index + numtoinsert, m_data + index + numdel, numtomove );
  402. }
  403. copyBackwards(m_data + index, p, numtoinsert);
  404. m_size = newsize;
  405. }
  406. template <typename T>
  407. void hkArray<T>::insertAt(int index, const T* p, int numtoinsert)
  408. {
  409. spliceInto(index, 0, p, numtoinsert);
  410. }
  411. template <typename T>
  412. HK_FORCE_INLINE T* hkArray<T>::expandAt(int index, int numtoinsert)
  413. {
  414. HK_ASSERT(0x2723cc08,  index >= 0 && index <= m_size );
  415. const int newsize = numtoinsert + m_size;
  416. const int numtomove = m_size - index;
  417. if(newsize > getCapacity())
  418. {
  419. // note double copy from [i:end] not a problem in practice
  420. reserve(newsize); // will warn if locked.
  421. }
  422. copyBackwards(m_data + index + numtoinsert, m_data + index, numtomove);
  423. m_size = newsize;
  424. return m_data + index;
  425. }
  426. template <typename T>
  427. void hkArray<T>::insertAt(int i, const T& t)
  428. {
  429. insertAt(i, &t, 1 );
  430. }
  431. template <typename T>
  432. void hkArray<T>::swap(hkArray<T>& a)
  433. {
  434. HK_ASSERT( 0xf032e612, 0==(m_capacityAndFlags&DONT_DEALLOCATE_FLAG) || m_data == HK_NULL );
  435. HK_ASSERT( 0xf032e613, 0==(a.m_capacityAndFlags&DONT_DEALLOCATE_FLAG) || a.m_data == HK_NULL );
  436. T* d = m_data; // swap data
  437. m_data = a.m_data;
  438. a.m_data = d;
  439. int s = m_size; // swap size
  440. m_size = a.m_size;
  441. a.m_size = s;
  442. int c = m_capacityAndFlags; // swap cap
  443. m_capacityAndFlags = a.m_capacityAndFlags;
  444. a.m_capacityAndFlags = c;
  445. }
  446. //
  447. // Inplace array
  448. //
  449. template <typename T, unsigned N>
  450. HK_FORCE_INLINE hkInplaceArray<T,N>::hkInplaceArray(int size)
  451. : hkArray<T>(m_storage, size, N)
  452. {
  453. }
  454. template <typename T, unsigned N>
  455. HK_FORCE_INLINE hkInplaceArray<T,N>::hkInplaceArray(const hkInplaceArray<T,N>& a)
  456. : hkArray<T>(m_storage, 0, N)
  457. {
  458. *this = a;
  459. }
  460. template <typename T, unsigned N>
  461. HK_FORCE_INLINE void hkInplaceArray<T,N>::optimizeCapacity( int numFreeElemsLeft, hkBool32 shrinkExact )
  462. {
  463. if( (this->m_capacityAndFlags & hkArray<T>::DONT_DEALLOCATE_FLAG) == 0)
  464. {
  465. int totalCapacity = HK_COMPUTE_OPTIMIZED_CAPACITY(this->m_size, numFreeElemsLeft, shrinkExact);
  466. if( totalCapacity < int(N) )
  467. {
  468. #ifdef HK_DEBUG
  469. if ( this->isLocked() )
  470. HK_WARN(0xf3768206, "hkInplaceArray::optimizeCapacity on locked array. Destructor (memory dealloc) will not be called.");
  471. #endif
  472. // reducing to a capacity < N, we can copy back to local storage
  473. hkArrayUtil::_reduce( this, hkSizeOf(T), (char*)(&m_storage[0]), N );
  474. }
  475. else if( totalCapacity < this->getCapacity() )
  476. {
  477. #ifdef HK_DEBUG
  478. if ( this->isLocked() )
  479. HK_WARN(0xf3768206, "hkArray::optimizeCapacity on locked array. Destructor (memory dealloc) will not be called.");
  480. #endif
  481. hkArrayUtil::_reduce( this, hkSizeOf(T), HK_NULL, totalCapacity );
  482. }
  483. }
  484. }
  485. template <typename T, unsigned N>
  486. HK_FORCE_INLINE hkInplaceArrayAligned16<T,N>::hkInplaceArrayAligned16(int size)
  487. : hkArray<T>( (T*)&m_storage[0], size, N)
  488. {
  489. }
  490. template <typename T>
  491. typename hkArray<T>::iterator hkArray<T>::begin()
  492. {
  493. return m_data;
  494. }
  495. template <typename T>
  496. typename hkArray<T>::iterator hkArray<T>::end()
  497. {
  498. return m_data + m_size;
  499. }
  500. template <typename T>
  501. typename hkArray<T>::const_iterator hkArray<T>::begin() const
  502. {
  503. return m_data;
  504. }
  505. template <typename T>
  506. typename hkArray<T>::const_iterator hkArray<T>::end() const
  507. {
  508. return m_data + m_size;
  509. }
  510. template <typename T>
  511. hkBool hkArray<T>::isLocked()
  512. {
  513. return (m_capacityAndFlags & LOCKED_FLAG) != 0;
  514. }
  515. template <typename T>
  516. void hkArray<T>::setLocked( bool locked )
  517. {
  518. if (locked)
  519. m_capacityAndFlags |= LOCKED_FLAG; // turn on
  520. else
  521. m_capacityAndFlags &= ~LOCKED_FLAG; // turn off
  522. }
  523. template <typename T>
  524. void hkArray<T>::setOwnedData(T* ptr, int size, int capacity)
  525. {
  526. m_data = ptr;
  527. m_size = size;
  528. m_capacityAndFlags = capacity;
  529. }
  530. #undef HK_COMPUTE_OPTIMIZED_CAPACITY
  531. /*
  532. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  533. * Confidential Information of Havok.  (C) Copyright 1999-2009
  534. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  535. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  536. * rights, and intellectual property rights in the Havok software remain in
  537. * Havok and/or its suppliers.
  538. * Use of this software for evaluation purposes is subject to and indicates
  539. * acceptance of the End User licence Agreement for this product. A copy of
  540. * the license is included with this software and is also available at www.havok.com/tryhavok.
  541. */