| // (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_DESTRUCTION_HPP |
| #define TEST_DESTRUCTION_HPP |
| |
| #include <utility> |
| |
| /** @name Destroy Graph |
| * Destroy the graph by removing vertices (if possible). |
| */ |
| //@{ |
| // This will basically catch adjacency matrices, which don't get torn down. |
| template <typename Graph, typename VertexSet, typename Remove, typename Label> |
| void destroy_graph(Graph&, VertexSet const&, Remove, Label) |
| { } |
| |
| // This matches MutableGraph, so just remove a vertex and then clear. |
| template <typename Graph, typename VertexSet> |
| void destroy_graph(Graph& g, VertexSet const& verts, boost::mpl::true_, boost::mpl::false_) { |
| using namespace boost; |
| BOOST_CONCEPT_ASSERT((VertexListGraphConcept<Graph>)); |
| BOOST_CONCEPT_ASSERT((VertexMutableGraphConcept<Graph>)); |
| |
| std::cout << "...destroy_normal\n"; |
| // Remove the roof vertex |
| remove_vertex(verts[0], g); |
| BOOST_ASSERT(num_vertices(g) == N - 1); |
| } |
| |
| // This will match labeled graphs. |
| template <typename Graph, typename VertexSet> |
| void destroy_graph(Graph& g, VertexSet const&, boost::mpl::false_, boost::mpl::true_) { |
| using namespace boost; |
| BOOST_CONCEPT_ASSERT((VertexListGraphConcept<Graph>)); |
| // function_requires< VeretexMutableGraphConcept<Graph> >(); |
| |
| std::cout << "...destroy_labeled\n"; |
| // Remove the roof vertex |
| remove_vertex(0, g); |
| BOOST_ASSERT(num_vertices(g) == N - 1); |
| } |
| //@} |
| |
| |
| /** @name Disconnect Graph |
| * Disconnect edges in the graph. Note that this doesn't fully disconnect the |
| * graph. It simply determines if we can disconnect an edge or two and verify |
| * that the resulting graph is valid. The Labeled type parameter is used to |
| * dispatch for unlabeled and labeled graphs. |
| * |
| * @todo This doesn't quite work for multigraphs... |
| */ |
| //@{ |
| |
| template <typename Graph, typename VertexSet> |
| void disconnect_graph(Graph& g, VertexSet const& verts, boost::mpl::false_) { |
| using namespace boost; |
| BOOST_CONCEPT_ASSERT((EdgeListGraphConcept<Graph>)); |
| BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept<Graph>)); |
| |
| std::cout << "...disconnect_normal\n"; |
| typedef typename graph_traits<Graph>::edge_descriptor Edge; |
| |
| // Disconnect the "lollipop" from the house. |
| Edge e = edge(verts[5], verts[3], g).first; |
| remove_edge(e, g); |
| BOOST_ASSERT(num_edges(g) == M - 1); |
| |
| // Remove the "floor" edge from the house. |
| remove_edge(verts[3], verts[2], g); |
| BOOST_ASSERT(num_edges(g) == M - 2); |
| |
| // Fully disconnect the roof vertex. |
| clear_vertex(verts[0], g); |
| BOOST_ASSERT(num_edges(g) == M - 4); |
| |
| // What happens if we try to remove an edge that doesn't exist? |
| remove_edge(verts[5], verts[0], g); |
| BOOST_ASSERT(num_edges(g) == M - 4); |
| } |
| |
| template <typename Graph, typename VertexSet> |
| void disconnect_graph(Graph& g, VertexSet const&, boost::mpl::true_) { |
| using namespace boost; |
| BOOST_CONCEPT_ASSERT((EdgeListGraphConcept<Graph>)); |
| // BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept<Graph>)); |
| |
| std::cout << "...disconnect_labeled\n"; |
| typedef typename boost::graph_traits<Graph>::edge_descriptor Edge; |
| |
| // Disconnect the "lollipop" from the house. |
| Edge e = boost::edge_by_label(5, 3, g).first; |
| boost::remove_edge(e, g); |
| BOOST_ASSERT(boost::num_edges(g) == M - 1); |
| |
| // Remove the "floor" edge from the house. |
| boost::remove_edge_by_label(3, 2, g); |
| BOOST_ASSERT(boost::num_edges(g) == M - 2); |
| |
| // Fully disconnect the roof vertex. |
| clear_vertex_by_label(0, g); |
| BOOST_ASSERT(boost::num_edges(g) == M - 4); |
| |
| // What happens if we try to remove an edge that doesn't exist? |
| boost::remove_edge_by_label(5, 0, g); |
| BOOST_ASSERT(boost::num_edges(g) == M - 4); |
| } |
| //@} |
| |
| #endif |