list.h
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // VirtualDub 2.x (Nina) - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee, All Rights Reserved.
  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., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #ifndef f_LIST_H
  18. #define f_LIST_H
  19. class ListNode {
  20. public:
  21. ListNode *next, *prev;
  22. void Remove() {
  23. next->prev = prev;
  24. prev->next = next;
  25. #ifdef _DEBUG
  26. prev = next = 0;
  27. #endif
  28. }
  29. void InsertAfter(ListNode *node) {
  30. next = node;
  31. prev = node->prev;
  32. if (node->prev) node->prev->next = this;
  33. node->prev = this;
  34. }
  35. void InsertBefore(ListNode *node) {
  36. next = node->next;
  37. prev = node;
  38. if (node->next) node->next->prev = this;
  39. node->next = this;
  40. }
  41. ListNode *NextFromHead() const {
  42. return prev;
  43. }
  44. ListNode *NextFromTail() const {
  45. return next;
  46. }
  47. };
  48. class List {
  49. private:
  50. public:
  51. ListNode head, tail;
  52. // <--- next             prev --->
  53. //
  54. // head <-> node <-> node <-> tail
  55. List();
  56. List(int) {}
  57. void Init() throw();
  58. void AddHead(ListNode *node) {
  59. node->InsertAfter(&head);
  60. }
  61. void AddTail(ListNode *node) {
  62. node->InsertBefore(&tail);
  63. }
  64. ListNode *RemoveHead() throw();
  65. ListNode *RemoveTail() throw();
  66. bool IsEmpty() const throw() {
  67. return !head.prev->prev;
  68. }
  69. ListNode *AtHead() const throw() {
  70. return head.prev;
  71. }
  72. ListNode *AtTail() const throw() {
  73. return tail.next;
  74. }
  75. void Take(List& from) throw();
  76. };
  77. // Templated classes... templated classes good.
  78. template<class T> class List2;
  79. template<class T>
  80. class ListNode2 : public ListNode {
  81. friend List2<T>;
  82. public:
  83. void InsertBefore(ListNode2<T> *node) { ListNode::InsertBefore(node); }
  84. void InsertAfter(ListNode2<T> *node) { ListNode::InsertAfter(node); }
  85. void Remove() { ListNode::Remove(); }
  86. T *NextFromHead() const { return (T *)ListNode::NextFromHead(); }
  87. T *NextFromTail() const { return (T *)ListNode::NextFromTail(); }
  88. };
  89. template<class T>
  90. class List2 : public List {
  91. public:
  92. List2<T>() {}
  93. // This is a really lame, stupid way to postpone initialization of the
  94. // list.
  95. List2<T>(int v) : List(v) {}
  96. void AddHead(ListNode2<T> *node) { List::AddHead(node); }
  97. void AddTail(ListNode2<T> *node) { List::AddTail(node); }
  98. T *RemoveHead() { return (T *)List::RemoveHead(); }
  99. T *RemoveTail() { return (T *)List::RemoveTail(); }
  100. T *AtHead() const { return (T *)List::AtHead(); }
  101. T *AtTail() const { return (T *)List::AtTail(); }
  102. // I must admit to being pampered by STL (end is different though!!)
  103. T *begin() const { return AtHead(); }
  104. T *end() const { return AtTail(); }
  105. void take(List2<T>& from) { List::take(from); }
  106. class iterator {
  107. protected:
  108. ListNode2<T> *node;
  109. ListNode2<T> *next;
  110. public:
  111. iterator() {}
  112. iterator(const iterator& src) throw() : node(src.node), next(src.next) {}
  113. bool operator!() const throw() { return 0 == next; }
  114. T *operator->() const throw() { return (T *)node; }
  115. operator bool() const throw() { return 0 != next; }
  116. T& operator *() const throw() { return *(T *)node; }
  117. };
  118. // fwit: forward iterator (SAFE if node disappears)
  119. // rvit: reverse iterator (SAFE if node disappears)
  120. class fwit : public iterator {
  121. public:
  122. fwit() throw() {}
  123. fwit(const fwit& src) throw() : iterator(src) {}
  124. fwit(ListNode2<T> *start) throw() {
  125. node = start;
  126. next = start->NextFromHead();
  127. }
  128. const fwit& operator=(ListNode2<T> *start) throw() {
  129. node = start;
  130. next = start->NextFromHead();
  131. return *this;
  132. }
  133. fwit& operator++() throw() {
  134. node = next;
  135. next = node->NextFromHead();
  136. return *this;
  137. }
  138. const fwit& operator+=(int v) throw() {
  139. while(next && v--) {
  140. node = next;
  141. next = node->NextFromHead();
  142. }
  143. return *this;
  144. }
  145. fwit operator+(int v) const throw() {
  146. fwit t(*this);
  147. t += v;
  148. return t;
  149. }
  150. // This one's for my sanity.
  151. void operator++(int) throw() {
  152. ++*this;
  153. }
  154. };
  155. class rvit : public iterator {
  156. public:
  157. rvit() throw() {}
  158. rvit(ListNode2<T> *start) throw() {
  159. node = start;
  160. next = start->NextFromTail();
  161. }
  162. const rvit& operator=(ListNode2<T> *start) throw() {
  163. node = start;
  164. next = start->NextFromTail();
  165. return *this;
  166. }
  167. rvit& operator--() throw() {
  168. node = next;
  169. next = node->NextFromTail();
  170. return *this;
  171. }
  172. const rvit& operator-=(int v) throw() {
  173. while(next && v--) {
  174. node = next;
  175. next = node->NextFromTail();
  176. }
  177. return *this;
  178. }
  179. rvit operator-(int v) const throw() {
  180. rvit t(*this);
  181. t -= v;
  182. return t;
  183. }
  184. // This one's for my sanity.
  185. void operator--(int) throw() {
  186. --*this;
  187. }
  188. };
  189. };
  190. template<class T>
  191. class ListAlloc : public List2<T> {
  192. public:
  193. ListAlloc<T>() {}
  194. ~ListAlloc<T>() {
  195. dispose();
  196. }
  197. void dispose() {
  198. T *node;
  199. while(node = RemoveHead())
  200. delete node;
  201. }
  202. };
  203. #endif