122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//
 | 
						|
//=======================================================================
 | 
						|
// 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_EDGE_HPP
 | 
						|
#define BOOST_GRAPH_DETAIL_EDGE_HPP
 | 
						|
 | 
						|
#include <iosfwd>
 | 
						|
 | 
						|
#include <boost/functional/hash.hpp>
 | 
						|
 | 
						|
namespace boost {
 | 
						|
 | 
						|
  namespace  detail {
 | 
						|
 | 
						|
    template <typename Directed, typename Vertex>
 | 
						|
    struct edge_base
 | 
						|
    {
 | 
						|
      inline edge_base() {} 
 | 
						|
      inline edge_base(Vertex s, Vertex d)
 | 
						|
        : m_source(s), m_target(d) { }
 | 
						|
      Vertex m_source;
 | 
						|
      Vertex m_target;
 | 
						|
    };
 | 
						|
 | 
						|
    template <typename Directed, typename Vertex>
 | 
						|
    class edge_desc_impl  : public edge_base<Directed,Vertex> {
 | 
						|
      typedef edge_desc_impl                              self;
 | 
						|
      typedef edge_base<Directed,Vertex> Base;
 | 
						|
    public: 
 | 
						|
      typedef void                              property_type;
 | 
						|
      
 | 
						|
      inline edge_desc_impl() : m_eproperty(0) {} 
 | 
						|
      
 | 
						|
      inline edge_desc_impl(Vertex s, Vertex d, const property_type* eplug)
 | 
						|
        : Base(s,d), m_eproperty(const_cast<property_type*>(eplug)) { }
 | 
						|
      
 | 
						|
      property_type* get_property() { return m_eproperty; }
 | 
						|
      const property_type* get_property() const { return m_eproperty; }
 | 
						|
      
 | 
						|
      //  protected:
 | 
						|
      property_type* m_eproperty;
 | 
						|
    };
 | 
						|
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator==(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return a.get_property() == b.get_property();
 | 
						|
    }
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator!=(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return ! (a.get_property() == b.get_property());
 | 
						|
    }
 | 
						|
 | 
						|
    // Order edges according to the address of their property object
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator<(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return a.get_property() < b.get_property();
 | 
						|
    }
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator<=(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return a.get_property() <= b.get_property();
 | 
						|
    }
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator>(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return a.get_property() > b.get_property();
 | 
						|
    }
 | 
						|
    template <class D, class V>
 | 
						|
    inline bool
 | 
						|
    operator>=(const detail::edge_desc_impl<D,V>& a, 
 | 
						|
               const detail::edge_desc_impl<D,V>& b)
 | 
						|
    {
 | 
						|
      return a.get_property() >= b.get_property();
 | 
						|
    }
 | 
						|
 | 
						|
  } //namespace detail
 | 
						|
  
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
namespace std {
 | 
						|
  template <class Char, class Traits, class D, class V>
 | 
						|
  std::basic_ostream<Char, Traits>& 
 | 
						|
  operator<<(std::basic_ostream<Char, Traits>& os,
 | 
						|
             const boost::detail::edge_desc_impl<D,V>& e)
 | 
						|
  {
 | 
						|
    return os << "(" << e.m_source << "," << e.m_target << ")";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Boost's functional/hash
 | 
						|
namespace boost {
 | 
						|
  template<typename D, typename V>
 | 
						|
  struct hash<boost::detail::edge_desc_impl<D, V> >
 | 
						|
  {
 | 
						|
    std::size_t operator()(const boost::detail::edge_desc_impl<D, V> & x) const
 | 
						|
    { return hash_value(x.get_property()); }
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#endif // BOOST_GRAPH_DETAIL_DETAIL_EDGE_HPP
 |