gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Fix missing semicolon in GRAPH_TYPEDEFS (ticket #89)
0 1 0
default
1 file changed with 1 insertions and 1 deletions:
↑ Collapse diff ↑
Show white space 2048 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GRAPH_UTILS_H
20 20
#define LEMON_GRAPH_UTILS_H
21 21

	
22 22
#include <iterator>
23 23
#include <vector>
24 24
#include <map>
25 25
#include <cmath>
26 26
#include <algorithm>
27 27

	
28 28
#include <lemon/bits/invalid.h>
29 29
#include <lemon/bits/utility.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/bits/traits.h>
32 32

	
33 33
#include <lemon/bits/alteration_notifier.h>
34 34
#include <lemon/bits/default_map.h>
35 35

	
36 36
///\ingroup gutils
37 37
///\file
38 38
///\brief Graph utilities.
39 39

	
40 40
namespace lemon {
41 41

	
42 42
  /// \addtogroup gutils
43 43
  /// @{
44 44

	
45 45
  namespace _graph_utils_bits {
46 46
    template <typename Graph>
47 47
    struct Node { typedef typename Graph::Node type; };
48 48

	
49 49
    template <typename Graph>
50 50
    struct NodeIt { typedef typename Graph::NodeIt type; };
51 51

	
52 52
    template <typename Graph>
53 53
    struct Arc { typedef typename Graph::Arc type; };
54 54

	
55 55
    template <typename Graph>
56 56
    struct ArcIt { typedef typename Graph::ArcIt type; };
57 57

	
58 58
    template <typename Graph>
59 59
    struct Edge { typedef typename Graph::Edge type; };
60 60

	
61 61
    template <typename Graph>
62 62
    struct EdgeIt { typedef typename Graph::EdgeIt type; };
63 63

	
64 64
    template <typename Graph>
65 65
    struct OutArcIt { typedef typename Graph::OutArcIt type; };
66 66

	
67 67
    template <typename Graph>
68 68
    struct InArcIt { typedef typename Graph::InArcIt type; };
69 69

	
70 70
    template <typename Graph>
71 71
    struct IncEdgeIt { typedef typename Graph::IncEdgeIt type; };
72 72

	
73 73
    template <typename Graph>
74 74
    struct BoolNodeMap { 
75 75
      typedef typename Graph::template NodeMap<bool> type; 
76 76
    };
77 77

	
78 78
    template <typename Graph>
79 79
    struct IntNodeMap { 
80 80
      typedef typename Graph::template NodeMap<int> type; 
81 81
    };
82 82

	
83 83
    template <typename Graph>
84 84
    struct DoubleNodeMap { 
85 85
      typedef typename Graph::template NodeMap<double> type; 
86 86
    };
87 87

	
88 88
    template <typename Graph>
89 89
    struct BoolArcMap { 
90 90
      typedef typename Graph::template ArcMap<bool> type; 
91 91
    };
92 92

	
93 93
    template <typename Graph>
94 94
    struct IntArcMap { 
95 95
      typedef typename Graph::template ArcMap<int> type; 
96 96
    };
97 97

	
98 98
    template <typename Graph>
99 99
    struct DoubleArcMap { 
100 100
      typedef typename Graph::template ArcMap<double> type; 
101 101
    };
102 102

	
103 103
    template <typename Graph>
104 104
    struct BoolEdgeMap { 
105 105
      typedef typename Graph::template EdgeMap<bool> type; 
106 106
    };
107 107

	
108 108
    template <typename Graph>
109 109
    struct IntEdgeMap { 
110 110
      typedef typename Graph::template EdgeMap<int> type; 
111 111
    };
112 112

	
113 113
    template <typename Graph>
114 114
    struct DoubleEdgeMap { 
115 115
      typedef typename Graph::template EdgeMap<double> type; 
116 116
    };
117 117

	
118 118
    
119 119
  }
120 120

	
121 121
  ///Creates convenience typedefs for the digraph types and iterators
122 122

	
123 123
  ///This \c \#define creates convenience typedefs for the following types
124 124
  ///of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
125 125
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap, 
126 126
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap. 
127 127
#define DIGRAPH_TYPEDEFS(Digraph)					\
128 128
  typedef typename ::lemon::_graph_utils_bits::				\
129 129
  Node<Digraph>::type Node;						\
130 130
  typedef typename ::lemon::_graph_utils_bits::				\
131 131
  NodeIt<Digraph>::type	NodeIt;						\
132 132
  typedef typename ::lemon::_graph_utils_bits::				\
133 133
  Arc<Digraph>::type Arc;						\
134 134
  typedef typename ::lemon::_graph_utils_bits::				\
135 135
  ArcIt<Digraph>::type ArcIt;						\
136 136
  typedef typename ::lemon::_graph_utils_bits::				\
137 137
  OutArcIt<Digraph>::type OutArcIt;					\
138 138
  typedef typename ::lemon::_graph_utils_bits::				\
139 139
  InArcIt<Digraph>::type InArcIt;					\
140 140
  typedef typename ::lemon::_graph_utils_bits::				\
141 141
  BoolNodeMap<Digraph>::type BoolNodeMap;				\
142 142
  typedef typename ::lemon::_graph_utils_bits::				\
143 143
  IntNodeMap<Digraph>::type IntNodeMap;					\
144 144
  typedef typename ::lemon::_graph_utils_bits::				\
145 145
  DoubleNodeMap<Digraph>::type DoubleNodeMap;				\
146 146
  typedef typename ::lemon::_graph_utils_bits::				\
147 147
  BoolArcMap<Digraph>::type BoolArcMap;					\
148 148
  typedef typename ::lemon::_graph_utils_bits::				\
149 149
  IntArcMap<Digraph>::type IntArcMap;					\
150 150
  typedef typename ::lemon::_graph_utils_bits::				\
151 151
  DoubleArcMap<Digraph>::type DoubleArcMap
152 152

	
153 153

	
154 154
  ///Creates convenience typedefs for the graph types and iterators
155 155

	
156 156
  ///This \c \#define creates the same convenience typedefs as defined
157 157
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
158 158
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
159 159
  ///\c DoubleEdgeMap.
160 160
#define GRAPH_TYPEDEFS(Graph)						\
161 161
  DIGRAPH_TYPEDEFS(Graph);						\
162 162
  typedef typename ::lemon::_graph_utils_bits::				\
163 163
  Edge<Graph>::type Edge;						\
164 164
  typedef typename ::lemon::_graph_utils_bits::				\
165 165
  EdgeIt<Graph>::type EdgeIt;						\
166 166
  typedef typename ::lemon::_graph_utils_bits::				\
167
  IncEdgeIt<Graph>::type IncEdgeIt					\
167
  IncEdgeIt<Graph>::type IncEdgeIt;					\
168 168
  typedef typename ::lemon::_graph_utils_bits::				\
169 169
  BoolEdgeMap<Graph>::type BoolEdgeMap;					\
170 170
  typedef typename ::lemon::_graph_utils_bits::				\
171 171
  IntEdgeMap<Graph>::type IntEdgeMap;					\
172 172
  typedef typename ::lemon::_graph_utils_bits::				\
173 173
  DoubleEdgeMap<Graph>::type DoubleEdgeMap
174 174

	
175 175

	
176 176
  /// \brief Function to count the items in the graph.
177 177
  ///
178 178
  /// This function counts the items (nodes, arcs etc) in the graph.
179 179
  /// The complexity of the function is O(n) because
180 180
  /// it iterates on all of the items.
181 181
  template <typename Graph, typename Item>
182 182
  inline int countItems(const Graph& g) {
183 183
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
184 184
    int num = 0;
185 185
    for (ItemIt it(g); it != INVALID; ++it) {
186 186
      ++num;
187 187
    }
188 188
    return num;
189 189
  }
190 190

	
191 191
  // Node counting:
192 192

	
193 193
  namespace _graph_utils_bits {
194 194
    
195 195
    template <typename Graph, typename Enable = void>
196 196
    struct CountNodesSelector {
197 197
      static int count(const Graph &g) {
198 198
        return countItems<Graph, typename Graph::Node>(g);
199 199
      }
200 200
    };
201 201

	
202 202
    template <typename Graph>
203 203
    struct CountNodesSelector<
204 204
      Graph, typename 
205 205
      enable_if<typename Graph::NodeNumTag, void>::type> 
206 206
    {
207 207
      static int count(const Graph &g) {
208 208
        return g.nodeNum();
209 209
      }
210 210
    };    
211 211
  }
212 212

	
213 213
  /// \brief Function to count the nodes in the graph.
214 214
  ///
215 215
  /// This function counts the nodes in the graph.
216 216
  /// The complexity of the function is O(n) but for some
217 217
  /// graph structures it is specialized to run in O(1).
218 218
  ///
219 219
  /// If the graph contains a \e nodeNum() member function and a 
220 220
  /// \e NodeNumTag tag then this function calls directly the member
221 221
  /// function to query the cardinality of the node set.
222 222
  template <typename Graph>
223 223
  inline int countNodes(const Graph& g) {
224 224
    return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
225 225
  }
226 226

	
227 227
  // Arc counting:
228 228

	
229 229
  namespace _graph_utils_bits {
230 230
    
231 231
    template <typename Graph, typename Enable = void>
232 232
    struct CountArcsSelector {
233 233
      static int count(const Graph &g) {
234 234
        return countItems<Graph, typename Graph::Arc>(g);
235 235
      }
236 236
    };
237 237

	
238 238
    template <typename Graph>
239 239
    struct CountArcsSelector<
240 240
      Graph, 
241 241
      typename enable_if<typename Graph::ArcNumTag, void>::type> 
242 242
    {
243 243
      static int count(const Graph &g) {
244 244
        return g.arcNum();
245 245
      }
246 246
    };    
247 247
  }
248 248

	
249 249
  /// \brief Function to count the arcs in the graph.
250 250
  ///
251 251
  /// This function counts the arcs in the graph.
252 252
  /// The complexity of the function is O(e) but for some
253 253
  /// graph structures it is specialized to run in O(1).
254 254
  ///
255 255
  /// If the graph contains a \e arcNum() member function and a 
256 256
  /// \e EdgeNumTag tag then this function calls directly the member
257 257
  /// function to query the cardinality of the arc set.
258 258
  template <typename Graph>
259 259
  inline int countArcs(const Graph& g) {
260 260
    return _graph_utils_bits::CountArcsSelector<Graph>::count(g);
261 261
  }
262 262

	
263 263
  // Edge counting:
264 264
  namespace _graph_utils_bits {
265 265
    
266 266
    template <typename Graph, typename Enable = void>
267 267
    struct CountEdgesSelector {
268 268
      static int count(const Graph &g) {
269 269
        return countItems<Graph, typename Graph::Edge>(g);
270 270
      }
271 271
    };
272 272

	
273 273
    template <typename Graph>
274 274
    struct CountEdgesSelector<
275 275
      Graph, 
276 276
      typename enable_if<typename Graph::EdgeNumTag, void>::type> 
277 277
    {
278 278
      static int count(const Graph &g) {
279 279
        return g.edgeNum();
280 280
      }
281 281
    };    
282 282
  }
283 283

	
284 284
  /// \brief Function to count the edges in the graph.
285 285
  ///
286 286
  /// This function counts the edges in the graph.
287 287
  /// The complexity of the function is O(m) but for some
288 288
  /// graph structures it is specialized to run in O(1).
289 289
  ///
290 290
  /// If the graph contains a \e edgeNum() member function and a 
291 291
  /// \e EdgeNumTag tag then this function calls directly the member
292 292
  /// function to query the cardinality of the edge set.
293 293
  template <typename Graph>
294 294
  inline int countEdges(const Graph& g) {
295 295
    return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
296 296

	
297 297
  }
298 298

	
299 299

	
300 300
  template <typename Graph, typename DegIt>
301 301
  inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
302 302
    int num = 0;
303 303
    for (DegIt it(_g, _n); it != INVALID; ++it) {
304 304
      ++num;
305 305
    }
306 306
    return num;
307 307
  }
308 308

	
309 309
  /// \brief Function to count the number of the out-arcs from node \c n.
310 310
  ///
311 311
  /// This function counts the number of the out-arcs from node \c n
312 312
  /// in the graph.  
313 313
  template <typename Graph>
314 314
  inline int countOutArcs(const Graph& _g,  const typename Graph::Node& _n) {
315 315
    return countNodeDegree<Graph, typename Graph::OutArcIt>(_g, _n);
316 316
  }
317 317

	
318 318
  /// \brief Function to count the number of the in-arcs to node \c n.
319 319
  ///
320 320
  /// This function counts the number of the in-arcs to node \c n
321 321
  /// in the graph.  
322 322
  template <typename Graph>
323 323
  inline int countInArcs(const Graph& _g,  const typename Graph::Node& _n) {
324 324
    return countNodeDegree<Graph, typename Graph::InArcIt>(_g, _n);
325 325
  }
326 326

	
327 327
  /// \brief Function to count the number of the inc-edges to node \c n.
328 328
  ///
329 329
  /// This function counts the number of the inc-edges to node \c n
330 330
  /// in the graph.  
331 331
  template <typename Graph>
332 332
  inline int countIncEdges(const Graph& _g,  const typename Graph::Node& _n) {
333 333
    return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
334 334
  }
335 335

	
336 336
  namespace _graph_utils_bits {
337 337
    
338 338
    template <typename Graph, typename Enable = void>
339 339
    struct FindArcSelector {
340 340
      typedef typename Graph::Node Node;
341 341
      typedef typename Graph::Arc Arc;
342 342
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
343 343
        if (e == INVALID) {
344 344
          g.firstOut(e, u);
345 345
        } else {
346 346
          g.nextOut(e);
347 347
        }
348 348
        while (e != INVALID && g.target(e) != v) {
349 349
          g.nextOut(e);
350 350
        }
351 351
        return e;
352 352
      }
353 353
    };
354 354

	
355 355
    template <typename Graph>
356 356
    struct FindArcSelector<
357 357
      Graph, 
358 358
      typename enable_if<typename Graph::FindEdgeTag, void>::type> 
359 359
    {
360 360
      typedef typename Graph::Node Node;
361 361
      typedef typename Graph::Arc Arc;
362 362
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
363 363
        return g.findArc(u, v, prev);
364 364
      }
365 365
    };    
