From 7fa4ba5abc0f309d9e207453c1cf23d90aebe235 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Mon, 25 Sep 2000 04:05:40 +0000 Subject: [PATCH] fixed some function lookup problems due to VC++ no Koenig [SVN r7810] --- include/boost/graph/detail/adjacency_list.hpp | 53 +++++++++++++------ .../boost/graph/detail/array_binary_tree.hpp | 2 +- include/boost/graph/reverse_graph.hpp | 22 +++++++- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/include/boost/graph/detail/adjacency_list.hpp b/include/boost/graph/detail/adjacency_list.hpp index 2ca55f33..c7651438 100644 --- a/include/boost/graph/detail/adjacency_list.hpp +++ b/include/boost/graph/detail/adjacency_list.hpp @@ -41,6 +41,9 @@ // REVISION HISTORY: // // $Log$ +// Revision 1.15 2000/09/25 04:05:40 jsiek +// fixed some function lookup problems due to VC++ no Koenig +// // Revision 1.14 2000/09/24 22:59:22 david_abrahams // untabify so I can read it! // @@ -1103,18 +1106,21 @@ namespace boost { typename boost::property_map::const_type >::value_type - get(Property p, const adj_list_helper& g, const Key& key) { - typedef typename Property::kind Kind; + get(Property p, const adj_list_helper& g_, + const Key& key) { + typedef typename Config::graph_type Graph; + const Graph& g = static_cast(g_); return get(get(p, g), key); } - template + + template inline void put(Property p, adj_list_helper& g, const Key& key, const Value& value) { typedef typename Config::graph_type Graph; typedef typename boost::property_map::type Map; - Map pmap = get(p, g); + Map pmap = get(p, static_cast(g)); put(pmap, key, value); } @@ -1635,6 +1641,7 @@ namespace boost { }; + } // namespace detail //========================================================================= // Vertex Property Maps @@ -1700,9 +1707,9 @@ namespace boost { struct vec_adj_list_any_vertex_pa { template struct bind { - typedef detail::vec_adj_list_vertex_property_map + typedef vec_adj_list_vertex_property_map type; - typedef detail::vec_adj_list_vertex_property_map + typedef vec_adj_list_vertex_property_map const_type; }; }; @@ -1714,6 +1721,7 @@ namespace boost { typedef vec_adj_list_vertex_id_map const_type; }; }; + namespace detail { template struct vec_adj_list_choose_vertex_pa_helper { typedef vec_adj_list_any_vertex_pa type; @@ -1730,17 +1738,13 @@ namespace boost { typedef typename Bind::type type; typedef typename Bind::const_type const_type; }; + } // namespace detail - //========================================================================= // Edge Property Map template struct adj_list_edge_property_map - : public boost::put_get_at_helper< - typename plugin_value::type, - adj_list_edge_property_map - > { typedef typename plugin_value::type value_type; typedef detail::bidir_edge key_type; @@ -1754,16 +1758,34 @@ namespace boost { return get_plugin_value(*p, value_type(), Tag()); } }; + // Very strange VC++ bug appears when I use put_get_at helper + // so I explicitly write out get and put. Also, didn't just + // call operator[] because that also causes the problem! + template + inline typename adj_list_edge_property_map::value_type + get(const adj_list_edge_property_map& pmap, const K& e) + { + typedef typename plugin_value::type value_type; + const P* p = (P*)e.get_plugin(); + return get_plugin_value(*p, value_type(), Tag()); + } + template + inline void + put(adj_list_edge_property_map& pmap, const K& k, + const V& val) + { + typedef typename plugin_value::type value_type; + const P* p = (P*)e.get_plugin(); + get_plugin_value(*p, value_type(), Tag()) = val; + } - } // namespace detail - // Edge Property Maps struct adj_list_edge_property_selector { template struct bind { - typedef detail::adj_list_edge_property_map + typedef adj_list_edge_property_map type; typedef type const_type; @@ -1783,7 +1805,7 @@ namespace boost { struct adj_list_vertex_property_selector { template struct bind { - typedef detail::adj_list_vertex_property_map type; + typedef adj_list_vertex_property_map type; typedef type const_type; }; }; @@ -1805,7 +1827,6 @@ namespace boost { typedef vec_adj_list_vertex_property_selector type; }; - } // namespace boost #ifdef BOOST_NO_ITERATOR_ADAPTORS diff --git a/include/boost/graph/detail/array_binary_tree.hpp b/include/boost/graph/detail/array_binary_tree.hpp index e1faf81f..7fd7bf44 100644 --- a/include/boost/graph/detail/array_binary_tree.hpp +++ b/include/boost/graph/detail/array_binary_tree.hpp @@ -57,7 +57,7 @@ public: struct children_type { struct iterator - : std::iterator { // replace with iterator_adaptor implementation -JGS diff --git a/include/boost/graph/reverse_graph.hpp b/include/boost/graph/reverse_graph.hpp index b0f7e950..b2a269c0 100644 --- a/include/boost/graph/reverse_graph.hpp +++ b/include/boost/graph/reverse_graph.hpp @@ -63,7 +63,8 @@ class reverse_graph { }; template -inline reverse_graph make_reverse_graph(BidirectionalGraph& g) +inline reverse_graph +make_reverse_graph(BidirectionalGraph& g) { return reverse_graph(g); } @@ -82,6 +83,23 @@ get(Property p, const reverse_graph& g) return get(p, g.m_g); } +template +typename property_traits< + typename property_map::const_type +>::value_type +get(Property p, const reverse_graph& g, const Key& k) +{ + return get(p, g.m_g, k); +} + +template +void +put(Property p, const reverse_graph& g, const Key& k, + const Value& val) +{ + put(p, g.m_g, k, val); +} + template std::pair vertices(const reverse_graph& g) @@ -148,6 +166,6 @@ in_degree(const typename BidirectionalGraph::vertex_descriptor u, return out_degree(u, g.m_g); } -} +} // namespace boost #endif