86 lines
1.8 KiB
C
86 lines
1.8 KiB
C
|
|
// 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 );
|
|||
|
|
}
|