gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Rename convenience functions in subgraph adaptors (#67) - Rename hide(), unHide() to disable(), enable(). - Add new set function status(Item, bool). - Remove hidden() and add status() instead (which returns the opposite value).
0 1 0
default
1 file changed with 176 insertions and 144 deletions:
↑ Collapse diff ↑
Ignore white space 384 line context
... ...
@@ -285,1683 +285,1715 @@
285 285
      }
286 286

	
287 287
      template <typename CMap>
288 288
      ArcMap& operator=(const CMap& cmap) {
289 289
        Parent::operator=(cmap);
290 290
        return *this;
291 291
      }
292 292
    };
293 293

	
294 294
    template <typename _Value>
295 295
    class EdgeMap : public Graph::template EdgeMap<_Value> {
296 296
    public:
297 297
      typedef typename Graph::template EdgeMap<_Value> Parent;
298 298
      explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
299 299
        : Parent(*adapter._graph) {}
300 300
      EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
301 301
        : Parent(*adapter._graph, value) {}
302 302

	
303 303
    private:
304 304
      EdgeMap& operator=(const EdgeMap& cmap) {
305 305
        return operator=<EdgeMap>(cmap);
306 306
      }
307 307

	
308 308
      template <typename CMap>
309 309
      EdgeMap& operator=(const CMap& cmap) {
310 310
        Parent::operator=(cmap);
311 311
        return *this;
312 312
      }
313 313
    };
314 314

	
315 315
  };
316 316

	
317 317
  template <typename _Digraph>
318 318
  class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
319 319
  public:
320 320
    typedef _Digraph Digraph;
321 321
    typedef DigraphAdaptorBase<_Digraph> Parent;
322 322
  protected:
323 323
    ReverseDigraphBase() : Parent() { }
324 324
  public:
325 325
    typedef typename Parent::Node Node;
326 326
    typedef typename Parent::Arc Arc;
327 327

	
328 328
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
329 329
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
330 330

	
331 331
    void nextIn(Arc& a) const { Parent::nextOut(a); }
332 332
    void nextOut(Arc& a) const { Parent::nextIn(a); }
333 333

	
334 334
    Node source(const Arc& a) const { return Parent::target(a); }
335 335
    Node target(const Arc& a) const { return Parent::source(a); }
336 336

	
337 337
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
338 338

	
339 339
    typedef FindArcTagIndicator<Digraph> FindArcTag;
340 340
    Arc findArc(const Node& u, const Node& v,
341 341
                const Arc& prev = INVALID) const {
342 342
      return Parent::findArc(v, u, prev);
343 343
    }
344 344

	
345 345
  };
346 346

	
347 347
  /// \ingroup graph_adaptors
348 348
  ///
349 349
  /// \brief Adaptor class for reversing the orientation of the arcs in
350 350
  /// a digraph.
351 351
  ///
352 352
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
353 353
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
354 354
  ///
355 355
  /// The adapted digraph can also be modified through this adaptor
356 356
  /// by adding or removing nodes or arcs, unless the \c _Digraph template
357 357
  /// parameter is set to be \c const.
358 358
  ///
359 359
  /// \tparam _Digraph The type of the adapted digraph.
360 360
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
361 361
  /// It can also be specified to be \c const.
362 362
  ///
363 363
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
364 364
  /// digraph are convertible to each other.
365 365
  template<typename _Digraph>
366 366
  class ReverseDigraph :
367 367
    public DigraphAdaptorExtender<ReverseDigraphBase<_Digraph> > {
368 368
  public:
369 369
    typedef _Digraph Digraph;
370 370
    typedef DigraphAdaptorExtender<
371 371
      ReverseDigraphBase<_Digraph> > Parent;
372 372
  protected:
373 373
    ReverseDigraph() { }
374 374
  public:
375 375

	
376 376
    /// \brief Constructor
377 377
    ///
378 378
    /// Creates a reverse digraph adaptor for the given digraph.
379 379
    explicit ReverseDigraph(Digraph& digraph) {
380 380
      Parent::setDigraph(digraph);
381 381
    }
382 382
  };
383 383

	
384 384
  /// \brief Returns a read-only ReverseDigraph adaptor
385 385
  ///
386 386
  /// This function just returns a read-only \ref ReverseDigraph adaptor.
387 387
  /// \ingroup graph_adaptors
388 388
  /// \relates ReverseDigraph
389 389
  template<typename Digraph>
390 390
  ReverseDigraph<const Digraph> reverseDigraph(const Digraph& digraph) {
391 391
    return ReverseDigraph<const Digraph>(digraph);
392 392
  }
393 393

	
394 394

	
395 395
  template <typename _Digraph, typename _NodeFilterMap,
396 396
            typename _ArcFilterMap, bool _checked = true>
397 397
  class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
398 398
  public:
399 399
    typedef _Digraph Digraph;
400 400
    typedef _NodeFilterMap NodeFilterMap;
401 401
    typedef _ArcFilterMap ArcFilterMap;
402 402

	
403 403
    typedef SubDigraphBase Adaptor;
404 404
    typedef DigraphAdaptorBase<_Digraph> Parent;
405 405
  protected:
406 406
    NodeFilterMap* _node_filter;
407 407
    ArcFilterMap* _arc_filter;
408 408
    SubDigraphBase()
409 409
      : Parent(), _node_filter(0), _arc_filter(0) { }
410 410

	
411 411
    void setNodeFilterMap(NodeFilterMap& node_filter) {
412 412
      _node_filter = &node_filter;
413 413
    }
414 414
    void setArcFilterMap(ArcFilterMap& arc_filter) {
415 415
      _arc_filter = &arc_filter;
416 416
    }
417 417

	
418 418
  public:
419 419

	
420 420
    typedef typename Parent::Node Node;
421 421
    typedef typename Parent::Arc Arc;
422 422

	
423 423
    void first(Node& i) const {
424 424
      Parent::first(i);
425 425
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
426 426
    }
427 427

	
428 428
    void first(Arc& i) const {
429 429
      Parent::first(i);
430 430
      while (i != INVALID && (!(*_arc_filter)[i]
431 431
                              || !(*_node_filter)[Parent::source(i)]
432 432
                              || !(*_node_filter)[Parent::target(i)]))
433 433
        Parent::next(i);
434 434
    }
435 435

	
436 436
    void firstIn(Arc& i, const Node& n) const {
437 437
      Parent::firstIn(i, n);
438 438
      while (i != INVALID && (!(*_arc_filter)[i]
439 439
                              || !(*_node_filter)[Parent::source(i)]))
440 440
        Parent::nextIn(i);
441 441
    }
442 442

	
443 443
    void firstOut(Arc& i, const Node& n) const {
444 444
      Parent::firstOut(i, n);
445 445
      while (i != INVALID && (!(*_arc_filter)[i]
446 446
                              || !(*_node_filter)[Parent::target(i)]))
447 447
        Parent::nextOut(i);
448 448
    }
449 449

	
450 450
    void next(Node& i) const {
451 451
      Parent::next(i);
452 452
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
453 453
    }
454 454

	
455 455
    void next(Arc& i) const {
456 456
      Parent::next(i);
457 457
      while (i != INVALID && (!(*_arc_filter)[i]
458 458
                              || !(*_node_filter)[Parent::source(i)]
459 459
                              || !(*_node_filter)[Parent::target(i)]))
460 460
        Parent::next(i);
461 461
    }
462 462

	
463 463
    void nextIn(Arc& i) const {
464 464
      Parent::nextIn(i);
465 465
      while (i != INVALID && (!(*_arc_filter)[i]
466 466
                              || !(*_node_filter)[Parent::source(i)]))
467 467
        Parent::nextIn(i);
468 468
    }
469 469

	
470 470
    void nextOut(Arc& i) const {
471 471
      Parent::nextOut(i);
472 472
      while (i != INVALID && (!(*_arc_filter)[i]
473 473
                              || !(*_node_filter)[Parent::target(i)]))
474 474
        Parent::nextOut(i);
475 475
    }
476 476

	
477
    void hide(const Node& n) const { _node_filter->set(n, false); }
478
    void hide(const Arc& a) const { _arc_filter->set(a, false); }
479

	
480
    void unHide(const Node& n) const { _node_filter->set(n, true); }
481
    void unHide(const Arc& a) const { _arc_filter->set(a, true); }
482

	
483
    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
484
    bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
477
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
478
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
479

	
480
    bool status(const Node& n) const { return (*_node_filter)[n]; }
481
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
485 482

	
486 483
    typedef False NodeNumTag;
487 484
    typedef False ArcNumTag;
488 485

	
489 486
    typedef FindArcTagIndicator<Digraph> FindArcTag;
490 487
    Arc findArc(const Node& source, const Node& target,
491 488
                const Arc& prev = INVALID) const {
492 489
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
493 490
        return INVALID;
494 491
      }
495 492
      Arc arc = Parent::findArc(source, target, prev);
496 493
      while (arc != INVALID && !(*_arc_filter)[arc]) {
497 494
        arc = Parent::findArc(source, target, arc);
498 495
      }
499 496
      return arc;
500 497
    }
501 498

	
502 499
    template <typename _Value>
503 500
    class NodeMap : public SubMapExtender<Adaptor,
504 501
      typename Parent::template NodeMap<_Value> > {
505 502
    public:
506 503
      typedef _Value Value;
507 504
      typedef SubMapExtender<Adaptor, typename Parent::
508 505
                             template NodeMap<Value> > MapParent;
509 506

	
510 507
      NodeMap(const Adaptor& adaptor)
511 508
        : MapParent(adaptor) {}
512 509
      NodeMap(const Adaptor& adaptor, const Value& value)
513 510
        : MapParent(adaptor, value) {}
514 511

	
515 512
    private:
516 513
      NodeMap& operator=(const NodeMap& cmap) {
517 514
        return operator=<NodeMap>(cmap);
518 515
      }
519 516

	
520 517
      template <typename CMap>
521 518
      NodeMap& operator=(const CMap& cmap) {
522 519
        MapParent::operator=(cmap);
523 520
        return *this;
524 521
      }
525 522
    };
526 523

	
527 524
    template <typename _Value>
528 525
    class ArcMap : public SubMapExtender<Adaptor,
529 526
      typename Parent::template ArcMap<_Value> > {
530 527
    public:
531 528
      typedef _Value Value;
532 529
      typedef SubMapExtender<Adaptor, typename Parent::
533 530
                             template ArcMap<Value> > MapParent;
534 531

	
535 532
      ArcMap(const Adaptor& adaptor)
536 533
        : MapParent(adaptor) {}
537 534
      ArcMap(const Adaptor& adaptor, const Value& value)
538 535
        : MapParent(adaptor, value) {}
539 536

	
540 537
    private:
541 538
      ArcMap& operator=(const ArcMap& cmap) {
542 539
        return operator=<ArcMap>(cmap);
543 540
      }
544 541

	
545 542
      template <typename CMap>
546 543
      ArcMap& operator=(const CMap& cmap) {
547 544
        MapParent::operator=(cmap);
548 545
        return *this;
549 546
      }
550 547
    };
551 548

	
552 549
  };
553 550

	
554 551
  template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
555 552
  class SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
