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 10 #ifndef BOOST_ADJACENCY_ITERATOR_HPP 11 #define BOOST_ADJACENCY_ITERATOR_HPP 12 13 #include <boost/detail/iterator.hpp> 14 #include <boost/iterator/iterator_adaptor.hpp> 15 #include <boost/graph/graph_traits.hpp> 16 17 namespace boost 18 { 19 20 template < class Graph, class Vertex, class OutEdgeIter, class Difference > 21 struct adjacency_iterator 22 : iterator_adaptor< 23 adjacency_iterator< Graph, Vertex, OutEdgeIter, Difference >, OutEdgeIter, 24 Vertex, use_default, Vertex, Difference > 25 { 26 typedef iterator_adaptor< 27 adjacency_iterator< Graph, Vertex, OutEdgeIter, Difference >, 28 OutEdgeIter, Vertex, use_default, Vertex, Difference > 29 super_t; 30 adjacency_iteratorboost::adjacency_iterator31 inline adjacency_iterator() {} adjacency_iteratorboost::adjacency_iterator32 inline adjacency_iterator(OutEdgeIter const& i, const Graph* g) 33 : super_t(i), m_g(g) 34 { 35 } 36 dereferenceboost::adjacency_iterator37 inline Vertex dereference() const { return target(*this->base(), *m_g); } 38 39 const Graph* m_g; 40 }; 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 48 typename boost::detail::iterator_traits< OutEdgeIter >::difference_type 49 difference_type; 50 51 public: 52 typedef adjacency_iterator< Graph, Vertex, OutEdgeIter, difference_type > 53 type; 54 }; 55 56 template < class Graph, class Vertex, class InEdgeIter, class Difference > 57 struct inv_adjacency_iterator 58 : iterator_adaptor< 59 inv_adjacency_iterator< Graph, Vertex, InEdgeIter, Difference >, 60 InEdgeIter, Vertex, use_default, Vertex, Difference > 61 { 62 typedef iterator_adaptor< 63 inv_adjacency_iterator< Graph, Vertex, InEdgeIter, Difference >, 64 InEdgeIter, Vertex, use_default, Vertex, Difference > 65 super_t; 66 inv_adjacency_iteratorboost::inv_adjacency_iterator67 inline inv_adjacency_iterator() {} inv_adjacency_iteratorboost::inv_adjacency_iterator68 inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g) 69 : super_t(i), m_g(g) 70 { 71 } 72 dereferenceboost::inv_adjacency_iterator73 inline Vertex dereference() const { return source(*this->base(), *m_g); } 74 75 const Graph* m_g; 76 }; 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 { 83 typedef 84 typename boost::detail::iterator_traits< InEdgeIter >::difference_type 85 difference_type; 86 87 public: 88 typedef inv_adjacency_iterator< Graph, Vertex, InEdgeIter, difference_type > 89 type; 90 }; 91 92 } // namespace boost 93 94 #endif // BOOST_DETAIL_ADJACENCY_ITERATOR_HPP 95