gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Improvements in graph adaptors (#67) Remove DigraphAdaptor and GraphAdaptor Remove docs of base classes Move the member documentations to real adaptors Minor improvements in documentation
0 3 0
default
3 files changed with 329 insertions and 372 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
... ...
@@ -20,13 +20,13 @@
20 20
#define LEMON_DIGRAPH_ADAPTOR_H
21 21

	
22 22
///\ingroup graph_adaptors
23 23
///\file
24 24
///\brief Several digraph adaptors.
25 25
///
26
///This file contains several useful digraph adaptor functions.
26
///This file contains several useful digraph adaptor classes.
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/variant.h>
31 31

	
32 32
#include <lemon/bits/base_extender.h>
... ...
@@ -35,23 +35,12 @@
35 35
#include <lemon/tolerance.h>
36 36

	
37 37
#include <algorithm>
38 38

	
39 39
namespace lemon {
40 40

	
41
  ///\brief Base type for the Digraph Adaptors
42
  ///
43
  ///Base type for the Digraph Adaptors
44
  ///
45
  ///This is the base type for most of LEMON digraph adaptors. This
46
  ///class implements a trivial digraph adaptor i.e. it only wraps the
47
  ///functions and types of the digraph. The purpose of this class is
48
  ///to make easier implementing digraph adaptors. E.g. if an adaptor
49
  ///is considered which differs from the wrapped digraph only in some
50
  ///of its functions or types, then it can be derived from
51
  ///DigraphAdaptor, and only the differences should be implemented.
52 41
  template<typename _Digraph>
53 42
  class DigraphAdaptorBase {
54 43
  public:
55 44
    typedef _Digraph Digraph;
56 45
    typedef DigraphAdaptorBase Adaptor;
57 46
    typedef Digraph ParentDigraph;
... ...
@@ -163,41 +152,12 @@
163 152
      }
164 153

	
165 154
    };
166 155

	
167 156
  };
168 157

	
169
  ///\ingroup graph_adaptors
170
  ///
171
  ///\brief Trivial Digraph Adaptor
172
  /// 
173
  /// This class is an adaptor which does not change the adapted
174
  /// digraph.  It can be used only to test the digraph adaptors.
175
  template <typename _Digraph>
176
  class DigraphAdaptor :
177
    public DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > { 
178
  public:
179
    typedef _Digraph Digraph;
180
    typedef DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > Parent;
181
  protected:
182
    DigraphAdaptor() : Parent() { }
183

	
184
  public:
185
    explicit DigraphAdaptor(Digraph& digraph) { setDigraph(digraph); }
186
  };
187

	
188
  /// \brief Just gives back a digraph adaptor
189
  ///
190
  /// Just gives back a digraph adaptor which 
191
  /// should be provide original digraph
192
  template<typename Digraph>
193
  DigraphAdaptor<const Digraph>
194
  digraphAdaptor(const Digraph& digraph) {
195
    return DigraphAdaptor<const Digraph>(digraph);
196
  }
197

	
198 158

	
199 159
  template <typename _Digraph>
200 160
  class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
201 161
  public:
202 162
    typedef _Digraph Digraph;
203 163
    typedef DigraphAdaptorBase<_Digraph> Parent;
... ...
@@ -228,33 +188,31 @@
228 188
  ///\ingroup graph_adaptors
229 189
  ///
230 190
  ///\brief A digraph adaptor which reverses the orientation of the arcs.
231 191
  ///
232 192
  /// If \c g is defined as
233 193
  ///\code
234
  /// ListDigraph g;
194
  /// ListDigraph dg;
235 195
  ///\endcode
236 196
  /// then
237 197
  ///\code
238
  /// RevDigraphAdaptor<ListDigraph> ga(g);
198
  /// RevDigraphAdaptor<ListDigraph> dga(dg);
239 199
  ///\endcode
240
  /// implements the digraph obtained from \c g by 
200
  /// implements the digraph obtained from \c dg by 
241 201
  /// reversing the orientation of its arcs.
242 202
  ///
243
  /// A good example of using RevDigraphAdaptor is to decide that the
244
  /// directed graph is wheter strongly connected or not. If from one
245
  /// node each node is reachable and from each node is reachable this
246
  /// node then and just then the digraph is strongly
247
  /// connected. Instead of this condition we use a little bit
248
  /// different. From one node each node ahould be reachable in the
249
  /// digraph and in the reversed digraph. Now this condition can be
250
  /// checked with the Dfs algorithm class and the RevDigraphAdaptor
251
  /// algorithm class.
203
  /// A good example of using RevDigraphAdaptor is to decide whether
204
  /// the directed graph is strongly connected or not. The digraph is
205
  /// strongly connected iff each node is reachable from one node and
206
  /// this node is reachable from the others. Instead of this
207
  /// condition we use a slightly different, from one node each node
208
  /// is reachable both in the digraph and the reversed digraph. Now
209
  /// this condition can be checked with the Dfs algorithm and the
210
  /// RevDigraphAdaptor class.
252 211
  ///
253
  /// And look at the code:
254
  ///
212
  /// The implementation:
255 213
  ///\code
256 214
  /// bool stronglyConnected(const Digraph& digraph) {
257 215
  ///   if (NodeIt(digraph) == INVALID) return true;
258 216
  ///   Dfs<Digraph> dfs(digraph);
259 217
  ///   dfs.run(NodeIt(digraph));
260 218
  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
... ...
@@ -281,12 +239,16 @@
281 239
    typedef _Digraph Digraph;
282 240
    typedef DigraphAdaptorExtender<
283 241
      RevDigraphAdaptorBase<_Digraph> > Parent;
284 242
  protected:
285 243
    RevDigraphAdaptor() { }
286 244
  public:
245

	
246
    /// \brief Constructor
247
    ///
248
    /// Creates a reverse graph adaptor for the given digraph
287 249
    explicit RevDigraphAdaptor(Digraph& digraph) { 
288 250
      Parent::setDigraph(digraph); 
289 251
    }
290 252
  };
291 253

	
292 254
  /// \brief Just gives back a reverse digraph adaptor
... ...
@@ -371,50 +333,19 @@
371 333
    void nextOut(Arc& i) const { 
372 334
      Parent::nextOut(i); 
373 335
      while (i != INVALID && (!(*_arc_filter)[i] 
374 336
	     || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); 
375 337
    }
376 338

	
377
    ///\e
378

	
379
    /// This function hides \c n in the digraph, i.e. the iteration 
380
    /// jumps over it. This is done by simply setting the value of \c n  
381
    /// to be false in the corresponding node-map.
382 339
    void hide(const Node& n) const { _node_filter->set(n, false); }
383

	
384
    ///\e
385

	
386
    /// This function hides \c a in the digraph, i.e. the iteration 
387
    /// jumps over it. This is done by simply setting the value of \c a
388
    /// to be false in the corresponding arc-map.
389 340
    void hide(const Arc& a) const { _arc_filter->set(a, false); }
390 341

	
391
    ///\e
392

	
393
    /// The value of \c n is set to be true in the node-map which stores 
394
    /// hide information. If \c n was hidden previuosly, then it is shown 
395
    /// again
396
     void unHide(const Node& n) const { _node_filter->set(n, true); }
397

	
398
    ///\e
399

	
400
    /// The value of \c a is set to be true in the arc-map which stores 
401
    /// hide information. If \c a was hidden previuosly, then it is shown 
402
    /// again
342
    void unHide(const Node& n) const { _node_filter->set(n, true); }
403 343
    void unHide(const Arc& a) const { _arc_filter->set(a, true); }
404 344

	
405
    /// Returns true if \c n is hidden.
406
    
407
    ///\e
408
    ///
409 345
    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
410

	
411
    /// Returns true if \c a is hidden.
412
    
413
    ///\e
414
    ///
415 346
    bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
416 347

	
417 348
    typedef False NodeNumTag;
418 349
    typedef False EdgeNumTag;
419 350

	
420 351
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
... ...
@@ -545,50 +476,19 @@
545 476

	
546 477
    void nextOut(Arc& i) const { 
547 478
      Parent::nextOut(i); 
548 479
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); 
549 480
    }
550 481

	
551
    ///\e
552

	
553
    /// This function hides \c n in the digraph, i.e. the iteration 
554
    /// jumps over it. This is done by simply setting the value of \c n  
555
    /// to be false in the corresponding node-map.
556 482
    void hide(const Node& n) const { _node_filter->set(n, false); }
557

	
558
    ///\e
559

	
560
    /// This function hides \c e in the digraph, i.e. the iteration 
561
    /// jumps over it. This is done by simply setting the value of \c e  
562
    /// to be false in the corresponding arc-map.
563 483
    void hide(const Arc& e) const { _arc_filter->set(e, false); }
564 484

	
565
    ///\e
566

	
567
    /// The value of \c n is set to be true in the node-map which stores 
568
    /// hide information. If \c n was hidden previuosly, then it is shown 
569
    /// again
570
     void unHide(const Node& n) const { _node_filter->set(n, true); }
571

	
572
    ///\e
573

	
574
    /// The value of \c e is set to be true in the arc-map which stores 
575
    /// hide information. If \c e was hidden previuosly, then it is shown 
576
    /// again
485
    void unHide(const Node& n) const { _node_filter->set(n, true); }
577 486
    void unHide(const Arc& e) const { _arc_filter->set(e, true); }
578 487

	
579
    /// Returns true if \c n is hidden.
580
    
581
    ///\e
582
    ///
583 488
    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
584

	
585
    /// Returns true if \c n is hidden.
586
    
587
    ///\e
588
    ///
589 489
    bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
590 490

	
591 491
    typedef False NodeNumTag;
592 492
    typedef False EdgeNumTag;
593 493

	
594 494
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
... ...
@@ -658,59 +558,45 @@
658 558

	
659 559
  /// \ingroup graph_adaptors
660 560
  ///
661 561
  /// \brief A digraph adaptor for hiding nodes and arcs from a digraph.
662 562
  /// 
663 563
  /// SubDigraphAdaptor shows the digraph with filtered node-set and 
664
  /// arc-set. If the \c checked parameter is true then it filters the arcset
665
  /// to do not get invalid arcs without source or target.
666
  /// Let \f$ G=(V, A) \f$ be a directed digraph
667
  /// and suppose that the digraph instance \c g of type ListDigraph
668
  /// implements \f$ G \f$.
669
  /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp.
670
  /// on the node-set and arc-set.
671
  /// SubDigraphAdaptor<...>::NodeIt iterates 
672
  /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and 
673
  /// SubDigraphAdaptor<...>::ArcIt iterates 
674
  /// on the arc-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly, 
675
  /// SubDigraphAdaptor<...>::OutArcIt and
676
  /// SubDigraphAdaptor<...>::InArcIt iterates 
677
  /// only on arcs leaving and entering a specific node which have true value.
564
  /// arc-set. If the \c checked parameter is true then it filters the arc-set
565
  /// respect to the source and target.
678 566
  /// 
679
  /// If the \c checked template parameter is false then we have to
680
  /// note that the node-iterator cares only the filter on the
681
  /// node-set, and the arc-iterator cares only the filter on the
682
  /// arc-set.  This way the arc-map should filter all arcs which's
683
  /// source or target is filtered by the node-filter.
567
  /// If the \c checked template parameter is false then the
568
  /// node-iterator cares only the filter on the node-set, and the
569
  /// arc-iterator cares only the filter on the arc-set.  Therefore
570
  /// the arc-map have to filter all arcs which's source or target is
571
  /// filtered by the node-filter.
684 572
  ///\code
685 573
  /// typedef ListDigraph Digraph;
686 574
  /// DIGRAPH_TYPEDEFS(Digraph);
687 575
  /// Digraph g;
688 576
  /// Node u=g.addNode(); //node of id 0
689 577
  /// Node v=g.addNode(); //node of id 1
690 578
  /// Arc a=g.addArc(u, v); //arc of id 0
691 579
  /// Arc f=g.addArc(v, u); //arc of id 1
692 580
  /// BoolNodeMap nm(g, true);
693 581
  /// nm.set(u, false);
694 582
  /// BoolArcMap am(g, true);
695 583
  /// am.set(a, false);
696
  /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubGA;
697
  /// SubGA ga(g, nm, am);
698
  /// for (SubGA::NodeIt n(ga); n!=INVALID; ++n)
584
  /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubDGA;
585
  /// SubDGA ga(g, nm, am);
586
  /// for (SubDGA::NodeIt n(ga); n!=INVALID; ++n)
699 587
  ///   std::cout << g.id(n) << std::endl;
700
  /// std::cout << ":-)" << std::endl;
701
  /// for (SubGA::ArcIt a(ga); a!=INVALID; ++a) 
588
  /// for (SubDGA::ArcIt a(ga); a!=INVALID; ++a) 
702 589
  ///   std::cout << g.id(a) << std::endl;
703 590
  ///\endcode
704 591
  /// The output of the above code is the following.
705 592
  ///\code
706 593
  /// 1
707
  /// :-)
708 594
  /// 1
709 595
  ///\endcode
710
  /// Note that \c n is of type \c SubGA::NodeIt, but it can be converted to
596
  /// Note that \c n is of type \c SubDGA::NodeIt, but it can be converted to
711 597
  /// \c Digraph::Node that is why \c g.id(n) can be applied.
712 598
  /// 
713 599
  /// For other examples see also the documentation of
714 600
  /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor.
715 601
  template<typename _Digraph, 
716 602
	   typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>, 
... ...
@@ -725,28 +611,75 @@
725 611
    typedef _ArcFilterMap ArcFilterMap;
726 612

	
727 613
    typedef DigraphAdaptorExtender<
