epoc32/include/stdapis/boost/graph/copy.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
//
williamr@2
     2
//=======================================================================
williamr@2
     3
// Copyright 1997-2001 University of Notre Dame.
williamr@2
     4
// Authors: Jeremy G. Siek, Lie-Quan Lee, Andrew Lumsdaine
williamr@2
     5
//
williamr@2
     6
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
     7
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
     8
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     9
//=======================================================================
williamr@2
    10
//
williamr@2
    11
williamr@2
    12
/*
williamr@2
    13
  This file implements the following functions:
williamr@2
    14
williamr@2
    15
williamr@2
    16
  template <typename VertexListGraph, typename MutableGraph>
williamr@2
    17
  void copy_graph(const VertexListGraph& g_in, MutableGraph& g_out)
williamr@2
    18
williamr@2
    19
  template <typename VertexListGraph, typename MutableGraph, 
williamr@2
    20
    class P, class T, class R>
williamr@2
    21
  void copy_graph(const VertexListGraph& g_in, MutableGraph& g_out, 
williamr@2
    22
                  const bgl_named_params<P, T, R>& params)
williamr@2
    23
williamr@2
    24
williamr@2
    25
  template <typename IncidenceGraph, typename MutableGraph>
williamr@2
    26
  typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
    27
  copy_component(IncidenceGraph& g_in, 
williamr@2
    28
                 typename graph_traits<IncidenceGraph>::vertex_descriptor src,
williamr@2
    29
                 MutableGraph& g_out)
williamr@2
    30
williamr@2
    31
  template <typename IncidenceGraph, typename MutableGraph, 
williamr@2
    32
           typename P, typename T, typename R>
williamr@2
    33
  typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
    34
  copy_component(IncidenceGraph& g_in, 
williamr@2
    35
                 typename graph_traits<IncidenceGraph>::vertex_descriptor src,
williamr@2
    36
                 MutableGraph& g_out, 
williamr@2
    37
                 const bgl_named_params<P, T, R>& params)
williamr@2
    38
 */
williamr@2
    39
williamr@2
    40
williamr@2
    41
#ifndef BOOST_GRAPH_COPY_HPP
williamr@2
    42
#define BOOST_GRAPH_COPY_HPP
williamr@2
    43
williamr@2
    44
#include <boost/config.hpp>
williamr@2
    45
#include <vector>
williamr@2
    46
#include <boost/graph/graph_traits.hpp>
williamr@2
    47
#include <boost/property_map.hpp>
williamr@2
    48
#include <boost/graph/named_function_params.hpp>
williamr@2
    49
#include <boost/graph/breadth_first_search.hpp>
williamr@2
    50
#include <boost/type_traits/conversion_traits.hpp>
williamr@2
    51
williamr@2
    52