556 553
    : public DigraphAdaptorBase<_Digraph> {
557 554
  public:
558 555
    typedef _Digraph Digraph;
559 556
    typedef _NodeFilterMap NodeFilterMap;
560 557
    typedef _ArcFilterMap ArcFilterMap;
561 558

	
562 559
    typedef SubDigraphBase Adaptor;
563 560
    typedef DigraphAdaptorBase<Digraph> Parent;
564 561
  protected:
565 562
    NodeFilterMap* _node_filter;
566 563
    ArcFilterMap* _arc_filter;
567 564
    SubDigraphBase()
568 565
      : Parent(), _node_filter(0), _arc_filter(0) { }
569 566

	
570 567
    void setNodeFilterMap(NodeFilterMap& node_filter) {
571 568
      _node_filter = &node_filter;
572 569
    }
573 570
    void setArcFilterMap(ArcFilterMap& arc_filter) {
574 571
      _arc_filter = &arc_filter;
575 572
    }
576 573

	
577 574
  public:
578 575

	
579 576
    typedef typename Parent::Node Node;
580 577
    typedef typename Parent::Arc Arc;
581 578

	
582 579
    void first(Node& i) const {
583 580
      Parent::first(i);
584 581
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
585 582
    }
586 583

	
587 584
    void first(Arc& i) const {
588 585
      Parent::first(i);
589 586
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
590 587
    }
591 588

	
592 589
    void firstIn(Arc& i, const Node& n) const {
593 590
      Parent::firstIn(i, n);
594 591
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
595 592
    }
596 593

	
597 594
    void firstOut(Arc& i, const Node& n) const {
598 595
      Parent::firstOut(i, n);
599 596
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
600 597
    }
601 598

	
602 599
    void next(Node& i) const {
603 600
      Parent::next(i);
604 601
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
605 602
    }
606 603
    void next(Arc& i) const {
607 604
      Parent::next(i);
608 605
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
609 606
    }
610 607
    void nextIn(Arc& i) const {
611 608
      Parent::nextIn(i);
612 609
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
613 610
    }
614 611

	
615 612
    void nextOut(Arc& i) const {
616 613
      Parent::nextOut(i);
617 614
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
618 615
    }
619 616

	
620
    void hide(const Node& n) const { _node_filter->set(n, false); }
621
    void hide(const Arc& e) const { _arc_filter->set(e, false); }
622

	
623
    void unHide(const Node& n) const { _node_filter->set(n, true); }
624
    void unHide(const Arc& e) const { _arc_filter->set(e, true); }
625

	
626
    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
627
    bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
617
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
618
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
619

	
620
    bool status(const Node& n) const { return (*_node_filter)[n]; }
621
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
628 622

	
629 623
    typedef False NodeNumTag;
630 624
    typedef False ArcNumTag;
631 625

	
632 626
    typedef FindArcTagIndicator<Digraph> FindArcTag;
633 627
    Arc findArc(const Node& source, const Node& target,
634 628
                const Arc& prev = INVALID) const {
635 629
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
636 630
        return INVALID;
637 631
      }
638 632
      Arc arc = Parent::findArc(source, target, prev);
639 633
      while (arc != INVALID && !(*_arc_filter)[arc]) {
640 634
        arc = Parent::findArc(source, target, arc);
641 635
      }
642 636
      return arc;
643 637
    }
644 638

	
645 639
    template <typename _Value>
646 640
    class NodeMap : public SubMapExtender<Adaptor,
647 641
      typename Parent::template NodeMap<_Value> > {
648 642
    public:
649 643
      typedef _Value Value;
650 644
      typedef SubMapExtender<Adaptor, typename Parent::
651 645
                             template NodeMap<Value> > MapParent;
652 646

	
653 647
      NodeMap(const Adaptor& adaptor)
654 648
        : MapParent(adaptor) {}
655 649
      NodeMap(const Adaptor& adaptor, const Value& value)
656 650
        : MapParent(adaptor, value) {}
657 651

	
658 652
    private:
659 653
      NodeMap& operator=(const NodeMap& cmap) {
660 654
        return operator=<NodeMap>(cmap);
661 655
      }
662 656

	
663 657
      template <typename CMap>
664 658
      NodeMap& operator=(const CMap& cmap) {
665 659
        MapParent::operator=(cmap);
666 660
        return *this;
667 661
      }
668 662
    };
669 663

	
670 664
    template <typename _Value>
671 665
    class ArcMap : public SubMapExtender<Adaptor,
672 666
      typename Parent::template ArcMap<_Value> > {
673 667
    public:
674 668
      typedef _Value Value;
675 669
      typedef SubMapExtender<Adaptor, typename Parent::
676 670
                             template ArcMap<Value> > MapParent;
677 671

	
678 672
      ArcMap(const Adaptor& adaptor)
679 673
        : MapParent(adaptor) {}
680 674
      ArcMap(const Adaptor& adaptor, const Value& value)
681 675
        : MapParent(adaptor, value) {}
682 676

	
683 677
    private:
684 678
      ArcMap& operator=(const ArcMap& cmap) {
685 679
        return operator=<ArcMap>(cmap);
686 680
      }
687 681

	
688 682
      template <typename CMap>
689 683
      ArcMap& operator=(const CMap& cmap) {
690 684
        MapParent::operator=(cmap);
691 685
        return *this;
692 686
      }
693 687
    };
694 688

	
695 689
  };
696 690

	
697 691
  /// \ingroup graph_adaptors
698 692
  ///
699 693
  /// \brief Adaptor class for hiding nodes and arcs in a digraph
700 694
  ///
701 695
  /// SubDigraph can be used for hiding nodes and arcs in a digraph.
702 696
  /// A \c bool node map and a \c bool arc map must be specified, which
703 697
  /// define the filters for nodes and arcs.
704 698
  /// Only the nodes and arcs with \c true filter value are
705 699
  /// shown in the subdigraph. This adaptor conforms to the \ref
706 700
  /// concepts::Digraph "Digraph" concept. If the \c _checked parameter
707 701
  /// is \c true, then the arcs incident to hidden nodes are also
708 702
  /// filtered out.
709 703
  ///
710 704
  /// The adapted digraph can also be modified through this adaptor
711 705
  /// by adding or removing nodes or arcs, unless the \c _Digraph template
712 706
  /// parameter is set to be \c const.
713 707
  ///
714 708
  /// \tparam _Digraph The type of the adapted digraph.
715 709
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
716 710
  /// It can also be specified to be \c const.
717 711
  /// \tparam _NodeFilterMap A \c bool (or convertible) node map of the
718 712
  /// adapted digraph. The default map type is
719 713
  /// \ref concepts::Digraph::NodeMap "_Digraph::NodeMap<bool>".
720 714
  /// \tparam _ArcFilterMap A \c bool (or convertible) arc map of the
721 715
  /// adapted digraph. The default map type is
722 716
  /// \ref concepts::Digraph::ArcMap "_Digraph::ArcMap<bool>".
723 717
  /// \tparam _checked If this parameter is set to \c false, then the arc
724 718
  /// filtering is not checked with respect to the node filter.
725 719
  /// Otherwise, each arc that is incident to a hidden node is automatically
726 720
  /// filtered out. This is the default option.
727 721
  ///
728 722
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
729 723
  /// digraph are convertible to each other.
730 724
  ///
731 725
  /// \see FilterNodes
732 726
  /// \see FilterArcs
733 727
#ifdef DOXYGEN
734 728
  template<typename _Digraph,
735 729
           typename _NodeFilterMap,
736 730
           typename _ArcFilterMap,
737 731
           bool _checked>
738 732
#else
739 733
  template<typename _Digraph,
740 734
           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
741 735
           typename _ArcFilterMap = typename _Digraph::template ArcMap<bool>,
742 736
           bool _checked = true>
743 737
#endif
744 738
  class SubDigraph
745 739
    : public DigraphAdaptorExtender<
746 740
      SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, _checked> > {
747 741
  public:
748 742
    /// The type of the adapted digraph.
749 743
    typedef _Digraph Digraph;
750 744
    /// The type of the node filter map.
751 745
    typedef _NodeFilterMap NodeFilterMap;
752 746
    /// The type of the arc filter map.
753 747
    typedef _ArcFilterMap ArcFilterMap;
754 748

	
755 749
    typedef DigraphAdaptorExtender<
756 750
      SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, _checked> >
757 751
    Parent;
758 752

	
759 753
    typedef typename Parent::Node Node;
760 754
    typedef typename Parent::Arc Arc;
761 755

	
762 756
  protected:
763 757
    SubDigraph() { }
764 758
  public:
765 759

	
766 760
    /// \brief Constructor
767 761
    ///
768 762
    /// Creates a subdigraph for the given digraph with the
769 763
    /// given node and arc filter maps.
770 764
    SubDigraph(Digraph& digraph, NodeFilterMap& node_filter,
771 765
               ArcFilterMap& arc_filter) {
772 766
      setDigraph(digraph);
773 767
      setNodeFilterMap(node_filter);
774 768
      setArcFilterMap(arc_filter);
775 769
    }
776 770

	
777
    /// \brief Hides the given node
771
    /// \brief Sets the status of the given node
778 772
    ///
779
    /// This function hides the given node in the subdigraph,
780
    /// i.e. the iteration jumps over it.
773
    /// This function sets the status of the given node.
781 774
    /// It is done by simply setting the assigned value of \c n
782
    /// to be \c false in the node filter map.
783
    void hide(const Node& n) const { Parent::hide(n); }
784

	
785
    /// \brief Hides the given arc
775
    /// to \c v in the node filter map.
776
    void status(const Node& n, bool v) const { Parent::status(n, v); }
777

	
778
    /// \brief Sets the status of the given arc
786 779
    ///
787
    /// This function hides the given arc in the subdigraph,
788
    /// i.e. the iteration jumps over it.
780
    /// This function sets the status of the given arc.
789 781
    /// It is done by simply setting the assigned value of \c a
790
    /// to be \c false in the arc filter map.
791
    void hide(const Arc& a) const { Parent::hide(a); }
792

	
793
    /// \brief Shows the given node
782
    /// to \c v in the arc filter map.
783
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
784

	
785
    /// \brief Returns the status of the given node
794 786
    ///
795
    /// This function shows the given node in the subdigraph.
796
    /// It is done by simply setting the assigned value of \c n
797
    /// to be \c true in the node filter map.
798
    void unHide(const Node& n) const { Parent::unHide(n); }
799

	
800
    /// \brief Shows the given arc
787
    /// This function returns the status of the given node.
788
    /// It is \c true if the given node is enabled (i.e. not hidden).
789
    bool status(const Node& n) const { return Parent::status(n); }
790

	
791
    /// \brief Returns the status of the given arc
801 792
    ///
802
    /// This function shows the given arc in the subdigraph.
803
    /// It is done by simply setting the assigned value of \c a
804
    /// to be \c true in the arc filter map.
805
    void unHide(const Arc& a) const { Parent::unHide(a); }
806

	
807
    /// \brief Returns \c true if the given node is hidden.
793
    /// This function returns the status of the given arc.
794
    /// It is \c true if the given arc is enabled (i.e. not hidden).
795
    bool status(const Arc& a) const { return Parent::status(a); }
796

	
797
    /// \brief Disables the given node
808 798
    ///
809
    /// This function returns \c true if the given node is hidden.
810
    bool hidden(const Node& n) const { return Parent::hidden(n); }
811

	
812
    /// \brief Returns \c true if the given arc is hidden.
799
    /// This function disables the given node in the subdigraph,
800
    /// so the iteration jumps over it.
801
    /// It is the same as \ref status() "status(n, false)".
802
    void disable(const Node& n) const { Parent::status(n, false); }
803

	
804
    /// \brief Disables the given arc
813 805
    ///
814
    /// This function returns \c true if the given arc is hidden.
815
    bool hidden(const Arc& a) const { return Parent::hidden(a); }
806
    /// This function disables the given arc in the subdigraph,
807
    /// so the iteration jumps over it.
808
    /// It is the same as \ref status() "status(a, false)".
809
    void disable(const Arc& a) const { Parent::status(a, false); }
810

	
811
    /// \brief Enables the given node
812
    ///
813
    /// This function enables the given node in the subdigraph.
814
    /// It is the same as \ref status() "status(n, true)".
815
    void enable(const Node& n) const { Parent::status(n, true); }
816

	
817
    /// \brief Enables the given arc
818
    ///
819
    /// This function enables the given arc in the subdigraph.
820
    /// It is the same as \ref status() "status(a, true)".
821
    void enable(const Arc& a) const { Parent::status(a, true); }
816 822

	
817 823
  };
818 824

	
819 825
  /// \brief Returns a read-only SubDigraph adaptor
820 826
  ///
821 827
  /// This function just returns a read-only \ref SubDigraph adaptor.
822 828
  /// \ingroup graph_adaptors
823 829
  /// \relates SubDigraph
824 830
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
825 831
  SubDigraph<const Digraph, NodeFilterMap, ArcFilterMap>
826 832
  subDigraph(const Digraph& digraph, NodeFilterMap& nfm, ArcFilterMap& afm) {
827 833
    return SubDigraph<const Digraph, NodeFilterMap, ArcFilterMap>
828 834
      (digraph, nfm, afm);
829 835
  }
