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