From 793931be88b1e438cd7a079c8a20eaefcbe875b6 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 2 May 2017 14:21:45 +0200 Subject: [PATCH] Add templates for the index maps in the class type. --- .../boost/graph/Connected_components_graph.h | 442 +++++++++++------- 1 file changed, 282 insertions(+), 160 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Connected_components_graph.h b/BGL/include/CGAL/boost/graph/Connected_components_graph.h index 9f0942fb6c6..f37d4450ac2 100644 --- a/BGL/include/CGAL/boost/graph/Connected_components_graph.h +++ b/BGL/include/CGAL/boost/graph/Connected_components_graph.h @@ -39,8 +39,7 @@ namespace CGAL * * The class `Connected_components_graph` wraps a graph into another graph in such a way that only the specified connected components are seen from the outside. * - * For example, calling `vertices(graph)` will return an iterator range of all but only the vertices that belong to the connected components whose ids in the - * `FaceComponentMap` are contained in the given set. + * For example, calling `vertices(graph)` will return an iterator range of all but only the vertices that belong to the selected connected components. * * \tparam Graph must be a model of a `FaceListGraph` and `HalfedgeListGraph`. * @@ -48,7 +47,10 @@ namespace CGAL * \cgalModels `HalfedgeListGraph` */ -template +template::type, + typename VImap = typename boost::property_map::type, + typename HImap = typename boost::property_map::type> struct Connected_components_graph { typedef boost::graph_traits gt; @@ -56,10 +58,7 @@ struct Connected_components_graph typedef typename gt::halfedge_descriptor halfedge_descriptor; typedef typename gt::edge_descriptor edge_descriptor; typedef typename gt::face_descriptor face_descriptor; - typedef Connected_components_graph Self; - typedef typename boost::property_map::type FImap; - typedef typename boost::property_map::type VImap; - typedef typename boost::property_map::type HImap; + typedef Connected_components_graph Self; /*! * \brief Creates a Connected_components_graph of the connected components of `graph` specified in the range @@ -223,10 +222,13 @@ private: namespace boost { -template -struct graph_traits< CGAL::Connected_components_graph > +template +struct graph_traits< CGAL::Connected_components_graph > { - typedef CGAL::Connected_components_graph G; + typedef CGAL::Connected_components_graph G; typedef boost::graph_traits BGTG; typedef typename BGTG::vertex_descriptor vertex_descriptor; typedef typename BGTG::halfedge_descriptor halfedge_descriptor; @@ -271,9 +273,12 @@ struct graph_traits< CGAL::Connected_components_graph > } }; -template -struct graph_traits< const CGAL::Connected_components_graph > - : public graph_traits< CGAL::Connected_components_graph > +template +struct graph_traits< const CGAL::Connected_components_graph > + : public graph_traits< CGAL::Connected_components_graph > {}; @@ -281,62 +286,83 @@ struct graph_traits< const CGAL::Connected_components_graph > namespace CGAL { -template +template bool -in_CC(const typename boost::graph_traits< Connected_components_graph >::face_descriptor f, - const Connected_components_graph & w) +in_CC(const typename boost::graph_traits< Connected_components_graph >::face_descriptor f, + const Connected_components_graph & w) { return w.is_in_cc(f); } -template +template bool -in_CC(const typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +in_CC(const typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { return w.is_in_cc(h); } -template +template bool -in_CC(const typename boost::graph_traits< Connected_components_graph >::edge_descriptor e, - const Connected_components_graph & w) +in_CC(const typename boost::graph_traits< Connected_components_graph >::edge_descriptor e, + const Connected_components_graph & w) { return w.is_in_cc(halfedge(e, w.graph())); } -template +template bool -in_CC(const typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, - const Connected_components_graph & w) +in_CC(const typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, + const Connected_components_graph & w) { return w.is_in_cc(v); } -template +template typename boost::graph_traits::vertices_size_type -num_vertices(const Connected_components_graph& w) +num_vertices(const Connected_components_graph& w) { return w.number_of_vertices(); } -template +template typename boost::graph_traits::edges_size_type -num_edges(const Connected_components_graph& w) +num_edges(const Connected_components_graph& w) { return w.number_of_halfedges()/2; } -template +template typename boost::graph_traits::degree_size_type -degree(typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph& w) +degree(typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph& w) { CGAL_assertion(in_CC(v, w)); typename boost::graph_traits::degree_size_type v_deg = 0; - typename boost::graph_traits >::halfedge_descriptor h = halfedge(v, w); - typename boost::graph_traits >::halfedge_descriptor hcirc = h; + typename boost::graph_traits >::halfedge_descriptor h = halfedge(v, w); + typename boost::graph_traits >::halfedge_descriptor hcirc = h; do { if(in_CC(hcirc, w)) @@ -346,109 +372,136 @@ degree(typename boost::graph_traits >::vertex_ return v_deg; } -template +template typename boost::graph_traits::degree_size_type -out_degree(typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph& w) +out_degree(typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph& w) { CGAL_assertion(in_CC(v, w)); return std::distance(out_edges(v, w).first ,out_edges(v, w).second); } -template +template typename boost::graph_traits::degree_size_type -in_degree(typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph& w) +in_degree(typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph& w) { CGAL_assertion(in_CC(v, w)); return std::distance(in_edges(v, w).first ,in_edges(v, w).second); } -template -typename boost::graph_traits >::vertex_descriptor -source(typename boost::graph_traits >::edge_descriptor e, - const Connected_components_graph & w) +template +typename boost::graph_traits >::vertex_descriptor +source(typename boost::graph_traits >::edge_descriptor e, + const Connected_components_graph & w) { CGAL_assertion(in_CC(e, w)); return source(e, w.graph()); } -template -typename boost::graph_traits >::vertex_descriptor -target(typename boost::graph_traits >::edge_descriptor e, - const Connected_components_graph & w) +template +typename boost::graph_traits >::vertex_descriptor +target(typename boost::graph_traits >::edge_descriptor e, + const Connected_components_graph & w) { CGAL_assertion(in_CC(e, w)); return target(e, w.graph()); } -template -std::pair >::edge_descriptor, bool> -edge(typename boost::graph_traits >::vertex_descriptor u, - typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph & w) +template +std::pair >::edge_descriptor, bool> +edge(typename boost::graph_traits >::vertex_descriptor u, + typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph & w) { CGAL_assertion(in_CC(u, w) && in_CC(v, w)); - typename boost::graph_traits >::edge_descriptor e = edge(u, v, w.graph()).first; + typename boost::graph_traits >::edge_descriptor e = edge(u, v, w.graph()).first; bool res = in_CC(e, w); return std::make_pair(e, res); } -template -CGAL::Iterator_range >::vertex_iterator> -vertices(const Connected_components_graph & w) +template +CGAL::Iterator_range >::vertex_iterator> +vertices(const Connected_components_graph & w) { - typedef typename boost::graph_traits >::vertex_iterator vertex_iterator; + typedef typename boost::graph_traits >::vertex_iterator vertex_iterator; typedef typename boost::graph_traits::vertex_iterator g_vertex_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); g_vertex_iterator b,e; boost::tie(b,e) = vertices(w.graph()); return make_range(vertex_iterator(predicate, b, e), vertex_iterator(predicate, e, e)); } -template -CGAL::Iterator_range >::edge_iterator> -edges(const Connected_components_graph & w) +template +CGAL::Iterator_range >::edge_iterator> +edges(const Connected_components_graph & w) { - typedef typename boost::graph_traits >::edge_iterator edge_iterator; + typedef typename boost::graph_traits >::edge_iterator edge_iterator; typedef typename boost::graph_traits::edge_iterator g_edge_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); g_edge_iterator b,e; boost::tie(b,e) = edges(w.graph()); return make_range(edge_iterator(predicate, b, e), edge_iterator(predicate, e, e)); } -template -CGAL::Iterator_range >::out_edge_iterator> -out_edges(typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph & w) +template +CGAL::Iterator_range >::out_edge_iterator> +out_edges(typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph & w) { - typedef typename boost::graph_traits >::out_edge_iterator out_edge_iterator; + typedef typename boost::graph_traits >::out_edge_iterator out_edge_iterator; typedef typename boost::graph_traits::out_edge_iterator g_out_edge_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); g_out_edge_iterator b,e; boost::tie(b,e) = out_edges(v, w.graph()); return make_range(out_edge_iterator(predicate, b, e), out_edge_iterator(predicate, e, e)); } -template -CGAL::Iterator_range >::in_edge_iterator> -in_edges(typename boost::graph_traits >::vertex_descriptor v, - const Connected_components_graph & w) +template +CGAL::Iterator_range >::in_edge_iterator> +in_edges(typename boost::graph_traits >::vertex_descriptor v, + const Connected_components_graph & w) { - typedef typename boost::graph_traits >::in_edge_iterator in_edge_iterator; + typedef typename boost::graph_traits >::in_edge_iterator in_edge_iterator; typedef typename boost::graph_traits::in_edge_iterator g_in_edge_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); g_in_edge_iterator b,e; boost::tie(b,e) = in_edges(v, w.graph()); return make_range(in_edge_iterator(predicate, b, e), @@ -458,106 +511,133 @@ in_edges(typename boost::graph_traits >::verte // // HalfedgeGraph // -template -typename boost::graph_traits< Connected_components_graph >::edge_descriptor -edge(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::edge_descriptor +edge(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(CGAL::in_CC(h, w)); return edge(h, w.graph()); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -halfedge(typename boost::graph_traits< Connected_components_graph >::edge_descriptor e, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +halfedge(typename boost::graph_traits< Connected_components_graph >::edge_descriptor e, + const Connected_components_graph & w) { CGAL_assertion(CGAL::in_CC(e, w)); return halfedge(e, w.graph()); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -halfedge(typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +halfedge(typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, + const Connected_components_graph & w) { CGAL_assertion(in_CC(v, w)); - typename boost::graph_traits >::halfedge_descriptor h = halfedge(v, w.graph()); - typename boost::graph_traits >::halfedge_descriptor hcirc = h; + typename boost::graph_traits >::halfedge_descriptor h = halfedge(v, w.graph()); + typename boost::graph_traits >::halfedge_descriptor hcirc = h; do { if(in_CC(hcirc, w)) return hcirc; hcirc = opposite(next(hcirc, w.graph()), w.graph()); }while(hcirc != h); - return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); + return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); } -template -std::pair >::halfedge_descriptor, bool> -halfedge(typename boost::graph_traits< Connected_components_graph >::vertex_descriptor u, - typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, - const Connected_components_graph & w) +template +std::pair >::halfedge_descriptor, bool> +halfedge(typename boost::graph_traits< Connected_components_graph >::vertex_descriptor u, + typename boost::graph_traits< Connected_components_graph >::vertex_descriptor v, + const Connected_components_graph & w) { CGAL_assertion(in_CC(u, w) && in_CC(v, w)); - typename boost::graph_traits >::halfedge_descriptor h = halfedge(u, v, w.graph()).first; + typename boost::graph_traits >::halfedge_descriptor h = halfedge(u, v, w.graph()).first; return std::make_pair(h, in_CC(h, w)); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -opposite(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +opposite(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(in_CC(h, w) ); return opposite(h, w.graph()); } -template -typename boost::graph_traits< Connected_components_graph >::vertex_descriptor -source(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::vertex_descriptor +source(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(in_CC(h, w) ); return source(h, w.graph()); } -template -typename boost::graph_traits< Connected_components_graph >::vertex_descriptor -target(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::vertex_descriptor +target(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(in_CC(h, w) ); return target(h, w.graph()); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -next(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +next(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(in_CC(h, w)); if(in_CC(next(h, w.graph()), w)) return next(h, w.graph()); - //act as a border - BOOST_FOREACH(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor hcirc - , CGAL::halfedges_around_target(target(h, w.graph()), w.graph())) + typedef typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h_d; + BOOST_FOREACH( h_d hcirc, + CGAL::halfedges_around_target(target(h, w.graph()), w.graph())) { if(hcirc != h && in_CC(hcirc, w)) { return opposite(hcirc, w.graph()); } } - return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); + return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -prev(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +prev(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(in_CC(h, w)); @@ -565,30 +645,34 @@ prev(typename boost::graph_traits< Connected_components_graph >::halfedge return prev(h, w.graph()); //act as a border - BOOST_FOREACH(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor hcirc - , CGAL::halfedges_around_source(source(h, w.graph()), w.graph())) + typedef typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h_d; + BOOST_FOREACH(h_d hcirc, + CGAL::halfedges_around_source(source(h, w.graph()), w.graph())) { if(hcirc != h && in_CC(hcirc, w)) { return opposite(hcirc, w.graph()); } } - return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); + return boost::graph_traits< CGAL::Connected_components_graph >::null_halfedge(); } // // HalfedgeListGraph // -template -std::pair >::halfedge_iterator, -typename boost::graph_traits >::halfedge_iterator> -halfedges(const Connected_components_graph & w) +template +std::pair >::halfedge_iterator, +typename boost::graph_traits >::halfedge_iterator> +halfedges(const Connected_components_graph & w) { - typedef typename boost::graph_traits >::halfedge_iterator halfedge_iterator; + typedef typename boost::graph_traits >::halfedge_iterator halfedge_iterator; typedef typename boost::graph_traits::halfedge_iterator g_halfedge_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); std::pair original_halfedges = halfedges(w.graph()); return make_range(halfedge_iterator(predicate, original_halfedges.first, original_halfedges.second), @@ -596,44 +680,56 @@ halfedges(const Connected_components_graph & w) } -template +template typename boost::graph_traits::halfedges_size_type -num_halfedges(const Connected_components_graph & w) +num_halfedges(const Connected_components_graph & w) { return w.number_of_halfedges(); } // FaceGraph -template -typename boost::graph_traits< Connected_components_graph >::face_descriptor -face(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::face_descriptor +face(typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor h, + const Connected_components_graph & w) { CGAL_assertion(CGAL::in_CC(h, w)); if(in_CC(h, w)) return face(h,w.graph()); else - return boost::graph_traits< CGAL::Connected_components_graph >::null_face(); + return boost::graph_traits< CGAL::Connected_components_graph >::null_face(); } -template -typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor -halfedge(typename boost::graph_traits< Connected_components_graph >::face_descriptor f, - const Connected_components_graph & w) +template +typename boost::graph_traits< Connected_components_graph >::halfedge_descriptor +halfedge(typename boost::graph_traits< Connected_components_graph >::face_descriptor f, + const Connected_components_graph & w) { CGAL_assertion(CGAL::in_CC(f, w)); return halfedge(f,w.graph()); } -template -Iterator_range >::face_iterator> -faces(const Connected_components_graph & w) +template +Iterator_range >::face_iterator> +faces(const Connected_components_graph & w) { - typedef typename boost::graph_traits >::face_iterator face_iterator; + typedef typename boost::graph_traits >::face_iterator face_iterator; typedef typename boost::graph_traits::face_iterator g_face_iterator; - typename Connected_components_graph ::Is_simplex_valid predicate(&w); + typename Connected_components_graph ::Is_simplex_valid predicate(&w); std::pair original_faces = faces(w.graph()); return make_range(face_iterator(predicate, original_faces.first, original_faces.second), @@ -642,42 +738,60 @@ faces(const Connected_components_graph & w) -template +template typename boost::graph_traits::vertices_size_type -num_faces(const Connected_components_graph & w) +num_faces(const Connected_components_graph & w) { return w.number_of_faces(); } -template +template bool -in_CC(const Connected_components_graph & w, bool verbose = false) +in_CC(const Connected_components_graph & w, bool verbose = false) { return in_CC(w.graph(),verbose); } -template +template typename boost::property_map::type -get(PropertyTag ptag, const Connected_components_graph& w) +get(PropertyTag ptag, const Connected_components_graph& w) { return get(ptag, w.graph()); } -template +template typename boost::property_traits::type>::value_type get(PropertyTag ptag, - const Connected_components_graph& w, + const Connected_components_graph& w, const typename boost::property_traits::type>::key_type& k) { return get(ptag, w.graph(), k); } -template +template void -put(PropertyTag ptag, const Connected_components_graph& w, +put(PropertyTag ptag, const Connected_components_graph& w, const typename boost::property_traits::type>::key_type& k, typename boost::property_traits::type>::value_type& v) { @@ -687,14 +801,22 @@ put(PropertyTag ptag, const Connected_components_graph& w, }//end namespace CGAL namespace boost { -template -struct property_map,PropertyTag> { +template +struct property_map,PropertyTag> { typedef typename boost::property_map::type type; typedef typename boost::property_map::const_type const_type; }; -template -struct graph_has_property, PropertyTag> +template +struct graph_has_property, PropertyTag> : graph_has_property {}; }// namespace boost