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
							 |