366 366
  }
367 367

	
368 368
  /// \brief Finds an arc between two nodes of a graph.
369 369
  ///
370 370
  /// Finds an arc from node \c u to node \c v in graph \c g.
371 371
  ///
372 372
  /// If \c prev is \ref INVALID (this is the default value), then
373 373
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
374 374
  /// the next arc from \c u to \c v after \c prev.
375 375
  /// \return The found arc or \ref INVALID if there is no such an arc.
376 376
  ///
377 377
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
378 378
  ///\code
379 379
  /// for(Arc e=findArc(g,u,v);e!=INVALID;e=findArc(g,u,v,e)) {
380 380
  ///   ...
381 381
  /// }
382 382
  ///\endcode
383 383
  ///
384 384
  ///\sa ArcLookUp
385 385
  ///\sa AllArcLookUp
386 386
  ///\sa DynArcLookUp
387 387
  ///\sa ConArcIt
388 388
  template <typename Graph>
389 389
  inline typename Graph::Arc 
390 390
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
391 391
           typename Graph::Arc prev = INVALID) {
392 392
    return _graph_utils_bits::FindArcSelector<Graph>::find(g, u, v, prev);
393 393
  }
394 394

	
395 395
  /// \brief Iterator for iterating on arcs connected the same nodes.
