| //======================================================================= |
| // Copyright 2002 Indiana University. |
| // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| //======================================================================= |
| |
| #ifndef BOOST_ADJACENCY_ITERATOR_HPP |
| #define BOOST_ADJACENCY_ITERATOR_HPP |
| |
| #include <boost/iterator/iterator_adaptor.hpp> |
| #include <boost/graph/graph_traits.hpp> |
| |
| namespace boost |
| { |
| |
| template <class Graph, class Vertex, class OutEdgeIter, class Difference> |
| struct adjacency_iterator |
| : iterator_adaptor< |
| adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference> |
| , OutEdgeIter |
| , Vertex |
| , use_default |
| , Vertex |
| , Difference |
| > |
| { |
| typedef iterator_adaptor< |
| adjacency_iterator<Graph,Vertex,OutEdgeIter,Difference> |
| , OutEdgeIter |
| , Vertex |
| , use_default |
| , Vertex |
| , Difference |
| > super_t; |
| |
| inline adjacency_iterator() {} |
| inline adjacency_iterator(OutEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { } |
| |
| inline Vertex |
| dereference() const |
| { return target(*this->base(), *m_g); } |
| |
| const Graph* m_g; |
| }; |
| |
| template <class Graph, |
| class Vertex = typename graph_traits<Graph>::vertex_descriptor, |
| class OutEdgeIter=typename graph_traits<Graph>::out_edge_iterator> |
| class adjacency_iterator_generator |
| { |
| typedef typename boost::detail::iterator_traits<OutEdgeIter> |
| ::difference_type difference_type; |
| public: |
| typedef adjacency_iterator<Graph,Vertex,OutEdgeIter,difference_type> type; |
| }; |
| |
| template <class Graph, class Vertex, class InEdgeIter, class Difference> |
| struct inv_adjacency_iterator |
| : iterator_adaptor< |
| inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference> |
| , InEdgeIter |
| , Vertex |
| , use_default |
| , Vertex |
| , Difference |
| > |
| { |
| typedef iterator_adaptor< |
| inv_adjacency_iterator<Graph,Vertex,InEdgeIter,Difference> |
| , InEdgeIter |
| , Vertex |
| , use_default |
| , Vertex |
| , Difference |
| > super_t; |
| |
| inline inv_adjacency_iterator() { } |
| inline inv_adjacency_iterator(InEdgeIter const& i, const Graph* g) : super_t(i), m_g(g) { } |
| |
| inline Vertex |
| dereference() const |
| { return source(*this->base(), *m_g); } |
| |
| const Graph* m_g; |
| }; |
| |
| template <class Graph, |
| class Vertex = typename graph_traits<Graph>::vertex_descriptor, |
| class InEdgeIter = typename graph_traits<Graph>::in_edge_iterator> |
| class inv_adjacency_iterator_generator { |
| typedef typename boost::detail::iterator_traits<InEdgeIter> |
| ::difference_type difference_type; |
| public: |
| typedef inv_adjacency_iterator<Graph, Vertex, InEdgeIter, difference_type> type; |
| }; |
| |
| } // namespace boost |
| |
| #endif // BOOST_DETAIL_ADJACENCY_ITERATOR_HPP |