VR-Forces 4.1.1 Class Documentation
iteratorBase.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2001 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 /*******************************************************************************
6 ** $RCSfile: iteratorBase.h,v $ $Revision: 1.13 $ $State: Exp $
7 *******************************************************************************/
8 #ifndef iteratorBase_H_
9 #define iteratorBase_H_
10 
13 
14 #include <vlutil/vlList.h>
15 #include <vlutil/vlPrint.h>
16 
18 {
21 };
22 
24 {
27 };
28 
32 template<class T> class DtIteratorBase
33 {
34 private:
35 
36  //default constructor is not allowed
38 
40  const DtIteratorBase& operator=(const DtIteratorBase& orig);
41 
42 public:
43 
45  DtIteratorBase(const DtList& list) : myList(list), myCursor(0), myDirection(DtIteratorForward) { first(); };
46 
49 
50  virtual ~DtIteratorBase() {};
51 
53  virtual unsigned int size() const { return myList.count(); }
54 
57  virtual bool empty() const { return myList.count() != 0; }
58 
59  virtual const DtList& list() { return myList; };
60 
65  virtual bool reset(bool reverse = false)
66  {
67  return reset(
70  };
71 
73  virtual bool reset(DtIteratorLocation location,
75  {
76  switch (location)
77  {
79  myCursor = myList.first();
80  break;
81 
82  case DtIteratorEnd:
83  myCursor = myList.last();
84  break;
85 
86  default:
87  DtWarn("DtIteratorBase::reset() unexpected location specified.\n");
88  }
89 
91 
92  return (myCursor != 0);
93  };
94 
96  virtual void reverse()
97  {
98  myDirection =
102  };
103 
106  { myDirection = direction; };
107 
110 
112  virtual int cursorIndex() const
113  {
114  DtListItem* item = myList.first();
115  int i = 0;
116 
117  for (;item; item = item->next(), i++)
118  {
119  if (item == myCursor)
120  {
121  return i;
122  }
123  }
124 
125  return -1;
126  }
127 
128  virtual void setCursorIndex(int i)
129  {
130  myCursor = myList.first();
131 
132  if (i != -1)
133  {
134  while (i)
135  {
136  myCursor = myCursor->next();
137  i--;
138  }
139  }
140  }
141 
142 public:
143 
149  virtual T* internalFirst(bool move = true)
150  {
152  {
153  if (move)
154  {
155  reset();
156  }
157 
158  if (myList.first())
159  {
160  return (T*)(myList.first()->data());
161  }
162  else
163  {
164  return 0;
165  }
166  }
167  else
168  {
169  if (move)
170  {
171  reset(true);
172  }
173 
174  if (myList.last())
175  {
176  return (T*)(myList.last()->data());
177  }
178  else
179  {
180  return 0;
181  }
182  }
183  };
184 
186  virtual T* internalCurrent() const {return (myCursor ? (T*)myCursor->data() : 0); };
187 
189  virtual DtListItem* cursor() const { return myCursor; };
190 
191  virtual T* itemToObject(DtListItem* item, bool move)
192  {
193  if (move)
194  {
195  myCursor = item;
196  }
197 
198  if (item)
199  {
200  return (T*)item->data();
201  }
202 
203  return 0;
204  };
205 
206  virtual T* internalNext(bool move = true)
207  {
208  if (myCursor)
209  {
210 
211  DtListItem* tmpCursor = 0;
212 
213  tmpCursor = ((myDirection == DtIteratorForward) ?
214  myCursor->next() : myCursor->prev());
215 
216  return itemToObject(tmpCursor, move);
217  }
218 
219  return 0;
220  };
221 
227  virtual T* internalLast(bool move = true)
228  {
230  {
231  if (move)
232  {
233  reset(true);
234  }
235 
236  if (myList.last())
237  {
238  return (T*)(myList.last()->data());
239  }
240  else
241  {
242  return 0;
243  }
244  }
245  else
246  {
247  if (move)
248  {
249  reset();
250  }
251 
252  if (myList.first())
253  {
254  return (T*)(myList.first()->data());
255  }
256  else
257  {
258  return 0;
259  }
260  }
261  };
262 
263 
267  virtual T* internalWrapNext(bool move = true)
268  {
269  if (!myCursor)
270  {
271  return 0;
272  }
273 
274  DtListItem* tmpCursor = 0;
275 
276  tmpCursor = ((myDirection == DtIteratorForward) ?
277  myCursor->next() : myCursor->prev());
278 
279  if (! tmpCursor)
280  {
281  tmpCursor = ((myDirection == DtIteratorForward) ?
282  myList.first() : myList.last());
283  }
284 
285  return itemToObject(tmpCursor, move);
286  };
287 
291  virtual T* internalPrev(bool move = true)
292  {
293  if (myCursor)
294  {
295  DtListItem* tmpCursor = 0;
296 
297  tmpCursor = ((myDirection == DtIteratorForward) ?
298  myCursor->prev() : myCursor->next());
299 
300  return itemToObject(tmpCursor, move);
301  }
302 
303  return 0;
304  };
305 
306  virtual T* internalWrapPrev(bool move = true)
307  {
308  if (!myCursor)
309  {
310  return 0;
311  }
312 
313  DtListItem* tmpCursor = 0;
314 
315  tmpCursor = ((myDirection == DtIteratorForward) ?
316  myCursor->prev() : myCursor->next());
317 
318  if (! tmpCursor)
319  {
320  tmpCursor = ((myDirection == DtIteratorForward) ?
321  myList.last() : myList.first());
322  }
323 
324  return itemToObject(tmpCursor, move);
325  };
326 
327  virtual T* current() { return internalCurrent(); };
328  virtual T* first(bool move = true) { return internalFirst(move); };
329  virtual T* next(bool move = true) { return internalNext(move); };
330  virtual T* prev(bool move = true) { return internalPrev(move); };
331  virtual T* last(bool move = true) { return internalLast(move); };
332  virtual T* wrapNext(bool move = true) { return internalWrapNext(move); };
333  virtual T* wrapPrev(bool move = true) { return internalWrapPrev(move); };
334 
335  T* operator++() { return next(); };
336  T* operator--() { return prev(); };
337 
338 protected:
339 
340  const DtList& myList;
341  DtListItem* myCursor;
343 
344 };
345 
346 #endif

Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)