www.pudn.com > evil¡¯s illusion Server Codes.rar > map.h


 
 
/* 
	Map 
 
	Date: 
		2001/02/05  
 
	Note:  
		ÇØ½¬ Å×À̺íÀ» ÀÌ¿ëÇÑ ¸Ê Ŭ·¡½º 
		Division Hash ÇÔ¼ö¸¦ »ç¿ëÇÏ¸ç °¢ ¹öŶ¿¡ ´ëÇØ¼­ ÀÌÁø Ž»öÀ» ¼öÇàÇÑ´Ù. 
		Key´Â ¹®ÀÚ¿­(char *)À» »ç¿ëÇÑ´Ù. 
 
	Usage: 
		InitHashTable·Î ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí UninitHashTable·Î ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù. 
		»ç¿ëÇϱâ Àü¿¡ ¹Ýµå½Ã SetGetKeyFunctionÀ» È£ÃâÇÏ¿©¾ß ÇÑ´Ù. 
*/ 
#ifndef __ORZ_DATASTRUCTURE_MAP__ 
#define __ORZ_DATASTRUCTURE_MAP__ 
 
 
 
#include "bstree.h" 
#include "prime.h" 
 
 
// ÇØ½¬ Å×À̺íÀ» ÃʱâÈ­ÇÒ ¶§ »ç¿ëµÇ´Â Ç÷¡±× 
#define IHT_UNTOUCH		1	// ÁöÁ¤µÈ Å©±â¸¦ ±×´ë·Î »ç¿ëÇÑ´Ù. 
#define IHT_ROUNDUP		2	// ÁöÁ¤µÈ Å©±â¿Í °¡Àå °¡±î¿î ¼Ò¼ö(Å«°ª)¸¦ »ç¿ëÇÑ´Ù. 
#define IHT_ROUNDDOWN	3	// ÁöÁ¤µÈ Å©±â¿Í °¡Àå °¡±î¿î ¼Ò¼ö(ÀÛÀº°ª)¸¦ »ç¿ëÇÑ´Ù. 
 
 
/* 
	CMap Ŭ·¡½º Á¤ÀÇ 
 
	Note: TÀÇ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ´Ù. 
*/ 
template< class T > 
class CMap 
{ 
protected: 
	CBsTree< T > *m_pHashTable; 
 
	int  m_nDemandSize; 
	int  m_nRealSize; 
	int  m_nCount; 
 
	char * (*m_pfnGetKey)( T *pData );  
 
public: 
	CMap(); 
	virtual ~CMap(); 
 
	virtual bool InitHashTable( int nDemandSize, int nFlags = IHT_UNTOUCH ); 
	virtual void UninitHashTable( bool bDeleteData = true, bool bDeleteArray = false ); 
 
	virtual void SetGetKeyFunction( char * (*pfnGetKey)( T * ) ); 
 
	virtual bool Insert( T *pData ); 
	virtual T *  Remove( T *pKey ); 
	virtual T *  Search( T *pKey ); 
	virtual T *  SearchKey( char *pKey ); 
	 
	virtual int  GetCount(); 
	virtual bool IsEmpty(); 
 
