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;};
00042   Object_Iterator<T> &operator++() 
00043   {
00044     _pointer += 1;
00045     while (*_pointer == 0)
00046       _pointer += 1;
00047       
00048     return *this;
00049   };
00051   Object_Iterator<T> &operator++(int) 
00052   {
00053     Object_Iterator<T> &tmp = *this;
00054     
00055     _pointer += 1;
00056     while (*_pointer == 0)
00057       _pointer += 1;
00058       
00059     return *tmp;
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   };
00081   
00082   friend bool operator==<>(const Object_Iterator<T> &x, const Object_Iterator<T> &y);
00083   friend bool operator!=<>(const Object_Iterator<T> &x, const Object_Iterator<T> &y);
00084   
00085 protected:
00087   T *_pointer;  
00088 };
00089 
00090 template<class T>
00091 inline bool operator==(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00092 {
00093   return x._pointer == y._pointer;
00094 };
00095 
00096 template<class T>
00097 inline bool operator!=(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00098 {
00099   return x._pointer != y._pointer;
00100 };
00101 
00103 
00104 template<class T>
00105 class Const_Object_Iterator : public Object_Iterator<const T>
00106 {
00107 public:
00109   Const_Object_Iterator() : Object_Iterator<const T>() {};
00111   explicit Const_Object_Iterator(const T *pointer): Object_Iterator<const T>(pointer) {};
00112 };
00113 
00115 
00116 template<class T>
00117 class Non_Const_Object_Iterator : public Object_Iterator<T>
00118 {
00119 public:
00121   Non_Const_Object_Iterator() : Object_Iterator<T>() {};
00123   explicit Non_Const_Object_Iterator(T *pointer): Object_Iterator<T>(pointer) {};
00124 
00126   inline operator Const_Object_Iterator<T>() const 
00127   {
00128     return Const_Object_Iterator<T>(_pointer);
00129   };
00130 };
00131 
00132 #ifndef DOXYGEN
00133 
00134 template<class T>
00135 struct MBase
00136 {
00137   typedef Non_Const_Object_Iterator<T> iterator;
00138   typedef Const_Object_Iterator<T> const_iterator;
00139 };
00140 
00141 #endif
00142 
00144 
00145 template<class VData, class EData, class FData>
00146 class MTemplateVertex : public std::vector<TemplateVertex<VData, EData, FData> *>, public MBase<TemplateVertex<VData, EData, FData> *>
00147 {
00148 public:
00150   MTemplateVertex() : std::vector<TemplateVertex<VData, EData, FData> *>(1, (TemplateVertex<VData, EData, FData> *)(0x1)) {};
00152   explicit MTemplateVertex(const std::vector<TemplateVertex<VData, EData, FData> *> &vector)
00153   : std::vector<TemplateVertex<VData, EData, FData> *>(vector)
00154   {
00155     push_back((TemplateVertex<VData, EData, FData> *)(0x1));
00156   }; 
00157   
00159   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::iterator iterator;
00161   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::const_iterator const_iterator;
00162   
00164   inline iterator begin() {return iterator(&front());};
00166   inline iterator end() {return iterator(&back());};
00167 
00169   inline const_iterator begin() const {return const_iterator(&front());};
00171   inline const_iterator end() const {return const_iterator(&back());};
00172   
00174   inline unsigned int size() const {return static_cast<const std::vector<TemplateVertex<VData, EData, FData> *> *const>(this)->size() - 1;};
00176   inline bool empty() const {return size() == 1;};
00177 };
00178 
00180 
00181 template<class EData, class FData, class VData>
00182 class MTemplateEdge : public std::vector<TemplateEdge<EData, FData, VData> *>, public MBase<TemplateEdge<EData, FData, VData> *>
00183 {
00184 public:
00186   MTemplateEdge() : std::vector<TemplateEdge<EData, FData, VData> *>(1, (TemplateEdge<EData, FData, VData> *)(0x1)) {};
00188   explicit MTemplateEdge(const std::vector<TemplateEdge<EData, FData, VData> *> &vector, bool ccw)
00189   : std::vector<TemplateEdge<EData, FData, VData> *>(vector)
00190   {
00191     if (!ccw)
00192     {
00193       unsigned int last = vector.size() - 1;
00194       unsigned int mid = (last + 1)/2;
00195       for (unsigned int i = 0; i < mid; ++i)
00196       {
00197         TemplateEdge<EData, FData, VData> *temp = (*this)[i];
00198         (*this)[i] = (*this)[last - i];
00199         (*this)[last - i] = temp;
00200       }
00201     }  
00202          
00203     push_back((TemplateEdge<EData, FData, VData> *)(0x1));
00204   };
00206   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::iterator iterator;
00208   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::const_iterator const_iterator;
00209   
00211   inline iterator begin() {return iterator(&front());};
00213   inline iterator end() {return iterator(&back());};
00214 
00216   inline const_iterator begin() const {return const_iterator(&front());};
00218   inline const_iterator end() const {return const_iterator(&back());};
00219 
00221   inline unsigned int size() const {return static_cast<const std::vector<TemplateEdge<EData, FData, VData> *> *const>(this)->size() - 1;};
00223   inline bool empty() const {return size() == 1;};
00224 };
00225 
00227 
00228 template<class FData, class VData, class EData>
00229 class MTemplateFace : public std::vector<TemplateFace<FData, VData, EData> *>, public MBase<TemplateFace<FData, VData, EData> *>
00230 {
00231 public:
00233   MTemplateFace() : std::vector<TemplateFace<FData, VData, EData> *>(1, (TemplateFace<FData, VData, EData> *)(0x1)) {};
00235   explicit MTemplateFace(const std::vector<TemplateFace<FData, VData, EData> *> &vector)
00236   : std::vector<TemplateFace<FData, VData, EData> *>(vector)
00237   {
00238     push_back((TemplateFace<FData, VData, EData> *)(0x1));
00239   };
00241   typedef typename MBase<TemplateFace<FData, VData, EData> *>::iterator iterator;
00243   typedef typename MBase<TemplateFace<FData, VData, EData> *>::const_iterator const_iterator;    
00244   
00246   inline iterator begin() {return iterator(&front());};
00248   inline iterator end() {return iterator(&back());};
00249 
00251   inline const_iterator begin() const {return const_iterator(&front());};
00253   inline const_iterator end() const {return const_iterator(&back());};
00254 
00256   inline unsigned int size() const {return static_cast<const std::vector<TemplateFace<FData, VData, EData> *> *const>(this)->size() - 1;};
00258   inline bool empty() const {return size() == 1;};
00259 };
00260 
00261 }
00262 }
00263 
00264 #endif

Generated on Tue Jul 15 16:46:52 2003 for X3DToolKit by doxygen1.3