summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/graph/example/modify_graph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/graph/example/modify_graph.cpp')
-rw-r--r--src/boost/libs/graph/example/modify_graph.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/boost/libs/graph/example/modify_graph.cpp b/src/boost/libs/graph/example/modify_graph.cpp
new file mode 100644
index 00000000..42b668cb
--- /dev/null
+++ b/src/boost/libs/graph/example/modify_graph.cpp
@@ -0,0 +1,203 @@
+//=======================================================================
+// 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 <boost/config.hpp>
+#include <iostream>
+#include <string>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/graph_utility.hpp>
+
+using namespace boost;
+
+// Predicate Function for use in remove if
+template <class NamePropertyMap>
+struct name_equals_predicate
+{
+ name_equals_predicate(const std::string& x, NamePropertyMap name)
+ : m_str(x), m_name(name) { }
+
+ template <class Edge>
+ bool operator()(const Edge& e) const {
+ return m_str == m_name[e];
+ }
+ std::string m_str;
+ NamePropertyMap m_name;
+};
+// helper creation function
+template <class NamePropertyMap>
+inline name_equals_predicate<NamePropertyMap>
+name_equals(const std::string& str, NamePropertyMap name) {
+ return name_equals_predicate<NamePropertyMap>(str, name);
+}
+
+template <class MutableGraph>
+void modify_demo(MutableGraph& g)
+{
+ typedef graph_traits<MutableGraph> 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<MutableGraph, edge_name_t>::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<edge_descriptor, bool> 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<listS, vecS, bidirectionalS,
+ no_property, property<edge_name_t, std::string> > g;
+
+ modify_demo(g);
+ return 0;
+}