00001
00002
00003
00005
00006
00011
00016
00021
00023
00024 #ifndef TEMPLATEEDGE_H
00025 #define TEMPLATEEDGE_H
00026
00027 #include "MeshTypes.h"
00028 #include "TemplateEdgeContent.h"
00029
00030 namespace X3DTK {
00031 namespace Mesh {
00032
00033 template<class A, class B, class C> class TemplateVertex;
00034 template<class A, class B, class C> class TemplateFace;
00035
00037
00038 template<class EData, class FData, class VData>
00039 class TemplateEdge
00040 {
00041 template<class A, class B, class C, class D> friend class TemplateMesh;
00042 template<class A, class B, class C> friend class TemplateDirectEdge;
00043 template<class A, class B, class C> friend class TemplateIndirectEdge;
00044 public:
00046 inline TemplateEdge *getSymetric() {return _symetric;};
00048 inline TemplateVertex<VData, EData, FData> *getFromVertex() {return (_direct ? _edgeContent->getFromVertex() : _edgeContent->getToVertex());};
00050 inline TemplateVertex<VData, EData, FData> *getToVertex() {return (_direct ? _edgeContent->getToVertex() : _edgeContent->getFromVertex());};
00052 inline const MTemplateFace<FData, VData, EData> &getLeftFaces() const {return (_direct ? _edgeContent->get1Faces() : _edgeContent->get2Faces());};
00054 inline const MTemplateFace<FData, VData, EData> &getRightFaces() const {return (_direct ? _edgeContent->get2Faces() : _edgeContent->get1Faces());};
00056 MTemplateFace<FData, VData, EData> getFaces() const
00057 {
00058 MTemplateFace<FData, VData, EData> faces;
00059 const MTemplateFace<FData, VData, EData> &r1faces = _edgeContent->get1Faces();
00060 const MTemplateFace<FData, VData, EData> &r2faces = _edgeContent->get2Faces();
00061
00062
00063 for (typename MTemplateFace<FData, VData, EData>::const_iterator it = r1faces.begin(); it != r1faces.end(); ++it)
00064 {
00065 faces.back() = *it;
00066 faces.push_back((TemplateFace<FData, VData, EData> *)(0x1));
00067 }
00068 for (typename MTemplateFace<FData, VData, EData>::const_iterator it = r2faces.begin(); it != r2faces.end(); ++it)
00069 {
00070 faces.back() = *it;
00071 faces.push_back((TemplateFace<FData, VData, EData> *)(0x1));
00072 }
00073
00074 return faces;
00075 };
00077 inline bool isBoundary() const {return _edgeContent->isBoundary();};
00079 inline EData &data() {return _edgeContent->data();};
00081 inline const EData &data() const {return _edgeContent->data();};
00082
00083 protected:
00084 void setDirect(bool value) {_direct = value;};
00085
00086 private:
00087 TemplateEdgeContent<EData, FData, VData> *const _edgeContent;
00088 bool _direct;
00089 TemplateEdge *_symetric;
00090
00091 TemplateEdge(TemplateEdgeContent<EData, FData, VData> *const edgeContent)
00092 : _edgeContent(edgeContent), _symetric(0)
00093 {};
00094
00095
00096 void setSymetric(TemplateEdge *symetric) {_symetric = symetric;};
00097
00099 void addLeftFace(TemplateFace<FData, VData, EData> *face)
00100 {
00101 if (_direct)
00102 _edgeContent->add1Face(face);
00103 else
00104 _edgeContent->add2Face(face);
00105 };
00107 void addRightFace(TemplateFace<FData, VData, EData> *face)
00108 {
00109 if (_direct)
00110 _edgeContent->add2Face(face);
00111 else
00112 _edgeContent->add1Face(face);
00113 };
00114 };
00115
00116
00117 }
00118 }
00119
00120 #endif