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;};
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