MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLCSO/CSOTools/CSOPathPointIterator.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //-----------------------------------------------------------------------------
00005 
00010 //-----------------------------------------------------------------------------
00011 
00012 #ifndef __CSOPathPointIterator_H
00013 #define __CSOPathPointIterator_H
00014 
00015 #include "CSOBase/CSO.h"
00016 #include "MLCSOIncludes.h"
00017 
00018 ML_START_NAMESPACE 
00019 
00020 class MLCSO_EXPORT CSOPathPointIterator
00021 {
00022 public:
00023 
00025 
00026   static const unsigned int INVALID_INDEX;
00027 
00029 
00031   CSOPathPointIterator();
00033   CSOPathPointIterator(CSO* cso, unsigned int startPathIndex=0, unsigned int startPointIndex=0);
00035   CSOPathPointIterator(CSO* cso, CSOPathPoints* pathPoints, unsigned int startPathIndex, unsigned int startPointIndex=0);
00037   CSOPathPointIterator(CSO* cso, CSOPathPoints* pathPoints, unsigned int startPointIndex=0);
00039   CSOPathPointIterator(CSO* cso, CSOSeedPoint* startSeedPoint);
00041   CSOPathPointIterator(const CSOPathPointIterator& rhs);
00042 
00044   ~CSOPathPointIterator() {}
00045 
00047 
00049   CSOPathPointIterator&   operator++  ();
00051   CSOPathPointIterator    operator++  (int dummy);
00052 
00054   CSOPathPointIterator&   operator--  ();
00056   CSOPathPointIterator    operator--  (int dummy);
00057 
00059   CSOPathPointIterator&   operator+=  (int offset);
00061   CSOPathPointIterator&   operator-=  (int offset);
00062 
00064   CSOPathPointIterator    operator+   (int offset) const;
00066   CSOPathPointIterator    operator-   (int offset) const;
00067 
00069   CSOPathPointIterator&   operator=   (const CSOPathPointIterator& rhs);
00070 
00072   bool                    operator==  (const CSOPathPointIterator& rhs) const;
00074   bool                    operator!=  (const CSOPathPointIterator& rhs) const;
00076   bool                    operator>   (const CSOPathPointIterator& rhs) const;
00078   bool                    operator>=  (const CSOPathPointIterator& rhs) const;
00080   bool                    operator<   (const CSOPathPointIterator& rhs) const;
00082   bool                    operator<=  (const CSOPathPointIterator& rhs) const;
00083 
00085 
00087   inline const CSO*     getCSO          () const    { return _cso; }
00089   inline CSO*           getCSO          ()          { return _cso; }
00090 
00092   inline unsigned int   getPathIndex    () const    { return _pathIndex;   }
00094   inline unsigned int   getPointIndex   () const    { return _pointIndex;  }
00095 
00096   // Returns a pointer to the current path point list.
00097   inline const CSOPathPoints* getPathPoints() const { return _pathPoints;  }
00098   // Returns a pointer to the current path point list.
00099   inline CSOPathPoints*       getPathPoints()       { return _pathPoints;  }
00100 
00102   inline Vector3        getPos          () const    { return _pathPoints->getPosAt(_pointIndex); }
00104   inline const Vector4&    getPosValue     () const    { return _pathPoints->getPosValueAt(_pointIndex);   }
00106   inline double         getValue        () const    { return _pathPoints->getValueAt(_pointIndex);      }
00107 
00109   inline void           setPos(const Vector3& p)       { _pathPoints->setPosAt(p, _pointIndex);            }
00111   inline void           setPosValue(const Vector4& p)  { _pathPoints->setPosValueAt(p, _pointIndex);       }
00113   inline void           setValue(const double& v)   { _pathPoints->setValueAt(static_cast<float>(v), _pointIndex);          }
00114 
00116   inline unsigned int   numPoints               () const { return _numPoints; }
00119   inline unsigned int   numProcessedPoints      () const { return mlAbs(_pointCounterInc-_pointCounterDec); }
00122   inline unsigned int   numTotalProcessedPoints () const { return isEnd() ? _pointCounterInc+_pointCounterDec : _pointCounterInc+_pointCounterDec+1; }
00123 
00125 
00127   void                  resetCounters() { _pointCounterInc = _pointCounterDec = 0; }
00128 
00130 
00132   void                  makeEnd();
00135   inline bool           isEnd() const { return (_pathIndex == INVALID_INDEX) && (_pointIndex == INVALID_INDEX); }
00136 
00138   CSOPathPointIterator  next()  const;
00140   CSOPathPointIterator  prev()  const;
00141 
00142 private:
00143 
00145   void _copy(const CSOPathPointIterator& rhs);
00146 
00148   bool _valid() const;
00149 
00152   bool _findValidPathPointList();
00153 
00155   CSO* _cso;
00157   CSOPathPoints* _pathPoints;
00158 
00160   unsigned int _pathIndex;
00162   unsigned int _pointIndex;
00163 
00165   unsigned int _numPathPointLists;
00167   unsigned int _numPoints;
00168 
00170   unsigned int _startPathIndex;
00172   unsigned int _startPointIndex;
00173 
00175   unsigned int _pointCounterInc;
00176 
00178   unsigned int _pointCounterDec;
00179 
00180 };
00181 
00182 class MLCSO_EXPORT CSOPathPointConstIterator
00183 {
00184 public:
00185 
00187 
00188   static const unsigned int INVALID_INDEX;
00189 
00191 
00193   CSOPathPointConstIterator();
00195   CSOPathPointConstIterator(const CSO* cso, unsigned int startPathIndex=0, unsigned int startPointIndex=0);
00197   CSOPathPointConstIterator(const CSO* cso, const CSOPathPoints* pathPoints, unsigned int startPathIndex, unsigned int startPointIndex=0);
00199   CSOPathPointConstIterator(const CSO* cso, const CSOPathPoints* pathPoints, unsigned int startPointIndex=0);
00201   CSOPathPointConstIterator(const CSO* cso, const CSOSeedPoint* startSeedPoint);
00203   CSOPathPointConstIterator(const CSOPathPointConstIterator& rhs);
00204 
00206   ~CSOPathPointConstIterator() {}
00207 
00209 
00211   CSOPathPointConstIterator&  operator++  ();
00213   CSOPathPointConstIterator   operator++  (int dummy);
00214 
00216   CSOPathPointConstIterator&  operator--  ();
00218   CSOPathPointConstIterator   operator--  (int dummy);
00219 
00221   CSOPathPointConstIterator&  operator+=  (int offset);
00223   CSOPathPointConstIterator&  operator-=  (int offset);
00224 
00226   CSOPathPointConstIterator   operator+   (int offset) const;
00228   CSOPathPointConstIterator   operator-   (int offset) const;
00229 
00231   CSOPathPointConstIterator&  operator=   (const CSOPathPointConstIterator& rhs);
00232 
00234   bool                        operator==  (const CSOPathPointConstIterator& rhs) const;
00236   bool                        operator!=  (const CSOPathPointConstIterator& rhs) const;
00238   bool                        operator>   (const CSOPathPointConstIterator& rhs) const;
00240   bool                        operator>=  (const CSOPathPointConstIterator& rhs) const;
00242   bool                        operator<   (const CSOPathPointConstIterator& rhs) const;
00244   bool                        operator<=  (const CSOPathPointConstIterator& rhs) const;
00245 
00247 
00249   inline const CSO*           getCSO          () const    { return _cso; }
00250 
00252   inline unsigned int         getPathIndex    () const    { return _pathIndex;   }
00254   inline unsigned int         getPointIndex   () const    { return _pointIndex;  }
00255 
00256   // Returns a pointer to the current path point list.
00257   inline const CSOPathPoints* getPathPoints   () const    { return _pathPoints;  }
00258 
00260   inline Vector3              getPos          () const    { return _pathPoints->getPosAt(_pointIndex); }
00262   inline const Vector4&       getPosValue     () const    { return _pathPoints->getPosValueAt(_pointIndex);   }
00264   inline double               getValue        () const    { return _pathPoints->getValueAt(_pointIndex);      }
00265 
00267   inline unsigned int         numPoints               () const { return _numPoints; }
00270   inline unsigned int         numProcessedPoints      () const { return mlAbs(_pointCounterInc-_pointCounterDec); }
00273   inline unsigned int         numTotalProcessedPoints () const { return isEnd() ? _pointCounterInc+_pointCounterDec : _pointCounterInc+_pointCounterDec+1; }
00274 
00276 
00278   void                        resetCounters() { _pointCounterInc = _pointCounterDec = 0; }
00279 
00281 
00283   void                        makeEnd();
00286   inline bool                 isEnd() const { return (_pathIndex == INVALID_INDEX) && (_pointIndex == INVALID_INDEX); }
00287 
00289   CSOPathPointConstIterator   next()  const;
00291   CSOPathPointConstIterator   prev()  const;
00292 
00293 private:
00294 
00296   void _copy(const CSOPathPointConstIterator& rhs);
00297 
00299   bool _valid() const;
00300 
00303   bool _findValidPathPointList();
00304 
00306   const CSO* _cso;
00308   const CSOPathPoints* _pathPoints;
00309 
00311   unsigned int _pathIndex;
00313   unsigned int _pointIndex;
00314 
00316   unsigned int _numPathPointLists;
00318   unsigned int _numPoints;
00319 
00321   unsigned int _startPathIndex;
00323   unsigned int _startPointIndex;
00324 
00326   unsigned int _pointCounterInc;
00327 
00329   unsigned int _pointCounterDec;
00330 
00331 };
00332 
00334 const CSOPathPointIterator CSOPathPointIteratorEnd  = CSOPathPointIterator();
00335 
00337 const CSOPathPointConstIterator CSOPathPointConstIteratorEnd  = CSOPathPointConstIterator();
00338 
00339 ML_END_NAMESPACE
00340 
00341 #endif // __CSOPathPointIterator_H
00342 
00343 
00344