KLinkArrayTemplate.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef KLINKARRAYTEMPLATE_H
  2. #define KLINKARRAYTEMPLATE_H
  3. template <class T, size_t ulSize>
  4. class KLinkArrayTemplate 
  5. {
  6. private:
  7. size_t m_ulTotalSize;
  8. public:
  9. size_t m_ulFreeSize;
  10. T m_Data[ulSize];
  11. KLinkArray m_FreeIdx; // 可用表
  12. KLinkArray m_UseIdx;
  13. T *  Add()
  14. {
  15. unsigned long ulIndex = 0;
  16. FindFree(ulIndex);
  17. if (!ulIndex)
  18. return NULL;
  19. m_ulFreeSize --;
  20. m_FreeIdx.Remove(ulIndex);
  21. m_UseIdx.Insert(ulIndex);
  22. return &m_Data[ulIndex];
  23. }
  24. unsigned long Add(T * pT)
  25. {
  26. unsigned long ulIndex = 0;
  27. FindFree(ulIndex);
  28. if (!ulIndex)
  29. return 0;
  30. m_Data[ulIndex] = *pT;
  31. m_ulFreeSize --;
  32. m_FreeIdx.Remove(ulIndex);
  33. m_UseIdx.Insert(ulIndex);
  34. return ulIndex;
  35. }
  36. unsigned long Remove(T *pSame)
  37. {
  38. unsigned long ulSameIndex = FindSame(pSame);
  39. if (!ulSameIndex) 
  40. return 0;
  41. return Remove(ulSameIndex);
  42. }
  43. unsigned long Remove(unsigned long ulIndex)
  44. {
  45. if (ulIndex > m_ulTotalSize)
  46. return 0;
  47. m_UseIdx.Remove(ulIndex);
  48. m_FreeIdx.Insert(ulIndex);
  49. m_ulFreeSize ++;
  50. return ulIndex;
  51. }
  52. void Clear()
  53. {
  54. while(1)
  55. {
  56. int nIdx = m_UseIdx.GetNext(0);
  57. if (nIdx)
  58. {
  59. m_UseIdx.Remove(nIdx);
  60. m_FreeIdx.Insert(nIdx);
  61. }
  62. else
  63. {
  64. break;
  65. }
  66. }
  67. m_ulFreeSize = ulSize - 1;
  68. }
  69. KLinkArrayTemplate()
  70. {
  71. m_ulTotalSize = m_ulFreeSize = ulSize - 1;//由于index0是无效的,所以实际数量要减一个
  72. m_FreeIdx.Init(ulSize);
  73. m_UseIdx.Init(ulSize);
  74. for (int i = ulSize - 1; i > 0 ; i --)
  75. {
  76. m_FreeIdx.Insert(i);
  77. }
  78. Clear();
  79. }
  80. T * FindFree(unsigned long & ulIndex) 
  81. {
  82. ulIndex =  m_FreeIdx.GetNext(0);
  83. if (!ulIndex)
  84. return NULL;
  85. return &m_Data[ulIndex];
  86. };
  87. T * GetData(unsigned long ulIndex)  
  88. {
  89. if (ulIndex > m_ulTotalSize || ulIndex == 0)
  90. return NULL;
  91. return &m_Data[ulIndex];
  92. }
  93. T * GetData(T * pT) 
  94. {
  95. unsigned long ulIndex = FindSame(pT);
  96. if (!ulIndex)
  97. return  NULL;
  98. return &m_Data[ulIndex];
  99. }
  100. unsigned long FindSame(unsigned long ulKey)
  101. {
  102. int nIdx = 0;
  103. while(1)
  104. {
  105. nIdx = m_UseIdx.GetNext(nIdx);
  106. if (!nIdx)
  107. break;
  108. if (ulKey == m_Data[nIdx].m_dwKey)
  109. return nIdx;
  110. }
  111. }
  112. unsigned long GetFreeCount() const
  113. {
  114. return m_ulFreeSize;
  115. };
  116. unsigned long GetUsedCount() const
  117. {
  118. _ASSERT(m_ulTotalSize >= m_ulFreeSize);
  119. return m_ulTotalSize - m_ulFreeSize;
  120. };
  121. unsigned long GetTotalCount() const 
  122. {
  123. return m_ulTotalSize;
  124. };
  125. virtual unsigned long FindSame(T *pSame) = 0;
  126. };
  127. #endif