PushList.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #pragma once
  20. class ReqBlock {
  21. public:
  22. UINT blockID; // 编号
  23. DWORD reqTime; // 开始请求的时间
  24. bool operator == (const UINT& blockID) const {
  25. return (this->blockID == blockID);
  26. };
  27. };
  28. class PushList {
  29. public:
  30. // 构造函数
  31. explicit PushList() : m_array(0), m_totalsize(0), m_validsize(0) {
  32. };
  33. // 拷贝构造函数
  34. explicit PushList(const PushList& another) : m_array(NULL), m_totalsize(another.m_totalsize), m_validsize(another.m_validsize) {
  35. if(m_totalsize) {
  36. m_array = new ReqBlock[m_totalsize];
  37. memcpy(m_array, another.m_array, m_validsize*sizeof(ReqBlock));
  38. }
  39. };
  40. virtual ~PushList(void) {
  41. m_totalsize = 0;
  42. m_validsize = 0;
  43. delete [] m_array;
  44. m_array = NULL;
  45. }
  46. // 添加一个块
  47. bool AddBlock(UINT blockID, DWORD reqTime=0) {
  48. assert(blockID != UINT_MAX);
  49. // 查找是否存在重复的块,如果存在就返回false
  50. if(find(m_array, m_array+m_validsize, blockID)  != m_array+m_validsize)
  51. return false;
  52. ReqBlock* temp = m_array;
  53. if(m_validsize == m_totalsize) {
  54. // 如果没有无效区间可以使用,那么需要增加数组大小
  55. // 分配一个空间更大的数组,并把区间i之前的数据复制过去
  56. m_array = new ReqBlock[m_validsize+1];
  57. memcpy(m_array, temp, m_validsize*sizeof(ReqBlock));
  58. }
  59. // 将此块添加到数组末尾
  60. m_array[m_validsize].blockID = blockID;
  61. m_array[m_validsize].reqTime = reqTime;
  62. // 此时m_totalsize和m_validsize尚未增加计数,所以可以用来判断是否增加过区间大小
  63. if(m_validsize == m_totalsize) {
  64. // 删除旧的数组,并增加数组大小的计数
  65. delete [] temp;
  66. ++m_totalsize;
  67. }
  68. ++m_validsize;
  69. return true;
  70. };
  71. // 删除一个块
  72. bool DelBlock(UINT blockID, DWORD * const reqTime=NULL) {
  73. assert(blockID != UINT_MAX);
  74. // 查找是否存在此块,如果不存在就返回false
  75. ReqBlock* index = find(m_array, m_array+m_validsize, blockID);
  76. if(index == m_array+m_validsize)
  77. return false;
  78. // 获取此块开始请求的时间
  79. if(reqTime)
  80. *reqTime = index->reqTime;
  81. // 删除此块,并将后面的块向前移动
  82. memcpy(index, index+1, (m_array+m_validsize-index-1)*sizeof(ReqBlock));
  83. --m_validsize;
  84. return true;
  85. };
  86. // 查找一个block是否存在
  87. bool FindBlock(const UINT blockID) const {
  88. // 查找是否存在此块,如果不存在就返回false
  89. return (find(m_array, m_array+m_validsize, blockID) != m_array+m_validsize);
  90. };
  91. // 复制block数组到传入的指针,传入需要的个数,返回实际复制的个数
  92. void CopyPushList(UINT* targetArray, UINT8& size) const {
  93. if(!targetArray || size == 0)
  94. return;
  95. size = min(size, m_validsize);
  96. for(UINT8 i = 0; i < size; ++i) {
  97. targetArray[i] = m_array[i].blockID;
  98. }
  99. //memcpy(targetArray, m_array, size*sizeof(UINT));
  100. };
  101. // 清空列表
  102. void Clear() {
  103. m_validsize = 0;
  104. };
  105. // 测试代码,打印出当前数组中的项
  106. void Print() const {
  107. printf("nTOTAL: %d, VALID: %d.n", m_totalsize, m_validsize);
  108. for(UINT8 i = 0; i < m_validsize; ++i) {
  109. printf("BLOCKID: %d, REQTIME: %d.n", m_array[i].blockID, m_array[i].reqTime);
  110. }
  111. };
  112. // 取得有效元素的个数
  113. UINT8 GetValidSize() {
  114. return m_validsize;
  115. };
  116. // 取得当前容量
  117. UINT8 GetTotalSize() {
  118. return m_totalsize;
  119. };
  120. // 取出第一个元素
  121. void GetFirstBlock(UINT& blockID) {
  122. if(!m_validsize)
  123. blockID = UINT_MAX;
  124. else {
  125. blockID = m_array[0].blockID;
  126. memcpy(m_array, m_array+1, (m_validsize-1)*sizeof(ReqBlock));
  127. --m_validsize;
  128. }
  129. };
  130. private:
  131. // 正在请求的块,保证无重复
  132. ReqBlock* m_array;
  133. // 数组的使用大小
  134. UINT8 m_totalsize;
  135. // 从数组头部开始有效元素的个数
  136. UINT8 m_validsize;
  137. };