| 81 | | // Graph requirements |
| 82 | | typedef typename Traits::vertex_descriptor vertex_descriptor; |
| 83 | | typedef typename Traits::edge_descriptor edge_descriptor; |
| 84 | | typedef typename Traits::directed_category directed_category; |
| 85 | | typedef typename Traits::edge_parallel_category edge_parallel_category; |
| 86 | | typedef typename Traits::traversal_category traversal_category; |
| | 81 | // Graph requirements |
| | 82 | typedef typename Traits::vertex_descriptor vertex_descriptor; |
| | 83 | typedef typename Traits::edge_descriptor edge_descriptor; |
| | 84 | typedef typename Traits::directed_category directed_category; |
| | 85 | typedef typename Traits::edge_parallel_category edge_parallel_category; |
| | 86 | typedef typename Traits::traversal_category traversal_category; |
| | 204 | // Is edge e (of the root graph) contained in this subgraph? |
| | 205 | // If so, return the matching local edge. |
| | 206 | std::pair<edge_descriptor, bool> |
| | 207 | find_edge(edge_descriptor e_global) const { |
| | 208 | if (is_root()) return std::make_pair(e_global, true); |
| | 209 | typename LocalEdgeMap::const_iterator i = |
| | 210 | m_local_edge.find(get(get(edge_index, root().m_graph), e_global)); |
| | 211 | bool valid = i != m_local_edge.end(); |
| | 212 | return std::make_pair((valid ? (*i).second : edge_descriptor()), valid); |
| | 213 | } |
| | 214 | |
| 634 | | } |
| 635 | | } |
| 636 | | |
| 637 | | template <typename Edge, typename Graph> |
| 638 | | void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g) |
| 639 | | { |
| 640 | | remove_edge(g.global_to_local(e_global), g.m_graph); |
| 641 | | children_remove_edge(e_global, g.m_children); |
| 642 | | } |
| 643 | | |
| 644 | | template <typename Edge, typename Graph> |
| 645 | | void remove_edge_recur_up(Edge e_global, subgraph<Graph>& g) |
| 646 | | { |
| 647 | | if (g.is_root()) { |
| 648 | | remove_edge(e_global, g.m_graph); |
| 649 | | children_remove_edge(e_global, g.m_children); |
| 650 | | } else { |
| 651 | | remove_edge_recur_up(e_global, *g.m_parent); |
| | 640 | children_remove_edge<G>(e_global, (*i)->m_children); |
| | 641 | remove_edge(found.first, (*i)->m_graph); |
| 675 | | if(g.is_root()) { |
| 676 | | detail::remove_edge_recur_up(e, g); |
| 677 | | } else { |
| 678 | | detail::remove_edge_recur_up(g.local_to_global(e), g); |
| 679 | | } |
| | 665 | typename subgraph<G>::edge_descriptor e_global = g.local_to_global(e); |
| | 666 | #ifndef NDEBUG |
| | 667 | std::pair<typename subgraph<G>::edge_descriptor, bool> fe = g.find_edge(e_global); |
| | 668 | assert(fe.second && fe.first == e); |
| | 669 | #endif //NDEBUG |
| | 670 | subgraph<G> &root = g.root(); // chase to root |
| | 671 | detail::children_remove_edge<G>(e_global, root.m_children); |
| | 672 | remove_edge(e_global, root.m_graph); // kick edge from root |