vertex_and_edge_range.hpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright 2004 The Trustees of Indiana University.
  2. // Use, modification and distribution is subject to the Boost Software
  3. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Authors: Douglas Gregor
  6. // Andrew Lumsdaine
  7. #ifndef BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
  8. #define BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
  9. #include <boost/graph/graph_traits.hpp>
  10. #include <iterator>
  11. namespace boost {
  12. namespace graph {
  13. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  14. class vertex_and_edge_range
  15. {
  16. typedef graph_traits<Graph> traits_type;
  17. public:
  18. typedef typename traits_type::directed_category directed_category;
  19. typedef typename traits_type::edge_parallel_category
  20. edge_parallel_category;
  21. struct traversal_category
  22. : public virtual vertex_list_graph_tag,
  23. public virtual edge_list_graph_tag { };
  24. typedef std::size_t vertices_size_type;
  25. typedef VertexIterator vertex_iterator;
  26. typedef typename std::iterator_traits<VertexIterator>::value_type
  27. vertex_descriptor;
  28. typedef EdgeIterator edge_iterator;
  29. typedef typename std::iterator_traits<EdgeIterator>::value_type
  30. edge_descriptor;
  31. typedef std::size_t edges_size_type;
  32. typedef void adjacency_iterator;
  33. typedef void out_edge_iterator;
  34. typedef void in_edge_iterator;
  35. typedef void degree_size_type;
  36. static vertex_descriptor null_vertex()
  37. { return traits_type::null_vertex(); }
  38. vertex_and_edge_range(const Graph& g,
  39. VertexIterator first_v, VertexIterator last_v,
  40. vertices_size_type n,
  41. EdgeIterator first_e, EdgeIterator last_e,
  42. edges_size_type m)
  43. : g(&g),
  44. first_vertex(first_v), last_vertex(last_v), m_num_vertices(n),
  45. first_edge(first_e), last_edge(last_e), m_num_edges(m)
  46. {
  47. }
  48. vertex_and_edge_range(const Graph& g,
  49. VertexIterator first_v, VertexIterator last_v,
  50. EdgeIterator first_e, EdgeIterator last_e)
  51. : g(&g),
  52. first_vertex(first_v), last_vertex(last_v),
  53. first_edge(first_e), last_edge(last_e)
  54. {
  55. m_num_vertices = std::distance(first_v, last_v);
  56. m_num_edges = std::distance(first_e, last_e);
  57. }
  58. const Graph* g;
  59. vertex_iterator first_vertex;
  60. vertex_iterator last_vertex;
  61. vertices_size_type m_num_vertices;
  62. edge_iterator first_edge;
  63. edge_iterator last_edge;
  64. edges_size_type m_num_edges;
  65. };
  66. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  67. inline std::pair<VertexIterator, VertexIterator>
  68. vertices(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
  69. { return std::make_pair(g.first_vertex, g.last_vertex); }
  70. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  71. inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  72. ::vertices_size_type
  73. num_vertices(const vertex_and_edge_range<Graph, VertexIterator,
  74. EdgeIterator>& g)
  75. { return g.m_num_vertices; }
  76. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  77. inline std::pair<EdgeIterator, EdgeIterator>
  78. edges(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
  79. { return std::make_pair(g.first_edge, g.last_edge); }
  80. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  81. inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  82. ::edges_size_type
  83. num_edges(const vertex_and_edge_range<Graph, VertexIterator,
  84. EdgeIterator>& g)
  85. { return g.m_num_edges; }
  86. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  87. inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  88. ::vertex_descriptor
  89. source(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  90. ::edge_descriptor e,
  91. const vertex_and_edge_range<Graph, VertexIterator,
  92. EdgeIterator>& g)
  93. { return source(e, *g.g); }
  94. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  95. inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  96. ::vertex_descriptor
  97. target(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  98. ::edge_descriptor e,
  99. const vertex_and_edge_range<Graph, VertexIterator,
  100. EdgeIterator>& g)
  101. { return target(e, *g.g); }
  102. template<typename Graph, typename VertexIterator, typename EdgeIterator>
  103. inline vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  104. make_vertex_and_edge_range(const Graph& g,
  105. VertexIterator first_v, VertexIterator last_v,
  106. EdgeIterator first_e, EdgeIterator last_e)
  107. {
  108. typedef vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
  109. result_type;
  110. return result_type(g, first_v, last_v, first_e, last_e);
  111. }
  112. } // end namespace graph
  113. using graph::vertex_and_edge_range;
  114. using graph::make_vertex_and_edge_range;
  115. } // end namespace boost
  116. #endif // BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP