// (c) Copyright Juergen Hunold 2012 // Use, modification and distribution is subject to 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) #include #include #include namespace boost { enum edge_info_t { edge_info = 114 }; BOOST_INSTALL_PROPERTY( edge, info ); } template< typename EdgeInfo, typename Directed > class Graph { public: typedef boost::property< boost::edge_info_t, EdgeInfo > tEdge_property; typedef boost::adjacency_list< boost::setS, boost::vecS, Directed, boost::no_property, tEdge_property > tGraph; typedef typename boost::graph_traits< tGraph >::vertex_descriptor tNode; typedef typename boost::graph_traits< tGraph >::edge_descriptor tEdge; protected: tGraph m_Graph; }; class DataEdge; class UndirectedGraph : public Graph< DataEdge*, boost::undirectedS > { public: template< class Evaluator, class Filter > void dijkstra( Evaluator const&, Filter const& ) const; }; template< typename Graph, typename Derived > struct Evaluator : public boost::put_get_helper< int, Derived > { typedef int value_type; typedef typename Graph::tEdge key_type; typedef int reference; typedef boost::readable_property_map_tag category; explicit Evaluator( Graph const* pGraph ); }; template< typename Graph > struct LengthEvaluator : public Evaluator< Graph, LengthEvaluator > { explicit LengthEvaluator( Graph const* pGraph ); typedef typename Evaluator >::reference reference; typedef typename Evaluator >::key_type key_type; virtual reference operator[] ( key_type const& edge ) const; }; template< class Graph > struct EdgeFilter { typedef typename Graph::tEdge key_type; EdgeFilter(); explicit EdgeFilter( Graph const*); bool operator()( key_type const& ) const; private: const Graph* m_pGraph; }; template< class Evaluator, class Filter > void UndirectedGraph::dijkstra( Evaluator const& rEvaluator, Filter const& rFilter ) const { tNode nodeSource = vertex(0, m_Graph); std::vector< tNode > predecessors( num_vertices(m_Graph) ); boost::filtered_graph< tGraph, Filter > filteredGraph( m_Graph, rFilter ); boost::dijkstra_shortest_paths( filteredGraph, nodeSource, boost::predecessor_map( &predecessors[0] ) .weight_map( rEvaluator ) ); } // explicit instantiation template void UndirectedGraph::dijkstra( LengthEvaluator const&, EdgeFilter const& ) const; int main(int, char**) {return 0;} // Tests above will fail to compile if anything is broken