1 // (C) Copyright 2009 Andrew Sutton
2 //
3 // Use, modification and distribution are subject to the
4 // Boost Software License, Version 1.0 (See accompanying file
5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
6
7 #ifndef TEST_PROPERTIES_HPP
8 #define TEST_PROPERTIES_HPP
9
10 #include <boost/concept/assert.hpp>
11
as_const(T & x)12 template < typename T > T const& as_const(T& x) { return x; }
ignore(T const &)13 template < typename T > void ignore(T const&) {}
14
test_graph_bundle(Graph & g,boost::mpl::true_)15 template < typename Graph > void test_graph_bundle(Graph& g, boost::mpl::true_)
16 {
17 using namespace boost;
18 std::cout << "...test_graph_bundle\n";
19
20 GraphBundle& b1 = g[graph_bundle];
21 GraphBundle& b2 = get_property(g);
22 ignore(b1);
23 ignore(b2);
24
25 GraphBundle const& cb1 = ::as_const(g)[graph_bundle];
26 GraphBundle const& cb2 = get_property(g);
27 ignore(cb1);
28 ignore(cb2);
29 }
30
test_graph_bundle(Graph & g,boost::mpl::false_)31 template < typename Graph > void test_graph_bundle(Graph& g, boost::mpl::false_)
32 {
33 }
34
35 /** @name Test Vertex Bundle
36 * Exercise the vertex bundle. Note that this is expected to be of type
37 * VertexBundle.
38 */
39 //@{
40 template < typename Graph, typename VertexSet >
test_vertex_bundle(Graph & g,VertexSet const & verts,boost::mpl::true_)41 void test_vertex_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_)
42 {
43 using namespace boost;
44 BOOST_CONCEPT_ASSERT((GraphConcept< Graph >));
45 typedef typename graph_traits< Graph >::vertex_descriptor Vertex;
46 BOOST_CONCEPT_ASSERT(
47 (PropertyGraphConcept< Graph, Vertex, vertex_bundle_t >));
48
49 // Test bundling via the graph object on the lollipop vertex.
50 Vertex v = verts[5];
51 VertexBundle& b = g[v];
52 b.value = 10;
53 BOOST_ASSERT(g[v].value == 10);
54
55 // Test bundling via the property map.
56 typedef typename property_map< Graph, int VertexBundle::* >::type BundleMap;
57 BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept< BundleMap, Vertex >));
58 BundleMap map = get(&VertexBundle::value, g);
59 put(map, v, 5);
60 BOOST_ASSERT(get(map, v) == 5);
61
62 typedef typename property_map< Graph, int VertexBundle::* >::const_type
63 ConstBundleMap;
64 BOOST_CONCEPT_ASSERT(
65 (ReadablePropertyMapConcept< ConstBundleMap, Vertex >));
66 ConstBundleMap cmap = get(&VertexBundle::value, (Graph const&)g);
67 BOOST_ASSERT(get(cmap, v) == 5);
68 }
69
70 template < typename Graph, typename VertexSet >
test_vertex_bundle(Graph &,VertexSet const &,boost::mpl::false_)71 void test_vertex_bundle(Graph&, VertexSet const&, boost::mpl::false_)
72 {
73 }
74 //@}
75
76 /** @name Test Edge Bundle
77 * Exercise the edge bundle. Note that this is expected to be of type
78 * EdgeBundle.
79 */
80 //@{
81 template < typename Graph, typename VertexSet >
test_edge_bundle(Graph & g,VertexSet const & verts,boost::mpl::true_)82 void test_edge_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_)
83 {
84 using namespace boost;
85 BOOST_CONCEPT_ASSERT((GraphConcept< Graph >));
86 typedef typename boost::graph_traits< Graph >::edge_descriptor Edge;
87 BOOST_CONCEPT_ASSERT((PropertyGraphConcept< Graph, Edge, edge_bundle_t >));
88
89 std::cout << "...test_edge_bundle\n";
90
91 // Test bundling via the graph object on the lollipop edge.
92 Edge e = boost::edge(verts[5], verts[3], g).first;
93 EdgeBundle& b = g[e];
94 b.value = 10;
95 BOOST_ASSERT(g[e].value == 10);
96
97 // Test bundling via the property map.
98 typedef typename boost::property_map< Graph, int EdgeBundle::* >::type
99 BundleMap;
100 BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept< BundleMap, Edge >));
101 BundleMap map = get(&EdgeBundle::value, g);
102 put(map, e, 5);
103 BOOST_ASSERT(get(map, e) == 5);
104
105 typedef typename boost::property_map< Graph, int EdgeBundle::* >::const_type
106 ConstBundleMap;
107 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept< BundleMap, Edge >));
108 ConstBundleMap cmap = get(&EdgeBundle::value, (Graph const&)g);
109 BOOST_ASSERT(get(cmap, e) == 5);
110 }
111
112 template < typename Graph, typename VertexSet >
test_edge_bundle(Graph &,VertexSet const &,boost::mpl::false_)113 void test_edge_bundle(Graph&, VertexSet const&, boost::mpl::false_)
114 {
115 }
116 //@}
117
118 /**
119 * Test the properties of a graph. Basically, we expect these to be one of
120 * bundled or not. This test could also be expanded to test non-bundled
121 * properties. This just bootstraps the tests.
122 */
123 template < typename Graph, typename VertexSet >
test_properties(Graph & g,VertexSet const & verts)124 void test_properties(Graph& g, VertexSet const& verts)
125 {
126 using namespace boost;
127
128 typename has_bundled_graph_property< Graph >::type graph_bundled;
129 typename has_bundled_vertex_property< Graph >::type vertex_bundled;
130 typename has_bundled_edge_property< Graph >::type edge_bundled;
131
132 test_graph_bundle(g, graph_bundled);
133 test_vertex_bundle(g, verts, vertex_bundled);
134 test_edge_bundle(g, verts, edge_bundled);
135 }
136 //@}
137
138 #endif
139