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

MeshSceneGraphTypes.h

Go to the documentation of this file.
00001 
00002 //                            MeshTypes.h                                     //
00004 
00005 #ifndef MESHSCENEGRAPHTYPES_H
00006 #define MESHSCENEGRAPHTYPES_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   friend bool operator==<>(const Object_Iterator<T> &x, const Object_Iterator<T> &y);
00030   friend bool operator!=<>(const Object_Iterator<T> &x, const Object_Iterator<T> &y);
00031   
00032 public:
00034   Object_Iterator(): _pointer(0) {};
00036   explicit Object_Iterator(T *pointer): _pointer(pointer) {};
00037   
00039   inline T &operator*() {return static_cast<T &>(*_pointer);};
00041   inline const T &operator*() const {return static_cast<T &>(*_pointer);};
00043   T *operator->() const {return _pointer;};
00044   
00046   Object_Iterator<T> &operator++() 
00047   {
00048     _pointer += 1;
00049     while (*_pointer == 0)
00050       _pointer += 1;
00051       
00052     return *this;
00053   };
00055   Object_Iterator<T> &operator++(int) 
00056   {
00057     Object_Iterator<T> &tmp = *this;
00058     
00059     _pointer += 1;
00060     while (*_pointer == 0)
00061       _pointer += 1;
00062       
00063     return *tmp;
00064   };
00066   Object_Iterator<T> &operator--() 
00067   {
00068     _pointer -= 1;
00069     while (*_pointer == 0)
00070       _pointer -= 1;
00071       
00072     return *this;
00073   };
00075   Object_Iterator<T> &operator--(int) 
00076   {
00077     Object_Iterator<T> &tmp = *this;
00078     
00079     _pointer -= 1;
00080     while (*_pointer == 0)
00081       _pointer -= 1;
00082       
00083     return *tmp;
00084   };
00085     
00086 protected:
00088   T *_pointer;  
00089 };
00090 
00091 template<class T>
00092 inline bool operator==(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00093 {
00094   return x._pointer == y._pointer;
00095 };
00096 
00097 template<class T>
00098 inline bool operator!=(const Object_Iterator<T> &x, const Object_Iterator<T> &y)
00099 {
00100   return x._pointer != y._pointer;
00101 };
00102 
00104 
00105 template<class T>
00106 class Const_Object_Iterator : public Object_Iterator<const T>
00107 {
00108 public:
00110   Const_Object_Iterator() : Object_Iterator<const T>() {};
00112   explicit Const_Object_Iterator(const T *pointer): Object_Iterator<const T>(pointer) {};
00113 };
00114 
00116 
00117 template<class T>
00118 class Non_Const_Object_Iterator : public Object_Iterator<T>
00119 {
00120 public:
00122   Non_Const_Object_Iterator() : Object_Iterator<T>() {};
00124   explicit Non_Const_Object_Iterator(T *pointer): Object_Iterator<T>(pointer) {};
00125 
00127   inline operator Const_Object_Iterator<T>() const 
00128   {
00129     return Const_Object_Iterator<T>(_pointer);
00130   };
00131 };
00132 
00133 #ifndef DOXYGEN
00134 
00135 template<class T>
00136 struct MBase
00137 {
00138   typedef Non_Const_Object_Iterator<T> iterator;
00139   typedef Const_Object_Iterator<T> const_iterator;
00140 };
00141 
00142 #endif
00143 
00145 
00146 template<class VData, class EData, class FData>
00147 class MTemplateVertex : public std::vector<TemplateVertex<VData, EData, FData> *>, public MBase<TemplateVertex<VData, EData, FData> *>
00148 {
00149 public:
00151   MTemplateVertex() : std::vector<TemplateVertex<VData, EData, FData> *>(1, (TemplateVertex<VData, EData, FData> *)(0x1)) {};
00153   explicit MTemplateVertex(const std::vector<TemplateVertex<VData, EData, FData> *> &vector)
00154   : std::vector<TemplateVertex<VData, EData, FData> *>(vector)
00155   {
00156     push_back((TemplateVertex<VData, EData, FData> *)(0x1));
00157   }; 
00158   
00160   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::iterator iterator;
00162   typedef typename MBase<TemplateVertex<VData, EData, FData> *>::const_iterator const_iterator;
00163   
00165   inline iterator begin() {return iterator(&front());};
00167   inline iterator end() {return iterator(&back());};
00168 
00170   inline const_iterator begin() const {return const_iterator(&front());};
00172   inline const_iterator end() const {return const_iterator(&back());};
00173   
00175   inline unsigned int size() const {return static_cast<const std::vector<TemplateVertex<VData, EData, FData> *> *const>(this)->size() - 1;};
00177   inline bool empty() const {return size() == 1;};
00178 };
00179 
00181 
00182 template<class EData, class FData, class VData>
00183 class MTemplateEdge : public std::vector<TemplateEdge<EData, FData, VData> *>, public MBase<TemplateEdge<EData, FData, VData> *>
00184 {
00185 public:
00187   MTemplateEdge() : std::vector<TemplateEdge<EData, FData, VData> *>(1, (TemplateEdge<EData, FData, VData> *)(0x1)) {};
00189   explicit MTemplateEdge(const std::vector<TemplateEdge<EData, FData, VData> *> &vector, bool ccw)
00190   : std::vector<TemplateEdge<EData, FData, VData> *>(vector)
00191   {
00192     if (!ccw)
00193     {
00194       unsigned int last = vector.size() - 1;
00195       unsigned int mid = (last + 1)/2;
00196       for (unsigned int i = 0; i < mid; ++i)
00197       {
00198         TemplateEdge<EData, FData, VData> *temp = (*this)[i];
00199         (*this)[i] = (*this)[last - i];
00200         (*this)[last - i] = temp;
00201       }
00202     }  
00203          
00204     push_back((TemplateEdge<EData, FData, VData> *)(0x1));
00205   };
00207   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::iterator iterator;
00209   typedef typename MBase<TemplateEdge<EData, FData, VData> *>::const_iterator const_iterator;
00210   
00212   inline iterator begin() {return iterator(&front());};
00214   inline iterator end() {return iterator(&back());};
00215 
00217   inline const_iterator begin() const {return const_iterator(&front());};
00219   inline const_iterator end() const {return const_iterator(&back());};
00220 
00222   inline unsigned int size() const {return static_cast<const std::vector<TemplateEdge<EData, FData, VData> *> *const>(this)->size() - 1;};
00224   inline bool empty() const {return size() == 1;};
00225 };
00226 
00228 
00229 template<class FData, class VData, class EData>
00230 class MTemplateFace : public std::vector<TemplateFace<FData, VData, EData> *>, public MBase<TemplateFace<FData, VData, EData> *>
00231 {
00232 public:
00234   MTemplateFace() : std::vector<TemplateFace<FData, VData, EData> *>(1, (TemplateFace<FData, VData, EData> *)(0x1)) {};
00236   explicit MTemplateFace(const std::vector<TemplateFace<FData, VData, EData> *> &vector)
00237   : std::vector<TemplateFace<FData, VData, EData> *>(vector)
00238   {
00239     push_back((TemplateFace<FData, VData, EData> *)(0x1));
00240   };
00242   typedef typename MBase<TemplateFace<FData, VData, EData> *>::iterator iterator;
00244   typedef typename MBase<TemplateFace<FData, VData, EData> *>::const_iterator const_iterator;    
00245   
00247   inline iterator begin() {return iterator(&front());};
00249   inline iterator end() {return iterator(&back());};
00250 
00252   inline const_iterator begin() const {return const_iterator(&front());};
00254   inline const_iterator end() const {return const_iterator(&back());};
00255 
00257   inline unsigned int size() const {return static_cast<const std::vector<TemplateFace<FData, VData, EData> *> *const>(this)->size() - 1;};
00259   inline bool empty() const {return size() == 1;};
00260 };
00261 
00262 }
00263 }
00264 
00265 #endif

Generated on Thu Oct 9 13:50:54 2003 for X3DToolKit by doxygen1.2.18