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 NDEBGU |
| 667 | std::pair<typename subgraph<G>::edge_descriptor, bool> fe = g.find_edge(e_global); |
| 668 | assert(fe.second && fe.first == e); |
| 669 | #endif //NDEBGU |
| 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 |