| [1963] | 1 | /* | 
|---|
 | 2 | Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans  http://continuousphysics.com/Bullet/ | 
|---|
 | 3 |  | 
|---|
 | 4 | This software is provided 'as-is', without any express or implied warranty. | 
|---|
 | 5 | In no event will the authors be held liable for any damages arising from the use of this software. | 
|---|
 | 6 | Permission is granted to anyone to use this software for any purpose,  | 
|---|
 | 7 | including commercial applications, and to alter it and redistribute it freely,  | 
|---|
 | 8 | subject to the following restrictions: | 
|---|
 | 9 |  | 
|---|
 | 10 | 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. | 
|---|
 | 11 | 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | 
|---|
 | 12 | 3. This notice may not be removed or altered from any source distribution. | 
|---|
 | 13 | */ | 
|---|
 | 14 |  | 
|---|
 | 15 |  | 
|---|
 | 16 | #ifndef _BT_POOL_ALLOCATOR_H | 
|---|
 | 17 | #define _BT_POOL_ALLOCATOR_H | 
|---|
 | 18 |  | 
|---|
 | 19 | #include "btScalar.h" | 
|---|
 | 20 | #include "btAlignedAllocator.h" | 
|---|
 | 21 |  | 
|---|
 | 22 | ///The btPoolAllocator class allows to efficiently allocate a large pool of objects, instead of dynamically allocating them separately. | 
|---|
 | 23 | class btPoolAllocator | 
|---|
 | 24 | { | 
|---|
 | 25 |         int                             m_elemSize; | 
|---|
 | 26 |         int                             m_maxElements; | 
|---|
 | 27 |         int                             m_freeCount; | 
|---|
 | 28 |         void*                   m_firstFree; | 
|---|
 | 29 |         unsigned char*  m_pool; | 
|---|
 | 30 |  | 
|---|
 | 31 | public: | 
|---|
 | 32 |  | 
|---|
 | 33 |         btPoolAllocator(int elemSize, int maxElements) | 
|---|
 | 34 |                 :m_elemSize(elemSize), | 
|---|
 | 35 |                 m_maxElements(maxElements) | 
|---|
 | 36 |         { | 
|---|
 | 37 |                 m_pool = (unsigned char*) btAlignedAlloc( static_cast<unsigned int>(m_elemSize*m_maxElements),16); | 
|---|
 | 38 |  | 
|---|
 | 39 |                 unsigned char* p = m_pool; | 
|---|
 | 40 |         m_firstFree = p; | 
|---|
 | 41 |         m_freeCount = m_maxElements; | 
|---|
 | 42 |         int count = m_maxElements; | 
|---|
 | 43 |         while (--count) { | 
|---|
 | 44 |             *(void**)p = (p + m_elemSize); | 
|---|
 | 45 |             p += m_elemSize; | 
|---|
 | 46 |         } | 
|---|
 | 47 |         *(void**)p = 0; | 
|---|
 | 48 |     } | 
|---|
 | 49 |  | 
|---|
 | 50 |         ~btPoolAllocator() | 
|---|
 | 51 |         { | 
|---|
 | 52 |                 btAlignedFree( m_pool); | 
|---|
 | 53 |         } | 
|---|
 | 54 |  | 
|---|
 | 55 |         int     getFreeCount() const | 
|---|
 | 56 |         { | 
|---|
 | 57 |                 return m_freeCount; | 
|---|
 | 58 |         } | 
|---|
 | 59 |  | 
|---|
| [8351] | 60 |         int getUsedCount() const | 
|---|
 | 61 |         { | 
|---|
 | 62 |                 return m_maxElements - m_freeCount; | 
|---|
 | 63 |         } | 
|---|
 | 64 |  | 
|---|
| [8393] | 65 |         int getMaxCount() const | 
|---|
 | 66 |         { | 
|---|
 | 67 |                 return m_maxElements; | 
|---|
 | 68 |         } | 
|---|
 | 69 |  | 
|---|
| [1963] | 70 |         void*   allocate(int size) | 
|---|
 | 71 |         { | 
|---|
 | 72 |                 // release mode fix | 
|---|
 | 73 |                 (void)size; | 
|---|
 | 74 |                 btAssert(!size || size<=m_elemSize); | 
|---|
 | 75 |                 btAssert(m_freeCount>0); | 
|---|
 | 76 |         void* result = m_firstFree; | 
|---|
 | 77 |         m_firstFree = *(void**)m_firstFree; | 
|---|
 | 78 |         --m_freeCount; | 
|---|
 | 79 |         return result; | 
|---|
 | 80 |         } | 
|---|
 | 81 |  | 
|---|
 | 82 |         bool validPtr(void* ptr) | 
|---|
 | 83 |         { | 
|---|
 | 84 |                 if (ptr) { | 
|---|
 | 85 |                         if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize)) | 
|---|
 | 86 |                         { | 
|---|
 | 87 |                                 return true; | 
|---|
 | 88 |                         } | 
|---|
 | 89 |                 } | 
|---|
 | 90 |                 return false; | 
|---|
 | 91 |         } | 
|---|
 | 92 |  | 
|---|
 | 93 |         void    freeMemory(void* ptr) | 
|---|
 | 94 |         { | 
|---|
 | 95 |                  if (ptr) { | 
|---|
 | 96 |             btAssert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize); | 
|---|
 | 97 |  | 
|---|
 | 98 |             *(void**)ptr = m_firstFree; | 
|---|
 | 99 |             m_firstFree = ptr; | 
|---|
 | 100 |             ++m_freeCount; | 
|---|
 | 101 |         } | 
|---|
 | 102 |         } | 
|---|
 | 103 |  | 
|---|
 | 104 |         int     getElementSize() const | 
|---|
 | 105 |         { | 
|---|
 | 106 |                 return m_elemSize; | 
|---|
 | 107 |         } | 
|---|
 | 108 |  | 
|---|
| [8351] | 109 |         unsigned char*  getPoolAddress() | 
|---|
 | 110 |         { | 
|---|
 | 111 |                 return m_pool; | 
|---|
 | 112 |         } | 
|---|
| [1963] | 113 |  | 
|---|
| [8351] | 114 |         const unsigned char*    getPoolAddress() const | 
|---|
 | 115 |         { | 
|---|
 | 116 |                 return m_pool; | 
|---|
 | 117 |         } | 
|---|
 | 118 |  | 
|---|
| [1963] | 119 | }; | 
|---|
 | 120 |  | 
|---|
 | 121 | #endif //_BT_POOL_ALLOCATOR_H | 
|---|