namespace boost {
williamr@2
    53
williamr@2
    54
  namespace detail {
williamr@2
    55
williamr@2
    56
    // Default edge and vertex property copiers
williamr@2
    57
williamr@2
    58
    template <typename Graph1, typename Graph2>
williamr@2
    59
    struct edge_copier {
williamr@2
    60
      edge_copier(const Graph1& g1, Graph2& g2)
williamr@2
    61
        : edge_all_map1(get(edge_all, g1)), 
williamr@2
    62
          edge_all_map2(get(edge_all, g2)) { }
williamr@2
    63
williamr@2
    64
      template <typename Edge1, typename Edge2>
williamr@2
    65
      void operator()(const Edge1& e1, Edge2& e2) const {
williamr@2
    66
        put(edge_all_map2, e2, get(edge_all_map1, e1));
williamr@2
    67
      }
williamr@2
    68
      typename property_map<Graph1, edge_all_t>::const_type edge_all_map1;
williamr@2
    69
      mutable typename property_map<Graph2, edge_all_t>::type edge_all_map2;
williamr@2
    70
    };
williamr@2
    71
    template <typename Graph1, typename Graph2>
williamr@2
    72
    inline edge_copier<Graph1,Graph2>
williamr@2
    73
    make_edge_copier(const Graph1& g1, Graph2& g2)
williamr@2
    74
    {
williamr@2
    75
      return edge_copier<Graph1,Graph2>(g1, g2);
williamr@2
    76
    }
williamr@2
    77
williamr@2
    78
    template <typename Graph1, typename Graph2>
williamr@2
    79
    struct vertex_copier {
williamr@2
    80
      vertex_copier(const Graph1& g1, Graph2& g2)
williamr@2
    81
        : vertex_all_map1(get(vertex_all, g1)), 
williamr@2
    82
          vertex_all_map2(get(vertex_all, g2)) { }
williamr@2
    83
williamr@2
    84
      template <typename Vertex1, typename Vertex2>
williamr@2
    85
      void operator()(const Vertex1& v1, Vertex2& v2) const {
williamr@2
    86
        put(vertex_all_map2, v2, get(vertex_all_map1, v1));
williamr@2
    87
      }
williamr@2
    88
      typename property_map<Graph1, vertex_all_t>::const_type vertex_all_map1;
williamr@2
    89
      mutable typename property_map<Graph2, vertex_all_t>::type
williamr@2
    90
        vertex_all_map2;
williamr@2
    91
    };
williamr@2
    92
    template <typename Graph1, typename Graph2>
williamr@2
    93
    inline vertex_copier<Graph1,Graph2>
williamr@2
    94
    make_vertex_copier(const Graph1& g1, Graph2& g2)
williamr@2
    95
    {
williamr@2
    96
      return vertex_copier<Graph1,Graph2>(g1, g2);
williamr@2
    97
    }
williamr@2
    98
williamr@2
    99
    // Copy all the vertices and edges of graph g_in into graph g_out.
williamr@2
   100
    // The copy_vertex and copy_edge function objects control how vertex
williamr@2
   101
    // and edge properties are copied.
williamr@2
   102
williamr@2
   103
    template <int Version>
williamr@2
   104
    struct copy_graph_impl { };
williamr@2
   105
williamr@2
   106
    template <> struct copy_graph_impl<0>
williamr@2
   107
    {
williamr@2
   108
      template <typename Graph, typename MutableGraph, 
williamr@2
   109
        typename CopyVertex, typename CopyEdge, typename IndexMap,
williamr@2
   110
        typename Orig2CopyVertexIndexMap>
williamr@2
   111
      static void apply(const Graph& g_in, MutableGraph& g_out, 
williamr@2
   112
                        CopyVertex copy_vertex, CopyEdge copy_edge,
williamr@2
   113
                        Orig2CopyVertexIndexMap orig2copy, IndexMap)
williamr@2
   114
      {
williamr@2
   115
        typename graph_traits<Graph>::vertex_iterator vi, vi_end;
williamr@2
   116
        for (tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
williamr@2
   117
          typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   118
            new_v = add_vertex(g_out);
williamr@2
   119
          put(orig2copy, *vi, new_v);
williamr@2
   120
          copy_vertex(*vi, new_v);
williamr@2
   121
        }
williamr@2
   122
        typename graph_traits<Graph>::edge_iterator ei, ei_end;
williamr@2
   123
        for (tie(ei, ei_end) = edges(g_in); ei != ei_end; ++ei) {
williamr@2
   124
          typename graph_traits<MutableGraph>::edge_descriptor new_e;
williamr@2
   125
          bool inserted;
williamr@2
   126
          tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei, g_in)), 
williamr@2
   127
                                          get(orig2copy, target(*ei, g_in)),
williamr@2
   128
                                          g_out);
williamr@2
   129
          copy_edge(*ei, new_e);
williamr@2
   130
        }
williamr@2
   131
      }
williamr@2
   132
    };
williamr@2
   133
williamr@2
   134
    // for directed graphs
