$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66203 - trunk/boost/graph
From: jewillco_at_[hidden]
Date: 2010-10-26 14:24:01
Author: jewillco
Date: 2010-10-26 14:24:01 EDT (Tue, 26 Oct 2010)
New Revision: 66203
URL: http://svn.boost.org/trac/boost/changeset/66203
Log:
Repaired copy_component() using suggestion from Christopher Alfeld; fixes #4793
Text files modified: 
   trunk/boost/graph/copy.hpp |    21 ++++++++++++++++++---                   
   1 files changed, 18 insertions(+), 3 deletions(-)
Modified: trunk/boost/graph/copy.hpp
==============================================================================
--- trunk/boost/graph/copy.hpp	(original)
+++ trunk/boost/graph/copy.hpp	2010-10-26 14:24:01 EDT (Tue, 26 Oct 2010)
@@ -350,15 +350,28 @@
         : g_out(graph), orig2copy(c), copy_vertex(cv), copy_edge(ce) { }
 
       template <class Vertex, class Graph>
-      void examine_vertex(Vertex u, const Graph& g_in) const {
+      typename graph_traits<NewGraph>::vertex_descriptor copy_one_vertex(Vertex u, const Graph& g_in) const {
         typename graph_traits<NewGraph>::vertex_descriptor
           new_u = add_vertex(g_out);
         put(orig2copy, u, new_u);
         copy_vertex(u, new_u);
+        return new_u;
       }
       
       template <class Edge, class Graph>
-      void examine_edge(Edge e, const Graph& g_in) const {
+      void tree_edge(Edge e, const Graph& g_in) const {
+        // For a tree edge, the target vertex has not been copied yet.
+        typename graph_traits<NewGraph>::edge_descriptor new_e;
+        bool inserted;
+        boost::tie(new_e, inserted) = add_edge(get(orig2copy, source(e, g_in)), 
+                                               this->copy_one_vertex(target(e, g_in), g_in),
+                                               g_out);
+        copy_edge(e, new_e);
+      }
+      
+      template <class Edge, class Graph>
+      void non_tree_edge(Edge e, const Graph& g_in) const {
+        // For a non-tree edge, the target vertex has already been copied.
         typename graph_traits<NewGraph>::edge_descriptor new_e;
         bool inserted;
         boost::tie(new_e, inserted) = add_edge(get(orig2copy, source(e, g_in)), 
@@ -387,8 +400,10 @@
     {
       graph_copy_visitor<MutableGraph, Orig2CopyVertexIndexMap, 
         CopyVertex, CopyEdge> vis(g_out, orig2copy, copy_vertex, copy_edge);
+      typename graph_traits<MutableGraph>::vertex_descriptor src_copy
+        = vis.copy_one_vertex(src);
       breadth_first_search(g_in, src, params.visitor(vis));
-      return get(orig2copy, src);
+      return src_copy;
     }
 
   } // namespace detail