830 836

	
831 837
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
832 838
  SubDigraph<const Digraph, const NodeFilterMap, ArcFilterMap>
833 839
  subDigraph(const Digraph& digraph,
834 840
             const NodeFilterMap& nfm, ArcFilterMap& afm) {
835 841
    return SubDigraph<const Digraph, const NodeFilterMap, ArcFilterMap>
836 842
      (digraph, nfm, afm);
837 843
  }
838 844

	
839 845
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
840 846
  SubDigraph<const Digraph, NodeFilterMap, const ArcFilterMap>
841 847
  subDigraph(const Digraph& digraph,
842 848
             NodeFilterMap& nfm, const ArcFilterMap& afm) {
843 849
    return SubDigraph<const Digraph, NodeFilterMap, const ArcFilterMap>
844 850
      (digraph, nfm, afm);
845 851
  }
846 852

	
847 853
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
848 854
  SubDigraph<const Digraph, const NodeFilterMap, const ArcFilterMap>
849 855
  subDigraph(const Digraph& digraph,
850 856
             const NodeFilterMap& nfm, const ArcFilterMap& afm) {
851 857
    return SubDigraph<const Digraph, const NodeFilterMap,
852 858
      const ArcFilterMap>(digraph, nfm, afm);
853 859
  }
854 860

	
855 861

	
856 862
  template <typename _Graph, typename _NodeFilterMap,
857 863
            typename _EdgeFilterMap, bool _checked = true>
858 864
  class SubGraphBase : public GraphAdaptorBase<_Graph> {
859 865
  public:
860 866
    typedef _Graph Graph;
861 867
    typedef _NodeFilterMap NodeFilterMap;
862 868
    typedef _EdgeFilterMap EdgeFilterMap;
863 869

	
864 870
    typedef SubGraphBase Adaptor;
865 871
    typedef GraphAdaptorBase<_Graph> Parent;
866 872
  protected:
867 873

	
868 874
    NodeFilterMap* _node_filter_map;
869 875
    EdgeFilterMap* _edge_filter_map;
870 876

	
871 877
    SubGraphBase()
872 878
      : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
873 879

	
874 880
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
875 881
      _node_filter_map=&node_filter_map;
876 882
    }
877 883
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
878 884
      _edge_filter_map=&edge_filter_map;
879 885
    }
880 886

	
881 887
  public:
882 888

	
883 889
    typedef typename Parent::Node Node;
884 890
    typedef typename Parent::Arc Arc;
885 891
    typedef typename Parent::Edge Edge;
886 892

	
887 893
    void first(Node& i) const {
888 894
      Parent::first(i);
889 895
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
890 896
    }
891 897

	
892 898
    void first(Arc& i) const {
893 899
      Parent::first(i);
894 900
      while (i!=INVALID && (!(*_edge_filter_map)[i]
895 901
                            || !(*_node_filter_map)[Parent::source(i)]
896 902
                            || !(*_node_filter_map)[Parent::target(i)]))
897 903
        Parent::next(i);
898 904
    }
899 905

	
900 906
    void first(Edge& i) const {
901 907
      Parent::first(i);
902 908
      while (i!=INVALID && (!(*_edge_filter_map)[i]
903 909
                            || !(*_node_filter_map)[Parent::u(i)]
904 910
                            || !(*_node_filter_map)[Parent::v(i)]))
905 911
        Parent::next(i);
906 912
    }
907 913

	
908 914
    void firstIn(Arc& i, const Node& n) const {
909 915
      Parent::firstIn(i, n);
910 916
      while (i!=INVALID && (!(*_edge_filter_map)[i]
911 917
                            || !(*_node_filter_map)[Parent::source(i)]))
912 918
        Parent::nextIn(i);
913 919
    }
914 920

	
915 921
    void firstOut(Arc& i, const Node& n) const {
916 922
      Parent::firstOut(i, n);
917 923
      while (i!=INVALID && (!(*_edge_filter_map)[i]
918 924
                            || !(*_node_filter_map)[Parent::target(i)]))
919 925
        Parent::nextOut(i);
920 926
    }
921 927

	
922 928
    void firstInc(Edge& i, bool& d, const Node& n) const {
923 929
      Parent::firstInc(i, d, n);
924 930
      while (i!=INVALID && (!(*_edge_filter_map)[i]
925 931
                            || !(*_node_filter_map)[Parent::u(i)]
926 932
                            || !(*_node_filter_map)[Parent::v(i)]))
927 933
        Parent::nextInc(i, d);
928 934
    }
929 935

	
930 936
    void next(Node& i) const {
931 937
      Parent::next(i);
932 938
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
933 939
    }
934 940

	
935 941
    void next(Arc& i) const {
936 942
      Parent::next(i);
937 943
      while (i!=INVALID && (!(*_edge_filter_map)[i]
938 944
                            || !(*_node_filter_map)[Parent::source(i)]
939 945
                            || !(*_node_filter_map)[Parent::target(i)]))
940 946
        Parent::next(i);
941 947
    }
942 948

	
943 949
    void next(Edge& i) const {
944 950
      Parent::next(i);
945 951
      while (i!=INVALID && (!(*_edge_filter_map)[i]
946 952
                            || !(*_node_filter_map)[Parent::u(i)]
947 953
                            || !(*_node_filter_map)[Parent::v(i)]))
948 954
        Parent::next(i);
949 955
    }
950 956

	
951 957
    void nextIn(Arc& i) const {
952 958
      Parent::nextIn(i);
953 959
      while (i!=INVALID && (!(*_edge_filter_map)[i]
954 960
                            || !(*_node_filter_map)[Parent::source(i)]))
955 961
        Parent::nextIn(i);
956 962
    }
957 963

	
958 964
    void nextOut(Arc& i) const {
959 965
      Parent::nextOut(i);
960 966
      while (i!=INVALID && (!(*_edge_filter_map)[i]
961 967
                            || !(*_node_filter_map)[Parent::target(i)]))
962 968
        Parent::nextOut(i);
963 969
    }
964 970

	
965 971
    void nextInc(Edge& i, bool& d) const {
966 972
      Parent::nextInc(i, d);
967 973
      while (i!=INVALID && (!(*_edge_filter_map)[i]
968 974
                            || !(*_node_filter_map)[Parent::u(i)]
969 975
                            || !(*_node_filter_map)[Parent::v(i)]))
970 976
        Parent::nextInc(i, d);
971 977
    }
972 978

	
973
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
974
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
975

	
976
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
977
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
978

	
979
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
980
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
979
    void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
980
    void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
981

	
982
    bool status(const Node& n) const { return (*_node_filter_map)[n]; }
983
    bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
981 984

	
982 985
    typedef False NodeNumTag;
983 986
    typedef False ArcNumTag;
984 987
    typedef False EdgeNumTag;
985 988

	
986 989
    typedef FindArcTagIndicator<Graph> FindArcTag;
987 990
    Arc findArc(const Node& u, const Node& v,
988 991
                const Arc& prev = INVALID) const {
989 992
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
990 993
        return INVALID;
991 994
      }
992 995
      Arc arc = Parent::findArc(u, v, prev);
993 996
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
994 997
        arc = Parent::findArc(u, v, arc);
995 998
      }
996 999
      return arc;
997 1000
    }
998 1001

	
999 1002
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1000 1003
    Edge findEdge(const Node& u, const Node& v,
1001 1004
                  const Edge& prev = INVALID) const {
1002 1005
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
1003 1006
        return INVALID;
1004 1007
      }
1005 1008
      Edge edge = Parent::findEdge(u, v, prev);
1006 1009
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
1007 1010
        edge = Parent::findEdge(u, v, edge);
1008 1011
      }
1009 1012
      return edge;
1010 1013
    }
1011 1014

	
1012 1015
    template <typename _Value>
1013 1016
    class NodeMap : public SubMapExtender<Adaptor,
1014 1017
      typename Parent::template NodeMap<_Value> > {
1015 1018
    public:
1016 1019
      typedef _Value Value;
1017 1020
      typedef SubMapExtender<Adaptor, typename Parent::
1018 1021
                             template NodeMap<Value> > MapParent;
1019 1022

	
1020 1023
      NodeMap(const Adaptor& adaptor)
1021 1024
        : MapParent(adaptor) {}
1022 1025
      NodeMap(const Adaptor& adaptor, const Value& value)
1023 1026
        : MapParent(adaptor, value) {}
1024 1027

	
1025 1028
    private:
1026 1029
      NodeMap& operator=(const NodeMap& cmap) {
1027 1030
        return operator=<NodeMap>(cmap);
1028 1031
      }
1029 1032

	
1030 1033
      template <typename CMap>
1031 1034
      NodeMap& operator=(const CMap& cmap) {
1032 1035
        MapParent::operator=(cmap);
1033 1036
        return *this;
1034 1037
      }
1035 1038
    };
1036 1039

	
1037 1040
    template <typename _Value>
1038 1041
    class ArcMap : public SubMapExtender<Adaptor,
1039 1042
      typename Parent::template ArcMap<_Value> > {
1040 1043
    public:
1041 1044
      typedef _Value Value;
1042 1045
      typedef SubMapExtender<Adaptor, typename Parent::
1043 1046
                             template ArcMap<Value> > MapParent;
1044 1047

	
1045 1048
      ArcMap(const Adaptor& adaptor)
1046 1049
        : MapParent(adaptor) {}
1047 1050
      ArcMap(const Adaptor& adaptor, const Value& value)
1048 1051
        : MapParent(adaptor, value) {}
1049 1052

	
1050 1053
    private:
1051 1054
      ArcMap& operator=(const ArcMap& cmap) {
1052 1055
        return operator=<ArcMap>(cmap);
1053 1056
      }
1054 1057

	
1055 1058
      template <typename CMap>
1056 1059
      ArcMap& operator=(const CMap& cmap) {
1057 1060
        MapParent::operator=(cmap);
1058 1061
        return *this;
1059 1062
      }
1060 1063
    };
1061 1064

	
1062 1065
    template <typename _Value>
1063 1066
    class EdgeMap : public SubMapExtender<Adaptor,
1064 1067
      typename Parent::template EdgeMap<_Value> > {
1065 1068
    public:
1066 1069
      typedef _Value Value;
1067 1070
      typedef SubMapExtender<Adaptor, typename Parent::
1068 1071
                             template EdgeMap<Value> > MapParent;
1069 1072

	
1070 1073
      EdgeMap(const Adaptor& adaptor)
1071 1074
        : MapParent(adaptor) {}
1072 1075

	
1073 1076
      EdgeMap(const Adaptor& adaptor, const Value& value)
1074 1077
        : MapParent(adaptor, value) {}
1075 1078

	
1076 1079
    private:
1077 1080
      EdgeMap& operator=(const EdgeMap& cmap) {
1078 1081
        return operator=<EdgeMap>(cmap);
1079 1082
      }
1080 1083

	
1081 1084
      template <typename CMap>
1082 1085
      EdgeMap& operator=(const CMap& cmap) {
1083 1086
        MapParent::operator=(cmap);
1084 1087
        return *this;
1085 1088
      }
1086 1089
    };
1087 1090

	
1088 1091
  };
1089 1092

	
1090 1093
  template <typename _Graph, typename _NodeFilterMap, typename _EdgeFilterMap>
1091 1094
  class SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, false>
1092 1095
    : public GraphAdaptorBase<_Graph> {
1093 1096
  public:
1094 1097
    typedef _Graph Graph;
1095 1098
    typedef _NodeFilterMap NodeFilterMap;
1096 1099
    typedef _EdgeFilterMap EdgeFilterMap;
1097 1100

	
1098 1101
    typedef SubGraphBase Adaptor;
1099 1102
    typedef GraphAdaptorBase<_Graph> Parent;
1100 1103
  protected:
1101 1104
    NodeFilterMap* _node_filter_map;
1102 1105
    EdgeFilterMap* _edge_filter_map;
1103 1106
    SubGraphBase() : Parent(),
1104 1107
                     _node_filter_map(0), _edge_filter_map(0) { }
1105 1108

	
1106 1109
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
1107 1110
      _node_filter_map=&node_filter_map;
1108 1111
    }
