forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans  http://continuousphysics.com/Bullet/
 | |
| 
 | |
| This software is provided 'as-is', without any express or implied warranty.
 | |
| In no event will the authors be held liable for any damages arising from the use of this software.
 | |
| Permission is granted to anyone to use this software for any purpose, 
 | |
| including commercial applications, and to alter it and redistribute it freely, 
 | |
| subject to the following restrictions:
 | |
| 
 | |
| 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.
 | |
| 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | |
| 3. This notice may not be removed or altered from any source distribution.
 | |
| */
 | |
| 
 | |
| 
 | |
| #ifndef _BT_POOL_ALLOCATOR_H
 | |
| #define _BT_POOL_ALLOCATOR_H
 | |
| 
 | |
| #include "btScalar.h"
 | |
| #include "btAlignedAllocator.h"
 | |
| #include "btThreads.h"
 | |
| 
 | |
| ///The btPoolAllocator class allows to efficiently allocate a large pool of objects, instead of dynamically allocating them separately.
 | |
| class btPoolAllocator
 | |
| {
 | |
| 	int				m_elemSize;
 | |
| 	int				m_maxElements;
 | |
| 	int				m_freeCount;
 | |
| 	void*			m_firstFree;
 | |
| 	unsigned char*	m_pool;
 | |
|     btSpinMutex     m_mutex;  // only used if BT_THREADSAFE
 | |
| 
 | |
| public:
 | |
| 
 | |
| 	btPoolAllocator(int elemSize, int maxElements)
 | |
| 		:m_elemSize(elemSize),
 | |
| 		m_maxElements(maxElements)
 | |
| 	{
 | |
| 		m_pool = (unsigned char*) btAlignedAlloc( static_cast<unsigned int>(m_elemSize*m_maxElements),16);
 | |
| 
 | |
| 		unsigned char* p = m_pool;
 | |
|         m_firstFree = p;
 | |
|         m_freeCount = m_maxElements;
 | |
|         int count = m_maxElements;
 | |
|         while (--count) {
 | |
|             *(void**)p = (p + m_elemSize);
 | |
|             p += m_elemSize;
 | |
|         }
 | |
|         *(void**)p = 0;
 | |
|     }
 | |
| 
 | |
| 	~btPoolAllocator()
 | |
| 	{
 | |
| 		btAlignedFree( m_pool);
 | |
| 	}
 | |
| 
 | |
| 	int	getFreeCount() const
 | |
| 	{
 | |
| 		return m_freeCount;
 | |
| 	}
 | |
| 
 | |
| 	int getUsedCount() const
 | |
| 	{
 | |
| 		return m_maxElements - m_freeCount;
 | |
| 	}
 | |
| 
 | |
| 	int getMaxCount() const
 | |
| 	{
 | |
| 		return m_maxElements;
 | |
| 	}
 | |
| 
 | |
| 	void*	allocate(int size)
 | |
| 	{
 | |
| 		// release mode fix
 | |
| 		(void)size;
 | |
|         btMutexLock(&m_mutex);
 | |
| 		btAssert(!size || size<=m_elemSize);
 | |
| 		//btAssert(m_freeCount>0);  // should return null if all full
 | |
|         void* result = m_firstFree;
 | |
|         if (NULL != m_firstFree)
 | |
|         {
 | |
|             m_firstFree = *(void**)m_firstFree;
 | |
|             --m_freeCount;
 | |
|         }
 | |
|         btMutexUnlock(&m_mutex);
 | |
|         return result;
 | |
| 	}
 | |
| 
 | |
| 	bool validPtr(void* ptr)
 | |
| 	{
 | |
| 		if (ptr) {
 | |
| 			if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize))
 | |
| 			{
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	void	freeMemory(void* ptr)
 | |
| 	{
 | |
| 		 if (ptr) {
 | |
|             btAssert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize);
 | |
| 
 | |
|             btMutexLock(&m_mutex);
 | |
|             *(void**)ptr = m_firstFree;
 | |
|             m_firstFree = ptr;
 | |
|             ++m_freeCount;
 | |
|             btMutexUnlock(&m_mutex);
 | |
|         }
 | |
| 	}
 | |
| 
 | |
| 	int	getElementSize() const
 | |
| 	{
 | |
| 		return m_elemSize;
 | |
| 	}
 | |
| 
 | |
| 	unsigned char*	getPoolAddress()
 | |
| 	{
 | |
| 		return m_pool;
 | |
| 	}
 | |
| 
 | |
| 	const unsigned char*	getPoolAddress() const
 | |
| 	{
 | |
| 		return m_pool;
 | |
| 	}
 | |
| 
 | |
| };
 | |
| 
 | |
| #endif //_BT_POOL_ALLOCATOR_H
 |