modify_graph.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //=======================================================================
  2. // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
  3. // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //=======================================================================
  9. #include <boost/config.hpp>
  10. #include <iostream>
  11. #include <string>
  12. #include <boost/graph/adjacency_list.hpp>
  13. #include <boost/graph/graph_utility.hpp>
  14. using namespace boost;
  15. // Predicate Function for use in remove if
  16. template <class NamePropertyMap>
  17. struct name_equals_predicate
  18. {
  19. name_equals_predicate(const std::string& x, NamePropertyMap name)
  20. : m_str(x), m_name(name) { }
  21. template <class Edge>
  22. bool operator()(const Edge& e) const {
  23. return m_str == m_name[e];
  24. }
  25. std::string m_str;
  26. NamePropertyMap m_name;
  27. };
  28. // helper creation function
  29. template <class NamePropertyMap>
  30. inline name_equals_predicate<NamePropertyMap>
  31. name_equals(const std::string& str, NamePropertyMap name) {
  32. return name_equals_predicate<NamePropertyMap>(str, name);
  33. }
  34. template <class MutableGraph>
  35. void modify_demo(MutableGraph& g)
  36. {
  37. typedef graph_traits<MutableGraph> GraphTraits;
  38. typedef typename GraphTraits::vertices_size_type size_type;
  39. typedef typename GraphTraits::edge_descriptor edge_descriptor;
  40. size_type n = 0;
  41. typename GraphTraits::edges_size_type m = 0;
  42. typename GraphTraits::vertex_descriptor u, v, w;
  43. edge_descriptor e, e1, e2;
  44. typename property_map<MutableGraph, edge_name_t>::type
  45. name_map = get(edge_name, g);
  46. bool added;
  47. typename GraphTraits::vertex_iterator vi, vi_end;
  48. {
  49. v = add_vertex(g);
  50. assert(num_vertices(g) == n + 1);
  51. assert(size_type(vertices(g).second - vertices(g).first) == n + 1);
  52. assert(v == *std::find(vertices(g).first, vertices(g).second, v));
  53. }
  54. {
  55. remove_vertex(v, g);
  56. assert(num_vertices(g) == n);
  57. assert(size_type(vertices(g).second - vertices(g).first) == n);
  58. // v is no longer a valid vertex descriptor
  59. }
  60. {
  61. u = add_vertex(g);
  62. v = add_vertex(g);
  63. std::pair<edge_descriptor, bool> p = add_edge(u, v, g);
  64. assert(num_edges(g) == m + 1);
  65. assert(p.second == true); // edge should have been added
  66. assert(source(p.first, g) == u);
  67. assert(target(p.first, g) == v);
  68. assert(p.first == *std::find(out_edges(u, g).first,
  69. out_edges(u, g).second, p.first));
  70. assert(p.first == *std::find(in_edges(v, g).first,
  71. in_edges(v, g).second, p.first));
  72. }
  73. {
  74. // use tie() for convenience, avoid using the std::pair
  75. u = add_vertex(g);
  76. v = add_vertex(g);
  77. boost::tie(e, added) = add_edge(u, v, g);
  78. assert(num_edges(g) == m + 2);
  79. assert(added == true); // edge should have been added
  80. assert(source(e, g) == u);
  81. assert(target(e, g) == v);
  82. assert(e == *std::find(out_edges(u, g).first, out_edges(u, g).second, e));
  83. assert(e == *std::find(in_edges(v, g).first, in_edges(v, g).second, e));
  84. }
  85. {
  86. add_edge(u, v, g); // add a parallel edge
  87. remove_edge(u, v, g);
  88. assert(num_edges(g) == m + 1);
  89. bool exists;
  90. boost::tie(e, exists) = edge(u, v, g);
  91. assert(exists == false);
  92. assert(out_degree(u, g) == 0);
  93. assert(in_degree(v, g) == 0);
  94. }
  95. {
  96. e = *edges(g).first;
  97. boost::tie(u, v) = incident(e, g);
  98. remove_edge(e, g);
  99. assert(num_edges(g) == m);
  100. assert(out_degree(u, g) == 0);
  101. assert(in_degree(v, g) == 0);
  102. }
  103. {
  104. add_edge(u, v, g);
  105. typename GraphTraits::out_edge_iterator iter, iter_end;
  106. boost::tie(iter, iter_end) = out_edges(u, g);
  107. remove_edge(iter, g);
  108. assert(num_edges(g) == m);
  109. assert(out_degree(u, g) == 0);
  110. assert(in_degree(v, g) == 0);
  111. }
  112. {
  113. w = add_vertex(g);
  114. boost::tie(e1, added) = add_edge(u, v, g);
  115. boost::tie(e2, added) = add_edge(v, w, g);
  116. name_map[e1] = "I-5";
  117. name_map[e2] = "Route 66";
  118. typename GraphTraits::out_edge_iterator iter, iter_end;
  119. boost::tie(iter, iter_end) = out_edges(u, g);
  120. remove_edge_if(name_equals("Route 66", name_map), g);
  121. assert(num_edges(g) == m + 1);
  122. remove_edge_if(name_equals("I-5", name_map), g);
  123. assert(num_edges(g) == m);
  124. assert(out_degree(u, g) == 0);
  125. assert(out_degree(v, g) == 0);
  126. assert(in_degree(v, g) == 0);
  127. assert(in_degree(w, g) == 0);
  128. }
  129. {
  130. boost::tie(e1, added) = add_edge(u, v, g);
  131. boost::tie(e2, added) = add_edge(u, w, g);
  132. name_map[e1] = "foo";
  133. name_map[e2] = "foo";
  134. remove_out_edge_if(u, name_equals("foo", name_map), g);
  135. assert(num_edges(g) == m);
  136. assert(out_degree(u, g) == 0);
  137. }
  138. {
  139. boost::tie(e1, added) = add_edge(u, v, g);
  140. boost::tie(e2, added) = add_edge(w, v, g);
  141. name_map[e1] = "bar";
  142. name_map[e2] = "bar";
  143. remove_in_edge_if(v, name_equals("bar", name_map), g);
  144. assert(num_edges(g) == m);
  145. assert(in_degree(v, g) == 0);
  146. }
  147. {
  148. add_edge(u, v, g);
  149. add_edge(u, w, g);
  150. add_edge(u, v, g);
  151. add_edge(v, u, g);
  152. clear_vertex(u, g);
  153. assert(out_degree(u, g) == 0);
  154. for (boost::tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
  155. typename GraphTraits::adjacency_iterator ai, ai_end;
  156. for (boost::tie(ai, ai_end) = adjacent_vertices(*vi, g);
  157. ai != ai_end; ++ai)
  158. assert(*ai != u);
  159. }
  160. }
  161. }
  162. int
  163. main()
  164. {
  165. adjacency_list<listS, vecS, bidirectionalS,
  166. no_property, property<edge_name_t, std::string> > g;
  167. modify_demo(g);
  168. return 0;
  169. }