List.h
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:5k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // ORZ: 吝汗 include 规瘤
  2. #pragma once
  3. typedef VOID * PLISTNODE;
  4. template <class T> class CWHList
  5. {
  6. public:
  7. typedef struct tagLINKEDLIST
  8. {
  9. T lpData;
  10. struct tagLINKEDLIST *prev;
  11. struct tagLINKEDLIST *next;
  12. } LINKEDLIST, FAR *LPLINKEDLIST;
  13. LPLINKEDLIST m_lpHead;
  14. LPLINKEDLIST m_lpTail;
  15. UINT m_nCount;
  16. // CRITICAL_SECTION m_cs;
  17. public:
  18. CWHList();
  19. ~CWHList();
  20. BOOL AddNewNode(T lpData);
  21. void Clear();
  22. PLISTNODE RemoveNode(LPLINKEDLIST lpListNode);
  23. BOOL RemoveNodeByKey(SOCKET s);
  24. PLISTNODE RemoveNodeByData(T lpData);
  25. void *FindNode(LPLINKEDLIST lpList);
  26. PLISTNODE FindData(T t);
  27. __inline PLISTNODE GetHead()
  28. if (m_lpHead) 
  29. return (PLISTNODE)m_lpHead; 
  30. return NULL; 
  31. }
  32. __inline PLISTNODE GetNext(PLISTNODE pListNode) { if (pListNode) return ((LPLINKEDLIST)pListNode)->next; return NULL; }
  33. __inline PLISTNODE RemoveNode(PLISTNODE pListNode) { if (pListNode) return RemoveNode((LPLINKEDLIST)pListNode); return NULL; }
  34. __inline UINT GetCount() { return m_nCount; }
  35. __inline T GetData(PLISTNODE pListNode) { if (pListNode) return ((LPLINKEDLIST)pListNode)->lpData; return NULL; }
  36. };
  37. template<class T> CWHList<T>::CWHList()
  38. {   
  39. m_lpHead = NULL;
  40. m_lpTail = NULL;
  41. m_nCount = 0;
  42. // InitializeCriticalSection(&m_cs);
  43. }
  44. template<class T> CWHList<T>::~CWHList()
  45. {
  46. Clear();
  47.   
  48. // DeleteCriticalSection(&m_cs);
  49. }
  50. template<class T> BOOL CWHList<T>::AddNewNode(T lpData)
  51. {
  52. BOOL fRet = FALSE;
  53. // EnterCriticalSection(&m_cs);
  54. LPLINKEDLIST lpCD = (LPLINKEDLIST)GlobalAlloc(GPTR, sizeof(LINKEDLIST));
  55. lpCD->lpData = lpData;
  56. if (!m_lpHead)
  57. {
  58. m_lpHead = lpCD;
  59. lpCD->prev = (LPLINKEDLIST)NULL;
  60. }
  61. else
  62. {
  63. m_lpTail->next = lpCD;
  64. lpCD->prev = m_lpTail;
  65. }
  66. lpCD->next = (LPLINKEDLIST)NULL;
  67. m_lpTail = lpCD;
  68. m_nCount++;
  69. fRet = TRUE;
  70. // LeaveCriticalSection(&m_cs);
  71. return fRet;
  72. }
  73. template<class T> void CWHList<T>::Clear()
  74. {
  75. // EnterCriticalSection(&m_cs);
  76. LPLINKEDLIST lpNode = m_lpHead;
  77. while (lpNode)
  78. lpNode = (LPLINKEDLIST)RemoveNode(lpNode);
  79. // LeaveCriticalSection(&m_cs);
  80. }
  81. template<class T> PLISTNODE CWHList<T>::RemoveNode(LPLINKEDLIST lpList)
  82. {
  83.     LPLINKEDLIST prev = NULL, next;
  84. // EnterCriticalSection(&m_cs);
  85. next = lpList->next;
  86. prev = lpList->prev;
  87. if (prev) prev->next = next;
  88. else m_lpHead = next;
  89. if (next) next->prev = prev;
  90. else m_lpTail = prev;
  91. GlobalFree(lpList);
  92. lpList = NULL;
  93. m_nCount--;
  94. // LeaveCriticalSection(&m_cs);
  95. return (PLISTNODE)next;
  96. }
  97. template <class T>BOOL CWHList<T>::RemoveNodeByKey(SOCKET s)
  98. {
  99. // EnterCriticalSection(&m_cs);
  100.     LPLINKEDLIST prev = NULL, next;
  101. LPLINKEDLIST lpNode = m_lpHead;
  102. BOOL fFlag = FALSE;
  103. while (lpNode)
  104. {
  105. if (((CSessionInfo*)lpNode->lpData)->sock == s)
  106. {
  107. next = lpNode->next;
  108. prev = lpNode->prev;
  109. if (prev) prev->next = next;
  110. else m_lpHead = next;
  111. if (next) next->prev = prev;
  112. else m_lpTail = prev;
  113. GlobalFree(lpNode);
  114. lpNode = NULL;
  115. m_nCount--;
  116. fFlag = TRUE;
  117. break;
  118. }
  119. lpNode = lpNode->next;
  120. }
  121. // LeaveCriticalSection(&m_cs);
  122. return fFlag;
  123. }
  124. template <class T>PLISTNODE CWHList<T>::RemoveNodeByData(T lpData)
  125. {
  126. // EnterCriticalSection(&m_cs);
  127.     LPLINKEDLIST prev = NULL, next;
  128. LPLINKEDLIST lpNode = m_lpHead;
  129. __try
  130. {
  131. while (lpNode)
  132. {
  133. if ((T)lpNode->lpData == lpData)
  134. {
  135. next = lpNode->next;
  136. prev = lpNode->prev;
  137. if (prev) prev->next = next;
  138. else m_lpHead = next;
  139. if (next) next->prev = prev;
  140. else m_lpTail = prev;
  141. GlobalFree(lpNode);
  142. lpNode = NULL;
  143. m_nCount--;
  144. break;
  145. }
  146. lpNode = lpNode->next;
  147. }
  148. }
  149. __finally
  150. {
  151. // LeaveCriticalSection(&m_cs);
  152. }
  153. return (PLISTNODE)next;
  154. }
  155. template <class T> void *CWHList<T>::FindNode(LPLINKEDLIST lpList)
  156. {
  157. // EnterCriticalSection(&m_cs);
  158. LPLINKEDLIST lpNode = m_lpHead;
  159. while (lpNode)
  160. {
  161. if (lpNode == lpList)
  162. {
  163. // ORZ: 内靛 眠啊
  164. // LeaveCriticalSection( &m_cs );
  165. return lpNode;
  166. }
  167. lpNode = lpNode->next;
  168. }
  169. // LeaveCriticalSection(&m_cs);
  170. return NULL;
  171. }
  172. template <class T>PLISTNODE CWHList<T>::FindData(T t)
  173. {
  174. LPLINKEDLIST lpNode = m_lpHead;
  175. // EnterCriticalSection(&m_cs);
  176. while (lpNode)
  177. {
  178. if (((T)lpNode->lpData) == t)
  179. {
  180. // ORZ: 内靛 眠啊
  181. // LeaveCriticalSection( &m_cs );
  182. return (PLISTNODE)lpNode;
  183. }
  184. lpNode = lpNode->next;
  185. }
  186. // LeaveCriticalSection(&m_cs);
  187. return (PLISTNODE) NULL;
  188. }