396 396
  ///
397 397
  /// Iterator for iterating on arcs connected the same nodes. It is 
398 398
  /// higher level interface for the findArc() function. You can
399 399
  /// use it the following way:
400 400
  ///\code
401 401
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
402 402
  ///   ...
403 403
  /// }
404 404
  ///\endcode
405 405
  /// 
406 406
  ///\sa findArc()
407 407
  ///\sa ArcLookUp
408 408
  ///\sa AllArcLookUp
409 409
  ///\sa DynArcLookUp
410 410
  ///
411 411
  /// \author Balazs Dezso 
412 412
  template <typename _Graph>
413 413
  class ConArcIt : public _Graph::Arc {
414 414
  public:
415 415

	
416 416
    typedef _Graph Graph;
417 417
    typedef typename Graph::Arc Parent;
418 418

	
419 419
    typedef typename Graph::Arc Arc;
420 420
    typedef typename Graph::Node Node;
421 421

	
422 422
    /// \brief Constructor.
423 423
    ///
424 424
    /// Construct a new ConArcIt iterating on the arcs which
425 425
    /// connects the \c u and \c v node.
426 426
    ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
427 427
      Parent::operator=(findArc(_graph, u, v));
428 428
    }
429 429

	
430 430
    /// \brief Constructor.
431 431
    ///
432 432
    /// Construct a new ConArcIt which continues the iterating from 
433 433
    /// the \c e arc.
434 434
    ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
435 435
    
436 436
    /// \brief Increment operator.
437 437
    ///
438 438
    /// It increments the iterator and gives back the next arc.
439 439
    ConArcIt& operator++() {
440 440
      Parent::operator=(findArc(_graph, _graph.source(*this), 
441 441
				_graph.target(*this), *this));
442 442
      return *this;
443 443
    }
444 444
  private:
445 445
    const Graph& _graph;
446 446
  };
447 447

	
448 448
  namespace _graph_utils_bits {
449 449
    
450 450
    template <typename Graph, typename Enable = void>
451 451
    struct FindEdgeSelector {
452 452
      typedef typename Graph::Node Node;
453 453
      typedef typename Graph::Edge Edge;
454 454
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
455 455
        bool b;
456 456
        if (u != v) {
457 457
          if (e == INVALID) {
458 458
            g.firstInc(e, b, u);
459 459
          } else {
460 460
            b = g.source(e) == u;
461 461
            g.nextInc(e, b);
462 462
          }
463 463
          while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
464 464
            g.nextInc(e, b);
465 465
          }
466 466
        } else {
467 467
          if (e == INVALID) {
468 468
            g.firstInc(e, b, u);
469 469
          } else {
470 470
            b = true;
471 471
            g.nextInc(e, b);
472 472
          }
473 473
          while (e != INVALID && (!b || g.target(e) != v)) {
474 474
            g.nextInc(e, b);
475 475
          }
476 476
        }
477 477
        return e;
478 478
      }
