• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DESTRUCTION_HPP
8 #define TEST_DESTRUCTION_HPP
9 
10 #include <boost/concept/assert.hpp>
11 #include <utility>
12 
13 /** @name Destroy Graph
14  * Destroy the graph by removing vertices (if possible).
15  */
16 //@{
17 // This will basically catch adjacency matrices, which don't get torn down.
18 template < typename Graph, typename VertexSet, typename Remove, typename Label >
destroy_graph(Graph &,VertexSet const &,Remove,Label)19 void destroy_graph(Graph&, VertexSet const&, Remove, Label)
20 {
21 }
22 
23 // This matches MutableGraph, so just remove a vertex and then clear.
24 template < typename Graph, typename VertexSet >
destroy_graph(Graph & g,VertexSet const & verts,boost::mpl::true_,boost::mpl::false_)25 void destroy_graph(
26     Graph& g, VertexSet const& verts, boost::mpl::true_, boost::mpl::false_)
27 {
28     using namespace boost;
29     BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));
30     BOOST_CONCEPT_ASSERT((VertexMutableGraphConcept< Graph >));
31 
32     std::cout << "...destroy_normal\n";
33     // Remove the roof vertex
34     remove_vertex(verts[0], g);
35     BOOST_ASSERT(num_vertices(g) == N - 1);
36 }
37 
38 // This will match labeled graphs.
39 template < typename Graph, typename VertexSet >
destroy_graph(Graph & g,VertexSet const &,boost::mpl::false_,boost::mpl::true_)40 void destroy_graph(
41     Graph& g, VertexSet const&, boost::mpl::false_, boost::mpl::true_)
42 {
43     using namespace boost;
44     BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));
45     // BOOST_CONCEPT_ASSERT(( VeretexMutableGraphConcept<Graph> ));
46 
47     std::cout << "...destroy_labeled\n";
48     // Remove the roof vertex
49     remove_vertex(0, g);
50     BOOST_ASSERT(num_vertices(g) == N - 1);
51 }
52 //@}
53 
54 /** @name Disconnect Graph
55  * Disconnect edges in the graph. Note that this doesn't fully disconnect the
56  * graph. It simply determines if we can disconnect an edge or two and verify
57  * that the resulting graph is valid. The Labeled type parameter is used to
58  * dispatch for unlabeled and labeled graphs.
59  *
60  * @todo This doesn't quite work for multigraphs...
61  */
62 //@{
63 
64 template < typename Graph, typename VertexSet >
disconnect_graph(Graph & g,VertexSet const & verts,boost::mpl::false_)65 void disconnect_graph(Graph& g, VertexSet const& verts, boost::mpl::false_)
66 {
67     using namespace boost;
68     BOOST_CONCEPT_ASSERT((EdgeListGraphConcept< Graph >));
69     BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept< Graph >));
70 
71     std::cout << "...disconnect_normal\n";
72     typedef typename graph_traits< Graph >::edge_descriptor Edge;
73 
74     // Disconnect the "lollipop" from the house.
75     Edge e = edge(verts[5], verts[3], g).first;
76     remove_edge(e, g);
77     BOOST_ASSERT(num_edges(g) == M - 1);
78 
79     // Remove the "floor" edge from the house.
80     remove_edge(verts[3], verts[2], g);
81     BOOST_ASSERT(num_edges(g) == M - 2);
82 
83     // Fully disconnect the roof vertex.
84     clear_vertex(verts[0], g);
85     BOOST_ASSERT(num_edges(g) == M - 4);
86 
87     // What happens if we try to remove an edge that doesn't exist?
88     remove_edge(verts[5], verts[0], g);
89     BOOST_ASSERT(num_edges(g) == M - 4);
90 }
91 
92 template < typename Graph, typename VertexSet >
disconnect_graph(Graph & g,VertexSet const &,boost::mpl::true_)93 void disconnect_graph(Graph& g, VertexSet const&, boost::mpl::true_)
94 {
95     using namespace boost;
96     BOOST_CONCEPT_ASSERT((EdgeListGraphConcept< Graph >));
97     // BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept<Graph>));
98 
99     std::cout << "...disconnect_labeled\n";
100     typedef typename boost::graph_traits< Graph >::edge_descriptor Edge;
101 
102     // Disconnect the "lollipop" from the house.
103     Edge e = boost::edge_by_label(5, 3, g).first;
104     boost::remove_edge(e, g);
105     BOOST_ASSERT(boost::num_edges(g) == M - 1);
106 
107     // Remove the "floor" edge from the house.
108     boost::remove_edge_by_label(3, 2, g);
109     BOOST_ASSERT(boost::num_edges(g) == M - 2);
110 
111     // Fully disconnect the roof vertex.
112     clear_vertex_by_label(0, g);
113     BOOST_ASSERT(boost::num_edges(g) == M - 4);
114 
115     // What happens if we try to remove an edge that doesn't exist?
116     boost::remove_edge_by_label(5, 0, g);
117     BOOST_ASSERT(boost::num_edges(g) == M - 4);
118 }
119 //@}
120 
121 #endif
122