Files
Sun1602/SUN3DEngine/include/ProgramCommon/wzmemoryband.h
T
2022-10-26 12:25:11 +08:00

182 lines
3.1 KiB
Objective-C

// wzmemoryband.h
#ifndef _PROGRAMCOMMON_WZMEMORYBAND_H_
#define _PROGRAMCOMMON_WZMEMORYBAND_H_
#include "wztypedef.h"
//------------------------------------------------------------------------------
/**
@class CWzMemoryBand
*/
template <class T>
class CWzMemoryBand
{
public:
// 생성자
CWzMemoryBand( void )
: m_prev( NULL )
, m_next( NULL )
, m_objPool( NULL )
, m_freeList( NULL )
, m_size( 0 )
, m_freeIdx( 0 )
{
// empty
}
// 소멸자
~CWzMemoryBand( void )
{
Destroy();
}
// 생성
bool Create( int size )
{
WzAssert( size > 0 );
WzAssert( !m_objPool );
WzAssert( !m_freeList );
// 기존 데이타 검사
if( m_objPool )
{
WZLOG( WZWAR, "CWzMemoryBand::Create() - 이미 있음" );
return false;
}
// 객체 풀 생성
m_objPool = new T[size];
WzAssert( m_objPool );
if( m_objPool == NULL)
{
WZLOG( WZWAR, "CWzMemoryBand::Create() - objPool 생성 실패" );
goto _error;
}
// free(가용 객체) 리스트 생성
m_freeList = new T*[size];
WzAssert( m_freeList );
if( m_freeList == NULL )
{
WZLOG( WZWAR, "CWzMemoryBand::Create() - freeList 생성 실패" );
goto _error;
}
m_size = size;
// 초기화
Initialize();
return true;
_error:
Destroy();
return false;
}
// 파괴
void Destroy( void )
{
if( m_freeList )
{
delete [] m_freeList;
m_freeList = NULL;
}
if( m_objPool )
{
delete [] m_objPool;
m_objPool = NULL;
}
m_size = 0;
m_freeIdx = 0;
m_prev = NULL;
m_next = NULL;
}
// 초기화
void Initialize( void )
{
// free리스트를 객체 풀 데이타들의 주소로 초기화
for( int i = 0; i < m_size; ++i )
{
m_freeList[i] = &m_objPool[i];
}
m_freeIdx = m_size;
}
// 객체 할당
T* AllocObject( void )
{
if( m_freeIdx > 0 )
{
return m_freeList[--m_freeIdx];
}
return NULL;
}
// 객체 해제
bool FreeObject( T* obj )
{
WzAssert( obj );
if( obj )
{
if( m_freeIdx < m_size )
{
m_freeList[m_freeIdx++] = obj;
return true;
}
}
return false;
}
void SetNext( CWzMemoryBand* next )
{
m_next = next;
}
CWzMemoryBand* GetNext( void )
{
return m_next;
}
void SetPrev( CWzMemoryBand* prev )
{
m_prev = prev;
}
CWzMemoryBand* GetPrev( void )
{
return m_prev;
}
#ifdef _DEBUG
int GetSize() { return m_size; }
int GetFreeSize() { return m_freeIdx; }
#endif
private:
CWzMemoryBand* m_prev;
CWzMemoryBand* m_next;
T* m_objPool;
T** m_freeList;
int m_size;
int m_freeIdx;
};
#endif // _PROGRAMCOMMON_WZMEMORYBAND_H_