--- subgraph.hpp.orig 2011-02-11 13:50:58.000000000 +0100 +++ subgraph.hpp 2011-02-11 14:01:57.000000000 +0100 @@ -78,12 +78,12 @@ typedef graph_traits Traits; typedef std::list*> ChildrenList; public: -// Graph requirements -typedef typename Traits::vertex_descriptor vertex_descriptor; -typedef typename Traits::edge_descriptor edge_descriptor; -typedef typename Traits::directed_category directed_category; -typedef typename Traits::edge_parallel_category edge_parallel_category; -typedef typename Traits::traversal_category traversal_category; + // Graph requirements + typedef typename Traits::vertex_descriptor vertex_descriptor; + typedef typename Traits::edge_descriptor edge_descriptor; + typedef typename Traits::directed_category directed_category; + typedef typename Traits::edge_parallel_category edge_parallel_category; + typedef typename Traits::traversal_category traversal_category; // IncidenceGraph requirements typedef typename Traits::out_edge_iterator out_edge_iterator; @@ -196,12 +196,22 @@ std::pair find_vertex(vertex_descriptor u_global) const { if (is_root()) return std::make_pair(u_global, true); - typename std::map::const_iterator - i = m_local_vertex.find(u_global); + typename LocalVertexMap::const_iterator i = m_local_vertex.find(u_global); bool valid = i != m_local_vertex.end(); return std::make_pair((valid ? (*i).second : null_vertex()), valid); } + // Is edge e (of the root graph) contained in this subgraph? + // If so, return the matching local edge. + std::pair + find_edge(edge_descriptor e_global) const { + if (is_root()) return std::make_pair(e_global, true); + typename LocalEdgeMap::const_iterator i = + m_local_edge.find(get(get(edge_index, root().m_graph), e_global)); + bool valid = i != m_local_edge.end(); + return std::make_pair((valid ? (*i).second : edge_descriptor()), valid); + } + // Return the parent graph. subgraph& parent() { return *m_parent; } const subgraph& parent() const { return *m_parent; } @@ -617,38 +627,18 @@ //------------------------------------------------------------------------- // implementation of remove_edge(e,g) - template - void remove_edge_recur_down(Edge e_global, subgraph& g); - template + template void children_remove_edge(Edge e_global, Children& c) { for(typename Children::iterator i = c.begin(); i != c.end(); ++i) { - if((*i)->find_vertex(source(e_global, **i)).second && - (*i)->find_vertex(target(e_global, **i)).second) - { - remove_edge_recur_down(source(e_global, **i), - target(e_global, **i), - **i); + std::pair::edge_descriptor, bool> found = + (*i)->find_edge(e_global); + if (!found.second) { + continue; } - } - } - - template - void remove_edge_recur_down(Edge e_global, subgraph& g) - { - remove_edge(g.global_to_local(e_global), g.m_graph); - children_remove_edge(e_global, g.m_children); - } - - template - void remove_edge_recur_up(Edge e_global, subgraph& g) - { - if (g.is_root()) { - remove_edge(e_global, g.m_graph); - children_remove_edge(e_global, g.m_children); - } else { - remove_edge_recur_up(e_global, *g.m_parent); + children_remove_edge(e_global, (*i)->m_children); + remove_edge(found.first, (*i)->m_graph); } } @@ -672,11 +662,14 @@ void remove_edge(typename subgraph::edge_descriptor e, subgraph& g) { - if(g.is_root()) { - detail::remove_edge_recur_up(e, g); - } else { - detail::remove_edge_recur_up(g.local_to_global(e), g); - } + typename subgraph::edge_descriptor e_global = g.local_to_global(e); +#ifndef NDEBGU + std::pair::edge_descriptor, bool> fe = g.find_edge(e_global); + assert(fe.second && fe.first == e); +#endif //NDEBGU + subgraph &root = g.root(); // chase to root + detail::children_remove_edge(e_global, root.m_children); + remove_edge(e_global, root.m_graph); // kick edge from root } // This is slow, but there may not be a good way to do it safely otherwise