edge_iterator_constructor.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. /*
  10. Sample data (edge_iterator_constructor.dat):
  11. 5
  12. 10
  13. 0 1
  14. 1 2
  15. 1 3
  16. 2 4
  17. 3 4
  18. 1 0
  19. 2 1
  20. 3 1
  21. 4 2
  22. 4 3
  23. Sample output:
  24. 0 --> 1
  25. 1 --> 2 3 0
  26. 2 --> 4 1
  27. 3 --> 4 1
  28. 4 --> 2 3
  29. */
  30. #include <boost/config.hpp>
  31. #include <utility>
  32. #include <iostream>
  33. #include <fstream>
  34. #include <iterator>
  35. #include <boost/graph/graph_utility.hpp>
  36. #include <boost/graph/adjacency_list.hpp>
  37. class edge_stream_iterator {
  38. public:
  39. typedef std::input_iterator_tag iterator_category;
  40. typedef std::pair<int,int> value_type;
  41. typedef std::ptrdiff_t difference_type;
  42. typedef const value_type* pointer;
  43. typedef const value_type& reference;
  44. edge_stream_iterator() : m_stream(0), m_end_marker(false) {}
  45. edge_stream_iterator(std::istream& s) : m_stream(&s) { m_read(); }
  46. reference operator*() const { return m_edge; }
  47. edge_stream_iterator& operator++() {
  48. m_read();
  49. return *this;
  50. }
  51. edge_stream_iterator operator++(int) {
  52. edge_stream_iterator tmp = *this;
  53. m_read();
  54. return tmp;
  55. }
  56. protected:
  57. std::istream* m_stream;
  58. value_type m_edge;
  59. bool m_end_marker;
  60. void m_read() {
  61. m_end_marker = (*m_stream) ? true : false;
  62. if (m_end_marker) {
  63. *m_stream >> m_edge.first >> m_edge.second;
  64. }
  65. m_end_marker = (*m_stream) ? true : false;
  66. }
  67. friend bool operator==(const edge_stream_iterator& x,
  68. const edge_stream_iterator& y);
  69. };
  70. bool operator==(const edge_stream_iterator& x,
  71. const edge_stream_iterator& y)
  72. {
  73. return (x.m_stream == y.m_stream && x.m_end_marker == y.m_end_marker)
  74. || (x.m_end_marker == false && y.m_end_marker == false);
  75. }
  76. bool operator!=(const edge_stream_iterator& x,
  77. const edge_stream_iterator& y)
  78. {
  79. return !(x == y);
  80. }
  81. int
  82. main(int argc, const char** argv)
  83. {
  84. typedef boost::adjacency_list<> IteratorConstructibleGraph;
  85. typedef boost::graph_traits<IteratorConstructibleGraph> Traits;
  86. Traits::vertices_size_type size_V;
  87. Traits::edges_size_type size_E;
  88. std::ifstream f(argc >= 2 ? argv[1] : "edge_iterator_constructor.dat");
  89. f >> size_V >> size_E;
  90. edge_stream_iterator edge_iter(f), end;
  91. #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
  92. // VC++ can't handle the iterator constructor
  93. IteratorConstructibleGraph G(size_V);
  94. while (edge_iter != end) {
  95. int i, j;
  96. boost::tie(i, j) = *edge_iter++;
  97. boost::add_edge(i, j, G);
  98. }
  99. #else
  100. IteratorConstructibleGraph G(edge_iter, end, size_V);
  101. #endif
  102. boost::print_graph(G);
  103. return 0;
  104. }