//

//=======================================================================

// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.

// 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_GRAPH_DETAIL_INCIDENCE_ITERATOR_HPP

#define BOOST_GRAPH_DETAIL_INCIDENCE_ITERATOR_HPP



#include <utility>

#include <iterator>



// OBSOLETE



namespace boost {



  namespace detail {

    // EdgeDir tags

    struct in_edge_tag { };

    struct out_edge_tag { };

    

    template <class Vertex, class Edge, class Iterator1D, class EdgeDir>

    struct bidir_incidence_iterator {

      typedef bidir_incidence_iterator self;

      typedef Edge edge_type;

      typedef typename Edge::property_type EdgeProperty;

    public:

      typedef int difference_type;

      typedef std::forward_iterator_tag iterator_category;

      typedef edge_type reference;

      typedef edge_type value_type;

      typedef value_type* pointer;

      inline bidir_incidence_iterator() {}

      inline bidir_incidence_iterator(Iterator1D ii, Vertex src) 

        : i(ii), _src(src) { }

      

      inline self& operator++() { ++i; return *this; }

      inline self operator++(int) { self tmp = *this; ++(*this); return tmp; }

      

      inline reference operator*() const {

        return deref_helper(EdgeDir());

      }

      inline self* operator->() { return this; }

      

      Iterator1D& iter() { return i; }

      const Iterator1D& iter() const { return i; }



      Iterator1D i;

      Vertex _src;

    protected:

      inline reference deref_helper(out_edge_tag) const {

        return edge_type( _src, (*i).get_target(), &(*i).get_property() );

      }

      inline reference deref_helper(in_edge_tag) const {

        return edge_type((*i).get_target(), _src, &(*i).get_property() );

      }

    };



    template <class V, class E, class Iter, class Dir>

    inline bool operator==(const bidir_incidence_iterator<V,E,Iter,Dir>& x,

                           const bidir_incidence_iterator<V,E,Iter,Dir>& y)

    {

      return x.i == y.i;

    }

    template <class V, class E, class Iter, class Dir>

    inline bool operator!=(const bidir_incidence_iterator<V,E,Iter,Dir>& x,

                           const bidir_incidence_iterator<V,E,Iter,Dir>& y)

    {

      return x.i != y.i;

    }





  }

} 

#endif