1109 1112
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
1110 1113
      _edge_filter_map=&edge_filter_map;
1111 1114
    }
1112 1115

	
1113 1116
  public:
1114 1117

	
1115 1118
    typedef typename Parent::Node Node;
1116 1119
    typedef typename Parent::Arc Arc;
1117 1120
    typedef typename Parent::Edge Edge;
1118 1121

	
1119 1122
    void first(Node& i) const {
1120 1123
      Parent::first(i);
1121 1124
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1122 1125
    }
1123 1126

	
1124 1127
    void first(Arc& i) const {
1125 1128
      Parent::first(i);
1126 1129
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1127 1130
    }
1128 1131

	
1129 1132
    void first(Edge& i) const {
1130 1133
      Parent::first(i);
1131 1134
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1132 1135
    }
1133 1136

	
1134 1137
    void firstIn(Arc& i, const Node& n) const {
1135 1138
      Parent::firstIn(i, n);
1136 1139
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1137 1140
    }
1138 1141

	
1139 1142
    void firstOut(Arc& i, const Node& n) const {
1140 1143
      Parent::firstOut(i, n);
1141 1144
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1142 1145
    }
1143 1146

	
1144 1147
    void firstInc(Edge& i, bool& d, const Node& n) const {
1145 1148
      Parent::firstInc(i, d, n);
1146 1149
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1147 1150
    }
1148 1151

	
1149 1152
    void next(Node& i) const {
1150 1153
      Parent::next(i);
1151 1154
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1152 1155
    }
1153 1156
    void next(Arc& i) const {
1154 1157
      Parent::next(i);
1155 1158
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1156 1159
    }
1157 1160
    void next(Edge& i) const {
1158 1161
      Parent::next(i);
1159 1162
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1160 1163
    }
1161 1164
    void nextIn(Arc& i) const {
1162 1165
      Parent::nextIn(i);
1163 1166
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1164 1167
    }
1165 1168

	
1166 1169
    void nextOut(Arc& i) const {
1167 1170
      Parent::nextOut(i);
1168 1171
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1169 1172
    }
1170 1173
    void nextInc(Edge& i, bool& d) const {
1171 1174
      Parent::nextInc(i, d);
1172 1175
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1173 1176
    }
1174 1177

	
1175
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
1176
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
1177

	
1178
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
1179
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
1180

	
1181
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
1182
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
1178
    void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
1179
    void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
1180

	
1181
    bool status(const Node& n) const { return (*_node_filter_map)[n]; }
1182
    bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
1183 1183

	
1184 1184
    typedef False NodeNumTag;
1185 1185
    typedef False ArcNumTag;
1186 1186
    typedef False EdgeNumTag;
1187 1187

	
1188 1188
    typedef FindArcTagIndicator<Graph> FindArcTag;
1189 1189
    Arc findArc(const Node& u, const Node& v,
1190 1190
                const Arc& prev = INVALID) const {
1191 1191
      Arc arc = Parent::findArc(u, v, prev);
1192 1192
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
1193 1193
        arc = Parent::findArc(u, v, arc);
1194 1194
      }
1195 1195
      return arc;
1196 1196
    }
1197 1197

	
1198 1198
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1199 1199
    Edge findEdge(const Node& u, const Node& v,
1200 1200
                  const Edge& prev = INVALID) const {
1201 1201
      Edge edge = Parent::findEdge(u, v, prev);
1202 1202
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
1203 1203
        edge = Parent::findEdge(u, v, edge);
1204 1204
      }
1205 1205
      return edge;
1206 1206
    }
1207 1207

	
1208 1208
    template <typename _Value>
1209 1209
    class NodeMap : public SubMapExtender<Adaptor,
1210 1210
      typename Parent::template NodeMap<_Value> > {
1211 1211
    public:
1212 1212
      typedef _Value Value;
1213 1213
      typedef SubMapExtender<Adaptor, typename Parent::
1214 1214
                             template NodeMap<Value> > MapParent;
1215 1215

	
1216 1216
      NodeMap(const Adaptor& adaptor)
1217 1217
        : MapParent(adaptor) {}
1218 1218
      NodeMap(const Adaptor& adaptor, const Value& value)
1219 1219
        : MapParent(adaptor, value) {}
1220 1220

	
1221 1221
    private:
1222 1222
      NodeMap& operator=(const NodeMap& cmap) {
1223 1223
        return operator=<NodeMap>(cmap);
1224 1224
      }
1225 1225

	
1226 1226
      template <typename CMap>
1227 1227
      NodeMap& operator=(const CMap& cmap) {
1228 1228
        MapParent::operator=(cmap);
1229 1229
        return *this;
1230 1230
      }
1231 1231
    };
1232 1232

	
1233 1233
    template <typename _Value>
1234 1234
    class ArcMap : public SubMapExtender<Adaptor,
1235 1235
      typename Parent::template ArcMap<_Value> > {
1236 1236
    public:
1237 1237
      typedef _Value Value;
1238 1238
      typedef SubMapExtender<Adaptor, typename Parent::
1239 1239
                             template ArcMap<Value> > MapParent;
1240 1240

	
1241 1241
      ArcMap(const Adaptor& adaptor)
1242 1242
        : MapParent(adaptor) {}
1243 1243
      ArcMap(const Adaptor& adaptor, const Value& value)
1244 1244
        : MapParent(adaptor, value) {}
1245 1245

	
1246 1246
    private:
1247 1247
      ArcMap& operator=(const ArcMap& cmap) {
1248 1248
        return operator=<ArcMap>(cmap);
1249 1249
      }
1250 1250

	
1251 1251
      template <typename CMap>
1252 1252
      ArcMap& operator=(const CMap& cmap) {
1253 1253
        MapParent::operator=(cmap);
1254 1254
        return *this;
1255 1255
      }
1256 1256
    };
1257 1257

	
1258 1258
    template <typename _Value>
1259 1259
    class EdgeMap : public SubMapExtender<Adaptor,
1260 1260
      typename Parent::template EdgeMap<_Value> > {
1261 1261
    public:
1262 1262
      typedef _Value Value;
1263 1263
      typedef SubMapExtender<Adaptor, typename Parent::
1264 1264
                             template EdgeMap<Value> > MapParent;
1265 1265

	
1266 1266
      EdgeMap(const Adaptor& adaptor)
1267 1267
        : MapParent(adaptor) {}
1268 1268

	
1269 1269
      EdgeMap(const Adaptor& adaptor, const _Value& value)
1270 1270
        : MapParent(adaptor, value) {}
1271 1271

	
1272 1272
    private:
1273 1273
      EdgeMap& operator=(const EdgeMap& cmap) {
1274 1274
        return operator=<EdgeMap>(cmap);
1275 1275
      }
1276 1276

	
1277 1277
      template <typename CMap>
1278 1278
      EdgeMap& operator=(const CMap& cmap) {
1279 1279
        MapParent::operator=(cmap);
1280 1280
        return *this;
1281 1281
      }
1282 1282
    };
1283 1283

	
1284 1284
  };
1285 1285

	
1286 1286
  /// \ingroup graph_adaptors
1287 1287
  ///
1288 1288
  /// \brief Adaptor class for hiding nodes and edges in an undirected
1289 1289
  /// graph.
1290 1290
  ///
1291 1291
  /// SubGraph can be used for hiding nodes and edges in a graph.
1292 1292
  /// A \c bool node map and a \c bool edge map must be specified, which
1293 1293
  /// define the filters for nodes and edges.
1294 1294
  /// Only the nodes and edges with \c true filter value are
1295 1295
  /// shown in the subgraph. This adaptor conforms to the \ref
1296 1296
  /// concepts::Graph "Graph" concept. If the \c _checked parameter is
1297 1297
  /// \c true, then the edges incident to hidden nodes are also
1298 1298
  /// filtered out.
1299 1299
  ///
1300 1300
  /// The adapted graph can also be modified through this adaptor
1301 1301
  /// by adding or removing nodes or edges, unless the \c _Graph template
1302 1302
  /// parameter is set to be \c const.
1303 1303
  ///
1304 1304
  /// \tparam _Graph The type of the adapted graph.
1305 1305
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1306 1306
  /// It can also be specified to be \c const.
1307 1307
  /// \tparam _NodeFilterMap A \c bool (or convertible) node map of the
1308 1308
  /// adapted graph. The default map type is
1309 1309
  /// \ref concepts::Graph::NodeMap "_Graph::NodeMap<bool>".
1310 1310
  /// \tparam _EdgeFilterMap A \c bool (or convertible) edge map of the
1311 1311
  /// adapted graph. The default map type is
1312 1312
  /// \ref concepts::Graph::EdgeMap "_Graph::EdgeMap<bool>".
1313 1313
  /// \tparam _checked If this parameter is set to \c false, then the edge
1314 1314
  /// filtering is not checked with respect to the node filter.
1315 1315
  /// Otherwise, each edge that is incident to a hidden node is automatically
1316 1316
  /// filtered out. This is the default option.
1317 1317
  ///
1318 1318
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1319 1319
  /// adapted graph are convertible to each other.
1320 1320
  ///
1321 1321
  /// \see FilterNodes
1322 1322
  /// \see FilterEdges
1323 1323
#ifdef DOXYGEN
1324 1324
  template<typename _Graph,
1325 1325
           typename _NodeFilterMap,
1326 1326
           typename _EdgeFilterMap,
1327 1327
           bool _checked>
1328 1328
#else
1329 1329
  template<typename _Graph,
1330 1330
           typename _NodeFilterMap = typename _Graph::template NodeMap<bool>,
1331 1331
           typename _EdgeFilterMap = typename _Graph::template EdgeMap<bool>,
1332 1332
           bool _checked = true>
1333 1333
#endif
1334 1334
  class SubGraph
1335 1335
    : public GraphAdaptorExtender<
