From f877f14641d2627c51cab90f71546cfdc9f0edf6 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Wed, 20 Dec 2017 13:01:12 +1100 Subject: [PATCH] ue2_graph: more direct property_graph defn --- src/util/ue2_graph.h | 237 +++++++++++++++++++++++++------------------ 1 file changed, 140 insertions(+), 97 deletions(-) diff --git a/src/util/ue2_graph.h b/src/util/ue2_graph.h index 3879e640..b8e2e935 100644 --- a/src/util/ue2_graph.h +++ b/src/util/ue2_graph.h @@ -1025,229 +1025,208 @@ public: } }; +/** \brief Type trait to enable on whether the Graph is an ue2_graph. */ template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertex_descriptor>::type +struct is_ue2_graph + : public ::std::integral_constant< + bool, std::is_base_of::value> {}; + +template +typename std::enable_if::value, + typename Graph::vertex_descriptor>::type add_vertex(Graph &g) { return g.add_vertex_impl(); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_vertex(typename Graph::vertex_descriptor v, Graph &g) { g.remove_vertex_impl(v); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type clear_in_edges(typename Graph::vertex_descriptor v, Graph &g) { g.clear_in_edges_impl(v); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type clear_out_edges(typename Graph::vertex_descriptor v, Graph &g) { g.clear_out_edges_impl(v); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type clear_vertex(typename Graph::vertex_descriptor v, Graph &g) { g.clear_in_edges_impl(v); g.clear_out_edges_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertex_descriptor>::type +typename std::enable_if::value, + typename Graph::vertex_descriptor>::type source(typename Graph::edge_descriptor e, const Graph &) { return Graph::source_impl(e); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertex_descriptor>::type +typename std::enable_if::value, + typename Graph::vertex_descriptor>::type target(typename Graph::edge_descriptor e, const Graph &) { return Graph::target_impl(e); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::degree_size_type>::type +typename std::enable_if::value, + typename Graph::degree_size_type>::type out_degree(typename Graph::vertex_descriptor v, const Graph &) { return Graph::out_degree_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type out_edges(typename Graph::vertex_descriptor v, const Graph &) { return Graph::out_edges_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::degree_size_type>::type +typename std::enable_if::value, + typename Graph::degree_size_type>::type in_degree(typename Graph::vertex_descriptor v, const Graph &) { return Graph::in_degree_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type in_edges(typename Graph::vertex_descriptor v, const Graph &) { return Graph::in_edges_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::degree_size_type>::type +typename std::enable_if::value, + typename Graph::degree_size_type>::type degree(typename Graph::vertex_descriptor v, const Graph &) { return Graph::degree_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) { return Graph::adjacent_vertices_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type edge(typename Graph::vertex_descriptor u, typename Graph::vertex_descriptor v, const Graph &g) { return g.edge_impl(u, v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type inv_adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) { return Graph::inv_adjacent_vertices_impl(v); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type add_edge(typename Graph::vertex_descriptor u, typename Graph::vertex_descriptor v, Graph &g) { return g.add_edge_impl(u, v); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_edge(typename Graph::edge_descriptor e, Graph &g) { g.remove_edge_impl(e); } template typename std::enable_if< - !std::is_convertible::value - && std::is_base_of::value>::type + !std::is_convertible::value && + is_ue2_graph::value>::type remove_edge(Iter it, Graph &g) { g.remove_edge_impl(*it); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_out_edge_if(typename Graph::vertex_descriptor v, Predicate pred, Graph &g) { g.remove_out_edge_if_impl(v, pred); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_in_edge_if(typename Graph::vertex_descriptor v, Predicate pred, Graph &g) { g.remove_in_edge_if_impl(v, pred); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_edge_if(Predicate pred, Graph &g) { g.remove_edge_if_impl(pred); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type remove_edge(const typename Graph::vertex_descriptor &u, const typename Graph::vertex_descriptor &v, Graph &g) { g.remove_edge_impl(u, v); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertices_size_type>::type +typename std::enable_if::value, + typename Graph::vertices_size_type>::type num_vertices(const Graph &g) { return g.num_vertices_impl(); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type vertices(const Graph &g) { return g.vertices_impl(); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::edges_size_type>::type +typename std::enable_if::value, + typename Graph::edges_size_type>::type num_edges(const Graph &g) { return g.num_edges_impl(); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type edges(const Graph &g) { return g.edges_impl(); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertex_descriptor>::type +typename std::enable_if::value, + typename Graph::vertex_descriptor>::type add_vertex(const typename Graph::vertex_property_type &vp, Graph &g) { return g.add_vertex_impl(vp); } template -typename std::enable_if< - std::is_base_of::value, - std::pair>::type +typename std::enable_if::value, + std::pair>::type add_edge(typename Graph::vertex_descriptor u, typename Graph::vertex_descriptor v, const typename Graph::edge_property_type &ep, Graph &g) { @@ -1255,35 +1234,59 @@ add_edge(typename Graph::vertex_descriptor u, } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type renumber_edges(Graph &g) { g.renumber_edges_impl(); } template -typename std::enable_if< - std::is_base_of::value>::type +typename std::enable_if::value>::type renumber_vertices(Graph &g) { g.renumber_vertices_impl(); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::vertices_size_type>::type +typename std::enable_if::value, + typename Graph::vertices_size_type>::type vertex_index_upper_bound(const Graph &g) { return g.vertex_index_upper_bound_impl(); } template -typename std::enable_if< - std::is_base_of::value, - typename Graph::edges_size_type>::type +typename std::enable_if::value, + typename Graph::edges_size_type>::type edge_index_upper_bound(const Graph &g) { return g.edge_index_upper_bound_impl(); } +template struct pointer_to_member_traits {}; + +template +struct pointer_to_member_traits { + using member_type = Return; + using class_type = Class; +}; + +template +struct is_ue2_vertex_or_edge_property { + static constexpr bool value = false; +}; + +template +struct is_ue2_vertex_or_edge_property< + Graph, Property, typename std::enable_if::value && + std::is_member_object_pointer< + Property>::value>::type> { +private: + using class_type = typename pointer_to_member_traits::class_type; + using vertex_type = typename Graph::vertex_property_type; + using edge_type = typename Graph::edge_property_type; +public: + static constexpr bool value = + std::is_same::value || + std::is_same::value; +}; + using boost::vertex_index; using boost::edge_index; @@ -1295,13 +1298,53 @@ namespace boost { * adaptors (like filtered_graph) to know the type of the property maps */ template struct property_map::value - >::type > { - typedef decltype(get(std::declval(), - std::declval())) type; - typedef decltype(get(std::declval(), - std::declval())) const_type; + typename std::enable_if::value && + ue2::is_ue2_vertex_or_edge_property< + Graph, Prop>::value>::type> { +private: + using prop_traits = ue2::pointer_to_member_traits; + using member_type = typename prop_traits::member_type; + using class_type = typename prop_traits::class_type; +public: + using type = typename Graph::template prop_map; + using const_type = typename Graph::template prop_map; +}; + +template +struct property_map::value>::type> { + using v_prop_type = typename Graph::vertex_property_type; + using type = typename Graph::template prop_map; + using const_type = + typename Graph::template prop_map; +}; + +template +struct property_map::value>::type> { + using e_prop_type = typename Graph::edge_property_type; + using type = typename Graph::template prop_map; + using const_type = + typename Graph::template prop_map; +}; + +template +struct property_map::value>::type> { + using v_prop_type = typename Graph::vertex_property_type; + using type = typename Graph::template prop_map_all; + using const_type = + typename Graph::template prop_map_all; +}; + +template +struct property_map::value>::type> { + using e_prop_type = typename Graph::edge_property_type; + using type = typename Graph::template prop_map_all; + using const_type = + typename Graph::template prop_map_all; }; } // namespace boost