479 479
    };
480 480

	
481 481
    template <typename Graph>
482 482
    struct FindEdgeSelector<
483 483
      Graph, 
484 484
      typename enable_if<typename Graph::FindEdgeTag, void>::type> 
485 485
    {
486 486
      typedef typename Graph::Node Node;
487 487
      typedef typename Graph::Edge Edge;
488 488
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
489 489
        return g.findEdge(u, v, prev);
490 490
      }
491 491
    };    
492 492
  }
493 493

	
494 494
  /// \brief Finds an edge between two nodes of a graph.
495 495
  ///
496 496
  /// Finds an edge from node \c u to node \c v in graph \c g.
497 497
  /// If the node \c u and node \c v is equal then each loop edge
498 498
  /// will be enumerated once.
499 499
  ///
500 500
  /// If \c prev is \ref INVALID (this is the default value), then
501 501
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
502 502
  /// the next arc from \c u to \c v after \c prev.
503 503
  /// \return The found arc or \ref INVALID if there is no such an arc.
504 504
  ///
505 505
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
506 506
  ///\code
507 507
  /// for(Edge e = findEdge(g,u,v); e != INVALID; 
508 508
  ///     e = findEdge(g,u,v,e)) {
509 509
  ///   ...
510 510
  /// }
511 511
  ///\endcode
512 512
  ///
513 513
  ///\sa ConArcIt
514 514

	
515 515
  template <typename Graph>
516 516
  inline typename Graph::Edge 
517 517
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
518 518
            typename Graph::Edge p = INVALID) {
519 519
    return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
520 520
  }
521 521

	
522 522
  /// \brief Iterator for iterating on edges connected the same nodes.
523 523
  ///
524 524
  /// Iterator for iterating on edges connected the same nodes. It is 
525 525
  /// higher level interface for the findEdge() function. You can
526 526
  /// use it the following way:
527 527
  ///\code
528 528
  /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
529 529
  ///   ...
530 530
  /// }
531 531
  ///\endcode
532 532
  ///
533 533
  ///\sa findEdge()
534 534
  ///
535 535
  /// \author Balazs Dezso 
536 536
  template <typename _Graph>
537 537
  class ConEdgeIt : public _Graph::Edge {
538 538
  public:
539 539

	
540 540
    typedef _Graph Graph;
541 541
    typedef typename Graph::Edge Parent;
542 542

	
543 543
    typedef typename Graph::Edge Edge;
544 544
    typedef typename Graph::Node Node;
545 545

	
546 546
    /// \brief Constructor.
547 547
    ///
548 548
    /// Construct a new ConEdgeIt iterating on the edges which
549 549
    /// connects the \c u and \c v node.
550 550
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
551 551
      Parent::operator=(findEdge(_graph, u, v));
552 552
    }
553 553

	
554 554
    /// \brief Constructor.
555 555
    ///
556 556
    /// Construct a new ConEdgeIt which continues the iterating from 
557 557
    /// the \c e edge.
558 558
    ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
559 559
    
560 560
    /// \brief Increment operator.
561 561
    ///
562 562
    /// It increments the iterator and gives back the next edge.
563 563
    ConEdgeIt& operator++() {
564 564
      Parent::operator=(findEdge(_graph, _graph.source(*this), 
565 565
				 _graph.target(*this), *this));
566 566
      return *this;
567 567
    }
568 568
  private:
569 569
    const Graph& _graph;
570 570
  };
571 571

	
572 572
  namespace _graph_utils_bits {
573 573

	
574 574
    template <typename Digraph, typename Item, typename RefMap>
575 575
    class MapCopyBase {
576 576
    public:
577 577
      virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
578 578
      
579 579
      virtual ~MapCopyBase() {}
580 580
    };
581 581

	
582 582
    template <typename Digraph, typename Item, typename RefMap, 
583 583
              typename ToMap, typename FromMap>
584 584
    class MapCopy : public MapCopyBase<Digraph, Item, RefMap> {
585 585
    public:
586 586

	
587 587
      MapCopy(ToMap& tmap, const FromMap& map) 
588 588
        : _tmap(tmap), _map(map) {}
589 589
      
590 590
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
591 591
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
592 592
        for (ItemIt it(digraph); it != INVALID; ++it) {
593 593
          _tmap.set(refMap[it], _map[it]);
594 594
        }
595 595
      }
596 596

	
597 597
    private:
598 598
      ToMap& _tmap;
599 599
      const FromMap& _map;
600 600
    };
601 601

	
602 602
    template <typename Digraph, typename Item, typename RefMap, typename It>
603 603
    class ItemCopy : public MapCopyBase<Digraph, Item, RefMap> {
604 604
    public:
605 605

	
606 606
      ItemCopy(It& it, const Item& item) : _it(it), _item(item) {}
607 607
      
608 608
      virtual void copy(const Digraph&, const RefMap& refMap) {
609 609
        _it = refMap[_item];
610 610
      }
611 611

	
612 612
    private:
613 613
      It& _it;
614 614
      Item _item;
615 615
    };
616 616

	
617 617
    template <typename Digraph, typename Item, typename RefMap, typename Ref>
618 618
    class RefCopy : public MapCopyBase<Digraph, Item, RefMap> {
619 619
    public:
620 620

	
621 621
      RefCopy(Ref& map) : _map(map) {}
622 622
      
623 623
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
624 624
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
625 625
        for (ItemIt it(digraph); it != INVALID; ++it) {
626 626
          _map.set(it, refMap[it]);
627 627
        }
628 628
      }
629 629

	
630 630
    private:
631 631
      Ref& _map;
632 632
    };
633 633

	
634 634
    template <typename Digraph, typename Item, typename RefMap, 
635 635
              typename CrossRef>