williamr@2
   135
    template <> struct copy_graph_impl<1>
williamr@2
   136
    {
williamr@2
   137
      template <typename Graph, typename MutableGraph, 
williamr@2
   138
        typename CopyVertex, typename CopyEdge, typename IndexMap,
williamr@2
   139
        typename Orig2CopyVertexIndexMap>
williamr@2
   140
      static void apply(const Graph& g_in, MutableGraph& g_out, 
williamr@2
   141
                        CopyVertex copy_vertex, CopyEdge copy_edge,
williamr@2
   142
                        Orig2CopyVertexIndexMap orig2copy, IndexMap)
williamr@2
   143
      {
williamr@2
   144
        typename graph_traits<Graph>::vertex_iterator vi, vi_end;
williamr@2
   145
        for (tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
williamr@2
   146
          typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   147
            new_v = add_vertex(g_out);
williamr@2
   148
          put(orig2copy, *vi, new_v);
williamr@2
   149
          copy_vertex(*vi, new_v);
williamr@2
   150
        }
williamr@2
   151
        for (tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
williamr@2
   152
          typename graph_traits<Graph>::out_edge_iterator ei, ei_end;
williamr@2
   153
          for (tie(ei, ei_end) = out_edges(*vi, g_in); ei != ei_end; ++ei) {
williamr@2
   154
            typename graph_traits<MutableGraph>::edge_descriptor new_e;
williamr@2
   155
            bool inserted;
williamr@2
   156
            tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei, g_in)), 
williamr@2
   157
                                            get(orig2copy, target(*ei, g_in)),
williamr@2
   158
                                            g_out);
williamr@2
   159
            copy_edge(*ei, new_e);
williamr@2
   160
          }
williamr@2
   161
        }
williamr@2
   162
      }
williamr@2
   163
    };
williamr@2
   164
williamr@2
   165
    // for undirected graphs
williamr@2
   166
    template <> struct copy_graph_impl<2>
williamr@2
   167
    {
williamr@2
   168
      template <typename Graph, typename MutableGraph, 
williamr@2
   169
        typename CopyVertex, typename CopyEdge, typename IndexMap,
williamr@2
   170
        typename Orig2CopyVertexIndexMap>
williamr@2
   171
      static void apply(const Graph& g_in, MutableGraph& g_out, 
williamr@2
   172
                        CopyVertex copy_vertex, CopyEdge copy_edge,
williamr@2
   173
                        Orig2CopyVertexIndexMap orig2copy,
williamr@2
   174
                        IndexMap index_map)
williamr@2
   175
      {
williamr@2
   176
        typedef color_traits<default_color_type> Color;
williamr@2
   177
        std::vector<default_color_type> 
williamr@2
   178
          color(num_vertices(g_in), Color::white());
williamr@2
   179
        typename graph_traits<Graph>::vertex_iterator vi, vi_end;
williamr@2
   180
        for (tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
williamr@2
   181
          typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   182
            new_v = add_vertex(g_out);
williamr@2
   183
          put(orig2copy, *vi, new_v);
williamr@2
   184
          copy_vertex(*vi, new_v);
williamr@2
   185
        }
williamr@2
   186
        for (tie(vi, vi_end) = vertices(g_in); vi != vi_end; ++vi) {
williamr@2
   187
          typename graph_traits<Graph>::out_edge_iterator ei, ei_end;
williamr@2
   188
          for (tie(ei, ei_end) = out_edges(*vi, g_in); ei != ei_end; ++ei) {
williamr@2
   189
            typename graph_traits<MutableGraph>::edge_descriptor new_e;
williamr@2
   190
            bool inserted;
williamr@2
   191
            if (color[get(index_map, target(*ei, g_in))] == Color::white()) {
williamr@2
   192
              tie(new_e, inserted) = add_edge(get(orig2copy, source(*ei,g_in)),
williamr@2
   193
                                              get(orig2copy, target(*ei,g_in)),
williamr@2
   194
                                              g_out);
williamr@2
   195
              copy_edge(*ei, new_e);
williamr@2
   196
            }
williamr@2
   197
          }
williamr@2
   198
          color[get(index_map, *vi)] = Color::black();
williamr@2
   199
        }
williamr@2
   200
      }
williamr@2
   201
    };