728 614
      SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> >
729 615
    Parent;
730 616

	
617
    typedef typename Parent::Node Node;
618
    typedef typename Parent::Arc Arc;
619

	
731 620
  protected:
732 621
    SubDigraphAdaptor() { }
733 622
  public:
734 623

	
624
    /// \brief Constructor
625
    ///
626
    /// Creates a sub-digraph-adaptor for the given digraph with
627
    /// given node and arc map filters.
735 628
    SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, 
736 629
		      ArcFilterMap& arc_filter) { 
737 630
      setDigraph(digraph);
738 631
      setNodeFilterMap(node_filter);
739 632
      setArcFilterMap(arc_filter);
740 633
    }
741 634

	
635
    /// \brief Hides the node of the graph
636
    ///
637
    /// This function hides \c n in the digraph, i.e. the iteration 
638
    /// jumps over it. This is done by simply setting the value of \c n  
639
    /// to be false in the corresponding node-map.
640
    void hide(const Node& n) const { Parent::hide(n); }
641

	
642
    /// \brief Hides the arc of the graph
643
    ///
644
    /// This function hides \c a in the digraph, i.e. the iteration 
645
    /// jumps over it. This is done by simply setting the value of \c a
646
    /// to be false in the corresponding arc-map.
647
    void hide(const Arc& a) const { Parent::hide(a); }
648

	
649
    /// \brief Unhides the node of the graph
650
    ///
651
    /// The value of \c n is set to be true in the node-map which stores 
652
    /// hide information. If \c n was hidden previuosly, then it is shown 
653
    /// again
654
    void unHide(const Node& n) const { Parent::unHide(n); }
655

	
656
    /// \brief Unhides the arc of the graph
657
    ///
658
    /// The value of \c a is set to be true in the arc-map which stores 
659
    /// hide information. If \c a was hidden previuosly, then it is shown 
660
    /// again
661
    void unHide(const Arc& a) const { Parent::unHide(a); }
662

	
663
    /// \brief Returns true if \c n is hidden.
664
    ///
665
    /// Returns true if \c n is hidden.
666
    ///
667
    bool hidden(const Node& n) const { return Parent::hidden(n); }
668

	
669
    /// \brief Returns true if \c a is hidden.
670
    ///
671
    /// Returns true if \c a is hidden.
672
    ///
673
    bool hidden(const Arc& a) const { return Parent::hidden(a); }
674

	
742 675
  };
743 676

	
744
  /// \brief Just gives back a sub digraph adaptor
677
  /// \brief Just gives back a sub-digraph-adaptor
745 678
  ///
746
  /// Just gives back a sub digraph adaptor
679
  /// Just gives back a sub-digraph-adaptor
747 680
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
748 681
  SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
749 682
  subDigraphAdaptor(const Digraph& digraph, 
750 683
		    NodeFilterMap& nfm, ArcFilterMap& afm) {
751 684
    return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
752 685
      (digraph, nfm, afm);
... ...
@@ -771,12 +704,13 @@
771 704
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
772 705
  SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap>
773 706
  subDigraphAdaptor(const Digraph& digraph, 
774 707
                   NodeFilterMap& nfm, ArcFilterMap& afm) {
775 708
    return SubDigraphAdaptor<const Digraph, const NodeFilterMap, 
776 709
      const ArcFilterMap>(digraph, nfm, afm);
710

	
777 711
  }
778 712

	
779 713

	
780 714

	
781 715
  ///\ingroup graph_adaptors
782 716
  ///
... ...
@@ -799,34 +733,60 @@
799 733
    typedef _NodeFilterMap NodeFilterMap;
800 734

	
801 735
    typedef SubDigraphAdaptor<Digraph, NodeFilterMap, 
802 736
			      ConstMap<typename Digraph::Arc, bool>, checked> 
803 737
    Parent;
804 738

	
739
    typedef typename Parent::Node Node;
740

	
805 741
  protected:
806 742
    ConstMap<typename Digraph::Arc, bool> const_true_map;
807 743

	
808 744
    NodeSubDigraphAdaptor() : const_true_map(true) {
809 745
      Parent::setArcFilterMap(const_true_map);
810 746
    }
811 747

	
812 748
  public:
813 749

	
750
    /// \brief Constructor
751
    ///
752
    /// Creates a node-sub-digraph-adaptor for the given digraph with
753
    /// given node map filter.
814 754
    NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : 
815 755
      Parent(), const_true_map(true) { 
816 756
      Parent::setDigraph(_digraph);
817 757
      Parent::setNodeFilterMap(node_filter);
818 758
      Parent::setArcFilterMap(const_true_map);
819 759
    }
820 760

	
761
    /// \brief Hides the node of the graph
762
    ///
763
    /// This function hides \c n in the digraph, i.e. the iteration 
764
    /// jumps over it. This is done by simply setting the value of \c n  
765
    /// to be false in the corresponding node-map.
766
    void hide(const Node& n) const { Parent::hide(n); }
767

	
768
    /// \brief Unhides the node of the graph
769
    ///
770
    /// The value of \c n is set to be true in the node-map which stores 
771
    /// hide information. If \c n was hidden previuosly, then it is shown 
772
    /// again
773
    void unHide(const Node& n) const { Parent::unHide(n); }
774

	
775
    /// \brief Returns true if \c n is hidden.
776
    ///
777
    /// Returns true if \c n is hidden.
778
    ///
779
    bool hidden(const Node& n) const { return Parent::hidden(n); }
780

	
821 781
  };
822 782

	
823 783

	
824
  /// \brief Just gives back a \c NodeSubDigraphAdaptor
784
  /// \brief Just gives back a  node-sub-digraph adaptor
825 785
  ///
826
  /// Just gives back a \c NodeSubDigraphAdaptor
786
  /// Just gives back a node-sub-digraph adaptor
827 787
  template<typename Digraph, typename NodeFilterMap>
828 788
  NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>
829 789
  nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) {
830 790
    return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm);
831 791
  }
832 792

	
... ...
@@ -843,15 +803,16 @@
843 803
  ///
844 804
  ///An adaptor for hiding arcs from a digraph. This adaptor
845 805
  ///specializes SubDigraphAdaptor in the way that only the arc-set
846 806
  ///can be filtered. The usefulness of this adaptor is demonstrated
847 807
  ///in the problem of searching a maximum number of arc-disjoint
848 808
  ///shortest paths between two nodes \c s and \c t. Shortest here
849
  ///means being shortest w.r.t.  non-negative arc-lengths. Note that
850
  ///the comprehension of the presented solution need's some
851
  ///elementary knowlarc from combinatorial optimization.
809
  ///means being shortest with respect to non-negative
810
  ///arc-lengths. Note that the comprehension of the presented
811
  ///solution need's some elementary knowledge from combinatorial
812
  ///optimization.
852 813
  ///
853 814
  ///If a single shortest path is to be searched between \c s and \c
854 815
  ///t, then this can be done easily by applying the Dijkstra
855 816
  ///algorithm. What happens, if a maximum number of arc-disjoint
856 817
  ///shortest paths is to be computed. It can be proved that an arc
857 818
  ///can be in a shortest path if and only if it is tight with respect
... ...
@@ -865,13 +826,13 @@
865 826
  ///sub_digraph_adaptor_demo.cc.  If you are interested in more demo
866 827
  ///programs, you can use \ref dim_to_dot.cc to generate .dot files
867 828
  ///from dimacs files.  The .dot file of the following figure was
868 829
  ///generated by the demo program \ref dim_to_dot.cc.
869 830
  ///
870 831
  ///\dot
871
  ///didigraph lemon_dot_example {
832
  ///digraph lemon_dot_example {
872 833
  ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
873 834
  ///n0 [ label="0 (s)" ];
874 835
  ///n1 [ label="1" ];
875 836
  ///n2 [ label="2" ];
876 837
  ///n3 [ label="3" ];
877 838
  ///n4 [ label="4" ];
... ...
@@ -971,33 +932,60 @@
971 932
  public:
972 933
    typedef _Digraph Digraph;
973 934
    typedef _ArcFilterMap ArcFilterMap;
974 935

	
975 936
    typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, 
976 937
			      ArcFilterMap, false> Parent;
938

	
939
    typedef typename Parent::Arc Arc;
940

	
977 941
  protected:
978 942
    ConstMap<typename Digraph::Node, bool> const_true_map;
979 943

	
980 944
    ArcSubDigraphAdaptor() : const_true_map(true) {
981 945
      Parent::setNodeFilterMap(const_true_map);
982 946
    }
983 947

	
984 948
  public:
985 949

	
950
    /// \brief Constructor
951
    ///
952
    /// Creates a arc-sub-digraph-adaptor for the given digraph with
953
    /// given arc map filter.
986 954
    ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) 
987 955
      : Parent(), const_true_map(true) { 
988 956
      Parent::setDigraph(digraph);
989 957
      Parent::setNodeFilterMap(const_true_map);
990 958
      Parent::setArcFilterMap(arc_filter);
991 959
    }
992 960

	
961
    /// \brief Hides the arc of the graph
962
    ///
963
    /// This function hides \c a in the digraph, i.e. the iteration 
964
    /// jumps over it. This is done by simply setting the value of \c a
965
    /// to be false in the corresponding arc-map.
966
    void hide(const Arc& a) const { Parent::hide(a); }
967

	
968
    /// \brief Unhides the arc of the graph
969
    ///
970
    /// The value of \c a is set to be true in the arc-map which stores 
971
    /// hide information. If \c a was hidden previuosly, then it is shown 
972
    /// again
973
    void unHide(const Arc& a) const { Parent::unHide(a); }
974

	
975
    /// \brief Returns true if \c a is hidden.
976
    ///
977
    /// Returns true if \c a is hidden.
978
    ///
979
    bool hidden(const Arc& a) const { return Parent::hidden(a); }
980

	
993 981
  };
994 982

	
995
  /// \brief Just gives back an arc sub digraph adaptor
983
  /// \brief Just gives back an arc-sub-digraph adaptor
996 984
  ///
997
  /// Just gives back an arc sub digraph adaptor
985
  /// Just gives back an arc-sub-digraph adaptor
998 986
  template<typename Digraph, typename ArcFilterMap>
999 987
  ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>
1000 988
  arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) {
1001 989
    return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm);
1002 990
  }
1003 991

	
... ...
@@ -1390,18 +1378,18 @@
1390 1378
    }
1391 1379
    
1392 1380
  };
1393 1381

	
1394 1382
  ///\ingroup graph_adaptors
1395 1383
  ///
1396
  /// \brief An graph is made from a directed digraph by an adaptor
1384
  /// \brief A graph is made from a directed digraph by an adaptor
1397 1385
  ///
1398 1386
  /// This adaptor makes an undirected graph from a directed
1399
  /// digraph. All arc of the underlying will be showed in the adaptor
1400
  /// as an edge. Let's see an informal example about using
1401
  /// this adaptor:
1387
  /// graph. All arc of the underlying digraph will be showed in the
1388
  /// adaptor as an edge. Let's see an informal example about using
1389
  /// this adaptor.
1402 1390
  ///
1403 1391
  /// There is a network of the streets of a town. Of course there are
1404 1392
  /// some one-way street in the town hence the network is a directed
1405 1393
  /// one. There is a crazy driver who go oppositely in the one-way
1406 1394
  /// street without moral sense. Of course he can pass this streets
1407 1395
  /// slower than the regular way, in fact his speed is half of the
... ...
@@ -1799,18 +1787,12 @@
1799 1787
      }
1800 1788
      
1801 1789
    };
1802 1790

	
1803 1791
  };
1804 1792

	
1805
  /// \brief Base class for split digraph adaptor
1806
  ///
1807
  /// Base class of split digraph adaptor. In most case you do not need to
1808
  /// use it directly but the documented member functions of this class can 
1809
  /// be used with the SplitDigraphAdaptor class.
1810
  /// \sa SplitDigraphAdaptor
1811 1793
  template <typename _Digraph>
1812 1794
  class SplitDigraphAdaptorBase {
1813 1795
  public:
1814 1796

	
1815 1797
    typedef _Digraph Digraph;
1816 1798
    typedef DigraphAdaptorBase<const _Digraph> Parent;
... ...
@@ -2019,64 +2001,40 @@
2019 2001
    }
2020 2002
    int maxArcId() const {
2021 2003
      return std::max(_digraph->maxNodeId() << 1, 
2022 2004
                      (_digraph->maxArcId() << 1) | 1);
2023 2005
    }
2024 2006

	
2025
    /// \brief Returns true when the node is in-node.
2026
    ///
2027
    /// Returns true when the node is in-node.
2028 2007
    static bool inNode(const Node& n) {
2029 2008
      return n._in;
2030 2009
    }
2031 2010

	
2032
    /// \brief Returns true when the node is out-node.
2033
    ///
2034
    /// Returns true when the node is out-node.
2035 2011
    static bool outNode(const Node& n) {
2036 2012
      return !n._in;
2037 2013
    }
2038 2014

	
2039
    /// \brief Returns true when the arc is arc in the original digraph.
2040
    ///
2041
    /// Returns true when the arc is arc in the original digraph.
2042 2015
    static bool origArc(const Arc& e) {
2043 2016
      return e._item.firstState();
2044 2017
    }
2045 2018

	
2046
    /// \brief Returns true when the arc binds an in-node and an out-node.
2047
    ///
2048
    /// Returns true when the arc binds an in-node and an out-node.
2049 2019
    static bool bindArc(const Arc& e) {
2050 2020
      return e._item.secondState();
2051 2021
    }
2052 2022

	
2053
    /// \brief Gives back the in-node created from the \c node.