1336 1336
      SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, _checked> > {
1337 1337
  public:
1338 1338
    /// The type of the adapted graph.
1339 1339
    typedef _Graph Graph;
1340 1340
    /// The type of the node filter map.
1341 1341
    typedef _NodeFilterMap NodeFilterMap;
1342 1342
    /// The type of the edge filter map.
1343 1343
    typedef _EdgeFilterMap EdgeFilterMap;
1344 1344

	
1345 1345
    typedef GraphAdaptorExtender<
1346 1346
      SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, _checked> > Parent;
1347 1347

	
1348 1348
    typedef typename Parent::Node Node;
1349 1349
    typedef typename Parent::Edge Edge;
1350 1350

	
1351 1351
  protected:
1352 1352
    SubGraph() { }
1353 1353
  public:
1354 1354

	
1355 1355
    /// \brief Constructor
1356 1356
    ///
1357 1357
    /// Creates a subgraph for the given graph with the given node
1358 1358
    /// and edge filter maps.
1359 1359
    SubGraph(Graph& graph, NodeFilterMap& node_filter_map,
1360 1360
             EdgeFilterMap& edge_filter_map) {
1361 1361
      setGraph(graph);
1362 1362
      setNodeFilterMap(node_filter_map);
1363 1363
      setEdgeFilterMap(edge_filter_map);
1364 1364
    }
1365 1365

	
1366
    /// \brief Hides the given node
1366
    /// \brief Sets the status of the given node
1367 1367
    ///
1368
    /// This function hides the given node in the subgraph,
1369
    /// i.e. the iteration jumps over it.
1368
    /// This function sets the status of the given node.
1370 1369
    /// It is done by simply setting the assigned value of \c n
1371
    /// to be \c false in the node filter map.
1372
    void hide(const Node& n) const { Parent::hide(n); }
1373

	
1374
    /// \brief Hides the given edge
1370
    /// to \c v in the node filter map.
1371
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1372

	
1373
    /// \brief Sets the status of the given edge
1375 1374
    ///
1376
    /// This function hides the given edge in the subgraph,
1377
    /// i.e. the iteration jumps over it.
1375
    /// This function sets the status of the given edge.
1378 1376
    /// It is done by simply setting the assigned value of \c e
1379
    /// to be \c false in the edge filter map.
1380
    void hide(const Edge& e) const { Parent::hide(e); }
1381

	
1382
    /// \brief Shows the given node
1377
    /// to \c v in the edge filter map.
1378
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1379

	
1380
    /// \brief Returns the status of the given node
1383 1381
    ///
1384
    /// This function shows the given node in the subgraph.
1385
    /// It is done by simply setting the assigned value of \c n
1386
    /// to be \c true in the node filter map.
1387
    void unHide(const Node& n) const { Parent::unHide(n); }
1388

	
1389
    /// \brief Shows the given edge
1382
    /// This function returns the status of the given node.
1383
    /// It is \c true if the given node is enabled (i.e. not hidden).
1384
    bool status(const Node& n) const { return Parent::status(n); }
1385

	
1386
    /// \brief Returns the status of the given edge
1390 1387
    ///
1391
    /// This function shows the given edge in the subgraph.
1392
    /// It is done by simply setting the assigned value of \c e
1393
    /// to be \c true in the edge filter map.
1394
    void unHide(const Edge& e) const { Parent::unHide(e); }
1395

	
1396
    /// \brief Returns \c true if the given node is hidden.
1388
    /// This function returns the status of the given edge.
1389
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1390
    bool status(const Edge& e) const { return Parent::status(e); }
1391

	
1392
    /// \brief Disables the given node
1397 1393
    ///
1398
    /// This function returns \c true if the given node is hidden.
1399
    bool hidden(const Node& n) const { return Parent::hidden(n); }
1400

	
1401
    /// \brief Returns \c true if the given edge is hidden.
1394
    /// This function disables the given node in the subdigraph,
1395
    /// so the iteration jumps over it.
1396
    /// It is the same as \ref status() "status(n, false)".
1397
    void disable(const Node& n) const { Parent::status(n, false); }
1398

	
1399
    /// \brief Disables the given edge
1402 1400
    ///
1403
    /// This function returns \c true if the given edge is hidden.
1404
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
1401
    /// This function disables the given edge in the subgraph,
1402
    /// so the iteration jumps over it.
1403
    /// It is the same as \ref status() "status(e, false)".
1404
    void disable(const Edge& e) const { Parent::status(e, false); }
1405

	
1406
    /// \brief Enables the given node
1407
    ///
1408
    /// This function enables the given node in the subdigraph.
1409
    /// It is the same as \ref status() "status(n, true)".
1410
    void enable(const Node& n) const { Parent::status(n, true); }
1411

	
1412
    /// \brief Enables the given edge
1413
    ///
1414
    /// This function enables the given edge in the subgraph.
1415
    /// It is the same as \ref status() "status(e, true)".
1416
    void enable(const Edge& e) const { Parent::status(e, true); }
1417

	
1405 1418
  };
1406 1419

	
1407 1420
  /// \brief Returns a read-only SubGraph adaptor
1408 1421
  ///
1409 1422
  /// This function just returns a read-only \ref SubGraph adaptor.
1410 1423
  /// \ingroup graph_adaptors
1411 1424
  /// \relates SubGraph
1412 1425
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1413 1426
  SubGraph<const Graph, NodeFilterMap, ArcFilterMap>
1414 1427
  subGraph(const Graph& graph, NodeFilterMap& nfm, ArcFilterMap& efm) {
1415 1428
    return SubGraph<const Graph, NodeFilterMap, ArcFilterMap>(graph, nfm, efm);
1416 1429
  }
1417 1430

	
1418 1431
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1419 1432
  SubGraph<const Graph, const NodeFilterMap, ArcFilterMap>
1420 1433
  subGraph(const Graph& graph,
1421 1434
           const NodeFilterMap& nfm, ArcFilterMap& efm) {
1422 1435
    return SubGraph<const Graph, const NodeFilterMap, ArcFilterMap>
1423 1436
      (graph, nfm, efm);
1424 1437
  }
1425 1438

	
1426 1439
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1427 1440
  SubGraph<const Graph, NodeFilterMap, const ArcFilterMap>
1428 1441
  subGraph(const Graph& graph,
1429 1442
           NodeFilterMap& nfm, const ArcFilterMap& efm) {
1430 1443
    return SubGraph<const Graph, NodeFilterMap, const ArcFilterMap>
1431 1444
      (graph, nfm, efm);
1432 1445
  }
1433 1446

	
1434 1447
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1435 1448
  SubGraph<const Graph, const NodeFilterMap, const ArcFilterMap>
1436 1449
  subGraph(const Graph& graph,
1437 1450
           const NodeFilterMap& nfm, const ArcFilterMap& efm) {
1438 1451
    return SubGraph<const Graph, const NodeFilterMap, const ArcFilterMap>
1439 1452
      (graph, nfm, efm);
1440 1453
  }
1441 1454

	
1442 1455

	
1443 1456
  /// \ingroup graph_adaptors
1444 1457
  ///
1445 1458
  /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1446 1459
  ///
1447 1460
  /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1448 1461
  /// graph. A \c bool node map must be specified, which defines the filter
1449 1462
  /// for the nodes. Only the nodes with \c true filter value and the
1450 1463
  /// arcs/edges incident to nodes both with \c true filter value are shown
1451 1464
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1452 1465
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1453 1466
  /// depending on the \c _Graph template parameter.
1454 1467
  ///
1455 1468
  /// The adapted (di)graph can also be modified through this adaptor
1456 1469
  /// by adding or removing nodes or arcs/edges, unless the \c _Graph template
1457 1470
  /// parameter is set to be \c const.
1458 1471
  ///
1459 1472
  /// \tparam _Graph The type of the adapted digraph or graph.
1460 1473
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1461 1474
  /// or the \ref concepts::Graph "Graph" concept.
1462 1475
  /// It can also be specified to be \c const.
1463 1476
  /// \tparam _NodeFilterMap A \c bool (or convertible) node map of the
1464 1477
  /// adapted (di)graph. The default map type is
1465 1478
  /// \ref concepts::Graph::NodeMap "_Graph::NodeMap<bool>".
1466 1479
  /// \tparam _checked If this parameter is set to \c false then the arc/edge
1467 1480
  /// filtering is not checked with respect to the node filter. In this
1468 1481
  /// case only isolated nodes can be filtered out from the graph.
1469 1482
  /// Otherwise, each arc/edge that is incident to a hidden node is
1470 1483
  /// automatically filtered out. This is the default option.
1471 1484
  ///
1472 1485
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1473 1486
  /// adapted (di)graph are convertible to each other.
1474 1487
#ifdef DOXYGEN
1475 1488
  template<typename _Graph,
1476 1489
           typename _NodeFilterMap,
1477 1490
           bool _checked>
1478 1491
#else
1479 1492
  template<typename _Digraph,
1480 1493
           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
1481 1494
           bool _checked = true,
1482 1495
           typename Enable = void>
1483 1496
#endif
1484 1497
  class FilterNodes
1485 1498
    : public SubDigraph<_Digraph, _NodeFilterMap,
1486 1499
                        ConstMap<typename _Digraph::Arc, bool>, _checked> {
1487 1500
  public:
1488 1501

	
1489 1502
    typedef _Digraph Digraph;
1490 1503
    typedef _NodeFilterMap NodeFilterMap;
1491 1504

	
1492 1505
    typedef SubDigraph<Digraph, NodeFilterMap,
1493 1506
                       ConstMap<typename Digraph::Arc, bool>, _checked>
1494 1507
    Parent;
1495 1508

	
1496 1509
    typedef typename Parent::Node Node;
1497 1510

	
1498 1511
  protected:
1499 1512
    ConstMap<typename Digraph::Arc, bool> const_true_map;
1500 1513

	
1501 1514
    FilterNodes() : const_true_map(true) {
1502 1515
      Parent::setArcFilterMap(const_true_map);
1503 1516
    }
1504 1517

	
1505 1518
  public:
1506 1519

	
1507 1520
    /// \brief Constructor
1508 1521
    ///
1509 1522
    /// Creates a subgraph for the given digraph or graph with the
1510 1523
    /// given node filter map.
1511 1524
#ifdef DOXYGEN
1512 1525
    FilterNodes(_Graph& graph, _NodeFilterMap& node_filter) :
1513 1526
#else
1514 1527
    FilterNodes(Digraph& graph, NodeFilterMap& node_filter) :
1515 1528
#endif
1516 1529
      Parent(), const_true_map(true) {
1517 1530
      Parent::setDigraph(graph);
1518 1531
      Parent::setNodeFilterMap(node_filter);
1519 1532
      Parent::setArcFilterMap(const_true_map);
1520 1533
    }
1521 1534

	
1522
    /// \brief Hides the given node
1535
    /// \brief Sets the status of the given node
1523 1536
    ///
1524
    /// This function hides the given node in the subgraph,
1525
    /// i.e. the iteration jumps over it.
1537
    /// This function sets the status of the given node.
1526 1538
    /// It is done by simply setting the assigned value of \c n
1527
    /// to be \c false in the node filter map.
1528
    void hide(const Node& n) const { Parent::hide(n); }
1529

	
1530
    /// \brief Shows the given node
1539
    /// to \c v in the node filter map.
1540
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1541

	
1542
    /// \brief Returns the status of the given node
1531 1543
    ///
1532
    /// This function shows the given node in the subgraph.
1533
    /// It is done by simply setting the assigned value of \c n
1534
    /// to be \c true in the node filter map.
1535
    void unHide(const Node& n) const { Parent::unHide(n); }
1536

	
1537
    /// \brief Returns \c true if the given node is hidden.
1544
    /// This function returns the status of the given node.
1545
    /// It is \c true if the given node is enabled (i.e. not hidden).
1546
    bool status(const Node& n) const { return Parent::status(n); }
1547

	
1548
    /// \brief Disables the given node
1538 1549
    ///
1539
    /// This function returns \c true if the given node is hidden.
1540
    bool hidden(const Node& n) const { return Parent::hidden(n); }
1550
    /// This function disables the given node, so the iteration
1551
    /// jumps over it.
1552
    /// It is the same as \ref status() "status(n, false)".
1553
    void disable(const Node& n) const { Parent::status(n, false); }
1554

	
1555
    /// \brief Enables the given node
1556
    ///
1557
    /// This function enables the given node.
1558
    /// It is the same as \ref status() "status(n, true)".
1559
    void enable(const Node& n) const { Parent::status(n, true); }
1541 1560

	
1542 1561
  };
1543 1562

	
1544 1563
  template<typename _Graph, typename _NodeFilterMap, bool _checked>
1545 1564
  class FilterNodes<_Graph, _NodeFilterMap, _checked,
1546 1565
                    typename enable_if<UndirectedTagIndicator<_Graph> >::type>
1547 1566
    : public SubGraph<_Graph, _NodeFilterMap,
1548 1567
                      ConstMap<typename _Graph::Edge, bool>, _checked> {
1549 1568
  public:
1550 1569
    typedef _Graph Graph;
1551 1570
    typedef _NodeFilterMap NodeFilterMap;
1552 1571
    typedef SubGraph<Graph, NodeFilterMap,
1553 1572
                     ConstMap<typename Graph::Edge, bool> > Parent;
1554 1573

	
1555 1574
    typedef typename Parent::Node Node;
1556 1575
  protected:
1557 1576
    ConstMap<typename Graph::Edge, bool> const_true_map;
1558 1577

	
1559 1578
    FilterNodes() : const_true_map(true) {
1560 1579
      Parent::setEdgeFilterMap(const_true_map);
1561 1580
    }
1562 1581

	
1563 1582
  public:
1564 1583

	
1565 1584
    FilterNodes(Graph& _graph, NodeFilterMap& node_filter_map) :
1566 1585
      Parent(), const_true_map(true) {
1567 1586
      Parent::setGraph(_graph);
1568 1587
      Parent::setNodeFilterMap(node_filter_map);
1569 1588
      Parent::setEdgeFilterMap(const_true_map);
1570 1589
    }
1571 1590

	
1572
    void hide(const Node& n) const { Parent::hide(n); }
1573
    void unHide(const Node& n) const { Parent::unHide(n); }
1574
    bool hidden(const Node& n) const { return Parent::hidden(n); }
1591
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1592
    bool status(const Node& n) const { return Parent::status(n); }
1593
    void disable(const Node& n) const { Parent::status(n, false); }
1594
    void enable(const Node& n) const { Parent::status(n, true); }
1575 1595

	
1576 1596
  };