williamr@2
   202
williamr@2
   203
    template <class Graph>
williamr@2
   204
    struct choose_graph_copy {
williamr@2
   205
      typedef typename Graph::traversal_category Trv;
williamr@2
   206
      typedef typename Graph::directed_category Dr;
williamr@2
   207
      enum { algo = 
williamr@2
   208
             (is_convertible<Trv, vertex_list_graph_tag>::value
williamr@2
   209
              && is_convertible<Trv, edge_list_graph_tag>::value)
williamr@2
   210
             ? 0 : is_convertible<Dr, directed_tag>::value ? 1 : 2 };
williamr@2
   211
      typedef copy_graph_impl<algo> type;
williamr@2
   212
    };
williamr@2
   213
williamr@2
   214
    //-------------------------------------------------------------------------
williamr@2
   215
    struct choose_copier_parameter {
williamr@2
   216
      template <class P, class G1, class G2>
williamr@2
   217
      struct bind_ {
williamr@2
   218
        typedef const P& result_type;
williamr@2
   219
        static result_type apply(const P& p, const G1&, G2&)
williamr@2
   220
        { return p; }
williamr@2
   221
      };
williamr@2
   222
    };
williamr@2
   223
    struct choose_default_edge_copier {
williamr@2
   224
      template <class P, class G1, class G2>
williamr@2
   225
      struct bind_ {
williamr@2
   226
        typedef edge_copier<G1, G2> result_type;
williamr@2
   227
        static result_type apply(const P&, const G1& g1, G2& g2) { 
williamr@2
   228
          return result_type(g1, g2);
williamr@2
   229
        }
williamr@2
   230
      };
williamr@2
   231
    };
williamr@2
   232
    template <class Param>
williamr@2
   233
    struct choose_edge_copy {
williamr@2
   234
      typedef choose_copier_parameter type;
williamr@2
   235
    };
williamr@2
   236
    template <>
williamr@2
   237
    struct choose_edge_copy<detail::error_property_not_found> {
williamr@2
   238
      typedef choose_default_edge_copier type;
williamr@2
   239
    };
williamr@2
   240
    template <class Param, class G1, class G2>
williamr@2
   241
    struct choose_edge_copier_helper {
williamr@2
   242
      typedef typename choose_edge_copy<Param>::type Selector;
williamr@2
   243
      typedef typename Selector:: template bind_<Param, G1, G2> Bind;
williamr@2
   244
      typedef Bind type;
williamr@2
   245
      typedef typename Bind::result_type result_type;
williamr@2
   246
    };
williamr@2
   247
    template <typename Param, typename G1, typename G2>
williamr@2
   248
    typename detail::choose_edge_copier_helper<Param,G1,G2>::result_type
williamr@2
   249
    choose_edge_copier(const Param& params, const G1& g_in, G2& g_out)
williamr@2
   250
    {
williamr@2
   251
      typedef typename 
williamr@2
   252
        detail::choose_edge_copier_helper<Param,G1,G2>::type Choice;
williamr@2
   253
      return Choice::apply(params, g_in, g_out);
williamr@2
   254
    }
williamr@2
   255
williamr@2
   256
williamr@2
   257
    struct choose_default_vertex_copier {
williamr@2
   258
      template <class P, class G1, class G2>
williamr@2
   259
      struct bind_ {
williamr@2
   260
        typedef vertex_copier<G1, G2> result_type;
williamr@2
   261
        static result_type apply(const P&, const G1& g1, G2& g2) { 
williamr@2
   262
          return result_type(g1, g2);
williamr@2
   263
        }
williamr@2
   264
      };
williamr@2
   265
    };
