
Jens Müller wrote:
leda_graph.hpp has an adapter for leda::node_array's as property maps.
Could the same code (replacing node by edge, where appropriate) be used to make an adapter for leda::edge_array's?
Well, I'll try this out right now ...
The code in the attached file indeed seems to work ... Unfortunately, I cannot really test this at the moment - the graphml reader from graph-tool does not seem to work with LEDA graphs. Either I'm too stupid to use the LEDA adapter, or all kinds of types in graph_traits are not defined for LEDA graphs. /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:26: error: no type named `vertex_descriptor' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:27: error: no type named `edge_descriptor' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:28: error: no type named `adjacency_iterator' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:29: error: no type named `out_edge_iterator' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:30: error: no type named `in_edge_iterator' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:31: error: no type named `vertex_iterator' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:32: error: no type named `edge_iterator' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:34: error: no type named `directed_category' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:35: error: no type named `edge_parallel_category' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:36: error: no type named `traversal_category' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:38: error: no type named `vertices_size_type' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:39: error: no type named `edges_size_type' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:40: error: no type named `degree_size_type' in `class main(char, char**)::Graph' /home/jmueller/software-gcc34/boost/include/boost-1_33_1/boost/graph/graph_traits.hpp:48: error: no type named `vertex_descriptor' in `struct boost::graph_traits<main(char, char**)::Graph>' #include <boost/config.hpp> #include <boost/iterator/iterator_facade.hpp> #include <boost/graph/graph_traits.hpp> #include <boost/graph/properties.hpp> #include <LEDA/graph.h> #include <LEDA/node_array.h> #include <LEDA/node_map.h> namespace boost { // property map interface to the LEDA edge_array class template <class E, class ERef, class EdgeMapPtr> class leda_edge_property_map : public put_get_helper<ERef, leda_edge_property_map<E, ERef, EdgeMapPtr> > { public: typedef E value_type; typedef ERef reference; typedef leda_edge key_type; typedef lvalue_property_map_tag category; leda_edge_property_map(EdgeMapPtr a) : m_array(a) { } ERef operator[](leda_edge n) const { return (*m_array)[n]; } protected: EdgeMapPtr m_array; }; template <class E> leda_edge_property_map<E, const E&, const leda_edge_array<E>*> make_leda_node_property_map(const leda_node_array<E>& a) { typedef leda_edge_property_map<E, const E&, const leda_node_array<E>*> pmap_type; return pmap_type(&a); } template <class E> leda_edge_property_map<E, E&, leda_edge_array<E>*> make_leda_edge_property_map(leda_edge_array<E>& a) { typedef leda_edge_property_map<E, E&, leda_edge_array<E>*> pmap_type; return pmap_type(&a); } template <class E> leda_edge_property_map<E, const E&, const leda_edge_map<E>*> make_leda_edge_property_map(const leda_edge_map<E>& a) { typedef leda_edge_property_map<E,const E&,const leda_edge_map<E>*> pmap_type; return pmap_type(&a); } template <class E> leda_edge_property_map<E, E&, leda_edge_map<E>*> make_leda_edge_property_map(leda_edge_map<E>& a) { typedef leda_edge_property_map<E, E&, leda_edge_map<E>*> pmap_type; return pmap_type(&a); } /* // g++ 'enumeral_type' in template unification not implemented workaround template <class vtype, class etype, class Tag> struct property_map<leda::GRAPH<vtype, etype>, Tag> { typedef typename leda_property_map<Tag>::template bind_<vtype, etype> map_gen; typedef typename map_gen::type type; typedef typename map_gen::const_type const_type; }; template <class vtype, class etype, class PropertyTag, class Key> inline typename boost::property_traits< typename boost::property_map<leda::GRAPH<vtype, etype>,PropertyTag>::const_type
::value_type get(PropertyTag p, const leda::GRAPH<vtype, etype>& g, const Key& key) { return get(get(p, g), key); }
template <class vtype, class etype, class PropertyTag, class Key,class Value> inline void put(PropertyTag p, leda::GRAPH<vtype, etype>& g, const Key& key, const Value& value) { typedef typename property_map<leda::GRAPH<vtype, etype>, PropertyTag>::type Map; Map pmap = get(p, g); put(pmap, key, value); } */ } // namespace boost