// wzhandlemanager.h #ifndef _PROGRAMCOMMON_WZHANDLEMANAGER_H_ #define _PROGRAMCOMMON_WZHANDLEMANAGER_H_ #include "wzarray.h" #define MAX_NUM_HANDLES 65535 #define MAX_MAGIC_NO 65534 #define MIN_NUM_FOR_CLEAR 1000 struct St_Handle { union { struct { unsigned short m_index; unsigned short m_magicNo; }; HANDLE m_handle; }; }; //------------------------------------------------------------------------------ /** @class CWzHandleManager */ template class CWzHandleManager { public: // »ý¼ºÀÚ/¼Ò¸êÀÚ CWzHandleManager( void ); virtual ~CWzHandleManager( void ); // ÃʱâÈ­ void Clear( void ); // µ¥ÀÌŸ Ãß°¡(ÇÚµé ¹Ýȯ) HANDLE Add( const T& data ); // µ¥ÀÌŸ Á¦°Å BOOL Release( HANDLE handle ); // µ¥ÀÌŸ ¾ò±â const T& GetData( HANDLE handle ) const; // µ¥ÀÌŸ ¹Ù²Ù±â BOOL Replace( HANDLE handle, const T& data ); // Àüü µ¥ÀÌŸ ¼ö int Idx_GetCount( void ) const; // À妽º·Î µ¥ÀÌŸ ¾ò±â const T& Idx_GetData( int index ) const; // À妽º·Î ¸ÅÁ÷ ³Ñ¹ö ¾ò±â unsigned short Idx_GetMagicNumber( int index ) const; // À妽º·Î µ¥ÀÌŸ ÇØÁ¦ void Idx_Release( int index ); // À¯È¿ÇÑ ÇÚµéÀΰ¡? BOOL IsValidHandle( HANDLE handle ) const; protected: // xxx: ±¸Â÷ÇÏ°Ô ÀÌ·± º¯¼ö¸¦ ¸¸µé°í ½ÍÁø ¾ÊÁö¸¸ // ±âÁ¸¿¡ ÀÌ¹Ì ¾²·¹±â °ªÀ» ¸®ÅÏÇØ¾ß ÇÏ´Â °æ¿ì°¡ Àֱ⠶§¹®¿¡ // Â÷¶ó¸® ÀÌ ¹æ¹ýÀÌ ÁÁÀº °Í °°¾Æ ÀÌ·¸°Ô °£´Ù. static T m_dummyData; static T m_nullData; protected: CWzArray m_dataList; CWzArray m_magicNoList; private: CWzArray m_freeIdxList; unsigned short m_numFreeIdx; unsigned short m_maxIndex; unsigned short m_newMagicNo; }; template T CWzHandleManager::m_dummyData; template T CWzHandleManager::m_nullData; //------------------------------------------------------------------------------ /** - m_newMagicNo( 1 ) - ¸ÅÁ÷ ³Ñ¹ö°¡ 1ºÎÅÍ ½ÃÀÛÇÑ´Ù´Â °ÍÀ» °­Á¶Çϱâ À§ÇØ 1·Î ÃʱâÈ­ ÇÔ */ template CWzHandleManager::CWzHandleManager( void ) { // xxx: T°¡ ¹¹°¡ µÉ Áö ¸ð¸£´Â »óȲ¿¡¼­ memsetÀ» ÇÑ´Ù´Â ÀÚü°¡ // ±²ÀåÈ÷ À§ÇèÇÏÁö¸¸, ±âÁ¸¿¡ ÀÌ¹Ì ±×·± »óȲÀÌ ¹ú¾îÁ³±â ¶§¹®¿¡ // Â÷¶ó¸® ÀÌ ¹æ¹ýÀÌ ÃÖ¼±ÀÎ °Í °°¾Æ, ¸â¹ö º¯¼ö·Î µÎ°í ¿©±â¼­ ÃʱâÈ­ ÇÔ memset( &m_nullData, 0, sizeof( T ) ); memset( &m_dummyData, 0, sizeof( T ) ); // ¹öÆÛ »ý¼º //m_dataList.EnlargeSize( MAX_NUM_HANDLES ); //m_magicNoList.EnlargeSize( MAX_NUM_HANDLES ); //m_freeIdxList.EnlargeSize( MAX_NUM_HANDLES ); // ÃʱâÈ­ Clear(); } //------------------------------------------------------------------------------ /** */ template CWzHandleManager::~CWzHandleManager( void ) { // empty } //------------------------------------------------------------------------------ /** */ template void CWzHandleManager::Clear( void ) { m_numFreeIdx = 0; m_maxIndex = 0; m_newMagicNo = 1; m_dataList.Clear(); m_magicNoList.Clear(); m_freeIdxList.Clear(); } //------------------------------------------------------------------------------ /** µ¥ÀÌŸ Ãß°¡ - index : 0 ~ 65534 - magic No : 1 ~ 65534 */ template HANDLE CWzHandleManager::Add( const T& data ) { St_Handle sth; // ÇØÁ¦µÈ À妽º°¡ ÀÖ´Â °æ¿ì if( m_numFreeIdx > 0 ) { sth.m_index = m_freeIdxList.Get( --m_numFreeIdx ); } else { // »õ·Î ÇÒ´çÇÒ °æ¿ì if( m_maxIndex >= MAX_NUM_HANDLES ) { return INVALID_HANDLE_VALUE; } sth.m_index = m_maxIndex++; } // ¸ÅÁ÷ ³Ñ¹ö if( m_newMagicNo > MAX_MAGIC_NO ) { // ¸ÅÁ÷ ³Ñ¹ö´Â 0 µµ ¾ÈµÇ°í 0xFFFF µµ ¾ÈµÇ¾ß Á¤»óÀÎÁö üũÇÒ ¼ö ÀÖ´Ù. m_newMagicNo = 1; } sth.m_magicNo = m_newMagicNo++; // Á¤º¸ ÀúÀå m_dataList.Set( sth.m_index, data ); m_magicNoList.Set( sth.m_index, sth.m_magicNo ); return sth.m_handle; } //------------------------------------------------------------------------------ /** */ template BOOL CWzHandleManager::Release( HANDLE handle ) { // ÇÚµé À¯È¿¼º °Ë»ç if( !IsValidHandle( handle ) ) { return FALSE; } St_Handle sth; sth.m_handle = handle; // ¸ÅÁ÷ ³Ñ¹ö ÃʱâÈ­ m_magicNoList.Set( sth.m_index, 0 ); // xxx : ¾Æ~ °ñ ¶§¸®³×; // ÇÏÆ° ¸¾¿¡ ¾ÈµéÁö¸¸ ÀÏ´ÜÀº ÀÌ·¸°Ô °¡ÀÚ. // ¸ÅÁ÷ ³Ñ¹ö°¡ 0ÀÎ °ÍÀº ¾²·¹±â °ªÀε¥ ¿ÜºÎ¿¡¼­ ÀÌ°É ¹«½ÃÇϰí // Idx_ °è¿­ ÇÔ¼ö¸¦ ÅëÇØ µ¥ÀÌŸ¸¦ ¾ò´Â °æ¿ì°¡ À־, // ¾î¿ ¼ö ¾øÀÌ ¿©±â¼­ ÃʱâÈ­¸¦ ÇØ ÁØ´Ù. m_dataList.Set( sth.m_index, m_nullData ); // ÇØÁ¦ À妽º ¸®½ºÆ®¿¡ Ãß°¡ WzAssert( m_numFreeIdx < m_maxIndex ); m_freeIdxList.Set( m_numFreeIdx, sth.m_index ); ++m_numFreeIdx; // ÇØÁ¦µÈ ¼ö¿Í ÃÖ´ë À妽º°¡ Å©°Å³ª °°Àº °æ¿ì, ÃʱâÈ­ // ´Ü, ³Ê¹« ÀÚÁÖ È£ÃâµÇ´Â °ÍÀ» ¸·±â À§ÇØ ÃÖ¼ÒÇÑÀÇ °ªÀ» µÐ´Ù. if( m_numFreeIdx > MIN_NUM_FOR_CLEAR && m_numFreeIdx >= m_maxIndex ) { Clear(); } return TRUE; } //------------------------------------------------------------------------------ /** */ template const T& CWzHandleManager::GetData( HANDLE handle ) const { if( !IsValidHandle( handle ) ) { return m_dummyData; } St_Handle sth; sth.m_handle = handle; return m_dataList.Get( sth.m_index ); } //------------------------------------------------------------------------------ /** */ template BOOL CWzHandleManager::Replace( HANDLE handle, const T& data ) { if( !IsValidHandle( handle ) ) { return FALSE; } St_Handle sth; sth.m_handle = handle; m_dataList.Set( sth.m_index, data ); return TRUE; } //------------------------------------------------------------------------------ /** */ template BOOL CWzHandleManager::IsValidHandle( HANDLE handle ) const { St_Handle sth; sth.m_handle = handle; // À¯È¿ ÇÚµé ¿©ºÎ, ¸ÅÁ÷ ³Ñ¹ö üũ if( handle == INVALID_HANDLE_VALUE || sth.m_magicNo == 0 ) { return FALSE; } // ÇØ´ç À妽ºÀÇ ¸ÅÁ÷ ³Ñ¹ö¸¦ ¾ò°í unsigned short magicNo = m_magicNoList.Get( sth.m_index ); // ÁÖ¾îÁø ÇÚµéÀÇ ¸ÅÁ÷³Ñ¹ö¿Í ÀúÀåµÈ ¸ÅÁ÷ ³Ñ¹ö¿Í ºñ±³ if( sth.m_magicNo != magicNo ) { return FALSE; } return TRUE; } //------------------------------------------------------------------------------ /** */ template int CWzHandleManager::Idx_GetCount( void ) const { return m_dataList.GetCount(); } //------------------------------------------------------------------------------ /** */ template const T& CWzHandleManager::Idx_GetData( int index ) const { return m_dataList.Get( index ); } //------------------------------------------------------------------------------ /** */ template unsigned short CWzHandleManager::Idx_GetMagicNumber( int index ) const { return m_magicNoList.Get( index ); } //------------------------------------------------------------------------------ /** */ template void CWzHandleManager::Idx_Release( int index ) { St_Handle sth; sth.m_index = index; sth.m_magicNo = Idx_GetMagicNumber( index ); Release( sth.m_handle ); } #endif // _PROGRAMCOMMON_WZHANDLEMANAGER_H_