00001 #ifndef X3DTK_MESH_SFEDGE_H 00002 #define X3DTK_MESH_SFEDGE_H 00003 00004 #include "MESH_BaseSFEdge.h" 00005 #include "MESH_SFEdgeContent.h" 00006 00007 namespace X3DTK { 00008 namespace MESH { 00009 00010 template<class MData, class VData, class EData, class FData, bool RW> class TemplateVertex; 00011 template<class MData, class VData, class EData, class FData, bool RW> class SFTemplateVertex; 00012 template<class MData, class VData, class EData, class FData, bool RW> class SFTemplateFace; 00013 template<class MData, class VData, class EData, class FData, bool RW> class EntityMFTemplateFace; 00014 00021 template<class MData, class VData, class EData, class FData, bool RW> 00022 class SFTemplateEdge : public BaseSFEdge 00023 { 00024 friend class TemplateVertex<MData, VData, EData, FData, RW>; 00025 friend class TemplateMesh<MData, VData, EData, FData, RW>; 00026 friend class SFTemplateDirectEdge<MData, VData, EData, FData, RW>; 00027 friend class SFTemplateIndirectEdge<MData, VData, EData, FData, RW>; 00028 friend class SFTemplateFace<MData, VData, EData, FData, RW>; 00029 public: 00030 typedef EntityMFTemplateFace<MData, VData, EData, FData, RW> MFFace; 00031 00033 inline SFTemplateEdge *getSymetric(); 00035 virtual SFTemplateVertex<MData, VData, EData, FData, RW> *getFromVertex() const = 0; 00037 virtual SFTemplateVertex<MData, VData, EData, FData, RW> *getToVertex() const = 0; 00039 virtual const MFFace &getLeftFaces() const = 0; 00041 virtual const MFFace &getRightFaces() const = 0; 00045 MFFace getFaces() const; 00047 inline bool isBoundary() const; 00049 inline bool isNonManifold() const; 00051 inline EData &data(); 00053 inline const EData &data() const; 00054 00055 #ifdef TEMPLATE_SPECIALIZATION_SUPPORTED 00056 00057 template<class F> 00058 F &getData(); 00060 template<class F> 00061 F &ogetData(); 00062 #endif 00063 00064 protected: 00066 SFTemplateEdge(SFTemplateEdgeContent<MData, VData, EData, FData, RW> *const edgeContent); 00068 virtual ~SFTemplateEdge(); 00069 00071 void setSymetric(SFTemplateEdge *symetric); 00073 virtual void addLeftFace(SFTemplateFace<MData, VData, EData, FData, RW> *face) = 0; 00075 virtual void addRightFace(SFTemplateFace<MData, VData, EData, FData, RW> *face) = 0; 00076 00078 virtual void removeLeftFace(SFTemplateFace<MData, VData, EData, FData, RW> *face) = 0; 00080 virtual void removeRightFace(SFTemplateFace<MData, VData, EData, FData, RW> *face) = 0; 00081 00082 private: 00083 SFTemplateEdgeContent<MData, VData, EData, FData, RW> *const _edgeContent; 00084 SFTemplateEdge *_symetric; 00085 00087 void reverse(SFTemplateFace<MData, VData, EData, FData, RW> *face); 00088 }; 00089 00091 template<class MData, class VData, class EData, class FData, bool RW> 00092 std::ostream& operator<<(std::ostream& o, const SFTemplateEdge<MData, VData, EData, FData, RW> &e); 00093 00094 } 00095 } 00096 00097 #include "MESH_SFEdge.inl" 00098 00099 #endif