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 00101 typename std::vector<SFVertex<VData, EData, FData, readOnly> *>::iterator find(SFVertex<VData, EData, FData, readOnly> *const &element) const; 00102 }; 00103 00104 template<class VData, class EData, class FData> 00105 class MeshMFVertex<VData, EData, FData, false> : public std::map<unsigned int, SFVertex<VData, EData, FData, false> *> 00106 { 00107 public: 00108 typedef NonConstMapIterator<unsigned int, SFVertex<VData, EData, FData, false> *> iterator; 00109 typedef ConstMapIterator<unsigned int, SFVertex<VData, EData, FData, false> *> const_iterator; 00110 00112 MeshMFVertex(); 00114 explicit MeshMFVertex(const std::vector<SFVertex<VData, EData, FData, false> *> &vector); 00115 00117 SFVertex<VData, EData, FData, false> *const &operator[](const unsigned int &n) const 00118 { 00119 return (*std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::find(n)).second; 00120 } 00121 00123 typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::iterator find(SFVertex<VData, EData, FData, false> *const &element); 00125 typename std::map<unsigned int, SFVertex<VData, EData, FData, false> *>::const_iterator find(SFVertex<VData, EData, FData, false> *const &element) const; 00126 }; 00127 00128 00134 template<class EData, class FData, class VData, bool readOnly = true> 00135 class EntityMFEdge : public std::vector<SFEdge<EData, FData, VData, readOnly> *> 00136 { 00137 public: 00139 EntityMFEdge(); 00141 explicit EntityMFEdge(const std::vector<SFEdge<EData, FData, VData, readOnly> *> &vector, bool ccw); 00142 }; 00143 00144 template<class EData, class FData, class VData> 00145 class EntityMFEdge<EData, FData, VData, false> : public std::list<SFEdge<EData, FData, VData, false> *> 00146 { 00147 public: 00149 EntityMFEdge(); 00151 explicit EntityMFEdge(const std::vector<SFEdge<EData, FData, VData, false> *> &vector, bool ccw); 00152 }; 00153 00159 template<class EData, class FData, class VData, bool readOnly = true> 00160 class MeshMFEdge : public std::vector<SFEdge<EData, FData, VData, readOnly> *> 00161 { 00162 public: 00164 MeshMFEdge(); 00166 explicit MeshMFEdge(const std::vector<SFEdge<EData, FData, VData, readOnly> *> &vector, bool ccw); 00167 00169 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); 00170 00172 typename std::vector<SFEdge<EData, FData, VData, readOnly> *>::iterator find(SFEdge<EData, FData, VData, readOnly> *const &element) const; 00173 }; 00174 00175 template<class EData, class FData, class VData> 00176 class MeshMFEdge<EData, FData, VData, false> : public std::set<SFEdge<EData, FData, VData, false> *> 00177 { 00178 public: 00180 MeshMFEdge(); 00182 explicit MeshMFEdge(const std::vector<SFEdge<EData, FData, VData, false> *> &vector, bool ccw); 00183 00185 SFEdge<EData, FData, VData, false> *const &operator[](const unsigned int &n) const; 00186 }; 00187 00193 template<class FData, class VData, class EData, bool readOnly = true> 00194 class EntityMFFace : public std::vector<SFFace<FData, VData, EData, readOnly> *> 00195 { 00196 public: 00198 EntityMFFace(); 00200 explicit EntityMFFace(const std::vector<SFFace<FData, VData, EData, readOnly> *> &vector); 00201 }; 00202 00203 template<class FData, class VData, class EData> 00204 class EntityMFFace<FData, VData, EData, false> : public std::list<SFFace<FData, VData, EData, false> *> 00205 { 00206 public: 00208 EntityMFFace(); 00210 explicit EntityMFFace(const std::vector<SFFace<FData, VData, EData, false> *> &vector); 00211 }; 00212 00218 template<class FData, class VData, class EData, bool readOnly = true> 00219 class MeshMFFace : public std::vector<SFFace<FData, VData, EData, readOnly> *> 00220 { 00221 public: 00223 MeshMFFace(); 00225 explicit MeshMFFace(const std::vector<SFFace<FData, VData, EData, readOnly> *> &vector); 00226 00228 std::pair<typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator, bool> insert(const std::pair<unsigned int, SFFace<FData, VData, EData, readOnly> *> &x); 00229 00231 typename std::vector<SFFace<FData, VData, EData, readOnly> *>::iterator find(SFFace<FData, VData, EData, readOnly> *const &element); 00233 typename std::vector<SFFace<FData, VData, EData, readOnly> *>::const_iterator find(SFFace<FData, VData, EData, readOnly> *const &element) const; 00234 }; 00235 00236 template<class FData, class VData, class EData> 00237 class MeshMFFace<FData, VData, EData, false> : public std::map<unsigned int, SFFace<FData, VData, EData, false> *> 00238 { 00239 public: 00240 typedef NonConstMapIterator<unsigned int, SFFace<FData, VData, EData, false> *> iterator; 00241 typedef ConstMapIterator<unsigned int, SFFace<FData, VData, EData, false> *> const_iterator; 00242 00244 MeshMFFace(); 00246 explicit MeshMFFace(const std::vector<SFFace<FData, VData, EData, false> *> &vector); 00247 00249 SFFace<FData, VData, EData, false> * const &operator[](const unsigned int &n) const 00250 { 00251 return (*std::map<unsigned int, SFFace<FData, VData, EData, false> *>::find(n)).second; 00252 } 00253 00255 typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::iterator find(SFFace<FData, VData, EData, false> *const &element); 00257 typename std::map<unsigned int, SFFace<FData, VData, EData, false> *>::const_iterator find(SFFace<FData, VData, EData, false> *const &element) const; 00258 }; 00259 00260 } 00261 } 00262 00263 #include "MESH_SceneGraphTypes.inl" 00264 00265 #endif