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 //                            TemplateEdge.h                                  //
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     //faces.reserve(r1faces.size() + r2faces.size() + 1);
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

Generated on Tue Jul 15 16:46:52 2003 for X3DToolKit by doxygen1.3