Leaked source code of windows server 2003
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.

232 lines
4.8 KiB

  1. template <class T> class List_dl;
  2. template <class T> class Iter_dl;
  3. template <class T>
  4. class Link_dl
  5. {
  6. Link_dl<T> * m_pPrev;
  7. Link_dl<T> * m_pNext;
  8. friend class List_dl<T>;
  9. friend class Iter_dl<T>;
  10. public:
  11. Link_dl()
  12. : m_pPrev( NULL ),
  13. m_pNext( NULL )
  14. {
  15. // Do nothing
  16. }
  17. ~Link_dl()
  18. {
  19. AssertMsg( m_pNext == NULL && m_pPrev == NULL,
  20. TEXT("~Link_dl(), link still on a list?") );
  21. }
  22. T * getNext() const
  23. {
  24. return (T *) m_pNext;
  25. }
  26. T * getPrev() const
  27. {
  28. return (T *) m_pPrev;
  29. }
  30. };
  31. template <class T>
  32. class List_dl
  33. {
  34. Link_dl<T> * m_pHead;
  35. Link_dl<T> * m_pTail;
  36. friend class Iter_dl<T>;
  37. public:
  38. List_dl()
  39. : m_pHead( NULL ),
  40. m_pTail( NULL )
  41. {
  42. // Do nothing
  43. }
  44. ~List_dl()
  45. {
  46. AssertMsg( m_pHead == NULL && m_pTail == NULL, TEXT("~List_dl(), list not empty?") );
  47. }
  48. void AddToHead( Link_dl<T> * pEl )
  49. {
  50. AssertMsg( pEl->m_pNext == NULL && pEl->m_pPrev == NULL,
  51. TEXT("dl-addToHead(), link still on some other list?") );
  52. pEl->m_pPrev = NULL;
  53. pEl->m_pNext = m_pHead;
  54. if( m_pHead )
  55. m_pHead->m_pPrev = pEl;
  56. else
  57. m_pTail = pEl;
  58. m_pHead = pEl;
  59. }
  60. void AddToTail( Link_dl<T> * pEl )
  61. {
  62. AssertMsg( pEl->m_pNext == NULL && pEl->m_pPrev == NULL,
  63. TEXT("dl-addToTail(), link still on some other list?") );
  64. pEl->m_pPrev = m_pTail;
  65. pEl->m_pNext = NULL;
  66. if( m_pTail )
  67. m_pTail->m_pNext = pEl;
  68. else
  69. m_pHead = pEl;
  70. m_pTail = pEl;
  71. }
  72. void InsertBefore( Link_dl<T> * pRef, Link_dl<T> * pEl )
  73. {
  74. AssertMsg( ! pRef || pRef->m_pNext != NULL || pRef->m_pPrev != NULL || m_pHead == pRef,
  75. TEXT("dl-InsertBefore(), pRef is not on the list?") );
  76. AssertMsg( pEl->m_pNext == NULL && pEl->m_pPrev == NULL,
  77. TEXT("dl-InsertBefore(), pEl is still on some other list?") );
  78. if( ! pRef )
  79. AddToTail( pEl );
  80. else
  81. {
  82. pEl->m_pNext = pRef;
  83. pEl->m_pPrev = pRef->m_pPrev;
  84. if( pRef->m_pPrev )
  85. pRef->m_pPrev->m_pNext = pEl;
  86. else
  87. m_pHead = pEl;
  88. pRef->m_pPrev = pEl;
  89. }
  90. }
  91. void InsertAfter( Link_dl<T> * pRef, Link_dl<T> * pEl )
  92. {
  93. AssertMsg( ! pRef || pRef->m_pNext != NULL || pRef->m_pPrev != NULL || m_pHead == pRef,
  94. TEXT("dl-InsertAfter(), pRef is not on the list?") );
  95. AssertMsg( pEl->m_pNext == NULL && pEl->m_pPrev == NULL,
  96. TEXT("dl-InsertAfter(), pEl is still on some other list?") );
  97. if( ! pRef )
  98. AddToHead( pEl );
  99. else
  100. {
  101. pEl->m_pNext = pRef->m_pPref;
  102. pEl->m_pPrev = pRef;
  103. if( pRef->m_pNext )
  104. pRef->m_pNext->m_pPrev = pEl;
  105. else
  106. m_pTail = pEl;
  107. pRef->m_pNext = pEl;
  108. }
  109. }
  110. void remove( Link_dl<T> * pEl )
  111. {
  112. AssertMsg( pEl->m_pNext != NULL || pEl->m_pPrev != NULL || m_pHead == pEl,
  113. TEXT("dl-remove(), pEl is not on the list") );
  114. if( pEl->m_pPrev )
  115. pEl->m_pPrev->m_pNext = pEl->m_pNext;
  116. else
  117. m_pHead = pEl->m_pNext;
  118. if( pEl->m_pNext )
  119. pEl->m_pNext->m_pPrev = pEl->m_pPrev;
  120. else
  121. m_pTail = pEl->m_pNext;
  122. pEl->m_pPrev = NULL;
  123. pEl->m_pNext = NULL;
  124. }
  125. bool empty() const
  126. {
  127. return m_pHead == NULL;
  128. }
  129. T * getHead() const
  130. {
  131. return (T *) m_pHead;
  132. }
  133. T * getTail() const
  134. {
  135. return (T *) m_pTail;
  136. }
  137. };
  138. template <class T>
  139. class Iter_dl
  140. {
  141. Link_dl<T> * m_pPos;
  142. public:
  143. Iter_dl( const List_dl<T> & l )
  144. {
  145. m_pPos = l.m_pHead;
  146. }
  147. BOOL AtEnd() const
  148. {
  149. return m_pPos == NULL;
  150. }
  151. T * operator ++ (int)
  152. {
  153. m_pPos = m_pPos->m_pNext;
  154. return (T *) m_pPos;
  155. }
  156. T * operator ++ ()
  157. {
  158. m_pPos = m_pPos->m_pNext;
  159. return (T *) m_pPos;
  160. }
  161. T * operator -- (int)
  162. {
  163. m_pPos = m_pPos->m_pPrev;
  164. return (T *) m_pPos;
  165. }
  166. T * operator -- ()
  167. {
  168. m_pPos = m_pPos->m_pPrev;
  169. return (T *) m_pPos;
  170. }
  171. T * operator -> () const
  172. {
  173. return (T *) m_pPos;
  174. }
  175. T * operator () () const
  176. {
  177. return (T *) m_pPos;
  178. }
  179. operator T * () const
  180. {
  181. return (T *) m_pPos;
  182. }
  183. };