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