Main Page | Modules | Namespace List | Class Hierarchy | Compound List | File List | Namespace Members | Compound 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   ConstMapIterator(const typename std::map<A, B>::const_iterator &it) : std::map<A, B>::const_iterator(it) {}
00019   
00020   const B &operator*() const 
00021   {
00022     return (this->std::map<A, B>::const_iterator::operator*()).second;
00023   }  
00024 };
00025 
00026 template<class A, class B>
00027 struct NonConstMapIterator : public std::map<A, B>::iterator
00028 {
00029   NonConstMapIterator(const typename std::map<A, B>::iterator &it) : std::map<A, B>::iterator(it) {}
00030   
00031   B &operator*() const 
00032   {
00033     return (this->std::map<A, B>::iterator::operator*()).second;
00034   }  
00035 };
00036 
00037 class X3DNode;
00038 
00044 typedef X3DNode *SFNode;
00045 
00052 typedef std::list<SFNode> MFNode;
00053 
00054 template<class VData, class EData, class FData, bool readOnly> class SFVertex;
00055 template<class EData, class FData, class VData, bool readOnly> class SFEdge;
00056 template<class FData, class VData, class EData, bool readOnly> class SFFace;
00057 
00063 template<class VData, class EData, class FData, bool readOnly = true>
00064 class EntityMFVertex : public std::vector<SFVertex<VData, EData, FData, readOnly> *>
00065 {
00066 public:
00068   EntityMFVertex();
00070   explicit EntityMFVertex(const std::vector<SFVertex<VData, EData, FData, readOnly> *> &vector);
00071 };
00072 
00073 template<class VData, class EData, class FData>
00074 class EntityMFVertex<VData, EData, FData, false> : public std::list<SFVertex<VData, EData, FData, false> *>
00075 {
00076 public:
00078   EntityMFVertex();
00080   explicit EntityMFVertex(const std::vector<SFVertex<VData, EData, FData, false> *> &vector);
00081 };
00082 
00088 template<class VData, class EData, class FData, bool readOnly = true>
00089 class MeshMFVertex : public std::vector<SFVertex<VData, EData, FData, readOnly> *>
00090 {
00091 public:
00093   MeshMFVertex();
00095   explicit MeshMFVertex(const std::vector<SFVertex<VData, EData, FData, readOnly> *> &vector);
00096 
00098   std::pair<typename std::vector<SFVertex<VData, EData, FData, readOnly> *>::iterator, bool> insert(const std::pair<unsigned int, SFVertex<VData, EData, FData, readOnly> *> &x)
00099   {
00100     if (x.first >= size())
00101       resize(x.first + 1, 0);
00102   
00103     typename std::vector<SFVertex<VData, EData, FData, readOnly> *>::iterator it = begin();
00104     it += x.first;
00105     *it = x.second;
00106     
00107     return std::pair<typename std::vector<SFVertex<VData, EData, FData, readOnly> *>::iterator, bool>(it, true);
00108   }
00109 
00111   typename std::vector<SFVertex<VData, EData, FData, readOnly> *>::iterator find(SFVertex<VData, EData, FData, readOnly> *const &element) const
00112   {
00113     return std::find(begin(), end(), element);
00114   }
00115 
00116 };
00117 
00118 template<class VData, class EData, class FData>
00119 class MeshMFVertex<VData, EData, FData, false> : public std::map<unsigned int, SFVertex<VData, EData, FData, false> *>
00120 {
00121 public:
00122   typedef NonConstMapIterator<unsigned int, SFVertex<VData, EData, FData, false> *> iterator;
00123   typedef ConstMapIterator<unsigned int, SFVertex<VData, EData, FData, false> *> const_iterator;
00124 
00126   MeshMFVertex();
00128   explicit MeshMFVertex(const std::vector<SFVertex<VData, EData, FData, false> *> &vector);
00129   
00131   SFVertex<VData, EData, FData, false> *const &operator[](const unsigned int &n) const 
00132   {
00133     return (*std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::find(n)).second;
00134   }
00135   
00137   typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::iterator find(SFVertex<VData, EData, FData, false> *const &element)
00138   {
00139     typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::iterator it = std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::find(element->getIndex());
00140     if ((*it).second == element)
00141       return it;
00142     return end();  
00143   }
00144   
00146   typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::const_iterator find(SFVertex<VData, EData, FData, false> *const &element) const
00147   {
00148     typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::const_iterator it = std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::find(element->getIndex());
00149     if ((*it).second == element)
00150       return it;
00151     return end();  
00152   }
00153 };
00154 
00155 
00161 template<class EData, class FData, class VData, bool readOnly = true>
00162 class EntityMFEdge : public std::vector<SFEdge<EData, FData, VData, readOnly> *>
00163 {
00164 public:
00166   EntityMFEdge();
00168   explicit EntityMFEdge(const std::vector<SFEdge<EData, FData, VData, readOnly> *> &vector, bool ccw);
00169 };
00170 
00171 template<class EData, class FData, class VData>
00172 class EntityMFEdge<EData, FData, VData, false> : public std::list<SFEdge<EData, FData, VData, false> *>
00173 {
00174 public:
00176   EntityMFEdge();
00178   explicit EntityMFEdge(const std::vector<SFEdge<EData, FData, VData, false> *> &vector, bool ccw);
00179 };
00180 
00186 template<class EData, class FData, class VData, bool readOnly = true>
00187 class MeshMFEdge : public std::vector<SFEdge<EData, FData, VData, readOnly> *>
00188 {
00189 public:
00191   MeshMFEdge();
00193   explicit MeshMFEdge(const std::vector<SFEdge<EData, FData, VData, readOnly> *> &vector, bool ccw);
00194 
00196   std::pair<typename std::vector<SFEdge<EData, FData, VData, readOnly> *>::iterator, bool> insert(const typename std::vector<SFEdge<EData, FData, VData, readOnly> *>::value_type &x)
00197   {
00198     push_back(x);
00199     return std::pair<typename std::vector<SFEdge<EData, FData, VData, readOnly> *>::iterator, bool>(end(), true);
00200   }
00201 
00203   typename std::vector<SFEdge<EData, FData, VData, readOnly> *>::iterator find(SFEdge<EData, FData, VData, readOnly> *const &element) const
00204   {
00205     return std::find(begin(), end(), element);
00206   }
00207 };
00208 
00209 template<class EData, class FData, class VData>
00210 class MeshMFEdge<EData, FData, VData, false> : public std::set<SFEdge<EData, FData, VData, false> *>
00211 {
00212 public:
00214   MeshMFEdge();
00216   explicit MeshMFEdge(const std::vector<SFEdge<EData, FData, VData, false> *> &vector, bool ccw);
00217 
00219   SFEdge<EData, FData, VData, false> *const &operator[](const unsigned int &n) const
00220   {
00221     typename std::set<SFEdge<EData, FData, VData, false> *>::const_iterator it = begin();
00222     for (unsigned int i = 0; i < n; ++i)
00223       ++it;
00224     return *it;  
00225   }
00226 };
00227 
00233 template<class FData, class VData, class EData, bool readOnly = true>
00234 class EntityMFFace : public std::vector<SFFace<FData, VData, EData, readOnly> *>
00235 {
00236 public:
00238   EntityMFFace();
00240   explicit EntityMFFace(const std::vector<SFFace<FData, VData, EData, readOnly> *> &vector);
00241 };
00242 
00243 template<class FData, class VData, class EData>
00244 class EntityMFFace<FData, VData, EData, false> : public std::list<SFFace<FData, VData, EData, false> *>
00245 {
00246 public:
00248   EntityMFFace();
00250   explicit EntityMFFace(const std::vector<SFFace<FData, VData, EData, false> *> &vector);
00251 };
00252 
00258 template<class FData, class VData, class EData, bool readOnly = true>
00259 class MeshMFFace : public std::vector<SFFace<FData, VData, EData, readOnly> *>
00260 {
00261 public:
00263   MeshMFFace();
00265   explicit MeshMFFace(const std::vector<SFFace<FData, VData, EData, readOnly> *> &vector);
00266 
00268   std::pair<typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator, bool> insert(const std::pair<unsigned int, SFFace<FData, VData, EData, readOnly> *> &x)
00269   {
00270     if (x.first >= size())
00271       resize(x.first + 1, 0);
00272   
00273     typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator it = begin();
00274     it += x.first;
00275     *it = x.second;
00276     
00277     return std::pair<typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator, bool>(it, true);
00278   }
00279 
00281   typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator find(SFFace<FData, VData, EData, readOnly> *const &element)
00282   {
00283     return std::find(begin(), end(), element);
00284   }
00286   typename std::vector<SFFace<FData, VData, EData, readOnly> *>::const_iterator find(SFFace<FData, VData, EData, readOnly> *const &element) const
00287   {
00288     return std::find(begin(), end(), element);
00289   }
00290 };
00291 
00292 template<class FData, class VData, class EData>
00293 class MeshMFFace<FData, VData, EData, false> : public std::map<unsigned int, SFFace<FData, VData, EData, false> *>
00294 {
00295 public:
00296   typedef NonConstMapIterator<unsigned int, SFFace<FData, VData, EData, false> *> iterator;
00297   typedef ConstMapIterator<unsigned int, SFFace<FData, VData, EData, false> *> const_iterator;
00298 
00300   MeshMFFace();
00302   explicit MeshMFFace(const std::vector<SFFace<FData, VData, EData, false> *> &vector);
00303 
00305   SFFace<FData, VData, EData, false> * const &operator[](const unsigned int &n) const 
00306   {
00307     return (*std::map<unsigned int, SFFace<FData, VData, EData, false> *>::find(n)).second;
00308   }
00309 
00311   typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::iterator find(SFFace<FData, VData, EData, false> *const &element)
00312   {
00313     typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::iterator it = std::map<unsigned int, SFFace<FData, VData, EData, false> *>::find(element->getIndex());
00314     if ((*it).second == element)  
00315       return it;
00316     return end();
00317   }
00319   typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::const_iterator find(SFFace<FData, VData, EData, false> *const &element) const
00320   {
00321     typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::const_iterator it = std::map<unsigned int, SFFace<FData, VData, EData, false> *>::find(element->getIndex());
00322     if ((*it).second == element)  
00323       return it;
00324     return end(); 
00325   }
00326 };
00327 
00328 }
00329 }
00330 
00331 #include "MESH_SceneGraphTypes.inl"
00332 
00333 #endif

Generated on Wed Apr 7 12:15:20 2004 for X3DToolKit by doxygen 1.3.3