// Copyright (c) 2007 GeometryFactory (France). All rights reserved. // // This file is part of CGAL (www.cgal.org) // // $URL$ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Andreas Fabri, Fernando Cacciola #ifndef CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYHEDRON_3_H #define CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYHEDRON_3_H #include #include #include #include #include #define CGAL_HDS_PARAM_ template < class Traits, class Items, class Alloc> class HDS // // NOTE: The BGL algorithms are NOT const-correct: i.e., they take a "G const&" // but instantiate "graph_traits" instead of "graph_traits" // This is known Boost bug which will eventually be fixed, but in the meantime we need // to coerce both const and non-const specializations. // That is, HDS_graph_traits is really the same as HDS_graph_traits // so graph_traits is also the same as graph_traits. // Therefore, while, for instance, "graph_traits::vertex_descriptor" // is conceptually const-correct, it actually corresponds to the non-const handle, // hence the const_cast<> used below in the functions implementation. // namespace boost { template struct graph_traits< CGAL::Polyhedron_3 > : CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > { typedef typename Gt::Point_3 vertex_property_type; }; template struct graph_traits< CGAL::Polyhedron_3 const > : CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > // See NOTE above! {}; } // namespace boost namespace CGAL { template typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertices_size_type num_vertices(const CGAL::Polyhedron_3& p) { return p.size_of_vertices(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::edges_size_type num_edges(const CGAL::Polyhedron_3& p) { return p.size_of_halfedges() / 2; } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::degree_size_type degree(typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v , const CGAL::Polyhedron_3&) { return v->vertex_degree(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::degree_size_type out_degree(typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v , const CGAL::Polyhedron_3&) { return v->vertex_degree(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::degree_size_type in_degree(typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v , const CGAL::Polyhedron_3&) { return v->vertex_degree(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::degree_size_type degree(typename boost::graph_traits< CGAL::Polyhedron_3 const>::face_descriptor f , const CGAL::Polyhedron_3&) { return f->facet_degree(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor source(typename boost::graph_traits< CGAL::Polyhedron_3 const>::edge_descriptor e , const CGAL::Polyhedron_3 & ) { return e.halfedge()->opposite()->vertex(); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor target(typename boost::graph_traits< CGAL::Polyhedron_3 const>::edge_descriptor e , const CGAL::Polyhedron_3 & ) { return e.halfedge()->vertex(); } template std::pair< typename boost::graph_traits< CGAL::Polyhedron_3 const>::edge_descriptor , bool> edge(typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor u , typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v , const CGAL::Polyhedron_3 &) { typedef CGAL::Polyhedron_3 P; typedef typename P::Halfedge_around_vertex_circulator Circ; typedef boost::graph_traits< P > Traits; typedef typename Traits::edge_descriptor edge; // circulate around the inedges of u Circ c(u->halfedge()), d(u->halfedge()); if(c != 0) { do { if(c->opposite()->vertex() == v) { return std::make_pair(edge(c->opposite()), true); } } while (++c != d); } return std::make_pair(edge(), false); } template inline Iterator_range const>::vertex_iterator> vertices( const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_iterator Iter; CGAL::Polyhedron_3& ncp = const_cast&>(p); return make_range( Iter(ncp.vertices_begin()), Iter(ncp.vertices_end()) ); } template inline Iterator_range const>::edge_iterator> edges( const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::edge_iterator_i Iter_i; typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::edge_iterator Iter; CGAL::Polyhedron_3& ncp = const_cast&>(p); return make_range( Iter(Iter_i(ncp.halfedges_begin())), Iter(Iter_i(ncp.halfedges_end()) )); } template inline Iterator_range const>::in_edge_iterator> in_edges( typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor u , const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::in_edge_iterator Iter; return make_range(Iter(halfedge(u,p),p), Iter(halfedge(u,p),p,1)); } template inline Iterator_range const>::out_edge_iterator> out_edges( typename boost::graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor u , const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::out_edge_iterator Iter; return make_range(Iter(halfedge(u,p),p), Iter(halfedge(u,p),p,1)); } // // MutableHalfedgeGraph // template typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor add_vertex(CGAL::Polyhedron_3& g) { return g.hds().vertices_push_back(typename CGAL::Polyhedron_3::Vertex()); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor add_vertex(const typename boost::graph_traits >::vertex_property_type& p , CGAL::Polyhedron_3& g) { return g.hds().vertices_push_back(typename CGAL::Polyhedron_3::Vertex(p)); } template void remove_vertex(typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v , CGAL::Polyhedron_3& g) { g.hds().vertices_erase(v); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor add_edge(CGAL::Polyhedron_3& g) { return typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor( g.hds().edges_push_back(typename CGAL::Polyhedron_3::Halfedge(), typename CGAL::Polyhedron_3::Halfedge())); } template void remove_edge(typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor e , CGAL::Polyhedron_3& g) { g.hds().edges_erase(e.halfedge()); } template void set_target(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h1 , typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v , CGAL::Polyhedron_3&) { // set_face has become private in the halfedge provided by // polyhedron for unknown reasons, although it used to be public // once. // We sneak in anyway. Inheritance can't keep us out. typedef typename CGAL::Polyhedron_3::Halfedge::Base Sneak; static_cast(*h1).set_vertex(v); } template void set_next(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h1 , typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h2 , CGAL::Polyhedron_3&) { typedef typename CGAL::Polyhedron_3::Halfedge::Base Sneak; static_cast(*h1).set_next(h2); static_cast(*h2).set_prev(h1); } // // MutableFaceGraph // template typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor add_face(CGAL::Polyhedron_3& g) { return g.hds().faces_push_back(typename CGAL::Polyhedron_3::HalfedgeDS::Face()); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor add_face(InputIterator begin, InputIterator end, CGAL::Polyhedron_3& g) { return g.hds().add_facet(begin, end); } template void remove_face(typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor f , CGAL::Polyhedron_3& g) { g.hds().faces_erase(f); } template void set_face(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor f , CGAL::Polyhedron_3&) { // set_face has become private in the halfedge provided by // polyhedron for unknown reasons, although it used to be public // once. // We sneak in anyway. Inheritance can't keep us out. typedef typename CGAL::Polyhedron_3::Halfedge::Base Sneak; static_cast(*h).set_face(f); } template void set_halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor f , typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , CGAL::Polyhedron_3& g) { typedef typename CGAL::Polyhedron_3::Halfedge_data_structure Hds; CGAL::HalfedgeDS_decorator D(g.hds()); D.set_face_halfedge(f, h); } template void set_halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v , typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , CGAL::Polyhedron_3&) { typedef typename CGAL::Polyhedron_3::Vertex::Base Sneak; static_cast(*v).set_halfedge(h); } template void remove_all_elements(CGAL::Polyhedron_3& g) { g.clear(); } // // HalfedgeGraph // template typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor edge(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , const CGAL::Polyhedron_3&) { return typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor(h); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor e , const CGAL::Polyhedron_3&) { return e.halfedge(); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v , const CGAL::Polyhedron_3&) { return v->halfedge(); } template std::pair< typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor , bool> halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor u , typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v , const CGAL::Polyhedron_3& g) { std::pair< typename boost::graph_traits< CGAL::Polyhedron_3 >::edge_descriptor , bool> e = edge(u, v, g); return std::make_pair(e.first.halfedge(), e.second); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor opposite(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , const CGAL::Polyhedron_3&) { return h->opposite(); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor source(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , const CGAL::Polyhedron_3& g) { return target(opposite(h, g), g); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor target(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , const CGAL::Polyhedron_3&) { return h->vertex(); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor next(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor outedge , const CGAL::Polyhedron_3&) { return outedge->next(); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor prev(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor outedge , const CGAL::Polyhedron_3&) { return outedge->prev(); } // // HalfedgeListGraph // template Iterator_range >::halfedge_iterator> halfedges(const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_iterator Iter; CGAL::Polyhedron_3& ncp = const_cast&>(p); return make_range(Iter(ncp.halfedges_begin()), Iter(ncp.halfedges_end())); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedges_size_type num_halfedges(const CGAL::Polyhedron_3& p) { return p.size_of_halfedges(); } // FaceGraph template typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor face(typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor h , const CGAL::Polyhedron_3&) { return h->face(); } template typename boost::graph_traits< CGAL::Polyhedron_3 >::halfedge_descriptor halfedge(typename boost::graph_traits< CGAL::Polyhedron_3 >::face_descriptor f , const CGAL::Polyhedron_3&) { return f->halfedge(); } template inline Iterator_range const>::face_iterator > faces(const CGAL::Polyhedron_3& p) { typedef typename boost::graph_traits< CGAL::Polyhedron_3 const>::face_iterator face_iterator; CGAL::Polyhedron_3& ncp = const_cast&>(p); return make_range( face_iterator(ncp.facets_begin()), face_iterator(ncp.facets_end())); } template typename boost::graph_traits< CGAL::Polyhedron_3 const>::faces_size_type num_faces(const CGAL::Polyhedron_3& p) { return p.size_of_facets(); } template void reserve(CGAL::Polyhedron_3& p, typename boost::graph_traits< CGAL::Polyhedron_3 >::vertices_size_type nv, typename boost::graph_traits< CGAL::Polyhedron_3 >::edges_size_type ne, typename boost::graph_traits< CGAL::Polyhedron_3 >::faces_size_type nf) { p.reserve(nv, 2*ne, nf); } template void normalize_border(CGAL::Polyhedron_3& p) { p.normalize_border(); } } // namespace CGAL #ifndef CGAL_NO_DEPRECATED_CODE namespace CGAL { template struct halfedge_graph_traits< CGAL::Polyhedron_3 > : CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > { typedef CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > Base; typedef typename Gt::Point_3 Point; typedef typename Base::edge_iterator undirected_edge_iterator; }; } // namespace CGAL #include namespace boost { // The following functions were defined in the namespace boost using CGAL::vertices; using CGAL::edges; using CGAL::num_vertices; using CGAL::num_edges; using CGAL::out_edges; using CGAL::in_edges; using CGAL::target; using CGAL::source; } // namespace boost #endif //CGAL_NO_DEPRECATED_CODE #include #include #include #undef CGAL_HDS_PARAM_ #endif // CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYHEDRON_3_H