1577 1597

	
1578 1598

	
1579 1599
  /// \brief Returns a read-only FilterNodes adaptor
1580 1600
  ///
1581 1601
  /// This function just returns a read-only \ref FilterNodes adaptor.
1582 1602
  /// \ingroup graph_adaptors
1583 1603
  /// \relates FilterNodes
1584 1604
  template<typename Digraph, typename NodeFilterMap>
1585 1605
  FilterNodes<const Digraph, NodeFilterMap>
1586 1606
  filterNodes(const Digraph& digraph, NodeFilterMap& nfm) {
1587 1607
    return FilterNodes<const Digraph, NodeFilterMap>(digraph, nfm);
1588 1608
  }
1589 1609

	
1590 1610
  template<typename Digraph, typename NodeFilterMap>
1591 1611
  FilterNodes<const Digraph, const NodeFilterMap>
1592 1612
  filterNodes(const Digraph& digraph, const NodeFilterMap& nfm) {
1593 1613
    return FilterNodes<const Digraph, const NodeFilterMap>(digraph, nfm);
1594 1614
  }
1595 1615

	
1596 1616
  /// \ingroup graph_adaptors
1597 1617
  ///
1598 1618
  /// \brief Adaptor class for hiding arcs in a digraph.
1599 1619
  ///
1600 1620
  /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1601 1621
  /// A \c bool arc map must be specified, which defines the filter for
1602 1622
  /// the arcs. Only the arcs with \c true filter value are shown in the
1603 1623
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1604 1624
  /// "Digraph" concept.
1605 1625
  ///
1606 1626
  /// The adapted digraph can also be modified through this adaptor
1607 1627
  /// by adding or removing nodes or arcs, unless the \c _Digraph template
1608 1628
  /// parameter is set to be \c const.
1609 1629
  ///
1610 1630
  /// \tparam _Digraph The type of the adapted digraph.
1611 1631
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1612 1632
  /// It can also be specified to be \c const.
1613 1633
  /// \tparam _ArcFilterMap A \c bool (or convertible) arc map of the
1614 1634
  /// adapted digraph. The default map type is
1615 1635
  /// \ref concepts::Digraph::ArcMap "_Digraph::ArcMap<bool>".
1616 1636
  ///
1617 1637
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1618 1638
  /// digraph are convertible to each other.
1619 1639
#ifdef DOXYGEN
1620 1640
  template<typename _Digraph,
1621 1641
           typename _ArcFilterMap>
1622 1642
#else
1623 1643
  template<typename _Digraph,
1624 1644
           typename _ArcFilterMap = typename _Digraph::template ArcMap<bool> >
1625 1645
#endif
1626 1646
  class FilterArcs :
1627 1647
    public SubDigraph<_Digraph, ConstMap<typename _Digraph::Node, bool>,
1628 1648
                      _ArcFilterMap, false> {
1629 1649
  public:
1630 1650

	
1631 1651
    typedef _Digraph Digraph;
1632 1652
    typedef _ArcFilterMap ArcFilterMap;
1633 1653

	
1634 1654
    typedef SubDigraph<Digraph, ConstMap<typename Digraph::Node, bool>,
1635 1655
                       ArcFilterMap, false> Parent;
1636 1656

	
1637 1657
    typedef typename Parent::Arc Arc;
1638 1658

	
1639 1659
  protected:
1640 1660
    ConstMap<typename Digraph::Node, bool> const_true_map;
1641 1661

	
1642 1662
    FilterArcs() : const_true_map(true) {
1643 1663
      Parent::setNodeFilterMap(const_true_map);
1644 1664
    }
1645 1665

	
1646 1666
  public:
1647 1667

	
1648 1668
    /// \brief Constructor
1649 1669
    ///
1650 1670
    /// Creates a subdigraph for the given digraph with the given arc
1651 1671
    /// filter map.
1652 1672
    FilterArcs(Digraph& digraph, ArcFilterMap& arc_filter)
1653 1673
      : Parent(), const_true_map(true) {
1654 1674
      Parent::setDigraph(digraph);
1655 1675
      Parent::setNodeFilterMap(const_true_map);
1656 1676
      Parent::setArcFilterMap(arc_filter);
1657 1677
    }
1658 1678

	
1659
    /// \brief Hides the given arc
1679
    /// \brief Sets the status of the given arc
1660 1680
    ///
1661
    /// This function hides the given arc in the subdigraph,
1662
    /// i.e. the iteration jumps over it.
1681
    /// This function sets the status of the given arc.
1663 1682
    /// It is done by simply setting the assigned value of \c a
1664
    /// to be \c false in the arc filter map.
1665
    void hide(const Arc& a) const { Parent::hide(a); }
1666

	
1667
    /// \brief Shows the given arc
1683
    /// to \c v in the arc filter map.
1684
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
1685

	
1686
    /// \brief Returns the status of the given arc
1668 1687
    ///
1669
    /// This function shows the given arc in the subdigraph.
1670
    /// It is done by simply setting the assigned value of \c a
1671
    /// to be \c true in the arc filter map.
1672
    void unHide(const Arc& a) const { Parent::unHide(a); }
1673

	
1674
    /// \brief Returns \c true if the given arc is hidden.
1688
    /// This function returns the status of the given arc.
1689
    /// It is \c true if the given arc is enabled (i.e. not hidden).
1690
    bool status(const Arc& a) const { return Parent::status(a); }
1691

	
1692
    /// \brief Disables the given arc
1675 1693
    ///
1676
    /// This function returns \c true if the given arc is hidden.
1677
    bool hidden(const Arc& a) const { return Parent::hidden(a); }
1694
    /// This function disables the given arc in the subdigraph,
1695
    /// so the iteration jumps over it.
1696
    /// It is the same as \ref status() "status(a, false)".
1697
    void disable(const Arc& a) const { Parent::status(a, false); }
1698

	
1699
    /// \brief Enables the given arc
1700
    ///
1701
    /// This function enables the given arc in the subdigraph.
1702
    /// It is the same as \ref status() "status(a, true)".
1703
    void enable(const Arc& a) const { Parent::status(a, true); }
1678 1704

	
1679 1705
  };
1680 1706

	
1681 1707
  /// \brief Returns a read-only FilterArcs adaptor
1682 1708
  ///
1683 1709
  /// This function just returns a read-only \ref FilterArcs adaptor.
1684 1710
  /// \ingroup graph_adaptors
1685 1711
  /// \relates FilterArcs
1686 1712
  template<typename Digraph, typename ArcFilterMap>
1687 1713
  FilterArcs<const Digraph, ArcFilterMap>
1688 1714
  filterArcs(const Digraph& digraph, ArcFilterMap& afm) {
1689 1715
    return FilterArcs<const Digraph, ArcFilterMap>(digraph, afm);
1690 1716
  }
1691 1717

	
1692 1718
  template<typename Digraph, typename ArcFilterMap>
1693 1719
  FilterArcs<const Digraph, const ArcFilterMap>
1694 1720
  filterArcs(const Digraph& digraph, const ArcFilterMap& afm) {
1695 1721
    return FilterArcs<const Digraph, const ArcFilterMap>(digraph, afm);
1696 1722
  }
1697 1723

	
1698 1724
  /// \ingroup graph_adaptors
1699 1725
  ///
1700 1726
  /// \brief Adaptor class for hiding edges in a graph.
1701 1727
  ///
1702 1728
  /// FilterEdges adaptor can be used for hiding edges in a graph.
1703 1729
  /// A \c bool edge map must be specified, which defines the filter for
1704 1730
  /// the edges. Only the edges with \c true filter value are shown in the
1705 1731
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1706 1732
  /// "Graph" concept.
1707 1733
  ///
1708 1734
  /// The adapted graph can also be modified through this adaptor
1709 1735
  /// by adding or removing nodes or edges, unless the \c _Graph template
1710 1736
  /// parameter is set to be \c const.
1711 1737
  ///
1712 1738
  /// \tparam _Graph The type of the adapted graph.
1713 1739
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1714 1740
  /// It can also be specified to be \c const.
1715 1741
  /// \tparam _EdgeFilterMap A \c bool (or convertible) edge map of the
1716 1742
  /// adapted graph. The default map type is
1717 1743
  /// \ref concepts::Graph::EdgeMap "_Graph::EdgeMap<bool>".
1718 1744
  ///
1719 1745
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1720 1746
  /// adapted graph are convertible to each other.
1721 1747
#ifdef DOXYGEN
1722 1748
  template<typename _Graph,
1723 1749
           typename _EdgeFilterMap>
1724 1750
#else
1725 1751
  template<typename _Graph,
1726 1752
           typename _EdgeFilterMap = typename _Graph::template EdgeMap<bool> >
1727 1753
#endif
1728 1754
  class FilterEdges :
1729 1755
    public SubGraph<_Graph, ConstMap<typename _Graph::Node,bool>,
1730 1756
                    _EdgeFilterMap, false> {
1731 1757
  public:
1732 1758
    typedef _Graph Graph;
1733 1759
    typedef _EdgeFilterMap EdgeFilterMap;
1734 1760
    typedef SubGraph<Graph, ConstMap<typename Graph::Node,bool>,
1735 1761
                     EdgeFilterMap, false> Parent;
1736 1762
    typedef typename Parent::Edge Edge;
1737 1763
  protected:
1738 1764
    ConstMap<typename Graph::Node, bool> const_true_map;
1739 1765

	
1740 1766
    FilterEdges() : const_true_map(true) {
1741 1767
      Parent::setNodeFilterMap(const_true_map);
1742 1768
    }
1743 1769

	
1744 1770
  public:
1745 1771

	
1746 1772
    /// \brief Constructor
1747 1773
    ///
1748 1774
    /// Creates a subgraph for the given graph with the given edge
1749 1775
    /// filter map.
1750 1776
    FilterEdges(Graph& graph, EdgeFilterMap& edge_filter_map) :
1751 1777
      Parent(), const_true_map(true) {
1752 1778
      Parent::setGraph(graph);
1753 1779
      Parent::setNodeFilterMap(const_true_map);
1754 1780
      Parent::setEdgeFilterMap(edge_filter_map);
1755 1781
    }
1756 1782

	
1757
    /// \brief Hides the given edge
1783
    /// \brief Sets the status of the given edge
1758 1784
    ///
1759
    /// This function hides the given edge in the subgraph,
1760
    /// i.e. the iteration jumps over it.
1785
    /// This function sets the status of the given edge.
1761 1786
    /// It is done by simply setting the assigned value of \c e
1762
    /// to be \c false in the edge filter map.
1763
    void hide(const Edge& e) const { Parent::hide(e); }
1764

	
1765
    /// \brief Shows the given edge
1787
    /// to \c v in the edge filter map.
1788
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1789

	
1790
    /// \brief Returns the status of the given edge
1766 1791
    ///
1767
    /// This function shows the given edge in the subgraph.
1768
    /// It is done by simply setting the assigned value of \c e
1769
    /// to be \c true in the edge filter map.
1770
    void unHide(const Edge& e) const { Parent::unHide(e); }
1771

	
1772
    /// \brief Returns \c true if the given edge is hidden.
1792
    /// This function returns the status of the given edge.
1793
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1794
    bool status(const Edge& e) const { return Parent::status(e); }
1795

	
1796
    /// \brief Disables the given edge
1773 1797
    ///
1774
    /// This function returns \c true if the given edge is hidden.
1775
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
1798
    /// This function disables the given edge in the subgraph,
1799
    /// so the iteration jumps over it.
1800
    /// It is the same as \ref status() "status(e, false)".
1801
    void disable(const Edge& e) const { Parent::status(e, false); }
1802

	
1803
    /// \brief Enables the given edge
1804
    ///
1805
    /// This function enables the given edge in the subgraph.
1806
    /// It is the same as \ref status() "status(e, true)".
1807
    void enable(const Edge& e) const { Parent::status(e, true); }
1776 1808

	
1777 1809
  };
1778 1810

	
1779 1811
  /// \brief Returns a read-only FilterEdges adaptor
1780 1812
  ///
1781 1813
  /// This function just returns a read-only \ref FilterEdges adaptor.
