//======================================================================= // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= #include #include #include #include #include using namespace boost; // Predicate Function for use in remove if template struct name_equals_predicate { name_equals_predicate(const std::string& x, NamePropertyMap name) : m_str(x), m_name(name) { } template bool operator()(const Edge& e) const { return m_str == m_name[e]; } std::string m_str; NamePropertyMap m_name; }; // helper creation function template inline name_equals_predicate name_equals(const std::string& str, NamePropertyMap name) { return name_equals_predicate(str, name); } template void modify_demo(MutableGraph& g) { typedef graph_traits GraphTraits; typedef typename GraphTraits::vertices_size_type size_type; typedef typename GraphTraits::edge_descriptor edge_descriptor; size_type n = 0; typename GraphTraits::edges_size_type m = 0; typename GraphTraits::vertex_descriptor u, v, w; edge_descriptor e, e1, e2; typename property_map::type name_map = get(edge_name, g); bool added; typename GraphTraits::vertex_iterator vi, vi_end; { v = add_vertex(g); assert(num_vertices(g) == n + 1); assert(size_type(vertices(g).second - vertices(g).first) == n + 1); assert(v == *std::find(vertices(g).first, vertices(g).second, v)); } { remove_vertex(v, g); assert(num_vertices(g) == n); assert(size_type(vertices(g).second - vertices(g).first) == n); // v is no longer a valid vertex descriptor } { u = add_vertex(g); v = add_vertex(g); std::pair p = add_edge(u, v, g); assert(num_edges(g) == m + 1); assert(p.second == true); // edge should have been added assert(source(p.first, g) == u); assert(target(p.first, g) == v); assert(p.first == *std::find(out_edges(u, g).first, out_edges(u, g).second, p.first)); assert(p.first == *std::find(in_edges(v, g).first, in_edges(v, g).second, p.first)); } { // use tie() for convenience, avoid using the std::pair u = add_vertex(g); v = add_vertex(g); boost::tie(e, added) = add_edge(u, v, g); assert(num_edges(g) == m + 2); assert(added == true); // edge should have been added assert(source(e, g) == u); assert(target(e, g) == v); assert(e == *std::find(out_edges(u, g).first, out_edges(u, g).second, e)); assert(e == *std::find(in_edges(v, g).first, in_edges(v, g).second, e)); } { add_edge(u, v, g); // add a parallel edge remove_edge(u, v, g); assert(num_edges(g) == m + 1); bool exists; boost::tie(e, exists) = edge(u, v, g); assert(exists == false); assert(out_degree(u, g) == 0); assert(in_degree(v, g) == 0); } { e = *edges(g).first; boost::tie(u, v) = incident(e, g); remove_edge(e, g); assert(num_edges(g) == m); assert(out_degree(u, g) == 0); assert(in_degree(v, g) == 0); } { add_edge(u, v, g); typename GraphTraits::out_edge_iterator iter, iter_end; boost::tie(iter, iter_end) = out_edges(u, g); remove_edge(iter, g); assert(num_edges(g) == m); assert(out_degree(u, g) == 0); assert(in_degree(v, g) == 0); } { w = add_vertex(g); boost::tie(e1, added) = add_edge(u, v, g); boost::tie(e2, added) = add_edge(v, w, g); name_map[e1] = "I-5"; name_map[e2] = "Route 66"; typename GraphTraits::out_edge_iterator iter, iter_end; boost::tie(iter, iter_end) = out_edges(u, g); remove_edge_if(name_equals("Route 66", name_map), g); assert(num_edges(g) == m + 1); remove_edge_if(name_equals("I-5", name_map), g); assert(num_edges(g) == m); assert(out_degree(u, g) == 0); assert(out_degree(v, g) == 0); assert(in_degree(v, g) == 0); assert(in_degree(w, g) == 0); } { boost::tie(e1, added) = add_edge(u, v, g); boost::tie(e2, added) = add_edge(u, w, g); name_map[e1] = "foo"; name_map[e2] = "foo"; remove_out_edge_if(u, name_equals("foo", name_map), g); assert(num_edges(g) == m); assert(out_degree(u, g) == 0); } { boost::tie(e1, added) = add_edge(u, v, g); boost::tie(e2, added) = add_edge(w, v, g); name_map[e1] = "bar"; name_map[e2] = "bar"; remove_in_edge_if(v, name_equals("bar", name_map), g); assert(num_edges(g) == m); assert(in_degree(v, g) == 0); } { add_edge(u, v, g); add_edge(u, w, g); add_edge(u, v, g); add_edge(v, u, g); clear_vertex(u, g); assert(out_degree(u, g) == 0); for (boost::tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) { typename GraphTraits::adjacency_iterator ai, ai_end; for (boost::tie(ai, ai_end) = adjacent_vertices(*vi, g); ai != ai_end; ++ai) assert(*ai != u); } } } int main() { adjacency_list > g; modify_demo(g); return 0; }