3  * This file is a part of LEMON, a generic C++ optimization library
 
     5  * Copyright (C) 2003-2006
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     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.
 
    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
 
    19 #ifndef LEMON_BITS_GRAPH_EXTENDER_H
 
    20 #define LEMON_BITS_GRAPH_EXTENDER_H
 
    22 #include <lemon/bits/invalid.h>
 
    23 #include <lemon/error.h>
 
    25 #include <lemon/bits/map_extender.h>
 
    26 #include <lemon/bits/default_map.h>
 
    28 #include <lemon/concept_check.h>
 
    29 #include <lemon/concept/maps.h>
 
    33 ///\brief Extenders for the graph types
 
    36   /// \ingroup graphbits
 
    38   /// \brief Extender for the Graphs
 
    39   template <typename Base>
 
    40   class GraphExtender : public Base {
 
    44     typedef GraphExtender Graph;
 
    48     typedef typename Parent::Node Node;
 
    49     typedef typename Parent::Edge Edge;
 
    51     int maxId(Node) const {
 
    52       return Parent::maxNodeId();
 
    55     int maxId(Edge) const {
 
    56       return Parent::maxEdgeId();
 
    59     Node fromId(int id, Node) const {
 
    60       return Parent::nodeFromId(id);
 
    63     Edge fromId(int id, Edge) const {
 
    64       return Parent::edgeFromId(id);
 
    67     Node oppositeNode(const Node &n, const Edge &e) const {
 
    68       if (n == Parent::source(e))
 
    69 	return Parent::target(e);
 
    70       else if(n==Parent::target(e))
 
    71 	return Parent::source(e);
 
    76     // Alterable extension
 
    78     typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
 
    79     typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
 
    84     mutable NodeNotifier node_notifier;
 
    85     mutable EdgeNotifier edge_notifier;
 
    89     NodeNotifier& getNotifier(Node) const {
 
    93     EdgeNotifier& getNotifier(Edge) const {
 
    97     class NodeIt : public Node { 
 
   103       NodeIt(Invalid i) : Node(i) { }
 
   105       explicit NodeIt(const Graph& _graph) : graph(&_graph) {
 
   106 	_graph.first(static_cast<Node&>(*this));
 
   109       NodeIt(const Graph& _graph, const Node& node) 
 
   110 	: Node(node), graph(&_graph) {}
 
   112       NodeIt& operator++() { 
 
   120     class EdgeIt : public Edge { 
 
   126       EdgeIt(Invalid i) : Edge(i) { }
 
   128       explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
 
   129 	_graph.first(static_cast<Edge&>(*this));
 
   132       EdgeIt(const Graph& _graph, const Edge& e) : 
 
   133 	Edge(e), graph(&_graph) { }
 
   135       EdgeIt& operator++() { 
 
   143     class OutEdgeIt : public Edge { 
 
   149       OutEdgeIt(Invalid i) : Edge(i) { }
 
   151       OutEdgeIt(const Graph& _graph, const Node& node) 
 
   153 	_graph.firstOut(*this, node);
 
   156       OutEdgeIt(const Graph& _graph, const Edge& edge) 
 
   157 	: Edge(edge), graph(&_graph) {}
 
   159       OutEdgeIt& operator++() { 
 
   160 	graph->nextOut(*this);
 
   167     class InEdgeIt : public Edge { 
 
   173       InEdgeIt(Invalid i) : Edge(i) { }
 
   175       InEdgeIt(const Graph& _graph, const Node& node) 
 
   177 	_graph.firstIn(*this, node);
 
   180       InEdgeIt(const Graph& _graph, const Edge& edge) : 
 
   181 	Edge(edge), graph(&_graph) {}
 
   183       InEdgeIt& operator++() { 
 
   184 	graph->nextIn(*this);
 
   190     /// \brief Base node of the iterator
 
   192     /// Returns the base node (ie. the source in this case) of the iterator
 
   193     Node baseNode(const OutEdgeIt &e) const {
 
   194       return Parent::source(e);
 
   196     /// \brief Running node of the iterator
 
   198     /// Returns the running node (ie. the target in this case) of the
 
   200     Node runningNode(const OutEdgeIt &e) const {
 
   201       return Parent::target(e);
 
   204     /// \brief Base node of the iterator
 
   206     /// Returns the base node (ie. the target in this case) of the iterator
 
   207     Node baseNode(const InEdgeIt &e) const {
 
   208       return Parent::target(e);
 
   210     /// \brief Running node of the iterator
 
   212     /// Returns the running node (ie. the source in this case) of the
 
   214     Node runningNode(const InEdgeIt &e) const {
 
   215       return Parent::source(e);
 
   219     template <typename _Value>
 
   221       : public MapExtender<DefaultMap<Graph, Node, _Value> > {
 
   223       typedef GraphExtender Graph;
 
   224       typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
 
   226       explicit NodeMap(const Graph& graph) 
 
   228       NodeMap(const Graph& graph, const _Value& value) 
 
   229 	: Parent(graph, value) {}
 
   231       NodeMap& operator=(const NodeMap& cmap) {
 
   232 	return operator=<NodeMap>(cmap);
 
   235       template <typename CMap>
 
   236       NodeMap& operator=(const CMap& cmap) {
 
   237         Parent::operator=(cmap);
 
   243     template <typename _Value>
 
   245       : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
 
   247       typedef GraphExtender Graph;
 
   248       typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
 
   250       explicit EdgeMap(const Graph& graph) 
 
   252       EdgeMap(const Graph& graph, const _Value& value) 
 
   253 	: Parent(graph, value) {}
 
   255       EdgeMap& operator=(const EdgeMap& cmap) {
 
   256 	return operator=<EdgeMap>(cmap);
 
   259       template <typename CMap>
 
   260       EdgeMap& operator=(const CMap& cmap) {
 
   261         Parent::operator=(cmap);
 
   268       Node node = Parent::addNode();
 
   269       getNotifier(Node()).add(node);
 
   273     Edge addEdge(const Node& from, const Node& to) {
 
   274       Edge edge = Parent::addEdge(from, to);
 
   275       getNotifier(Edge()).add(edge);
 
   280       getNotifier(Edge()).clear();
 
   281       getNotifier(Node()).clear();
 
   286     void erase(const Node& node) {
 
   288       Parent::firstOut(edge, node);
 
   289       while (edge != INVALID ) {
 
   291 	Parent::firstOut(edge, node);
 
   294       Parent::firstIn(edge, node);
 
   295       while (edge != INVALID ) {
 
   297 	Parent::firstIn(edge, node);
 
   300       getNotifier(Node()).erase(node);
 
   304     void erase(const Edge& edge) {
 
   305       getNotifier(Edge()).erase(edge);
 
   310       node_notifier.setContainer(*this);
 
   311       edge_notifier.setContainer(*this);
 
   316       edge_notifier.clear();
 
   317       node_notifier.clear();
 
   321   /// \ingroup graphbits
 
   323   /// \brief Extender for the UGraphs
 
   324   template <typename Base> 
 
   325   class UGraphExtender : public Base {
 
   329     typedef UGraphExtender Graph;
 
   331     typedef typename Parent::Node Node;
 
   332     typedef typename Parent::Edge Edge;
 
   333     typedef typename Parent::UEdge UEdge;
 
   337     int maxId(Node) const {
 
   338       return Parent::maxNodeId();
 
   341     int maxId(Edge) const {
 
   342       return Parent::maxEdgeId();
 
   345     int maxId(UEdge) const {
 
   346       return Parent::maxUEdgeId();
 
   349     Node fromId(int id, Node) const {
 
   350       return Parent::nodeFromId(id);
 
   353     Edge fromId(int id, Edge) const {
 
   354       return Parent::edgeFromId(id);
 
   357     UEdge fromId(int id, UEdge) const {
 
   358       return Parent::uEdgeFromId(id);
 
   361     Node oppositeNode(const Node &n, const UEdge &e) const {
 
   362       if( n == Parent::source(e))
 
   363 	return Parent::target(e);
 
   364       else if( n == Parent::target(e))
 
   365 	return Parent::source(e);
 
   370     Edge oppositeEdge(const Edge &e) const {
 
   371       return Parent::direct(e, !Parent::direction(e));
 
   374     using Parent::direct;
 
   375     Edge direct(const UEdge &ue, const Node &s) const {
 
   376       return Parent::direct(ue, Parent::source(ue) == s);
 
   379     // Alterable extension
 
   381     typedef AlterationNotifier<UGraphExtender, Node> NodeNotifier;
 
   382     typedef AlterationNotifier<UGraphExtender, Edge> EdgeNotifier;
 
   383     typedef AlterationNotifier<UGraphExtender, UEdge> UEdgeNotifier;
 
   388     mutable NodeNotifier node_notifier;
 
   389     mutable EdgeNotifier edge_notifier;
 
   390     mutable UEdgeNotifier uedge_notifier;
 
   394     NodeNotifier& getNotifier(Node) const {
 
   395       return node_notifier;
 
   398     EdgeNotifier& getNotifier(Edge) const {
 
   399       return edge_notifier;
 
   402     UEdgeNotifier& getNotifier(UEdge) const {
 
   403       return uedge_notifier;
 
   408     class NodeIt : public Node { 
 
   414       NodeIt(Invalid i) : Node(i) { }
 
   416       explicit NodeIt(const Graph& _graph) : graph(&_graph) {
 
   417 	_graph.first(static_cast<Node&>(*this));
 
   420       NodeIt(const Graph& _graph, const Node& node) 
 
   421 	: Node(node), graph(&_graph) {}
 
   423       NodeIt& operator++() { 
 
   431     class EdgeIt : public Edge { 
 
   437       EdgeIt(Invalid i) : Edge(i) { }
 
   439       explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
 
   440 	_graph.first(static_cast<Edge&>(*this));
 
   443       EdgeIt(const Graph& _graph, const Edge& e) : 
 
   444 	Edge(e), graph(&_graph) { }
 
   446       EdgeIt& operator++() { 
 
   454     class OutEdgeIt : public Edge { 
 
   460       OutEdgeIt(Invalid i) : Edge(i) { }
 
   462       OutEdgeIt(const Graph& _graph, const Node& node) 
 
   464 	_graph.firstOut(*this, node);
 
   467       OutEdgeIt(const Graph& _graph, const Edge& edge) 
 
   468 	: Edge(edge), graph(&_graph) {}
 
   470       OutEdgeIt& operator++() { 
 
   471 	graph->nextOut(*this);
 
   478     class InEdgeIt : public Edge { 
 
   484       InEdgeIt(Invalid i) : Edge(i) { }
 
   486       InEdgeIt(const Graph& _graph, const Node& node) 
 
   488 	_graph.firstIn(*this, node);
 
   491       InEdgeIt(const Graph& _graph, const Edge& edge) : 
 
   492 	Edge(edge), graph(&_graph) {}
 
   494       InEdgeIt& operator++() { 
 
   495 	graph->nextIn(*this);
 
   502     class UEdgeIt : public Parent::UEdge { 
 
   508       UEdgeIt(Invalid i) : UEdge(i) { }
 
   510       explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
 
   511 	_graph.first(static_cast<UEdge&>(*this));
 
   514       UEdgeIt(const Graph& _graph, const UEdge& e) : 
 
   515 	UEdge(e), graph(&_graph) { }
 
   517       UEdgeIt& operator++() { 
 
   524     class IncEdgeIt : public Parent::UEdge {
 
   525       friend class UGraphExtender;
 
   532       IncEdgeIt(Invalid i) : UEdge(i), direction(false) { }
 
   534       IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
 
   535 	_graph.firstInc(*this, direction, n);
 
   538       IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
 
   539 	: graph(&_graph), UEdge(ue) {
 
   540 	direction = (_graph.source(ue) == n);
 
   543       IncEdgeIt& operator++() {
 
   544 	graph->nextInc(*this, direction);
 
   549     /// \brief Base node of the iterator
 
   551     /// Returns the base node (ie. the source in this case) of the iterator
 
   552     Node baseNode(const OutEdgeIt &e) const {
 
   553       return Parent::source((Edge)e);
 
   555     /// \brief Running node of the iterator
 
   557     /// Returns the running node (ie. the target in this case) of the
 
   559     Node runningNode(const OutEdgeIt &e) const {
 
   560       return Parent::target((Edge)e);
 
   563     /// \brief Base node of the iterator
 
   565     /// Returns the base node (ie. the target in this case) of the iterator
 
   566     Node baseNode(const InEdgeIt &e) const {
 
   567       return Parent::target((Edge)e);
 
   569     /// \brief Running node of the iterator
 
   571     /// Returns the running node (ie. the source in this case) of the
 
   573     Node runningNode(const InEdgeIt &e) const {
 
   574       return Parent::source((Edge)e);
 
   577     /// Base node of the iterator
 
   579     /// Returns the base node of the iterator
 
   580     Node baseNode(const IncEdgeIt &e) const {
 
   581       return e.direction ? source(e) : target(e);
 
   583     /// Running node of the iterator
 
   585     /// Returns the running node of the iterator
 
   586     Node runningNode(const IncEdgeIt &e) const {
 
   587       return e.direction ? target(e) : source(e);
 
   590     // Mappable extension
 
   592     template <typename _Value>
 
   594       : public MapExtender<DefaultMap<Graph, Node, _Value> > {
 
   596       typedef UGraphExtender Graph;
 
   597       typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
 
   599       NodeMap(const Graph& graph) 
 
   601       NodeMap(const Graph& graph, const _Value& value) 
 
   602 	: Parent(graph, value) {}
 
   604       NodeMap& operator=(const NodeMap& cmap) {
 
   605 	return operator=<NodeMap>(cmap);
 
   608       template <typename CMap>
 
   609       NodeMap& operator=(const CMap& cmap) {
 
   610         Parent::operator=(cmap);
 
   616     template <typename _Value>
 
   618       : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
 
   620       typedef UGraphExtender Graph;
 
   621       typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
 
   623       EdgeMap(const Graph& graph) 
 
   625       EdgeMap(const Graph& graph, const _Value& value) 
 
   626 	: Parent(graph, value) {}
 
   628       EdgeMap& operator=(const EdgeMap& cmap) {
 
   629 	return operator=<EdgeMap>(cmap);
 
   632       template <typename CMap>
 
   633       EdgeMap& operator=(const CMap& cmap) {
 
   634         Parent::operator=(cmap);
 
   640     template <typename _Value>
 
   642       : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
 
   644       typedef UGraphExtender Graph;
 
   645       typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
 
   647       UEdgeMap(const Graph& graph) 
 
   650       UEdgeMap(const Graph& graph, const _Value& value) 
 
   651 	: Parent(graph, value) {}
 
   653       UEdgeMap& operator=(const UEdgeMap& cmap) {
 
   654 	return operator=<UEdgeMap>(cmap);
 
   657       template <typename CMap>
 
   658       UEdgeMap& operator=(const CMap& cmap) {
 
   659         Parent::operator=(cmap);
 
   665     // Alteration extension
 
   668       Node node = Parent::addNode();
 
   669       getNotifier(Node()).add(node);
 
   673     UEdge addEdge(const Node& from, const Node& to) {
 
   674       UEdge uedge = Parent::addEdge(from, to);
 
   675       getNotifier(UEdge()).add(uedge);
 
   676       getNotifier(Edge()).add(Parent::direct(uedge, true));
 
   677       getNotifier(Edge()).add(Parent::direct(uedge, false));
 
   682       getNotifier(Edge()).clear();
 
   683       getNotifier(UEdge()).clear();
 
   684       getNotifier(Node()).clear();
 
   688     void erase(const Node& node) {
 
   690       Parent::firstOut(edge, node);
 
   691       while (edge != INVALID ) {
 
   693 	Parent::firstOut(edge, node);
 
   696       Parent::firstIn(edge, node);
 
   697       while (edge != INVALID ) {
 
   699 	Parent::firstIn(edge, node);
 
   702       getNotifier(Node()).erase(node);
 
   706     void erase(const UEdge& uedge) {
 
   707       getNotifier(Edge()).erase(Parent::direct(uedge, true));
 
   708       getNotifier(Edge()).erase(Parent::direct(uedge, false));
 
   709       getNotifier(UEdge()).erase(uedge);
 
   710       Parent::erase(uedge);
 
   714       node_notifier.setContainer(*this); 
 
   715       edge_notifier.setContainer(*this);
 
   716       uedge_notifier.setContainer(*this);
 
   720       uedge_notifier.clear();
 
   721       edge_notifier.clear();
 
   722       node_notifier.clear(); 
 
   727   /// \ingroup graphbits
 
   729   /// \brief Extender for the BpUGraphs
 
   730   template <typename Base>
 
   731   class BpUGraphExtender : public Base {
 
   734     typedef BpUGraphExtender Graph;
 
   736     typedef typename Parent::Node Node;
 
   737     typedef typename Parent::UEdge UEdge;
 
   745     class ANode : public Node {
 
   746       friend class BpUGraphExtender;
 
   749       ANode(const Node& node) : Node(node) {
 
   750 	LEMON_ASSERT(Parent::aNode(node) || node == INVALID, 
 
   751 		     typename Parent::NodeSetError());
 
   753       ANode(Invalid) : Node(INVALID) {}
 
   756     void first(ANode& node) const {
 
   757       Parent::firstANode(static_cast<Node&>(node));
 
   759     void next(ANode& node) const {
 
   760       Parent::nextANode(static_cast<Node&>(node));
 
   763     int id(const ANode& node) const {
 
   764       return Parent::aNodeId(node);
 
   767     class BNode : public Node {
 
   768       friend class BpUGraphExtender;
 
   771       BNode(const Node& node) : Node(node) {
 
   772 	LEMON_ASSERT(Parent::bNode(node) || node == INVALID,
 
   773 		     typename Parent::NodeSetError());
 
   775       BNode(Invalid) : Node(INVALID) {}
 
   778     void first(BNode& node) const {
 
   779       Parent::firstBNode(static_cast<Node&>(node));
 
   781     void next(BNode& node) const {
 
   782       Parent::nextBNode(static_cast<Node&>(node));
 
   785     int id(const BNode& node) const {
 
   786       return Parent::aNodeId(node);
 
   789     Node source(const UEdge& edge) const {
 
   792     Node target(const UEdge& edge) const {
 
   796     void firstInc(UEdge& edge, bool& direction, const Node& node) const {
 
   797       if (Parent::aNode(node)) {
 
   798 	Parent::firstFromANode(edge, node);
 
   801 	Parent::firstFromBNode(edge, node);
 
   802 	direction = static_cast<UEdge&>(edge) == INVALID;
 
   805     void nextInc(UEdge& edge, bool& direction) const {
 
   807 	Parent::nextFromANode(edge);
 
   809 	Parent::nextFromBNode(edge);
 
   810 	if (edge == INVALID) direction = true;
 
   814     class Edge : public UEdge {
 
   815       friend class BpUGraphExtender;
 
   819       Edge(const UEdge& edge, bool _forward)
 
   820 	: UEdge(edge), forward(_forward) {}
 
   824       Edge (Invalid) : UEdge(INVALID), forward(true) {}
 
   825       bool operator==(const Edge& i) const {
 
   826 	return UEdge::operator==(i) && forward == i.forward;
 
   828       bool operator!=(const Edge& i) const {
 
   829 	return UEdge::operator!=(i) || forward != i.forward;
 
   831       bool operator<(const Edge& i) const {
 
   832 	return UEdge::operator<(i) || 
 
   833 	  (!(i.forward<forward) && UEdge(*this)<UEdge(i));
 
   837     void first(Edge& edge) const {
 
   838       Parent::first(static_cast<UEdge&>(edge));
 
   842     void next(Edge& edge) const {
 
   844 	Parent::next(static_cast<UEdge&>(edge));
 
   846       edge.forward = !edge.forward;
 
   849     void firstOut(Edge& edge, const Node& node) const {
 
   850       if (Parent::aNode(node)) {
 
   851 	Parent::firstFromANode(edge, node);
 
   854 	Parent::firstFromBNode(edge, node);
 
   855 	edge.forward = static_cast<UEdge&>(edge) == INVALID;
 
   858     void nextOut(Edge& edge) const {
 
   860 	Parent::nextFromANode(edge);
 
   862 	Parent::nextFromBNode(edge);
 
   863         edge.forward = static_cast<UEdge&>(edge) == INVALID;
 
   867     void firstIn(Edge& edge, const Node& node) const {
 
   868       if (Parent::bNode(node)) {
 
   869 	Parent::firstFromBNode(edge, node);
 
   872 	Parent::firstFromANode(edge, node);
 
   873 	edge.forward = static_cast<UEdge&>(edge) == INVALID;
 
   876     void nextIn(Edge& edge) const {
 
   878 	Parent::nextFromBNode(edge);
 
   880 	Parent::nextFromANode(edge);
 
   881 	edge.forward = static_cast<UEdge&>(edge) == INVALID;
 
   885     Node source(const Edge& edge) const {
 
   886       return edge.forward ? Parent::aNode(edge) : Parent::bNode(edge);
 
   888     Node target(const Edge& edge) const {
 
   889       return edge.forward ? Parent::bNode(edge) : Parent::aNode(edge);
 
   892     int id(const Edge& edge) const {
 
   893       return (Parent::id(static_cast<const UEdge&>(edge)) << 1) + 
 
   894         (edge.forward ? 0 : 1);
 
   896     Edge edgeFromId(int id) const {
 
   897       return Edge(Parent::fromUEdgeId(id >> 1), (id & 1) == 0);
 
   899     int maxEdgeId() const {
 
   900       return (Parent::maxUEdgeId(UEdge()) << 1) + 1;
 
   903     bool direction(const Edge& edge) const {
 
   907     Edge direct(const UEdge& edge, bool direction) const {
 
   908       return Edge(edge, direction);
 
   911     int edgeNum() const {
 
   912       return 2 * Parent::uEdgeNum();
 
   915     int uEdgeNum() const {
 
   916       return Parent::uEdgeNum();
 
   919     Node oppositeNode(const UEdge& edge, const Node& node) const {
 
   920       return source(edge) == node ? 
 
   921 	target(edge) : source(edge);
 
   924     Edge direct(const UEdge& edge, const Node& node) const {
 
   925       return Edge(edge, node == Parent::source(edge));
 
   928     Edge oppositeEdge(const Edge& edge) const {
 
   929       return Parent::direct(edge, !Parent::direction(edge));
 
   933     int maxId(Node) const {
 
   934       return Parent::maxNodeId();
 
   936     int maxId(BNode) const {
 
   937       return Parent::maxBNodeId();
 
   939     int maxId(ANode) const {
 
   940       return Parent::maxANodeId();
 
   942     int maxId(Edge) const {
 
   945     int maxId(UEdge) const {
 
   946       return Parent::maxUEdgeId();
 
   950     Node fromId(int id, Node) const {
 
   951       return Parent::nodeFromId(id);
 
   953     ANode fromId(int id, ANode) const {
 
   954       return Parent::fromANodeId(id);
 
   956     BNode fromId(int id, BNode) const {
 
   957       return Parent::fromBNodeId(id);
 
   959     Edge fromId(int id, Edge) const {
 
   960       return Parent::edgeFromId(id);
 
   962     UEdge fromId(int id, UEdge) const {
 
   963       return Parent::uEdgeFromId(id);
 
   966     typedef AlterationNotifier<BpUGraphExtender, ANode> ANodeNotifier;
 
   967     typedef AlterationNotifier<BpUGraphExtender, BNode> BNodeNotifier;
 
   968     typedef AlterationNotifier<BpUGraphExtender, Node> NodeNotifier;
 
   969     typedef AlterationNotifier<BpUGraphExtender, Edge> EdgeNotifier;
 
   970     typedef AlterationNotifier<BpUGraphExtender, UEdge> UEdgeNotifier;
 
   974     mutable ANodeNotifier anode_notifier;
 
   975     mutable BNodeNotifier bnode_notifier;
 
   976     mutable NodeNotifier node_notifier;
 
   977     mutable EdgeNotifier edge_notifier;
 
   978     mutable UEdgeNotifier uedge_notifier;
 
   982     NodeNotifier& getNotifier(Node) const {
 
   983       return node_notifier;
 
   986     ANodeNotifier& getNotifier(ANode) const {
 
   987       return anode_notifier;
 
   990     BNodeNotifier& getNotifier(BNode) const {
 
   991       return bnode_notifier;
 
   994     EdgeNotifier& getNotifier(Edge) const {
 
   995       return edge_notifier;
 
   998     UEdgeNotifier& getNotifier(UEdge) const {
 
   999       return uedge_notifier;
 
  1002     class NodeIt : public Node { 
 
  1008       NodeIt(Invalid i) : Node(INVALID) { }
 
  1010       explicit NodeIt(const Graph& _graph) : graph(&_graph) {
 
  1011 	graph->first(static_cast<Node&>(*this));
 
  1014       NodeIt(const Graph& _graph, const Node& node) 
 
  1015 	: Node(node), graph(&_graph) { }
 
  1017       NodeIt& operator++() { 
 
  1024     class ANodeIt : public Node { 
 
  1025       friend class BpUGraphExtender;
 
  1031       ANodeIt(Invalid i) : Node(INVALID) { }
 
  1033       explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
 
  1034 	graph->firstANode(static_cast<Node&>(*this));
 
  1037       ANodeIt(const Graph& _graph, const Node& node) 
 
  1038 	: Node(node), graph(&_graph) {}
 
  1040       ANodeIt& operator++() { 
 
  1041 	graph->nextANode(*this);
 
  1046     class BNodeIt : public Node { 
 
  1047       friend class BpUGraphExtender;
 
  1053       BNodeIt(Invalid i) : Node(INVALID) { }
 
  1055       explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
 
  1056 	graph->firstBNode(static_cast<Node&>(*this));
 
  1059       BNodeIt(const Graph& _graph, const Node& node) 
 
  1060 	: Node(node), graph(&_graph) {}
 
  1062       BNodeIt& operator++() { 
 
  1063 	graph->nextBNode(*this);
 
  1068     class EdgeIt : public Edge { 
 
  1069       friend class BpUGraphExtender;
 
  1075       EdgeIt(Invalid i) : Edge(INVALID) { }
 
  1077       explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
 
  1078 	graph->first(static_cast<Edge&>(*this));
 
  1081       EdgeIt(const Graph& _graph, const Edge& edge) 
 
  1082 	: Edge(edge), graph(&_graph) { }
 
  1084       EdgeIt& operator++() { 
 
  1091     class UEdgeIt : public UEdge { 
 
  1092       friend class BpUGraphExtender;
 
  1098       UEdgeIt(Invalid i) : UEdge(INVALID) { }
 
  1100       explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
 
  1101 	graph->first(static_cast<UEdge&>(*this));
 
  1104       UEdgeIt(const Graph& _graph, const UEdge& edge) 
 
  1105 	: UEdge(edge), graph(&_graph) { }
 
  1107       UEdgeIt& operator++() { 
 
  1113     class OutEdgeIt : public Edge { 
 
  1114       friend class BpUGraphExtender;
 
  1120       OutEdgeIt(Invalid i) : Edge(i) { }
 
  1122       OutEdgeIt(const Graph& _graph, const Node& node) 
 
  1124 	graph->firstOut(*this, node);
 
  1127       OutEdgeIt(const Graph& _graph, const Edge& edge) 
 
  1128 	: Edge(edge), graph(&_graph) {}
 
  1130       OutEdgeIt& operator++() { 
 
  1131 	graph->nextOut(*this);
 
  1138     class InEdgeIt : public Edge { 
 
  1139       friend class BpUGraphExtender;
 
  1145       InEdgeIt(Invalid i) : Edge(i) { }
 
  1147       InEdgeIt(const Graph& _graph, const Node& node) 
 
  1149 	graph->firstIn(*this, node);
 
  1152       InEdgeIt(const Graph& _graph, const Edge& edge) : 
 
  1153 	Edge(edge), graph(&_graph) {}
 
  1155       InEdgeIt& operator++() { 
 
  1156 	graph->nextIn(*this);
 
  1162     /// \brief Base node of the iterator
 
  1164     /// Returns the base node (ie. the source in this case) of the iterator
 
  1165     Node baseNode(const OutEdgeIt &e) const {
 
  1166       return Parent::source((Edge&)e);
 
  1168     /// \brief Running node of the iterator
 
  1170     /// Returns the running node (ie. the target in this case) of the
 
  1172     Node runningNode(const OutEdgeIt &e) const {
 
  1173       return Parent::target((Edge&)e);
 
  1176     /// \brief Base node of the iterator
 
  1178     /// Returns the base node (ie. the target in this case) of the iterator
 
  1179     Node baseNode(const InEdgeIt &e) const {
 
  1180       return Parent::target((Edge&)e);
 
  1182     /// \brief Running node of the iterator
 
  1184     /// Returns the running node (ie. the source in this case) of the
 
  1186     Node runningNode(const InEdgeIt &e) const {
 
  1187       return Parent::source((Edge&)e);
 
  1190     class IncEdgeIt : public Parent::UEdge { 
 
  1191       friend class BpUGraphExtender;
 
  1198       IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
 
  1200       IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
 
  1201 	graph->firstInc(*this, direction, n);
 
  1204       IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
 
  1205 	: graph(&_graph), UEdge(ue) {
 
  1206 	direction = (graph->source(ue) == n);
 
  1209       IncEdgeIt& operator++() {
 
  1210 	graph->nextInc(*this, direction);
 
  1216     /// Base node of the iterator
 
  1218     /// Returns the base node of the iterator
 
  1219     Node baseNode(const IncEdgeIt &e) const {
 
  1220       return e.direction ? source(e) : target(e);
 
  1223     /// Running node of the iterator
 
  1225     /// Returns the running node of the iterator
 
  1226     Node runningNode(const IncEdgeIt &e) const {
 
  1227       return e.direction ? target(e) : source(e);
 
  1230     template <typename _Value>
 
  1232       : public MapExtender<DefaultMap<Graph, ANode, _Value> > {
 
  1234       typedef BpUGraphExtender Graph;
 
  1235       typedef MapExtender<DefaultMap<Graph, ANode, _Value> > Parent;
 
  1237       ANodeMap(const Graph& graph) 
 
  1239       ANodeMap(const Graph& graph, const _Value& value) 
 
  1240 	: Parent(graph, value) {}
 
  1242       ANodeMap& operator=(const ANodeMap& cmap) {
 
  1243 	return operator=<ANodeMap>(cmap);
 
  1246       template <typename CMap>
 
  1247       ANodeMap& operator=(const CMap& cmap) {
 
  1248         Parent::operator=(cmap);
 
  1254     template <typename _Value>
 
  1256       : public MapExtender<DefaultMap<Graph, BNode, _Value> > {
 
  1258       typedef BpUGraphExtender Graph;
 
  1259       typedef MapExtender<DefaultMap<Graph, BNode, _Value> > Parent;
 
  1261       BNodeMap(const Graph& graph) 
 
  1263       BNodeMap(const Graph& graph, const _Value& value) 
 
  1264 	: Parent(graph, value) {}
 
  1266       BNodeMap& operator=(const BNodeMap& cmap) {
 
  1267 	return operator=<BNodeMap>(cmap);
 
  1270       template <typename CMap>
 
  1271       BNodeMap& operator=(const CMap& cmap) {
 
  1272         Parent::operator=(cmap);
 
  1280     template <typename _Value>
 
  1283       typedef BpUGraphExtender Graph;
 
  1286       typedef _Value Value;
 
  1288       /// The reference type of the map;
 
  1289       typedef typename ANodeMap<_Value>::Reference Reference;
 
  1290       /// The const reference type of the map;
 
  1291       typedef typename ANodeMap<_Value>::ConstReference ConstReference;
 
  1293       typedef True ReferenceMapTag;
 
  1295       NodeMap(const Graph& _graph) 
 
  1296 	: graph(_graph), aNodeMap(_graph), bNodeMap(_graph) {}
 
  1297       NodeMap(const Graph& _graph, const _Value& _value) 
 
  1298 	: graph(_graph), aNodeMap(_graph, _value), bNodeMap(_graph, _value) {}
 
  1300       NodeMap& operator=(const NodeMap& cmap) {
 
  1301 	return operator=<NodeMap>(cmap);
 
  1304       template <typename CMap>
 
  1305       NodeMap& operator=(const CMap& cmap) {
 
  1306 	checkConcept<concept::ReadMap<Node, _Value>, CMap>();
 
  1307 	const typename Parent::Notifier* notifier = Parent::getNotifier();
 
  1309 	for (graph.first(it); it != INVALID; graph.next(it)) {
 
  1310 	  Parent::set(it, cmap[it]);
 
  1315       ConstReference operator[](const Key& node) const {
 
  1316 	if (Parent::aNode(node)) {
 
  1317 	  return aNodeMap[node];
 
  1319 	  return bNodeMap[node];
 
  1323       Reference operator[](const Key& node) {
 
  1324 	if (Parent::aNode(node)) {
 
  1325 	  return aNodeMap[node];
 
  1327 	  return bNodeMap[node];
 
  1331       void set(const Key& node, const Value& value) {
 
  1332 	if (Parent::aNode(node)) {
 
  1333 	  aNodeMap.set(node, value);
 
  1335 	  bNodeMap.set(node, value);
 
  1339       class MapIt : public NodeIt {
 
  1342         typedef NodeIt Parent;
 
  1344         explicit MapIt(NodeMap& _map) 
 
  1345           : Parent(_map.graph), map(_map) {}
 
  1347         typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
 
  1351         typename MapTraits<NodeMap>::ReturnValue operator*() {
 
  1355         void set(const Value& value) {
 
  1356           map.set(*this, value);
 
  1363       class ConstMapIt : public NodeIt {
 
  1366         typedef NodeIt Parent;
 
  1368         explicit ConstMapIt(const NodeMap& _map) 
 
  1369           : Parent(_map.graph), map(_map) {}
 
  1371         typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
 
  1379       class ItemIt : public NodeIt {
 
  1382         typedef NodeIt Parent;
 
  1384         explicit ItemIt(const NodeMap& _map)
 
  1385           : Parent(_map.graph) {}
 
  1391       ANodeMap<_Value> aNodeMap;
 
  1392       BNodeMap<_Value> bNodeMap;
 
  1396     template <typename _Value>
 
  1398       : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
 
  1400       typedef BpUGraphExtender Graph;
 
  1401       typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
 
  1403       EdgeMap(const Graph& graph) 
 
  1405       EdgeMap(const Graph& graph, const _Value& value) 
 
  1406 	: Parent(graph, value) {}
 
  1408       EdgeMap& operator=(const EdgeMap& cmap) {
 
  1409 	return operator=<EdgeMap>(cmap);
 
  1412       template <typename CMap>
 
  1413       EdgeMap& operator=(const CMap& cmap) {
 
  1414         Parent::operator=(cmap);
 
  1419     template <typename _Value>
 
  1421       : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
 
  1423       typedef BpUGraphExtender Graph;
 
  1424       typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
 
  1426       UEdgeMap(const Graph& graph) 
 
  1428       UEdgeMap(const Graph& graph, const _Value& value) 
 
  1429 	: Parent(graph, value) {}
 
  1431       UEdgeMap& operator=(const UEdgeMap& cmap) {
 
  1432 	return operator=<UEdgeMap>(cmap);
 
  1435       template <typename CMap>
 
  1436       UEdgeMap& operator=(const CMap& cmap) {
 
  1437         Parent::operator=(cmap);
 
  1444       Node node = Parent::addANode();
 
  1445       getNotifier(ANode()).add(node);
 
  1446       getNotifier(Node()).add(node);
 
  1451       Node node = Parent::addBNode();
 
  1452       getNotifier(BNode()).add(node);
 
  1453       getNotifier(Node()).add(node);
 
  1457     UEdge addEdge(const Node& source, const Node& target) {
 
  1458       UEdge uedge = Parent::addEdge(source, target);
 
  1459       getNotifier(UEdge()).add(uedge);
 
  1461       std::vector<Edge> edges;
 
  1462       edges.push_back(direct(uedge, true));
 
  1463       edges.push_back(direct(uedge, false));
 
  1464       getNotifier(Edge()).add(edges);
 
  1470       getNotifier(Edge()).clear();
 
  1471       getNotifier(UEdge()).clear();
 
  1472       getNotifier(Node()).clear();
 
  1473       getNotifier(BNode()).clear();
 
  1474       getNotifier(ANode()).clear();
 
  1478     void erase(const Node& node) {
 
  1481       Parent::firstInc(uedge, dir, node);
 
  1482       while (uedge != INVALID ) {
 
  1484 	Parent::firstInc(uedge, dir, node);
 
  1487       getNotifier(Node()).erase(node);
 
  1488       Parent::erase(node);
 
  1491     void erase(const UEdge& uedge) {
 
  1492       std::vector<Edge> edges;
 
  1493       edges.push_back(direct(uedge, true));
 
  1494       edges.push_back(direct(uedge, false));
 
  1495       getNotifier(Edge()).erase(edges);
 
  1496       getNotifier(UEdge()).erase(uedge);
 
  1497       Parent::erase(uedge);
 
  1501     BpUGraphExtender() {
 
  1502       anode_notifier.setContainer(*this); 
 
  1503       bnode_notifier.setContainer(*this); 
 
  1504       node_notifier.setContainer(*this); 
 
  1505       edge_notifier.setContainer(*this); 
 
  1506       uedge_notifier.setContainer(*this);
 
  1509     ~BpUGraphExtender() {
 
  1510       uedge_notifier.clear();
 
  1511       edge_notifier.clear(); 
 
  1512       node_notifier.clear(); 
 
  1513       anode_notifier.clear(); 
 
  1514       bnode_notifier.clear();