00001
00002
00004
00005 #ifndef TEMPLATEEDGE_H
00006 #define TEMPLATEEDGE_H
00007
00008 #include "MeshTypes.h"
00009 #include "TemplateEdgeContent.h"
00010
00011 namespace X3DTK {
00012 namespace Mesh {
00013
00014 template<class A, class B, class C> class TemplateVertex;
00015 template<class A, class B, class C> class TemplateFace;
00016
00018
00019 template<class EData, class FData, class VData>
00020 class TemplateEdge
00021 {
00022 template<class A, class B, class C, class D> friend class TemplateMesh;
00023 template<class A, class B, class C> friend class TemplateDirectEdge;
00024 template<class A, class B, class C> friend class TemplateIndirectEdge;
00025 public:
00027 inline TemplateEdge *const getSymetric() {return _symetric;};
00029 inline TemplateVertex<VData, EData, FData> *getFromVertex() const {return (_direct ? _edgeContent->getFromVertex() : _edgeContent->getToVertex());};
00031 inline TemplateVertex<VData, EData, FData> *getToVertex() const {return (_direct ? _edgeContent->getToVertex() : _edgeContent->getFromVertex());};
00033 inline const MTemplateFace<FData, VData, EData> &getLeftFaces() const {return (_direct ? _edgeContent->get1Faces() : _edgeContent->get2Faces());};
00035 inline const MTemplateFace<FData, VData, EData> &getRightFaces() const {return (_direct ? _edgeContent->get2Faces() : _edgeContent->get1Faces());};
00037 MTemplateFace<FData, VData, EData> getFaces() const
00038 {
00039 MTemplateFace<FData, VData, EData> faces;
00040 const MTemplateFace<FData, VData, EData> &r1faces = _edgeContent->get1Faces();
00041 const MTemplateFace<FData, VData, EData> &r2faces = _edgeContent->get2Faces();
00042
00043
00044 for (typename MTemplateFace<FData, VData, EData>::const_iterator it = r1faces.begin(); it != r1faces.end(); ++it)
00045 {
00046 faces.back() = *it;
00047 faces.push_back((TemplateFace<FData, VData, EData> *)(0x1));
00048 }
00049 for (typename MTemplateFace<FData, VData, EData>::const_iterator it = r2faces.begin(); it != r2faces.end(); ++it)
00050 {
00051 faces.back() = *it;
00052 faces.push_back((TemplateFace<FData, VData, EData> *)(0x1));
00053 }
00054
00055 return faces;
00056 };
00058 inline bool isBoundary() const {return _edgeContent->isBoundary();};
00060 inline EData &data() {return _edgeContent->data();};
00062 inline const EData &data() const {return _edgeContent->data();};
00063
00064 protected:
00065 void setDirect(bool value) {_direct = value;};
00066
00067 private:
00068 TemplateEdgeContent<EData, FData, VData> *const _edgeContent;
00069 bool _direct;
00070 TemplateEdge *_symetric;
00071
00072 TemplateEdge(TemplateEdgeContent<EData, FData, VData> *const edgeContent)
00073 : _edgeContent(edgeContent), _symetric(0)
00074 {};
00075
00076
00077 void setSymetric(TemplateEdge *symetric) {_symetric = symetric;};
00078
00080 void addLeftFace(TemplateFace<FData, VData, EData> *face)
00081 {
00082 if (_direct)
00083 _edgeContent->add1Face(face);
00084 else
00085 _edgeContent->add2Face(face);
00086 };
00088 void addRightFace(TemplateFace<FData, VData, EData> *face)
00089 {
00090 if (_direct)
00091 _edgeContent->add2Face(face);
00092 else
00093 _edgeContent->add1Face(face);
00094 };
00095 };
00096
00097
00098 }
00099 }
00100
00101 #endif