Chris@16: // Chris@16: //======================================================================= Chris@16: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. Chris@16: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: //======================================================================= Chris@16: Chris@16: #ifndef BOOST_GRAPH_DETAIL_EDGE_HPP Chris@16: #define BOOST_GRAPH_DETAIL_EDGE_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: struct edge_base Chris@16: { Chris@16: inline edge_base() {} Chris@16: inline edge_base(Vertex s, Vertex d) Chris@16: : m_source(s), m_target(d) { } Chris@16: Vertex m_source; Chris@16: Vertex m_target; Chris@16: }; Chris@16: Chris@16: template Chris@16: class edge_desc_impl : public edge_base { Chris@16: typedef edge_desc_impl self; Chris@16: typedef edge_base Base; Chris@16: public: Chris@16: typedef void property_type; Chris@16: Chris@16: inline edge_desc_impl() : m_eproperty(0) {} Chris@16: Chris@16: inline edge_desc_impl(Vertex s, Vertex d, const property_type* eplug) Chris@16: : Base(s,d), m_eproperty(const_cast(eplug)) { } Chris@16: Chris@16: property_type* get_property() { return m_eproperty; } Chris@16: const property_type* get_property() const { return m_eproperty; } Chris@16: Chris@16: // protected: Chris@16: property_type* m_eproperty; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline bool Chris@16: operator==(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return a.get_property() == b.get_property(); Chris@16: } Chris@16: template Chris@16: inline bool Chris@16: operator!=(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return ! (a.get_property() == b.get_property()); Chris@16: } Chris@16: Chris@16: // Order edges according to the address of their property object Chris@16: template Chris@16: inline bool Chris@16: operator<(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return a.get_property() < b.get_property(); Chris@16: } Chris@16: template Chris@16: inline bool Chris@16: operator<=(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return a.get_property() <= b.get_property(); Chris@16: } Chris@16: template Chris@16: inline bool Chris@16: operator>(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return a.get_property() > b.get_property(); Chris@16: } Chris@16: template Chris@16: inline bool Chris@16: operator>=(const detail::edge_desc_impl& a, Chris@16: const detail::edge_desc_impl& b) Chris@16: { Chris@16: return a.get_property() >= b.get_property(); Chris@16: } Chris@16: Chris@16: } //namespace detail Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: namespace std { Chris@16: template Chris@16: std::basic_ostream& Chris@16: operator<<(std::basic_ostream& os, Chris@16: const boost::detail::edge_desc_impl& e) Chris@16: { Chris@16: return os << "(" << e.m_source << "," << e.m_target << ")"; Chris@16: } Chris@16: } Chris@16: Chris@101: // Boost's functional/hash Chris@101: namespace boost { Chris@101: template Chris@101: struct hash > Chris@101: { Chris@101: std::size_t operator()(const boost::detail::edge_desc_impl & x) const Chris@101: { return hash_value(x.get_property()); } Chris@101: }; Chris@101: } Chris@101: Chris@16: Chris@16: #endif // BOOST_GRAPH_DETAIL_DETAIL_EDGE_HPP