DragonNest/Common/Utility/SLMemPool.h

86 lines
1.8 KiB
C
Raw Normal View History

2024-12-19 09:48:26 +08:00
// Note : Simple List Memory Pool -_-;;;;
// <09><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
//
#pragma once
#include <list>
#include <algorithm>
template<typename TYPE>
class CSLMemPool
{
protected:
struct DeleteObject
{
template<typename TYPE>
void operator() ( const TYPE *ptr ) const
{
ASSERT(ptr&&"CMemPool<TYPE>::operator()");
delete ptr;
}
};
typedef typename std::list<TYPE*> MEMPOOL_LIST;
typedef typename MEMPOOL_LIST::iterator MEMPOOL_LIST_ITER;
MEMPOOL_LIST m_listMemPool;
public:
CSLMemPool();
~CSLMemPool();
public:
// Note : <20>޸𸮸<DEB8> <20>Ҵ<EFBFBD><D2B4>Ѵ<EFBFBD>.
// Ǯ<><C7AE> <20>ִٸ<D6B4> Ǯ<><C7AE> <20>ִ<EFBFBD> <20>޸𸮸<DEB8> <20><>ȯ<EFBFBD>ϰ<EFBFBD> <20>ƴϸ<C6B4> new<65>Ѵ<EFBFBD>.
TYPE* Allocate();
// Note : <20>޸<EFBFBD><DEB8><EFBFBD>Ǯ<EFBFBD><C7AE> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// Ǯ<><C7AE> <20><>ȯ<EFBFBD>ϱ<EFBFBD> <20><> <20>Ǵ<EFBFBD> <20>Ŀ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
void Deallocate( TYPE* ptr );
// Note : <20>޸<EFBFBD><DEB8><EFBFBD>Ǯ<EFBFBD><C7AE> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. <20><> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD> <20>ʱ<EFBFBD>ȭ <20><> <20><>ȯ.
void DeallocateEx( TYPE* ptr );
public:
DWORD GetAmount() { return static_cast<DWORD>(m_listMemPool.size()); }
void Clear() { std::for_each ( m_listMemPool.begin(), m_listMemPool.end(), DeleteObject() ); }
};
template<typename TYPE>
inline CSLMemPool<TYPE>::CSLMemPool()
{
}
template<typename TYPE>
inline CSLMemPool<TYPE>::~CSLMemPool()
{
Clear();
}
template<typename TYPE>
inline TYPE* CSLMemPool<TYPE>::Allocate()
{
if( m_listMemPool.empty() )
{
return new TYPE;
}
TYPE* ptr = *m_listMemPool.begin();
m_listMemPool.pop_front();
ASSERT(ptr&&"CMemPool<TYPE>::Allocate");
return ptr;
}
template<typename TYPE>
inline void CSLMemPool<TYPE>::Deallocate( TYPE* ptr )
{
ASSERT(ptr&&"CMemPool<TYPE>::Deallocate");
m_listMemPool.push_back ( ptr );
}
template<typename TYPE>
inline void CSLMemPool<TYPE>::DeallocateEx( TYPE* ptr )
{
ASSERT(ptr&&"CMemPool<TYPE>::DeallocateEx");
*ptr = TYPE();
m_listMemPool.push_back ( ptr );
}