636 636
    class CrossRefCopy : public MapCopyBase<Digraph, Item, RefMap> {
637 637
    public:
638 638

	
639 639
      CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {}
640 640
      
641 641
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
642 642
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
643 643
        for (ItemIt it(digraph); it != INVALID; ++it) {
644 644
          _cmap.set(refMap[it], it);
645 645
        }
646 646
      }
647 647

	
648 648
    private:
649 649
      CrossRef& _cmap;
650 650
    };
651 651

	
652 652
    template <typename Digraph, typename Enable = void>
653 653
    struct DigraphCopySelector {
654 654
      template <typename From, typename NodeRefMap, typename ArcRefMap>
655 655
      static void copy(Digraph &to, const From& from,
656 656
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
657 657
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
658 658
          nodeRefMap[it] = to.addNode();
659 659
        }
660 660
        for (typename From::ArcIt it(from); it != INVALID; ++it) {
661 661
          arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)], 
662 662
                                          nodeRefMap[from.target(it)]);
663 663
        }
664 664
      }
665 665
    };
666 666

	
667 667
    template <typename Digraph>
668 668
    struct DigraphCopySelector<
669 669
      Digraph, 
670 670
      typename enable_if<typename Digraph::BuildTag, void>::type> 
671 671
    {
672 672
      template <typename From, typename NodeRefMap, typename ArcRefMap>
673 673
      static void copy(Digraph &to, const From& from,
674 674
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
675 675
        to.build(from, nodeRefMap, arcRefMap);
676 676
      }
677 677
    };
678 678

	
679 679
    template <typename Graph, typename Enable = void>
680 680
    struct GraphCopySelector {
681 681
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
682 682
      static void copy(Graph &to, const From& from,
683 683
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
684 684
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
685 685
          nodeRefMap[it] = to.addNode();
686 686
        }
687 687
        for (typename From::EdgeIt it(from); it != INVALID; ++it) {
688 688
          edgeRefMap[it] = to.addArc(nodeRefMap[from.source(it)], 
689 689
				       nodeRefMap[from.target(it)]);
690 690
        }
691 691
      }
692 692
    };
693 693

	
694 694
    template <typename Graph>
695 695
    struct GraphCopySelector<
696 696
      Graph, 
697 697
      typename enable_if<typename Graph::BuildTag, void>::type> 
698 698
    {
699 699
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
700 700
      static void copy(Graph &to, const From& from,
701 701
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
702 702
        to.build(from, nodeRefMap, edgeRefMap);
703 703
      }
704 704
    };
705 705

	
706 706
  }
707 707

	
708 708
  /// \brief Class to copy a digraph.
709 709
  ///
710 710
  /// Class to copy a digraph to another digraph (duplicate a digraph). The
711 711
  /// simplest way of using it is through the \c copyDigraph() function.
712 712
  ///
713 713
  /// This class not just make a copy of a graph, but it can create
714 714
  /// references and cross references between the nodes and arcs of
715 715
  /// the two graphs, it can copy maps for use with the newly created
716 716
  /// graph and copy nodes and arcs.
717 717
  ///
718 718
  /// To make a copy from a graph, first an instance of DigraphCopy
719 719
  /// should be created, then the data belongs to the graph should
720 720
  /// assigned to copy. In the end, the \c run() member should be
721 721
  /// called.
722 722
  ///
723 723
  /// The next code copies a graph with several data:
724 724
  ///\code
725 725
  ///  DigraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
726 726
  ///  // create a reference for the nodes
727 727
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
728 728
  ///  dc.nodeRef(nr);
729 729
  ///  // create a cross reference (inverse) for the arcs
730 730
  ///  NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph);
731 731
  ///  dc.arcCrossRef(acr);
732 732
  ///  // copy an arc map
733 733
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
734 734
  ///  NewGraph::ArcMap<double> namap(new_graph);
735 735
  ///  dc.arcMap(namap, oamap);
736 736
  ///  // copy a node
737 737
  ///  OrigGraph::Node on;
738 738
  ///  NewGraph::Node nn;
739 739
  ///  dc.node(nn, on);
740 740
  ///  // Executions of copy
741 741
  ///  dc.run();
742 742
  ///\endcode
743 743
  template <typename To, typename From>
744 744
  class DigraphCopy {
745 745
  private:
746 746

	
747 747
    typedef typename From::Node Node;
748 748
    typedef typename From::NodeIt NodeIt;
749 749
    typedef typename From::Arc Arc;
750 750
    typedef typename From::ArcIt ArcIt;
751 751

	
752 752
    typedef typename To::Node TNode;
753 753
    typedef typename To::Arc TArc;
754 754

	
755 755
    typedef typename From::template NodeMap<TNode> NodeRefMap;
756 756
    typedef typename From::template ArcMap<TArc> ArcRefMap;
757 757
    
758 758
    
759 759
  public: 
760 760

	
761 761

	
762 762
    /// \brief Constructor for the DigraphCopy.
763 763
    ///
764 764
    /// It copies the content of the \c _from digraph into the
765 765
    /// \c _to digraph.
766 766
    DigraphCopy(To& to, const From& from) 
767 767
      : _from(from), _to(to) {}
768 768

	
769 769
    /// \brief Destructor of the DigraphCopy
770 770
    ///
771 771
    /// Destructor of the DigraphCopy
772 772
    ~DigraphCopy() {
773 773
      for (int i = 0; i < int(_node_maps.size()); ++i) {
774 774
        delete _node_maps[i];
775 775
      }
776 776
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
777 777
        delete _arc_maps[i];
778 778
      }
779 779

	
780 780
    }
781 781

	
782 782
    /// \brief Copies the node references into the given map.
783 783
    ///
784 784
    /// Copies the node references into the given map. The parameter
785 785
    /// should be a map, which key type is the Node type of the source
786 786
    /// graph, while the value type is the Node type of the
787 787
    /// destination graph.
788 788
    template <typename NodeRef>
789 789
    DigraphCopy& nodeRef(NodeRef& map) {
790 790
      _node_maps.push_back(new _graph_utils_bits::RefCopy<From, Node, 
791 791
			   NodeRefMap, NodeRef>(map));
792 792
      return *this;
793 793
    }
