00001
00002
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