2054
    ///
2055
    /// Gives back the in-node created from the \c node.
2056 2023
    static Node inNode(const DigraphNode& n) {
2057 2024
      return Node(n, true);
2058 2025
    }
2059 2026

	
2060
    /// \brief Gives back the out-node created from the \c node.
2061
    ///
2062
    /// Gives back the out-node created from the \c node.
2063 2027
    static Node outNode(const DigraphNode& n) {
2064 2028
      return Node(n, false);
2065 2029
    }
2066 2030

	
2067
    /// \brief Gives back the arc binds the two part of the node.
2068
    /// 
2069
    /// Gives back the arc binds the two part of the node.
2070 2031
    static Arc arc(const DigraphNode& n) {
2071 2032
      return Arc(n);
2072 2033
    }
2073 2034

	
2074
    /// \brief Gives back the arc of the original arc.
2075
    /// 
2076
    /// Gives back the arc of the original arc.
2077 2035
    static Arc arc(const DigraphArc& e) {
2078 2036
      return Arc(e);
2079 2037
    }
2080 2038

	
2081 2039
    typedef True NodeNumTag;
2082 2040

	
... ...
@@ -2272,13 +2230,13 @@
2272 2230
  ///
2273 2231
  /// The aim of this class is to run algorithm with node costs if the 
2274 2232
  /// algorithm can use directly just arc costs. In this case we should use
2275 2233
  /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the
2276 2234
  /// bind arc in the adapted digraph.
2277 2235
  /// 
2278
  /// By example a maximum flow algoritm can compute how many arc
2236
  /// For example a maximum flow algorithm can compute how many arc
2279 2237
  /// disjoint paths are in the digraph. But we would like to know how
2280 2238
  /// many node disjoint paths are in the digraph. First we have to
2281 2239
  /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow
2282 2240
  /// algorithm on the adapted digraph. The bottleneck of the flow will
2283 2241
  /// be the bind arcs which bounds the flow with the count of the
2284 2242
  /// node disjoint paths.
... ...
@@ -2327,22 +2285,81 @@
2327 2285
  class SplitDigraphAdaptor 
2328 2286
    : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > {
2329 2287
  public:
2330 2288
    typedef _Digraph Digraph;
2331 2289
    typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent;
2332 2290

	
2291
    typedef typename Digraph::Node DigraphNode;
2292
    typedef typename Digraph::Arc DigraphArc;
2293

	
2333 2294
    typedef typename Parent::Node Node;
2334 2295
    typedef typename Parent::Arc Arc;
2335 2296

	
2336 2297
    /// \brief Constructor of the adaptor.
2337 2298
    ///
2338 2299
    /// Constructor of the adaptor.
2339 2300
    SplitDigraphAdaptor(Digraph& g) {
2340 2301
      Parent::setDigraph(g);
2341 2302
    }
2342 2303

	
2304
    /// \brief Returns true when the node is in-node.
2305
    ///
2306
    /// Returns true when the node is in-node.
2307
    static bool inNode(const Node& n) {
2308
      return Parent::inNode(n);
2309
    }
2310

	
2311
    /// \brief Returns true when the node is out-node.
2312
    ///
2313
    /// Returns true when the node is out-node.
2314
    static bool outNode(const Node& n) {
2315
      return Parent::outNode(n);
2316
    }
2317

	
2318
    /// \brief Returns true when the arc is arc in the original digraph.
2319
    ///
2320
    /// Returns true when the arc is arc in the original digraph.
2321
    static bool origArc(const Arc& a) {
2322
      return Parent::origArc(a);
2323
    }
2324

	
2325
    /// \brief Returns true when the arc binds an in-node and an out-node.
2326
    ///
2327
    /// Returns true when the arc binds an in-node and an out-node.
2328
    static bool bindArc(const Arc& a) {
2329
      return Parent::bindArc(a);
2330
    }
2331

	
2332
    /// \brief Gives back the in-node created from the \c node.
2333
    ///
2334
    /// Gives back the in-node created from the \c node.
2335
    static Node inNode(const DigraphNode& n) {
2336
      return Parent::inNode(n);
2337
    }
2338

	
2339
    /// \brief Gives back the out-node created from the \c node.
2340
    ///
2341
    /// Gives back the out-node created from the \c node.
2342
    static Node outNode(const DigraphNode& n) {
2343
      return Parent::outNode(n);
2344
    }
2345

	
2346
    /// \brief Gives back the arc binds the two part of the node.
2347
    /// 
2348
    /// Gives back the arc binds the two part of the node.
2349
    static Arc arc(const DigraphNode& n) {
2350
      return Parent::arc(n);
2351
    }
2352

	
2353
    /// \brief Gives back the arc of the original arc.
2354
    /// 
2355
    /// Gives back the arc of the original arc.
2356
    static Arc arc(const DigraphArc& a) {
2357
      return Parent::arc(a);
2358
    }
2359

	
2343 2360
    /// \brief NodeMap combined from two original NodeMap
2344 2361
    ///
2345 2362
    /// This class adapt two of the original digraph NodeMap to
2346 2363
    /// get a node map on the adapted digraph.
2347 2364
    template <typename InNodeMap, typename OutNodeMap>
2348 2365
    class CombinedNodeMap {
Ignore white space 6 line context
... ...
@@ -28,21 +28,12 @@
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/graph_adaptor_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34
  /// \brief Base type for the Graph Adaptors
35
  ///
36
  /// This is the base type for most of LEMON graph adaptors. 
37
  /// This class implements a trivial graph adaptor i.e. it only wraps the 
38
  /// functions and types of the graph. The purpose of this class is to 
39
  /// make easier implementing graph adaptors. E.g. if an adaptor is 
40
  /// considered which differs from the wrapped graph only in some of its 
41
  /// functions or types, then it can be derived from GraphAdaptor, and only 
42
  /// the differences should be implemented.
43 34
  template<typename _Graph>
44 35
  class GraphAdaptorBase {
45 36
  public:
46 37
    typedef _Graph Graph;
47 38
    typedef Graph ParentGraph;
48 39

	
... ...
@@ -192,31 +183,12 @@
192 183
        return *this;
193 184
      }
194 185
    };
195 186

	
196 187
  };
197 188

	
198
  /// \ingroup graph_adaptors
199
  ///
200
  /// \brief Trivial graph adaptor
201
  ///
202
  /// This class is an adaptor which does not change the adapted undirected
203
  /// graph. It can be used only to test the graph adaptors.
204
  template <typename _Graph>
205
  class GraphAdaptor 
206
    : public GraphAdaptorExtender< GraphAdaptorBase<_Graph> > { 
207
  public:
208
    typedef _Graph Graph;
209
    typedef GraphAdaptorExtender<GraphAdaptorBase<_Graph> > Parent;
210
  protected:
211
    GraphAdaptor() : Parent() {}
212

	
213
  public:
214
    explicit GraphAdaptor(Graph& graph) { setGraph(graph); }
215
  };
