williamr@2: // williamr@2: //======================================================================= williamr@2: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. 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_GRAPH_DETAIL_INCIDENCE_ITERATOR_HPP williamr@2: #define BOOST_GRAPH_DETAIL_INCIDENCE_ITERATOR_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: // OBSOLETE williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: namespace detail { williamr@2: // EdgeDir tags williamr@2: struct in_edge_tag { }; williamr@2: struct out_edge_tag { }; williamr@2: williamr@2: template williamr@2: struct bidir_incidence_iterator { williamr@2: typedef bidir_incidence_iterator self; williamr@2: typedef Edge edge_type; williamr@2: typedef typename Edge::property_type EdgeProperty; williamr@2: public: williamr@2: typedef int difference_type; williamr@2: typedef std::forward_iterator_tag iterator_category; williamr@2: typedef edge_type reference; williamr@2: typedef edge_type value_type; williamr@2: typedef value_type* pointer; williamr@2: inline bidir_incidence_iterator() {} williamr@2: inline bidir_incidence_iterator(Iterator1D ii, Vertex src) williamr@2: : i(ii), _src(src) { } williamr@2: williamr@2: inline self& operator++() { ++i; return *this; } williamr@2: inline self operator++(int) { self tmp = *this; ++(*this); return tmp; } williamr@2: williamr@2: inline reference operator*() const { williamr@2: return deref_helper(EdgeDir()); williamr@2: } williamr@2: inline self* operator->() { return this; } williamr@2: williamr@2: Iterator1D& iter() { return i; } williamr@2: const Iterator1D& iter() const { return i; } williamr@2: williamr@2: Iterator1D i; williamr@2: Vertex _src; williamr@2: protected: williamr@2: inline reference deref_helper(out_edge_tag) const { williamr@2: return edge_type( _src, (*i).get_target(), &(*i).get_property() ); williamr@2: } williamr@2: inline reference deref_helper(in_edge_tag) const { williamr@2: return edge_type((*i).get_target(), _src, &(*i).get_property() ); williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline bool operator==(const bidir_incidence_iterator& x, williamr@2: const bidir_incidence_iterator& y) williamr@2: { williamr@2: return x.i == y.i; williamr@2: } williamr@2: template williamr@2: inline bool operator!=(const bidir_incidence_iterator& x, williamr@2: const bidir_incidence_iterator& y) williamr@2: { williamr@2: return x.i != y.i; williamr@2: } williamr@2: williamr@2: williamr@2: } williamr@2: } williamr@2: #endif