	virtual int  GetHashKey( T *pData, bool bUseCallbackFunc = true ); 
 
protected: 
	static int __cbCmpString( void *pArg, T *pFirst, T *pSecond ); 
	static int __cbCmpKeyString( void *pArg, T *pData, char *pKey ); 
}; 
 
 
 
 
/* 
	±¸Çö 
*/ 
template< class T > 
CMap< T >::CMap() 
{ 
	m_pHashTable	= NULL; 
	m_nDemandSize	= 0; 
	m_nRealSize		= 0; 
	m_nCount		= 0; 
	m_pfnGetKey		= NULL; 
} 
 
 
template< class T > 
CMap< T >::~CMap() 
{ 
} 
 
 
template< class T > 
bool CMap< T >::InitHashTable( int nDemandSize, int nFlags ) 
{ 
	m_nDemandSize = nDemandSize; 
	 
	// ½ÇÁ¦ ¹öŶ Å©±â¸¦ ±¸ÇÑ´Ù. 
	switch ( nFlags ) 
	{ 
	case IHT_UNTOUCH: 
		m_nRealSize = nFlags; 
		break; 
 
	case IHT_ROUNDUP: 
		m_nRealSize = CPrime::RoundUp( nDemandSize ); 
		break; 
 
	case IHT_ROUNDDOWN: 
		m_nRealSize = CPrime::RoundDown( nDemandSize ); 
		break; 
	} 
 
	// ³ëµå ¹è¿­ ÇÒ´ç 
	m_pHashTable = new CBsTree< T >[ m_nRealSize ]; 
	if ( m_pHashTable ) 
	{ 
		for ( int i = 0; i < m_nRealSize; i++ ) 
		{ 
			m_pHashTable[i].SetCompareFunction( __cbCmpString, this ); 
			m_pHashTable[i].SetCompareStringFunction( __cbCmpKeyString, this ); 
		} 
	} 
 
	return m_pHashTable ? true : false; 
} 
 
 
template< class T > 
void CMap< T >::UninitHashTable( bool bDeleteData, bool bDeleteArray ) 
{ 
	if ( m_pHashTable ) 
	{ 
		for ( int i = 0; i < m_nRealSize; i++ ) 
			m_pHashTable[i].ClearAll( bDeleteData, bDeleteArray ); 
 
		delete[] m_pHashTable; 
		m_pHashTable = NULL; 
	} 
} 
 
 
 
template< class T > 
void CMap< T >::SetGetKeyFunction( char * (*pfnGetKey)( T * ) ) 
{ 
	m_pfnGetKey = pfnGetKey; 
} 
 
 
template< class T > 
bool CMap< T >::Insert( T *pData ) 
{ 
	if ( m_pHashTable[ GetHashKey( pData ) ].Insert( pData ) ) 
	{ 
		++m_nCount; 
		return true; 
	} 
 
	return false; 
} 
 
 
 
template< class T > 
T * CMap< T >::Remove( T *pKey ) 
{ 
	T *pData = m_pHashTable[ GetHashKey( pKey ) ].Remove( pKey ); 
	if ( pData ) 
		--m_nCount; 
 
	return pData; 
} 
 
 
template< class T > 
T * CMap< T >::Search( T *pKey ) 
{ 
	return m_pHashTable[ GetHashKey( pKey ) ].Search( pKey ); 
} 
 
 
template< class T > 
T * CMap< T >::SearchKey( char *pKey ) 
{ 
	return m_pHashTable[ GetHashKey( (T *) pKey, false ) ].SearchKeyString( pKey ); 
} 
 
 
template< class T > 
int CMap< T >::GetCount() 
{ 
	return m_nCount; 
} 
 
 
template< class T > 
bool CMap< T >::IsEmpty() 
{ 
	return m_nCount == 0; 
} 
 
 
template< class T > 
int CMap< T >::GetHashKey( T *pData, bool bUseCallbackFunc ) 
{ 
	int  nKeyLen = 0; 
	char *pKey = bUseCallbackFunc ? m_pfnGetKey( pData ) : (char *) pData; 
 
	while ( *pKey ) 
		nKeyLen += (unsigned char) *pKey++; 
 
	return nKeyLen % m_nRealSize; 
} 
 
 
template< class T > 
int CMap< T >::__cbCmpString( void *pArg, T *pFirst, T *pSecond ) 
{ 
	return strcmp( ((CMap< T > *) pArg)->m_pfnGetKey( pFirst ), ((CMap< T > *) pArg)->m_pfnGetKey( pSecond ) ); 
} 
 
 
template< class T > 
int CMap< T >::__cbCmpKeyString( void *pArg, T *pData, char *pString ) 
{ 
	return strcmp( ((CMap< T > *) pArg)->m_pfnGetKey( pData ), pString ); 
} 
 
 
#endif