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 //                            MeshTypes.h                                     //
00004 
00005 #ifndef MESHTYPES_H
00006 #define MESHTYPES_H
00007 
00008 #include <vector>
00009 #include <list>
00010 #include <iostream>
00011 
00012 namespace X3DTK {
00013 namespace Mesh {
00014 
00015 class X3DNode;
00016 typedef X3DNode *SFNode;
00017 typedef std::list<SFNode> MFNode;
00018 
00019 template<class A, class B, class C> class TemplateVertex;
00020 template<class A, class B, class C> class TemplateEdge;
00021 template<class A, class B, class C> class TemplateFace;
00022 
00025 
00026 template<class T>
00027 class Object_Iterator
00028 {
00029 public:
00031   Object_Iterator(): _pointer(0) {};
00033   explicit Object_Iterator(T *pointer): _pointer(pointer) {};
00034   
00036   inline T &operator*() {return static_cast<T &>(*_pointer);};
00038   inline const T &operator*() const {return static_cast<T &>(*_pointer);};
00040   T *operator->() const {return _pointer;};
00041   
00043   Object_Iterator<T> &operator++() 
00044   {
00045     _pointer += 1;
00046     while (*_pointer == 0)
00047       _pointer += 1;
00048       
00049     return *this;
00050   };
00052   Object_Iterator<T> &operator++(int) 
00053   {
00054     Object_Iterator<T> &tmp = *this;
00055     
00056     _pointer += 1;
00057     while (*_pointer == 0)
00058       _pointer += 1;
00059       
00060     return *tmp;
00061   };
00063   Object_Iterator<T> &operator--() 
00064   {
00065     _pointer -= 1;
00066     while (*_pointer == 0)
00067       _pointer -= 1;
00068       
00069     return *this;
00070   };
00072   Object_Iterator<T> &operator--(int) 
00073   {
00074     Object_Iterator<T> &tmp = *this;
00075     
00076     _pointer -= 1;
00077     while (*_pointer == 0)
00078       _pointer -= 1;
00079       
00080     return *tmp;
00081   };
00082     
00083 protected:
00085   T *_pointer;  
00086 };
00087 
00088 template<class T>
00089 inline bool operator==(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00090 {
00091   return x._pointer == y._pointer;
00092 };
00093 
00094 template<class T>
00095 inline bool operator!=(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00096 {
00097   return x._pointer != y._pointer;
00098 };
00099 
00101 
00102 template<class T>
00103 class Const_Object_Iterator : public Object_Iterator<const T>
00104 {
00105 public:
00107   Const_Object_Iterator() : Object_Iterator<const T>() {};
00109   explicit Const_Object_Iterator(const T *pointer): Object_Iterator<const T>(pointer) {};
00110 };
00111 
00113 
00114 template<class T>
00115 class Non_Const_Object_Iterator : public Object_Iterator<T>
00116 {
00117 public:
00119   Non_Const_Object_Iterator() : Object_Iterator<T>() {};
00121   explicit Non_Const_Object_Iterator(T *pointer): Object_Iterator<T>(pointer) {};
00122 
00124   inline operator Const_Object_Iterator<T>() const 
00125   {
00126     return Const_Object_Iterator<T>(_pointer);
00127   };
00128 };
00129 
00130 #ifndef DOXYGEN
00131 
00132 template<class T>
00133 struct MBase
00134 {
00135   typedef Non_Const_Object_Iterator<T> iterator;
00136   typedef Const_Object_Iterator<T> const_iterator;
00137 };
00138 
00139 #endif
00140 
00142 
00143 template<class VData, class EData, class FData>
00144 class MTemplateVertex : public std::vector<TemplateVertex<VData, EData, FData> *>, public MBase<TemplateVertex<VData, EData, FData> *>
00145 {
00146 public:
00148   MTemplateVertex() : std::vector<TemplateVertex<VData, EData, FData> *>(1, (TemplateVertex<VData, EData, FData> *)(0x1)) {};
00150   explicit MTemplateVertex(const std::vector<TemplateVertex<VData, EData, FData> *> &vector)
00151   : std::vector<TemplateVertex<VData, EData, FData> *>(vector)
00152   {
00153     push_back((TemplateVertex<VData, EData, FData> *)(0x1));
00154   }; 
00155   
00157   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::iterator iterator;
00159   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::const_iterator const_iterator;
00160   
00162   inline iterator begin() {return iterator(&front());};
00164   inline iterator end() {return iterator(&back());};
00165 
00167   inline const_iterator begin() const {return const_iterator(&front());};
00169   inline const_iterator end() const {return const_iterator(&back());};
00170   
00172   inline unsigned int size() const {return static_cast<const std::vector<TemplateVertex<VData, EData, FData> *> *const>(this)->size() - 1;};
00174   inline bool empty() const {return size() == 1;};
00175 };
00176 
00178 
00179 template<class EData, class FData, class VData>
00180 class MTemplateEdge : public std::vector<TemplateEdge<EData, FData, VData> *>, public MBase<TemplateEdge<EData, FData, VData> *>
00181 {
00182 public:
00184   MTemplateEdge() : std::vector<TemplateEdge<EData, FData, VData> *>(1, (TemplateEdge<EData, FData, VData> *)(0x1)) {};
00186   explicit MTemplateEdge(const std::vector<TemplateEdge<EData, FData, VData> *> &vector, bool ccw)
00187   : std::vector<TemplateEdge<EData, FData, VData> *>(vector)
00188   {
00189     if (!ccw)
00190     {
00191       unsigned int last = vector.size() - 1;
00192       unsigned int mid = (last + 1)/2;
00193       for (unsigned int i = 0; i < mid; ++i)
00194       {
00195         TemplateEdge<EData, FData, VData> *temp = (*this)[i];
00196         (*this)[i] = (*this)[last - i];
00197         (*this)[last - i] = temp;
00198       }
00199     }  
00200          
00201     push_back((TemplateEdge<EData, FData, VData> *)(0x1));
00202   };
00204   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::iterator iterator;
00206   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::const_iterator const_iterator;
00207   
00209   inline iterator begin() {return iterator(&front());};
00211   inline iterator end() {return iterator(&back());};
00212 
00214   inline const_iterator begin() const {return const_iterator(&front());};
00216   inline const_iterator end() const {return const_iterator(&back());};
00217 
00219   inline unsigned int size() const {return static_cast<const std::vector<TemplateEdge<EData, FData, VData> *> *const>(this)->size() - 1;};
00221   inline bool empty() const {return size() == 1;};
00222 };
00223 
00225 
00226 template<class FData, class VData, class EData>
00227 class MTemplateFace : public std::vector<TemplateFace<FData, VData, EData> *>, public MBase<TemplateFace<FData, VData, EData> *>
00228 {
00229 public:
00231   MTemplateFace() : std::vector<TemplateFace<FData, VData, EData> *>(1, (TemplateFace<FData, VData, EData> *)(0x1)) {};
00233   explicit MTemplateFace(const std::vector<TemplateFace<FData, VData, EData> *> &vector)
00234   : std::vector<TemplateFace<FData, VData, EData> *>(vector)
00235   {
00236     push_back((TemplateFace<FData, VData, EData> *)(0x1));
00237   };
00239   typedef typename MBase<TemplateFace<FData, VData, EData> *>::iterator iterator;
00241   typedef typename MBase<TemplateFace<FData, VData, EData> *>::const_iterator const_iterator;    
00242   
00244   inline iterator begin() {return iterator(&front());};
00246   inline iterator end() {return iterator(&back());};
00247 
00249   inline const_iterator begin() const {return const_iterator(&front());};
00251   inline const_iterator end() const {return const_iterator(&back());};
00252 
00254   inline unsigned int size() const {return static_cast<const std::vector<TemplateFace<FData, VData, EData> *> *const>(this)->size() - 1;};
00256   inline bool empty() const {return size() == 1;};
00257 };
00258 
00259 }
00260 }
00261 
00262 #endif

Generated on Thu Sep 18 15:08:47 2003 for X3DToolKit by doxygen1.3