Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

MeshTypes.h

Go to the documentation of this file.
00001 
00002 
00003 
00005 
00006 
00011 
00016 
00021 //                            MeshTypes.h                                     //
00023 
00024 #ifndef MESHTYPES_H
00025 #define MESHTYPES_H
00026 
00027 #include <vector>
00028 #include <list>
00029 #include <iostream>
00030 
00031 namespace X3DTK {
00032 namespace Mesh {
00033 
00034 class X3DNode;
00035 typedef X3DNode *SFNode;
00036 typedef std::list<SFNode> MFNode;
00037 
00038 template<class A, class B, class C> class TemplateVertex;
00039 template<class A, class B, class C> class TemplateEdge;
00040 template<class A, class B, class C> class TemplateFace;
00041 
00044 
00045 template<class T>
00046 class Object_Iterator
00047 {
00048 public:
00050   Object_Iterator(): _pointer(0) {};
00052   explicit Object_Iterator(T *pointer): _pointer(pointer) {};
00053   
00055   inline T &operator*() {return static_cast<T &>(*_pointer);};
00057   inline const T &operator*() const {return static_cast<T &>(*_pointer);};
00059   T *operator->() const {return _pointer;};
00060   
00062   Object_Iterator<T> &operator++() 
00063   {
00064     _pointer += 1;
00065     while (*_pointer == 0)
00066       _pointer += 1;
00067       
00068     return *this;
00069   };
00071   Object_Iterator<T> &operator++(int) 
00072   {
00073     Object_Iterator<T> &tmp = *this;
00074     
00075     _pointer += 1;
00076     while (*_pointer == 0)
00077       _pointer += 1;
00078       
00079     return *tmp;
00080   };
00082   Object_Iterator<T> &operator--() 
00083   {
00084     _pointer -= 1;
00085     while (*_pointer == 0)
00086       _pointer -= 1;
00087       
00088     return *this;
00089   };
00091   Object_Iterator<T> &operator--(int) 
00092   {
00093     Object_Iterator<T> &tmp = *this;
00094     
00095     _pointer -= 1;
00096     while (*_pointer == 0)
00097       _pointer -= 1;
00098       
00099     return *tmp;
00100   };
00101   
00102   
00103 protected:
00105   T *_pointer;  
00106 };
00107 
00108 template<class T>
00109 inline bool operator==(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00110 {
00111   return x.operator->() == y.operator->();
00112 };
00113 
00114 template<class T>
00115 inline bool operator!=(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00116 {
00117   return x.operator->() != y.operator->();
00118 };
00119 
00121 
00122 template<class T>
00123 class Const_Object_Iterator : public Object_Iterator<const T>
00124 {
00125 public:
00127   Const_Object_Iterator() : Object_Iterator<const T>() {};
00129   explicit Const_Object_Iterator(const T *pointer): Object_Iterator<const T>(pointer) {};
00130 };
00131 
00133 
00134 template<class T>
00135 class Non_Const_Object_Iterator : public Object_Iterator<T>
00136 {
00137 public:
00139   Non_Const_Object_Iterator() : Object_Iterator<T>() {};
00141   explicit Non_Const_Object_Iterator(T *pointer): Object_Iterator<T>(pointer) {};
00142 
00144   inline operator Const_Object_Iterator<T>() const 
00145   {
00146     return Const_Object_Iterator<T>(_pointer);
00147   };
00148 };
00149 
00150 #ifndef DOXYGEN
00151 
00152 template<class T>
00153 struct MBase
00154 {
00155   typedef Non_Const_Object_Iterator<T> iterator;
00156   typedef Const_Object_Iterator<T> const_iterator;
00157 };
00158 
00159 #endif
00160 
00162 
00163 template<class VData, class EData, class FData>
00164 class MTemplateVertex : public std::vector<TemplateVertex<VData, EData, FData> *>, public MBase<TemplateVertex<VData, EData, FData> *>
00165 {
00166 public:
00168   MTemplateVertex() : std::vector<TemplateVertex<VData, EData, FData> *>(1, (TemplateVertex<VData, EData, FData> *)(0x1)) {};
00170   explicit MTemplateVertex(const std::vector<TemplateVertex<VData, EData, FData> *> &vector)
00171   : std::vector<TemplateVertex<VData, EData, FData> *>(vector)
00172   {
00173     push_back((TemplateVertex<VData, EData, FData> *)(0x1));
00174   }; 
00175   
00177   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::iterator iterator;
00179   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::const_iterator const_iterator;
00180   
00182   inline iterator begin() {return iterator(&front());};
00184   inline iterator end() {return iterator(&back());};
00185 
00187   inline const_iterator begin() const {return const_iterator(&front());};
00189   inline const_iterator end() const {return const_iterator(&back());};
00190   
00192   inline unsigned int size() const {return static_cast<const std::vector<TemplateVertex<VData, EData, FData> *> *const>(this)->size() - 1;};
00194   inline bool empty() const {return size() == 1;};
00195 };
00196 
00198 
00199 template<class EData, class FData, class VData>
00200 class MTemplateEdge : public std::vector<TemplateEdge<EData, FData, VData> *>, public MBase<TemplateEdge<EData, FData, VData> *>
00201 {
00202 public:
00204   MTemplateEdge() : std::vector<TemplateEdge<EData, FData, VData> *>(1, (TemplateEdge<EData, FData, VData> *)(0x1)) {};
00206   explicit MTemplateEdge(const std::vector<TemplateEdge<EData, FData, VData> *> &vector, bool ccw)
00207   : std::vector<TemplateEdge<EData, FData, VData> *>(vector)
00208   {
00209     if (!ccw)
00210     {
00211       unsigned int last = vector.size() - 1;
00212       unsigned int mid = (last + 1)/2;
00213       for (unsigned int i = 0; i < mid; ++i)
00214       {
00215         TemplateEdge<EData, FData, VData> *temp = (*this)[i];
00216         (*this)[i] = (*this)[last - i];
00217         (*this)[last - i] = temp;
00218       }
00219     }  
00220          
00221     push_back((TemplateEdge<EData, FData, VData> *)(0x1));
00222   };
00224   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::iterator iterator;
00226   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::const_iterator const_iterator;
00227   
00229   inline iterator begin() {return iterator(&front());};
00231   inline iterator end() {return iterator(&back());};
00232 
00234   inline const_iterator begin() const {return const_iterator(&front());};
00236   inline const_iterator end() const {return const_iterator(&back());};
00237 
00239   inline unsigned int size() const {return static_cast<const std::vector<TemplateEdge<EData, FData, VData> *> *const>(this)->size() - 1;};
00241   inline bool empty() const {return size() == 1;};
00242 };
00243 
00245 
00246 template<class FData, class VData, class EData>
00247 class MTemplateFace : public std::vector<TemplateFace<FData, VData, EData> *>, public MBase<TemplateFace<FData, VData, EData> *>
00248 {
00249 public:
00251   MTemplateFace() : std::vector<TemplateFace<FData, VData, EData> *>(1, (TemplateFace<FData, VData, EData> *)(0x1)) {};
00253   explicit MTemplateFace(const std::vector<TemplateFace<FData, VData, EData> *> &vector)
00254   : std::vector<TemplateFace<FData, VData, EData> *>(vector)
00255   {
00256     push_back((TemplateFace<FData, VData, EData> *)(0x1));
00257   };
00259   typedef typename MBase<TemplateFace<FData, VData, EData> *>::iterator iterator;
00261   typedef typename MBase<TemplateFace<FData, VData, EData> *>::const_iterator const_iterator;    
00262   
00264   inline iterator begin() {return iterator(&front());};
00266   inline iterator end() {return iterator(&back());};
00267 
00269   inline const_iterator begin() const {return const_iterator(&front());};
00271   inline const_iterator end() const {return const_iterator(&back());};
00272 
00274   inline unsigned int size() const {return static_cast<const std::vector<TemplateFace<FData, VData, EData> *> *const>(this)->size() - 1;};
00276   inline bool empty() const {return size() == 1;};
00277 };
00278 
00279 }
00280 }
00281 
00282 #endif

Generated on Wed Sep 10 11:25:14 2003 for X3DToolKit by doxygen1.3