00001 #ifndef MESH_SCENEGRAPHTYPES_H
00002 #define MESH_SCENEGRAPHTYPES_H
00003
00004 #include "Platform.h"
00005
00006 #include <vector>
00007 #include <map>
00008 #include <set>
00009 #include <list>
00010 #include <iostream>
00011
00012 namespace X3DTK {
00013 namespace MESH {
00014
00015 template<class A, class B>
00016 struct ConstMapIterator : public std::map<A, B>::const_iterator
00017 {
00018 typedef typename std::map<A, B>::const_iterator Base;
00019
00020 ConstMapIterator(const typename std::map<A, B>::const_iterator &it) : Base(it) {}
00021
00022
00023 const B &operator*() const
00024 {
00025 return (this->Base::operator*()).second;
00026 }
00027 };
00028
00029 template<class A, class B>
00030 struct NonConstMapIterator : public std::map<A, B>::iterator
00031 {
00032 typedef typename std::map<A, B>::iterator Base;
00033
00034 NonConstMapIterator(const typename std::map<A, B>::iterator &it) : Base(it) {}
00035
00036 B &operator*() const
00037 {
00038 return (this->Base::operator*()).second;
00039 }
00040 };
00041
00042 class X3DNode;
00043
00049 typedef X3DNode *SFNode;
00050
00057 typedef std::list<SFNode> MFNode;
00058
00059 template<class MData, class VData, class EData, class FData, bool RW> class SFTemplateVertex;
00060 template<class MData, class VData, class EData, class FData, bool RW> class SFTemplateEdge;
00061 template<class MData, class VData, class EData, class FData, bool RW> class SFTemplateFace;
00062
00068 template<class MData, class VData, class EData, class FData, bool RW>
00069 class EntityMFTemplateVertex : public std::list<SFTemplateVertex<MData, VData, EData, FData, RW> *>
00070 {
00071 public:
00072 typedef typename std::list<SFTemplateVertex<MData, VData, EData, FData, RW> *> Base;
00073
00075 EntityMFTemplateVertex();
00077 explicit EntityMFTemplateVertex(const std::vector<SFTemplateVertex<MData, VData, EData, FData, RW> *> &vector);
00078 };
00079
00080
00086 template<class MData, class VData, class EData, class FData, bool RW>
00087 class MeshMFTemplateVertex : public std::map<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *>
00088 {
00089 public:
00090 typedef typename std::map<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *> Base;
00091
00092 typedef NonConstMapIterator<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *> iterator;
00093 typedef ConstMapIterator<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *> const_iterator;
00094
00096 MeshMFTemplateVertex();
00098 explicit MeshMFTemplateVertex(const std::vector<SFTemplateVertex<MData, VData, EData, FData, RW> *> &vector);
00099
00101 SFTemplateVertex<MData, VData, EData, FData, RW> *const &operator[](const unsigned int &n) const
00102 {
00103 return (*Base::find(n)).second;
00104 }
00105
00107 typename std::map<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *>::iterator find(SFTemplateVertex<MData, VData, EData, FData, RW> *const &element)
00108 {
00109 typename Base::iterator it = Base::find(element->getIndex());
00110 if ((*it).second == element)
00111 return it;
00112 return end();
00113 }
00114
00116 typename std::map<unsigned int, SFTemplateVertex<MData, VData, EData, FData, RW> *>::const_iterator find(SFTemplateVertex<MData, VData, EData, FData, RW> *const &element) const
00117 {
00118 typename Base::const_iterator it = Base::find(element->getIndex());
00119 if ((*it).second == element)
00120 return it;
00121 return end();
00122 }
00123 };
00124
00125
00131 template<class MData, class VData, class EData, class FData, bool RW>
00132 class EntityMFTemplateEdge : public std::list<SFTemplateEdge<MData, VData, EData, FData, RW> *>
00133 {
00134 public:
00135 typedef typename std::list<SFTemplateEdge<MData, VData, EData, FData, RW> *> Base;
00136
00138 EntityMFTemplateEdge();
00140 explicit EntityMFTemplateEdge(const std::vector<SFTemplateEdge<MData, VData, EData, FData, RW> *> &vector, bool ccw);
00141 };
00142
00143
00149 template<class MData, class VData, class EData, class FData, bool RW>
00150 class MeshMFTemplateEdge : public std::set<SFTemplateEdge<MData, VData, EData, FData, RW> *>
00151 {
00152 public:
00153 typedef typename std::set<SFTemplateEdge<MData, VData, EData, FData, RW> *> Base;
00154
00156 MeshMFTemplateEdge();
00158 explicit MeshMFTemplateEdge(const std::vector<SFTemplateEdge<MData, VData, EData, FData, RW> *> &vector, bool ccw);
00159
00161 SFTemplateEdge<MData, VData, EData, FData, RW> *const &operator[](const unsigned int &n) const
00162 {
00163 typename Base::const_iterator it = begin();
00164 for (unsigned int i = 0; i < n; ++i)
00165 ++it;
00166 return *it;
00167 }
00168 };
00169
00170
00176 template<class MData, class VData, class EData, class FData, bool RW>
00177 class EntityMFTemplateFace : public std::list<SFTemplateFace<MData, VData, EData, FData, RW> *>
00178 {
00179 public:
00180 typedef typename std::list<SFTemplateFace<MData, VData, EData, FData, RW> *> Base;
00181
00183 EntityMFTemplateFace();
00185 explicit EntityMFTemplateFace(const std::vector<SFTemplateFace<MData, VData, EData, FData, RW> *> &vector);
00186 };
00187
00188
00194 template<class MData, class VData, class EData, class FData, bool RW>
00195 class MeshMFTemplateFace : public std::map<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *>
00196 {
00197 public:
00198 typedef typename std::map<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *> Base;
00199
00200 typedef NonConstMapIterator<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *> iterator;
00201 typedef ConstMapIterator<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *> const_iterator;
00202
00204 MeshMFTemplateFace();
00206 explicit MeshMFTemplateFace(const std::vector<SFTemplateFace<MData, VData, EData, FData, RW> *> &vector);
00207
00209 SFTemplateFace<MData, VData, EData, FData, RW> * const &operator[](const unsigned int &n) const
00210 {
00211 return (*Base::find(n)).second;
00212 }
00213
00215 typename std::map<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *>::iterator find(SFTemplateFace<MData, VData, EData, FData, RW> *const &element)
00216 {
00217 typename Base::iterator it = Base::find(element->getIndex());
00218 if ((*it).second == element)
00219 return it;
00220 return end();
00221 }
00223 typename std::map<unsigned int, SFTemplateFace<MData, VData, EData, FData, RW> *>::const_iterator find(SFTemplateFace<MData, VData, EData, FData, RW> *const &element) const
00224 {
00225 typename Base::const_iterator it = Base::find(element->getIndex());
00226 if ((*it).second == element)
00227 return it;
00228 return end();
00229 }
00230 };
00231
00233
00234 #ifdef TEMPLATE_SPECIALIZATION_SUPPORTED
00235
00236 template<class MData, class VData, class EData, class FData>
00237 class EntityMFTemplateVertex<MData, VData, EData, FData, false> : public std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *>
00238 {
00239 public:
00240 typedef typename std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *> Base;
00241
00243 EntityMFTemplateVertex();
00245 explicit EntityMFTemplateVertex(const std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *> &vector);
00246 };
00247
00248 template<class MData, class VData, class EData, class FData>
00249 class MeshMFTemplateVertex<MData, VData, EData, FData, false> : public std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *>
00250 {
00251 public:
00252 typedef typename std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *> Base;
00253
00255 MeshMFTemplateVertex();
00257 explicit MeshMFTemplateVertex(const std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *> &vector);
00258
00260 std::pair<typename std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *>::iterator, bool> insert(const std::pair<unsigned int, SFTemplateVertex<MData, VData, EData, FData, false> *> &x)
00261 {
00262 if (x.first >= size())
00263 resize(x.first + 1, 0);
00264
00265 typename Base::iterator it = begin();
00266 it += x.first;
00267 *it = x.second;
00268
00269 return std::pair<typename Base::iterator, bool>(it, true);
00270 }
00271
00273 typename std::vector<SFTemplateVertex<MData, VData, EData, FData, false> *>::iterator find(SFTemplateVertex<MData, VData, EData, FData, false> *const &element) const
00274 {
00275 return std::find(begin(), end(), element);
00276 }
00277
00278 };
00279
00280 template<class MData, class VData, class EData, class FData>
00281 class EntityMFTemplateEdge<MData, VData, EData, FData, false> : public std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *>
00282 {
00283 public:
00284 typedef typename std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *> Base;
00285
00287 EntityMFTemplateEdge();
00289 explicit EntityMFTemplateEdge(const std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *> &vector, bool ccw);
00290 };
00291
00292 template<class MData, class VData, class EData, class FData>
00293 class MeshMFTemplateEdge<MData, VData, EData, FData, false> : public std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *>
00294 {
00295 public:
00296 typedef std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *> Base;
00297
00299 MeshMFTemplateEdge();
00301 explicit MeshMFTemplateEdge(const std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *> &vector, bool ccw);
00302
00304 std::pair<typename std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *>::iterator, bool> insert(const typename std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *>::value_type &x)
00305 {
00306 push_back(x);
00307 return std::pair<typename Base::iterator, bool>(end(), true);
00308 }
00309
00311 typename std::vector<SFTemplateEdge<MData, VData, EData, FData, false> *>::iterator find(SFTemplateEdge<MData, VData, EData, FData, false> *const &element) const
00312 {
00313 return std::find(begin(), end(), element);
00314 }
00315 };
00316
00317 template<class MData, class VData, class EData, class FData>
00318 class EntityMFTemplateFace<MData, VData, EData, FData, false> : public std::vector<SFTemplateFace<MData, VData, EData, FData, false> *>
00319 {
00320 public:
00321 typedef typename std::vector<SFTemplateFace<MData, VData, EData, FData, false> *> Base;
00322
00324 EntityMFTemplateFace();
00326 explicit EntityMFTemplateFace(const std::vector<SFTemplateFace<MData, VData, EData, FData, false> *> &vector);
00327 };
00328
00329 template<class MData, class VData, class EData, class FData>
00330 class MeshMFTemplateFace<MData, VData, EData, FData, false> : public std::vector<SFTemplateFace<MData, VData, EData, FData, false> *>
00331 {
00332 public:
00333 typedef std::vector<SFTemplateFace<MData, VData, EData, FData, false> *> Base;
00334
00336 MeshMFTemplateFace();
00338 explicit MeshMFTemplateFace(const std::vector<SFTemplateFace<MData, VData, EData, FData, false> *> &vector);
00339
00341 std::pair<typename Base::iterator, bool> insert(const std::pair<unsigned int, SFTemplateFace<MData, VData, EData, FData, false> *> &x)
00342 {
00343 if (x.first >= size())
00344 resize(x.first + 1, 0);
00345
00346 typename Base::iterator it = begin();
00347 it += x.first;
00348 *it = x.second;
00349
00350 return std::pair<typename Base::iterator, bool>(it, true);
00351 }
00352
00354 typename std::vector<SFTemplateFace<MData, VData, EData, FData, false> *>::iterator find(SFTemplateFace<MData, VData, EData, FData, false> *const &element)
00355 {
00356 return std::find(begin(), end(), element);
00357 }
00359 typename std::vector<SFTemplateFace<MData, VData, EData, FData, false> *>::const_iterator find(SFTemplateFace<MData, VData, EData, FData, false> *const &element) const
00360 {
00361 return std::find(begin(), end(), element);
00362 }
00363 };
00364
00365 #endif
00366
00367 }
00368 }
00369
00370 #include "MESH_SceneGraphTypes.inl"
00371
00372 #endif