1782 1814
  /// \ingroup graph_adaptors
1783 1815
  /// \relates FilterEdges
1784 1816
  template<typename Graph, typename EdgeFilterMap>
1785 1817
  FilterEdges<const Graph, EdgeFilterMap>
1786 1818
  filterEdges(const Graph& graph, EdgeFilterMap& efm) {
1787 1819
    return FilterEdges<const Graph, EdgeFilterMap>(graph, efm);
1788 1820
  }
1789 1821

	
1790 1822
  template<typename Graph, typename EdgeFilterMap>
1791 1823
  FilterEdges<const Graph, const EdgeFilterMap>
1792 1824
  filterEdges(const Graph& graph, const EdgeFilterMap& efm) {
1793 1825
    return FilterEdges<const Graph, const EdgeFilterMap>(graph, efm);
1794 1826
  }
1795 1827

	
1796 1828

	
1797 1829
  template <typename _Digraph>
1798 1830
  class UndirectorBase {
1799 1831
  public:
1800 1832
    typedef _Digraph Digraph;
1801 1833
    typedef UndirectorBase Adaptor;
1802 1834

	
1803 1835
    typedef True UndirectedTag;
1804 1836

	
1805 1837
    typedef typename Digraph::Arc Edge;
1806 1838
    typedef typename Digraph::Node Node;
1807 1839

	
1808 1840
    class Arc : public Edge {
1809 1841
      friend class UndirectorBase;
1810 1842
    protected:
1811 1843
      bool _forward;
1812 1844

	
1813 1845
      Arc(const Edge& edge, bool forward) :
1814 1846
        Edge(edge), _forward(forward) {}
1815 1847

	
1816 1848
    public:
1817 1849
      Arc() {}
1818 1850

	
1819 1851
      Arc(Invalid) : Edge(INVALID), _forward(true) {}
1820 1852

	
1821 1853
      bool operator==(const Arc &other) const {
1822 1854
        return _forward == other._forward &&
1823 1855
          static_cast<const Edge&>(*this) == static_cast<const Edge&>(other);
1824 1856
      }
1825 1857
      bool operator!=(const Arc &other) const {
1826 1858
        return _forward != other._forward ||
1827 1859
          static_cast<const Edge&>(*this) != static_cast<const Edge&>(other);
1828 1860
      }
1829 1861
      bool operator<(const Arc &other) const {
1830 1862
        return _forward < other._forward ||
1831 1863
          (_forward == other._forward &&
1832 1864
           static_cast<const Edge&>(*this) < static_cast<const Edge&>(other));
1833 1865
      }
1834 1866
    };
1835 1867

	
1836 1868
    void first(Node& n) const {
1837 1869
      _digraph->first(n);
1838 1870
    }
1839 1871

	
1840 1872
    void next(Node& n) const {
1841 1873
      _digraph->next(n);
1842 1874
    }
1843 1875

	
1844 1876
    void first(Arc& a) const {
1845 1877
      _digraph->first(a);
1846 1878
      a._forward = true;
1847 1879
    }
1848 1880

	
1849 1881
    void next(Arc& a) const {
1850 1882
      if (a._forward) {
1851 1883
        a._forward = false;
1852 1884
      } else {
1853 1885
        _digraph->next(a);
1854 1886
        a._forward = true;
1855 1887
      }
1856 1888
    }
1857 1889

	
1858 1890
    void first(Edge& e) const {
1859 1891
      _digraph->first(e);
1860 1892
    }
1861 1893

	
1862 1894
    void next(Edge& e) const {
1863 1895
      _digraph->next(e);
1864 1896
    }
1865 1897

	
1866 1898
    void firstOut(Arc& a, const Node& n) const {
1867 1899
      _digraph->firstIn(a, n);
1868 1900
      if( static_cast<const Edge&>(a) != INVALID ) {
1869 1901
        a._forward = false;
1870 1902
      } else {
1871 1903
        _digraph->firstOut(a, n);
1872 1904
        a._forward = true;
1873 1905
      }
1874 1906
    }
1875 1907
    void nextOut(Arc &a) const {
1876 1908
      if (!a._forward) {
1877 1909
        Node n = _digraph->target(a);
1878 1910
        _digraph->nextIn(a);
1879 1911
        if (static_cast<const Edge&>(a) == INVALID ) {
1880 1912
          _digraph->firstOut(a, n);
1881 1913
          a._forward = true;
1882 1914
        }
1883 1915
      }
1884 1916
      else {
1885 1917
        _digraph->nextOut(a);
1886 1918
      }
1887 1919
    }
1888 1920

	
1889 1921
    void firstIn(Arc &a, const Node &n) const {
1890 1922
      _digraph->firstOut(a, n);
1891 1923
      if (static_cast<const Edge&>(a) != INVALID ) {
1892 1924
        a._forward = false;
1893 1925
      } else {
1894 1926
        _digraph->firstIn(a, n);
1895 1927
        a._forward = true;
1896 1928
      }
1897 1929
    }
1898 1930
    void nextIn(Arc &a) const {
1899 1931
      if (!a._forward) {
1900 1932
        Node n = _digraph->source(a);
1901 1933
        _digraph->nextOut(a);
1902 1934
        if( static_cast<const Edge&>(a) == INVALID ) {
1903 1935
          _digraph->firstIn(a, n);
1904 1936
          a._forward = true;
1905 1937
        }
1906 1938
      }
1907 1939
      else {
1908 1940
        _digraph->nextIn(a);
1909 1941
      }
1910 1942
    }
1911 1943

	
1912 1944
    void firstInc(Edge &e, bool &d, const Node &n) const {
1913 1945
      d = true;
1914 1946
      _digraph->firstOut(e, n);
1915 1947
      if (e != INVALID) return;
1916 1948
      d = false;
1917 1949
      _digraph->firstIn(e, n);
1918 1950
    }
1919 1951

	
1920 1952
    void nextInc(Edge &e, bool &d) const {
1921 1953
      if (d) {
1922 1954
        Node s = _digraph->source(e);
1923 1955
        _digraph->nextOut(e);
1924 1956
        if (e != INVALID) return;
1925 1957
        d = false;
1926 1958
        _digraph->firstIn(e, s);
1927 1959
      } else {
1928 1960
        _digraph->nextIn(e);
1929 1961
      }
1930 1962
    }
1931 1963

	
1932 1964
    Node u(const Edge& e) const {
1933 1965
      return _digraph->source(e);
1934 1966
    }
1935 1967

	
1936 1968
    Node v(const Edge& e) const {
1937 1969
      return _digraph->target(e);
1938 1970
    }
1939 1971

	
1940 1972
    Node source(const Arc &a) const {
1941 1973
      return a._forward ? _digraph->source(a) : _digraph->target(a);
1942 1974
    }
1943 1975

	
1944 1976
    Node target(const Arc &a) const {
1945 1977
      return a._forward ? _digraph->target(a) : _digraph->source(a);
1946 1978
    }
1947 1979

	
1948 1980
    static Arc direct(const Edge &e, bool d) {
1949 1981
      return Arc(e, d);
1950 1982
    }
1951 1983
    Arc direct(const Edge &e, const Node& n) const {
1952 1984
      return Arc(e, _digraph->source(e) == n);
1953 1985
    }
1954 1986

	
1955 1987
    static bool direction(const Arc &a) { return a._forward; }
1956 1988

	
1957 1989
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
1958 1990
    Arc arcFromId(int ix) const {
1959 1991
      return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
1960 1992
    }
1961 1993
    Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
1962 1994

	
1963 1995
    int id(const Node &n) const { return _digraph->id(n); }
1964 1996
    int id(const Arc &a) const {
1965 1997
      return  (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
1966 1998
    }
1967 1999
    int id(const Edge &e) const { return _digraph->id(e); }
... ...
@@ -2578,387 +2610,387 @@
2578 2610
    template<typename _Digraph,
2579 2611
             typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2580 2612
             typename _FlowMap = _CapacityMap,
2581 2613
             typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
2582 2614
    class ResForwardFilter {
2583 2615
    public:
2584 2616

	
2585 2617
      typedef _Digraph Digraph;
2586 2618
      typedef _CapacityMap CapacityMap;
2587 2619
      typedef _FlowMap FlowMap;
2588 2620
      typedef _Tolerance Tolerance;
2589 2621

	
2590 2622
      typedef typename Digraph::Arc Key;
2591 2623
      typedef bool Value;
2592 2624

	
2593 2625
    private:
2594 2626

	
2595 2627
      const CapacityMap* _capacity;
2596 2628
      const FlowMap* _flow;
2597 2629
      Tolerance _tolerance;
2598 2630
    public:
2599 2631

	
2600 2632
      ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2601 2633
                       const Tolerance& tolerance = Tolerance())
2602 2634
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2603 2635

	
2604 2636
      bool operator[](const typename Digraph::Arc& a) const {
2605 2637
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2606 2638
      }
2607 2639
    };
2608 2640

	
2609 2641
    template<typename _Digraph,
2610 2642
             typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2611 2643
             typename _FlowMap = _CapacityMap,
2612 2644
             typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
2613 2645
    class ResBackwardFilter {
2614 2646
    public:
2615 2647

	
2616 2648
      typedef _Digraph Digraph;
2617 2649
      typedef _CapacityMap CapacityMap;
2618 2650
      typedef _FlowMap FlowMap;
2619 2651
      typedef _Tolerance Tolerance;
2620 2652

	
2621 2653
      typedef typename Digraph::Arc Key;
2622 2654
      typedef bool Value;
2623 2655

	
2624 2656
    private:
2625 2657

	
2626 2658
      const CapacityMap* _capacity;
2627 2659
      const FlowMap* _flow;
2628 2660
      Tolerance _tolerance;
2629 2661

	
2630 2662
    public:
2631 2663

	
2632 2664
      ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2633 2665
                        const Tolerance& tolerance = Tolerance())
2634 2666
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2635 2667

	
2636 2668
      bool operator[](const typename Digraph::Arc& a) const {
2637 2669
        return _tolerance.positive((*_flow)[a]);
2638 2670
      }
2639 2671
    };
2640 2672

	
2641 2673
  }
2642 2674

	
2643 2675
  /// \ingroup graph_adaptors
2644 2676
  ///
2645 2677
  /// \brief Adaptor class for composing the residual digraph for directed
2646 2678
  /// flow and circulation problems.
2647 2679
  ///
2648 2680
  /// Residual can be used for composing the \e residual digraph for directed
2649 2681
  /// flow and circulation problems. Let \f$ G=(V, A) \f$ be a directed graph
2650 2682
  /// and let \f$ F \f$ be a number type. Let \f$ flow, cap: A\to F \f$ be
2651 2683
  /// functions on the arcs.
2652 2684
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2653 2685
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2654 2686
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2655 2687
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2656 2688
  /// called residual digraph.
2657 2689
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2658 2690
  /// multiplicities are counted, i.e. the adaptor has exactly
2659 2691
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2660 2692
  /// arcs).
2661 2693
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2662 2694
  ///
2663 2695
  /// \tparam _Digraph The type of the adapted digraph.
2664 2696
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2665 2697
  /// It is implicitly \c const.
2666 2698
  /// \tparam _CapacityMap An arc map of some numerical type, which defines
2667 2699
  /// the capacities in the flow problem. It is implicitly \c const.
2668 2700
  /// The default map type is
2669 2701
  /// \ref concepts::Digraph::ArcMap "_Digraph::ArcMap<int>".
2670 2702
  /// \tparam _FlowMap An arc map of some numerical type, which defines
2671 2703
  /// the flow values in the flow problem.
2672 2704
  /// The default map type is \c _CapacityMap.
2673 2705
  /// \tparam _Tolerance Tolerance type for handling inexact computation.
2674 2706
  /// The default tolerance type depends on the value type of the
2675 2707
  /// capacity map.
2676 2708
  ///
2677 2709
  /// \note This adaptor is implemented using Undirector and FilterArcs
2678 2710
  /// adaptors.
2679 2711
  ///
2680 2712
  /// \note The \c Node type of this adaptor and the adapted digraph are
2681 2713
  /// convertible to each other, moreover the \c Arc type of the adaptor
2682 2714
  /// is convertible to the \c Arc type of the adapted digraph.
