matrix_as_graph.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. //=======================================================================
  3. // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
  4. // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //=======================================================================
  10. //
  11. #ifndef BOOST_GRAPH_MATRIX2GRAPH_HPP
  12. #define BOOST_GRAPH_MATRIX2GRAPH_HPP
  13. #include <utility>
  14. #include <cstddef>
  15. #include <iterator>
  16. #include <boost/config.hpp>
  17. #include <boost/operators.hpp>
  18. #include <boost/pending/detail/int_iterator.hpp>
  19. #include <boost/graph/graph_traits.hpp>
  20. namespace boost {
  21. template <class Iter, class Vertex>
  22. class matrix_adj_iterator;
  23. template <class Iter, class Vertex>
  24. class matrix_incidence_iterator;
  25. }
  26. #define BOOST_GRAPH_ADAPT_MATRIX_TO_GRAPH(Matrix) \
  27. namespace boost { \
  28. template <> \
  29. struct graph_traits< Matrix > { \
  30. typedef Matrix::OneD::const_iterator Iter; \
  31. typedef Matrix::size_type V; \
  32. typedef V vertex_descriptor; \
  33. typedef Iter E; \
  34. typedef E edge_descriptor; \
  35. typedef boost::matrix_incidence_iterator<Iter, V> out_edge_iterator; \
  36. typedef boost::matrix_adj_iterator<Iter, V> adjacency_iterator; \
  37. typedef Matrix::size_type size_type; \
  38. typedef boost::int_iterator<size_type> vertex_iterator; \
  39. \
  40. friend std::pair<vertex_iterator, vertex_iterator> \
  41. vertices(const Matrix& g) { \
  42. typedef vertex_iterator VIter; \
  43. return std::make_pair(VIter(0), VIter(g.nrows())); \
  44. } \
  45. \
  46. friend std::pair<out_edge_iterator, out_edge_iterator> \
  47. out_edges(V v, const Matrix& g) { \
  48. typedef out_edge_iterator IncIter; \
  49. return std::make_pair(IncIter(g[v].begin()), \
  50. IncIter(g[v].end())); \
  51. } \
  52. friend std::pair<adjacency_iterator, adjacency_iterator> \
  53. adjacent_vertices(V v, const Matrix& g) { \
  54. typedef adjacency_iterator AdjIter; \
  55. return std::make_pair(AdjIter(g[v].begin()), \
  56. AdjIter(g[v].end())); \
  57. } \
  58. friend vertex_descriptor \
  59. source(E e, const Matrix& g) { \
  60. return e.row(); \
  61. } \
  62. friend vertex_descriptor \
  63. target(E e, const Matrix& g) { \
  64. return e.column(); \
  65. } \
  66. friend size_type \
  67. num_vertices(const Matrix& g) { \
  68. return g.nrows(); \
  69. } \
  70. friend size_type \
  71. num_edges(const Matrix& g) { \
  72. return g.nnz(); \
  73. } \
  74. friend size_type \
  75. out_degree(V i, const Matrix& g) { \
  76. return g[i].nnz(); \
  77. } \
  78. }; \
  79. }
  80. namespace boost {
  81. template <class Iter, class Vertex>
  82. class matrix_adj_iterator
  83. {
  84. typedef matrix_adj_iterator self;
  85. public:
  86. typedef std::input_iterator_tag iterator_category;
  87. typedef Vertex value_type;
  88. typedef std::ptrdiff_t difference_type;
  89. typedef Vertex* pointer;
  90. typedef Vertex& reference;
  91. matrix_adj_iterator() { }
  92. matrix_adj_iterator(Iter i) : _iter(i) { }
  93. matrix_adj_iterator(const self& x) : _iter(x._iter) { }
  94. self& operator=(const self& x) { _iter = x._iter; return *this; }
  95. Vertex operator*() { return _iter.column(); }
  96. self& operator++() { ++_iter; return *this; }
  97. self operator++(int) { self t = *this; ++_iter; return t; }
  98. bool operator==(const self& x) const { return _iter == x._iter; }
  99. bool operator!=(const self& x) const { return _iter != x._iter; }
  100. protected:
  101. Iter _iter;
  102. };
  103. template <class Iter, class Vertex>
  104. class matrix_incidence_iterator
  105. {
  106. typedef matrix_incidence_iterator self;
  107. public:
  108. typedef std::input_iterator_tag iterator_category;
  109. typedef Iter value_type;
  110. typedef std::ptrdiff_t difference_type;
  111. typedef Iter* pointer;
  112. typedef Iter& reference;
  113. matrix_incidence_iterator() { }
  114. matrix_incidence_iterator(Iter i) : _iter(i) { }
  115. matrix_incidence_iterator(const self& x) : _iter(x._iter) { }
  116. self& operator=(const self& x) { _iter = x._iter; return *this; }
  117. Iter operator*() { return _iter; }
  118. self& operator++() { ++_iter; return *this; }
  119. self operator++(int) { self t = *this; ++_iter; return t; }
  120. bool operator==(const self& x) const { return _iter == x._iter; }
  121. bool operator!=(const self& x) const { return _iter != x._iter; }
  122. protected:
  123. Iter _iter;
  124. };
  125. } /* namespace boost */
  126. #endif /* BOOST_GRAPH_MATRIX2GRAPH_HPP*/