诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

446 lines
10 KiB

  1. #ifndef ARRAY_HEAD_FILE
  2. #define ARRAY_HEAD_FILE
  3. #pragma once
  4. //////////////////////////////////////////////////////////////////////////////////
  5. //数组模板类
  6. template <class TYPE, class ARG_TYPE=const TYPE &> class CWHArray
  7. {
  8. //变量定义
  9. protected:
  10. TYPE * m_pData; //数组指针
  11. INT_PTR m_nMaxCount; //缓冲数目
  12. INT_PTR m_nGrowCount; //增长数目
  13. INT_PTR m_nElementCount; //元素数目
  14. //函数定义
  15. public:
  16. //构造函数
  17. CWHArray();
  18. //析构函数
  19. virtual ~CWHArray();
  20. //信息函数
  21. public:
  22. //是否空组
  23. bool IsEmpty() const;
  24. //获取数目
  25. INT_PTR GetCount() const;
  26. //功能函数
  27. public:
  28. //获取缓冲
  29. TYPE * GetData();
  30. //获取缓冲
  31. const TYPE * GetData() const;
  32. //增加元素
  33. INT_PTR Add(ARG_TYPE newElement);
  34. //拷贝数组
  35. VOID Copy(const CWHArray & Src);
  36. //追加数组
  37. INT_PTR Append(const CWHArray & Src);
  38. //获取元素
  39. TYPE & GetAt(INT_PTR nIndex);
  40. //获取元素
  41. const TYPE & GetAt(INT_PTR nIndex) const;
  42. //获取元素
  43. TYPE & ElementAt(INT_PTR nIndex);
  44. //获取元素
  45. const TYPE & ElementAt(INT_PTR nIndex) const;
  46. //操作函数
  47. public:
  48. //设置大小
  49. VOID SetSize(INT_PTR nNewSize);
  50. //设置元素
  51. VOID SetAt(INT_PTR nIndex, ARG_TYPE newElement);
  52. //设置元素
  53. VOID SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);
  54. //插入数据
  55. VOID InsertAt(INT_PTR nIndex, const CWHArray & Src);
  56. //插入数据
  57. VOID InsertAt(INT_PTR nIndex, ARG_TYPE newElement, INT_PTR nCount=1);
  58. //删除数据
  59. VOID RemoveAt(INT_PTR nIndex, INT_PTR nCount=1);
  60. //删除元素
  61. VOID RemoveAll();
  62. //操作重载
  63. public:
  64. //操作重载
  65. TYPE & operator[](INT_PTR nIndex);
  66. //操作重载
  67. const TYPE & operator[](INT_PTR nIndex) const;
  68. //内存函数
  69. public:
  70. //释放内存
  71. VOID FreeMemory();
  72. //释放内存
  73. VOID FreeMemory2();
  74. //申请内存
  75. VOID AllocMemory(INT_PTR nNewCount);
  76. };
  77. //////////////////////////////////////////////////////////////////////////////////
  78. // CWHArray<TYPE, ARG_TYPE> 内联函数
  79. //是否空组
  80. template<class TYPE, class ARG_TYPE>
  81. AFX_INLINE bool CWHArray<TYPE, ARG_TYPE>::IsEmpty() const
  82. {
  83. return (m_nElementCount==0);
  84. }
  85. //获取数目
  86. template<class TYPE, class ARG_TYPE>
  87. AFX_INLINE INT_PTR CWHArray<TYPE, ARG_TYPE>::GetCount() const
  88. {
  89. return m_nElementCount;
  90. }
  91. //增加元素
  92. template<class TYPE, class ARG_TYPE>
  93. AFX_INLINE INT_PTR CWHArray<TYPE,ARG_TYPE>::Add(ARG_TYPE newElement)
  94. {
  95. INT_PTR nIndex=m_nElementCount;
  96. SetAtGrow(nIndex,newElement);
  97. return nIndex;
  98. }
  99. //操作重载
  100. template<class TYPE, class ARG_TYPE>
  101. AFX_INLINE TYPE & CWHArray<TYPE, ARG_TYPE>::operator[](INT_PTR nIndex)
  102. {
  103. return ElementAt(nIndex);
  104. }
  105. //操作重载
  106. template<class TYPE, class ARG_TYPE>
  107. AFX_INLINE const TYPE & CWHArray<TYPE, ARG_TYPE>::operator[](INT_PTR nIndex) const
  108. {
  109. return GetAt(nIndex);
  110. }
  111. //////////////////////////////////////////////////////////////////////////////////
  112. // CWHArray<TYPE, ARG_TYPE> 外联函数
  113. //构造函数
  114. template<class TYPE, class ARG_TYPE>
  115. CWHArray<TYPE, ARG_TYPE>::CWHArray()
  116. {
  117. m_pData=NULL;
  118. m_nMaxCount=0;
  119. m_nGrowCount=0;
  120. m_nElementCount=0;
  121. return;
  122. }
  123. //构造函数
  124. template<class TYPE, class ARG_TYPE>
  125. CWHArray<TYPE,ARG_TYPE>::~CWHArray()
  126. {
  127. if (m_pData!=NULL)
  128. {
  129. for (INT_PTR i=0;i<m_nElementCount;i++) (m_pData+i)->~TYPE();
  130. delete [] (BYTE *)m_pData;
  131. m_pData=NULL;
  132. }
  133. return;
  134. }
  135. //获取缓冲
  136. template<class TYPE, class ARG_TYPE>
  137. TYPE * CWHArray<TYPE,ARG_TYPE>::GetData()
  138. {
  139. return m_pData;
  140. }
  141. //获取缓冲
  142. template<class TYPE, class ARG_TYPE>
  143. const TYPE * CWHArray<TYPE,ARG_TYPE>::GetData() const
  144. {
  145. return m_pData;
  146. }
  147. //拷贝数组
  148. template<class TYPE, class ARG_TYPE>
  149. VOID CWHArray<TYPE,ARG_TYPE>::Copy(const CWHArray & Src)
  150. {
  151. //效验参数
  152. ASSERT(this!=&Src);
  153. if (this==&Src) return;
  154. //拷贝数组
  155. AllocMemory(Src.m_nElementCount);
  156. if (m_nElementCount>0)
  157. {
  158. for (INT_PTR i=0;i<m_nElementCount;i++) (m_pData+i)->~TYPE();
  159. memset(m_pData,0,m_nElementCount*sizeof(TYPE));
  160. }
  161. for (INT_PTR i=0;i<Src.m_nElementCount;i++) m_pData[i]=Src.m_pData[i];
  162. m_nElementCount=Src.m_nElementCount;
  163. return;
  164. }
  165. //追加数组
  166. template<class TYPE, class ARG_TYPE>
  167. INT_PTR CWHArray<TYPE,ARG_TYPE>::Append(const CWHArray & Src)
  168. {
  169. //效验参数
  170. ASSERT(this!=&Src);
  171. if (this==&Src) AfxThrowInvalidArgException();
  172. //拷贝数组
  173. if (Src.m_nElementCount>0)
  174. {
  175. INT_PTR nOldCount=m_nElementCount;
  176. AllocMemory(m_nElementCount+Src.m_nElementCount);
  177. for (INT_PTR i=0;i<Src.m_nElementCount;i++) m_pData[m_nElementCount+i]=Src.m_pData[i];
  178. m_nElementCount+=Src.m_nElementCount;
  179. }
  180. return m_nElementCount;
  181. }
  182. //获取元素
  183. template<class TYPE, class ARG_TYPE>
  184. TYPE & CWHArray<TYPE,ARG_TYPE>::GetAt(INT_PTR nIndex)
  185. {
  186. ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
  187. if ((nIndex<0)||(nIndex>=m_nElementCount)) AfxThrowInvalidArgException();
  188. return m_pData[nIndex];
  189. }
  190. //获取元素
  191. template<class TYPE, class ARG_TYPE>
  192. const TYPE & CWHArray<TYPE,ARG_TYPE>::GetAt(INT_PTR nIndex) const
  193. {
  194. ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
  195. if ((nIndex<0)||(nIndex>=m_nElementCount)) AfxThrowInvalidArgException();
  196. return m_pData[nIndex];
  197. }
  198. //获取元素
  199. template<class TYPE, class ARG_TYPE>
  200. TYPE & CWHArray<TYPE,ARG_TYPE>::ElementAt(INT_PTR nIndex)
  201. {
  202. //ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
  203. if ((nIndex<0)&&(nIndex>=m_nElementCount)) AfxThrowInvalidArgException();
  204. return m_pData[nIndex];
  205. }
  206. //获取元素
  207. template<class TYPE, class ARG_TYPE>
  208. const TYPE & CWHArray<TYPE,ARG_TYPE>::ElementAt(INT_PTR nIndex) const
  209. {
  210. ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
  211. if ((nIndex<0)&&(nIndex>=m_nElementCount)) AfxThrowInvalidArgException();
  212. return m_pData[nIndex];
  213. }
  214. //设置大小
  215. template<class TYPE, class ARG_TYPE>
  216. VOID CWHArray<TYPE,ARG_TYPE>::SetSize(INT_PTR nNewSize)
  217. {
  218. //效验参数
  219. ASSERT(nNewSize>=0);
  220. if (nNewSize<0) AfxThrowInvalidArgException();
  221. //设置大小
  222. AllocMemory(nNewSize);
  223. if (nNewSize>m_nElementCount)
  224. {
  225. for (INT_PTR i=m_nElementCount;i<nNewSize;i++) new ((VOID *)(m_pData+i)) TYPE;
  226. }
  227. else if (nNewSize<m_nElementCount)
  228. {
  229. for (INT_PTR i=nNewSize;i<m_nElementCount;i++) (m_pData+i)->~TYPE();
  230. memset(m_pData+nNewSize,0,(m_nElementCount-nNewSize)*sizeof(TYPE));
  231. }
  232. m_nElementCount=nNewSize;
  233. return;
  234. }
  235. //设置元素
  236. template<class TYPE, class ARG_TYPE>
  237. VOID CWHArray<TYPE,ARG_TYPE>::SetAt(INT_PTR nIndex, ARG_TYPE newElement)
  238. {
  239. ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
  240. if ((nIndex>=0)&&(nIndex<m_nElementCount)) m_pData[nIndex]=newElement;
  241. else AfxThrowInvalidArgException();
  242. return;
  243. }
  244. //设置元素
  245. template<class TYPE, class ARG_TYPE>
  246. VOID CWHArray<TYPE,ARG_TYPE>::SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement)
  247. {
  248. //效验参数
  249. ASSERT(nIndex>=0);
  250. if (nIndex<0) AfxThrowInvalidArgException();
  251. //设置元素
  252. if (nIndex>=m_nElementCount) SetSize(m_nElementCount+1);
  253. m_pData[nIndex]=newElement;
  254. return;
  255. }
  256. //插入数据
  257. template<class TYPE, class ARG_TYPE>
  258. VOID CWHArray<TYPE,ARG_TYPE>::InsertAt(INT_PTR nIndex, const CWHArray & Src)
  259. {
  260. //效验参数
  261. ASSERT(nStartIndex>=0);
  262. if (nStartIndex<0) AfxThrowInvalidArgException();
  263. if (Src.m_nElementCount>0)
  264. {
  265. //申请数组
  266. if (nIndex<m_nElementCount)
  267. {
  268. INT_PTR nOldCount=m_nElementCount;
  269. SetSize(m_nElementCount+Src.m_nElementCount);
  270. for (INT_PTR i=0;i<nCount;i++) (m_pData+nOldCount+i)->~TYPE();
  271. memmove(m_pData+nIndex+nCount,m_pData+nIndex,(nOldCount-nIndex)*sizeof(TYPE));
  272. memset(m_pData+nIndex,0,Src.m_nElementCount*sizeof(TYPE));
  273. for (INT_PTR i=0;i<Src.m_nElementCount;i++) new (m_pData+nIndex+i) TYPE();
  274. }
  275. else SetSize(nIndex+nCount);
  276. //拷贝数组
  277. ASSERT((nIndex+Src.m_nElementCount)<=m_nElementCount);
  278. while (nCount--) m_pData[nIndex++]=newElement;
  279. }
  280. return;
  281. }
  282. //插入数据
  283. template<class TYPE, class ARG_TYPE>
  284. VOID CWHArray<TYPE,ARG_TYPE>::InsertAt(INT_PTR nIndex, ARG_TYPE newElement, INT_PTR nCount)
  285. {
  286. //效验参数
  287. ASSERT(nIndex>=0);
  288. ASSERT(nCount>0);
  289. if ((nIndex<0)||(nCount<=0)) AfxThrowInvalidArgException();
  290. //申请数组
  291. if (nIndex<m_nElementCount)
  292. {
  293. INT_PTR nOldCount=m_nElementCount;
  294. SetSize(m_nElementCount+nCount);
  295. for (INT_PTR i=0;i<nCount;i++) (m_pData+nOldCount+i)->~TYPE();
  296. memmove(m_pData+nIndex+nCount,m_pData+nIndex,(nOldCount-nIndex)*sizeof(TYPE));
  297. memset(m_pData+nIndex,0,nCount*sizeof(TYPE));
  298. for (INT_PTR i=0;i<nCount;i++) new (m_pData+nIndex+i) TYPE();
  299. }
  300. else SetSize(nIndex+nCount);
  301. //拷贝数组
  302. ASSERT((nIndex+nCount)<=m_nElementCount);
  303. while (nCount--) m_pData[nIndex++]=newElement;
  304. return;
  305. }
  306. //删除数据
  307. template<class TYPE, class ARG_TYPE>
  308. VOID CWHArray<TYPE,ARG_TYPE>::RemoveAt(INT_PTR nIndex, INT_PTR nCount)
  309. {
  310. //效验参数
  311. ASSERT(nIndex>=0);
  312. ASSERT(nCount>=0);
  313. ASSERT(nIndex+nCount<=m_nElementCount);
  314. if ((nIndex<0)||(nCount<0)||((nIndex+nCount>m_nElementCount))) AfxThrowInvalidArgException();
  315. //删除数据
  316. INT_PTR nMoveCount=m_nElementCount-(nIndex+nCount);
  317. for (INT_PTR i=0;i<nCount;i++) (m_pData+nIndex+i)->~TYPE();
  318. if (nMoveCount>0) memmove(m_pData+nIndex,m_pData+nIndex+nCount,nMoveCount*sizeof(TYPE));
  319. m_nElementCount-=nCount;
  320. return;
  321. }
  322. //删除元素
  323. template<class TYPE, class ARG_TYPE>
  324. VOID CWHArray<TYPE,ARG_TYPE>::RemoveAll()
  325. {
  326. if (m_nElementCount>0)
  327. {
  328. for (INT_PTR i=0;i<m_nElementCount;i++) (m_pData+i)->~TYPE();
  329. memset(m_pData,0,m_nElementCount*sizeof(TYPE));
  330. m_nElementCount=0;
  331. }
  332. return;
  333. }
  334. //释放内存
  335. template<class TYPE, class ARG_TYPE>
  336. VOID CWHArray<TYPE,ARG_TYPE>::FreeMemory()
  337. {
  338. if (m_nElementCount!=m_nMaxCount)
  339. {
  340. TYPE * pNewData=NULL;
  341. if (m_nElementCount!=0)
  342. {
  343. pNewData=(TYPE *) new BYTE[m_nElementCount*sizeof(TYPE)];
  344. memcpy(pNewData,m_pData,m_nElementCount*sizeof(TYPE));
  345. }
  346. delete [] (BYTE *)m_pData;
  347. m_pData=pNewData;
  348. m_nMaxCount=m_nElementCount;
  349. }
  350. return;
  351. }
  352. //申请内存
  353. template<class TYPE, class ARG_TYPE>
  354. VOID CWHArray<TYPE,ARG_TYPE>::AllocMemory(INT_PTR nNewCount)
  355. {
  356. //效验参数
  357. ASSERT(nNewCount>=0);
  358. if (nNewCount>m_nMaxCount)
  359. {
  360. //计算数目
  361. INT_PTR nGrowCount=m_nGrowCount;
  362. if (nGrowCount==0)
  363. {
  364. nGrowCount=m_nElementCount/8;
  365. nGrowCount=(nGrowCount<4)?4:((nGrowCount>1024)?1024:nGrowCount);
  366. }
  367. nNewCount+=nGrowCount;
  368. //申请内存
  369. TYPE * pNewData=(TYPE *) new BYTE[nNewCount*sizeof(TYPE)];
  370. memcpy(pNewData,m_pData,m_nElementCount*sizeof(TYPE));
  371. memset(pNewData+m_nElementCount,0,(nNewCount-m_nElementCount)*sizeof(TYPE));
  372. delete [] (BYTE *)m_pData;
  373. //设置变量
  374. m_pData=pNewData;
  375. m_nMaxCount=nNewCount;
  376. }
  377. return;
  378. }
  379. //////////////////////////////////////////////////////////////////////////////////
  380. #endif