VR-Forces 4.0.4 Class Documentation
include/vrfutil/iteratorBase.h
Go to the documentation of this file.
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

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)