794 794

	
795 795
    /// \brief Copies the node cross references into the given map.
796 796
    ///
797 797
    ///  Copies the node cross references (reverse references) into
798 798
    ///  the given map. The parameter should be a map, which key type
799 799
    ///  is the Node type of the destination graph, while the value type is
800 800
    ///  the Node type of the source graph.
801 801
    template <typename NodeCrossRef>
802 802
    DigraphCopy& nodeCrossRef(NodeCrossRef& map) {
803 803
      _node_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
804 804
			   NodeRefMap, NodeCrossRef>(map));
805 805
      return *this;
806 806
    }
807 807

	
808 808
    /// \brief Make copy of the given map.
809 809
    ///
810 810
    /// Makes copy of the given map for the newly created digraph.
811 811
    /// The new map's key type is the destination graph's node type,
812 812
    /// and the copied map's key type is the source graph's node type.
813 813
    template <typename ToMap, typename FromMap>
814 814
    DigraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
815 815
      _node_maps.push_back(new _graph_utils_bits::MapCopy<From, Node, 
816 816
			   NodeRefMap, ToMap, FromMap>(tmap, map));
817 817
      return *this;
818 818
    }
819 819

	
820 820
    /// \brief Make a copy of the given node.
821 821
    ///
822 822
    /// Make a copy of the given node.
823 823
    DigraphCopy& node(TNode& tnode, const Node& snode) {
824 824
      _node_maps.push_back(new _graph_utils_bits::ItemCopy<From, Node, 
825 825
			   NodeRefMap, TNode>(tnode, snode));
826 826
      return *this;
827 827
    }
828 828

	
829 829
    /// \brief Copies the arc references into the given map.
830 830
    ///
831 831
    /// Copies the arc references into the given map.
832 832
    template <typename ArcRef>
833 833
    DigraphCopy& arcRef(ArcRef& map) {
834 834
      _arc_maps.push_back(new _graph_utils_bits::RefCopy<From, Arc, 
835 835
			  ArcRefMap, ArcRef>(map));
836 836
      return *this;
837 837
    }
838 838

	
839 839
    /// \brief Copies the arc cross references into the given map.
840 840
    ///
841 841
    ///  Copies the arc cross references (reverse references) into
842 842
    ///  the given map.
843 843
    template <typename ArcCrossRef>
844 844
    DigraphCopy& arcCrossRef(ArcCrossRef& map) {
845 845
      _arc_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Arc,
846 846
			  ArcRefMap, ArcCrossRef>(map));
847 847
      return *this;
848 848
    }
849 849

	
850 850
    /// \brief Make copy of the given map.
851 851
    ///
852 852
    /// Makes copy of the given map for the newly created digraph. 
853 853
    /// The new map's key type is the to digraph's arc type,
854 854
    /// and the copied map's key type is the from digraph's arc
855 855
    /// type.  
856 856
    template <typename ToMap, typename FromMap>
857 857
    DigraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
858 858
      _arc_maps.push_back(new _graph_utils_bits::MapCopy<From, Arc, 
859 859
			  ArcRefMap, ToMap, FromMap>(tmap, map));
860 860
      return *this;
861 861
    }
862 862

	
863 863
    /// \brief Make a copy of the given arc.
864 864
    ///
865 865
    /// Make a copy of the given arc.
866 866
    DigraphCopy& arc(TArc& tarc, const Arc& sarc) {
867 867
      _arc_maps.push_back(new _graph_utils_bits::ItemCopy<From, Arc, 
868 868
			  ArcRefMap, TArc>(tarc, sarc));
869 869
      return *this;
870 870
    }
871 871

	
872 872
    /// \brief Executes the copies.
873 873
    ///
874 874
    /// Executes the copies.
875 875
    void run() {
876 876
      NodeRefMap nodeRefMap(_from);
877 877
      ArcRefMap arcRefMap(_from);
878 878
      _graph_utils_bits::DigraphCopySelector<To>::
879 879
        copy(_to, _from, nodeRefMap, arcRefMap);
880 880
      for (int i = 0; i < int(_node_maps.size()); ++i) {
881 881
        _node_maps[i]->copy(_from, nodeRefMap);
882 882
      }
883 883
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
884 884
        _arc_maps[i]->copy(_from, arcRefMap);
885 885
      }      
886 886
    }
887 887

	
888 888
  protected:
889 889

	
890 890

	
891 891
    const From& _from;
892 892
    To& _to;
893 893

	
894 894
    std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* > 
895 895
    _node_maps;
896 896

	
897 897
    std::vector<_graph_utils_bits::MapCopyBase<From, Arc, ArcRefMap>* > 
898 898
    _arc_maps;
899 899

	
900 900
  };
901 901

	
902 902
  /// \brief Copy a digraph to another digraph.
903 903
  ///
904 904
  /// Copy a digraph to another digraph. The complete usage of the
905 905
  /// function is detailed in the DigraphCopy class, but a short
906 906
  /// example shows a basic work:
907 907
  ///\code
908 908
  /// copyDigraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
909 909
  ///\endcode
910 910
  /// 
911 911
  /// After the copy the \c nr map will contain the mapping from the
912 912
  /// nodes of the \c from digraph to the nodes of the \c to digraph and
913 913
  /// \c ecr will contain the mapping from the arcs of the \c to digraph
914 914
  /// to the arcs of the \c from digraph.
915 915
  ///
916 916
  /// \see DigraphCopy 
917 917
  template <typename To, typename From>
918 918
  DigraphCopy<To, From> copyDigraph(To& to, const From& from) {
919 919
    return DigraphCopy<To, From>(to, from);
920 920
  }
921 921

	
922 922
  /// \brief Class to copy a graph.
923 923
  ///
924 924
  /// Class to copy a graph to another graph (duplicate a graph). The
925 925
  /// simplest way of using it is through the \c copyGraph() function.
926 926
  ///
927 927
  /// This class not just make a copy of a graph, but it can create
928 928
  /// references and cross references between the nodes, edges and arcs of
929 929
  /// the two graphs, it can copy maps for use with the newly created
930 930
  /// graph and copy nodes, edges and arcs.
931 931
  ///
