// Copyright (c) 2007 GeometryFactory (France). All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // // Author(s) : Andreas Fabri, Philipp Moeller #ifndef CGAL_BOOST_GRAPH_TRAITS_SURFACE_MESH_H #define CGAL_BOOST_GRAPH_TRAITS_SURFACE_MESH_H // include this to avoid a VC15 warning #include #include #include #include #include #include #include #include namespace boost { template struct graph_traits< CGAL::Surface_mesh

> { private: typedef CGAL::Surface_mesh

SM; struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag, public virtual boost::vertex_list_graph_tag, public virtual boost::edge_list_graph_tag {}; public: // Graph typedef typename SM::Vertex_index vertex_descriptor; typedef typename SM::Point vertex_property_type; typedef typename SM::Edge_index edge_descriptor; typedef boost::undirected_tag directed_category; typedef boost::disallow_parallel_edge_tag edge_parallel_category; typedef SM_graph_traversal_category traversal_category; // HalfedgeGraph typedef typename SM::halfedge_index halfedge_descriptor; // FaceGraph typedef typename SM::face_index face_descriptor; // VertexListGraph typedef typename SM::Vertex_iterator vertex_iterator; typedef typename SM::size_type vertices_size_type; // EdgeListGraph typedef typename SM::edge_iterator edge_iterator; typedef typename SM::size_type edges_size_type; // HalfEdgeListGraph typedef typename SM::Halfedge_iterator halfedge_iterator; typedef typename SM::size_type halfedges_size_type; // FaceListGraph typedef typename SM::Face_iterator face_iterator; typedef typename SM::size_type faces_size_type; // IncidenceGraph typedef typename SM::size_type degree_size_type; typedef CGAL::In_edge_iterator in_edge_iterator; typedef CGAL::Out_edge_iterator out_edge_iterator; // nulls static vertex_descriptor null_vertex() { return vertex_descriptor(); } static face_descriptor null_face() { return face_descriptor(); } static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); } }; template struct graph_traits< const CGAL::Surface_mesh

> : public graph_traits< CGAL::Surface_mesh

> { }; } // namespace boost namespace CGAL { template typename boost::graph_traits >::vertices_size_type num_vertices(const CGAL::Surface_mesh

& sm) { return sm.num_vertices(); } template typename boost::graph_traits >::edges_size_type num_edges(const CGAL::Surface_mesh

& sm) { return sm.num_edges(); } template typename boost::graph_traits >::degree_size_type degree(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { return sm.degree(v); } template typename boost::graph_traits >::degree_size_type out_degree(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { return sm.degree(v); } template typename boost::graph_traits >::degree_size_type in_degree(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { return sm.degree(v); } template typename boost::graph_traits >::vertex_descriptor source(typename boost::graph_traits >::edge_descriptor e, const CGAL::Surface_mesh

& sm) { return sm.source(e.halfedge()); } template typename boost::graph_traits >::vertex_descriptor source(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.source(h); } template typename boost::graph_traits >::vertex_descriptor target(typename boost::graph_traits >::edge_descriptor e, const CGAL::Surface_mesh

& sm) { return sm.target(e.halfedge()); } template typename boost::graph_traits >::vertex_descriptor target(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.target(h); } template Iterator_range >::vertex_iterator> vertices(const CGAL::Surface_mesh

& sm) { return sm.vertices(); } template Iterator_range >::edge_iterator> edges(const CGAL::Surface_mesh

& sm) { return sm.edges(); } template Iterator_range >::in_edge_iterator> in_edges(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { typedef typename boost::graph_traits >::in_edge_iterator Iter; return make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1)); } template Iterator_range >::out_edge_iterator> out_edges(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { typedef typename boost::graph_traits >::out_edge_iterator Iter; return make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1)); } template std::pair >::edge_descriptor, bool> edge(typename boost::graph_traits >::vertex_descriptor u, typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { typename boost::graph_traits >::edge_descriptor he(sm.halfedge(u, v)); return std::make_pair(he, he.is_valid()); } // // HalfedgeGraph // template typename boost::graph_traits >::halfedge_descriptor next(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.next(h); } template typename boost::graph_traits >::halfedge_descriptor prev(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.prev(h); } template typename boost::graph_traits >::halfedge_descriptor opposite(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.opposite(h); } template typename boost::graph_traits >::edge_descriptor edge(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.edge(h); } template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::edge_descriptor e, const CGAL::Surface_mesh

& sm) { return sm.halfedge(e); } template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { return sm.halfedge(v); } template std::pair< typename boost::graph_traits >::halfedge_descriptor, bool > halfedge(typename boost::graph_traits >::vertex_descriptor u, typename boost::graph_traits >::vertex_descriptor v, const CGAL::Surface_mesh

& sm) { typename boost::graph_traits >::halfedge_descriptor h = sm.halfedge(u, v); return std::make_pair(h, h.is_valid()); } // // HalfedgeListGraph // template Iterator_range >::halfedge_iterator> halfedges(const CGAL::Surface_mesh

& sm) { return sm.halfedges(); } template typename boost::graph_traits >::halfedges_size_type num_halfedges(const CGAL::Surface_mesh

& sm) { return sm.num_halfedges(); } // // MutableHalfedgeGraph // template void set_next(typename boost::graph_traits >::halfedge_descriptor h1, typename boost::graph_traits >::halfedge_descriptor h2, CGAL::Surface_mesh

