Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

TemplateEdge.h

Go to the documentation of this file.
00001 
00002 
00003 
00005 
00006 
00011 
00016 
00021 //                            TemplateEdge.h                                  //
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     //faces.reserve(r1faces.size() + r2faces.size() + 1);
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

Generated on Wed Sep 10 11:25:14 2003 for X3DToolKit by doxygen1.3