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

其他游戏

开发平台:

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. HK_FORCE_INLINE void hkFreeList::allocBatch(void** out,int sizeIn)
  9. {
  10.     void** end = out + sizeIn;
  11.     void** cur = out;
  12.     Element* head = m_free;
  13.     while (cur < end && head)
  14.     {
  15.         *cur++ = reinterpret_cast<void*>(head);
  16.         head = head->m_next;
  17.     }
  18.     m_free = head;
  19.     // Account for number of blocks allocated
  20.     m_numFreeElements -= (cur - out);
  21.     out = cur;
  22.     // If still remaining we need more space
  23.     while (cur < end)
  24.     {
  25.         if (m_top < m_blockEnd)
  26.         {
  27.             while (m_top < m_blockEnd && cur < end)
  28.             {
  29.                 *cur++ = m_top;
  30.                 m_top += m_elementSize;
  31.             }
  32.             // Fix the number of elements
  33.             m_numFreeElements -= (cur - out);
  34.             // We need to update based on current pos
  35.             out = cur;
  36.         }
  37.         else
  38.         {
  39.             // This will do an alloc + update m_numFreeElements
  40.             *cur++ = addSpace();
  41.             // Its accounted for so update out
  42.             out = cur;
  43.         }
  44.     }
  45. }
  46. HK_FORCE_INLINE void hkFreeList::freeBatch(void** in,int sizeIn)
  47. {
  48.     m_numFreeElements += sizeIn;
  49. Element* head = m_free;
  50.     while (--sizeIn >= 0)
  51.     {
  52.         Element* ele = reinterpret_cast<Element *>(*in++);
  53.         if (ele)
  54.         {
  55.             ele->m_next = head;
  56.             head = ele;
  57.         }
  58.         else
  59.         {
  60.             m_numFreeElements--;
  61.         }
  62.     }
  63. m_free = head;
  64. }
  65. HK_FORCE_INLINE void* hkFreeList::alloc()
  66. {
  67.     // if there is a block on the freelist, then just return that
  68.     if (m_free)
  69.     {
  70.         m_numFreeElements --;
  71.         // Grab the block
  72.         void* data = reinterpret_cast<void*>(m_free);
  73.         // Make m_free point to the next free block
  74.         m_free = m_free->m_next;
  75.         // Return the block
  76.         return data;
  77.     }
  78.     // If there is no space after top, add some space
  79.     if (m_top >= m_blockEnd)
  80. {
  81. return addSpace();
  82. }
  83.     m_numFreeElements--;
  84.     // Else take the memory from the top of the current block
  85.     void* data = reinterpret_cast<void*>(m_top);
  86.     m_top += m_elementSize;
  87.     return data;
  88. }
  89. HK_FORCE_INLINE void hkFreeList::free(void* data)
  90. {
  91.     // We've got a free element
  92.     m_numFreeElements++;
  93.     // Its an element now - add it to the list
  94. Element* ele = reinterpret_cast<Element *>(data);
  95.     ele->m_next = m_free;
  96.     m_free = ele;
  97. }
  98. inline void hkFreeList::garbageCollect()
  99. {
  100.     findGarbage();
  101.     freeAllFreeBlocks();
  102. }
  103. /*
  104. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  105. * Confidential Information of Havok.  (C) Copyright 1999-2009
  106. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  107. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  108. * rights, and intellectual property rights in the Havok software remain in
  109. * Havok and/or its suppliers.
  110. * Use of this software for evaluation purposes is subject to and indicates
  111. * acceptance of the End User licence Agreement for this product. A copy of
  112. * the license is included with this software and is also available at www.havok.com/tryhavok.
  113. */