& sm) { sm.set_next(h1, h2); } template void set_target(typename boost::graph_traits >::halfedge_descriptor h, typename boost::graph_traits >::vertex_descriptor v, CGAL::Surface_mesh

& sm) { sm.set_target(h, v); } template void set_halfedge(typename boost::graph_traits >::vertex_descriptor v, typename boost::graph_traits >::halfedge_descriptor h, CGAL::Surface_mesh

& sm) { sm.set_halfedge(v, h); } template void collect_garbage(CGAL::Surface_mesh

& sm) { sm.collect_garbage(); } template typename boost::graph_traits >::edge_descriptor add_edge(CGAL::Surface_mesh

& sm) { return sm.edge(sm.add_edge()); } // // FaceGraph // template typename boost::graph_traits >::halfedge_descriptor halfedge(typename boost::graph_traits >::face_descriptor f, const CGAL::Surface_mesh

& sm) { return sm.halfedge(f); } template typename boost::graph_traits >::face_descriptor face(typename boost::graph_traits >::halfedge_descriptor h, const CGAL::Surface_mesh

& sm) { return sm.face(h); } // // MutableFaceGraph // template void set_face(typename boost::graph_traits >::halfedge_descriptor h, typename boost::graph_traits >::face_descriptor f, CGAL::Surface_mesh

& sm) { sm.set_face(h, f); } template void set_halfedge(typename boost::graph_traits >::face_descriptor f, typename boost::graph_traits >::halfedge_descriptor h, CGAL::Surface_mesh

& sm) { sm.set_halfedge(f, h); } // // FaceListGraph // template typename boost::graph_traits >::faces_size_type num_faces(const CGAL::Surface_mesh

& sm) { return sm.num_faces(); } template Iterator_range >::face_iterator> faces(const CGAL::Surface_mesh

& sm) { return sm.faces(); } template typename boost::graph_traits >::vertex_descriptor add_vertex(CGAL::Surface_mesh

& sm) { return sm.add_vertex(); } template typename boost::graph_traits >::vertex_descriptor add_vertex(const typename boost::graph_traits >::vertex_property_type& p, CGAL::Surface_mesh

& sm) { return sm.add_vertex(p); } /* // MutableGraph // add a vertex with a default constructed property template typename boost::graph_traits >::vertex_descriptor add_vertex(CGAL::Surface_mesh

& sm) { return sm.add_vertex(typename boost::graph_traits >::vertex_property_type()); } template void clear_vertex(typename boost::graph_traits >::vertex_descriptor, CGAL::Surface_mesh

&) { CGAL_assertion(false); } */ template void remove_vertex(typename boost::graph_traits >::vertex_descriptor v, CGAL::Surface_mesh

& sm) { sm.remove_vertex(v); } template void remove_edge(typename boost::graph_traits >::vertex_descriptor u, typename boost::graph_traits >::vertex_descriptor v, CGAL::Surface_mesh

& sm) { typename boost::graph_traits >::edge_descriptor e = edge(u, v, sm); remove_edge(e,sm); } template void remove_edge(typename boost::graph_traits >::edge_descriptor e, CGAL::Surface_mesh

& sm) { sm.remove_edge(e); } template void remove_edge(typename boost::graph_traits >::edge_iterator eiter, CGAL::Surface_mesh

& sm) { remove_edge(*eiter, sm); } template void remove_face(typename boost::graph_traits >::face_descriptor f, CGAL::Surface_mesh

& sm) { sm.remove_face(f); } template typename boost::graph_traits >::face_descriptor add_face(CGAL::Surface_mesh

& sm) { return sm.add_face(); } template typename boost::graph_traits >::face_descriptor add_face(InputIterator begin, InputIterator end, CGAL::Surface_mesh

& sm) { std::vector >::vertex_descriptor> v(begin, end); return sm.add_face(v); } template bool is_valid(const CGAL::Surface_mesh

& sm, bool verbose = false) { return sm.is_valid(verbose); } } // namespace CGAL #endif // CGAL_BOOST_GRAPH_TRAITS_SURFACE_MESH_H