adjacency_iterator.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //=======================================================================
  2. // Copyright 2002 Indiana University.
  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. #ifndef BOOST_ADJACENCY_ITERATOR_HPP
  10. #define BOOST_ADJACENCY_ITERATOR_HPP
  11. #include <boost/detail/iterator.hpp>
  12. #include <boost/iterator/iterator_adaptor.hpp>
  13. #include <boost/graph/graph_traits.hpp>
  14. namespace boost
  15. {
  16. template <class Graph, class Vertex, class OutEdgeIter, class Difference>
  17. struct adjacency_iterator
  18. : iterator_adaptor<
  19. adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference>
  20. , OutEdgeIter
  21. , Vertex
  22. , use_default
  23. , Vertex
  24. , Difference
  25. >
  26. {
  27. typedef iterator_adaptor<
  28. adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference>
  29. , OutEdgeIter
  30. , Vertex
  31. , use_default
  32. , Vertex
  33. , Difference
  34. > super_t;
  35. inline adjacency_iterator() {}
  36. inline adjacency_iterator(OutEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { }
  37. inline Vertex
  38. dereference() const
  39. { return target(*this->base(), *m_g); }
  40. const Graph* m_g;
  41. };
  42. template <class Graph,
  43. class Vertex = typename graph_traits<Graph>::vertex_descriptor,
  44. class OutEdgeIter=typename graph_traits<Graph>::out_edge_iterator>
  45. class adjacency_iterator_generator
  46. {
  47. typedef typename boost::detail::iterator_traits<OutEdgeIter>
  48. ::difference_type difference_type;
  49. public:
  50. typedef adjacency_iterator<Graph,Vertex,OutEdgeIter,difference_type> type;
  51. };
  52. template <class Graph, class Vertex, class InEdgeIter, class Difference>
  53. struct inv_adjacency_iterator
  54. : iterator_adaptor<
  55. inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference>
  56. , InEdgeIter
  57. , Vertex
  58. , use_default
  59. , Vertex
  60. , Difference
  61. >
  62. {
  63. typedef iterator_adaptor<
  64. inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference>
  65. , InEdgeIter
  66. , Vertex
  67. , use_default
  68. , Vertex
  69. , Difference
  70. > super_t;
  71. inline inv_adjacency_iterator() { }
  72. inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { }
  73. inline Vertex
  74. dereference() const
  75. { return source(*this->base(), *m_g); }
  76. const Graph* m_g;
  77. };
  78. template <class Graph,
  79. class Vertex = typename graph_traits<Graph>::vertex_descriptor,
  80. class InEdgeIter = typename graph_traits<Graph>::in_edge_iterator>
  81. class inv_adjacency_iterator_generator {
  82. typedef typename boost::detail::iterator_traits<InEdgeIter>
  83. ::difference_type difference_type;
  84. public:
  85. typedef inv_adjacency_iterator<Graph, Vertex, InEdgeIter, difference_type> type;
  86. };
  87. } // namespace boost
  88. #endif // BOOST_DETAIL_ADJACENCY_ITERATOR_HPP