ESyS-Particle  2.3.2
t_list.hpp
Go to the documentation of this file.
1 
2 // //
3 // Copyright (c) 2003-2014 by The University of Queensland //
4 // Centre for Geoscience Computing //
5 // http://earth.uq.edu.au/centre-geoscience-computing //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 template <class T>
14 void Stack<T>::Push(T* V) {
15  L.InsertAtStart(V) ;
16 }
17 
18 template <class T>
20  L.First() ;
21  T* t= L.Get() ;
22  L.Clear() ;
23  return t ;
24 }
25 
26 template <class T>
28  {
29  Start = End = Current = NULL ;
30  }
31 
32 template <class T>
34  {
35  Node<T> *Lcur ;
36  Start = End = Current = NULL ;
37  Lcur = L.Start ;
38  while (Lcur)
39  {
40  Append(Lcur->Val) ;
41  Lcur = Lcur->Next ;
42  }
43  }
44 
45 template <class T>
47  {
48  Destroy() ;
49  }
50 
54 template <class T>
56  {
57  int i = 0;
58  First() ;
59  while (!IsEnd()) {
60  i++ ;
61  Next() ;
62  }
63  return i ;
64  }
65 
70 template <class T>
72  {
73  if (Start==NULL)
74  {
75  Start = new Node<T> ;
76  Start->Next = NULL ;
77  Start->Prev = NULL ;
78  Current = Start ;
79  End = Start ;
80  Current->Val = V ;
81  }
82  else
83  {
84  Node<T> *Inter ;
85  Inter = new Node<T> ;
86  Inter->Prev = NULL ;
87  Inter->Next = Start ;
88  Inter->Val = V ;
89  Start->Prev = Inter ;
90  Start = Inter ;
91  }
92  }
93 
94 template <class T>
95 void List<T>::Append(T *V)
96  {
97  if (Start==NULL)
98  {
99  Start = new Node<T> ;
100  Start->Next = NULL ;
101  Start->Prev = NULL ;
102  Current = Start ;
103  End = Start ;
104  Current->Val = V ;
105  }
106  else
107  {
108  Node<T> *Inter ;
109  Inter = new Node<T> ;
110  Inter->Prev = End ;
111  Inter->Next = NULL ;
112  Inter->Val = V ;
113  End->Next = Inter ;
114  End = Inter ;
115  }
116  }
117 
118 template <class T>
120  {
121  if ((Start==NULL)||(Current==NULL)||(Current->Next==NULL))
122  {
123  Append(V) ;
124  }
125  else
126  {
127  Node<T> *Inter ;
128  Inter = new Node<T> ;
129  Inter->Prev = Current ;
130  Inter->Next = Current->Next ;
131  Inter->Val = V ;
132  Current->Next->Prev = Inter ;
133  Current->Next = Inter ;
134  }
135  }
136 
137 template <class T>
139  {
140  if ((Start==NULL)||(Current==NULL))
141  {
142  Append(V) ;
143  }
144  else if (Start==Current)
145  {
146  InsertAtStart(V) ;
147  }
148  else
149  {
150  Node<T> *Inter ;
151  Inter = new Node<T> ;
152  Inter->Prev = Current->Prev ;
153  Inter->Next = Current ;
154  Inter->Val = V ;
155  Current->Prev->Next = Inter ;
156  Current->Prev = Inter ;
157  }
158  }
159 
160 template <class T>
162  {
163 #ifdef _DEBUG
164  if (!Current) {
165  console.Critical() << "Invalid access in List via null pointer\n" ;
166  }
167  if (!Current->Val) {
168  console.Warning() << "List just returned a null pointer\n" ;
169  }
170 #endif
171  return Current->Val ;
172  }
173 
174 template <class T>
175 void List<T>::Put(T *V)
176  {
177  if (Current) Current->Val = V ;
178  }
179 
180 template <class T>
182  {
183  if (Current)
184  {
185  if (Current==Start)
186  {
187  Start = Current->Next ;
188  if (Start) Start->Prev = NULL ;
189  else End=NULL ;
190  delete Current ;
191  Current = Start ;
192  }
193  else if (Current==End)
194  {
195  End = Current->Prev ;
196  End->Next = NULL ;
197  delete Current ;
198  Current = NULL ;
199  }
200  else
201  {
202  Node<T> *Inter ;
203 
204  Inter = Current->Next ;
205  Current->Prev->Next = Current->Next ;
206  Current->Next->Prev = Current->Prev ;
207  delete Current ;
208  Current = Inter ;
209  }
210  }
211  }
212 
213 template <class T>
215  {
216  Current=Start ;
217  while (Current) Clear() ;
218  }
219 
220 template <class T>
222  {
223  InsertAfter(V) ;
224  Next() ;
225  return *this ;
226  }
227 
228 template <class T>
230  {
231  if (Current) V = Current->Val ;
232  Next() ;
233  return *this ;
234  }
235 
236 template <class T>
238  {
239  if (Current) Current=Current->Next ;
240  }
241 
242 template <class T>
244  {
245  if (Current && Current->Prev) Current=Current->Prev ;
246  }
247 
248 template <class T>
250  {
251  Current = Start ;
252  }
253 
254 template <class T>
256  {
257  Current = End ;
258  }
259 
260 template <class T>
262  {
263  return (Current==NULL) ;
264  }
265 
266 template <class T>
268  {
269  return (Current==Start) ;
270  }
271 
272 template <class T>
273 void List<T>::Swap() // echange current avec le suivant
274  {
275  Node<T> *CS, *CP, *CSS, *C ;
276 
277  C = Current ;
278  CS = C->Next ;
279  CP = C->Prev ;
280  CSS = CS->Next ;
281  if (CP) CP->Next = CS ;
282  CS->Prev = CP ;
283  CS->Next = C ;
284  C->Prev = CS ;
285  C->Next = CSS ;
286  if (CSS) CSS->Prev = C ;
287  if (!CP) Start = CS ;
288  if (!CSS) End = C ;
289  }
290 
291 template <class T>
293  {
294  List<T> This=*this;
295  This+=L ;
296  return This ;
297  }
298 
299 template <class T>
301  {
302  Node<T> *Lcur ;
303  Lcur = L.Start ;
304  while (Lcur)
305  {
306  Append(Lcur->Val) ;
307  Lcur = Lcur->Next ;
308  }
309  return *this ;
310  }
311 
312 template <class T>
314  {
315  Node<T> *Lcur ;
316  Destroy() ;
317  Lcur = L.Start ;
318  while (Lcur)
319  {
320  Append(Lcur->Val) ;
321  Lcur = Lcur->Next ;
322  }
323  return *this ;
324  }
325 
326 #if 0
327 template <class T>
328 void ListWS<T>::PushPos()
329 {
330  stack.Push(Current) ;
331 }
332 
333 template <class T>
334 void ListWS<T>::PopPos()
335 {
336  Current = stack.Pop() ;
337 }
338 #endif