216

	
217 189
  template <typename _Graph, typename NodeFilterMap, 
218 190
	    typename EdgeFilterMap, bool checked = true>
219 191
  class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
220 192
  public:
221 193
    typedef _Graph Graph;
222 194
    typedef SubGraphAdaptorBase Adaptor;
... ...
@@ -315,48 +287,19 @@
315 287
      Parent::nextInc(i, d); 
316 288
      while (i!=INVALID && (!(*_edge_filter_map)[i]
317 289
            || !(*_node_filter_map)[Parent::u(i)]
318 290
            || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); 
319 291
    }
320 292

	
321
    /// \brief Hide the given node in the graph.
322
    ///
323
    /// This function hides \c n in the graph, i.e. the iteration 
324
    /// jumps over it. This is done by simply setting the value of \c n  
325
    /// to be false in the corresponding node-map.
326 293
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
327

	
328
    /// \brief Hide the given edge in the graph.
329
    ///
330
    /// This function hides \c e in the graph, i.e. the iteration 
331
    /// jumps over it. This is done by simply setting the value of \c e  
332
    /// to be false in the corresponding edge-map.
333 294
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
334 295

	
335
    /// \brief Unhide the given node in the graph.
336
    ///
337
    /// The value of \c n is set to be true in the node-map which stores 
338
    /// hide information. If \c n was hidden previuosly, then it is shown 
339
    /// again
340
     void unHide(const Node& n) const { _node_filter_map->set(n, true); }
341

	
342
    /// \brief Hide the given edge in the graph.
343
    ///
344
    /// The value of \c e is set to be true in the edge-map which stores 
345
    /// hide information. If \c e was hidden previuosly, then it is shown 
346
    /// again
296
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
347 297
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
348 298

	
349
    /// \brief Returns true if \c n is hidden.
350
    ///
351
    /// Returns true if \c n is hidden.
352 299
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
353

	
354
    /// \brief Returns true if \c e is hidden.
355
    ///
356
    /// Returns true if \c e is hidden.
357 300
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
358 301

	
359 302
    typedef False NodeNumTag;
360 303
    typedef False EdgeNumTag;
361 304

	
362 305
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
... ...
@@ -540,48 +483,19 @@
540 483
    }
541 484
    void nextInc(Edge& i, bool& d) const { 
542 485
      Parent::nextInc(i, d); 
543 486
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); 
544 487
    }
545 488

	
546
    /// \brief Hide the given node in the graph.
547
    ///
548
    /// This function hides \c n in the graph, i.e. the iteration 
549
    /// jumps over it. This is done by simply setting the value of \c n  
550
    /// to be false in the corresponding node-map.
551 489
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
552

	
553
    /// \brief Hide the given edge in the graph.
554
    ///
555
    /// This function hides \c e in the graph, i.e. the iteration 
556
    /// jumps over it. This is done by simply setting the value of \c e  
557
    /// to be false in the corresponding edge-map.
558 490
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
559 491

	
560
    /// \brief Unhide the given node in the graph.
561
    ///
562
    /// The value of \c n is set to be true in the node-map which stores 
563
    /// hide information. If \c n was hidden previuosly, then it is shown 
564
    /// again
565
     void unHide(const Node& n) const { _node_filter_map->set(n, true); }
566

	
567
    /// \brief Hide the given edge in the graph.
568
    ///
569
    /// The value of \c e is set to be true in the edge-map which stores 
570
    /// hide information. If \c e was hidden previuosly, then it is shown 
571
    /// again
492
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
572 493
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
573 494

	
574
    /// \brief Returns true if \c n is hidden.
575
    ///
576
    /// Returns true if \c n is hidden.
577 495
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
578

	
579
    /// \brief Returns true if \c e is hidden.
580
    ///
581
    /// Returns true if \c e is hidden.
582 496
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
583 497

	
584 498
    typedef False NodeNumTag;
585 499
    typedef False EdgeNumTag;
586 500

	
587 501
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
... ...
@@ -679,13 +593,13 @@
679 593
    };
680 594

	
681 595
  };
682 596

	
683 597
  /// \ingroup graph_adaptors
684 598
  ///
685
  /// \brief A graph adaptor for hiding nodes and arcs from an
599
  /// \brief A graph adaptor for hiding nodes and edges from an
686 600
  /// undirected graph.
687 601
  /// 
688 602
  /// SubGraphAdaptor shows the graph with filtered node-set and
689 603
  /// edge-set. If the \c checked parameter is true then it filters
690 604
  /// the edge-set to do not get invalid edges which incident node is
691 605
  /// filtered.
... ...
@@ -701,23 +615,75 @@
701 615
    public GraphAdaptorExtender<
702 616
    SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
703 617
  public:
704 618
    typedef _Graph Graph;
705 619
    typedef GraphAdaptorExtender<
706 620
      SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
621

	
622
    typedef typename Parent::Node Node;
623
    typedef typename Parent::Edge Edge;
624

	
707 625
  protected:
708 626
    SubGraphAdaptor() { }
709 627
  public:
628
    
629
    /// \brief Constructor
630
    ///
631
    /// Creates a sub-graph-adaptor for the given graph with
632
    /// given node and edge map filters.
710 633
    SubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map, 
711 634
		    EdgeFilterMap& edge_filter_map) { 
712 635
      setGraph(_graph);
713 636
      setNodeFilterMap(node_filter_map);
714 637
      setEdgeFilterMap(edge_filter_map);
715 638
    }
639

	
640
    /// \brief Hides the node of the graph
641
    ///
642
    /// This function hides \c n in the digraph, i.e. the iteration 
643
    /// jumps over it. This is done by simply setting the value of \c n  
644
    /// to be false in the corresponding node-map.
645
    void hide(const Node& n) const { Parent::hide(n); }
646

	
647
    /// \brief Hides the edge of the graph
648
    ///
649
    /// This function hides \c e in the digraph, i.e. the iteration 
650
    /// jumps over it. This is done by simply setting the value of \c e
651
    /// to be false in the corresponding edge-map.
652
    void hide(const Edge& e) const { Parent::hide(e); }
653

	
654
    /// \brief Unhides the node of the graph
655
    ///
656
    /// The value of \c n is set to be true in the node-map which stores 
657
    /// hide information. If \c n was hidden previuosly, then it is shown 
658
    /// again
659
    void unHide(const Node& n) const { Parent::unHide(n); }
660

	
661
    /// \brief Unhides the edge of the graph
662
    ///
663
    /// The value of \c e is set to be true in the edge-map which stores 
664
    /// hide information. If \c e was hidden previuosly, then it is shown 
665
    /// again
666
    void unHide(const Edge& e) const { Parent::unHide(e); }
667

	
668
    /// \brief Returns true if \c n is hidden.
669
    ///
670
    /// Returns true if \c n is hidden.
