From 42557f19f89767ab8d07488c3824e395906a894f Mon Sep 17 00:00:00 2001 From: ganovelli Date: Thu, 25 Mar 2010 16:50:28 +0000 Subject: [PATCH] [introduction of half edges as alternative representation] No modification should be necessary for the existing code. most relevant changes: creation of folder: vcg/connectors vcg/connectors/hedge.h vcg/connectors/hedge_component.h addition to the container of half edges to the trimesh: HEdgeContainer hedge; // container int hn; // number of half edges addition of vcg/trimesh/update/halfedge_indexed.h which contains: - the functions to compute the half edge representation from the indexed and vivecersa - the functions to add or remove an half edge --- vcg/complex/trimesh/base.h | 201 +++++++++++++++++++++---------------- 1 file changed, 117 insertions(+), 84 deletions(-) diff --git a/vcg/complex/trimesh/base.h b/vcg/complex/trimesh/base.h index 55c6059f..0464dfd9 100644 --- a/vcg/complex/trimesh/base.h +++ b/vcg/complex/trimesh/base.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -54,7 +55,7 @@ namespace tri { /** Class Mesh. This is class for definition of a mesh. @param VertContainerType (Template Parameter) Specifies the type of the vertices container any the vertex type. - @param FaceContainerType (Template Parameter) Specifies the type of the faces container any the face type. + @param FaceContainer (Template Parameter) Specifies the type of the faces container any the face type. */ @@ -68,7 +69,7 @@ namespace tri { typedef std::vector< Vertex > CONTV; typedef std::vector< Edge > CONTE; typedef std::vector< Face > CONTF; -// typedef std::vector< HEdge > CONTHE; + typedef std::vector< HEdge > CONTH; typedef CONTV VertContainer; typedef Vertex VertexType; @@ -91,11 +92,11 @@ namespace tri { typedef typename CONTF::value_type* FacePointer; typedef const typename CONTF::value_type*ConstFacePointer; - //typedef CONTHE HEdgeContainer; - //typedef typename CONTHE::value_type HEdgeType; - //typedef typename CONTHE::value_type* HEdgePointer; - //typedef typename CONTHE::iterator HEdgeIterator; - //typedef typename CONTHE::const_iterator ConstHEdgeIterator; + typedef CONTH HEdgeContainer; + typedef typename CONTH::value_type HEdgeType; + typedef typename CONTH::value_type* HEdgePointer; + typedef typename CONTH::iterator HEdgeIterator; + typedef typename CONTH::const_iterator ConstHEdgeIterator; }; @@ -137,6 +138,15 @@ namespace tri { typedef const FaceType * ConstFacePointer; }; + template + struct MeshTypeHolder< T, CONT, AllTypes::AHEdgeType>: public T{ + typedef CONT HEdgeContainer; + typedef typename HEdgeContainer::value_type HEdgeType; + typedef typename HEdgeContainer::value_type * HEdgePointer; + typedef typename HEdgeContainer::iterator HEdgeIterator; + typedef typename HEdgeContainer::const_iterator ConstHEdgeIterator; +}; + /*struct DummyContainer {}; template struct Deriver: public MeshTypeHolder{}; @@ -145,39 +155,45 @@ template <> struct Deriver{}*/; template struct Der: public MeshTypeHolder{}; struct DummyContainer{struct value_type{ typedef int IAm;}; }; -template < class Container0 = DummyContainer, class Container1 = DummyContainer, class Container2 = DummyContainer/*, class Container3 = DummyContainer*/ > +template < class Container0 = DummyContainer, class Container1 = DummyContainer, class Container2 = DummyContainer, class Container3 = DummyContainer > class TriMesh : public MArity3< BaseMeshTypeHolder, Container0, Der ,Container1, Der, Container2, Der/*, Container3, Der*/>{ public: - typedef typename TriMesh::ScalarType ScalarType; + typedef typename TriMesh::ScalarType ScalarType; typedef typename TriMesh::VertContainer VertContainer; typedef typename TriMesh::EdgeContainer EdgeContainer; typedef typename TriMesh::FaceContainer FaceContainer; // types for vertex - typedef typename TriMesh::VertexType VertexType; - typedef typename TriMesh::VertexPointer VertexPointer; - typedef typename TriMesh::ConstVertexPointer ConstVertexPointer; - typedef typename TriMesh::CoordType CoordType; - typedef typename TriMesh::VertexIterator VertexIterator; - typedef typename TriMesh::ConstVertexIterator ConstVertexIterator; + typedef typename TriMesh::VertexType VertexType; + typedef typename TriMesh::VertexPointer VertexPointer; + typedef typename TriMesh::ConstVertexPointer ConstVertexPointer; + typedef typename TriMesh::CoordType CoordType; + typedef typename TriMesh::VertexIterator VertexIterator; + typedef typename TriMesh::ConstVertexIterator ConstVertexIterator; // types for edge - typedef typename TriMesh::EdgeType EdgeType; - typedef typename TriMesh::EdgePointer EdgePointer; - typedef typename TriMesh::EdgeIterator EdgeIterator; - typedef typename TriMesh::ConstEdgeIterator ConstEdgeIterator; + typedef typename TriMesh::EdgeType EdgeType; + typedef typename TriMesh::EdgePointer EdgePointer; + typedef typename TriMesh::EdgeIterator EdgeIterator; + typedef typename TriMesh::ConstEdgeIterator ConstEdgeIterator; //types for face - typedef typename TriMesh::FaceType FaceType; - typedef typename TriMesh::ConstFaceIterator ConstFaceIterator; - typedef typename TriMesh::FaceIterator FaceIterator; - typedef typename TriMesh::FacePointer FacePointer; - typedef typename TriMesh::ConstFacePointer ConstFacePointer; + typedef typename TriMesh::FaceType FaceType; + typedef typename TriMesh::ConstFaceIterator ConstFaceIterator; + typedef typename TriMesh::FaceIterator FaceIterator; + typedef typename TriMesh::FacePointer FacePointer; + typedef typename TriMesh::ConstFacePointer ConstFacePointer; + // types for hedge + typedef typename TriMesh::HEdgeType HEdgeType; + typedef typename TriMesh::HEdgePointer HEdgePointer; + typedef typename TriMesh::HEdgeIterator HEdgeIterator; + typedef typename TriMesh::HEdgeContainer HEdgeContainer; + typedef typename TriMesh::ConstHEdgeIterator ConstHEdgeIterator; - typedef TriMesh MeshType; + typedef TriMesh MeshType; typedef Box3 BoxType; @@ -191,8 +207,12 @@ class TriMesh int fn; /// Set of edges EdgeContainer edge; - /// Actual number of faces + /// Actual number of edges int en; + /// Set of hedges + HEdgeContainer hedge; + /// Actual number of hedges + int hn; /// Bounding box of the mesh Box3 bbox; @@ -470,91 +490,104 @@ template inline void UnMarkAll(MeshType & m) { ++m.imark; } -template < class VertContainerType, class FaceContainerType , class EdgeContainerType> -bool HasPerVertexQuality (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasQuality();} +template < class ContainerType0, class ContainerType1 , class ContainerType2, class ContainerType3> +bool HasPerVertexQuality (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasQuality();} -template < class VertContainerType, class FaceContainerType , class EdgeContainerType> -bool HasPerVertexMark (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasMark();} +template < class ContainerType0, class ContainerType1 , class ContainerType2, class ContainerType3> +bool HasPerVertexMark (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasMark();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerVertexCurvature (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasCurvature();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerVertexCurvature (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasCurvature();} -template < class VertContainerType, class FaceContainerType , class EdgeContainerType> -bool HasPerVertexCurvatureDir (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasCurvatureDir();} +template < class ContainerType0, class ContainerType1 , class ContainerType2, class ContainerType3> +bool HasPerVertexCurvatureDir (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasCurvatureDir();} -template < class VertContainerType, class FaceContainerType , class EdgeContainerType> -bool HasPerVertexColor (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasColor();} +template < class ContainerType0, class ContainerType1 , class ContainerType2, class ContainerType3> +bool HasPerVertexColor (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasColor();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerVertexTexCoord (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasTexCoord();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerVertexTexCoord (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasTexCoord();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerVertexFlags (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasFlags();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerVertexFlags (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasFlags();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerVertexNormal (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasNormal();} +template < class ContainerType0, class ContainerType1, class ContainerType2, class ContainerType3 > +bool HasPerVertexNormal (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasNormal();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerVertexRadius (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasRadius();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerVertexRadius (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasRadius();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerWedgeTexCoord (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasWedgeTexCoord();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerWedgeTexCoord (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasWedgeTexCoord();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerWedgeNormal (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasWedgeNormal();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerWedgeNormal (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasWedgeNormal();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerWedgeColor (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasWedgeColor();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerWedgeColor (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasWedgeColor();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerFaceFlags (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFlags();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerFaceFlags (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFlags();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerFaceNormal (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFaceNormal();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerFaceNormal (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFaceNormal();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerFaceColor (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFaceColor();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerFaceColor (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFaceColor();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerFaceMark (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasMark();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerFaceMark (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasMark();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasPerFaceQuality (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFaceQuality();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasPerFaceQuality (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFaceQuality();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasFFAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFFAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasFFAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFFAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasFVAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return FaceContainerType::value_type::HasFVAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasFVAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasFVAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasVEAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return VertContainerType::value_type::HasVEAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasVEAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasVEAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasEVAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return TriMesh < VertContainerType , FaceContainerType, EdgeContainerType>::EdgeType::HasEVAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasVHAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasVHAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasEFAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return TriMesh < VertContainerType , FaceContainerType, EdgeContainerType>::EdgeType::HasEFAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasEVAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::EdgeType::HasEVAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasFHEAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return TriMesh < VertContainerType , FaceContainerType, EdgeContainerType>::FaceType::HasFHEAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasEFAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::EdgeType::HasEFAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasHEVAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return TriMesh < VertContainerType , FaceContainerType, EdgeContainerType>::EdgeType::HasHEVAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasFHAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceType::HasFHAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasHENextAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return EdgeContainerType::value_type::HasHENextAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHVAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::HEdgeType::HasHVAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasHEPrevAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return EdgeContainerType::value_type::HasHEPrevAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHEAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::HEdgeType::HasHEAdjacency();} -template < class VertContainerType, class FaceContainerType, class EdgeContainerType > -bool HasHEOppAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) {return EdgeContainerType::value_type::HasHEOppAdjacency();} +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHFAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::HEdgeType::HasHFAdjacency();} -template < class VertContainerType, class FaceContainerType , class EdgeContainerType> -bool HasVFAdjacency (const TriMesh < VertContainerType , FaceContainerType, EdgeContainerType> & /*m*/) { - assert(FaceContainerType::value_type::HasVFAdjacency() == VertContainerType::value_type::HasVFAdjacency()); - return FaceContainerType::value_type::HasVFAdjacency(); +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHNextAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh< ContainerType0, ContainerType1, ContainerType2 , ContainerType3>::HEdgeType::HasHNextAdjacency();} + +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHPrevAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh< ContainerType0, ContainerType1, ContainerType2 , ContainerType3>::HEdgeType::HasHPrevAdjacency();} + +template < class ContainerType0, class ContainerType1, class ContainerType2 , class ContainerType3> +bool HasHOppAdjacency (const TriMesh < ContainerType0, ContainerType1, ContainerType2, ContainerType3> & /*m*/) {return TriMesh< ContainerType0, ContainerType1, ContainerType2 , ContainerType3>::HEdgeType::HasHOppAdjacency();} + +template < class ContainerType0, class ContainerType1 , class ContainerType2, class ContainerType3> +bool HasVFAdjacency (const TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3> & /*m*/) { + // gcc 4.4: if the expressions assigned to a1 and a2 are replaced in the assert we get a compilation error + // for the macro assert + bool a1 = TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasVFAdjacency(); + bool a2 = TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::VertContainer::value_type::HasVFAdjacency(); + assert(a1==a2); + return TriMesh < ContainerType0 , ContainerType1, ContainerType2, ContainerType3>::FaceContainer::value_type::HasVFAdjacency(); } template