| 
     1 /* -*- C++ -*-  | 
         | 
     2  *  | 
         | 
     3  * This file is a part of LEMON, a generic C++ optimization library  | 
         | 
     4  *  | 
         | 
     5  * Copyright (C) 2003-2007  | 
         | 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
         | 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
         | 
     8  *  | 
         | 
     9  * Permission to use, modify and distribute this software is granted  | 
         | 
    10  * provided that this copyright notice appears in all copies. For  | 
         | 
    11  * precise terms see the accompanying LICENSE file.  | 
         | 
    12  *  | 
         | 
    13  * This software is provided "AS IS" with no warranty of any kind,  | 
         | 
    14  * express or implied, and with no claim as to its suitability for any  | 
         | 
    15  * purpose.  | 
         | 
    16  *  | 
         | 
    17  */  | 
         | 
    18   | 
         | 
    19 #ifndef LEMON_BITS_GRAPH_EXTENDER_H  | 
         | 
    20 #define LEMON_BITS_GRAPH_EXTENDER_H  | 
         | 
    21   | 
         | 
    22 #include <lemon/bits/invalid.h>  | 
         | 
    23   | 
         | 
    24 #include <lemon/bits/map_extender.h>  | 
         | 
    25 #include <lemon/bits/default_map.h>  | 
         | 
    26   | 
         | 
    27 #include <lemon/concept_check.h>  | 
         | 
    28 #include <lemon/concepts/maps.h>  | 
         | 
    29   | 
         | 
    30 ///\ingroup graphbits  | 
         | 
    31 ///\file  | 
         | 
    32 ///\brief Extenders for the digraph types  | 
         | 
    33 namespace lemon { | 
         | 
    34   | 
         | 
    35   /// \ingroup graphbits  | 
         | 
    36   ///  | 
         | 
    37   /// \brief Extender for the Digraphs  | 
         | 
    38   template <typename Base>  | 
         | 
    39   class DigraphExtender : public Base { | 
         | 
    40   public:  | 
         | 
    41   | 
         | 
    42     typedef Base Parent;  | 
         | 
    43     typedef DigraphExtender Digraph;  | 
         | 
    44   | 
         | 
    45     // Base extensions  | 
         | 
    46   | 
         | 
    47     typedef typename Parent::Node Node;  | 
         | 
    48     typedef typename Parent::Arc Arc;  | 
         | 
    49   | 
         | 
    50     int maxId(Node) const { | 
         | 
    51       return Parent::maxNodeId();  | 
         | 
    52     }  | 
         | 
    53   | 
         | 
    54     int maxId(Arc) const { | 
         | 
    55       return Parent::maxArcId();  | 
         | 
    56     }  | 
         | 
    57   | 
         | 
    58     Node fromId(int id, Node) const { | 
         | 
    59       return Parent::nodeFromId(id);  | 
         | 
    60     }  | 
         | 
    61   | 
         | 
    62     Arc fromId(int id, Arc) const { | 
         | 
    63       return Parent::arcFromId(id);  | 
         | 
    64     }  | 
         | 
    65   | 
         | 
    66     Node oppositeNode(const Node &n, const Arc &e) const { | 
         | 
    67       if (n == Parent::source(e))  | 
         | 
    68 	return Parent::target(e);  | 
         | 
    69       else if(n==Parent::target(e))  | 
         | 
    70 	return Parent::source(e);  | 
         | 
    71       else  | 
         | 
    72 	return INVALID;  | 
         | 
    73     }  | 
         | 
    74   | 
         | 
    75     // Alterable extension  | 
         | 
    76   | 
         | 
    77     typedef AlterationNotifier<DigraphExtender, Node> NodeNotifier;  | 
         | 
    78     typedef AlterationNotifier<DigraphExtender, Arc> ArcNotifier;  | 
         | 
    79   | 
         | 
    80   | 
         | 
    81   protected:  | 
         | 
    82   | 
         | 
    83     mutable NodeNotifier node_notifier;  | 
         | 
    84     mutable ArcNotifier arc_notifier;  | 
         | 
    85   | 
         | 
    86   public:  | 
         | 
    87   | 
         | 
    88     NodeNotifier& notifier(Node) const { | 
         | 
    89       return node_notifier;  | 
         | 
    90     }  | 
         | 
    91       | 
         | 
    92     ArcNotifier& notifier(Arc) const { | 
         | 
    93       return arc_notifier;  | 
         | 
    94     }  | 
         | 
    95   | 
         | 
    96     class NodeIt : public Node {  | 
         | 
    97       const Digraph* digraph;  | 
         | 
    98     public:  | 
         | 
    99   | 
         | 
   100       NodeIt() {} | 
         | 
   101   | 
         | 
   102       NodeIt(Invalid i) : Node(i) { } | 
         | 
   103   | 
         | 
   104       explicit NodeIt(const Digraph& _digraph) : digraph(&_digraph) { | 
         | 
   105 	_digraph.first(static_cast<Node&>(*this));  | 
         | 
   106       }  | 
         | 
   107   | 
         | 
   108       NodeIt(const Digraph& _digraph, const Node& node)   | 
         | 
   109 	: Node(node), digraph(&_digraph) {} | 
         | 
   110   | 
         | 
   111       NodeIt& operator++() {  | 
         | 
   112 	digraph->next(*this);  | 
         | 
   113 	return *this;   | 
         | 
   114       }  | 
         | 
   115   | 
         | 
   116     };  | 
         | 
   117   | 
         | 
   118   | 
         | 
   119     class ArcIt : public Arc {  | 
         | 
   120       const Digraph* digraph;  | 
         | 
   121     public:  | 
         | 
   122   | 
         | 
   123       ArcIt() { } | 
         | 
   124   | 
         | 
   125       ArcIt(Invalid i) : Arc(i) { } | 
         | 
   126   | 
         | 
   127       explicit ArcIt(const Digraph& _digraph) : digraph(&_digraph) { | 
         | 
   128 	_digraph.first(static_cast<Arc&>(*this));  | 
         | 
   129       }  | 
         | 
   130   | 
         | 
   131       ArcIt(const Digraph& _digraph, const Arc& e) :   | 
         | 
   132 	Arc(e), digraph(&_digraph) { } | 
         | 
   133   | 
         | 
   134       ArcIt& operator++() {  | 
         | 
   135 	digraph->next(*this);  | 
         | 
   136 	return *this;   | 
         | 
   137       }  | 
         | 
   138   | 
         | 
   139     };  | 
         | 
   140   | 
         | 
   141   | 
         | 
   142     class OutArcIt : public Arc {  | 
         | 
   143       const Digraph* digraph;  | 
         | 
   144     public:  | 
         | 
   145   | 
         | 
   146       OutArcIt() { } | 
         | 
   147   | 
         | 
   148       OutArcIt(Invalid i) : Arc(i) { } | 
         | 
   149   | 
         | 
   150       OutArcIt(const Digraph& _digraph, const Node& node)   | 
         | 
   151 	: digraph(&_digraph) { | 
         | 
   152 	_digraph.firstOut(*this, node);  | 
         | 
   153       }  | 
         | 
   154   | 
         | 
   155       OutArcIt(const Digraph& _digraph, const Arc& arc)   | 
         | 
   156 	: Arc(arc), digraph(&_digraph) {} | 
         | 
   157   | 
         | 
   158       OutArcIt& operator++() {  | 
         | 
   159 	digraph->nextOut(*this);  | 
         | 
   160 	return *this;   | 
         | 
   161       }  | 
         | 
   162   | 
         | 
   163     };  | 
         | 
   164   | 
         | 
   165   | 
         | 
   166     class InArcIt : public Arc {  | 
         | 
   167       const Digraph* digraph;  | 
         | 
   168     public:  | 
         | 
   169   | 
         | 
   170       InArcIt() { } | 
         | 
   171   | 
         | 
   172       InArcIt(Invalid i) : Arc(i) { } | 
         | 
   173   | 
         | 
   174       InArcIt(const Digraph& _digraph, const Node& node)   | 
         | 
   175 	: digraph(&_digraph) { | 
         | 
   176 	_digraph.firstIn(*this, node);  | 
         | 
   177       }  | 
         | 
   178   | 
         | 
   179       InArcIt(const Digraph& _digraph, const Arc& arc) :   | 
         | 
   180 	Arc(arc), digraph(&_digraph) {} | 
         | 
   181   | 
         | 
   182       InArcIt& operator++() {  | 
         | 
   183 	digraph->nextIn(*this);  | 
         | 
   184 	return *this;   | 
         | 
   185       }  | 
         | 
   186   | 
         | 
   187     };  | 
         | 
   188   | 
         | 
   189     /// \brief Base node of the iterator  | 
         | 
   190     ///  | 
         | 
   191     /// Returns the base node (i.e. the source in this case) of the iterator  | 
         | 
   192     Node baseNode(const OutArcIt &e) const { | 
         | 
   193       return Parent::source(e);  | 
         | 
   194     }  | 
         | 
   195     /// \brief Running node of the iterator  | 
         | 
   196     ///  | 
         | 
   197     /// Returns the running node (i.e. the target in this case) of the  | 
         | 
   198     /// iterator  | 
         | 
   199     Node runningNode(const OutArcIt &e) const { | 
         | 
   200       return Parent::target(e);  | 
         | 
   201     }  | 
         | 
   202   | 
         | 
   203     /// \brief Base node of the iterator  | 
         | 
   204     ///  | 
         | 
   205     /// Returns the base node (i.e. the target in this case) of the iterator  | 
         | 
   206     Node baseNode(const InArcIt &e) const { | 
         | 
   207       return Parent::target(e);  | 
         | 
   208     }  | 
         | 
   209     /// \brief Running node of the iterator  | 
         | 
   210     ///  | 
         | 
   211     /// Returns the running node (i.e. the source in this case) of the  | 
         | 
   212     /// iterator  | 
         | 
   213     Node runningNode(const InArcIt &e) const { | 
         | 
   214       return Parent::source(e);  | 
         | 
   215     }  | 
         | 
   216   | 
         | 
   217       | 
         | 
   218     template <typename _Value>  | 
         | 
   219     class NodeMap   | 
         | 
   220       : public MapExtender<DefaultMap<Digraph, Node, _Value> > { | 
         | 
   221     public:  | 
         | 
   222       typedef DigraphExtender Digraph;  | 
         | 
   223       typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent;  | 
         | 
   224   | 
         | 
   225       explicit NodeMap(const Digraph& digraph)   | 
         | 
   226 	: Parent(digraph) {} | 
         | 
   227       NodeMap(const Digraph& digraph, const _Value& value)   | 
         | 
   228 	: Parent(digraph, value) {} | 
         | 
   229   | 
         | 
   230       NodeMap& operator=(const NodeMap& cmap) { | 
         | 
   231 	return operator=<NodeMap>(cmap);  | 
         | 
   232       }  | 
         | 
   233   | 
         | 
   234       template <typename CMap>  | 
         | 
   235       NodeMap& operator=(const CMap& cmap) { | 
         | 
   236         Parent::operator=(cmap);  | 
         | 
   237 	return *this;  | 
         | 
   238       }  | 
         | 
   239   | 
         | 
   240     };  | 
         | 
   241   | 
         | 
   242     template <typename _Value>  | 
         | 
   243     class ArcMap   | 
         | 
   244       : public MapExtender<DefaultMap<Digraph, Arc, _Value> > { | 
         | 
   245     public:  | 
         | 
   246       typedef DigraphExtender Digraph;  | 
         | 
   247       typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;  | 
         | 
   248   | 
         | 
   249       explicit ArcMap(const Digraph& digraph)   | 
         | 
   250 	: Parent(digraph) {} | 
         | 
   251       ArcMap(const Digraph& digraph, const _Value& value)   | 
         | 
   252 	: Parent(digraph, value) {} | 
         | 
   253   | 
         | 
   254       ArcMap& operator=(const ArcMap& cmap) { | 
         | 
   255 	return operator=<ArcMap>(cmap);  | 
         | 
   256       }  | 
         | 
   257   | 
         | 
   258       template <typename CMap>  | 
         | 
   259       ArcMap& operator=(const CMap& cmap) { | 
         | 
   260         Parent::operator=(cmap);  | 
         | 
   261 	return *this;  | 
         | 
   262       }  | 
         | 
   263     };  | 
         | 
   264   | 
         | 
   265   | 
         | 
   266     Node addNode() { | 
         | 
   267       Node node = Parent::addNode();  | 
         | 
   268       notifier(Node()).add(node);  | 
         | 
   269       return node;  | 
         | 
   270     }  | 
         | 
   271       | 
         | 
   272     Arc addArc(const Node& from, const Node& to) { | 
         | 
   273       Arc arc = Parent::addArc(from, to);  | 
         | 
   274       notifier(Arc()).add(arc);  | 
         | 
   275       return arc;  | 
         | 
   276     }  | 
         | 
   277   | 
         | 
   278     void clear() { | 
         | 
   279       notifier(Arc()).clear();  | 
         | 
   280       notifier(Node()).clear();  | 
         | 
   281       Parent::clear();  | 
         | 
   282     }  | 
         | 
   283   | 
         | 
   284     template <typename Digraph, typename NodeRefMap, typename ArcRefMap>  | 
         | 
   285     void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) { | 
         | 
   286       Parent::build(digraph, nodeRef, arcRef);  | 
         | 
   287       notifier(Node()).build();  | 
         | 
   288       notifier(Arc()).build();  | 
         | 
   289     }  | 
         | 
   290   | 
         | 
   291     void erase(const Node& node) { | 
         | 
   292       Arc arc;  | 
         | 
   293       Parent::firstOut(arc, node);  | 
         | 
   294       while (arc != INVALID ) { | 
         | 
   295 	erase(arc);  | 
         | 
   296 	Parent::firstOut(arc, node);  | 
         | 
   297       }   | 
         | 
   298   | 
         | 
   299       Parent::firstIn(arc, node);  | 
         | 
   300       while (arc != INVALID ) { | 
         | 
   301 	erase(arc);  | 
         | 
   302 	Parent::firstIn(arc, node);  | 
         | 
   303       }  | 
         | 
   304   | 
         | 
   305       notifier(Node()).erase(node);  | 
         | 
   306       Parent::erase(node);  | 
         | 
   307     }  | 
         | 
   308       | 
         | 
   309     void erase(const Arc& arc) { | 
         | 
   310       notifier(Arc()).erase(arc);  | 
         | 
   311       Parent::erase(arc);  | 
         | 
   312     }  | 
         | 
   313   | 
         | 
   314     DigraphExtender() { | 
         | 
   315       node_notifier.setContainer(*this);  | 
         | 
   316       arc_notifier.setContainer(*this);  | 
         | 
   317     }   | 
         | 
   318       | 
         | 
   319   | 
         | 
   320     ~DigraphExtender() { | 
         | 
   321       arc_notifier.clear();  | 
         | 
   322       node_notifier.clear();  | 
         | 
   323     }  | 
         | 
   324   };  | 
         | 
   325   | 
         | 
   326   /// \ingroup graphbits  | 
         | 
   327   ///  | 
         | 
   328   /// \brief Extender for the Graphs  | 
         | 
   329   template <typename Base>   | 
         | 
   330   class GraphExtender : public Base { | 
         | 
   331   public:  | 
         | 
   332       | 
         | 
   333     typedef Base Parent;  | 
         | 
   334     typedef GraphExtender Digraph;  | 
         | 
   335   | 
         | 
   336     typedef typename Parent::Node Node;  | 
         | 
   337     typedef typename Parent::Arc Arc;  | 
         | 
   338     typedef typename Parent::Edge Edge;  | 
         | 
   339   | 
         | 
   340     // Graph extension      | 
         | 
   341   | 
         | 
   342     int maxId(Node) const { | 
         | 
   343       return Parent::maxNodeId();  | 
         | 
   344     }  | 
         | 
   345   | 
         | 
   346     int maxId(Arc) const { | 
         | 
   347       return Parent::maxArcId();  | 
         | 
   348     }  | 
         | 
   349   | 
         | 
   350     int maxId(Edge) const { | 
         | 
   351       return Parent::maxEdgeId();  | 
         | 
   352     }  | 
         | 
   353   | 
         | 
   354     Node fromId(int id, Node) const { | 
         | 
   355       return Parent::nodeFromId(id);  | 
         | 
   356     }  | 
         | 
   357   | 
         | 
   358     Arc fromId(int id, Arc) const { | 
         | 
   359       return Parent::arcFromId(id);  | 
         | 
   360     }  | 
         | 
   361   | 
         | 
   362     Edge fromId(int id, Edge) const { | 
         | 
   363       return Parent::edgeFromId(id);  | 
         | 
   364     }  | 
         | 
   365   | 
         | 
   366     Node oppositeNode(const Node &n, const Edge &e) const { | 
         | 
   367       if( n == Parent::source(e))  | 
         | 
   368 	return Parent::target(e);  | 
         | 
   369       else if( n == Parent::target(e))  | 
         | 
   370 	return Parent::source(e);  | 
         | 
   371       else  | 
         | 
   372 	return INVALID;  | 
         | 
   373     }  | 
         | 
   374   | 
         | 
   375     Arc oppositeArc(const Arc &e) const { | 
         | 
   376       return Parent::direct(e, !Parent::direction(e));  | 
         | 
   377     }  | 
         | 
   378   | 
         | 
   379     using Parent::direct;  | 
         | 
   380     Arc direct(const Edge &ue, const Node &s) const { | 
         | 
   381       return Parent::direct(ue, Parent::source(ue) == s);  | 
         | 
   382     }  | 
         | 
   383   | 
         | 
   384     // Alterable extension  | 
         | 
   385   | 
         | 
   386     typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;  | 
         | 
   387     typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;  | 
         | 
   388     typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;  | 
         | 
   389   | 
         | 
   390   | 
         | 
   391   protected:  | 
         | 
   392   | 
         | 
   393     mutable NodeNotifier node_notifier;  | 
         | 
   394     mutable ArcNotifier arc_notifier;  | 
         | 
   395     mutable EdgeNotifier edge_notifier;  | 
         | 
   396   | 
         | 
   397   public:  | 
         | 
   398   | 
         | 
   399     NodeNotifier& notifier(Node) const { | 
         | 
   400       return node_notifier;  | 
         | 
   401     }  | 
         | 
   402       | 
         | 
   403     ArcNotifier& notifier(Arc) const { | 
         | 
   404       return arc_notifier;  | 
         | 
   405     }  | 
         | 
   406   | 
         | 
   407     EdgeNotifier& notifier(Edge) const { | 
         | 
   408       return edge_notifier;  | 
         | 
   409     }  | 
         | 
   410   | 
         | 
   411   | 
         | 
   412   | 
         | 
   413     class NodeIt : public Node {  | 
         | 
   414       const Digraph* digraph;  | 
         | 
   415     public:  | 
         | 
   416   | 
         | 
   417       NodeIt() {} | 
         | 
   418   | 
         | 
   419       NodeIt(Invalid i) : Node(i) { } | 
         | 
   420   | 
         | 
   421       explicit NodeIt(const Digraph& _digraph) : digraph(&_digraph) { | 
         | 
   422 	_digraph.first(static_cast<Node&>(*this));  | 
         | 
   423       }  | 
         | 
   424   | 
         | 
   425       NodeIt(const Digraph& _digraph, const Node& node)   | 
         | 
   426 	: Node(node), digraph(&_digraph) {} | 
         | 
   427   | 
         | 
   428       NodeIt& operator++() {  | 
         | 
   429 	digraph->next(*this);  | 
         | 
   430 	return *this;   | 
         | 
   431       }  | 
         | 
   432   | 
         | 
   433     };  | 
         | 
   434   | 
         | 
   435   | 
         | 
   436     class ArcIt : public Arc {  | 
         | 
   437       const Digraph* digraph;  | 
         | 
   438     public:  | 
         | 
   439   | 
         | 
   440       ArcIt() { } | 
         | 
   441   | 
         | 
   442       ArcIt(Invalid i) : Arc(i) { } | 
         | 
   443   | 
         | 
   444       explicit ArcIt(const Digraph& _digraph) : digraph(&_digraph) { | 
         | 
   445 	_digraph.first(static_cast<Arc&>(*this));  | 
         | 
   446       }  | 
         | 
   447   | 
         | 
   448       ArcIt(const Digraph& _digraph, const Arc& e) :   | 
         | 
   449 	Arc(e), digraph(&_digraph) { } | 
         | 
   450   | 
         | 
   451       ArcIt& operator++() {  | 
         | 
   452 	digraph->next(*this);  | 
         | 
   453 	return *this;   | 
         | 
   454       }  | 
         | 
   455   | 
         | 
   456     };  | 
         | 
   457   | 
         | 
   458   | 
         | 
   459     class OutArcIt : public Arc {  | 
         | 
   460       const Digraph* digraph;  | 
         | 
   461     public:  | 
         | 
   462   | 
         | 
   463       OutArcIt() { } | 
         | 
   464   | 
         | 
   465       OutArcIt(Invalid i) : Arc(i) { } | 
         | 
   466   | 
         | 
   467       OutArcIt(const Digraph& _digraph, const Node& node)   | 
         | 
   468 	: digraph(&_digraph) { | 
         | 
   469 	_digraph.firstOut(*this, node);  | 
         | 
   470       }  | 
         | 
   471   | 
         | 
   472       OutArcIt(const Digraph& _digraph, const Arc& arc)   | 
         | 
   473 	: Arc(arc), digraph(&_digraph) {} | 
         | 
   474   | 
         | 
   475       OutArcIt& operator++() {  | 
         | 
   476 	digraph->nextOut(*this);  | 
         | 
   477 	return *this;   | 
         | 
   478       }  | 
         | 
   479   | 
         | 
   480     };  | 
         | 
   481   | 
         | 
   482   | 
         | 
   483     class InArcIt : public Arc {  | 
         | 
   484       const Digraph* digraph;  | 
         | 
   485     public:  | 
         | 
   486   | 
         | 
   487       InArcIt() { } | 
         | 
   488   | 
         | 
   489       InArcIt(Invalid i) : Arc(i) { } | 
         | 
   490   | 
         | 
   491       InArcIt(const Digraph& _digraph, const Node& node)   | 
         | 
   492 	: digraph(&_digraph) { | 
         | 
   493 	_digraph.firstIn(*this, node);  | 
         | 
   494       }  | 
         | 
   495   | 
         | 
   496       InArcIt(const Digraph& _digraph, const Arc& arc) :   | 
         | 
   497 	Arc(arc), digraph(&_digraph) {} | 
         | 
   498   | 
         | 
   499       InArcIt& operator++() {  | 
         | 
   500 	digraph->nextIn(*this);  | 
         | 
   501 	return *this;   | 
         | 
   502       }  | 
         | 
   503   | 
         | 
   504     };  | 
         | 
   505   | 
         | 
   506   | 
         | 
   507     class EdgeIt : public Parent::Edge {  | 
         | 
   508       const Digraph* digraph;  | 
         | 
   509     public:  | 
         | 
   510   | 
         | 
   511       EdgeIt() { } | 
         | 
   512   | 
         | 
   513       EdgeIt(Invalid i) : Edge(i) { } | 
         | 
   514   | 
         | 
   515       explicit EdgeIt(const Digraph& _digraph) : digraph(&_digraph) { | 
         | 
   516 	_digraph.first(static_cast<Edge&>(*this));  | 
         | 
   517       }  | 
         | 
   518   | 
         | 
   519       EdgeIt(const Digraph& _digraph, const Edge& e) :   | 
         | 
   520 	Edge(e), digraph(&_digraph) { } | 
         | 
   521   | 
         | 
   522       EdgeIt& operator++() {  | 
         | 
   523 	digraph->next(*this);  | 
         | 
   524 	return *this;   | 
         | 
   525       }  | 
         | 
   526   | 
         | 
   527     };  | 
         | 
   528   | 
         | 
   529     class IncArcIt : public Parent::Edge { | 
         | 
   530       friend class GraphExtender;  | 
         | 
   531       const Digraph* digraph;  | 
         | 
   532       bool direction;  | 
         | 
   533     public:  | 
         | 
   534   | 
         | 
   535       IncArcIt() { } | 
         | 
   536   | 
         | 
   537       IncArcIt(Invalid i) : Edge(i), direction(false) { } | 
         | 
   538   | 
         | 
   539       IncArcIt(const Digraph& _digraph, const Node &n) : digraph(&_digraph) { | 
         | 
   540 	_digraph.firstInc(*this, direction, n);  | 
         | 
   541       }  | 
         | 
   542   | 
         | 
   543       IncArcIt(const Digraph& _digraph, const Edge &ue, const Node &n)  | 
         | 
   544 	: digraph(&_digraph), Edge(ue) { | 
         | 
   545 	direction = (_digraph.source(ue) == n);  | 
         | 
   546       }  | 
         | 
   547   | 
         | 
   548       IncArcIt& operator++() { | 
         | 
   549 	digraph->nextInc(*this, direction);  | 
         | 
   550 	return *this;   | 
         | 
   551       }  | 
         | 
   552     };  | 
         | 
   553   | 
         | 
   554     /// \brief Base node of the iterator  | 
         | 
   555     ///  | 
         | 
   556     /// Returns the base node (ie. the source in this case) of the iterator  | 
         | 
   557     Node baseNode(const OutArcIt &e) const { | 
         | 
   558       return Parent::source(static_cast<const Arc&>(e));  | 
         | 
   559     }  | 
         | 
   560     /// \brief Running node of the iterator  | 
         | 
   561     ///  | 
         | 
   562     /// Returns the running node (ie. the target in this case) of the  | 
         | 
   563     /// iterator  | 
         | 
   564     Node runningNode(const OutArcIt &e) const { | 
         | 
   565       return Parent::target(static_cast<const Arc&>(e));  | 
         | 
   566     }  | 
         | 
   567   | 
         | 
   568     /// \brief Base node of the iterator  | 
         | 
   569     ///  | 
         | 
   570     /// Returns the base node (ie. the target in this case) of the iterator  | 
         | 
   571     Node baseNode(const InArcIt &e) const { | 
         | 
   572       return Parent::target(static_cast<const Arc&>(e));  | 
         | 
   573     }  | 
         | 
   574     /// \brief Running node of the iterator  | 
         | 
   575     ///  | 
         | 
   576     /// Returns the running node (ie. the source in this case) of the  | 
         | 
   577     /// iterator  | 
         | 
   578     Node runningNode(const InArcIt &e) const { | 
         | 
   579       return Parent::source(static_cast<const Arc&>(e));  | 
         | 
   580     }  | 
         | 
   581   | 
         | 
   582     /// Base node of the iterator  | 
         | 
   583     ///  | 
         | 
   584     /// Returns the base node of the iterator  | 
         | 
   585     Node baseNode(const IncArcIt &e) const { | 
         | 
   586       return e.direction ? source(e) : target(e);  | 
         | 
   587     }  | 
         | 
   588     /// Running node of the iterator  | 
         | 
   589     ///  | 
         | 
   590     /// Returns the running node of the iterator  | 
         | 
   591     Node runningNode(const IncArcIt &e) const { | 
         | 
   592       return e.direction ? target(e) : source(e);  | 
         | 
   593     }  | 
         | 
   594   | 
         | 
   595     // Mappable extension  | 
         | 
   596   | 
         | 
   597     template <typename _Value>  | 
         | 
   598     class NodeMap   | 
         | 
   599       : public MapExtender<DefaultMap<Digraph, Node, _Value> > { | 
         | 
   600     public:  | 
         | 
   601       typedef GraphExtender Digraph;  | 
         | 
   602       typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent;  | 
         | 
   603   | 
         | 
   604       NodeMap(const Digraph& digraph)   | 
         | 
   605 	: Parent(digraph) {} | 
         | 
   606       NodeMap(const Digraph& digraph, const _Value& value)   | 
         | 
   607 	: Parent(digraph, value) {} | 
         | 
   608   | 
         | 
   609       NodeMap& operator=(const NodeMap& cmap) { | 
         | 
   610 	return operator=<NodeMap>(cmap);  | 
         | 
   611       }  | 
         | 
   612   | 
         | 
   613       template <typename CMap>  | 
         | 
   614       NodeMap& operator=(const CMap& cmap) { | 
         | 
   615         Parent::operator=(cmap);  | 
         | 
   616 	return *this;  | 
         | 
   617       }  | 
         | 
   618   | 
         | 
   619     };  | 
         | 
   620   | 
         | 
   621     template <typename _Value>  | 
         | 
   622     class ArcMap   | 
         | 
   623       : public MapExtender<DefaultMap<Digraph, Arc, _Value> > { | 
         | 
   624     public:  | 
         | 
   625       typedef GraphExtender Digraph;  | 
         | 
   626       typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;  | 
         | 
   627   | 
         | 
   628       ArcMap(const Digraph& digraph)   | 
         | 
   629 	: Parent(digraph) {} | 
         | 
   630       ArcMap(const Digraph& digraph, const _Value& value)   | 
         | 
   631 	: Parent(digraph, value) {} | 
         | 
   632   | 
         | 
   633       ArcMap& operator=(const ArcMap& cmap) { | 
         | 
   634 	return operator=<ArcMap>(cmap);  | 
         | 
   635       }  | 
         | 
   636   | 
         | 
   637       template <typename CMap>  | 
         | 
   638       ArcMap& operator=(const CMap& cmap) { | 
         | 
   639         Parent::operator=(cmap);  | 
         | 
   640 	return *this;  | 
         | 
   641       }  | 
         | 
   642     };  | 
         | 
   643   | 
         | 
   644   | 
         | 
   645     template <typename _Value>  | 
         | 
   646     class EdgeMap   | 
         | 
   647       : public MapExtender<DefaultMap<Digraph, Edge, _Value> > { | 
         | 
   648     public:  | 
         | 
   649       typedef GraphExtender Digraph;  | 
         | 
   650       typedef MapExtender<DefaultMap<Digraph, Edge, _Value> > Parent;  | 
         | 
   651   | 
         | 
   652       EdgeMap(const Digraph& digraph)   | 
         | 
   653 	: Parent(digraph) {} | 
         | 
   654   | 
         | 
   655       EdgeMap(const Digraph& digraph, const _Value& value)   | 
         | 
   656 	: Parent(digraph, value) {} | 
         | 
   657   | 
         | 
   658       EdgeMap& operator=(const EdgeMap& cmap) { | 
         | 
   659 	return operator=<EdgeMap>(cmap);  | 
         | 
   660       }  | 
         | 
   661   | 
         | 
   662       template <typename CMap>  | 
         | 
   663       EdgeMap& operator=(const CMap& cmap) { | 
         | 
   664         Parent::operator=(cmap);  | 
         | 
   665 	return *this;  | 
         | 
   666       }  | 
         | 
   667   | 
         | 
   668     };  | 
         | 
   669   | 
         | 
   670     // Alteration extension  | 
         | 
   671   | 
         | 
   672     Node addNode() { | 
         | 
   673       Node node = Parent::addNode();  | 
         | 
   674       notifier(Node()).add(node);  | 
         | 
   675       return node;  | 
         | 
   676     }  | 
         | 
   677   | 
         | 
   678     Edge addEdge(const Node& from, const Node& to) { | 
         | 
   679       Edge edge = Parent::addEdge(from, to);  | 
         | 
   680       notifier(Edge()).add(edge);  | 
         | 
   681       std::vector<Arc> ev;  | 
         | 
   682       ev.push_back(Parent::direct(edge, true));  | 
         | 
   683       ev.push_back(Parent::direct(edge, false));        | 
         | 
   684       notifier(Arc()).add(ev);  | 
         | 
   685       return edge;  | 
         | 
   686     }  | 
         | 
   687       | 
         | 
   688     void clear() { | 
         | 
   689       notifier(Arc()).clear();  | 
         | 
   690       notifier(Edge()).clear();  | 
         | 
   691       notifier(Node()).clear();  | 
         | 
   692       Parent::clear();  | 
         | 
   693     }  | 
         | 
   694   | 
         | 
   695     template <typename Digraph, typename NodeRefMap, typename EdgeRefMap>  | 
         | 
   696     void build(const Digraph& digraph, NodeRefMap& nodeRef,   | 
         | 
   697                EdgeRefMap& edgeRef) { | 
         | 
   698       Parent::build(digraph, nodeRef, edgeRef);  | 
         | 
   699       notifier(Node()).build();  | 
         | 
   700       notifier(Edge()).build();  | 
         | 
   701       notifier(Arc()).build();  | 
         | 
   702     }  | 
         | 
   703   | 
         | 
   704     void erase(const Node& node) { | 
         | 
   705       Arc arc;  | 
         | 
   706       Parent::firstOut(arc, node);  | 
         | 
   707       while (arc != INVALID ) { | 
         | 
   708 	erase(arc);  | 
         | 
   709 	Parent::firstOut(arc, node);  | 
         | 
   710       }   | 
         | 
   711   | 
         | 
   712       Parent::firstIn(arc, node);  | 
         | 
   713       while (arc != INVALID ) { | 
         | 
   714 	erase(arc);  | 
         | 
   715 	Parent::firstIn(arc, node);  | 
         | 
   716       }  | 
         | 
   717   | 
         | 
   718       notifier(Node()).erase(node);  | 
         | 
   719       Parent::erase(node);  | 
         | 
   720     }  | 
         | 
   721   | 
         | 
   722     void erase(const Edge& edge) { | 
         | 
   723       std::vector<Arc> ev;  | 
         | 
   724       ev.push_back(Parent::direct(edge, true));  | 
         | 
   725       ev.push_back(Parent::direct(edge, false));        | 
         | 
   726       notifier(Arc()).erase(ev);  | 
         | 
   727       notifier(Edge()).erase(edge);  | 
         | 
   728       Parent::erase(edge);  | 
         | 
   729     }  | 
         | 
   730   | 
         | 
   731     GraphExtender() { | 
         | 
   732       node_notifier.setContainer(*this);   | 
         | 
   733       arc_notifier.setContainer(*this);  | 
         | 
   734       edge_notifier.setContainer(*this);  | 
         | 
   735     }   | 
         | 
   736   | 
         | 
   737     ~GraphExtender() { | 
         | 
   738       edge_notifier.clear();  | 
         | 
   739       arc_notifier.clear();  | 
         | 
   740       node_notifier.clear();   | 
         | 
   741     }   | 
         | 
   742   | 
         | 
   743   };  | 
         | 
   744   | 
         | 
   745 }  | 
         | 
   746   | 
         | 
   747 #endif  |