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