map.h
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2. Map
  3. Date:
  4. 2001/02/05 
  5. Note: 
  6. 秦浆 抛捞喉阑 捞侩茄 甘 努贰胶
  7. Division Hash 窃荐甫 荤侩窍哥 阿 滚哦俊 措秦辑 捞柳 沤祸阑 荐青茄促.
  8. Key绰 巩磊凯(char *)阑 荤侩茄促.
  9. Usage:
  10. InitHashTable肺 鞘夸茄 皋葛府甫 且寸窍绊 UninitHashTable肺 皋葛府甫 秦力茄促.
  11. 荤侩窍扁 傈俊 馆靛矫 SetGetKeyFunction阑 龋免窍咯具 茄促.
  12. */
  13. #ifndef __ORZ_DATASTRUCTURE_MAP__
  14. #define __ORZ_DATASTRUCTURE_MAP__
  15. #include "bstree.h"
  16. #include "prime.h"
  17. // 秦浆 抛捞喉阑 檬扁拳且 锭 荤侩登绰 敲贰弊
  18. #define IHT_UNTOUCH 1 // 瘤沥等 农扁甫 弊措肺 荤侩茄促.
  19. #define IHT_ROUNDUP 2 // 瘤沥等 农扁客 啊厘 啊鳖款 家荐(奴蔼)甫 荤侩茄促.
  20. #define IHT_ROUNDDOWN 3 // 瘤沥等 农扁客 啊厘 啊鳖款 家荐(累篮蔼)甫 荤侩茄促.
  21. /*
  22. CMap 努贰胶 沥狼
  23. Note: T狼 器牢磐甫 荤侩茄促.
  24. */
  25. template< class T >
  26. class CMap
  27. {
  28. protected:
  29. CBsTree< T > *m_pHashTable;
  30. int  m_nDemandSize;
  31. int  m_nRealSize;
  32. int  m_nCount;
  33. char * (*m_pfnGetKey)( T *pData ); 
  34. public:
  35. CMap();
  36. virtual ~CMap();
  37. virtual bool InitHashTable( int nDemandSize, int nFlags = IHT_UNTOUCH );
  38. virtual void UninitHashTable( bool bDeleteData = true, bool bDeleteArray = false );
  39. virtual void SetGetKeyFunction( char * (*pfnGetKey)( T * ) );
  40. virtual bool Insert( T *pData );
  41. virtual T *  Remove( T *pKey );
  42. virtual T *  Search( T *pKey );
  43. virtual T *  SearchKey( char *pKey );
  44. virtual int  GetCount();
  45. virtual bool IsEmpty();
  46. virtual int  GetHashKey( T *pData, bool bUseCallbackFunc = true );
  47. protected:
  48. static int __cbCmpString( void *pArg, T *pFirst, T *pSecond );
  49. static int __cbCmpKeyString( void *pArg, T *pData, char *pKey );
  50. };
  51. /*
  52. 备泅
  53. */
  54. template< class T >
  55. CMap< T >::CMap()
  56. {
  57. m_pHashTable = NULL;
  58. m_nDemandSize = 0;
  59. m_nRealSize = 0;
  60. m_nCount = 0;
  61. m_pfnGetKey = NULL;
  62. }
  63. template< class T >
  64. CMap< T >::~CMap()
  65. {
  66. }
  67. template< class T >
  68. bool CMap< T >::InitHashTable( int nDemandSize, int nFlags )
  69. {
  70. m_nDemandSize = nDemandSize;
  71. // 角力 滚哦 农扁甫 备茄促.
  72. switch ( nFlags )
  73. {
  74. case IHT_UNTOUCH:
  75. m_nRealSize = nFlags;
  76. break;
  77. case IHT_ROUNDUP:
  78. m_nRealSize = CPrime::RoundUp( nDemandSize );
  79. break;
  80. case IHT_ROUNDDOWN:
  81. m_nRealSize = CPrime::RoundDown( nDemandSize );
  82. break;
  83. }
  84. // 畴靛 硅凯 且寸
  85. m_pHashTable = new CBsTree< T >[ m_nRealSize ];
  86. if ( m_pHashTable )
  87. {
  88. for ( int i = 0; i < m_nRealSize; i++ )
  89. {
  90. m_pHashTable[i].SetCompareFunction( __cbCmpString, this );
  91. m_pHashTable[i].SetCompareStringFunction( __cbCmpKeyString, this );
  92. }
  93. }
  94. return m_pHashTable ? true : false;
  95. }
  96. template< class T >
  97. void CMap< T >::UninitHashTable( bool bDeleteData, bool bDeleteArray )
  98. {
  99. if ( m_pHashTable )
  100. {
  101. for ( int i = 0; i < m_nRealSize; i++ )
  102. m_pHashTable[i].ClearAll( bDeleteData, bDeleteArray );
  103. delete[] m_pHashTable;
  104. m_pHashTable = NULL;
  105. }
  106. }
  107. template< class T >
  108. void CMap< T >::SetGetKeyFunction( char * (*pfnGetKey)( T * ) )
  109. {
  110. m_pfnGetKey = pfnGetKey;
  111. }
  112. template< class T >
  113. bool CMap< T >::Insert( T *pData )
  114. {
  115. if ( m_pHashTable[ GetHashKey( pData ) ].Insert( pData ) )
  116. {
  117. ++m_nCount;
  118. return true;
  119. }
  120. return false;
  121. }
  122. template< class T >
  123. T * CMap< T >::Remove( T *pKey )
  124. {
  125. T *pData = m_pHashTable[ GetHashKey( pKey ) ].Remove( pKey );
  126. if ( pData )
  127. --m_nCount;
  128. return pData;
  129. }
  130. template< class T >
  131. T * CMap< T >::Search( T *pKey )
  132. {
  133. return m_pHashTable[ GetHashKey( pKey ) ].Search( pKey );
  134. }
  135. template< class T >
  136. T * CMap< T >::SearchKey( char *pKey )
  137. {
  138. return m_pHashTable[ GetHashKey( (T *) pKey, false ) ].SearchKeyString( pKey );
  139. }
  140. template< class T >
  141. int CMap< T >::GetCount()
  142. {
  143. return m_nCount;
  144. }
  145. template< class T >
  146. bool CMap< T >::IsEmpty()
  147. {
  148. return m_nCount == 0;
  149. }
  150. template< class T >
  151. int CMap< T >::GetHashKey( T *pData, bool bUseCallbackFunc )
  152. {
  153. int  nKeyLen = 0;
  154. char *pKey = bUseCallbackFunc ? m_pfnGetKey( pData ) : (char *) pData;
  155. while ( *pKey )
  156. nKeyLen += (unsigned char) *pKey++;
  157. return nKeyLen % m_nRealSize;
  158. }
  159. template< class T >
  160. int CMap< T >::__cbCmpString( void *pArg, T *pFirst, T *pSecond )
  161. {
  162. return strcmp( ((CMap< T > *) pArg)->m_pfnGetKey( pFirst ), ((CMap< T > *) pArg)->m_pfnGetKey( pSecond ) );
  163. }
  164. template< class T >
  165. int CMap< T >::__cbCmpKeyString( void *pArg, T *pData, char *pString )
  166. {
  167. return strcmp( ((CMap< T > *) pArg)->m_pfnGetKey( pData ), pString );
  168. }
  169. #endif