Oxygine  1
2g game engine
intrusive_list.h
1 #pragma once
2 #include "oxygine-include.h"
3 namespace oxygine
4 {
5  template<class T>
7  {
8  public:
9  T _first;
10  T _last;
11 
13  {
14  clear();
15  }
16 
17  bool empty() const
18  {
19  return _first == 0;
20  }
21 
22  void clear()
23  {
24  T item = _first;
25  while (item)
26  {
27  T copy = item;
28  item = item->_next;
29  if (copy)
30  {
31  copy->_list = 0;
32  copy->_next = 0;
33  copy->_prev = 0;
34  }
35  }
36  _first = 0;
37  _last = 0;
38  }
39 
40  void insert_after(T& child, T& after)
41  {
42  OX_ASSERT(after->_list == this);
43  child->_list = this;
44 
45  if (after->_next)
46  after->_next->_prev = child;
47  else
48  _last = child;
49 
50  child->_next = after->_next;
51  child->_prev = after;
52  after->_next = child;
53 
54 
55  checkList();
56  }
57 
58  void insert_before(T& child, T& before)
59  {
60  child->_list = this;
61 
62  if (before->_prev)
63  before->_prev->_next = child;
64  else
65  _first = child;
66 
67  child->_prev = before->_prev;
68  child->_next = before;
69  before->_prev = child;
70 
71 
72  checkList();
73  }
74 
75  void append(T& child)
76  {
77  child->_list = this;
78 
79  if (_first)
80  {
81  _last->_next = child;
82  child->_prev = _last;
83  }
84  else
85  {
86  _first = child;
87  child->_prev = 0;
88  }
89 
90  _last = child;
91  child->_next = 0;
92 
93  checkList();
94  }
95 
96  void prepend(T& child)
97  {
98  child->_list = this;
99 
100  if (_first)
101  {
102  _first->_prev = child;
103  child->_next = _first;
104  }
105  else
106  {
107  _last = child;
108  child->_next = 0;
109  }
110 
111  _first = child;
112  child->_prev = 0;
113 
114  checkList();
115  }
116 
117  void checkList()
118  {
119  return;
120  if (!_first)
121  return;
122 
123  T v = _first;
124  do
125  {
126  T p = v;
127  v = v->_next;
128 
129  if (v)
130  {
131  OX_ASSERT(v->_prev == p);
132  }
133  else
134  {
135  OX_ASSERT(p == _last);
136  }
137 
138  //OX_ASSERT(v == _last && v->_next == 0);
139  }
140  while (v);
141 
142  }
143 
144 
145 
146  void remove(T& child)
147  {
148  OX_ASSERT(child->_list == this);
149  child->_list = 0;
150 
151  if (child->_next)
152  {
153  OX_ASSERT(child->_next->_prev == child);
154  child->_next->_prev = child->_prev;
155  }
156  else
157  {
158  OX_ASSERT(child == _last);
159  _last = child->_prev;
160  }
161 
162 
163  if (child->_prev)
164  {
165  OX_ASSERT(child->_prev->_next == child);
166  child->_prev->_next = child->_next;
167  }
168  else
169  {
170  OX_ASSERT(child == _first);
171  _first = child->_next;
172  }
173 
174  child->_prev = 0;
175  child->_next = 0;
176 
177  checkList();
178  }
179  };
180 
181 
182  template<class T>
184  {
185  public:
186 
187  intrusive_list<T>* getParentList() {return _list;}
188 
189  protected:
190  T& getNextSibling() {return _next;}
191  T& getPrevSibling() {return _prev;}
192 
193 
194  intrusive_list_item(): _prev(T(0)), _next(T(0)), _list(0) {}
195  T _prev;
196  T _next;
197 
198  intrusive_list<T>* _list;
199 
200  template<class U>
201  friend class intrusive_list;
202  };
203 }
Definition: intrusive_list.h:183
Definition: intrusive_list.h:6
–oxgl-end–!
Definition: Actor.h:14