2
0
mirror of https://github.com/boostorg/graph.git synced 2026-01-19 04:12:11 +00:00

Add a test for the all defaults overload with custom properties

This commit is contained in:
Sebastian Brockmeyer
2022-10-15 22:17:00 +02:00
parent e9852ef6a0
commit a487ba019d

View File

@@ -174,14 +174,109 @@ template < typename EdgeDescriptor > struct Link
EdgeDescriptor edge_reverse;
};
typedef adjacency_list_traits< vecS, vecS, directedS > tTraits;
typedef Node< tTraits::edge_descriptor > tVertex;
typedef Link< tTraits::edge_descriptor > tEdge;
typedef adjacency_list< vecS, vecS, directedS, tVertex, tEdge > tBundleGraph;
namespace boost
{
template <> struct property_map< tBundleGraph, edge_capacity_t >
{
typedef adj_list_edge_property_map< directed_tag, long, long&, size_t,
tEdge, long tEdge::* >
type;
typedef adj_list_edge_property_map< directed_tag, long, const long&, size_t,
const tEdge, long tEdge::* >
const_type;
};
template <> struct property_map< tBundleGraph, edge_residual_capacity_t >
{
typedef adj_list_edge_property_map< directed_tag, long, long&, size_t,
tEdge, long tEdge::* >
type;
typedef adj_list_edge_property_map< directed_tag, long, const long&, size_t,
const tEdge, long tEdge::* >
const_type;
};
template <> struct property_map< tBundleGraph, edge_reverse_t >
{
typedef adj_list_edge_property_map< directed_tag, tTraits::edge_descriptor,
tTraits::edge_descriptor&, size_t, tEdge,
tTraits::edge_descriptor tEdge::* >
type;
typedef adj_list_edge_property_map< directed_tag, tTraits::edge_descriptor,
const tTraits::edge_descriptor&, size_t, const tEdge,
tTraits::edge_descriptor tEdge::* >
const_type;
};
template <> struct property_map< tBundleGraph, vertex_predecessor_t >
{
typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*,
tTraits::edge_descriptor, tTraits::edge_descriptor&,
tTraits::edge_descriptor tVertex::* >
type;
typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*,
tTraits::edge_descriptor, const tTraits::edge_descriptor&,
tTraits::edge_descriptor tVertex::* >
const_type;
};
template <> struct property_map< tBundleGraph, vertex_color_t >
{
typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*,
default_color_type, default_color_type&, default_color_type tVertex::* >
type;
typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*,
default_color_type, const default_color_type&,
default_color_type tVertex::* >
const_type;
};
template <> struct property_map< tBundleGraph, vertex_distance_t >
{
typedef vec_adj_list_vertex_property_map< tBundleGraph, tBundleGraph*, long,
long&, long tVertex::* >
type;
typedef vec_adj_list_vertex_property_map< tBundleGraph, const tBundleGraph*,
long, const long&, long tVertex::* >
const_type;
};
}
property_map< tBundleGraph, edge_capacity_t >::const_type get(
edge_capacity_t, const tBundleGraph& g)
{
return get(&tEdge::edge_capacity, g);
}
property_map< tBundleGraph, edge_residual_capacity_t >::type get(
edge_residual_capacity_t, tBundleGraph& g)
{
return get(&tEdge::edge_residual_capacity, g);
}
property_map< tBundleGraph, edge_reverse_t >::const_type get(
edge_reverse_t, const tBundleGraph& g)
{
return get(&tEdge::edge_reverse, g);
}
property_map< tBundleGraph, vertex_predecessor_t >::type get(
vertex_predecessor_t, tBundleGraph& g)
{
return get(&tVertex::vertex_predecessor, g);
}
property_map< tBundleGraph, vertex_color_t >::type get(
vertex_color_t, tBundleGraph& g)
{
return get(&tVertex::vertex_color, g);
}
property_map< tBundleGraph, vertex_distance_t >::type get(
vertex_distance_t, tBundleGraph& g)
{
return get(&tVertex::vertex_distance, g);
}
long test_bundled_properties(int n_verts, int n_edges, std::size_t seed)
{
typedef adjacency_list_traits< vecS, vecS, directedS > tTraits;
typedef Node< tTraits::edge_descriptor > tVertex;
typedef Link< tTraits::edge_descriptor > tEdge;
typedef adjacency_list< vecS, vecS, directedS, tVertex, tEdge >
tBundleGraph;
tBundleGraph g;
graph_traits< tBundleGraph >::vertex_descriptor src, sink;
@@ -189,6 +284,8 @@ long test_bundled_properties(int n_verts, int n_edges, std::size_t seed)
= fill_random_max_flow_graph(g, get(&tEdge::edge_capacity, g),
get(&tEdge::edge_reverse, g), n_verts, n_edges, seed);
long flow_all_defaults_overload = boykov_kolmogorov_max_flow(g, src, sink);
long flow_unnamed_overload = boykov_kolmogorov_max_flow(g,
get(&tEdge::edge_capacity, g), get(&tEdge::edge_residual_capacity, g),
get(&tEdge::edge_reverse, g), get(&tVertex::vertex_predecessor, g),
@@ -204,6 +301,7 @@ long test_bundled_properties(int n_verts, int n_edges, std::size_t seed)
.distance_map(get(&tVertex::vertex_distance, g))
.vertex_index_map(get(vertex_index, g)));
BOOST_TEST(flow_all_defaults_overload == flow_unnamed_overload);
BOOST_TEST(flow_unnamed_overload == flow_named_overload);
return flow_named_overload;
}