williamr@2
   266
    template <class Param>
williamr@2
   267
    struct choose_vertex_copy {
williamr@2
   268
      typedef choose_copier_parameter type;
williamr@2
   269
    };
williamr@2
   270
    template <>
williamr@2
   271
    struct choose_vertex_copy<detail::error_property_not_found> {
williamr@2
   272
      typedef choose_default_vertex_copier type;
williamr@2
   273
    };
williamr@2
   274
    template <class Param, class G1, class G2>
williamr@2
   275
    struct choose_vertex_copier_helper {
williamr@2
   276
      typedef typename choose_vertex_copy<Param>::type Selector;
williamr@2
   277
      typedef typename Selector:: template bind_<Param, G1, G2> Bind;
williamr@2
   278
      typedef Bind type;
williamr@2
   279
      typedef typename Bind::result_type result_type;
williamr@2
   280
    };
williamr@2
   281
    template <typename Param, typename G1, typename G2>
williamr@2
   282
    typename detail::choose_vertex_copier_helper<Param,G1,G2>::result_type
williamr@2
   283
    choose_vertex_copier(const Param& params, const G1& g_in, G2& g_out)
williamr@2
   284
    {
williamr@2
   285
      typedef typename 
williamr@2
   286
        detail::choose_vertex_copier_helper<Param,G1,G2>::type Choice;
williamr@2
   287
      return Choice::apply(params, g_in, g_out);
williamr@2
   288
    }
williamr@2
   289
williamr@2
   290
  } // namespace detail
williamr@2
   291
williamr@2
   292
williamr@2
   293
  template <typename VertexListGraph, typename MutableGraph>
williamr@2
   294
  void copy_graph(const VertexListGraph& g_in, MutableGraph& g_out)
williamr@2
   295
  {
williamr@2
   296
    if (num_vertices(g_in) == 0)
williamr@2
   297
      return;
williamr@2
   298
    typedef typename graph_traits<MutableGraph>::vertex_descriptor vertex_t;
williamr@2
   299
    std::vector<vertex_t> orig2copy(num_vertices(g_in));
williamr@2
   300
    typedef typename detail::choose_graph_copy<VertexListGraph>::type 
williamr@2
   301
      copy_impl;
williamr@2
   302
    copy_impl::apply
williamr@2
   303
      (g_in, g_out, 
williamr@2
   304
       detail::make_vertex_copier(g_in, g_out), 
williamr@2
   305
       detail::make_edge_copier(g_in, g_out), 
williamr@2
   306
       make_iterator_property_map(orig2copy.begin(), 
williamr@2
   307
                                  get(vertex_index, g_in), orig2copy[0]),
williamr@2
   308
       get(vertex_index, g_in)
williamr@2
   309
       );
williamr@2
   310
  }
williamr@2
   311
williamr@2
   312
  template <typename VertexListGraph, typename MutableGraph, 
williamr@2
   313
    class P, class T, class R>
williamr@2
   314
  void copy_graph(const VertexListGraph& g_in, MutableGraph& g_out, 
williamr@2
   315
                  const bgl_named_params<P, T, R>& params)
