Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

MESH_SceneGraphTypes.h

Go to the documentation of this file.
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 //  ConstMapIterator(const typename std::map<A, B>::iterator &it) : std::map<A, B>::const_iterator(it) {}
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

Generated on Thu Jun 3 10:12:09 2004 for X3DToolKit by doxygen 1.3.6