// wzmemoryband.h #ifndef _PROGRAMCOMMON_WZMEMORYBAND_H_ #define _PROGRAMCOMMON_WZMEMORYBAND_H_ #include "wztypedef.h" //------------------------------------------------------------------------------ /** @class CWzMemoryBand */ template 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_