williamr@2
   316
  {
williamr@2
   317
    typename std::vector<T>::size_type n;
williamr@2
   318
      n = is_default_param(get_param(params, orig_to_copy_t()))
williamr@2
   319
        ? num_vertices(g_in) : 1;
williamr@2
   320
    if (n == 0)
williamr@2
   321
      return;
williamr@2
   322
    std::vector<BOOST_DEDUCED_TYPENAME graph_traits<MutableGraph>::vertex_descriptor> 
williamr@2
   323
      orig2copy(n);
williamr@2
   324
williamr@2
   325
    typedef typename detail::choose_graph_copy<VertexListGraph>::type 
williamr@2
   326
      copy_impl;
williamr@2
   327
    copy_impl::apply
williamr@2
   328
      (g_in, g_out,
williamr@2
   329
       detail::choose_vertex_copier(get_param(params, vertex_copy_t()), 
williamr@2
   330
                                    g_in, g_out),
williamr@2
   331
       detail::choose_edge_copier(get_param(params, edge_copy_t()), 
williamr@2
   332
                                  g_in, g_out),
williamr@2
   333
       choose_param(get_param(params, orig_to_copy_t()),
williamr@2
   334
                    make_iterator_property_map
williamr@2
   335
                    (orig2copy.begin(), 
williamr@2
   336
                     choose_const_pmap(get_param(params, vertex_index), 
williamr@2
   337
                                 g_in, vertex_index), orig2copy[0])),
williamr@2
   338
       choose_const_pmap(get_param(params, vertex_index), g_in, vertex_index)
williamr@2
   339
       );
williamr@2
   340
  }
williamr@2
   341
williamr@2
   342
  namespace detail {
williamr@2
   343
    
williamr@2
   344
    template <class NewGraph, class Copy2OrigIndexMap, 
williamr@2
   345
      class CopyVertex, class CopyEdge>
williamr@2
   346
    struct graph_copy_visitor : public bfs_visitor<>
williamr@2
   347
    {
williamr@2
   348
      graph_copy_visitor(NewGraph& graph, Copy2OrigIndexMap c,
williamr@2
   349
                         CopyVertex cv, CopyEdge ce)
williamr@2
   350
        : g_out(graph), orig2copy(c), copy_vertex(cv), copy_edge(ce) { }
williamr@2
   351
williamr@2
   352
      template <class Vertex, class Graph>
williamr@2
   353
      void examine_vertex(Vertex u, const Graph& g_in) const {
williamr@2
   354
        typename graph_traits<NewGraph>::vertex_descriptor
williamr@2
   355
          new_u = add_vertex(g_out);
williamr@2
   356
        put(orig2copy, u, new_u);
williamr@2
   357
        copy_vertex(u, new_u);
williamr@2
   358
      }
williamr@2
   359
      
williamr@2
   360
      template <class Edge, class Graph>
williamr@2
   361
      void examine_edge(Edge e, const Graph& g_in) const {
williamr@2
   362
        typename graph_traits<NewGraph>::edge_descriptor new_e;
williamr@2
   363
        bool inserted;
williamr@2
   364
        tie(new_e, inserted) = add_edge(get(orig2copy, source(e, g_in)), 
williamr@2
   365
                                        get(orig2copy, target(e, g_in)),
williamr@2
   366
                                        g_out);
williamr@2
   367
        copy_edge(e, new_e);
williamr@2
   368
      }
williamr@2
   369
    private:
williamr@2
   370
      NewGraph& g_out;
williamr@2
   371
      Copy2OrigIndexMap orig2copy;
williamr@2
   372
      CopyVertex copy_vertex;
williamr@2
   373
      CopyEdge copy_edge;
williamr@2
   374
    };
williamr@2
   375
williamr@2
   376
    template <typename Graph, typename MutableGraph, 
williamr@2
   377
              typename CopyVertex, typename CopyEdge, 
williamr@2
   378
              typename Orig2CopyVertexIndexMap, typename Params>
williamr@2
   379
    typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   380
    copy_component_impl
williamr@2
   381
      (const Graph& g_in, 
williamr@2
   382
       typename graph_traits<Graph>::vertex_descriptor src,
williamr@2
   383
       MutableGraph& g_out, 
williamr@2
   384
       CopyVertex copy_vertex, CopyEdge copy_edge,
williamr@2
   385
       Orig2CopyVertexIndexMap orig2copy,
williamr@2
   386
       const Params& params)
williamr@2
   387
    {
williamr@2
   388
      graph_copy_visitor<MutableGraph, Orig2CopyVertexIndexMap, 
williamr@2
   389
        CopyVertex, CopyEdge> vis(g_out, orig2copy, copy_vertex, copy_edge);
williamr@2
   390
      breadth_first_search(g_in, src, params.visitor(vis));
williamr@2
   391
      return get(orig2copy, src);
williamr@2
   392
    }
williamr@2
   393
williamr@2
   394
  } // namespace detail
