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