00001
00002
00003
00005
00006
00011
00016
00021
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