123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // (C) Copyright 2009 Andrew Sutton
- //
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0 (See accompanying file
- // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- #ifndef TEST_PROPERTIES_HPP
- #define TEST_PROPERTIES_HPP
- #include <boost/concept/assert.hpp>
- template<typename T> T const& as_const(T& x) { return x; }
- template<typename T> void ignore(T const&) { }
- template<typename Graph>
- void test_graph_bundle(Graph& g, boost::mpl::true_) {
- using namespace boost;
- std::cout << "...test_graph_bundle\n";
- GraphBundle& b1 = g[graph_bundle];
- GraphBundle& b2 = get_property(g);
- ignore(b1); ignore(b2);
- GraphBundle const& cb1 = ::as_const(g)[graph_bundle];
- GraphBundle const& cb2 = get_property(g);
- ignore(cb1); ignore(cb2);
- }
- template<typename Graph>
- void test_graph_bundle(Graph& g, boost::mpl::false_)
- { }
- /** @name Test Vertex Bundle
- * Exercise the vertex bundle. Note that this is expected to be of type
- * VertexBundle.
- */
- //@{
- template <typename Graph, typename VertexSet>
- void test_vertex_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_) {
- using namespace boost;
- BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
- typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Vertex, vertex_bundle_t>));
- // Test bundling via the graph object on the lollipop vertex.
- Vertex v = verts[5];
- VertexBundle& b = g[v];
- b.value = 10;
- BOOST_ASSERT(g[v].value == 10);
- // Test bundling via the property map.
- typedef typename property_map<Graph, int VertexBundle::*>::type BundleMap;
- BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Vertex>));
- BundleMap map = get(&VertexBundle::value, g);
- put(map, v, 5);
- BOOST_ASSERT(get(map, v) == 5);
- typedef typename property_map<Graph, int VertexBundle::*>::const_type ConstBundleMap;
- BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<ConstBundleMap, Vertex>));
- ConstBundleMap cmap = get(&VertexBundle::value, (Graph const&)g);
- BOOST_ASSERT(get(cmap, v) == 5);
- }
- template <typename Graph, typename VertexSet>
- void test_vertex_bundle(Graph&, VertexSet const&, boost::mpl::false_)
- { }
- //@}
- /** @name Test Edge Bundle
- * Exercise the edge bundle. Note that this is expected to be of type
- * EdgeBundle.
- */
- //@{
- template <typename Graph, typename VertexSet>
- void test_edge_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_) {
- using namespace boost;
- BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
- typedef typename boost::graph_traits<Graph>::edge_descriptor Edge;
- BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Edge, edge_bundle_t>));
- std::cout << "...test_edge_bundle\n";
- // Test bundling via the graph object on the lollipop edge.
- Edge e = boost::edge(verts[5], verts[3], g).first;
- EdgeBundle& b = g[e];
- b.value = 10;
- BOOST_ASSERT(g[e].value == 10);
- // Test bundling via the property map.
- typedef typename boost::property_map<Graph, int EdgeBundle::*>::type BundleMap;
- BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Edge>));
- BundleMap map = get(&EdgeBundle::value, g);
- put(map, e, 5);
- BOOST_ASSERT(get(map, e) == 5);
- typedef typename boost::property_map<Graph, int EdgeBundle::*>::const_type ConstBundleMap;
- BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<BundleMap, Edge>));
- ConstBundleMap cmap = get(&EdgeBundle::value, (Graph const&)g);
- BOOST_ASSERT(get(cmap, e) == 5);
- }
- template <typename Graph, typename VertexSet>
- void test_edge_bundle(Graph&, VertexSet const&, boost::mpl::false_)
- { }
- //@}
- /**
- * Test the properties of a graph. Basically, we expect these to be one of
- * bundled or not. This test could also be expanded to test non-bundled
- * properties. This just bootstraps the tests.
- */
- template <typename Graph, typename VertexSet>
- void test_properties(Graph& g, VertexSet const& verts) {
- using namespace boost;
- typename has_bundled_graph_property<Graph>::type graph_bundled;
- typename has_bundled_vertex_property<Graph>::type vertex_bundled;
- typename has_bundled_edge_property<Graph>::type edge_bundled;
- test_graph_bundle(g, graph_bundled);
- test_vertex_bundle(g, verts, vertex_bundled);
- test_edge_bundle(g, verts, edge_bundled);
- }
- //@}
- #endif
|