graph-assoc-types.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //=======================================================================
  2. // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //=======================================================================
  8. #include <boost/graph/graph_traits.hpp>
  9. #include <boost/graph/adjacency_list.hpp>
  10. using namespace boost;
  11. template < typename Graph > void
  12. generic_foo(Graph & g)
  13. {
  14. // Access descriptor types
  15. typedef typename graph_traits < Graph >::vertex_descriptor Vertex;
  16. typedef typename graph_traits < Graph >::edge_descriptor Edge;
  17. // Access category types
  18. typedef typename graph_traits < Graph >::directed_category Dir;
  19. typedef typename graph_traits < Graph >::edge_parallel_category Par;
  20. // Access iterator types...
  21. // Access size types...
  22. // Now do something useful...
  23. }
  24. template < typename Graph > void
  25. generic_bar(Graph & g)
  26. {
  27. // Declare some vertex and edge descriptor variables
  28. typename graph_traits < Graph >::vertex_descriptor u = vertex(0,g), v = vertex(1,g);
  29. typename graph_traits < Graph >::edge_descriptor e1, e2;
  30. // Set u and e1 to valid descriptors...
  31. v = u; // Make v a handle to the same vertex as u.
  32. e2 = e1; // Make e2 a handle to the same edge as e1.
  33. assert(u == v); // Do u and v identify the same vertex? Yes
  34. assert(!(u != v)); // Do u and v identify different vertices? No
  35. assert(e1 == e2); // Do e1 and e2 identify the same edge? Yes
  36. assert(!(e1 != e2)); // Do e1 and e2 identify different edges? No
  37. }
  38. // This version of foo gets called when g is directed
  39. template < typename Graph > void
  40. foo_dispatch(Graph & g, boost::directed_tag)
  41. {
  42. //...
  43. }
  44. // This version of foo gets called when g is undirected
  45. template < typename Graph > void
  46. foo_dispatch(Graph & g, boost::undirected_tag)
  47. {
  48. //...
  49. }
  50. template < typename Graph > void
  51. foo(Graph & g)
  52. {
  53. typedef typename boost::graph_traits < Graph >::directed_category Cat;
  54. foo_dispatch(g, Cat());
  55. }
  56. template < typename Digraph > void
  57. foo(Digraph & digraph,
  58. typename graph_traits < Digraph >::vertex_descriptor u,
  59. typename graph_traits < Digraph >::vertex_descriptor v)
  60. {
  61. typedef typename graph_traits < Digraph >::edge_descriptor edge_t;
  62. std::pair<edge_t, bool> e1, e2;
  63. e1 = edge(u, v, digraph);
  64. e2 = edge(v, u, digraph);
  65. assert(e1.first != e2.first);
  66. }
  67. template < typename Undigraph > void
  68. bar(Undigraph & undigraph,
  69. typename graph_traits < Undigraph >::vertex_descriptor u,
  70. typename graph_traits < Undigraph >::vertex_descriptor v)
  71. {
  72. typedef typename graph_traits < Undigraph >::edge_descriptor edge_t;
  73. std::pair<edge_t, bool> e1, e2;
  74. e1 = edge(u, v, undigraph);
  75. e2 = edge(v, u, undigraph);
  76. assert(e1.first == e2.first);
  77. }
  78. int
  79. main()
  80. {
  81. boost::adjacency_list < vecS, vecS, directedS > g(2);
  82. add_edge(0, 1, g);
  83. add_edge(1, 0, g);
  84. generic_foo(g);
  85. generic_bar(g);
  86. foo(g);
  87. foo(g, vertex(0, g), vertex(1, g));
  88. boost::adjacency_list < vecS, vecS, undirectedS > ug(2);
  89. add_edge(0, 1, g);
  90. bar(ug, vertex(0, g), vertex(1, g));
  91. return 0;
  92. }