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

模拟服务器

开发平台:

Visual C++

  1. #define _MAX_USER_ARRAY 5000
  2. /*
  3. typedef struct tag_TDYNAMICARRAY
  4. {
  5. CSessionInfo* pInfo;
  6. } _TDYNAMICARRAY, *_LPTDYNAMICARRAY;
  7. */
  8. template <class T> class CWHDynamicArray
  9. {
  10. protected:
  11. T* m_Elements[_MAX_USER_ARRAY];
  12. BOOL m_IsAvElements[_MAX_USER_ARRAY];
  13. int m_nLastRemoveIndex;
  14. int m_nLastInsertIndex;
  15. public:
  16. CWHDynamicArray();
  17. ~CWHDynamicArray();
  18. int AttachData(T* pElement);
  19. void DettachData(int nIndex);
  20. int GetAvailablePosition();
  21. T* GetEmptyElement(int nIndex);
  22. BOOL SetEmptyElement(int nIndex, T* pElement);
  23. __inline T* GetData(int nIndex) { if (nIndex >= 0 && nIndex <= _MAX_USER_ARRAY) return m_Elements[nIndex]; return NULL; }
  24. };
  25. template <class T> CWHDynamicArray<T>::CWHDynamicArray()
  26. {
  27. m_nLastRemoveIndex = 0;
  28. m_nLastInsertIndex = 0;
  29. for (int i = 0; i < _MAX_USER_ARRAY; i++)
  30. {
  31. m_Elements[i] = NULL;
  32. m_IsAvElements[i] = FALSE;
  33. }
  34. }
  35. template <class T> CWHDynamicArray<T>::~CWHDynamicArray()
  36. {
  37. for (int i = 0; i < _MAX_USER_ARRAY; i++)
  38. {
  39. if (m_Elements[i])
  40. {
  41. delete m_Elements[i];
  42. m_Elements[i] = NULL;
  43. }
  44. m_IsAvElements[i] = FALSE;
  45. }
  46. }
  47. template <class T> int CWHDynamicArray<T>::GetAvailablePosition()
  48. {
  49. int nIndex = -1;
  50. nIndex = m_nLastRemoveIndex;
  51. if (m_IsAvElements[nIndex] == FALSE)
  52. return nIndex;
  53. for (int i = m_nLastInsertIndex; i < _MAX_USER_ARRAY; i++)
  54. {
  55. if (m_IsAvElements[i] == FALSE)
  56. return i;
  57. }
  58. for (i = 0; i < m_nLastInsertIndex; i++)
  59. {
  60. if (m_IsAvElements[i] == FALSE)
  61. return i;
  62. }
  63. return -1;
  64. }
  65. template <class T> T* CWHDynamicArray<T>::GetEmptyElement(int nIndex)
  66. {
  67. if (m_IsAvElements[nIndex] == FALSE)
  68. {
  69. if (!m_Elements[nIndex])
  70. m_Elements[nIndex] = new T;
  71. m_IsAvElements[nIndex] = TRUE;
  72. return m_Elements[nIndex];
  73. }
  74. return NULL;
  75. }
  76. template <class T> BOOL CWHDynamicArray<T>::SetEmptyElement(int nIndex, T* pElement)
  77. {
  78. if (m_IsAvElements[nIndex] == TRUE && m_Elements[nIndex] == pElement)
  79. {
  80. m_IsAvElements[nIndex] = FALSE;
  81. return TRUE;
  82. }
  83. return FALSE;
  84. }
  85. template <class T> int CWHDynamicArray<T>::AttachData(T* pElement)
  86. {
  87. int nIndex = -1;
  88. nIndex = m_nLastRemoveIndex;
  89. if (m_Elements[nIndex] == NULL && m_IsAvElements[nIndex] == FALSE)
  90. {
  91. m_Elements[nIndex] = pElement;
  92. m_IsAvElements[nIndex] = TRUE;
  93. return nIndex;
  94. }
  95. for (int i = m_nLastInsertIndex; i < _MAX_USER_ARRAY; i++)
  96. {
  97. if (m_Elements[i] == NULL && m_IsAvElements[i] == FALSE)
  98. {
  99. m_Elements[i] = pElement;
  100. m_IsAvElements[i] = TRUE;
  101. m_nLastInsertIndex = i;
  102. nIndex = i;
  103. return nIndex;
  104. }
  105. }
  106. for (i = 0; i < m_nLastInsertIndex; i++)
  107. {
  108. if (m_Elements[i] == NULL && m_IsAvElements[i] == FALSE)
  109. {
  110. m_Elements[i] = pElement;
  111. m_IsAvElements[i] = TRUE;
  112. m_nLastInsertIndex = i;
  113. nIndex = i;
  114. return nIndex;
  115. }
  116. }
  117. }
  118. template <class T> void CWHDynamicArray<T>::DettachData(int nIndex)
  119. {
  120. if (nIndex >= 0 && nIndex <= _MAX_USER_ARRAY)
  121. {
  122. m_Elements[nIndex] = NULL;
  123. m_IsAvElements[nIndex] = FALSE;
  124. m_nLastRemoveIndex = nIndex;
  125. }
  126. }