From bc5483502c699aba92d47756c3dd983e25d78a5b Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Tue, 24 Apr 2001 03:33:05 +0000 Subject: [PATCH] VC++ workaround [SVN r9967] --- include/boost/graph/detail/adjacency_list.hpp | 102 ++++++++++-------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/include/boost/graph/detail/adjacency_list.hpp b/include/boost/graph/detail/adjacency_list.hpp index 6b29080d..e8026eed 100644 --- a/include/boost/graph/detail/adjacency_list.hpp +++ b/include/boost/graph/detail/adjacency_list.hpp @@ -517,58 +517,68 @@ namespace boost { public virtual bidirectional_graph_tag { }; namespace detail { - // O(E/V) - template - inline void - remove_undirected_edge_dispatch(edge_descriptor e, - undirected_graph_helper& g_, - StoredProperty& p) - { - typedef typename Config::graph_type graph_type; - graph_type& g = static_cast(g_); - typename Config::OutEdgeList& out_el = g.out_edge_list(source(e, g)); - typename Config::OutEdgeList::iterator out_i = out_el.begin(); - for (; out_i != out_el.end(); ++out_i) - if (&(*out_i).get_property() == &p) { - g.m_edges.erase((*out_i).get_iter()); - out_el.erase(out_i); - break; - } - typename Config::OutEdgeList& in_el = g.out_edge_list(target(e, g)); - typename Config::OutEdgeList::iterator in_i = in_el.begin(); - for (; in_i != in_el.end(); ++in_i) - if (&(*in_i).get_property() == &p) { - in_el.erase(in_i); - return; - } - } - // O(E/V) - template - inline void - remove_undirected_edge_dispatch(edge_descriptor e, - undirected_graph_helper& g_, - no_property&) - { - typedef typename Config::graph_type graph_type; - graph_type& g = static_cast(g_); + // using class with specialization for dispatch is a VC++ workaround. + template + struct remove_undirected_edge_dispatch { - typename Config::OutEdgeList& out_el = g.out_edge_list(source(e, g)); - typename Config::OutEdgeList::iterator out_i = out_el.begin(); - for (; out_i != out_el.end(); ++out_i) + // O(E/V) + template + static void + apply(edge_descriptor e, + undirected_graph_helper& g_, + StoredProperty& p) + { + typedef typename Config::graph_type graph_type; + graph_type& g = static_cast(g_); + + typename Config::OutEdgeList& out_el = g.out_edge_list(source(e, g)); + typename Config::OutEdgeList::iterator out_i = out_el.begin(); + for (; out_i != out_el.end(); ++out_i) + if (&(*out_i).get_property() == &p) { + g.m_edges.erase((*out_i).get_iter()); + out_el.erase(out_i); + break; + } + typename Config::OutEdgeList& in_el = g.out_edge_list(target(e, g)); + typename Config::OutEdgeList::iterator in_i = in_el.begin(); + for (; in_i != in_el.end(); ++in_i) + if (&(*in_i).get_property() == &p) { + in_el.erase(in_i); + return; + } + } + }; + + template <> + struct remove_undirected_edge_dispatch { + // O(E/V) + template + static void + apply(edge_descriptor e, + undirected_graph_helper& g_, + no_property&) + { + typedef typename Config::graph_type graph_type; + graph_type& g = static_cast(g_); + + typename Config::OutEdgeList& out_el = g.out_edge_list(source(e, g)); + typename Config::OutEdgeList::iterator out_i = out_el.begin(); + for (; out_i != out_el.end(); ++out_i) if (&(*out_i).get_property() == (no_property*)e.get_property()) { g.m_edges.erase((*out_i).get_iter()); out_el.erase(out_i); break; } - typename Config::OutEdgeList& in_el = g.out_edge_list(target(e, g)); - typename Config::OutEdgeList::iterator in_i = in_el.begin(); - for (; in_i != in_el.end(); ++in_i) - if (&(*in_i).get_property() == (no_property*)e.get_property()) { - in_el.erase(in_i); - return; - } - } + typename Config::OutEdgeList& in_el = g.out_edge_list(target(e, g)); + typename Config::OutEdgeList::iterator in_i = in_el.begin(); + for (; in_i != in_el.end(); ++in_i) + if (&(*in_i).get_property() == (no_property*)e.get_property()) { + in_el.erase(in_i); + return; + } + } + }; // O(E/V) template @@ -630,7 +640,7 @@ namespace boost { remove_edge(typename Config::edge_descriptor e) { typedef typename Config::OutEdgeList::value_type::property_type PType; - detail::remove_undirected_edge_dispatch + detail::remove_undirected_edge_dispatch::apply (e, *this, *(PType*)e.get_property()); } // O(E/V)