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