2683 2715
#ifdef DOXYGEN
2684 2716
  template<typename _Digraph,
2685 2717
           typename _CapacityMap,
2686 2718
           typename _FlowMap,
2687 2719
           typename _Tolerance>
2688 2720
  class Residual
2689 2721
#else
2690 2722
  template<typename _Digraph,
2691 2723
           typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2692 2724
           typename _FlowMap = _CapacityMap,
2693 2725
           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
2694 2726
  class Residual :
2695 2727
    public FilterArcs<
2696 2728
    Undirector<const _Digraph>,
2697 2729
    typename Undirector<const _Digraph>::template CombinedArcMap<
2698 2730
      _adaptor_bits::ResForwardFilter<const _Digraph, _CapacityMap,
2699 2731
                                      _FlowMap, _Tolerance>,
2700 2732
      _adaptor_bits::ResBackwardFilter<const _Digraph, _CapacityMap,
2701 2733
                                       _FlowMap, _Tolerance> > >
2702 2734
#endif
2703 2735
  {
2704 2736
  public:
2705 2737

	
2706 2738
    /// The type of the underlying digraph.
2707 2739
    typedef _Digraph Digraph;
2708 2740
    /// The type of the capacity map.
2709 2741
    typedef _CapacityMap CapacityMap;
2710 2742
    /// The type of the flow map.
2711 2743
    typedef _FlowMap FlowMap;
2712 2744
    typedef _Tolerance Tolerance;
2713 2745

	
2714 2746
    typedef typename CapacityMap::Value Value;
2715 2747
    typedef Residual Adaptor;
2716 2748

	
2717 2749
  protected:
2718 2750

	
2719 2751
    typedef Undirector<const Digraph> Undirected;
2720 2752

	
2721 2753
    typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
2722 2754
                                            FlowMap, Tolerance> ForwardFilter;
2723 2755

	
2724 2756
    typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
2725 2757
                                             FlowMap, Tolerance> BackwardFilter;
2726 2758

	
2727 2759
    typedef typename Undirected::
2728 2760
    template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2729 2761

	
2730 2762
    typedef FilterArcs<Undirected, ArcFilter> Parent;
2731 2763

	
2732 2764
    const CapacityMap* _capacity;
2733 2765
    FlowMap* _flow;
2734 2766

	
2735 2767
    Undirected _graph;
2736 2768
    ForwardFilter _forward_filter;
2737 2769
    BackwardFilter _backward_filter;
2738 2770
    ArcFilter _arc_filter;
2739 2771

	
2740 2772
  public:
2741 2773

	
2742 2774
    /// \brief Constructor
2743 2775
    ///
2744 2776
    /// Constructor of the residual digraph adaptor. The parameters are the
2745 2777
    /// digraph, the capacity map, the flow map, and a tolerance object.
2746 2778
    Residual(const Digraph& digraph, const CapacityMap& capacity,
2747 2779
             FlowMap& flow, const Tolerance& tolerance = Tolerance())
2748 2780
      : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
2749 2781
        _forward_filter(capacity, flow, tolerance),
2750 2782
        _backward_filter(capacity, flow, tolerance),
2751 2783
        _arc_filter(_forward_filter, _backward_filter)
2752 2784
    {
2753 2785
      Parent::setDigraph(_graph);
2754 2786
      Parent::setArcFilterMap(_arc_filter);
2755 2787
    }
2756 2788

	
2757 2789
    typedef typename Parent::Arc Arc;
2758 2790

	
2759 2791
    /// \brief Returns the residual capacity of the given arc.
2760 2792
    ///
2761 2793
    /// Returns the residual capacity of the given arc.
2762 2794
    Value residualCapacity(const Arc& a) const {
2763 2795
      if (Undirected::direction(a)) {
2764 2796
        return (*_capacity)[a] - (*_flow)[a];
2765 2797
      } else {
2766 2798
        return (*_flow)[a];
2767 2799
      }
2768 2800
    }
2769 2801

	
2770
    /// \brief Augment on the given arc in the residual digraph.
2802
    /// \brief Augments on the given arc in the residual digraph.
2771 2803
    ///
2772
    /// Augment on the given arc in the residual digraph. It increases
2804
    /// Augments on the given arc in the residual digraph. It increases
2773 2805
    /// or decreases the flow value on the original arc according to the
2774 2806
    /// direction of the residual arc.
2775 2807
    void augment(const Arc& a, const Value& v) const {
2776 2808
      if (Undirected::direction(a)) {
2777 2809
        _flow->set(a, (*_flow)[a] + v);
2778 2810
      } else {
2779 2811
        _flow->set(a, (*_flow)[a] - v);
2780 2812
      }
2781 2813
    }
2782 2814

	
2783 2815
    /// \brief Returns \c true if the given residual arc is a forward arc.
2784 2816
    ///
2785 2817
    /// Returns \c true if the given residual arc has the same orientation
2786 2818
    /// as the original arc, i.e. it is a so called forward arc.
2787 2819
    static bool forward(const Arc& a) {
2788 2820
      return Undirected::direction(a);
2789 2821
    }
2790 2822

	
2791 2823
    /// \brief Returns \c true if the given residual arc is a backward arc.
2792 2824
    ///
2793 2825
    /// Returns \c true if the given residual arc has the opposite orientation
2794 2826
    /// than the original arc, i.e. it is a so called backward arc.
2795 2827
    static bool backward(const Arc& a) {
2796 2828
      return !Undirected::direction(a);
2797 2829
    }
2798 2830

	
2799 2831
    /// \brief Returns the forward oriented residual arc.
2800 2832
    ///
2801 2833
    /// Returns the forward oriented residual arc related to the given
2802 2834
    /// arc of the underlying digraph.
2803 2835
    static Arc forward(const typename Digraph::Arc& a) {
2804 2836
      return Undirected::direct(a, true);
2805 2837
    }
2806 2838

	
2807 2839
    /// \brief Returns the backward oriented residual arc.
2808 2840
    ///
2809 2841
    /// Returns the backward oriented residual arc related to the given
2810 2842
    /// arc of the underlying digraph.
2811 2843
    static Arc backward(const typename Digraph::Arc& a) {
2812 2844
      return Undirected::direct(a, false);
2813 2845
    }
2814 2846

	
2815 2847
    /// \brief Residual capacity map.
2816 2848
    ///
2817 2849
    /// This map adaptor class can be used for obtaining the residual
2818 2850
    /// capacities as an arc map of the residual digraph.
2819 2851
    /// Its value type is inherited from the capacity map.
2820 2852
    class ResidualCapacity {
2821 2853
    protected:
2822 2854
      const Adaptor* _adaptor;
2823 2855
    public:
2824 2856
      /// The key type of the map
2825 2857
      typedef Arc Key;
2826 2858
      /// The value type of the map
2827 2859
      typedef typename _CapacityMap::Value Value;
2828 2860

	
2829 2861
      /// Constructor
2830 2862
      ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
2831 2863

	
2832 2864
      /// Returns the value associated with the given residual arc
2833 2865
      Value operator[](const Arc& a) const {
2834 2866
        return _adaptor->residualCapacity(a);
2835 2867
      }
2836 2868

	
2837 2869
    };
2838 2870

	
2839 2871
    /// \brief Returns a residual capacity map
2840 2872
    ///
2841 2873
    /// This function just returns a residual capacity map.
2842 2874
    ResidualCapacity residualCapacity() const {
2843 2875
      return ResidualCapacity(*this);
2844 2876
    }
2845 2877

	
2846 2878
  };
2847 2879

	
2848 2880
  /// \brief Returns a (read-only) Residual adaptor
2849 2881
  ///
2850 2882
  /// This function just returns a (read-only) \ref Residual adaptor.
2851 2883
  /// \ingroup graph_adaptors
2852 2884
  /// \relates Residual
2853 2885
  template<typename Digraph, typename CapacityMap, typename FlowMap>
2854 2886
  Residual<Digraph, CapacityMap, FlowMap>
2855 2887
  residual(const Digraph& digraph,
2856 2888
           const CapacityMap& capacity,
2857 2889
           FlowMap& flow)
2858 2890
  {
2859 2891
    return Residual<Digraph, CapacityMap, FlowMap> (digraph, capacity, flow);
2860 2892
  }
2861 2893

	
2862 2894

	
2863 2895
  template <typename _Digraph>
2864 2896
  class SplitNodesBase {
2865 2897
  public:
2866 2898

	
2867 2899
    typedef _Digraph Digraph;
2868 2900
    typedef DigraphAdaptorBase<const _Digraph> Parent;
2869 2901
    typedef SplitNodesBase Adaptor;
2870 2902

	
2871 2903
    typedef typename Digraph::Node DigraphNode;
2872 2904
    typedef typename Digraph::Arc DigraphArc;
2873 2905

	
2874 2906
    class Node;
2875 2907
    class Arc;
2876 2908

	
2877 2909
  private:
2878 2910

	
2879 2911
    template <typename T> class NodeMapBase;
2880 2912
    template <typename T> class ArcMapBase;
2881 2913

	
2882 2914
  public:
2883 2915

	
2884 2916
    class Node : public DigraphNode {
2885 2917
      friend class SplitNodesBase;
2886 2918
      template <typename T> friend class NodeMapBase;
2887 2919
    private:
2888 2920

	
2889 2921
      bool _in;
2890 2922
      Node(DigraphNode node, bool in)
2891 2923
        : DigraphNode(node), _in(in) {}
2892 2924

	
2893 2925
    public:
2894 2926

	
2895 2927
      Node() {}
2896 2928
      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2897 2929

	
2898 2930
      bool operator==(const Node& node) const {
2899 2931
        return DigraphNode::operator==(node) && _in == node._in;
2900 2932
      }
2901 2933

	
2902 2934
      bool operator!=(const Node& node) const {
2903 2935
        return !(*this == node);
2904 2936
      }
2905 2937

	
2906 2938
      bool operator<(const Node& node) const {
2907 2939
        return DigraphNode::operator<(node) ||
2908 2940
          (DigraphNode::operator==(node) && _in < node._in);
2909 2941
      }
2910 2942
    };
2911 2943

	
2912 2944
    class Arc {
2913 2945
      friend class SplitNodesBase;
2914 2946
      template <typename T> friend class ArcMapBase;
2915 2947
    private:
2916 2948
      typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
2917 2949

	
2918 2950
      explicit Arc(const DigraphArc& arc) : _item(arc) {}
2919 2951
      explicit Arc(const DigraphNode& node) : _item(node) {}
2920 2952

	
2921 2953
      ArcImpl _item;
2922 2954

	
2923 2955
    public:
2924 2956
      Arc() {}
2925 2957
      Arc(Invalid) : _item(DigraphArc(INVALID)) {}
2926 2958

	
2927 2959
      bool operator==(const Arc& arc) const {
2928 2960
        if (_item.firstState()) {
2929 2961
          if (arc._item.firstState()) {
2930 2962
            return _item.first() == arc._item.first();
2931 2963
          }
2932 2964
        } else {
2933 2965
          if (arc._item.secondState()) {
2934 2966
            return _item.second() == arc._item.second();
2935 2967
          }
2936 2968
        }
2937 2969
        return false;
2938 2970
      }
2939 2971

	
2940 2972
      bool operator!=(const Arc& arc) const {
2941 2973
        return !(*this == arc);
2942 2974
      }
2943 2975

	
2944 2976
      bool operator<(const Arc& arc) const {
2945 2977
        if (_item.firstState()) {
2946 2978
          if (arc._item.firstState()) {
2947 2979
            return _item.first() < arc._item.first();
2948 2980
          }
2949 2981
          return false;
2950 2982
        } else {
2951 2983
          if (arc._item.secondState()) {
2952 2984
            return _item.second() < arc._item.second();
2953 2985
          }
2954 2986
          return true;
2955 2987
        }
2956 2988
      }
2957 2989

	
2958 2990
      operator DigraphArc() const { return _item.first(); }
2959 2991
      operator DigraphNode() const { return _item.second(); }
2960 2992

	
2961 2993
    };
2962 2994

	
2963 2995
    void first(Node& n) const {
2964 2996
      _digraph->first(n);
0 comments (0 inline)