diff --git a/BGL/include/CGAL/boost/graph/graph_traits_HalfedgeDS.h b/BGL/include/CGAL/boost/graph/graph_traits_HalfedgeDS.h index cb3e8beed39..f989dd19e3d 100644 --- a/BGL/include/CGAL/boost/graph/graph_traits_HalfedgeDS.h +++ b/BGL/include/CGAL/boost/graph/graph_traits_HalfedgeDS.h @@ -233,7 +233,6 @@ struct HDS_graph_traits public : struct HDS_graph_traversal_category : public virtual boost::bidirectional_graph_tag, - // public virtual boost::adjacency_graph_tag, public virtual boost::vertex_list_graph_tag, public virtual boost::edge_list_graph_tag {}; diff --git a/BGL/include/CGAL/boost/graph/graph_traits_Polyhedron_3.h b/BGL/include/CGAL/boost/graph/graph_traits_Polyhedron_3.h index b6c90ce3bbe..048078f5dd1 100644 --- a/BGL/include/CGAL/boost/graph/graph_traits_Polyhedron_3.h +++ b/BGL/include/CGAL/boost/graph/graph_traits_Polyhedron_3.h @@ -31,45 +31,21 @@ #endif +// +// 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 -typename graph_traits< CGAL::Polyhedron_3 >::vertices_size_type -num_vertices(const CGAL::Polyhedron_3& p) -{ - return p.size_of_vertices(); -} - -template -typename graph_traits< CGAL::Polyhedron_3 >::edges_size_type -num_edges(const CGAL::Polyhedron_3& p) -{ - return p.size_of_halfedges() ; -} - -template -typename graph_traits< CGAL::Polyhedron_3 >::degree_size_type -degree(typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v, const CGAL::Polyhedron_3&) -{ - return v->vertex_degree() * 2 ; -} - -template -typename graph_traits< CGAL::Polyhedron_3 >::degree_size_type -out_degree(typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v, const CGAL::Polyhedron_3&) -{ - return v->vertex_degree(); -} - -template -typename graph_traits< CGAL::Polyhedron_3 >::degree_size_type -in_degree(typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor v, const CGAL::Polyhedron_3&) -{ - return v->vertex_degree(); -} - template struct graph_traits< CGAL::Polyhedron_3 > : CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > @@ -77,67 +53,109 @@ struct graph_traits< CGAL::Polyhedron_3 > template -typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor -source(typename graph_traits< CGAL::Polyhedron_3 >::edge_descriptor e, const CGAL::Polyhedron_3 & ) +struct graph_traits< CGAL::Polyhedron_3 const > + : CGAL::HDS_graph_traits< CGAL::Polyhedron_3 > // See NOTE above! +{}; + + +template +typename graph_traits< CGAL::Polyhedron_3 const>::vertices_size_type +num_vertices(const CGAL::Polyhedron_3& p) +{ + return p.size_of_vertices(); +} + +template +typename graph_traits< CGAL::Polyhedron_3 const>::edges_size_type +num_edges(const CGAL::Polyhedron_3& p) +{ + return p.size_of_halfedges() ; +} + +template +typename graph_traits< CGAL::Polyhedron_3 const>::degree_size_type +degree(typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v, const CGAL::Polyhedron_3&) +{ + return v->vertex_degree() * 2 ; +} + +template +typename graph_traits< CGAL::Polyhedron_3 const>::degree_size_type +out_degree(typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v, const CGAL::Polyhedron_3&) +{ + return v->vertex_degree(); +} + +template +typename graph_traits< CGAL::Polyhedron_3 const>::degree_size_type +in_degree(typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor v, const CGAL::Polyhedron_3&) +{ + return v->vertex_degree(); +} + + +template +typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor +source(typename graph_traits< CGAL::Polyhedron_3 const>::edge_descriptor e, const CGAL::Polyhedron_3 & ) { return e->opposite()->vertex(); } template -typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor -target(typename graph_traits< CGAL::Polyhedron_3 >::edge_descriptor e, const CGAL::Polyhedron_3 & ) +typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor +target(typename graph_traits< CGAL::Polyhedron_3 const>::edge_descriptor e, const CGAL::Polyhedron_3 & ) { return e->vertex(); } template -inline std::pair >::vertex_iterator - ,typename graph_traits< CGAL::Polyhedron_3 >::vertex_iterator +inline std::pair const>::vertex_iterator + ,typename graph_traits< CGAL::Polyhedron_3 const>::vertex_iterator > vertices( const CGAL::Polyhedron_3& p) { - typedef typename graph_traits< CGAL::Polyhedron_3 >::vertex_iterator Iter; + typedef typename graph_traits< CGAL::Polyhedron_3 const>::vertex_iterator Iter; CGAL::Polyhedron_3& ncp = const_cast&>(p); return std::make_pair( Iter(ncp.vertices_begin()), Iter(ncp.vertices_end()) ); } template -inline std::pair >::edge_iterator - ,typename graph_traits< CGAL::Polyhedron_3 >::edge_iterator +inline std::pair const>::edge_iterator + ,typename graph_traits< CGAL::Polyhedron_3 const>::edge_iterator > edges( const CGAL::Polyhedron_3& p) { - typedef typename graph_traits< CGAL::Polyhedron_3 >::edge_iterator Iter; + typedef typename graph_traits< CGAL::Polyhedron_3 const>::edge_iterator Iter; CGAL::Polyhedron_3& ncp = const_cast&>(p); return std::make_pair( Iter(ncp.halfedges_begin()), Iter(ncp.halfedges_end()) ); } template -inline std::pair >::in_edge_iterator - ,typename graph_traits< CGAL::Polyhedron_3 >::in_edge_iterator +inline std::pair const>::in_edge_iterator + ,typename graph_traits< CGAL::Polyhedron_3 const>::in_edge_iterator > -in_edges( typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor u, const CGAL::Polyhedron_3& g) +in_edges( typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor u, const CGAL::Polyhedron_3& g) { typename CGAL::Polyhedron_3::Halfedge_around_vertex_circulator ec = u->vertex_begin(); - typename graph_traits< CGAL::Polyhedron_3 >::edges_size_type in_deg = in_degree(u,g); - typedef typename graph_traits< CGAL::Polyhedron_3 >::in_edge_iterator Iter; + typename graph_traits< CGAL::Polyhedron_3 const>::edges_size_type in_deg = in_degree(u,g); + typedef typename graph_traits< CGAL::Polyhedron_3 const>::in_edge_iterator Iter; return std::make_pair( Iter(ec), Iter(ec,in_deg) ); } template -inline std::pair >::out_edge_iterator - ,typename graph_traits< CGAL::Polyhedron_3 >::out_edge_iterator +inline std::pair const>::out_edge_iterator + ,typename graph_traits< CGAL::Polyhedron_3 const>::out_edge_iterator > -out_edges( typename graph_traits< CGAL::Polyhedron_3 >::vertex_descriptor u, const CGAL::Polyhedron_3& g) +out_edges( typename graph_traits< CGAL::Polyhedron_3 const>::vertex_descriptor u, const CGAL::Polyhedron_3& g) { typename CGAL::Polyhedron_3::Halfedge_around_vertex_circulator ec = u->vertex_begin(); - typename graph_traits< CGAL::Polyhedron_3 >::edges_size_type out_deg = out_degree(u,g); - typedef typename graph_traits< CGAL::Polyhedron_3 >::out_edge_iterator Iter; + typename graph_traits< CGAL::Polyhedron_3 const>::edges_size_type out_deg = out_degree(u,g); + typedef typename graph_traits< CGAL::Polyhedron_3 const>::out_edge_iterator Iter; return std::make_pair( Iter(ec), Iter(ec,out_deg) ); } } // namespace boost -#undef CGAL_HDS_ +#undef CGAL_HDS_PARAM_ #endif // CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYHEDRON_3_H diff --git a/BGL/include/CGAL/boost/graph/properties_Polyhedron_3.h b/BGL/include/CGAL/boost/graph/properties_Polyhedron_3.h index 64e0dcf8395..d892ee1cf05 100644 --- a/BGL/include/CGAL/boost/graph/properties_Polyhedron_3.h +++ b/BGL/include/CGAL/boost/graph/properties_Polyhedron_3.h @@ -44,7 +44,7 @@ public: typedef boost::readable_property_map_tag category; typedef double value_type; typedef double reference; - typedef typename boost::graph_traits::edge_descriptor key_type; + typedef typename boost::graph_traits::edge_descriptor key_type; Polyhedron_edge_weight_map( Polyhedron const& ) {} @@ -66,7 +66,7 @@ public: typedef boost::readable_property_map_tag category; typedef bool value_type; typedef bool reference; - typedef typename boost::graph_traits::edge_descriptor key_type; + typedef typename boost::graph_traits::edge_descriptor key_type; Polyhedron_edge_is_border_map( Polyhedron const& ) {} @@ -85,7 +85,7 @@ public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef std::size_t reference; - typedef typename boost::graph_traits::edge_descriptor key_type; + typedef typename boost::graph_traits::edge_descriptor key_type; Polyhedron_edge_index_map_stored( Polyhedron const& ) {} @@ -104,16 +104,23 @@ public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef std::size_t reference; - typedef typename boost::graph_traits::edge_descriptor key_type; + typedef typename boost::graph_traits::edge_descriptor key_type; Polyhedron_edge_index_map_external( Polyhedron const& p) - : map( p.halfedges_begin(),p.halfedges_end(),0,std::size_t(-1),p.size_of_halfedges() ) + : map( remove_const(p).halfedges_begin() + , remove_const(p).halfedges_end() + , 0 + , std::size_t(-1) + , p.size_of_halfedges() + ) {} reference operator[](key_type const& e) const { return map[e]; } private: + static Polyhedron& remove_const ( Polyhedron const& p ) { return const_cast(p) ; } + CGAL::Unique_hash_map map ; }; @@ -155,7 +162,7 @@ public: typedef boost::readable_property_map_tag category; typedef Point_3 value_type; typedef Point_3 const& reference; - typedef typename boost::graph_traits::vertex_descriptor key_type; + typedef typename boost::graph_traits::vertex_descriptor key_type; Polyhedron_vertex_point_const_map( Polyhedron const& ) {} @@ -174,7 +181,7 @@ public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef std::size_t reference; - typedef typename boost::graph_traits::vertex_descriptor key_type; + typedef typename boost::graph_traits::vertex_descriptor key_type; Polyhedron_vertex_index_map_stored( Polyhedron const& ) {} @@ -193,16 +200,23 @@ public: typedef boost::readable_property_map_tag category; typedef std::size_t value_type; typedef std::size_t reference; - typedef typename boost::graph_traits::vertex_descriptor key_type; + typedef typename boost::graph_traits::vertex_descriptor key_type; Polyhedron_vertex_index_map_external( Polyhedron const& p) - : map( p.vertices_begin(),p.vertices_end(),0,std::size_t(-1),p.size_of_vertices() ) + : map( remove_const(p).vertices_begin() + , remove_const(p).vertices_end() + , 0 + , std::size_t(-1) + , p.size_of_vertices() + ) {} reference operator[](key_type const& v) const { return map[v]; } private: + static Polyhedron& remove_const ( Polyhedron const& p ) { return const_cast(p) ; } + CGAL::Unique_hash_map map ; };