123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*! \file btGenericPoolAllocator.h
- \author Francisco Leon Najera. email projectileman@yahoo.com
- General purpose allocator class
- */
- /*
- Bullet Continuous Collision Detection and Physics Library
- Copyright (c) 2003-2006 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_GENERIC_POOL_ALLOCATOR_H
- #define BT_GENERIC_POOL_ALLOCATOR_H
- #include <limits.h>
- #include <stdio.h>
- #include <string.h>
- #include "LinearMath/btAlignedAllocator.h"
- #define BT_UINT_MAX UINT_MAX
- #define BT_DEFAULT_MAX_POOLS 16
- //! Generic Pool class
- class btGenericMemoryPool
- {
- public:
- unsigned char * m_pool; //[m_element_size*m_max_element_count];
- size_t * m_free_nodes; //[m_max_element_count];//! free nodes
- size_t * m_allocated_sizes;//[m_max_element_count];//! Number of elements allocated per node
- size_t m_allocated_count;
- size_t m_free_nodes_count;
- protected:
- size_t m_element_size;
- size_t m_max_element_count;
- size_t allocate_from_free_nodes(size_t num_elements);
- size_t allocate_from_pool(size_t num_elements);
- public:
- void init_pool(size_t element_size, size_t element_count);
- void end_pool();
- btGenericMemoryPool(size_t element_size, size_t element_count)
- {
- init_pool(element_size, element_count);
- }
- ~btGenericMemoryPool()
- {
- end_pool();
- }
- inline size_t get_pool_capacity()
- {
- return m_element_size*m_max_element_count;
- }
- inline size_t gem_element_size()
- {
- return m_element_size;
- }
- inline size_t get_max_element_count()
- {
- return m_max_element_count;
- }
- inline size_t get_allocated_count()
- {
- return m_allocated_count;
- }
- inline size_t get_free_positions_count()
- {
- return m_free_nodes_count;
- }
- inline void * get_element_data(size_t element_index)
- {
- return &m_pool[element_index*m_element_size];
- }
- //! Allocates memory in pool
- /*!
- \param size_bytes size in bytes of the buffer
- */
- void * allocate(size_t size_bytes);
- bool freeMemory(void * pointer);
- };
- //! Generic Allocator with pools
- /*!
- General purpose Allocator which can create Memory Pools dynamiacally as needed.
- */
- class btGenericPoolAllocator
- {
- protected:
- size_t m_pool_element_size;
- size_t m_pool_element_count;
- public:
- btGenericMemoryPool * m_pools[BT_DEFAULT_MAX_POOLS];
- size_t m_pool_count;
- inline size_t get_pool_capacity()
- {
- return m_pool_element_size*m_pool_element_count;
- }
- protected:
- // creates a pool
- btGenericMemoryPool * push_new_pool();
- void * failback_alloc(size_t size_bytes);
- bool failback_free(void * pointer);
- public:
- btGenericPoolAllocator(size_t pool_element_size, size_t pool_element_count)
- {
- m_pool_count = 0;
- m_pool_element_size = pool_element_size;
- m_pool_element_count = pool_element_count;
- }
- virtual ~btGenericPoolAllocator();
- //! Allocates memory in pool
- /*!
- \param size_bytes size in bytes of the buffer
- */
- void * allocate(size_t size_bytes);
- bool freeMemory(void * pointer);
- };
- void * btPoolAlloc(size_t size);
- void * btPoolRealloc(void *ptr, size_t oldsize, size_t newsize);
- void btPoolFree(void *ptr);
- #endif
|