pool.h
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. #ifndef _INORDPOOL_H
  2. #define _INORDPOOL_H
  3. #define DEFPOOLSIZE 32
  4. #define DEFRECYCLESIZE DEFPOOLSIZE
  5. #define DEFRECORDSIZE 4
  6. //-----------------------------------------------------------------------------
  7. // Name: Template class CInordPool
  8. // Desc: Class to create a pool for memory used and recycle
  9. //-----------------------------------------------------------------------------
  10. template <typename elemType>
  11. class CInordPool {
  12. elemType *m_pPoolArray;
  13. int m_nPoolUsed, m_nPoolTotal;
  14. int m_nEnlargeSize;
  15. elemType **m_pRecycleArray;
  16. int m_nRecycleSize, m_nRecycleRemain;
  17. elemType **m_pRecord;
  18. int m_nRecordSize, m_nRecordUsed;
  19. bool m_bInitialized;
  20. public:
  21. CInordPool();
  22. ~CInordPool();
  23. // Access functions
  24. void SetEnlargeSize( int size ) { if ( size > 0 ) m_nEnlargeSize = size; }
  25. // Creation/destruction methods
  26. bool InitPool( int poolsize );
  27. void DestroyPool();
  28. // Methods
  29. elemType *GetUsable();
  30. void Recycle( elemType *pvalid );
  31. protected:
  32. bool CreatePool();
  33. // Access functions
  34. void SetValid( bool flag ) { m_bInitialized = flag; }
  35. // Status functions
  36. bool IsValid() { return m_bInitialized; }
  37. bool IsPoorRemain() { return m_nPoolUsed<m_nPoolTotal; }
  38. bool IsRecycleRemain() { return m_nRecycleRemain>0; }
  39. bool IsRecycleFull() { return m_nRecycleRemain==m_nRecycleSize; }
  40. };
  41. //-----------------------------------------------------------------------------
  42. // Name: CDisplay()
  43. // Desc:
  44. //-----------------------------------------------------------------------------
  45. template <typename elemType>
  46. CInordPool<elemType>::CInordPool() {
  47. SetValid( false );
  48. }
  49. //-----------------------------------------------------------------------------
  50. // Name: CDisplay()
  51. // Desc:
  52. //-----------------------------------------------------------------------------
  53. template <typename elemType>
  54. CInordPool<elemType>::~CInordPool() {
  55. DestroyPool();
  56. }
  57. //-----------------------------------------------------------------------------
  58. // Name: CDisplay()
  59. // Desc:
  60. //-----------------------------------------------------------------------------
  61. template <typename elemType>
  62. bool CInordPool<elemType>::InitPool( int poolsize ) {
  63. if ( IsValid() )
  64. return false;
  65. // set enlarge size;
  66. if ( poolsize > 0 ) 
  67. m_nEnlargeSize = poolsize;
  68. else
  69. m_nEnlargeSize = DEFPOOLSIZE;
  70. // create a new recycle stack
  71. m_nRecycleSize = m_nEnlargeSize;
  72. m_pRecycleArray =( elemType ** )new LPVOID[m_nRecycleSize];
  73. if ( !m_pRecycleArray )
  74. return false;
  75. m_nRecycleRemain = 0;
  76. // clear record array
  77. m_nRecordSize = 0;
  78. m_nRecordUsed = 0;
  79. m_pRecord = NULL;
  80. // create a new pool
  81. if ( CreatePool() ) {
  82. // set valid
  83. SetValid( true );
  84. return true;
  85. } else
  86. return false;
  87. }
  88. //-----------------------------------------------------------------------------
  89. // Name: CDisplay()
  90. // Desc:
  91. //-----------------------------------------------------------------------------
  92. template <typename elemType>
  93. void CInordPool<elemType>::DestroyPool() {
  94. if ( !IsValid() )
  95. return ;
  96. SAFE_DELETE_ARRAY( m_pRecycleArray );
  97. if ( m_pRecord ) 
  98. for( int i=0; i<m_nRecordUsed; i++ )
  99. SAFE_DELETE_ARRAY( m_pRecord[i] );
  100. SAFE_DELETE_ARRAY( m_pRecord );
  101. SetValid( false );
  102. }
  103. //-----------------------------------------------------------------------------
  104. // Name: CDisplay()
  105. // Desc:
  106. //-----------------------------------------------------------------------------
  107. template <typename elemType>
  108. bool CInordPool<elemType>::CreatePool() {
  109. // create a new pool
  110. m_pPoolArray = new elemType[m_nEnlargeSize];
  111. if ( !m_pPoolArray )
  112. return false;
  113. m_nPoolUsed = 0;
  114. m_nPoolTotal = m_nEnlargeSize;
  115. // add record
  116. if ( m_nRecordSize == m_nRecordUsed ) {
  117. m_nRecordSize += DEFRECORDSIZE;
  118. elemType **ptr = m_pRecord;
  119. m_pRecord =(elemType **)new LPVOID[m_nRecordSize];
  120. if ( m_pRecord ) {
  121. if ( ptr ) {
  122. memcpy( m_pRecord, ptr, sizeof(elemType *)*m_nRecordUsed );
  123. SAFE_DELETE_ARRAY( ptr );
  124. }
  125. } else {
  126. m_pRecord = ptr;
  127. m_nRecordSize = m_nRecordUsed;
  128. return false;
  129. }
  130. }
  131. m_pRecord[m_nRecordUsed] = m_pPoolArray;
  132. m_nRecordUsed++;
  133. return true;
  134. }
  135. //-----------------------------------------------------------------------------
  136. // Name: CDisplay()
  137. // Desc:
  138. //-----------------------------------------------------------------------------
  139. template <typename elemType>
  140. elemType *CInordPool<elemType>::GetUsable() {
  141. if ( !IsValid() )
  142. return NULL;
  143. if( IsPoorRemain() ) {
  144. m_nPoolUsed++;
  145. return &m_pPoolArray[m_nPoolUsed-1];
  146. else if ( IsRecycleRemain() ) {
  147. m_nRecycleRemain--;
  148. return m_pRecycleArray[m_nRecycleRemain];
  149. else if ( CreatePool() ) {
  150. m_nPoolUsed++;
  151. return &m_pPoolArray[m_nPoolUsed-1];
  152. else
  153. return NULL;
  154. }
  155. //-----------------------------------------------------------------------------
  156. // Name: CDisplay()
  157. // Desc:
  158. //-----------------------------------------------------------------------------
  159. template <typename elemType>
  160. void CInordPool<elemType>::Recycle( elemType *pvalid ) {
  161. if ( !pvalid )
  162. return ;
  163. if ( !IsValid() ) {
  164. SAFE_DELETE( pvalid );
  165. return ;
  166. }
  167. if ( IsRecycleFull() ) {
  168. // create a new recycle stack
  169. elemType **ptr = m_pRecycleArray;
  170. m_pRecycleArray =(elemType **)new LPVOID[m_nRecycleSize+m_nEnlargeSize];
  171. if ( !m_pRecycleArray ) {
  172. // restore
  173. m_pRecycleArray = ptr;
  174. SAFE_DELETE( pvalid );
  175. return ;
  176. }
  177. else {
  178. memcpy( m_pRecycleArray, ptr, sizeof(elemType *)*m_nRecycleSize );
  179. SAFE_DELETE_ARRAY( ptr );
  180. m_nRecycleSize += m_nEnlargeSize;
  181. }
  182. }
  183. m_pRecycleArray[m_nRecycleRemain] = pvalid;
  184. m_nRecycleRemain++;
  185. }
  186. #endif // _INORDPOOL_H