COVISE Core
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
coLinkList.h
Go to the documentation of this file.
1 /* This file is part of COVISE.
2 
3  You can use it under the terms of the GNU Lesser General Public License
4  version 2.1 or later, see lgpl-2.1.txt.
5 
6  * License: LGPL 2+ */
7 
8 #ifndef COVISE_LINK_LIST_H
9 #define COVISE_LINK_LIST_H
10 
11 /**************************************************************************\
12  ** **
13  ** **
14  ** Description: Interface classes for application modules to the COVISE **
15  ** software environment **
16  ** **
17  ** **
18  ** **
19  ** **
20  ** **
21  ** (C)1997 RUS **
22  ** Computing Center University of Stuttgart **
23  ** Allmandring 30 **
24  ** 70550 Stuttgart **
25  ** Author: D. Rantzau **
26  ** Date: 15.08.97 V1.0 **
27 \**************************************************************************/
28 
29 #include "coExport.h"
30 #include <cstdlib>
31 
32 namespace covise
33 {
34 
35 //==========================================================================
36 //
37 //==========================================================================
38 // struct needed to link items together
39 template <class T>
40 struct DLink
41 {
42  T item;
45  DLink(const T &a)
46  : item(a){};
47 };
48 
49 //==========================================================================
50 //
51 //==========================================================================
52 template <class T>
54 {
55 
56 private:
57  // the list, and number of items in list
59  int listItems;
60 
61 public:
62  // constructor and destructor
63 
64  coDLinkList(void);
66  {
67  clear();
68  };
69 
70  //
71  // query status of this class
72  //
73 
74  // number of items in this list
75  int length(void)
76  {
77  return listItems;
78  };
79 
80  // size of list
81  int size(void)
82  {
83  return length();
84  };
85 
86  // return true if there is a current item
87  bool is_current(void)
88  {
89  return (curr != ((DLink<T> *)0));
90  };
91 
92  // checks if list is empty or not
93  int empty(void)
94  {
95  return head == 0;
96  };
97 
98  //
99  // routines for adding or removing items from the list
100  //
101 
102  // add new item to end of list
103  coDLinkList<T> &append(const T &);
104 
105  // append new item after the current item
106  coDLinkList<T> &insertAfter(const T &);
107 
108  // append new item before the current item
109  coDLinkList<T> &insertBefore(const T &);
110 
111  // remove current item from list
112  coDLinkList<T> &remove(void);
113 
114  DLink<T> *first() const
115  {
116  return head;
117  }
119  {
120  return head;
121  }
122  DLink<T> *last() const
123  {
124  return tail;
125  }
127  {
128  return tail;
129  }
130 
131  //
132  // routines to access a particular item in the list
133  //
134 
135  // just return the current item, do not change which item is current
136  T current(void);
137 
138  // return the Nth item; do not change current item position
139  T item(int);
140 
141  // return the current item, and move the current item on to the next one
142  T get(void)
143  {
144  T retval = current();
145  next();
146  return retval;
147  };
148 
149  T operator[](int i)
150  {
151  return item(i);
152  };
153 
154  //
155  // iterator routines:
156  //
157 
158  // move the current item pointer to the Nth item
159  coDLinkList<T> &set(int);
160 
161  // move the current item pointer to the item which matches the given one
162  // return true if found, or false otherwise
163  bool search(const T &);
164 
165  // reset the current item pointer to the beginning of the list
167  {
168  if (head)
169  curr = head;
170  return *this;
171  };
172 
173  // move the current item pointer to the next item in list
175  {
176  if (curr)
177  curr = curr->next;
178  return *this;
179  };
180 
181  // move the current item pointer to the previous item in list
183  {
184  if (curr)
185  curr = curr->prev;
186  return *this;
187  };
188 
189  // clear the current item pointer; make it null
191  {
192  curr = (DLink<T> *)0;
193  return *this;
194  };
195 };
196 
197 //==========================================================================
198 //
199 //==========================================================================
200 template <class T>
202 {
203 
204  head = tail = curr = NULL;
205  listItems = 0;
206 }
207 
208 //==========================================================================
209 //
210 //==========================================================================
211 //template<class T> coDLinkList<T>::~coDLinkList(void)
212 //{
213 // reset();
214 // while(curr)
215 // remove();
216 //}
217 
218 //==========================================================================
219 // add new item to end of list
220 //==========================================================================
221 template <class T>
223 {
224  DLink<T> *newlink = new DLink<T>(a);
225  newlink->next = NULL;
226  newlink->prev = tail;
227  tail = newlink;
228  if (newlink->prev)
229  (newlink->prev)->next = newlink;
230  else
231  head = curr = newlink;
232  listItems++;
233  return *this;
234 }
235 
236 //==========================================================================
237 // append new item after the current item
238 //==========================================================================
239 template <class T>
241 {
242  if (curr) // yes, there is a current item
243  {
244  DLink<T> *newlink = new DLink<T>(a);
245  newlink->next = curr->next;
246  newlink->prev = curr;
247  curr->next = newlink;
248  if (newlink->next == NULL)
249  tail = newlink;
250  else
251  (newlink->next)->prev = newlink;
252  listItems++;
253  }
254  else // no current item; just append at end
255  append(a);
256  return *this;
257 }
258 
259 //==========================================================================
260 // append new item before the current item
261 //==========================================================================
262 template <class T>
264 {
265  if (curr) // yes, there is a current item
266  {
267  DLink<T> *newlink = new DLink<T>(a);
268  newlink->next = curr;
269  newlink->prev = curr->prev;
270  curr->prev = newlink;
271  if (newlink->prev == NULL)
272  head = newlink;
273  else
274  (newlink->prev)->next = newlink;
275  listItems++;
276  }
277  else // no current item; just append at end
278  append(a);
279  return *this;
280 }
281 
282 //==========================================================================
283 // remove current item from list
284 //==========================================================================
285 template <class T>
287 {
288  DLink<T> *oldlink = curr;
289  if (oldlink)
290  {
291  if (oldlink->prev)
292  (oldlink->prev)->next = oldlink->next;
293  if (oldlink->next)
294  (oldlink->next)->prev = oldlink->prev;
295  if (head == oldlink)
296  head = oldlink->next;
297  if (tail == oldlink)
298  tail = oldlink->prev;
299  curr = oldlink->next;
300  delete oldlink;
301  listItems--;
302  }
303  return *this;
304 }
305 
306 //==========================================================================
307 // return the Nth item; do not change current item position
308 //==========================================================================
309 template <class T>
311 {
312  DLink<T> *link = head;
313  while (link && n > 0)
314  {
315  link = link->next;
316  n--;
317  }
318  if (link && n == 0)
319  return link->item;
320  else
321  return head->item; // problem if NO items in list
322 }
323 
324 //==========================================================================
325 // just return the current item, do not change which item is current
326 //==========================================================================
327 template <class T>
329 {
330  DLink<T> *link = curr;
331  if (!link)
332  {
333  reset();
334  return (NULL);
335  }
336  return link->item;
337 }
338 
339 //==========================================================================
340 // move the current item pointer to the Nth item
341 //==========================================================================
342 template <class T>
344 {
345  reset();
346  for (int i = 0; i < N; i++)
347  next();
348  return *this;
349 }
350 
351 //==========================================================================
352 // move the current item pointer to the item which matches the given one
353 // return true if found, or false otherwise
354 //==========================================================================
355 template <class T>
356 bool coDLinkList<T>::search(const T &a)
357 {
358  reset();
359  while (curr && compare(curr->item, a) == false)
360  next();
361  return (curr != NULL);
362 }
363 }
364 #endif //COVISE_LINK_LIST_H
T item(int)
Definition: coLinkList.h:310
DLink< T > * first_item() const
Definition: coLinkList.h:118
~coDLinkList(void)
Definition: coLinkList.h:65
DLink(const T &a)
Definition: coLinkList.h:45
DLink< T > * last_item() const
Definition: coLinkList.h:126
T operator[](int i)
Definition: coLinkList.h:149
DLink< T > * curr
Definition: coLinkList.h:58
GLdouble n
Definition: khronos-glext.h:8447
T item
Definition: coLinkList.h:42
Definition: coLinkList.h:53
coDLinkList< T > & remove(void)
Definition: coLinkList.h:286
coDLinkList(void)
Definition: coLinkList.h:201
GLboolean reset
Definition: khronos-glext.h:6369
#define NULL
Definition: covise_list.h:22
coDLinkList< T > & reset(void)
Definition: coLinkList.h:166
bool is_current(void)
Definition: coLinkList.h:87
DLink< T > * next
Definition: coLinkList.h:44
int size(void)
Definition: coLinkList.h:81
coDLinkList< T > & append(const T &)
Definition: coLinkList.h:222
DLink< T > * prev
Definition: coLinkList.h:43
bool search(const T &)
Definition: coLinkList.h:356
coDLinkList< T > & prev(void)
Definition: coLinkList.h:182
int listItems
Definition: coLinkList.h:59
GLboolean GLboolean GLboolean GLboolean a
Definition: khronos-glext.h:6895
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
DLink< T > * last() const
Definition: coLinkList.h:122
coDLinkList< T > & next(void)
Definition: coLinkList.h:174
UTILEXPORT int compare(const coObjID &a, const coObjID &b)
DLink< T > * head
Definition: coLinkList.h:58
Definition: coLinkList.h:40
int empty(void)
Definition: coLinkList.h:93
coDLinkList< T > & set(int)
Definition: coLinkList.h:343
T current(void)
Definition: coLinkList.h:328
int length(void)
Definition: coLinkList.h:75
DLink< T > * tail
Definition: coLinkList.h:58
DLink< T > * first() const
Definition: coLinkList.h:114
coDLinkList< T > & insertBefore(const T &)
Definition: coLinkList.h:263
coDLinkList< T > & insertAfter(const T &)
Definition: coLinkList.h:240
coDLinkList< T > & clear(void)
Definition: coLinkList.h:190