From 2d7c00159ec5af154ac587bbb7f264b3cee7ea32 Mon Sep 17 00:00:00 2001 From: Jeremiah Willcock Date: Tue, 24 Nov 2009 20:17:54 +0000 Subject: [PATCH] Fixed uses of undocumented members of graph types; fixes #1021; fixes #2072 [SVN r57902] --- include/boost/graph/properties.hpp | 37 ++++++++++++++++++++++++--- include/boost/graph/reverse_graph.hpp | 17 ++++++++---- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/include/boost/graph/properties.hpp b/include/boost/graph/properties.hpp index 3a313b17..b0c18f2d 100644 --- a/include/boost/graph/properties.hpp +++ b/include/boost/graph/properties.hpp @@ -175,10 +175,39 @@ namespace boost { namespace detail { + template struct return_void {typedef void type;}; + + template + struct graph_tag_or_void { + typedef void type; + }; + + template + struct graph_tag_or_void::type> { + typedef typename Graph::graph_tag type; + }; + + // This code is from boost/thread/locks.hpp (with the member name changed + // and changed to look for a member type) and should be factored out into a + // separate library (type_traits?). + template + struct has_member_graph_tag { + typedef char true_type; + struct false_type { + true_type dummy[2]; + }; + + template + static true_type has_member(U*,typename U::graph_tag* = 0); + static false_type has_member(void*, ...); + + BOOST_STATIC_CONSTANT(bool, value=sizeof(has_member_graph_tag::has_member((T*)NULL))==sizeof(true_type)); + }; + template struct edge_property_map { - typedef typename Graph::edge_property_type Property; - typedef typename Graph::graph_tag graph_tag; + typedef typename edge_property_type::type Property; + typedef typename graph_tag_or_void::type graph_tag; typedef typename edge_property_selector::type Selector; typedef typename Selector::template bind_ Bind; @@ -187,8 +216,8 @@ namespace boost { }; template class vertex_property_map { - typedef typename Graph::vertex_property_type Property; - typedef typename Graph::graph_tag graph_tag; + typedef typename vertex_property_type::type Property; + typedef typename graph_tag_or_void::type graph_tag; typedef typename vertex_property_selector::type Selector; typedef typename Selector::template bind_ Bind; diff --git a/include/boost/graph/reverse_graph.hpp b/include/boost/graph/reverse_graph.hpp index 8fbd6364..0cabe6fa 100644 --- a/include/boost/graph/reverse_graph.hpp +++ b/include/boost/graph/reverse_graph.hpp @@ -75,11 +75,6 @@ class reverse_graph { typedef typename Traits::vertices_size_type vertices_size_type; typedef typename Traits::edges_size_type edges_size_type; - // More typedefs used by detail::edge_property_map, vertex_property_map - typedef typename boost::edge_property_type::type - edge_property_type; - typedef typename boost::vertex_property_type::type - vertex_property_type; typedef reverse_graph_tag graph_tag; #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES @@ -105,6 +100,18 @@ class reverse_graph { GraphRef m_g; }; + +// These are separate so they are not instantiated unless used (see bug 1021) +template +struct vertex_property_type > { + typedef typename boost::vertex_property_type::type type; +}; + +template +struct edge_property_type > { + typedef typename boost::edge_property_type::type type; +}; + #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES template struct vertex_bundle_type >