src/work/marci/graph_wrapper.h
author marci
Tue, 06 Apr 2004 12:00:34 +0000
changeset 311 6635b11938fe
parent 307 0fac67bef95a
child 312 54e07057eb47
permissions -rw-r--r--
gw
     1 // -*- c++ -*-
     2 #ifndef HUGO_GRAPH_WRAPPER_H
     3 #define HUGO_GRAPH_WRAPPER_H
     4 
     5 #include <invalid.h>
     6 
     7 namespace hugo {
     8 
     9   template<typename Graph>
    10   class TrivGraphWrapper {
    11   protected:
    12     Graph* graph;
    13   
    14   public:
    15 //    typedef Graph BaseGraph;
    16     typedef Graph ParentGraph;
    17 
    18 //     TrivGraphWrapper() : graph(0) { }
    19     TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
    20 //     void setGraph(Graph& _graph) { graph = &_graph; }
    21 //     Graph& getGraph() const { return *graph; }
    22 
    23     typedef typename Graph::Node Node;
    24     class NodeIt : public Graph::NodeIt { 
    25     public:
    26       NodeIt() { }
    27       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
    28 //      NodeIt(const typename BaseGraph::NodeIt& n) : Graph::NodeIt(n) { }
    29       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
    30       NodeIt(const TrivGraphWrapper<Graph>& _G) : 
    31 	Graph::NodeIt(*(_G.graph)) { }
    32 //      operator typename BaseGraph::NodeIt() { 
    33 //	return typename BaseGraph::NodeIt(this->Graph::NodeIt);
    34 //      }
    35     };
    36     typedef typename Graph::Edge Edge;
    37     class OutEdgeIt : public Graph::OutEdgeIt { 
    38     public:
    39       OutEdgeIt() { }
    40       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
    41       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
    42       OutEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) : 
    43 	Graph::OutEdgeIt(*(_G.graph), n) { }
    44     };
    45     class InEdgeIt : public Graph::InEdgeIt { 
    46     public:
    47       InEdgeIt() { }
    48       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
    49       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
    50       InEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) : 
    51 	Graph::InEdgeIt(*(_G.graph), n) { }
    52     };
    53     //typedef typename Graph::SymEdgeIt SymEdgeIt;
    54     class EdgeIt : public Graph::EdgeIt { 
    55     public:
    56       EdgeIt() { }
    57       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
    58       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
    59       EdgeIt(const TrivGraphWrapper<Graph>& _G) : 
    60 	Graph::EdgeIt(*(_G.graph)) { }
    61     };
    62 
    63     NodeIt& first(NodeIt& i) const { 
    64       i=NodeIt(*this);
    65       return i;
    66     }
    67 //     template<typename I> I& first(I& i) const { 
    68 //       i=I(*this);
    69 //       return i;
    70 //     }
    71     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
    72       i=OutEdgeIt(*this, p);
    73       return i;
    74     }
    75     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
    76       i=InEdgeIt(*this, p);
    77       return i;
    78     }
    79     EdgeIt& first(EdgeIt& i) const { 
    80       i=EdgeIt(*this);
    81       return i;
    82     }
    83 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
    84 //       i=I(*this, p);
    85 //       return i;
    86 //     }
    87     
    88 //    template<typename I> I getNext(const I& i) const { 
    89 //      return graph->getNext(i); }
    90 //    template<typename I> I& next(I &i) const { graph->next(i); return i; }    
    91     NodeIt& next(NodeIt& i) const { graph->next(i); return i; }
    92     OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i); return i; }
    93     InEdgeIt& next(InEdgeIt& i) const { graph->next(i); return i; }
    94     EdgeIt& next(EdgeIt& i) const { graph->next(i); return i; }
    95 
    96     template< typename It > It first() const { 
    97       It e; this->first(e); return e; }
    98 
    99     template< typename It > It first(const Node& v) const { 
   100       It e; this->first(e, v); return e; }
   101 
   102     Node head(const Edge& e) const { return graph->head(e); }
   103     Node tail(const Edge& e) const { return graph->tail(e); }
   104 
   105     template<typename I> bool valid(const I& i) const { 
   106       return graph->valid(i); }
   107   
   108     //template<typename I> void setInvalid(const I &i);
   109     //{ return graph->setInvalid(i); }
   110 
   111     int nodeNum() const { return graph->nodeNum(); }
   112     int edgeNum() const { return graph->edgeNum(); }
   113   
   114     template<typename I> Node aNode(const I& e) const { 
   115       return graph->aNode(e); }
   116     template<typename I> Node bNode(const I& e) const { 
   117       return graph->bNode(e); }
   118   
   119     Node addNode() const { return graph->addNode(); }
   120     Edge addEdge(const Node& tail, const Node& head) const { 
   121       return graph->addEdge(tail, head); }
   122   
   123     template<typename I> void erase(const I& i) const { graph->erase(i); }
   124   
   125     void clear() const { graph->clear(); }
   126     
   127     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   128     public:
   129       NodeMap(const TrivGraphWrapper<Graph>& _G) :  
   130 	Graph::NodeMap<T>(*(_G.graph)) { }
   131       NodeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
   132 	Graph::NodeMap<T>(*(_G.graph), a) { }
   133     };
   134 
   135     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
   136     public:
   137       EdgeMap(const TrivGraphWrapper<Graph>& _G) :  
   138 	Graph::EdgeMap<T>(*(_G.graph)) { }
   139       EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
   140 	Graph::EdgeMap<T>(*(_G.graph), a) { }
   141     };
   142 
   143 //     template<typename Map, typename T> class NodeMapWrapper {
   144 //     protected:
   145 //       Map* map;
   146 //     public:
   147 //       NodeMapWrapper(Map& _map) : map(&_map) { }
   148 //       void set(Node n, T a) { map->set(n, a); }
   149 //       T get(Node n) const { return map->get(n); }
   150 //     };
   151 
   152 //     template<typename Map, typename T> class EdgeMapWrapper {
   153 //     protected:
   154 //       Map* map;
   155 //     public:
   156 //       EdgeMapWrapper(Map& _map) : map(&_map) { }
   157 //       void set(Edge n, T a) { map->set(n, a); }
   158 //       T get(Edge n) const { return map->get(n); }
   159 //     };
   160   };
   161 
   162 
   163   template<typename Graph>
   164   class GraphWrapper {
   165   protected:
   166     Graph* graph;
   167   
   168   public:
   169     typedef Graph BaseGraph;
   170     typedef Graph ParentGraph;
   171 
   172 //     GraphWrapper() : graph(0) { }
   173     GraphWrapper(Graph& _graph) : graph(&_graph) { }
   174 //     void setGraph(Graph& _graph) { graph=&_graph; }
   175 //     Graph& getGraph() const { return *graph; }
   176  
   177     typedef typename Graph::Node Node;
   178     class NodeIt : public Graph::NodeIt { 
   179     public:
   180       NodeIt() { }
   181       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
   182       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
   183       NodeIt(const GraphWrapper<Graph>& _G) : 
   184 	Graph::NodeIt(*(_G.graph)) { }
   185     };
   186     typedef typename Graph::Edge Edge;
   187     class OutEdgeIt : public Graph::OutEdgeIt { 
   188     public:
   189       OutEdgeIt() { }
   190       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
   191       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
   192       OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) : 
   193 	Graph::OutEdgeIt(*(_G.graph), n) { }
   194     };
   195     class InEdgeIt : public Graph::InEdgeIt { 
   196     public:
   197       InEdgeIt() { }
   198       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
   199       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
   200       InEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) : 
   201 	Graph::InEdgeIt(*(_G.graph), n) { }
   202     };
   203     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   204     class EdgeIt : public Graph::EdgeIt { 
   205     public:
   206       EdgeIt() { }
   207       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
   208       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
   209       EdgeIt(const GraphWrapper<Graph>& _G) : 
   210 	Graph::EdgeIt(*(_G.graph)) { }
   211     };
   212    
   213     NodeIt& first(NodeIt& i) const { 
   214       i=NodeIt(*this);
   215       return i;
   216     }
   217 //     template<typename I> I& first(I& i) const {       
   218 //       i=I(*this);
   219 //       return i;
   220 //     }
   221     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
   222       i=OutEdgeIt(*this, p);
   223       return i;
   224     }
   225     InEdgeIt& first(InEdgeIt& i, const Node& p) const { 
   226       i=InEdgeIt(*this, p);
   227       return i;
   228     }
   229     EdgeIt& first(EdgeIt& i) const { 
   230       i=EdgeIt(*this);
   231       return i;
   232     }
   233 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   234 //       i=I(*this, p);
   235 //       return i; 
   236 //     }
   237     
   238 //    template<typename I> I getNext(const I& i) const { 
   239 //      return gw.getNext(i); }
   240 //    template<typename I> I& next(I &i) const { graph->next(i); return i; }    
   241     NodeIt& next(NodeIt& i) const { graph->next(i); return i; }
   242     OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i); return i; }
   243     InEdgeIt& next(InEdgeIt& i) const { graph->next(i); return i; }
   244     EdgeIt& next(EdgeIt& i) const { graph->next(i); return i; }    
   245 
   246     template< typename It > It first() const { 
   247       It e; this->first(e); return e; }
   248 
   249     template< typename It > It first(const Node& v) const { 
   250       It e; this->first(e, v); return e; }
   251 
   252     Node head(const Edge& e) const { return graph->head(e); }
   253     Node tail(const Edge& e) const { return graph->tail(e); }
   254 
   255     template<typename I> bool valid(const I& i) const { 
   256       return graph->valid(i); }
   257   
   258     //template<typename I> void setInvalid(const I &i);
   259     //{ return graph->setInvalid(i); }
   260 
   261     int nodeNum() const { return graph->nodeNum(); }
   262     int edgeNum() const { return graph->edgeNum(); }
   263   
   264     template<typename I> Node aNode(const I& e) const { 
   265       return graph->aNode(e); }
   266     template<typename I> Node bNode(const I& e) const { 
   267       return graph->bNode(e); }
   268   
   269     Node addNode() const { return graph->addNode(); }
   270     Edge addEdge(const Node& tail, const Node& head) const { 
   271       return graph->addEdge(tail, head); }
   272   
   273     template<typename I> void erase(const I& i) const { graph->erase(i); }
   274   
   275     void clear() const { graph->clear(); }
   276     
   277     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   278     public:
   279       NodeMap(const GraphWrapper<Graph>& _G) :  
   280 	Graph::NodeMap<T>(*(_G.graph)) { }
   281       NodeMap(const GraphWrapper<Graph>& _G, T a) : 
   282 	Graph::NodeMap<T>(*(_G.graph), a) { }
   283     };
   284 
   285     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
   286     public:
   287       EdgeMap(const GraphWrapper<Graph>& _G) :  
   288 	Graph::EdgeMap<T>(*(_G.graph)) { }
   289       EdgeMap(const GraphWrapper<Graph>& _G, T a) : 
   290 	Graph::EdgeMap<T>(*(_G.graph), a) { }
   291     };
   292   };
   293 
   294 
   295 //   template<typename Graph>
   296 //   class RevGraphWrapper
   297 //   {
   298 //   protected:
   299 //     Graph* graph;
   300   
   301 //   public:
   302 //     typedef Graph ParentGraph;
   303 
   304 //     typedef typename Graph::Node Node;    
   305 //     typedef typename Graph::NodeIt NodeIt;
   306   
   307 //     typedef typename Graph::Edge Edge;
   308 //     typedef typename Graph::OutEdgeIt InEdgeIt;
   309 //     typedef typename Graph::InEdgeIt OutEdgeIt;
   310 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   311 //     typedef typename Graph::EdgeIt EdgeIt;
   312 
   313 //     //RevGraphWrapper() : graph(0) { }
   314 //     RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
   315 
   316 //     void setGraph(Graph& _graph) { graph = &_graph; }
   317 //     Graph& getGraph() const { return (*graph); }
   318     
   319 //     template<typename I> I& first(I& i) const { return graph->first(i); }
   320 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   321 //       return graph->first(i, p); }
   322 
   323 //     template<typename I> I getNext(const I& i) const { 
   324 //       return graph->getNext(i); }
   325 //     template<typename I> I& next(I &i) const { return graph->next(i); }    
   326 
   327 //     template< typename It > It first() const { 
   328 //       It e; first(e); return e; }
   329 
   330 //     template< typename It > It first(const Node& v) const { 
   331 //       It e; first(e, v); return e; }
   332 
   333 //     Node head(const Edge& e) const { return graph->tail(e); }
   334 //     Node tail(const Edge& e) const { return graph->head(e); }
   335   
   336 //     template<typename I> bool valid(const I& i) const 
   337 //       { return graph->valid(i); }
   338   
   339 //     //template<typename I> void setInvalid(const I &i);
   340 //     //{ return graph->setInvalid(i); }
   341   
   342 //     template<typename I> Node aNode(const I& e) const { 
   343 //       return graph->aNode(e); }
   344 //     template<typename I> Node bNode(const I& e) const { 
   345 //       return graph->bNode(e); }
   346 
   347 //     Node addNode() const { return graph->addNode(); }
   348 //     Edge addEdge(const Node& tail, const Node& head) const { 
   349 //       return graph->addEdge(tail, head); }
   350   
   351 //     int nodeNum() const { return graph->nodeNum(); }
   352 //     int edgeNum() const { return graph->edgeNum(); }
   353   
   354 //     template<typename I> void erase(const I& i) const { graph->erase(i); }
   355   
   356 //     void clear() const { graph->clear(); }
   357 
   358 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   359 //     public:
   360 //       NodeMap(const RevGraphWrapper<Graph>& _G) : 
   361 // 	Graph::NodeMap<T>(_G.getGraph()) { }
   362 //       NodeMap(const RevGraphWrapper<Graph>& _G, T a) : 
   363 // 	Graph::NodeMap<T>(_G.getGraph(), a) { }
   364 //     };
   365 
   366 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
   367 //     public:
   368 //       EdgeMap(const RevGraphWrapper<Graph>& _G) : 
   369 // 	Graph::EdgeMap<T>(_G.getGraph()) { }
   370 //       EdgeMap(const RevGraphWrapper<Graph>& _G, T a) : 
   371 // 	Graph::EdgeMap<T>(_G.getGraph(), a) { }
   372 //     };
   373 //   };
   374 
   375 
   376   template<typename Graph>
   377   class RevGraphWrapper : public GraphWrapper<Graph> {
   378   public:
   379     typedef typename GraphWrapper<Graph>::Node Node;
   380     typedef typename GraphWrapper<Graph>::Edge Edge;
   381     //FIXME 
   382     //If Graph::OutEdgeIt is not defined
   383     //and we do not want to use RevGraphWrapper::InEdgeIt,
   384     //this won't work, because of typedef
   385     //OR
   386     //graphs have to define their non-existing iterators to void
   387     //Unfortunately all the typedefs are instantiated in templates, 
   388     //unlike other stuff
   389     typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
   390     typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
   391 
   392 //     RevGraphWrapper() : GraphWrapper<Graph>() { }
   393     RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   394 
   395     Node head(const Edge& e) const 
   396       { return GraphWrapper<Graph>::tail(e); }
   397     Node tail(const Edge& e) const 
   398       { return GraphWrapper<Graph>::head(e); }
   399   };
   400 
   401   //Subgraph on the same node-set and partial edge-set
   402   template<typename Graph, typename NodeFilterMap, 
   403 	   typename EdgeFilterMap>
   404   class SubGraphWrapper : public GraphWrapper<Graph> {
   405   protected:
   406     NodeFilterMap* node_filter_map;
   407     EdgeFilterMap* edge_filter_map;
   408   public:
   409 //     SubGraphWrapper() : GraphWrapper<Graph>(), filter_map(0) { }
   410     SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map, 
   411 		    EdgeFilterMap& _edge_filter_map) : 
   412       GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map), 
   413       edge_filter_map(&_edge_filter_map) { }  
   414 
   415 
   416     typedef typename Graph::Node Node;
   417     class NodeIt : public Graph::NodeIt { 
   418 //      typedef typename Graph::NodeIt GraphNodeIt;
   419     public:
   420       NodeIt() { }
   421       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
   422       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
   423       NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
   424 	Graph::NodeIt(*(_G.graph)) { 
   425 	while (_G.graph->valid((*this)/*.GraphNodeIt*/) && 
   426 	       !(*(_G.node_filter_map))[(*this)/*.GraphNodeIt*/]) 
   427 	  _G.graph->next((*this)/*.GraphNodeIt*/);
   428       }
   429     };
   430     typedef typename Graph::Edge Edge;
   431     class OutEdgeIt : public Graph::OutEdgeIt { 
   432 //      typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
   433     public:
   434       OutEdgeIt() { }
   435       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
   436       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
   437       OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& 
   438 		_G, const Node& n) : 
   439 	Graph::OutEdgeIt(*(_G.graph), n) { 
   440 	while (_G.graph->valid((*this)/*.GraphOutEdgeIt*/) && 
   441 	       !(*(_G.edge_filter_map))[(*this)/*.GraphOutEdgeIt*/]) 
   442 	  _G.graph->next((*this)/*.GraphOutEdgeIt*/);
   443       }
   444     };
   445     class InEdgeIt : public Graph::InEdgeIt { 
   446 //      typedef typename Graph::InEdgeIt GraphInEdgeIt;
   447     public:
   448       InEdgeIt() { }
   449       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
   450       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
   451       InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G, 
   452 	       const Node& n) : 
   453 	Graph::InEdgeIt(*(_G.graph), n) { 
   454 	while (_G.graph->valid((*this)/*.GraphInEdgeIt*/) && 
   455 	       !(*(_G.edge_filter_map))[(*this)/*.GraphInEdgeIt*/]) 
   456 	  _G.graph->next((*this)/*.GraphInEdgeIt*/);
   457       }
   458     };
   459 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   460     class EdgeIt : public Graph::EdgeIt { 
   461 //      typedef typename Graph::EdgeIt GraphEdgeIt;
   462     public:
   463       EdgeIt() { }
   464       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
   465       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
   466       EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) : 
   467 	Graph::EdgeIt(*(_G.graph)) { 
   468 	while (_G.graph->valid((*this)/*.GraphEdgeIt*/) && 
   469 	       !(*(_G.edge_filter_map))[(*this)/*.GraphEdgeIt*/]) 
   470 	  _G.graph->next((*this)/*.GraphEdgeIt*/);
   471       }
   472     };
   473    
   474     NodeIt& first(NodeIt& i) const {
   475       i=NodeIt(*this);
   476       return i;
   477     }
   478     OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
   479       i=OutEdgeIt(*this, n);
   480       return i;
   481     }
   482     InEdgeIt& first(InEdgeIt& i, const Node& n) const {
   483       i=InEdgeIt(*this, n);
   484       return i;
   485     }
   486     EdgeIt& first(EdgeIt& i) const {
   487       i=EdgeIt(*this);
   488       return i;
   489     }
   490     
   491 //     template<typename I> I& first(I& i) const { 
   492 //       graph->first(i); 
   493 //       //while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
   494 //       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   495 //       return i;
   496 //     }
   497 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   498 //       graph->first(i, p); 
   499 // //      while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
   500 //       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   501 //       return i;
   502 //     }
   503 
   504     NodeIt& next(NodeIt& i) const {
   505       graph->next(i); 
   506       while (graph->valid(i) && !(*node_filter_map)[i]) { graph->next(i); }
   507       return i;
   508     }
   509     OutEdgeIt& next(OutEdgeIt& i) const {
   510       graph->next(i); 
   511       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   512       return i;
   513     }
   514     InEdgeIt& next(InEdgeIt& i) const {
   515       graph->next(i); 
   516       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   517       return i;
   518     }
   519     EdgeIt& next(EdgeIt& i) const {
   520       graph->next(i); 
   521       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   522       return i;
   523     }
   524 
   525     //template<typename I> I getNext(const I& i) const { 
   526     //  return gw.getNext(i); 
   527     //}
   528 //     template<typename I> I& next(I &i) const { 
   529 //       graph->next(i); 
   530 // //      while (graph->valid(i) && !filter_map-get(i)) { graph->next(i); }
   531 //       while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
   532 //       return i;
   533 //     }
   534     
   535     template< typename It > It first() const { 
   536       It e; this->first(e); return e; }
   537     
   538     template< typename It > It first(const Node& v) const { 
   539       It e; this->first(e, v); return e; }
   540   };
   541 
   542 //   template<typename GraphWrapper>
   543 //   class UndirGraphWrapper {
   544 //   protected:
   545 //     //Graph* graph;
   546 //     GraphWrapper gw;
   547 
   548 //   public:
   549 //     typedef GraphWrapper ParentGraph;
   550 
   551 //     typedef typename GraphWrapper::Node Node;
   552 //     typedef typename GraphWrapper::NodeIt NodeIt;
   553 
   554 //     //typedef typename Graph::Edge Edge;
   555 //     //typedef typename Graph::OutEdgeIt OutEdgeIt;
   556 //     //typedef typename Graph::InEdgeIt InEdgeIt;
   557 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   558 //     //typedef typename Graph::EdgeIt EdgeIt;
   559 
   560 //     //private:
   561 //     typedef typename GraphWrapper::Edge GraphEdge;
   562 //     typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt;
   563 //     typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt;
   564 //     //public:
   565 
   566 //     //UndirGraphWrapper() : graph(0) { }
   567 //     UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
   568 
   569 //     //void setGraph(Graph& _graph) { graph = &_graph; }
   570 //     //Graph& getGraph() const { return (*graph); }
   571   
   572 //     class Edge {
   573 //       friend class UndirGraphWrapper<GraphWrapper>;
   574 //       bool out_or_in; //true iff out
   575 //       GraphOutEdgeIt out;
   576 //       GraphInEdgeIt in;
   577 //     public:
   578 //       Edge() : out_or_in(), out(), in() { }
   579 //       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
   580 //       operator GraphEdge() const {
   581 // 	if (out_or_in) return(out); else return(in);
   582 //       }
   583 //       friend bool operator==(const Edge& u, const Edge& v) { 
   584 // 	if (v.out_or_in) 
   585 // 	  return (u.out_or_in && u.out==v.out);
   586 // 	else
   587 // 	  return (!u.out_or_in && u.in==v.in);
   588 //       } 
   589 //       friend bool operator!=(const Edge& u, const Edge& v) { 
   590 // 	if (v.out_or_in) 
   591 // 	  return (!u.out_or_in || u.out!=v.out);
   592 // 	else
   593 // 	  return (u.out_or_in || u.in!=v.in);
   594 //       } 
   595 //     };
   596 
   597 //     class OutEdgeIt : public Edge {
   598 //       friend class UndirGraphWrapper<GraphWrapper>;
   599 //     public:
   600 //       OutEdgeIt() : Edge() { }
   601 //       OutEdgeIt(const Invalid& i) : Edge(i) { }
   602 //       OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n) 
   603 // 	: Edge() { 
   604 // 	out_or_in=true;
   605 // 	_G.gw.first(out, n);
   606 // 	if (!(_G.gw.valid(out))) {
   607 // 	  out_or_in=false;
   608 // 	  _G.gw.first(in, n);
   609 // 	}
   610 //       }
   611 //     };
   612 
   613 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
   614 //       e.out_or_in=true;
   615 //       gw.first(e.out, n);
   616 //       if (!(gw.valid(e.out))) {
   617 // 	e.out_or_in=false;
   618 // 	gw.first(e.in, n);
   619 //       }
   620 //       return e;
   621 //     }
   622 
   623 //     OutEdgeIt& next(OutEdgeIt& e) const {
   624 //       if (e.out_or_in) {
   625 // 	Node n=gw.tail(e.out);
   626 // 	gw.next(e.out);
   627 // 	if (!gw.valid(e.out)) {
   628 // 	  e.out_or_in=false;
   629 // 	  gw.first(e.in, n);
   630 // 	}
   631 //       } else {
   632 // 	gw.next(e.in);
   633 //       }
   634 //       return e;
   635 //     }
   636 
   637 //     Node aNode(const OutEdgeIt& e) const { 
   638 //       if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
   639 //     Node bNode(const OutEdgeIt& e) const { 
   640 //       if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
   641 
   642 //     typedef OutEdgeIt InEdgeIt; 
   643 
   644 //     template<typename I> I& first(I& i) const { return gw.first(i); }
   645 // //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   646 // //       return graph->first(i, p); }
   647     
   648 //     template<typename I> I getNext(const I& i) const { 
   649 //       return gw.getNext(i); }
   650 //     template<typename I> I& next(I &i) const { return gw.next(i); }    
   651 
   652 //     template< typename It > It first() const { 
   653 //       It e; first(e); return e; }
   654 
   655 //     template< typename It > It first(const Node& v) const { 
   656 //       It e; first(e, v); return e; }
   657 
   658 //     Node head(const Edge& e) const { return gw.head(e); }
   659 //     Node tail(const Edge& e) const { return gw.tail(e); }
   660 
   661 //     template<typename I> bool valid(const I& i) const 
   662 //       { return gw.valid(i); }
   663   
   664 //     //template<typename I> void setInvalid(const I &i);
   665 //     //{ return graph->setInvalid(i); }
   666 
   667 //     int nodeNum() const { return gw.nodeNum(); }
   668 //     int edgeNum() const { return gw.edgeNum(); }
   669   
   670 // //     template<typename I> Node aNode(const I& e) const { 
   671 // //       return graph->aNode(e); }
   672 // //     template<typename I> Node bNode(const I& e) const { 
   673 // //       return graph->bNode(e); }
   674   
   675 //     Node addNode() const { return gw.addNode(); }
   676 // // FIXME: ez igy nem jo, mert nem
   677 // //    Edge addEdge(const Node& tail, const Node& head) const { 
   678 // //      return graph->addEdge(tail, head); }
   679   
   680 //     template<typename I> void erase(const I& i) const { gw.erase(i); }
   681   
   682 //     void clear() const { gw.clear(); }
   683     
   684 //     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> { 
   685 //     public:
   686 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) : 
   687 // 	GraphWrapper::NodeMap<T>(_G.gw) { }
   688 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) : 
   689 // 	GraphWrapper::NodeMap<T>(_G.gw, a) { }
   690 //     };
   691 
   692 //     template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> { 
   693 //     public:
   694 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) : 
   695 // 	GraphWrapper::EdgeMap<T>(_G.gw) { }
   696 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) : 
   697 // 	GraphWrapper::EdgeMap<T>(_G.gw, a) { }
   698 //     };
   699 //   };
   700 
   701 
   702   template<typename Graph>
   703   class UndirGraphWrapper : public GraphWrapper<Graph> {
   704   protected:
   705     typedef typename Graph::Edge GraphEdge;
   706     typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
   707     typedef typename Graph::InEdgeIt GraphInEdgeIt;    
   708   public:
   709     typedef typename GraphWrapper<Graph>::Node Node;
   710     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
   711 
   712 //     UndirGraphWrapper() : GraphWrapper<Graph>() { }
   713     UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }  
   714 
   715     class Edge {
   716       friend class UndirGraphWrapper<Graph>;
   717     protected:
   718       bool out_or_in; //true iff out
   719       GraphOutEdgeIt out;
   720       GraphInEdgeIt in;
   721     public:
   722       Edge() : out_or_in(), out(), in() { }
   723       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
   724       operator GraphEdge() const {
   725 	if (out_or_in) return(out); else return(in);
   726       }
   727 //FIXME
   728 //2 edges are equal if they "refer" to the same physical edge 
   729 //is it good?
   730       friend bool operator==(const Edge& u, const Edge& v) { 
   731 	if (v.out_or_in) 
   732 	  if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in);
   733 	//return (u.out_or_in && u.out==v.out);
   734 	else
   735 	  if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in);
   736 	//return (!u.out_or_in && u.in==v.in);
   737       } 
   738       friend bool operator!=(const Edge& u, const Edge& v) { 
   739 	if (v.out_or_in) 
   740 	  if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in);
   741 	//return (!u.out_or_in || u.out!=v.out);
   742 	else
   743 	  if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in);
   744 	//return (u.out_or_in || u.in!=v.in);
   745       } 
   746     };
   747 
   748     class OutEdgeIt : public Edge {
   749       friend class UndirGraphWrapper<Graph>;
   750     public:
   751       OutEdgeIt() : Edge() { }
   752       OutEdgeIt(const Invalid& i) : Edge(i) { }
   753       OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& n) 
   754 	: Edge() { 
   755 	out_or_in=true; _G.graph->first(out, n);
   756 	if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, n);	}
   757       }
   758     };
   759 
   760     typedef OutEdgeIt InEdgeIt; 
   761 
   762     class EdgeIt : public Edge {
   763       friend class UndirGraphWrapper<Graph>;
   764     protected:
   765       NodeIt v;
   766     public:
   767       EdgeIt() : Edge() { }
   768       EdgeIt(const Invalid& i) : Edge(i) { }
   769       EdgeIt(const UndirGraphWrapper<Graph>& _G) 
   770 	: Edge() { 
   771 	out_or_in=true;
   772 	//Node v;
   773 	_G.first(v);
   774 	if (_G.valid(v)) _G.graph->first(out); else out=INVALID;
   775 	while (_G.valid(v) && !_G.graph->valid(out)) { 
   776 	  _G.graph->next(v); 
   777 	  if (_G.valid(v)) _G.graph->first(out); 
   778 	}
   779       }
   780     };
   781 
   782     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
   783       e.out_or_in=true; graph->first(e.out, n);
   784       if (!(graph->valid(e.out))) { e.out_or_in=false; graph->first(e.in, n); }
   785       return e;
   786     }
   787 
   788     EdgeIt& first(EdgeIt& e) const {
   789       e.out_or_in=true;
   790       //NodeIt v;
   791       first(e.v);
   792       if (valid(e.v)) graph->first(e.out, e.v); else e.out=INVALID;
   793       while (valid(e.v) && !graph->valid(e.out)) { 
   794 	graph->next(e.v); 
   795 	if (valid(e.v)) graph->first(e.out, e.v); 
   796       }
   797       return e;
   798     }
   799 
   800     template<typename I> I& first(I& i) const { graph->first(i); return i; }
   801     template<typename I, typename P> I& first(I& i, const P& p) const { 
   802       graph->first(i, p); return i; }
   803 
   804     OutEdgeIt& next(OutEdgeIt& e) const {
   805       if (e.out_or_in) {
   806 	Node n=graph->tail(e.out);
   807 	graph->next(e.out);
   808 	if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
   809       } else {
   810 	graph->next(e.in);
   811       }
   812       return e;
   813     }
   814 
   815     EdgeIt& next(EdgeIt& e) const {
   816       //NodeIt v=tail(e);
   817       graph->next(e.out);
   818       while (valid(e.v) && !graph->valid(e.out)) { 
   819 	next(e.v); 
   820 	if (valid(e.v)) graph->first(e.out, e.v); 
   821       }
   822       return e;
   823     }
   824 
   825     template<typename I> I& next(I &i) const { graph->next(i); return i; }    
   826 //    template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
   827 
   828     template< typename It > It first() const { 
   829       It e; this->first(e); return e; }
   830 
   831     template< typename It > It first(const Node& v) const { 
   832       It e; this->first(e, v); return e; }
   833 
   834 //    Node head(const Edge& e) const { return gw.head(e); }
   835 //    Node tail(const Edge& e) const { return gw.tail(e); }
   836 
   837 //    template<typename I> bool valid(const I& i) const 
   838 //      { return gw.valid(i); }
   839   
   840 //    int nodeNum() const { return gw.nodeNum(); }
   841 //    int edgeNum() const { return gw.edgeNum(); }
   842   
   843 //     template<typename I> Node aNode(const I& e) const { 
   844 //       return graph->aNode(e); }
   845 //     template<typename I> Node bNode(const I& e) const { 
   846 //       return graph->bNode(e); }
   847 
   848     Node aNode(const OutEdgeIt& e) const { 
   849       if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
   850     Node bNode(const OutEdgeIt& e) const { 
   851       if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
   852   
   853 //    Node addNode() const { return gw.addNode(); }
   854 
   855 // FIXME: ez igy nem jo, mert nem
   856 //    Edge addEdge(const Node& tail, const Node& head) const { 
   857 //      return graph->addEdge(tail, head); }
   858   
   859 //    template<typename I> void erase(const I& i) const { gw.erase(i); }
   860   
   861 //    void clear() const { gw.clear(); }
   862     
   863 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   864 //     public:
   865 //       NodeMap(const UndirGraphWrapper<Graph>& _G) : 
   866 // 	Graph::NodeMap<T>(_G.gw) { }
   867 //       NodeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
   868 // 	Graph::NodeMap<T>(_G.gw, a) { }
   869 //     };
   870 
   871 //     template<typename T> class EdgeMap : 
   872 //       public GraphWrapperSkeleton<Graph>::EdgeMap<T> { 
   873 //     public:
   874 //       EdgeMap(const UndirGraphWrapper<Graph>& _G) : 
   875 // 	GraphWrapperSkeleton<Graph>::EdgeMap<T>(_G.gw) { }
   876 //       EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
   877 // 	Graph::EdgeMap<T>(_G.gw, a) { }
   878 //     };
   879    };
   880 
   881 
   882 
   883 
   884 
   885 //   template<typename Graph>
   886 //   class SymGraphWrapper
   887 //   {
   888 //     Graph* graph;
   889   
   890 //   public:
   891 //     typedef Graph ParentGraph;
   892 
   893 //     typedef typename Graph::Node Node;
   894 //     typedef typename Graph::Edge Edge;
   895   
   896 //     typedef typename Graph::NodeIt NodeIt;
   897     
   898 //     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
   899 //     //iranyitatlant, ami van
   900 //     //mert csak 1 dolgot lehet be typedef-elni
   901 //     typedef typename Graph::OutEdgeIt SymEdgeIt;
   902 //     //typedef typename Graph::InEdgeIt SymEdgeIt;
   903 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   904 //     typedef typename Graph::EdgeIt EdgeIt;
   905 
   906 //     int nodeNum() const { return graph->nodeNum(); }
   907 //     int edgeNum() const { return graph->edgeNum(); }
   908     
   909 //     template<typename I> I& first(I& i) const { return graph->first(i); }
   910 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   911 //       return graph->first(i, p); }
   912 //     //template<typename I> I next(const I i); { return graph->goNext(i); }
   913 //     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
   914 
   915 //     template< typename It > It first() const { 
   916 //       It e; first(e); return e; }
   917 
   918 //     template< typename It > It first(Node v) const { 
   919 //       It e; first(e, v); return e; }
   920 
   921 //     Node head(const Edge& e) const { return graph->head(e); }
   922 //     Node tail(const Edge& e) const { return graph->tail(e); }
   923   
   924 //     template<typename I> Node aNode(const I& e) const { 
   925 //       return graph->aNode(e); }
   926 //     template<typename I> Node bNode(const I& e) const { 
   927 //       return graph->bNode(e); }
   928   
   929 //     //template<typename I> bool valid(const I i);
   930 //     //{ return graph->valid(i); }
   931   
   932 //     //template<typename I> void setInvalid(const I &i);
   933 //     //{ return graph->setInvalid(i); }
   934   
   935 //     Node addNode() { return graph->addNode(); }
   936 //     Edge addEdge(const Node& tail, const Node& head) { 
   937 //       return graph->addEdge(tail, head); }
   938   
   939 //     template<typename I> void erase(const I& i) { graph->erase(i); }
   940   
   941 //     void clear() { graph->clear(); }
   942   
   943 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { };
   944 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
   945   
   946 //     void setGraph(Graph& _graph) { graph = &_graph; }
   947 //     Graph& getGraph() { return (*graph); }
   948 
   949 //     //SymGraphWrapper() : graph(0) { }
   950 //     SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
   951 //   };
   952 
   953 
   954   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   955   class ResGraphWrapper : public GraphWrapper<Graph> {
   956   protected:
   957     typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
   958     typedef typename Graph::InEdgeIt GraphInEdgeIt;
   959     typedef typename Graph::Edge GraphEdge;
   960     FlowMap* flow;
   961     const CapacityMap* capacity;
   962   public:
   963 
   964     ResGraphWrapper(Graph& _graph, FlowMap& _flow, 
   965 		    const CapacityMap& _capacity) : 
   966       GraphWrapper<Graph>(_graph), flow(&_flow), capacity(&_capacity) { }
   967 
   968     class Edge; 
   969     class OutEdgeIt; 
   970     friend class Edge; 
   971     friend class OutEdgeIt; 
   972 
   973     typedef typename GraphWrapper<Graph>::Node Node;
   974     typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
   975     class Edge {
   976       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
   977     protected:
   978       bool out_or_in; //true, iff out
   979       GraphOutEdgeIt out;
   980       GraphInEdgeIt in;
   981     public:
   982       Edge() : out_or_in(true) { } 
   983       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
   984 //       bool valid() const { 
   985 // 	return out_or_in && out.valid() || in.valid(); }
   986       friend bool operator==(const Edge& u, const Edge& v) { 
   987 	if (v.out_or_in) 
   988 	  return (u.out_or_in && u.out==v.out);
   989 	else
   990 	  return (!u.out_or_in && u.in==v.in);
   991       } 
   992       friend bool operator!=(const Edge& u, const Edge& v) { 
   993 	if (v.out_or_in) 
   994 	  return (!u.out_or_in || u.out!=v.out);
   995 	else
   996 	  return (u.out_or_in || u.in!=v.in);
   997       } 
   998       operator GraphEdge() const {
   999 	if (out_or_in) return(out); else return(in);
  1000       }
  1001     };
  1002     class OutEdgeIt : public Edge {
  1003       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
  1004     public:
  1005       OutEdgeIt() { }
  1006       //FIXME
  1007       OutEdgeIt(const Edge& e) : Edge(e) { }
  1008       OutEdgeIt(const Invalid& i) : Edge(i) { }
  1009       OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() { 
  1010 	resG.graph->first(out, v);
  1011 	while( resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
  1012 	if (!resG.graph->valid(out)) {
  1013 	  out_or_in=0;
  1014 	  resG.graph->first(in, v);
  1015 	  while( resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
  1016 	}
  1017       }
  1018 //     public:
  1019 //       OutEdgeIt& operator++() { 
  1020 // 	if (out_or_in) {
  1021 // 	  Node v=/*resG->*/G->aNode(out);
  1022 // 	  ++out;
  1023 // 	  while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
  1024 // 	  if (!out.valid()) {
  1025 // 	    out_or_in=0;
  1026 // 	    G->first(in, v); 
  1027 // 	    while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
  1028 // 	  }
  1029 // 	} else {
  1030 // 	  ++in;
  1031 // 	  while( in.valid() && !(Edge::resCap()>0) ) { ++in; } 
  1032 // 	}
  1033 // 	return *this; 
  1034 //       }
  1035     };
  1036 
  1037     //FIXME This is just for having InEdgeIt
  1038 //    class InEdgeIt : public Edge { };
  1039 
  1040     class EdgeIt : public Edge {
  1041       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
  1042       NodeIt v; 
  1043     public:
  1044       EdgeIt() { }
  1045       //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
  1046       EdgeIt(const Invalid& i) : Edge(i) { }
  1047       EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() { 
  1048 	resG.graph->first(v);
  1049 	if (resG.graph->valid(v)) resG.graph->first(out, v); else out=INVALID;
  1050 	while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
  1051 	while (resG.graph->valid(v) && !resG.graph->valid(out)) { 
  1052 	  resG.graph->next(v); 
  1053 	  if (resG.graph->valid(v)) resG.graph->first(out, v); 
  1054 	  while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
  1055 	}
  1056 	if (!resG.graph->valid(out)) {
  1057 	  out_or_in=0;
  1058 	  resG.graph->first(v);
  1059 	  if (resG.graph->valid(v)) resG.graph->first(in, v); else in=INVALID;
  1060 	  while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
  1061 	  while (resG.graph->valid(v) && !resG.graph->valid(in)) { 
  1062 	    resG.graph->next(v); 
  1063 	    if (resG.graph->valid(v)) resG.graph->first(in, v); 
  1064 	    while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
  1065 	  }
  1066 	}
  1067       }
  1068 //       EdgeIt& operator++() { 
  1069 // 	if (out_or_in) {
  1070 // 	  ++out;
  1071 // 	  while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
  1072 // 	  while (v.valid() && !out.valid()) { 
  1073 // 	    ++v; 
  1074 // 	    if (v.valid()) G->first(out, v); 
  1075 // 	    while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
  1076 // 	  }
  1077 // 	  if (!out.valid()) {
  1078 // 	    out_or_in=0;
  1079 // 	    G->first(v);
  1080 // 	    if (v.valid()) G->first(in, v); else in=GraphInEdgeIt();
  1081 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
  1082 // 	    while (v.valid() && !in.valid()) { 
  1083 // 	      ++v; 
  1084 // 	      if (v.valid()) G->first(in, v); 
  1085 // 	      while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
  1086 // 	    }  
  1087 // 	  }
  1088 // 	} else {
  1089 // 	  ++in;
  1090 // 	  while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
  1091 // 	  while (v.valid() && !in.valid()) { 
  1092 // 	    ++v; 
  1093 // 	    if (v.valid()) G->first(in, v); 
  1094 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
  1095 // 	  }
  1096 // 	}
  1097 // 	return *this;
  1098 //       }
  1099     };
  1100 
  1101     NodeIt& first(NodeIt& i) const { 
  1102       i=NodeIt(*this); 
  1103       return i; 
  1104     }
  1105     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { 
  1106       i=OutEdgeIt(*this, p);
  1107       return i;
  1108     }
  1109     //FIXME Not yet implemented
  1110     //InEdgeIt& first(InEdgeIt& i, const Node& p) const {
  1111     //i=InEdgeIt(*this, p);
  1112     //  return i;
  1113     //}
  1114     EdgeIt& first(EdgeIt& e) const { 
  1115       e=EdgeIt(*this); 
  1116       return e;
  1117     }
  1118    
  1119     NodeIt& next(NodeIt& n) const { graph->next(n); return n; }
  1120     OutEdgeIt& next(OutEdgeIt& e) const { 
  1121       if (e.out_or_in) {
  1122 	Node v=graph->aNode(e.out);
  1123 	graph->next(e.out);
  1124 	while( graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
  1125 	if (!graph->valid(e.out)) {
  1126 	  e.out_or_in=0;
  1127 	  graph->first(e.in, v); 
  1128 	  while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
  1129 	}
  1130       } else {
  1131 	graph->next(e.in);
  1132 	while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); } 
  1133       }
  1134       return e;
  1135     }
  1136     //FIXME Not yet implemented
  1137     //InEdgeIt& next(InEdgeIt& e) const {
  1138     //  return e;
  1139     //}
  1140     EdgeIt& next(EdgeIt& e) const { 
  1141       if (e.out_or_in) {
  1142 	graph->next(e.out);
  1143 	while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
  1144 	  while (graph->valid(e.v) && !graph->valid(e.out)) { 
  1145 	    graph->next(e.v); 
  1146 	    if (graph->valid(e.v)) graph->first(e.out, e.v); 
  1147 	    while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
  1148 	  }
  1149 	  if (!graph->valid(e.out)) {
  1150 	    e.out_or_in=0;
  1151 	    graph->first(e.v);
  1152 	    if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=INVALID;
  1153 	    while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
  1154 	    while (graph->valid(e.v) && !graph->valid(e.in)) { 
  1155 	      graph->next(e.v); 
  1156 	      if (graph->valid(e.v)) graph->first(e.in, e.v); 
  1157 	      while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
  1158 	    }  
  1159 	  }
  1160 	} else {
  1161 	  graph->next(e.in);
  1162 	  while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
  1163 	  while (graph->valid(e.v) && !graph->valid(e.in)) { 
  1164 	    graph->next(e.v); 
  1165 	    if (graph->valid(e.v)) graph->first(e.in, e.v); 
  1166 	    while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
  1167 	  }
  1168 	}
  1169 	return e;
  1170       }
  1171     
  1172 
  1173     template< typename It >
  1174     It first() const { 
  1175       It e;
  1176       first(e);
  1177       return e; 
  1178     }
  1179 
  1180     template< typename It >
  1181     It first(Node v) const { 
  1182       It e;
  1183       first(e, v);
  1184       return e; 
  1185     }
  1186 
  1187     Node tail(Edge e) const { 
  1188       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
  1189     Node head(Edge e) const { 
  1190       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
  1191 
  1192     Node aNode(OutEdgeIt e) const { 
  1193       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
  1194     Node bNode(OutEdgeIt e) const { 
  1195       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
  1196 
  1197     int nodeNum() const { return graph->nodeNum(); }
  1198     //FIXME
  1199     //int edgeNum() const { return graph->edgeNum(); }
  1200 
  1201 
  1202     int id(Node v) const { return graph->id(v); }
  1203 
  1204     bool valid(Node n) const { return graph->valid(n); }
  1205     bool valid(Edge e) const { 
  1206       return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
  1207 
  1208     void augment(const Edge& e, Number a) const {
  1209       if (e.out_or_in)  
  1210 // 	flow->set(e.out, flow->get(e.out)+a);
  1211 	flow->set(e.out, (*flow)[e.out]+a);
  1212       else  
  1213 // 	flow->set(e.in, flow->get(e.in)-a);
  1214 	flow->set(e.in, (*flow)[e.in]-a);
  1215     }
  1216 
  1217     Number resCap(const Edge& e) const { 
  1218       if (e.out_or_in) 
  1219 //	return (capacity->get(e.out)-flow->get(e.out)); 
  1220 	return ((*capacity)[e.out]-(*flow)[e.out]); 
  1221       else 
  1222 //	return (flow->get(e.in)); 
  1223 	return ((*flow)[e.in]); 
  1224     }
  1225 
  1226     Number resCap(GraphOutEdgeIt out) const { 
  1227 //      return (capacity->get(out)-flow->get(out)); 
  1228       return ((*capacity)[out]-(*flow)[out]); 
  1229     }
  1230     
  1231     Number resCap(GraphInEdgeIt in) const { 
  1232 //      return (flow->get(in)); 
  1233       return ((*flow)[in]); 
  1234     }
  1235 
  1236 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
  1237 //     public:
  1238 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) 
  1239 // 	: Graph::NodeMap<T>(_G.gw) { }
  1240 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, 
  1241 // 	      T a) : Graph::NodeMap<T>(_G.gw, a) { }
  1242 //     };
  1243 
  1244 //     template <typename T>
  1245 //     class NodeMap {
  1246 //       typename Graph::NodeMap<T> node_map; 
  1247 //     public:
  1248 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
  1249 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
  1250 //       void set(Node nit, T a) { node_map.set(nit, a); }
  1251 //       T get(Node nit) const { return node_map.get(nit); }
  1252 //     };
  1253 
  1254     template <typename T>
  1255     class EdgeMap {
  1256       typename Graph::EdgeMap<T> forward_map, backward_map; 
  1257     public:
  1258       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
  1259       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
  1260       void set(Edge e, T a) { 
  1261 	if (e.out_or_in) 
  1262 	  forward_map.set(e.out, a); 
  1263 	else 
  1264 	  backward_map.set(e.in, a); 
  1265       }
  1266       T operator[](Edge e) const { 
  1267 	if (e.out_or_in) 
  1268 	  return forward_map[e.out]; 
  1269 	else 
  1270 	  return backward_map[e.in]; 
  1271       }
  1272 //       T get(Edge e) const { 
  1273 // 	if (e.out_or_in) 
  1274 // 	  return forward_map.get(e.out); 
  1275 // 	else 
  1276 // 	  return backward_map.get(e.in); 
  1277 //       }
  1278     };
  1279   };
  1280 
  1281   //ErasingFirstGraphWrapper for blocking flows
  1282   template<typename Graph, typename FirstOutEdgesMap>
  1283   class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
  1284   protected:
  1285     FirstOutEdgesMap* first_out_edges;
  1286   public:
  1287     ErasingFirstGraphWrapper(Graph& _graph, 
  1288 			     FirstOutEdgesMap& _first_out_edges) : 
  1289       GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }  
  1290 
  1291     typedef typename Graph::Node Node;
  1292     class NodeIt : public Graph::NodeIt { 
  1293     public:
  1294       NodeIt() { }
  1295       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
  1296       NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
  1297       NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
  1298 	Graph::NodeIt(*(_G.graph)) { }
  1299     };
  1300     typedef typename Graph::Edge Edge;
  1301     class OutEdgeIt : public Graph::OutEdgeIt { 
  1302     public:
  1303       OutEdgeIt() { }
  1304       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
  1305       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
  1306       OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
  1307 		const Node& n) : 
  1308 	Graph::OutEdgeIt((*_G.first_out_edges)[n]) { }
  1309     };
  1310     class InEdgeIt : public Graph::InEdgeIt { 
  1311     public:
  1312       InEdgeIt() { }
  1313       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
  1314       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
  1315       InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G, 
  1316 	       const Node& n) : 
  1317 	Graph::InEdgeIt(*(_G.graph), n) { }
  1318     };
  1319     //typedef typename Graph::SymEdgeIt SymEdgeIt;
  1320     class EdgeIt : public Graph::EdgeIt { 
  1321     public:
  1322       EdgeIt() { }
  1323       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
  1324       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
  1325       EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) : 
  1326 	Graph::EdgeIt(*(_G.graph)) { }
  1327     };
  1328 
  1329     NodeIt& first(NodeIt& i) const {
  1330       i=NodeIt(*this);
  1331       return i;
  1332     }
  1333     OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
  1334       i=OutEdgeIt(*this, n);
  1335 //      i=(*first_out_edges)[n];
  1336       return i;
  1337     }
  1338     InEdgeIt& first(InEdgeIt& i, const Node& n) const {
  1339       i=InEdgeIt(*this, n);
  1340       return i;
  1341     }
  1342     EdgeIt& first(EdgeIt& i) const {
  1343       i=EdgeIt(*this);
  1344       return i;
  1345     }
  1346 
  1347 //     template<typename I> I& first(I& i) const { 
  1348 //       graph->first(i); 
  1349 //       return i;
  1350 //     }
  1351 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
  1352 // //      e=first_out_edges->get(n);
  1353 //       e=(*first_out_edges)[n];
  1354 //       return e;
  1355 //     }
  1356 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
  1357 //       graph->first(i, p); 
  1358 //       return i;
  1359 //     }
  1360     
  1361     //template<typename I> I getNext(const I& i) const { 
  1362     //  return gw.getNext(i); 
  1363     //}
  1364 
  1365 
  1366     NodeIt& next(NodeIt& i) const {
  1367       graph->next(i); 
  1368       return i;
  1369     }
  1370     OutEdgeIt& next(OutEdgeIt& i) const {
  1371       graph->next(i); 
  1372       return i;
  1373     }
  1374     InEdgeIt& next(InEdgeIt& i) const {
  1375       graph->next(i); 
  1376       return i;
  1377     }
  1378     EdgeIt& next(EdgeIt& i) const {
  1379       graph->next(i); 
  1380       return i;
  1381     }
  1382 
  1383 //     template<typename I> I& next(I &i) const { 
  1384 //       graph->next(i); 
  1385 //       return i;
  1386 //     }
  1387     
  1388     template< typename It > It first() const { 
  1389       It e; this->first(e); return e; }
  1390     
  1391     template< typename It > It first(const Node& v) const { 
  1392       It e; this->first(e, v); return e; }
  1393 
  1394     void erase(const OutEdgeIt& e) const {
  1395       OutEdgeIt f=e;
  1396       this->next(f);
  1397       first_out_edges->set(this->tail(e), f);
  1398     }
  1399   };
  1400 
  1401 // // FIXME: comparison should be made better!!!
  1402 //   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
  1403 //   class ResGraphWrapper
  1404 //   {
  1405 //     Graph* graph;
  1406   
  1407 //   public:
  1408 //     typedef Graph ParentGraph;
  1409 
  1410 //     typedef typename Graph::Node Node;
  1411 //     typedef typename Graph::Edge Edge;
  1412   
  1413 //     typedef typename Graph::NodeIt NodeIt;
  1414    
  1415 //     class OutEdgeIt {
  1416 //     public:
  1417 //       //Graph::Node n;
  1418 //       bool out_or_in;
  1419 //       typename Graph::OutEdgeIt o;
  1420 //       typename Graph::InEdgeIt i;   
  1421 //     };
  1422 //     class InEdgeIt {
  1423 //     public:
  1424 //       //Graph::Node n;
  1425 //       bool out_or_in;
  1426 //       typename Graph::OutEdgeIt o;
  1427 //       typename Graph::InEdgeIt i;   
  1428 //     };
  1429 //     typedef typename Graph::SymEdgeIt SymEdgeIt;
  1430 //     typedef typename Graph::EdgeIt EdgeIt;
  1431 
  1432 //     int nodeNum() const { return gw.nodeNum(); }
  1433 //     int edgeNum() const { return gw.edgeNum(); }
  1434 
  1435 //     Node& first(Node& n) const { return gw.first(n); }
  1436 
  1437 //     // Edge and SymEdge  is missing!!!!
  1438 //     // Edge <-> In/OutEdgeIt conversion is missing!!!!
  1439 
  1440 //     //FIXME
  1441 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const 
  1442 //       {
  1443 // 	e.n=n;
  1444 // 	gw.first(e.o,n);
  1445 // 	while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
  1446 // 	  gw.goNext(e.o);
  1447 // 	if(!gw.valid(e.o)) {
  1448 // 	  gw.first(e.i,n);
  1449 // 	  while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
  1450 // 	    gw.goNext(e.i);
  1451 // 	}
  1452 // 	return e;
  1453 //       }
  1454 // /*
  1455 //   OutEdgeIt &goNext(OutEdgeIt &e)
  1456 //   {
  1457 //   if(gw.valid(e.o)) {
  1458 //   while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
  1459 //   gw.goNext(e.o);
  1460 //   if(gw.valid(e.o)) return e;
  1461 //   else gw.first(e.i,e.n);
  1462 //   }
  1463 //   else {
  1464 //   while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
  1465 //   gw.goNext(e.i);
  1466 //   return e;
  1467 //   }
  1468 //   }
  1469 //   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
  1470 // */
  1471 //     //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);}
  1472 
  1473 //     //FIXME
  1474 //     InEdgeIt& first(InEdgeIt& e, const Node& n) const 
  1475 //       {
  1476 // 	e.n=n;
  1477 // 	gw.first(e.i,n);
  1478 // 	while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
  1479 // 	  gw.goNext(e.i);
  1480 // 	if(!gw.valid(e.i)) {
  1481 // 	  gw.first(e.o,n);
  1482 // 	  while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
  1483 // 	    gw.goNext(e.o);
  1484 // 	}
  1485 // 	return e;
  1486 //       }
  1487 // /*
  1488 //   InEdgeIt &goNext(InEdgeIt &e)
  1489 //   {
  1490 //   if(gw.valid(e.i)) {
  1491 //   while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
  1492 //   gw.goNext(e.i);
  1493 //   if(gw.valid(e.i)) return e;
  1494 //   else gw.first(e.o,e.n);
  1495 //   }
  1496 //   else {
  1497 //   while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
  1498 //   gw.goNext(e.o);
  1499 //   return e;
  1500 //   }
  1501 //   }
  1502 //   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
  1503 // */
  1504 //     //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);}
  1505 
  1506 //     //template<typename I> I &goNext(I &i); { return gw.goNext(i); }
  1507 //     //template<typename I> I next(const I i); { return gw.goNext(i); }
  1508 
  1509 //     template< typename It > It first() const { 
  1510 //       It e; first(e); return e; }
  1511 
  1512 //     template< typename It > It first(Node v) const { 
  1513 //       It e; first(e, v); return e; }
  1514 
  1515 //     Node head(const Edge& e) const { return gw.head(e); }
  1516 //     Node tail(const Edge& e) const { return gw.tail(e); }
  1517   
  1518 //     template<typename I> Node aNode(const I& e) const { 
  1519 //       return gw.aNode(e); }
  1520 //     template<typename I> Node bNode(const I& e) const { 
  1521 //       return gw.bNode(e); }
  1522   
  1523 //     //template<typename I> bool valid(const I i);
  1524 //     //{ return gw.valid(i); }
  1525   
  1526 //     //template<typename I> void setInvalid(const I &i);
  1527 //     //{ return gw.setInvalid(i); }
  1528   
  1529 //     Node addNode() { return gw.addNode(); }
  1530 //     Edge addEdge(const Node& tail, const Node& head) { 
  1531 //       return gw.addEdge(tail, head); }
  1532   
  1533 //     template<typename I> void erase(const I& i) { gw.erase(i); }
  1534   
  1535 //     void clear() { gw.clear(); }
  1536   
  1537 //     template<typename S> class NodeMap : public Graph::NodeMap<S> { };
  1538 //     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
  1539   
  1540 //     void setGraph(Graph& _graph) { graph = &_graph; }
  1541 //     Graph& getGraph() { return (*graph); }
  1542 
  1543 //     //ResGraphWrapper() : graph(0) { }
  1544 //     ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
  1545 //   };
  1546 
  1547 } //namespace hugo
  1548 
  1549 #endif //HUGO_GRAPH_WRAPPER_H
  1550