mdsTriContainer.h

Go to the documentation of this file.
00001 //==============================================================================
00015 #ifndef MDS_TRICONTAINER_H
00016 #define MDS_TRICONTAINER_H
00017 
00018 #include "mdsTriFeatures.h"
00019 
00020 // MDSTk
00021 #include <MDSTk/Base/mdsIterator.h>
00022 
00023 // VCTL
00024 #include <VectorEntity/mcentity.h>
00025 
00026 
00027 namespace mds
00028 {
00029 
00030 // Declare iterator traits first...
00031 MDS_ITERATOR_TRAITS(seg, CTriContainerIterator, seg::CTriFeatures);
00032 
00033 namespace seg
00034 {
00035 
00036 //==============================================================================
00040 class CTriContainerIterator
00041     : public mds::base::CIteratorBase<CTriContainerIterator>
00042     , public mds::base::CPtrHolder<CTriFeatures>
00043 {
00044 public:
00046     typedef mds::base::CPtrHolder<CTriFeatures> base;
00047 
00048 public:
00050     CTriContainerIterator(vctl::MCTri *pFirstTriangle)
00051     {
00052         init(pFirstTriangle);
00053     }
00054 
00056     CTriContainerIterator(const CTriContainerIterator& It)
00057     {
00058         base::m_pItem = It.m_pItem;
00059         m_pTriangle = It.m_pTriangle;
00060     }
00061 
00063     ~CTriContainerIterator() {}
00064 
00066     CTriContainerIterator& operator=(const CTriContainerIterator& It)
00067     {
00068         base::m_pItem = It.m_pItem;
00069         m_pTriangle = It.m_pTriangle;
00070         return *this;
00071     }
00072 
00073 
00075     vctl::MCTri *getTriangle() { return m_pTriangle; }
00076 
00079     tSize getDistance(const CTriContainerIterator& End) const
00080     {
00081         if( !m_pTriangle )
00082         {
00083             return 0;
00084         }
00085         
00086         // Count the distance
00087         tSize Count = 0;
00088         for( CTriContainerIterator it = *this; it != End; ++it )
00089         {
00090             ++Count;
00091         }
00092         return Count;
00093     }
00094 
00096     void advance()
00097     {
00098         do {
00099             if( !m_pItem )
00100             {
00101                 break;
00102             }
00103             else
00104             {
00105                 next();
00106             }
00107         } while( m_pItem && m_pItem->isError() );
00108     }
00109 
00110 protected:
00112     vctl::MCTri *m_pTriangle;
00113 
00114 protected:
00116     void init(vctl::MCTri *pTriangle)
00117     {
00118         m_pTriangle = pTriangle;
00119         if( !m_pTriangle )
00120         {
00121             m_pItem = NULL;
00122             return;
00123         }
00124 
00125         m_pItem = getTriangleFeatures(pTriangle);
00126 
00127         // Find the first evaluated triangle
00128         if( m_pItem->isError() )
00129         {
00130             advance();
00131         }
00132     }
00133 
00135     void next()
00136     {
00137         m_pTriangle = m_pTriangle->GetNext();
00138         m_pItem = (m_pTriangle) ? getTriangleFeatures(m_pTriangle) : NULL;
00139     }
00140 };
00141 
00142 
00143 //==============================================================================
00147 class CTriContainer
00148 {
00149 public:
00151     enum { ITERATOR_DECLARED };
00152     
00154     typedef CTriContainerIterator tIterator;
00155     
00157     typedef CTriContainerIterator tConstIterator;
00158 
00159 public:
00161     CTriContainer(vctl::MCTri *pFirstTriangle) : m_pTriangle(pFirstTriangle)
00162     {
00163         MDS_ASSERT(m_pTriangle);
00164     }
00165 
00167     ~CTriContainer() {}
00168 
00169 
00171     tIterator getBegin()
00172     {
00173         return tIterator(m_pTriangle);
00174     }
00175     tConstIterator getBegin() const
00176     {
00177         return tConstIterator(m_pTriangle);
00178     }
00179 
00181     tIterator getEnd()
00182     {
00183         return tIterator(NULL);
00184     }
00185     tConstIterator getEnd() const
00186     {
00187         return tConstIterator(NULL);
00188     }
00189 
00190 protected:
00192     vctl::MCTri *m_pTriangle;
00193 };
00194 
00195 
00196 } // namespace seg
00197 } // namespace mds
00198 
00199 #endif // MDS_TRICONTAINER_H
00200 

Generated on Thu Mar 11 10:35:44 2010 for MDSTk Extension Libraries by  doxygen 1.4.6-NO