SLIList.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #pragma once
  2. #include "../Common.h"
  3. // Singly Linked Intrusive List (no 'node' wrapper, requires mNext member in T)
  4. NS_BF_BEGIN;
  5. template <typename T>
  6. class SLIList
  7. {
  8. public:
  9. T mHead;
  10. T mTail;
  11. struct Iterator
  12. {
  13. public:
  14. T mMember;
  15. public:
  16. Iterator(T member)
  17. {
  18. mMember = member;
  19. }
  20. Iterator& operator++()
  21. {
  22. mMember = mMember->mNext;
  23. return *this;
  24. }
  25. bool operator!=(const Iterator& itr) const
  26. {
  27. return itr.mMember != mMember;
  28. }
  29. bool operator==(const Iterator& itr) const
  30. {
  31. return itr.mMember == mMember;
  32. }
  33. T operator*()
  34. {
  35. return mMember;
  36. }
  37. };
  38. struct RemovableIterator
  39. {
  40. public:
  41. T mPrevVal;
  42. T* mPrevNextPtr;
  43. public:
  44. RemovableIterator(T* headPtr)
  45. {
  46. mPrevVal = NULL;
  47. mPrevNextPtr = headPtr;
  48. }
  49. RemovableIterator& operator++()
  50. {
  51. T newNode = *mPrevNextPtr;
  52. mPrevVal = newNode;
  53. if (newNode != NULL)
  54. {
  55. mPrevNextPtr = &newNode->mNext;
  56. }
  57. return *this;
  58. }
  59. bool operator!=(const RemovableIterator& itr) const
  60. {
  61. if (itr.mPrevNextPtr == NULL)
  62. return *mPrevNextPtr != NULL;
  63. return *itr.mPrevNextPtr != *mPrevNextPtr;
  64. }
  65. bool operator==(const RemovableIterator& itr) const
  66. {
  67. if (itr.mPrevNextPtr == NULL)
  68. return *mPrevNextPtr == NULL;
  69. return *itr.mPrevNextPtr == *mPrevNextPtr;
  70. }
  71. T operator*()
  72. {
  73. return *mPrevNextPtr;
  74. }
  75. };
  76. public:
  77. SLIList()
  78. {
  79. mHead = NULL;
  80. mTail = NULL;
  81. }
  82. int Size()
  83. {
  84. int size = 0;
  85. T checkNode = mHead;
  86. while (checkNode != NULL)
  87. {
  88. size++;
  89. checkNode = checkNode->mNext;
  90. }
  91. return size;
  92. }
  93. T operator[](int idx)
  94. {
  95. int curIdx = 0;
  96. T checkNode = mHead;
  97. while (checkNode != NULL)
  98. {
  99. if (idx == curIdx)
  100. return checkNode;
  101. T next = checkNode->mNext;
  102. curIdx++;
  103. checkNode = next;
  104. }
  105. return NULL;
  106. }
  107. void PushBack(T node)
  108. {
  109. BF_ASSERT(node->mNext == NULL);
  110. if (mHead == NULL)
  111. mHead = node;
  112. else
  113. mTail->mNext = node;
  114. mTail = node;
  115. }
  116. void PushFront(T node)
  117. {
  118. BF_ASSERT(node->mNext == NULL);
  119. if (mHead == NULL)
  120. mTail = node;
  121. else
  122. node->mNext = mHead;
  123. mHead = node;
  124. }
  125. T PopFront()
  126. {
  127. T node = mHead;
  128. mHead = node->mNext;
  129. node->mNext = NULL;
  130. return node;
  131. }
  132. void Remove(T node, T prevNode)
  133. {
  134. if (prevNode != NULL)
  135. prevNode->mNext = node->mNext;
  136. else
  137. mHead = node->mNext;
  138. if (mTail == node)
  139. mTail = prevNode;
  140. node->mNext = NULL;
  141. }
  142. void Remove(T node)
  143. {
  144. T prevNode = NULL;
  145. T checkNode = mHead;
  146. while (checkNode != NULL)
  147. {
  148. if (checkNode == node)
  149. {
  150. Remove(node, prevNode);
  151. return;
  152. }
  153. prevNode = checkNode;
  154. checkNode = checkNode->mNext;
  155. }
  156. }
  157. void Clear()
  158. {
  159. T checkNode = mHead;
  160. while (checkNode != NULL)
  161. {
  162. T next = checkNode->mNext;
  163. checkNode->mNext = NULL;
  164. checkNode = next;
  165. }
  166. mHead = NULL;
  167. mTail = NULL;
  168. }
  169. void ClearFast()
  170. {
  171. mHead = NULL;
  172. mTail = NULL;
  173. }
  174. void DeleteAll()
  175. {
  176. T checkNode = mHead;
  177. while (checkNode != NULL)
  178. {
  179. T next = checkNode->mNext;
  180. delete checkNode;
  181. checkNode = next;
  182. }
  183. mHead = NULL;
  184. mTail = NULL;
  185. }
  186. bool IsEmpty()
  187. {
  188. return mHead == NULL;
  189. }
  190. T front()
  191. {
  192. return mHead;
  193. }
  194. T back()
  195. {
  196. return mTail;
  197. }
  198. RemovableIterator begin()
  199. {
  200. return RemovableIterator(&mHead);
  201. }
  202. RemovableIterator end()
  203. {
  204. return RemovableIterator(NULL);
  205. }
  206. RemovableIterator erase(RemovableIterator itr)
  207. {
  208. T removedVal = *itr;
  209. (*itr.mPrevNextPtr) = (*itr)->mNext;
  210. if (removedVal == mTail)
  211. {
  212. mTail = itr.mPrevVal;
  213. }
  214. return itr;
  215. }
  216. };
  217. NS_BF_END;