932 932
  /// To make a copy from a graph, first an instance of GraphCopy
933 933
  /// should be created, then the data belongs to the graph should
934 934
  /// assigned to copy. In the end, the \c run() member should be
935 935
  /// called.
936 936
  ///
937 937
  /// The next code copies a graph with several data:
938 938
  ///\code
939 939
  ///  GraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
940 940
  ///  // create a reference for the nodes
941 941
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
942 942
  ///  dc.nodeRef(nr);
943 943
  ///  // create a cross reference (inverse) for the edges
944 944
  ///  NewGraph::EdgeMap<OrigGraph::Arc> ecr(new_graph);
945 945
  ///  dc.edgeCrossRef(ecr);
946 946
  ///  // copy an arc map
947 947
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
948 948
  ///  NewGraph::ArcMap<double> namap(new_graph);
949 949
  ///  dc.arcMap(namap, oamap);
950 950
  ///  // copy a node
951 951
  ///  OrigGraph::Node on;
952 952
  ///  NewGraph::Node nn;
953 953
  ///  dc.node(nn, on);
954 954
  ///  // Executions of copy
955 955
  ///  dc.run();
956 956
  ///\endcode
957 957
  template <typename To, typename From>
958 958
  class GraphCopy {
959 959
  private:
960 960

	
961 961
    typedef typename From::Node Node;
962 962
    typedef typename From::NodeIt NodeIt;
963 963
    typedef typename From::Arc Arc;
964 964
    typedef typename From::ArcIt ArcIt;
965 965
    typedef typename From::Edge Edge;
966 966
    typedef typename From::EdgeIt EdgeIt;
967 967

	
968 968
    typedef typename To::Node TNode;
969 969
    typedef typename To::Arc TArc;
970 970
    typedef typename To::Edge TEdge;
971 971

	
972 972
    typedef typename From::template NodeMap<TNode> NodeRefMap;
973 973
    typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
974 974

	
975 975
    struct ArcRefMap {
976 976
      ArcRefMap(const To& to, const From& from,
977 977
		const EdgeRefMap& edge_ref, const NodeRefMap& node_ref) 
978 978
        : _to(to), _from(from), 
979 979
          _edge_ref(edge_ref), _node_ref(node_ref) {}
980 980

	
981 981
      typedef typename From::Arc Key;
982 982
      typedef typename To::Arc Value;
983 983

	
984 984
      Value operator[](const Key& key) const {
985 985
        bool forward = 
986 986
          (_from.direction(key) == 
987 987
	   (_node_ref[_from.source(key)] == _to.source(_edge_ref[key])));
988 988
	return _to.direct(_edge_ref[key], forward); 
989 989
      }
990 990
      
991 991
      const To& _to;
992 992
      const From& _from;
993 993
      const EdgeRefMap& _edge_ref;
994 994
      const NodeRefMap& _node_ref;
995 995
    };
996 996

	
997 997
    
998 998
  public: 
999 999

	
1000 1000

	
1001 1001
    /// \brief Constructor for the GraphCopy.
1002 1002
    ///
1003 1003
    /// It copies the content of the \c _from graph into the
1004 1004
    /// \c _to graph.
1005 1005
    GraphCopy(To& to, const From& from) 
1006 1006
      : _from(from), _to(to) {}
1007 1007

	
1008 1008
    /// \brief Destructor of the GraphCopy
1009 1009
    ///
1010 1010
    /// Destructor of the GraphCopy
1011 1011
    ~GraphCopy() {
1012 1012
      for (int i = 0; i < int(_node_maps.size()); ++i) {
1013 1013
        delete _node_maps[i];
1014 1014
      }
1015 1015
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
1016 1016
        delete _arc_maps[i];
1017 1017
      }
1018 1018
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
1019 1019
        delete _edge_maps[i];
1020 1020
      }
1021 1021

	
1022 1022
    }
1023 1023

	
1024 1024
    /// \brief Copies the node references into the given map.
1025 1025
    ///
1026 1026
    /// Copies the node references into the given map.
1027 1027
    template <typename NodeRef>
1028 1028
    GraphCopy& nodeRef(NodeRef& map) {
1029 1029
      _node_maps.push_back(new _graph_utils_bits::RefCopy<From, Node, 
1030 1030
			   NodeRefMap, NodeRef>(map));
1031 1031
      return *this;
1032 1032
    }
1033 1033

	
1034 1034
    /// \brief Copies the node cross references into the given map.
1035 1035
    ///
1036 1036
    ///  Copies the node cross references (reverse references) into
1037 1037
    ///  the given map.
1038 1038
    template <typename NodeCrossRef>
1039 1039
    GraphCopy& nodeCrossRef(NodeCrossRef& map) {
1040 1040
      _node_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Node,
1041 1041
			   NodeRefMap, NodeCrossRef>(map));
1042 1042
      return *this;
1043 1043
    }
1044 1044

	
1045 1045
    /// \brief Make copy of the given map.
1046 1046
    ///
1047 1047
    /// Makes copy of the given map for the newly created graph. 
1048 1048
    /// The new map's key type is the to graph's node type,
1049 1049
    /// and the copied map's key type is the from graph's node
1050 1050
    /// type.  
1051 1051
    template <typename ToMap, typename FromMap>
1052 1052
    GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
1053 1053
      _node_maps.push_back(new _graph_utils_bits::MapCopy<From, Node, 
1054 1054
			   NodeRefMap, ToMap, FromMap>(tmap, map));
1055 1055
      return *this;
1056 1056
    }
1057 1057

	
1058 1058
    /// \brief Make a copy of the given node.
1059 1059
    ///
1060 1060
    /// Make a copy of the given node.
1061 1061
    GraphCopy& node(TNode& tnode, const Node& snode) {
1062 1062
      _node_maps.push_back(new _graph_utils_bits::ItemCopy<From, Node, 
1063 1063
			   NodeRefMap, TNode>(tnode, snode));
1064 1064
      return *this;
1065 1065
    }
1066 1066

	
1067 1067
    /// \brief Copies the arc references into the given map.
1068 1068
    ///
1069 1069
    /// Copies the arc references into the given map.
1070 1070
    template <typename ArcRef>
