ue2_graph: more direct property_graph defn

This commit is contained in:
Justin Viiret 2017-12-20 13:01:12 +11:00 committed by Chang, Harry
parent a1d4eec116
commit f877f14641

View File

@ -1025,229 +1025,208 @@ public:
} }
}; };
/** \brief Type trait to enable on whether the Graph is an ue2_graph. */
template<typename Graph> template<typename Graph>
typename std::enable_if< struct is_ue2_graph
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, : public ::std::integral_constant<
typename Graph::vertex_descriptor>::type bool, std::is_base_of<graph_detail::graph_base, Graph>::value> {};
template<typename Graph>
typename std::enable_if<is_ue2_graph<Graph>::value,
typename Graph::vertex_descriptor>::type
add_vertex(Graph &g) { add_vertex(Graph &g) {
return g.add_vertex_impl(); return g.add_vertex_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_vertex(typename Graph::vertex_descriptor v, Graph &g) { remove_vertex(typename Graph::vertex_descriptor v, Graph &g) {
g.remove_vertex_impl(v); g.remove_vertex_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
clear_in_edges(typename Graph::vertex_descriptor v, Graph &g) { clear_in_edges(typename Graph::vertex_descriptor v, Graph &g) {
g.clear_in_edges_impl(v); g.clear_in_edges_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
clear_out_edges(typename Graph::vertex_descriptor v, Graph &g) { clear_out_edges(typename Graph::vertex_descriptor v, Graph &g) {
g.clear_out_edges_impl(v); g.clear_out_edges_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
clear_vertex(typename Graph::vertex_descriptor v, Graph &g) { clear_vertex(typename Graph::vertex_descriptor v, Graph &g) {
g.clear_in_edges_impl(v); g.clear_in_edges_impl(v);
g.clear_out_edges_impl(v); g.clear_out_edges_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::vertex_descriptor>::type
typename Graph::vertex_descriptor>::type
source(typename Graph::edge_descriptor e, const Graph &) { source(typename Graph::edge_descriptor e, const Graph &) {
return Graph::source_impl(e); return Graph::source_impl(e);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::vertex_descriptor>::type
typename Graph::vertex_descriptor>::type
target(typename Graph::edge_descriptor e, const Graph &) { target(typename Graph::edge_descriptor e, const Graph &) {
return Graph::target_impl(e); return Graph::target_impl(e);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::degree_size_type>::type
typename Graph::degree_size_type>::type
out_degree(typename Graph::vertex_descriptor v, const Graph &) { out_degree(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::out_degree_impl(v); return Graph::out_degree_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::out_edge_iterator,
std::pair<typename Graph::out_edge_iterator, typename Graph::out_edge_iterator>>::type
typename Graph::out_edge_iterator>>::type
out_edges(typename Graph::vertex_descriptor v, const Graph &) { out_edges(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::out_edges_impl(v); return Graph::out_edges_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::degree_size_type>::type
typename Graph::degree_size_type>::type
in_degree(typename Graph::vertex_descriptor v, const Graph &) { in_degree(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::in_degree_impl(v); return Graph::in_degree_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::in_edge_iterator,
std::pair<typename Graph::in_edge_iterator, typename Graph::in_edge_iterator>>::type
typename Graph::in_edge_iterator>>::type
in_edges(typename Graph::vertex_descriptor v, const Graph &) { in_edges(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::in_edges_impl(v); return Graph::in_edges_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::degree_size_type>::type
typename Graph::degree_size_type>::type
degree(typename Graph::vertex_descriptor v, const Graph &) { degree(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::degree_impl(v); return Graph::degree_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::adjacency_iterator,
std::pair<typename Graph::adjacency_iterator, typename Graph::adjacency_iterator>>::type
typename Graph::adjacency_iterator>>::type
adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) { adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::adjacent_vertices_impl(v); return Graph::adjacent_vertices_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::edge_descriptor, bool>>::type
std::pair<typename Graph::edge_descriptor, bool>>::type
edge(typename Graph::vertex_descriptor u, typename Graph::vertex_descriptor v, edge(typename Graph::vertex_descriptor u, typename Graph::vertex_descriptor v,
const Graph &g) { const Graph &g) {
return g.edge_impl(u, v); return g.edge_impl(u, v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::inv_adjacency_iterator,
std::pair<typename Graph::inv_adjacency_iterator, typename Graph::inv_adjacency_iterator>>::type
typename Graph::inv_adjacency_iterator>>::type
inv_adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) { inv_adjacent_vertices(typename Graph::vertex_descriptor v, const Graph &) {
return Graph::inv_adjacent_vertices_impl(v); return Graph::inv_adjacent_vertices_impl(v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::edge_descriptor, bool>>::type
std::pair<typename Graph::edge_descriptor, bool>>::type
add_edge(typename Graph::vertex_descriptor u, add_edge(typename Graph::vertex_descriptor u,
typename Graph::vertex_descriptor v, Graph &g) { typename Graph::vertex_descriptor v, Graph &g) {
return g.add_edge_impl(u, v); return g.add_edge_impl(u, v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_edge(typename Graph::edge_descriptor e, Graph &g) { remove_edge(typename Graph::edge_descriptor e, Graph &g) {
g.remove_edge_impl(e); g.remove_edge_impl(e);
} }
template<typename Graph, typename Iter> template<typename Graph, typename Iter>
typename std::enable_if< typename std::enable_if<
!std::is_convertible<Iter, typename Graph::edge_descriptor>::value !std::is_convertible<Iter, typename Graph::edge_descriptor>::value &&
&& std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type is_ue2_graph<Graph>::value>::type
remove_edge(Iter it, Graph &g) { remove_edge(Iter it, Graph &g) {
g.remove_edge_impl(*it); g.remove_edge_impl(*it);
} }
template<typename Graph, typename Predicate> template<typename Graph, typename Predicate>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_out_edge_if(typename Graph::vertex_descriptor v, Predicate pred, remove_out_edge_if(typename Graph::vertex_descriptor v, Predicate pred,
Graph &g) { Graph &g) {
g.remove_out_edge_if_impl(v, pred); g.remove_out_edge_if_impl(v, pred);
} }
template<typename Graph, typename Predicate> template<typename Graph, typename Predicate>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_in_edge_if(typename Graph::vertex_descriptor v, Predicate pred, remove_in_edge_if(typename Graph::vertex_descriptor v, Predicate pred,
Graph &g) { Graph &g) {
g.remove_in_edge_if_impl(v, pred); g.remove_in_edge_if_impl(v, pred);
} }
template<typename Graph, typename Predicate> template<typename Graph, typename Predicate>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_edge_if(Predicate pred, Graph &g) { remove_edge_if(Predicate pred, Graph &g) {
g.remove_edge_if_impl(pred); g.remove_edge_if_impl(pred);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
remove_edge(const typename Graph::vertex_descriptor &u, remove_edge(const typename Graph::vertex_descriptor &u,
const typename Graph::vertex_descriptor &v, Graph &g) { const typename Graph::vertex_descriptor &v, Graph &g) {
g.remove_edge_impl(u, v); g.remove_edge_impl(u, v);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::vertices_size_type>::type
typename Graph::vertices_size_type>::type
num_vertices(const Graph &g) { num_vertices(const Graph &g) {
return g.num_vertices_impl(); return g.num_vertices_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::vertex_iterator,
std::pair<typename Graph::vertex_iterator, typename Graph::vertex_iterator>>::type
typename Graph::vertex_iterator>>::type
vertices(const Graph &g) { vertices(const Graph &g) {
return g.vertices_impl(); return g.vertices_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::edges_size_type>::type
typename Graph::edges_size_type>::type
num_edges(const Graph &g) { num_edges(const Graph &g) {
return g.num_edges_impl(); return g.num_edges_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::edge_iterator,
std::pair<typename Graph::edge_iterator, typename Graph::edge_iterator>>::type
typename Graph::edge_iterator>>::type
edges(const Graph &g) { edges(const Graph &g) {
return g.edges_impl(); return g.edges_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::vertex_descriptor>::type
typename Graph::vertex_descriptor>::type
add_vertex(const typename Graph::vertex_property_type &vp, Graph &g) { add_vertex(const typename Graph::vertex_property_type &vp, Graph &g) {
return g.add_vertex_impl(vp); return g.add_vertex_impl(vp);
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, std::pair<typename Graph::edge_descriptor, bool>>::type
std::pair<typename Graph::edge_descriptor, bool>>::type
add_edge(typename Graph::vertex_descriptor u, add_edge(typename Graph::vertex_descriptor u,
typename Graph::vertex_descriptor v, typename Graph::vertex_descriptor v,
const typename Graph::edge_property_type &ep, Graph &g) { const typename Graph::edge_property_type &ep, Graph &g) {
@ -1255,35 +1234,59 @@ add_edge(typename Graph::vertex_descriptor u,
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
renumber_edges(Graph &g) { renumber_edges(Graph &g) {
g.renumber_edges_impl(); g.renumber_edges_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value>::type
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value>::type
renumber_vertices(Graph &g) { renumber_vertices(Graph &g) {
g.renumber_vertices_impl(); g.renumber_vertices_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::vertices_size_type>::type
typename Graph::vertices_size_type>::type
vertex_index_upper_bound(const Graph &g) { vertex_index_upper_bound(const Graph &g) {
return g.vertex_index_upper_bound_impl(); return g.vertex_index_upper_bound_impl();
} }
template<typename Graph> template<typename Graph>
typename std::enable_if< typename std::enable_if<is_ue2_graph<Graph>::value,
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value, typename Graph::edges_size_type>::type
typename Graph::edges_size_type>::type
edge_index_upper_bound(const Graph &g) { edge_index_upper_bound(const Graph &g) {
return g.edge_index_upper_bound_impl(); return g.edge_index_upper_bound_impl();
} }
template<typename T> struct pointer_to_member_traits {};
template<typename Return, typename Class>
struct pointer_to_member_traits<Return(Class::*)> {
using member_type = Return;
using class_type = Class;
};
template<typename Graph, typename Property, typename Enable = void>
struct is_ue2_vertex_or_edge_property {
static constexpr bool value = false;
};
template<typename Graph, typename Property>
struct is_ue2_vertex_or_edge_property<
Graph, Property, typename std::enable_if<is_ue2_graph<Graph>::value &&
std::is_member_object_pointer<
Property>::value>::type> {
private:
using class_type = typename pointer_to_member_traits<Property>::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<class_type, vertex_type>::value ||
std::is_same<class_type, edge_type>::value;
};
using boost::vertex_index; using boost::vertex_index;
using boost::edge_index; using boost::edge_index;
@ -1295,13 +1298,53 @@ namespace boost {
* adaptors (like filtered_graph) to know the type of the property maps */ * adaptors (like filtered_graph) to know the type of the property maps */
template<typename Graph, typename Prop> template<typename Graph, typename Prop>
struct property_map<Graph, Prop, struct property_map<Graph, Prop,
typename std::enable_if< typename std::enable_if<ue2::is_ue2_graph<Graph>::value &&
std::is_base_of<ue2::graph_detail::graph_base, Graph>::value ue2::is_ue2_vertex_or_edge_property<
>::type > { Graph, Prop>::value>::type> {
typedef decltype(get(std::declval<Prop>(), private:
std::declval<Graph &>())) type; using prop_traits = ue2::pointer_to_member_traits<Prop>;
typedef decltype(get(std::declval<Prop>(), using member_type = typename prop_traits::member_type;
std::declval<const Graph &>())) const_type; using class_type = typename prop_traits::class_type;
public:
using type = typename Graph::template prop_map<member_type &, class_type>;
using const_type = typename Graph::template prop_map<const member_type &,
class_type>;
};
template<typename Graph>
struct property_map<Graph, vertex_index_t,
typename std::enable_if<ue2::is_ue2_graph<Graph>::value>::type> {
using v_prop_type = typename Graph::vertex_property_type;
using type = typename Graph::template prop_map<size_t &, v_prop_type>;
using const_type =
typename Graph::template prop_map<const size_t &, v_prop_type>;
};
template<typename Graph>
struct property_map<Graph, edge_index_t,
typename std::enable_if<ue2::is_ue2_graph<Graph>::value>::type> {
using e_prop_type = typename Graph::edge_property_type;
using type = typename Graph::template prop_map<size_t &, e_prop_type>;
using const_type =
typename Graph::template prop_map<const size_t &, e_prop_type>;
};
template<typename Graph>
struct property_map<Graph, vertex_all_t,
typename std::enable_if<ue2::is_ue2_graph<Graph>::value>::type> {
using v_prop_type = typename Graph::vertex_property_type;
using type = typename Graph::template prop_map_all<v_prop_type &>;
using const_type =
typename Graph::template prop_map_all<const v_prop_type &>;
};
template<typename Graph>
struct property_map<Graph, edge_all_t,
typename std::enable_if<ue2::is_ue2_graph<Graph>::value>::type> {
using e_prop_type = typename Graph::edge_property_type;
using type = typename Graph::template prop_map_all<e_prop_type &>;
using const_type =
typename Graph::template prop_map_all<const e_prop_type &>;
}; };
} // namespace boost } // namespace boost