williamr@2
   395
  
williamr@2
   396
  
williamr@2
   397
  // Copy all the vertices and edges of graph g_in that are reachable
williamr@2
   398
  // from the source vertex into graph g_out. Return the vertex
williamr@2
   399
  // in g_out that matches the source vertex of g_in.
williamr@2
   400
  template <typename IncidenceGraph, typename MutableGraph, 
williamr@2
   401
           typename P, typename T, typename R>
williamr@2
   402
  typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   403
  copy_component(IncidenceGraph& g_in, 
williamr@2
   404
                 typename graph_traits<IncidenceGraph>::vertex_descriptor src,
williamr@2
   405
                 MutableGraph& g_out, 
williamr@2
   406
                 const bgl_named_params<P, T, R>& params)
williamr@2
   407
  {
williamr@2
   408
    typename std::vector<T>::size_type n;
williamr@2
   409
      n = is_default_param(get_param(params, orig_to_copy_t()))
williamr@2
   410
        ? num_vertices(g_in) : 1;
williamr@2
   411
    std::vector<typename graph_traits<IncidenceGraph>::vertex_descriptor> 
williamr@2
   412
      orig2copy(n);
williamr@2
   413
    
williamr@2
   414
    return detail::copy_component_impl
williamr@2
   415
      (g_in, src, g_out,
williamr@2
   416
       detail::choose_vertex_copier(get_param(params, vertex_copy_t()), 
williamr@2
   417
                                    g_in, g_out),
williamr@2
   418
       detail::choose_edge_copier(get_param(params, edge_copy_t()), 
williamr@2
   419
                                  g_in, g_out),
williamr@2
   420
       choose_param(get_param(params, orig_to_copy_t()),
williamr@2
   421
                    make_iterator_property_map
williamr@2
   422
                    (orig2copy.begin(), 
williamr@2
   423
                     choose_pmap(get_param(params, vertex_index), 
williamr@2
   424
                                 g_in, vertex_index), orig2copy[0])),
williamr@2
   425
       params
williamr@2
   426
       );
williamr@2
   427
  }
williamr@2
   428
williamr@2
   429
  template <typename IncidenceGraph, typename MutableGraph>
williamr@2
   430
  typename graph_traits<MutableGraph>::vertex_descriptor
williamr@2
   431
  copy_component(IncidenceGraph& g_in, 
williamr@2
   432
                 typename graph_traits<IncidenceGraph>::vertex_descriptor src,
williamr@2
   433
                 MutableGraph& g_out)
williamr@2
   434
  {
williamr@2
   435
    std::vector<typename graph_traits<IncidenceGraph>::vertex_descriptor> 
williamr@2
   436
      orig2copy(num_vertices(g_in));
williamr@2
   437
    
williamr@2
   438
    return detail::copy_component_impl
williamr@2
   439
      (g_in, src, g_out,
williamr@2
   440
       make_vertex_copier(g_in, g_out), 
williamr@2
   441
       make_edge_copier(g_in, g_out), 
williamr@2
   442
       make_iterator_property_map(orig2copy.begin(), 
williamr@2
   443
                                  get(vertex_index, g_in), orig2copy[0]),
williamr@2
   444
       bgl_named_params<char,char>('x') // dummy param object
williamr@2
   445
       );
williamr@2
   446
  }
williamr@2
   447
williamr@2
   448
} // namespace boost
williamr@2
   449
williamr@2
   450
#endif // BOOST_GRAPH_COPY_HPP