1071 1071
    GraphCopy& arcRef(ArcRef& map) {
1072 1072
      _arc_maps.push_back(new _graph_utils_bits::RefCopy<From, Arc, 
1073 1073
			  ArcRefMap, ArcRef>(map));
1074 1074
      return *this;
1075 1075
    }
1076 1076

	
1077 1077
    /// \brief Copies the arc cross references into the given map.
1078 1078
    ///
1079 1079
    ///  Copies the arc cross references (reverse references) into
1080 1080
    ///  the given map.
1081 1081
    template <typename ArcCrossRef>
1082 1082
    GraphCopy& arcCrossRef(ArcCrossRef& map) {
1083 1083
      _arc_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, Arc,
1084 1084
			  ArcRefMap, ArcCrossRef>(map));
1085 1085
      return *this;
1086 1086
    }
1087 1087

	
1088 1088
    /// \brief Make copy of the given map.
1089 1089
    ///
1090 1090
    /// Makes copy of the given map for the newly created graph. 
1091 1091
    /// The new map's key type is the to graph's arc type,
1092 1092
    /// and the copied map's key type is the from graph's arc
1093 1093
    /// type.  
1094 1094
    template <typename ToMap, typename FromMap>
1095 1095
    GraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
1096 1096
      _arc_maps.push_back(new _graph_utils_bits::MapCopy<From, Arc, 
1097 1097
			  ArcRefMap, ToMap, FromMap>(tmap, map));
1098 1098
      return *this;
1099 1099
    }
1100 1100

	
1101 1101
    /// \brief Make a copy of the given arc.
1102 1102
    ///
1103 1103
    /// Make a copy of the given arc.
1104 1104
    GraphCopy& arc(TArc& tarc, const Arc& sarc) {
1105 1105
      _arc_maps.push_back(new _graph_utils_bits::ItemCopy<From, Arc, 
1106 1106
			  ArcRefMap, TArc>(tarc, sarc));
1107 1107
      return *this;
1108 1108
    }
1109 1109

	
1110 1110
    /// \brief Copies the edge references into the given map.
1111 1111
    ///
1112 1112
    /// Copies the edge references into the given map.
1113 1113
    template <typename EdgeRef>
1114 1114
    GraphCopy& edgeRef(EdgeRef& map) {
1115 1115
      _edge_maps.push_back(new _graph_utils_bits::RefCopy<From, Edge, 
1116 1116
			   EdgeRefMap, EdgeRef>(map));
1117 1117
      return *this;
1118 1118
    }
1119 1119

	
1120 1120
    /// \brief Copies the edge cross references into the given map.
1121 1121
    ///
1122 1122
    /// Copies the edge cross references (reverse
1123 1123
    /// references) into the given map.
1124 1124
    template <typename EdgeCrossRef>
1125 1125
    GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
1126 1126
      _edge_maps.push_back(new _graph_utils_bits::CrossRefCopy<From, 
1127 1127
			   Edge, EdgeRefMap, EdgeCrossRef>(map));
1128 1128
      return *this;
1129 1129
    }
1130 1130

	
1131 1131
    /// \brief Make copy of the given map.
1132 1132
    ///
1133 1133
    /// Makes copy of the given map for the newly created graph. 
1134 1134
    /// The new map's key type is the to graph's edge type,
1135 1135
    /// and the copied map's key type is the from graph's edge
1136 1136
    /// type.  
1137 1137
    template <typename ToMap, typename FromMap>
1138 1138
    GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
1139 1139
      _edge_maps.push_back(new _graph_utils_bits::MapCopy<From, Edge, 
1140 1140
			   EdgeRefMap, ToMap, FromMap>(tmap, map));
1141 1141
      return *this;
1142 1142
    }
1143 1143

	
1144 1144
    /// \brief Make a copy of the given edge.
1145 1145
    ///
1146 1146
    /// Make a copy of the given edge.
1147 1147
    GraphCopy& edge(TEdge& tedge, const Edge& sedge) {
1148 1148
      _edge_maps.push_back(new _graph_utils_bits::ItemCopy<From, Edge, 
1149 1149
			   EdgeRefMap, TEdge>(tedge, sedge));
1150 1150
      return *this;
1151 1151
    }
1152 1152

	
1153 1153
    /// \brief Executes the copies.
1154 1154
    ///
1155 1155
    /// Executes the copies.
1156 1156
    void run() {
1157 1157
      NodeRefMap nodeRefMap(_from);
1158 1158
      EdgeRefMap edgeRefMap(_from);
1159 1159
      ArcRefMap arcRefMap(_to, _from, edgeRefMap, nodeRefMap);
1160 1160
      _graph_utils_bits::GraphCopySelector<To>::
1161 1161
        copy(_to, _from, nodeRefMap, edgeRefMap);
1162 1162
      for (int i = 0; i < int(_node_maps.size()); ++i) {
1163 1163
        _node_maps[i]->copy(_from, nodeRefMap);
1164 1164
      }
1165 1165
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
1166 1166
        _edge_maps[i]->copy(_from, edgeRefMap);
1167 1167
      }
1168 1168
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
1169 1169
        _arc_maps[i]->copy(_from, arcRefMap);
1170 1170
      }
1171 1171
    }
1172 1172

	
1173 1173
  private:
1174 1174
    
1175 1175
    const From& _from;
1176 1176
    To& _to;
1177 1177

	
1178 1178
    std::vector<_graph_utils_bits::MapCopyBase<From, Node, NodeRefMap>* > 
1179 1179
    _node_maps;
1180 1180

	
1181 1181
    std::vector<_graph_utils_bits::MapCopyBase<From, Arc, ArcRefMap>* > 
1182 1182
    _arc_maps;
1183 1183

	
1184 1184
    std::vector<_graph_utils_bits::MapCopyBase<From, Edge, EdgeRefMap>* > 
1185 1185
    _edge_maps;
1186 1186

	
1187 1187
  };
1188 1188

	
1189 1189
  /// \brief Copy a graph to another graph.
1190 1190
  ///
1191 1191
  /// Copy a graph to another graph. The complete usage of the
0 comments (0 inline)