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