671
    ///
672
    bool hidden(const Node& n) const { return Parent::hidden(n); }
673

	
674
    /// \brief Returns true if \c e is hidden.
675
    ///
676
    /// Returns true if \c e is hidden.
677
    ///
678
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
716 679
  };
717 680

	
681
  /// \brief Just gives back a sub-graph adaptor
682
  ///
683
  /// Just gives back a sub-graph adaptor
718 684
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
719 685
  SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
720 686
  subGraphAdaptor(const Graph& graph, 
721 687
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
722 688
    return SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
723 689
      (graph, nfm, efm);
... ...
@@ -762,28 +728,59 @@
762 728
			   ConstMap<typename _Graph::Edge, bool>, checked> {
763 729
  public:
764 730
    typedef _Graph Graph;
765 731
    typedef _NodeFilterMap NodeFilterMap;
766 732
    typedef SubGraphAdaptor<Graph, NodeFilterMap, 
767 733
			    ConstMap<typename Graph::Edge, bool> > Parent;
734

	
735
    typedef typename Parent::Node Node;
768 736
  protected:
769 737
    ConstMap<typename Graph::Edge, bool> const_true_map;
770 738

	
771 739
    NodeSubGraphAdaptor() : const_true_map(true) {
772 740
      Parent::setEdgeFilterMap(const_true_map);
773 741
    }
774 742

	
775 743
  public:
744

	
745
    /// \brief Constructor
746
    ///
747
    /// Creates a node-sub-graph-adaptor for the given graph with
748
    /// given node map filters.
776 749
    NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map) : 
777 750
      Parent(), const_true_map(true) { 
778 751
      Parent::setGraph(_graph);
779 752
      Parent::setNodeFilterMap(node_filter_map);
780 753
      Parent::setEdgeFilterMap(const_true_map);
781 754
    }
755

	
756
    /// \brief Hides the node of the graph
757
    ///
758
    /// This function hides \c n in the digraph, i.e. the iteration 
759
    /// jumps over it. This is done by simply setting the value of \c n  
760
    /// to be false in the corresponding node-map.
761
    void hide(const Node& n) const { Parent::hide(n); }
762

	
763
    /// \brief Unhides the node of the graph
764
    ///
765
    /// The value of \c n is set to be true in the node-map which stores 
766
    /// hide information. If \c n was hidden previuosly, then it is shown 
767
    /// again
768
    void unHide(const Node& n) const { Parent::unHide(n); }
769

	
770
    /// \brief Returns true if \c n is hidden.
771
    ///
772
    /// Returns true if \c n is hidden.
773
    ///
774
    bool hidden(const Node& n) const { return Parent::hidden(n); }
775

	
782 776
  };
783 777

	
778
  /// \brief Just gives back a node-sub-graph adaptor
779
  ///
780
  /// Just gives back a node-sub-graph adaptor
784 781
  template<typename Graph, typename NodeFilterMap>
785 782
  NodeSubGraphAdaptor<const Graph, NodeFilterMap>
786 783
  nodeSubGraphAdaptor(const Graph& graph, NodeFilterMap& nfm) {
787 784
    return NodeSubGraphAdaptor<const Graph, NodeFilterMap>(graph, nfm);
788 785
  }
789 786

	
... ...
@@ -810,47 +807,70 @@
810 807
                           _EdgeFilterMap, false> {
811 808
  public:
812 809
    typedef _Graph Graph;
813 810
    typedef _EdgeFilterMap EdgeFilterMap;
814 811
    typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
815 812
			    EdgeFilterMap, false> Parent;
813
    typedef typename Parent::Edge Edge;
816 814
  protected:
817 815
    ConstMap<typename Graph::Node, bool> const_true_map;
818 816

	
819 817
    EdgeSubGraphAdaptor() : const_true_map(true) {
820 818
      Parent::setNodeFilterMap(const_true_map);
821 819
    }
822 820

	
823 821
  public:
824 822

	
823
    /// \brief Constructor
824
    ///
825
    /// Creates a edge-sub-graph-adaptor for the given graph with
826
    /// given node map filters.
825 827
    EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& edge_filter_map) : 
826 828
      Parent(), const_true_map(true) { 
827 829
      Parent::setGraph(_graph);
828 830
      Parent::setNodeFilterMap(const_true_map);
829 831
      Parent::setEdgeFilterMap(edge_filter_map);
830 832
    }
831 833

	
834
    /// \brief Hides the edge of the graph
835
    ///
836
    /// This function hides \c e in the digraph, i.e. the iteration 
837
    /// jumps over it. This is done by simply setting the value of \c e
838
    /// to be false in the corresponding edge-map.
839
    void hide(const Edge& e) const { Parent::hide(e); }
840

	
841
    /// \brief Unhides the edge of the graph
842
    ///
843
    /// The value of \c e is set to be true in the edge-map which stores 
844
    /// hide information. If \c e was hidden previuosly, then it is shown 
845
    /// again
846
    void unHide(const Edge& e) const { Parent::unHide(e); }
847

	
848
    /// \brief Returns true if \c e is hidden.
849
    ///
850
    /// Returns true if \c e is hidden.
851
    ///
852
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
853

	
832 854
  };
833 855

	
856
  /// \brief Just gives back an edge-sub-graph adaptor
857
  ///
858
  /// Just gives back an edge-sub-graph adaptor
834 859
  template<typename Graph, typename EdgeFilterMap>
835 860
  EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>
836 861
  edgeSubGraphAdaptor(const Graph& graph, EdgeFilterMap& efm) {
837 862
    return EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>(graph, efm);
838 863
  }
839 864

	
840 865
  template<typename Graph, typename EdgeFilterMap>
841 866
  EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>
842 867
  edgeSubGraphAdaptor(const Graph& graph, const EdgeFilterMap& efm) {
843 868
    return EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>(graph, efm);
844 869
  }
845 870

	
846
  /// \brief Base of direct graph adaptor
847
  ///
848
  /// Base class of the direct graph adaptor. All public member
849
  /// of this class can be used with the DirGraphAdaptor too.
850
  /// \sa DirGraphAdaptor
851 871
  template <typename _Graph, typename _DirectionMap>
