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_EDGE_HPP
williamr@2: #define BOOST_GRAPH_DETAIL_EDGE_HPP
williamr@2: 
williamr@2: #if __GNUC__ < 3
williamr@2: #include <iostream>
williamr@2: #else
williamr@2: #include <iosfwd>
williamr@2: #endif
williamr@2: 
williamr@2: namespace boost {
williamr@2: 
williamr@2:   namespace  detail {
williamr@2: 
williamr@2:     template <typename Directed, typename Vertex>
williamr@2:     struct edge_base
williamr@2:     {
williamr@2:       inline edge_base() {} 
williamr@2:       inline edge_base(Vertex s, Vertex d)
williamr@2:         : m_source(s), m_target(d) { }
williamr@2:       Vertex m_source;
williamr@2:       Vertex m_target;
williamr@2:     };
williamr@2: 
williamr@2:     template <typename Directed, typename Vertex>
williamr@2:     class edge_desc_impl  : public edge_base<Directed,Vertex> {
williamr@2:       typedef edge_desc_impl                              self;
williamr@2:       typedef edge_base<Directed,Vertex> Base;
williamr@2:     public: 
williamr@2:       typedef void                              property_type;
williamr@2:       
williamr@2:       inline edge_desc_impl() : m_eproperty(0) {} 
williamr@2:       
williamr@2:       inline edge_desc_impl(Vertex s, Vertex d, const property_type* eplug)
williamr@2:         : Base(s,d), m_eproperty(const_cast<property_type*>(eplug)) { }
williamr@2:       
williamr@2:       property_type* get_property() { return m_eproperty; }
williamr@2:       const property_type* get_property() const { return m_eproperty; }
williamr@2:       
williamr@2:       //  protected:
williamr@2:       property_type* m_eproperty;
williamr@2:     };
williamr@2:     
williamr@2:     template <class D, class V>
williamr@2:     inline bool
williamr@2:     operator==(const detail::edge_desc_impl<D,V>& a, 
williamr@2:                const detail::edge_desc_impl<D,V>& b)
williamr@2:     {
williamr@2:       return a.get_property() == b.get_property();
williamr@2:     }
williamr@2:     template <class D, class V>
williamr@2:     inline bool
williamr@2:     operator!=(const detail::edge_desc_impl<D,V>& a, 
williamr@2:                const detail::edge_desc_impl<D,V>& b)
williamr@2:     {
williamr@2:       return ! (a.get_property() == b.get_property());
williamr@2:     }
williamr@2: 
williamr@2:   } //namespace detail
williamr@2:   
williamr@2: } // namespace boost
williamr@2: 
williamr@2: namespace std {
williamr@2: 
williamr@2: #if __GNUC__ < 3
williamr@2:   template <class D, class V>
williamr@2:   std::ostream& 
williamr@2:   operator<<(std::ostream& os, const boost::detail::edge_desc_impl<D,V>& e)
williamr@2:   {
williamr@2:     return os << "(" << e.m_source << "," << e.m_target << ")";
williamr@2:   }
williamr@2: #else
williamr@2:   template <class Char, class Traits, class D, class V>
williamr@2:   std::basic_ostream<Char, Traits>& 
williamr@2:   operator<<(std::basic_ostream<Char, Traits>& os,
williamr@2:              const boost::detail::edge_desc_impl<D,V>& e)
williamr@2:   {
williamr@2:     return os << "(" << e.m_source << "," << e.m_target << ")";
williamr@2:   }
williamr@2: #endif
williamr@2: 
williamr@2: }
williamr@2: 
williamr@2: 
williamr@2: #endif // BOOST_GRAPH_DETAIL_DETAIL_EDGE_HPP