1 //
2 //=======================================================================
3 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
4 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //=======================================================================
10 
11 #ifndef BOOST_GRAPH_DETAIL_EDGE_HPP
12 #define BOOST_GRAPH_DETAIL_EDGE_HPP
13 
14 #include <iosfwd>
15 
16 namespace boost {
17 
18   namespace  detail {
19 
20     template <typename Directed, typename Vertex>
21     struct edge_base
22     {
edge_baseboost::detail::edge_base23       inline edge_base() {}
edge_baseboost::detail::edge_base24       inline edge_base(Vertex s, Vertex d)
25         : m_source(s), m_target(d) { }
26       Vertex m_source;
27       Vertex m_target;
28     };
29 
30     template <typename Directed, typename Vertex>
31     class edge_desc_impl  : public edge_base<Directed,Vertex> {
32       typedef edge_desc_impl                              self;
33       typedef edge_base<Directed,Vertex> Base;
34     public:
35       typedef void                              property_type;
36 
edge_desc_impl()37       inline edge_desc_impl() : m_eproperty(0) {}
38 
edge_desc_impl(Vertex s,Vertex d,const property_type * eplug)39       inline edge_desc_impl(Vertex s, Vertex d, const property_type* eplug)
40         : Base(s,d), m_eproperty(const_cast<property_type*>(eplug)) { }
41 
get_property()42       property_type* get_property() { return m_eproperty; }
get_property() const43       const property_type* get_property() const { return m_eproperty; }
44 
45       //  protected:
46       property_type* m_eproperty;
47     };
48 
49     template <class D, class V>
50     inline bool
operator ==(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)51     operator==(const detail::edge_desc_impl<D,V>& a,
52                const detail::edge_desc_impl<D,V>& b)
53     {
54       return a.get_property() == b.get_property();
55     }
56     template <class D, class V>
57     inline bool
operator !=(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)58     operator!=(const detail::edge_desc_impl<D,V>& a,
59                const detail::edge_desc_impl<D,V>& b)
60     {
61       return ! (a.get_property() == b.get_property());
62     }
63 
64     // Order edges according to the address of their property object
65     template <class D, class V>
66     inline bool
operator <(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)67     operator<(const detail::edge_desc_impl<D,V>& a,
68                const detail::edge_desc_impl<D,V>& b)
69     {
70       return a.get_property() < b.get_property();
71     }
72     template <class D, class V>
73     inline bool
operator <=(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)74     operator<=(const detail::edge_desc_impl<D,V>& a,
75                const detail::edge_desc_impl<D,V>& b)
76     {
77       return a.get_property() <= b.get_property();
78     }
79     template <class D, class V>
80     inline bool
operator >(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)81     operator>(const detail::edge_desc_impl<D,V>& a,
82                const detail::edge_desc_impl<D,V>& b)
83     {
84       return a.get_property() > b.get_property();
85     }
86     template <class D, class V>
87     inline bool
operator >=(const detail::edge_desc_impl<D,V> & a,const detail::edge_desc_impl<D,V> & b)88     operator>=(const detail::edge_desc_impl<D,V>& a,
89                const detail::edge_desc_impl<D,V>& b)
90     {
91       return a.get_property() >= b.get_property();
92     }
93 
94   } //namespace detail
95 
96 } // namespace boost
97 
98 namespace std {
99   template <class Char, class Traits, class D, class V>
100   std::basic_ostream<Char, Traits>&
operator <<(std::basic_ostream<Char,Traits> & os,const boost::detail::edge_desc_impl<D,V> & e)101   operator<<(std::basic_ostream<Char, Traits>& os,
102              const boost::detail::edge_desc_impl<D,V>& e)
103   {
104     return os << "(" << e.m_source << "," << e.m_target << ")";
105   }
106 }
107 
108 // Boost's functional/hash
109 namespace boost {
110   template<typename D, typename V>
111   struct hash<boost::detail::edge_desc_impl<D, V> >
112   {
operator ()boost::hash113     std::size_t operator()(const boost::detail::edge_desc_impl<D, V> & x) const
114     { return hash_value(x.get_property()); }
115   };
116 }
117 
118 
119 #endif // BOOST_GRAPH_DETAIL_DETAIL_EDGE_HPP
120