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

// Copyright 2007 Aaron Windsor

//

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

#define __ADD_EDGE_VISITORS_HPP__



#include <boost/property_map.hpp>



namespace boost

{



  struct default_add_edge_visitor

  {



    template <typename Graph, typename Vertex>

    void visit_vertex_pair(Vertex u, Vertex v, Graph& g)

    {

      add_edge(u,v,g);

    }



  };



  template<typename EdgeIndexMap>

  struct edge_index_update_visitor

  {



    typedef typename 

      property_traits<EdgeIndexMap>::value_type edge_index_value_t;



    edge_index_update_visitor(EdgeIndexMap em, 

                              edge_index_value_t next_index_available

                              ) : 

      m_em(em),

      m_next_index(next_index_available)

    {}

    

    template <typename Graph, typename Vertex>

    void visit_vertex_pair(Vertex u, Vertex v, Graph& g)

    {

      typedef typename graph_traits<Graph>::edge_descriptor edge_t;

      std::pair<edge_t, bool> return_value = add_edge(u,v,g);

      if (return_value.second)

        put( m_em, return_value.first, m_next_index++);

    }



  private:



    EdgeIndexMap m_em;

    edge_index_value_t m_next_index;



  };



} // namespace boost 



#endif //__ADD_EDGE_VISITORS_HPP__

