62 for (
TUINT i = a_uiMaxNumber - 1; i != 0; i-- )
88 for (
auto it =
m_pHead; it !=
TNULL; it = it->pNextObject, uiNumber++ )
98template <
class T, TUINT MaxNumber, TUINT ObjectSize = sizeof( T ), TUINT Alignment = alignof( T )>
115 template <
class... Args>
119 T* pValue =
new (
Malloc( ObjectSize ) ) T( std::forward<Args>( args )... );
149 return MaxNumber * ObjectSize;
166 const T* GetObjects()
const
172 TBYTE m_aObjects[ MaxNumber * ObjectSize ];
182 m_iMaxNumber = a_iMaxNumber;
183 m_pAllocator = a_pAllocator;
185 TUINT32 uiClassSize = a_uiSize;
186 TUINT32 uiClassAlignment = a_uiAlignment;
187 m_uiObjectSize = ( uiClassSize - 1 ) + uiClassAlignment & ~( uiClassAlignment - 1U );
189 TASSERT( m_uiObjectSize >= a_uiSize && uiClassAlignment > 0 );
191 if ( m_iMaxNumber < 1 )
197 m_pData = m_pAllocator->Malloc( m_iMaxNumber * m_uiObjectSize, uiClassAlignment );
210 m_pAllocator->Free( m_pData );
213 template <
class... Args>
217 T* pValue =
new (
Malloc( m_uiObjectSize ) ) T( std::forward<Args>( args )... );
247 return m_iMaxNumber * m_uiObjectSize;
261 TUINT m_uiObjectSize;
265template <
class TClassType>
272 m_iMaxNumber = a_iMaxNumber;
273 m_pAllocator = a_pAllocator;
275 TUINT32 uiClassSize = TClassType::GetClassStatic()->GetMaxSizeOfDerivedClasses();
276 TUINT32 uiClassAlignment = TClassType::GetClassStatic()->GetMaxAlignmentOfDerivedClasses();
277 m_uiObjectSize = ( uiClassSize - 1 ) + uiClassAlignment & ~( uiClassAlignment - 1U );
279 TASSERT( m_uiObjectSize >=
sizeof( TClassType ) && uiClassAlignment > 0 );
281 if ( m_iMaxNumber < 1 )
287 m_pData = m_pAllocator->Malloc( m_iMaxNumber * m_uiObjectSize, uiClassAlignment );
300 m_pAllocator->Free( m_pData );
303 template <
class... Args>
307 TClassType* pValue =
new (
Malloc( m_uiObjectSize ) ) TClassType( std::forward<Args>( args )... );
311 template <
class T,
class... Args>
314 TASSERT(
TTRUE == T::GetClassStatic()->IsA( TClassType::GetClassStatic() ) );
316 T* pValue =
new (
Malloc( m_uiObjectSize ) ) T( std::forward<Args>( args )... );
335 a_pObject->~TClassType();
346 return m_iMaxNumber * m_uiObjectSize;
360 TUINT m_uiObjectSize;
#define TSTATICCAST(POINTERTYPE, VALUE)
#define TREINTERPRETCAST(TYPE, VALUE)
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
virtual void * TryMalloc(TSIZE size) OVERRIDE
virtual void Free(void *a_pPtr) OVERRIDE
TUINT GetNumFreeObjects() const
void ReturnObject(UnusedObject *a_pObject)
virtual void * TryMalloc(TSIZE size, TSIZE alignment) OVERRIDE
virtual void * Malloc(TSIZE a_uiSize, TSIZE a_uiAlignment) OVERRIDE
UnusedObject * GetObject()
virtual void * Malloc(TSIZE a_uiSize) OVERRIDE
void Initialise(UnusedObject *a_pObjects, TUINT a_uiMaxNumber, TUINT a_uiObjectSize)
virtual ~T2GenericObjectPool()=default
virtual TBOOL CanAllocate(TSIZE size) const OVERRIDE
UnusedObject * pNextObject
T * NewObject(Args &&... args)
TBOOL CanAllocate() const
TSTATICASSERT(MaxNumber >=2)
virtual TBOOL IsAddressInPool(const void *a_pAddress) const
virtual TSIZE GetCapacity() const OVERRIDE
TSTATICASSERT(sizeof(T) >=sizeof(T2GenericObjectPool::UnusedObject))
void DeleteObject(T *a_pObject)
virtual TSIZE GetUsedSize() const OVERRIDE
void FreeObject(T *a_pObject)
virtual ~T2DynamicObjectPool()
virtual TSIZE GetUsedSize() const OVERRIDE
T * NewObject(Args &&... args)
void DeleteObject(T *a_pObject)
virtual TSIZE GetCapacity() const OVERRIDE
TBOOL CanAllocate() const
void FreeObject(T *a_pObject)
T2DynamicObjectPool(T2Allocator *a_pAllocator, TINT a_iMaxNumber, TSIZE a_uiSize=sizeof(T), TSIZE a_uiAlignment=alignof(T))
virtual TBOOL IsAddressInPool(const void *a_pAddress) const
virtual ~T2DerivedDynamicObjectPool()
TClassType * AllocateObject()
virtual TBOOL IsAddressInPool(const void *a_pAddress) const
void FreeObject(TClassType *a_pObject)
TBOOL CanAllocate() const
virtual TSIZE GetCapacity() const OVERRIDE
void DeleteObject(TClassType *a_pObject)
T2DerivedDynamicObjectPool(T2Allocator *a_pAllocator, TINT a_iMaxNumber)
T * NewDerivedObject(Args &&... args)
virtual TSIZE GetUsedSize() const OVERRIDE
TClassType * NewObject(Args &&... args)