852 872
  class DirGraphAdaptorBase {
853 873
  public:
854 874
    
855 875
    typedef _Graph Graph;
856 876
    typedef _DirectionMap DirectionMap;
... ...
@@ -1100,23 +1120,31 @@
1100 1120
  class DirGraphAdaptor : 
1101 1121
    public DigraphAdaptorExtender<DirGraphAdaptorBase<_Graph, DirectionMap> > {
1102 1122
  public:
1103 1123
    typedef _Graph Graph;
1104 1124
    typedef DigraphAdaptorExtender<
1105 1125
      DirGraphAdaptorBase<_Graph, DirectionMap> > Parent;
1126
    typedef typename Parent::Arc Arc;
1106 1127
  protected:
1107 1128
    DirGraphAdaptor() { }
1108 1129
  public:
1109 1130
    
1110 1131
    /// \brief Constructor of the adaptor
1111 1132
    ///
1112 1133
    /// Constructor of the adaptor
1113 1134
    DirGraphAdaptor(Graph& graph, DirectionMap& direction) { 
1114 1135
      setGraph(graph);
1115 1136
      setDirectionMap(direction);
1116 1137
    }
1138

	
1139
    /// \brief Reverse arc
1140
    /// 
1141
    /// It reverse the given arc. It simply negate the direction in the map.
1142
    void reverseArc(const Arc& a) {
1143
      Parent::reverseArc(a);
1144
    }
1117 1145
  };
1118 1146

	
1119 1147
  /// \brief Just gives back a DirGraphAdaptor
1120 1148
  ///
1121 1149
  /// Just gives back a DirGraphAdaptor
1122 1150
  template<typename Graph, typename DirectionMap>
Ignore white space 6 line context
... ...
@@ -34,48 +34,12 @@
34 34

	
35 35
#include"test/test_tools.h"
36 36
#include"test/graph_test.h"
37 37

	
38 38
using namespace lemon;
39 39

	
40
void checkDigraphAdaptor() {
41
  checkConcept<concepts::Digraph, DigraphAdaptor<concepts::Digraph> >();
42

	
43
  typedef ListDigraph Digraph;
44
  typedef DigraphAdaptor<Digraph> Adaptor;
45

	
46
  Digraph digraph;
47
  Adaptor adaptor(digraph);
48

	
49
  Digraph::Node n1 = digraph.addNode();
50
  Digraph::Node n2 = digraph.addNode();
51
  Digraph::Node n3 = digraph.addNode();
52

	
53
  Digraph::Arc a1 = digraph.addArc(n1, n2);
54
  Digraph::Arc a2 = digraph.addArc(n1, n3);
55
  Digraph::Arc a3 = digraph.addArc(n2, n3);
56
  
57
  checkGraphNodeList(adaptor, 3);
58
  checkGraphArcList(adaptor, 3);
59
  checkGraphConArcList(adaptor, 3);
60

	
61
  checkGraphOutArcList(adaptor, n1, 2);
62
  checkGraphOutArcList(adaptor, n2, 1);
63
  checkGraphOutArcList(adaptor, n3, 0);
64

	
65
  checkGraphInArcList(adaptor, n1, 0);
66
  checkGraphInArcList(adaptor, n2, 1);
67
  checkGraphInArcList(adaptor, n3, 2);
68

	
69
  checkNodeIds(adaptor);
70
  checkArcIds(adaptor);
71

	
72
  checkGraphNodeMap(adaptor);
73
  checkGraphArcMap(adaptor);
74
}
75

	
76 40
void checkRevDigraphAdaptor() {
77 41
  checkConcept<concepts::Digraph, RevDigraphAdaptor<concepts::Digraph> >();
78 42

	
79 43
  typedef ListDigraph Digraph;
80 44
  typedef RevDigraphAdaptor<Digraph> Adaptor;
81 45

	
... ...
@@ -582,62 +546,12 @@
582 546
      check(adaptor.source(a) == adaptor.inNode(on), "Wrong split");
583 547
      check(adaptor.target(a) == adaptor.outNode(on), "Wrong split");
584 548
    }
585 549
  }
586 550
}
587 551

	
588
void checkGraphAdaptor() {
589
  checkConcept<concepts::Graph, GraphAdaptor<concepts::Graph> >();
590

	
591
  typedef ListGraph Graph;
592
  typedef GraphAdaptor<Graph> Adaptor;
593

	
594
  Graph graph;
595
  Adaptor adaptor(graph);
596

	
597
  Graph::Node n1 = graph.addNode();
598
  Graph::Node n2 = graph.addNode();
599
  Graph::Node n3 = graph.addNode();
600
  Graph::Node n4 = graph.addNode();
601

	
602
  Graph::Edge a1 = graph.addEdge(n1, n2);
603
  Graph::Edge a2 = graph.addEdge(n1, n3);
604
  Graph::Edge a3 = graph.addEdge(n2, n3);
605
  Graph::Edge a4 = graph.addEdge(n3, n4);
606
  
607
  checkGraphNodeList(adaptor, 4);
608
  checkGraphArcList(adaptor, 8);
609
  checkGraphEdgeList(adaptor, 4);
610
  checkGraphConArcList(adaptor, 8);
611
  checkGraphConEdgeList(adaptor, 4);
612

	
613
  checkGraphOutArcList(adaptor, n1, 2);
614
  checkGraphOutArcList(adaptor, n2, 2);
615
  checkGraphOutArcList(adaptor, n3, 3);
616
  checkGraphOutArcList(adaptor, n4, 1);
617

	
618
  checkGraphInArcList(adaptor, n1, 2);
619
  checkGraphInArcList(adaptor, n2, 2);
620
  checkGraphInArcList(adaptor, n3, 3);
621
  checkGraphInArcList(adaptor, n4, 1);
622

	
623
  checkGraphIncEdgeList(adaptor, n1, 2);
624
  checkGraphIncEdgeList(adaptor, n2, 2);
625
  checkGraphIncEdgeList(adaptor, n3, 3);
626
  checkGraphIncEdgeList(adaptor, n4, 1);
627

	
628

	
629
  checkNodeIds(adaptor);
630
  checkArcIds(adaptor);
631
  checkEdgeIds(adaptor);
632

	
633
  checkGraphNodeMap(adaptor);
634
  checkGraphArcMap(adaptor);
635
  checkGraphEdgeMap(adaptor);
636
}
637

	
638 552
void checkSubGraphAdaptor() {
639 553
  checkConcept<concepts::Graph, 
640 554
    SubGraphAdaptor<concepts::Graph, 
641 555
    concepts::Graph::NodeMap<bool>,
642 556
    concepts::Graph::EdgeMap<bool> > >();
643 557

	
... ...
@@ -1050,22 +964,20 @@
1050 964

	
1051 965
}
1052 966

	
1053 967

	
1054 968
int main(int, const char **) {
1055 969

	
1056
  checkDigraphAdaptor();
1057 970
  checkRevDigraphAdaptor();
1058 971
  checkSubDigraphAdaptor();
1059 972
  checkNodeSubDigraphAdaptor();
1060 973
  checkArcSubDigraphAdaptor();
1061 974
  checkUndirDigraphAdaptor();
1062 975
  checkResDigraphAdaptor();
1063 976
  checkSplitDigraphAdaptor();
1064 977

	
1065
  checkGraphAdaptor();
1066 978
  checkSubGraphAdaptor();
1067 979
  checkNodeSubGraphAdaptor();
1068 980
  checkEdgeSubGraphAdaptor();
1069 981
  checkDirGraphAdaptor();
1070 982

	
1071 983
  return 0;
0 comments (0 inline)