![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2001 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: iteratorBase.h,v $ $Revision: 1.13 $ $State: Exp $ 00007 *******************************************************************************/ 00008 #ifndef iteratorBase_H_ 00009 #define iteratorBase_H_ 00010 00013 00014 #include <vlutil/vlList.h> 00015 #include <vlutil/vlPrint.h> 00016 00017 enum DtIteratorLocation 00018 { 00019 DtIteratorBeginning, 00020 DtIteratorEnd 00021 }; 00022 00023 enum DtIteratorDirection 00024 { 00025 DtIteratorForward, 00026 DtIteratorReverse 00027 }; 00028 00032 template<class T> class DtIteratorBase 00033 { 00034 private: 00035 00036 //default constructor is not allowed 00037 DtIteratorBase(); 00038 00040 const DtIteratorBase& operator=(const DtIteratorBase& orig); 00041 00042 public: 00043 00045 DtIteratorBase(const DtList& list) : myList(list), myCursor(0), myDirection(DtIteratorForward) { first(); }; 00046 00048 DtIteratorBase(const DtIteratorBase& orig) : myList(orig.myList), myCursor(orig.myCursor), myDirection(orig.myDirection) {}; 00049 00050 virtual ~DtIteratorBase() {}; 00051 00053 virtual unsigned int size() const { return myList.count(); } 00054 00057 virtual bool empty() const { return myList.count() != 0; } 00058 00059 virtual const DtList& list() { return myList; }; 00060 00065 virtual bool reset(bool reverse = false) 00066 { 00067 return reset( 00068 (reverse ? DtIteratorEnd : DtIteratorBeginning), 00069 (reverse ? DtIteratorReverse : DtIteratorForward)); 00070 }; 00071 00073 virtual bool reset(DtIteratorLocation location, 00074 DtIteratorDirection direction = DtIteratorForward) 00075 { 00076 switch (location) 00077 { 00078 case DtIteratorBeginning: 00079 myCursor = myList.first(); 00080 break; 00081 00082 case DtIteratorEnd: 00083 myCursor = myList.last(); 00084 break; 00085 00086 default: 00087 DtWarn("DtIteratorBase::reset() unexpected location specified.\n"); 00088 } 00089 00090 myDirection = direction; 00091 00092 return (myCursor != 0); 00093 }; 00094 00096 virtual void reverse() 00097 { 00098 myDirection = 00099 ((myDirection == DtIteratorForward) ? 00100 DtIteratorReverse : 00101 DtIteratorForward); 00102 }; 00103 00105 virtual void setDirection(DtIteratorDirection direction) 00106 { myDirection = direction; }; 00107 00109 virtual DtIteratorDirection direction() { return myDirection; }; 00110 00112 virtual int cursorIndex() const 00113 { 00114 DtListItem* item = myList.first(); 00115 int i = 0; 00116 00117 for (;item; item = item->next(), i++) 00118 { 00119 if (item == myCursor) 00120 { 00121 return i; 00122 } 00123 } 00124 00125 return -1; 00126 } 00127 00128 virtual void setCursorIndex(int i) 00129 { 00130 myCursor = myList.first(); 00131 00132 if (i != -1) 00133 { 00134 while (i) 00135 { 00136 myCursor = myCursor->next(); 00137 i--; 00138 } 00139 } 00140 } 00141 00142 public: 00143 00149 virtual T* internalFirst(bool move = true) 00150 { 00151 if (myDirection == DtIteratorForward) 00152 { 00153 if (move) 00154 { 00155 reset(); 00156 } 00157 00158 if (myList.first()) 00159 { 00160 return (T*)(myList.first()->data()); 00161 } 00162 else 00163 { 00164 return 0; 00165 } 00166 } 00167 else 00168 { 00169 if (move) 00170 { 00171 reset(true); 00172 } 00173 00174 if (myList.last()) 00175 { 00176 return (T*)(myList.last()->data()); 00177 } 00178 else 00179 { 00180 return 0; 00181 } 00182 } 00183 }; 00184 00186 virtual T* internalCurrent() const {return (myCursor ? (T*)myCursor->data() : 0); }; 00187 00189 virtual DtListItem* cursor() const { return myCursor; }; 00190 00191 virtual T* itemToObject(DtListItem* item, bool move) 00192 { 00193 if (move) 00194 { 00195 myCursor = item; 00196 } 00197 00198 if (item) 00199 { 00200 return (T*)item->data(); 00201 } 00202 00203 return 0; 00204 }; 00205 00206 virtual T* internalNext(bool move = true) 00207 { 00208 if (myCursor) 00209 { 00210 00211 DtListItem* tmpCursor = 0; 00212 00213 tmpCursor = ((myDirection == DtIteratorForward) ? 00214 myCursor->next() : myCursor->prev()); 00215 00216 return itemToObject(tmpCursor, move); 00217 } 00218 00219 return 0; 00220 }; 00221 00227 virtual T* internalLast(bool move = true) 00228 { 00229 if (myDirection == DtIteratorForward) 00230 { 00231 if (move) 00232 { 00233 reset(true); 00234 } 00235 00236 if (myList.last()) 00237 { 00238 return (T*)(myList.last()->data()); 00239 } 00240 else 00241 { 00242 return 0; 00243 } 00244 } 00245 else 00246 { 00247 if (move) 00248 { 00249 reset(); 00250 } 00251 00252 if (myList.first()) 00253 { 00254 return (T*)(myList.first()->data()); 00255 } 00256 else 00257 { 00258 return 0; 00259 } 00260 } 00261 }; 00262 00263 00267 virtual T* internalWrapNext(bool move = true) 00268 { 00269 if (!myCursor) 00270 { 00271 return 0; 00272 } 00273 00274 DtListItem* tmpCursor = 0; 00275 00276 tmpCursor = ((myDirection == DtIteratorForward) ? 00277 myCursor->next() : myCursor->prev()); 00278 00279 if (! tmpCursor) 00280 { 00281 tmpCursor = ((myDirection == DtIteratorForward) ? 00282 myList.first() : myList.last()); 00283 } 00284 00285 return itemToObject(tmpCursor, move); 00286 }; 00287 00291 virtual T* internalPrev(bool move = true) 00292 { 00293 if (myCursor) 00294 { 00295 DtListItem* tmpCursor = 0; 00296 00297 tmpCursor = ((myDirection == DtIteratorForward) ? 00298 myCursor->prev() : myCursor->next()); 00299 00300 return itemToObject(tmpCursor, move); 00301 } 00302 00303 return 0; 00304 }; 00305 00306 virtual T* internalWrapPrev(bool move = true) 00307 { 00308 if (!myCursor) 00309 { 00310 return 0; 00311 } 00312 00313 DtListItem* tmpCursor = 0; 00314 00315 tmpCursor = ((myDirection == DtIteratorForward) ? 00316 myCursor->prev() : myCursor->next()); 00317 00318 if (! tmpCursor) 00319 { 00320 tmpCursor = ((myDirection == DtIteratorForward) ? 00321 myList.last() : myList.first()); 00322 } 00323 00324 return itemToObject(tmpCursor, move); 00325 }; 00326 00327 virtual T* current() { return internalCurrent(); }; 00328 virtual T* first(bool move = true) { return internalFirst(move); }; 00329 virtual T* next(bool move = true) { return internalNext(move); }; 00330 virtual T* prev(bool move = true) { return internalPrev(move); }; 00331 virtual T* last(bool move = true) { return internalLast(move); }; 00332 virtual T* wrapNext(bool move = true) { return internalWrapNext(move); }; 00333 virtual T* wrapPrev(bool move = true) { return internalWrapPrev(move); }; 00334 00335 T* operator++() { return next(); }; 00336 T* operator--() { return prev(); }; 00337 00338 protected: 00339 00340 const DtList& myList; 00341 DtListItem* myCursor; 00342 DtIteratorDirection myDirection; 00343 00344 }; 00345 00346 #endif