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