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
 | 
