src/work/marci/graph_wrapper.h
author marci
Mon, 22 Mar 2004 16:37:10 +0000
changeset 234 348f8fd374ee
parent 231 f62f11c9e6df
child 235 aa50acc936dc
permissions -rw-r--r--
RevGraphWrapper
     1 // -*- c++ -*-
     2 #ifndef GRAPH_WRAPPER_H
     3 #define 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 
    17     typedef typename Graph::Node Node;
    18     typedef typename Graph::NodeIt NodeIt;
    19 
    20     typedef typename Graph::Edge Edge;
    21     typedef typename Graph::OutEdgeIt OutEdgeIt;
    22     typedef typename Graph::InEdgeIt InEdgeIt;
    23     //typedef typename Graph::SymEdgeIt SymEdgeIt;
    24     typedef typename Graph::EdgeIt EdgeIt;
    25 
    26     //TrivGraphWrapper() : graph(0) { }
    27     TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
    28 
    29     void setGraph(Graph& _graph) { graph = &_graph; }
    30     Graph& getGraph() const { return (*graph); }
    31     
    32     template<typename I> I& first(I& i) const { return graph->first(i); }
    33     template<typename I, typename P> I& first(I& i, const P& p) const { 
    34       return graph->first(i, p); }
    35     
    36     template<typename I> I getNext(const I& i) const { 
    37       return graph->getNext(i); }
    38     template<typename I> I& next(I &i) const { return graph->next(i); }    
    39 
    40     template< typename It > It first() const { 
    41       It e; first(e); return e; }
    42 
    43     template< typename It > It first(const Node& v) const { 
    44       It e; first(e, v); return e; }
    45 
    46     Node head(const Edge& e) const { return graph->head(e); }
    47     Node tail(const Edge& e) const { return graph->tail(e); }
    48 
    49     template<typename I> bool valid(const I& i) const 
    50       { return graph->valid(i); }
    51   
    52     //template<typename I> void setInvalid(const I &i);
    53     //{ return graph->setInvalid(i); }
    54 
    55     int nodeNum() const { return graph->nodeNum(); }
    56     int edgeNum() const { return graph->edgeNum(); }
    57   
    58     template<typename I> Node aNode(const I& e) const { 
    59       return graph->aNode(e); }
    60     template<typename I> Node bNode(const I& e) const { 
    61       return graph->bNode(e); }
    62   
    63     Node addNode() const { return graph->addNode(); }
    64     Edge addEdge(const Node& tail, const Node& head) const { 
    65       return graph->addEdge(tail, head); }
    66   
    67     template<typename I> void erase(const I& i) const { graph->erase(i); }
    68   
    69     void clear() const { graph->clear(); }
    70     
    71     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
    72     public:
    73       NodeMap(const TrivGraphWrapper<Graph>& _G) : 
    74 	Graph::NodeMap<T>(_G.getGraph()) { }
    75       NodeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
    76 	Graph::NodeMap<T>(_G.getGraph(), a) { }
    77     };
    78 
    79     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
    80     public:
    81       EdgeMap(const TrivGraphWrapper<Graph>& _G) : 
    82 	Graph::EdgeMap<T>(_G.getGraph()) { }
    83       EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) : 
    84 	Graph::EdgeMap<T>(_G.getGraph(), a) { }
    85     };
    86   };
    87 
    88   template<typename GraphWrapper>
    89   class GraphWrapperSkeleton {
    90   protected:
    91     GraphWrapper gw;
    92   
    93   public:
    94     typedef typename GraphWrapper::BaseGraph BaseGraph;
    95 
    96     typedef typename GraphWrapper::Node Node;
    97     typedef typename GraphWrapper::NodeIt NodeIt;
    98 
    99     typedef typename GraphWrapper::Edge Edge;
   100     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
   101     typedef typename GraphWrapper::InEdgeIt InEdgeIt;
   102     //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt;
   103     typedef typename GraphWrapper::EdgeIt EdgeIt;
   104 
   105     //GraphWrapperSkeleton() : gw() { }
   106     GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { }
   107 
   108     void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); }
   109     BaseGraph& getGraph() const { return gw.getGraph(); }
   110     
   111     template<typename I> I& first(I& i) const { return gw.first(i); }
   112     template<typename I, typename P> I& first(I& i, const P& p) const { 
   113       return gw.first(i, p); }
   114     
   115     template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
   116     template<typename I> I& next(I &i) const { return gw.next(i); }    
   117 
   118     template< typename It > It first() const { 
   119       It e; this->first(e); return e; }
   120 
   121     template< typename It > It first(const Node& v) const { 
   122       It e; this->first(e, v); return e; }
   123 
   124     Node head(const Edge& e) const { return gw.head(e); }
   125     Node tail(const Edge& e) const { return gw.tail(e); }
   126 
   127     template<typename I> bool valid(const I& i) const { return gw.valid(i); }
   128   
   129     //template<typename I> void setInvalid(const I &i);
   130     //{ return graph->setInvalid(i); }
   131 
   132     int nodeNum() const { return gw.nodeNum(); }
   133     int edgeNum() const { return gw.edgeNum(); }
   134   
   135     template<typename I> Node aNode(const I& e) const { return gw.aNode(e); }
   136     template<typename I> Node bNode(const I& e) const { return gw.bNode(e); }
   137   
   138     Node addNode() const { return gw.addNode(); }
   139     Edge addEdge(const Node& tail, const Node& head) const { 
   140       return gw.addEdge(tail, head); }
   141   
   142     template<typename I> void erase(const I& i) const { gw.erase(i); }
   143   
   144     void clear() const { gw.clear(); }
   145     
   146     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> { 
   147     public:
   148       NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) : 
   149 	GraphWrapper::NodeMap<T>(_G.gw) { }
   150       NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) : 
   151 	GraphWrapper::NodeMap<T>(_G.gw, a) { }
   152     };
   153 
   154     template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> { 
   155     public:
   156       EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) : 
   157 	GraphWrapper::EdgeMap<T>(_G.gw) { }
   158       EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) : 
   159 	GraphWrapper::EdgeMap<T>(_G.gw, a) { }
   160     };
   161   };
   162 
   163 //   template<typename Graph>
   164 //   class RevGraphWrapper
   165 //   {
   166 //   protected:
   167 //     Graph* graph;
   168   
   169 //   public:
   170 //     typedef Graph BaseGraph;
   171 
   172 //     typedef typename Graph::Node Node;    
   173 //     typedef typename Graph::NodeIt NodeIt;
   174   
   175 //     typedef typename Graph::Edge Edge;
   176 //     typedef typename Graph::OutEdgeIt InEdgeIt;
   177 //     typedef typename Graph::InEdgeIt OutEdgeIt;
   178 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   179 //     typedef typename Graph::EdgeIt EdgeIt;
   180 
   181 //     //RevGraphWrapper() : graph(0) { }
   182 //     RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
   183 
   184 //     void setGraph(Graph& _graph) { graph = &_graph; }
   185 //     Graph& getGraph() const { return (*graph); }
   186     
   187 //     template<typename I> I& first(I& i) const { return graph->first(i); }
   188 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   189 //       return graph->first(i, p); }
   190 
   191 //     template<typename I> I getNext(const I& i) const { 
   192 //       return graph->getNext(i); }
   193 //     template<typename I> I& next(I &i) const { return graph->next(i); }    
   194 
   195 //     template< typename It > It first() const { 
   196 //       It e; first(e); return e; }
   197 
   198 //     template< typename It > It first(const Node& v) const { 
   199 //       It e; first(e, v); return e; }
   200 
   201 //     Node head(const Edge& e) const { return graph->tail(e); }
   202 //     Node tail(const Edge& e) const { return graph->head(e); }
   203   
   204 //     template<typename I> bool valid(const I& i) const 
   205 //       { return graph->valid(i); }
   206   
   207 //     //template<typename I> void setInvalid(const I &i);
   208 //     //{ return graph->setInvalid(i); }
   209   
   210 //     template<typename I> Node aNode(const I& e) const { 
   211 //       return graph->aNode(e); }
   212 //     template<typename I> Node bNode(const I& e) const { 
   213 //       return graph->bNode(e); }
   214 
   215 //     Node addNode() const { return graph->addNode(); }
   216 //     Edge addEdge(const Node& tail, const Node& head) const { 
   217 //       return graph->addEdge(tail, head); }
   218   
   219 //     int nodeNum() const { return graph->nodeNum(); }
   220 //     int edgeNum() const { return graph->edgeNum(); }
   221   
   222 //     template<typename I> void erase(const I& i) const { graph->erase(i); }
   223   
   224 //     void clear() const { graph->clear(); }
   225 
   226 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   227 //     public:
   228 //       NodeMap(const RevGraphWrapper<Graph>& _G) : 
   229 // 	Graph::NodeMap<T>(_G.getGraph()) { }
   230 //       NodeMap(const RevGraphWrapper<Graph>& _G, T a) : 
   231 // 	Graph::NodeMap<T>(_G.getGraph(), a) { }
   232 //     };
   233 
   234 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
   235 //     public:
   236 //       EdgeMap(const RevGraphWrapper<Graph>& _G) : 
   237 // 	Graph::EdgeMap<T>(_G.getGraph()) { }
   238 //       EdgeMap(const RevGraphWrapper<Graph>& _G, T a) : 
   239 // 	Graph::EdgeMap<T>(_G.getGraph(), a) { }
   240 //     };
   241 //   };
   242 
   243   template<typename /*Graph*/GraphWrapper
   244   /*=typename GraphWrapperSkeleton< TrivGraphWrapper<Graph>*/ >
   245   class RevGraphWrapper : 
   246     public GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/ {
   247   protected:
   248     //Graph* graph;
   249     
   250   public:
   251     //typedef Graph BaseGraph;
   252 
   253     //typedef typename Graph::Node Node;    
   254     //typedef typename Graph::NodeIt NodeIt;
   255   
   256     //typedef typename Graph::Edge Edge;
   257     typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::OutEdgeIt InEdgeIt;
   258     typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::InEdgeIt OutEdgeIt;
   259     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   260     //typedef typename Graph::EdgeIt EdgeIt;
   261 
   262     //RevGraphWrapper() : graph(0) { }
   263     RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/(_gw/*TrivGraphWrapper<Graph>(_graph)*/) { }
   264     
   265     //void setGraph(Graph& _graph) { graph = &_graph; }
   266     //Graph& getGraph() const { return (*graph); }
   267     
   268     //template<typename I> I& first(I& i) const { return graph->first(i); }
   269     //template<typename I, typename P> I& first(I& i, const P& p) const { 
   270     //  return graph->first(i, p); }
   271 
   272     //template<typename I> I getNext(const I& i) const { 
   273     //  return graph->getNext(i); }
   274     //template<typename I> I& next(I &i) const { return graph->next(i); }    
   275 
   276     //template< typename It > It first() const { 
   277     //  It e; first(e); return e; }
   278 
   279     //template< typename It > It first(const Node& v) const { 
   280     //  It e; first(e, v); return e; }
   281 
   282     //Node head(const Edge& e) const { return graph->tail(e); }
   283     //Node tail(const Edge& e) const { return graph->head(e); }
   284   
   285     //template<typename I> bool valid(const I& i) const 
   286     //  { return graph->valid(i); }
   287   
   288     //template<typename I> void setInvalid(const I &i);
   289     //{ return graph->setInvalid(i); }
   290   
   291     //template<typename I> Node aNode(const I& e) const { 
   292     //  return graph->aNode(e); }
   293     //template<typename I> Node bNode(const I& e) const { 
   294     //  return graph->bNode(e); }
   295 
   296     //Node addNode() const { return graph->addNode(); }
   297     //Edge addEdge(const Node& tail, const Node& head) const { 
   298     //  return graph->addEdge(tail, head); }
   299   
   300     //int nodeNum() const { return graph->nodeNum(); }
   301     //int edgeNum() const { return graph->edgeNum(); }
   302   
   303     //template<typename I> void erase(const I& i) const { graph->erase(i); }
   304   
   305     //void clear() const { graph->clear(); }
   306 
   307     template<typename T> class NodeMap : 
   308       public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T> 
   309     { 
   310     public:
   311       NodeMap(const RevGraphWrapper<GraphWrapper>& _gw) : 
   312 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw) { }
   313       NodeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) : 
   314 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw, a) { }
   315     };
   316     
   317     template<typename T> class EdgeMap : 
   318       public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T> { 
   319     public:
   320       EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw) : 
   321 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw) { }
   322       EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) : 
   323 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw, a) { }
   324     };
   325   };
   326 
   327 
   328   template<typename Graph>
   329   class UndirGraphWrapper {
   330   protected:
   331     Graph* graph;
   332   
   333   public:
   334     typedef Graph BaseGraph;
   335 
   336     typedef typename Graph::Node Node;
   337     typedef typename Graph::NodeIt NodeIt;
   338 
   339     //typedef typename Graph::Edge Edge;
   340     //typedef typename Graph::OutEdgeIt OutEdgeIt;
   341     //typedef typename Graph::InEdgeIt InEdgeIt;
   342     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   343     //typedef typename Graph::EdgeIt EdgeIt;
   344 
   345     //private:
   346     typedef typename Graph::Edge GraphEdge;
   347     typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
   348     typedef typename Graph::InEdgeIt GraphInEdgeIt;
   349     //public:
   350 
   351     //UndirGraphWrapper() : graph(0) { }
   352     UndirGraphWrapper(Graph& _graph) : graph(&_graph) { }
   353 
   354     void setGraph(Graph& _graph) { graph = &_graph; }
   355     Graph& getGraph() const { return (*graph); }
   356   
   357     class Edge {
   358       friend class UndirGraphWrapper<Graph>;
   359       bool out_or_in; //true iff out
   360       GraphOutEdgeIt out;
   361       GraphInEdgeIt in;
   362     public:
   363       Edge() : out_or_in(), out(), in() { }
   364       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
   365       operator GraphEdge() const {
   366 	if (out_or_in) return(out); else return(in);
   367       }
   368       friend bool operator==(const Edge& u, const Edge& v) { 
   369 	if (v.out_or_in) 
   370 	  return (u.out_or_in && u.out==v.out);
   371 	else
   372 	  return (!u.out_or_in && u.in==v.in);
   373       } 
   374       friend bool operator!=(const Edge& u, const Edge& v) { 
   375 	if (v.out_or_in) 
   376 	  return (!u.out_or_in || u.out!=v.out);
   377 	else
   378 	  return (u.out_or_in || u.in!=v.in);
   379       } 
   380     };
   381 
   382     class OutEdgeIt : public Edge {
   383       friend class UndirGraphWrapper<Graph>;
   384     public:
   385       OutEdgeIt() : Edge() { }
   386       OutEdgeIt(const Invalid& i) : Edge(i) { }
   387       OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() { 
   388 	out_or_in=true;
   389 	_G.graph->first(out, n);
   390 	if (!(_G.graph->valid(out))) {
   391 	  out_or_in=false;
   392 	  _G.graph->first(in, n);
   393 	}
   394       }
   395     };
   396 
   397     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
   398       e.out_or_in=true;
   399       graph->first(e.out, n);
   400       if (!(graph->valid(e.out))) {
   401 	e.out_or_in=false;
   402 	graph->first(e.in, n);
   403       }
   404       return e;
   405     }
   406 
   407     OutEdgeIt& next(OutEdgeIt& e) const {
   408       if (e.out_or_in) {
   409 	Node n=graph->tail(e.out);
   410 	graph->next(e.out);
   411 	if (!graph->valid(e.out)) {
   412 	  e.out_or_in=false;
   413 	  graph->first(e.in, n);
   414 	}
   415       } else {
   416 	graph->next(e.in);
   417       }
   418       return e;
   419     }
   420 
   421     Node aNode(const OutEdgeIt& e) const { 
   422       if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
   423     Node bNode(const OutEdgeIt& e) const { 
   424       if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
   425 
   426     typedef OutEdgeIt InEdgeIt; 
   427 
   428     template<typename I> I& first(I& i) const { return graph->first(i); }
   429 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   430 //       return graph->first(i, p); }
   431     
   432     template<typename I> I getNext(const I& i) const { 
   433       return graph->getNext(i); }
   434     template<typename I> I& next(I &i) const { return graph->next(i); }    
   435 
   436     template< typename It > It first() const { 
   437       It e; first(e); return e; }
   438 
   439     template< typename It > It first(const Node& v) const { 
   440       It e; first(e, v); return e; }
   441 
   442     Node head(const Edge& e) const { return graph->head(e); }
   443     Node tail(const Edge& e) const { return graph->tail(e); }
   444 
   445     template<typename I> bool valid(const I& i) const 
   446       { return graph->valid(i); }
   447   
   448     //template<typename I> void setInvalid(const I &i);
   449     //{ return graph->setInvalid(i); }
   450 
   451     int nodeNum() const { return graph->nodeNum(); }
   452     int edgeNum() const { return graph->edgeNum(); }
   453   
   454 //     template<typename I> Node aNode(const I& e) const { 
   455 //       return graph->aNode(e); }
   456 //     template<typename I> Node bNode(const I& e) const { 
   457 //       return graph->bNode(e); }
   458   
   459     Node addNode() const { return graph->addNode(); }
   460 // FIXME: ez igy nem jo, mert nem
   461 //    Edge addEdge(const Node& tail, const Node& head) const { 
   462 //      return graph->addEdge(tail, head); }
   463   
   464     template<typename I> void erase(const I& i) const { graph->erase(i); }
   465   
   466     void clear() const { graph->clear(); }
   467     
   468     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   469     public:
   470       NodeMap(const UndirGraphWrapper<Graph>& _G) : 
   471 	Graph::NodeMap<T>(_G.getGraph()) { }
   472       NodeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
   473 	Graph::NodeMap<T>(_G.getGraph(), a) { }
   474     };
   475 
   476     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { 
   477     public:
   478       EdgeMap(const UndirGraphWrapper<Graph>& _G) : 
   479 	Graph::EdgeMap<T>(_G.getGraph()) { }
   480       EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) : 
   481 	Graph::EdgeMap<T>(_G.getGraph(), a) { }
   482     };
   483   };
   484 
   485 
   486 
   487 //   template<typename Graph>
   488 //   class SymGraphWrapper
   489 //   {
   490 //     Graph* graph;
   491   
   492 //   public:
   493 //     typedef Graph BaseGraph;
   494 
   495 //     typedef typename Graph::Node Node;
   496 //     typedef typename Graph::Edge Edge;
   497   
   498 //     typedef typename Graph::NodeIt NodeIt;
   499     
   500 //     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
   501 //     //iranyitatlant, ami van
   502 //     //mert csak 1 dolgot lehet be typedef-elni
   503 //     typedef typename Graph::OutEdgeIt SymEdgeIt;
   504 //     //typedef typename Graph::InEdgeIt SymEdgeIt;
   505 //     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   506 //     typedef typename Graph::EdgeIt EdgeIt;
   507 
   508 //     int nodeNum() const { return graph->nodeNum(); }
   509 //     int edgeNum() const { return graph->edgeNum(); }
   510     
   511 //     template<typename I> I& first(I& i) const { return graph->first(i); }
   512 //     template<typename I, typename P> I& first(I& i, const P& p) const { 
   513 //       return graph->first(i, p); }
   514 //     //template<typename I> I next(const I i); { return graph->goNext(i); }
   515 //     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
   516 
   517 //     template< typename It > It first() const { 
   518 //       It e; first(e); return e; }
   519 
   520 //     template< typename It > It first(Node v) const { 
   521 //       It e; first(e, v); return e; }
   522 
   523 //     Node head(const Edge& e) const { return graph->head(e); }
   524 //     Node tail(const Edge& e) const { return graph->tail(e); }
   525   
   526 //     template<typename I> Node aNode(const I& e) const { 
   527 //       return graph->aNode(e); }
   528 //     template<typename I> Node bNode(const I& e) const { 
   529 //       return graph->bNode(e); }
   530   
   531 //     //template<typename I> bool valid(const I i);
   532 //     //{ return graph->valid(i); }
   533   
   534 //     //template<typename I> void setInvalid(const I &i);
   535 //     //{ return graph->setInvalid(i); }
   536   
   537 //     Node addNode() { return graph->addNode(); }
   538 //     Edge addEdge(const Node& tail, const Node& head) { 
   539 //       return graph->addEdge(tail, head); }
   540   
   541 //     template<typename I> void erase(const I& i) { graph->erase(i); }
   542   
   543 //     void clear() { graph->clear(); }
   544   
   545 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { };
   546 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
   547   
   548 //     void setGraph(Graph& _graph) { graph = &_graph; }
   549 //     Graph& getGraph() { return (*graph); }
   550 
   551 //     //SymGraphWrapper() : graph(0) { }
   552 //     SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
   553 //   };
   554 
   555 
   556   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   557   class ResGraphWrapper {
   558   public:
   559     typedef Graph BaseGraph;
   560     typedef typename Graph::Node Node;
   561     typedef typename Graph::NodeIt NodeIt;
   562   private:
   563     typedef typename Graph::OutEdgeIt OldOutEdgeIt;
   564     typedef typename Graph::InEdgeIt OldInEdgeIt;
   565   protected:
   566     const Graph* graph;
   567     FlowMap* flow;
   568     const CapacityMap* capacity;
   569   public:
   570 
   571     ResGraphWrapper(const Graph& _G, FlowMap& _flow, 
   572 	     const CapacityMap& _capacity) : 
   573       graph(&_G), flow(&_flow), capacity(&_capacity) { }
   574 
   575     void setGraph(const Graph& _graph) { graph = &_graph; }
   576     const Graph& getGraph() const { return (*graph); }
   577 
   578     class Edge; 
   579     class OutEdgeIt; 
   580     friend class Edge; 
   581     friend class OutEdgeIt; 
   582 
   583     class Edge {
   584       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
   585     protected:
   586       bool out_or_in; //true, iff out
   587       OldOutEdgeIt out;
   588       OldInEdgeIt in;
   589     public:
   590       Edge() : out_or_in(true) { } 
   591       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
   592 //       bool valid() const { 
   593 // 	return out_or_in && out.valid() || in.valid(); }
   594       friend bool operator==(const Edge& u, const Edge& v) { 
   595 	if (v.out_or_in) 
   596 	  return (u.out_or_in && u.out==v.out);
   597 	else
   598 	  return (!u.out_or_in && u.in==v.in);
   599       } 
   600       friend bool operator!=(const Edge& u, const Edge& v) { 
   601 	if (v.out_or_in) 
   602 	  return (!u.out_or_in || u.out!=v.out);
   603 	else
   604 	  return (u.out_or_in || u.in!=v.in);
   605       } 
   606     };
   607 
   608 
   609     class OutEdgeIt : public Edge {
   610       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
   611     public:
   612       OutEdgeIt() { }
   613       //FIXME
   614       OutEdgeIt(const Edge& e) : Edge(e) { }
   615       OutEdgeIt(const Invalid& i) : Edge(i) { }
   616     private:
   617       OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() { 
   618 	resG.graph->first(out, v);
   619 	while( resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
   620 	if (!resG.graph->valid(out)) {
   621 	  out_or_in=0;
   622 	  resG.graph->first(in, v);
   623 	  while( resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
   624 	}
   625       }
   626 //     public:
   627 //       OutEdgeIt& operator++() { 
   628 // 	if (out_or_in) {
   629 // 	  Node v=/*resG->*/G->aNode(out);
   630 // 	  ++out;
   631 // 	  while( out.valid() && !(Edge::free()>0) ) { ++out; }
   632 // 	  if (!out.valid()) {
   633 // 	    out_or_in=0;
   634 // 	    G->first(in, v); 
   635 // 	    while( in.valid() && !(Edge::free()>0) ) { ++in; }
   636 // 	  }
   637 // 	} else {
   638 // 	  ++in;
   639 // 	  while( in.valid() && !(Edge::free()>0) ) { ++in; } 
   640 // 	}
   641 // 	return *this; 
   642 //       }
   643     };
   644 
   645     class EdgeIt : public Edge {
   646       friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
   647       typename Graph::NodeIt v;
   648     public:
   649       EdgeIt() { }
   650       //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
   651       EdgeIt(const Invalid& i) : Edge(i) { }
   652       EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() { 
   653 	resG.graph->first(v);
   654 	if (resG.graph->valid(v)) resG.graph->first(out, v); else out=OldOutEdgeIt(INVALID);
   655 	while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
   656 	while (resG.graph->valid(v) && !resG.graph->valid(out)) { 
   657 	  resG.graph->next(v); 
   658 	  if (resG.graph->valid(v)) resG.graph->first(out, v); 
   659 	  while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
   660 	}
   661 	if (!resG.graph->valid(out)) {
   662 	  out_or_in=0;
   663 	  resG.graph->first(v);
   664 	  if (resG.graph->valid(v)) resG.graph->first(in, v); else in=OldInEdgeIt(INVALID);
   665 	  while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
   666 	  while (resG.graph->valid(v) && !resG.graph->valid(in)) { 
   667 	    resG.graph->next(v); 
   668 	    if (resG.graph->valid(v)) resG.graph->first(in, v); 
   669 	    while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
   670 	  }
   671 	}
   672       }
   673 //       EdgeIt& operator++() { 
   674 // 	if (out_or_in) {
   675 // 	  ++out;
   676 // 	  while (out.valid() && !(Edge::free()>0) ) { ++out; }
   677 // 	  while (v.valid() && !out.valid()) { 
   678 // 	    ++v; 
   679 // 	    if (v.valid()) G->first(out, v); 
   680 // 	    while (out.valid() && !(Edge::free()>0) ) { ++out; }
   681 // 	  }
   682 // 	  if (!out.valid()) {
   683 // 	    out_or_in=0;
   684 // 	    G->first(v);
   685 // 	    if (v.valid()) G->first(in, v); else in=OldInEdgeIt();
   686 // 	    while (in.valid() && !(Edge::free()>0) ) { ++in; }
   687 // 	    while (v.valid() && !in.valid()) { 
   688 // 	      ++v; 
   689 // 	      if (v.valid()) G->first(in, v); 
   690 // 	      while (in.valid() && !(Edge::free()>0) ) { ++in; }
   691 // 	    }  
   692 // 	  }
   693 // 	} else {
   694 // 	  ++in;
   695 // 	  while (in.valid() && !(Edge::free()>0) ) { ++in; }
   696 // 	  while (v.valid() && !in.valid()) { 
   697 // 	    ++v; 
   698 // 	    if (v.valid()) G->first(in, v); 
   699 // 	    while (in.valid() && !(Edge::free()>0) ) { ++in; }
   700 // 	  }
   701 // 	}
   702 // 	return *this;
   703 //       }
   704     };
   705 
   706     NodeIt& first(NodeIt& v) const { return graph->first(v); }
   707     OutEdgeIt& first(OutEdgeIt& e, Node v) const { 
   708       e=OutEdgeIt(*this, v); 
   709       return e;
   710     }
   711     EdgeIt& first(EdgeIt& e) const { 
   712       e=EdgeIt(*this); 
   713       return e;
   714     }
   715    
   716     NodeIt& next(NodeIt& n) const { return graph->next(n); }
   717 
   718     OutEdgeIt& next(OutEdgeIt& e) const { 
   719       if (e.out_or_in) {
   720 	Node v=graph->aNode(e.out);
   721 	graph->next(e.out);
   722 	while( graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
   723 	if (!graph->valid(e.out)) {
   724 	  e.out_or_in=0;
   725 	  graph->first(e.in, v); 
   726 	  while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
   727 	}
   728       } else {
   729 	graph->next(e.in);
   730 	while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } 
   731       }
   732       return e;
   733     }
   734 
   735     EdgeIt& next(EdgeIt& e) const { 
   736       if (e.out_or_in) {
   737 	graph->next(e.out);
   738 	while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
   739 	  while (graph->valid(e.v) && !graph->valid(e.out)) { 
   740 	    graph->next(e.v); 
   741 	    if (graph->valid(e.v)) graph->first(e.out, e.v); 
   742 	    while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
   743 	  }
   744 	  if (!graph->valid(e.out)) {
   745 	    e.out_or_in=0;
   746 	    graph->first(e.v);
   747 	    if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=OldInEdgeIt(INVALID);
   748 	    while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
   749 	    while (graph->valid(e.v) && !graph->valid(e.in)) { 
   750 	      graph->next(e.v); 
   751 	      if (graph->valid(e.v)) graph->first(e.in, e.v); 
   752 	      while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
   753 	    }  
   754 	  }
   755 	} else {
   756 	  graph->next(e.in);
   757 	  while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
   758 	  while (graph->valid(e.v) && !graph->valid(e.in)) { 
   759 	    graph->next(e.v); 
   760 	    if (graph->valid(e.v)) graph->first(e.in, e.v); 
   761 	    while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
   762 	  }
   763 	}
   764 	return e;
   765       }
   766     
   767 
   768     template< typename It >
   769     It first() const { 
   770       It e;
   771       first(e);
   772       return e; 
   773     }
   774 
   775     template< typename It >
   776     It first(Node v) const { 
   777       It e;
   778       first(e, v);
   779       return e; 
   780     }
   781 
   782     Node tail(Edge e) const { 
   783       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
   784     Node head(Edge e) const { 
   785       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
   786 
   787     Node aNode(OutEdgeIt e) const { 
   788       return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
   789     Node bNode(OutEdgeIt e) const { 
   790       return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
   791 
   792     int id(Node v) const { return graph->id(v); }
   793 
   794     bool valid(Node n) const { return graph->valid(n); }
   795     bool valid(Edge e) const { 
   796       return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
   797 
   798     void augment(const Edge& e, Number a) const {
   799       if (e.out_or_in)  
   800 	flow->set(e.out, flow->get(e.out)+a);
   801       else  
   802 	flow->set(e.in, flow->get(e.in)-a);
   803     }
   804 
   805     Number free(const Edge& e) const { 
   806       if (e.out_or_in) 
   807 	return (capacity->get(e.out)-flow->get(e.out)); 
   808       else 
   809 	return (flow->get(e.in)); 
   810     }
   811 
   812     Number free(OldOutEdgeIt out) const { 
   813       return (capacity->get(out)-flow->get(out)); 
   814     }
   815     
   816     Number free(OldInEdgeIt in) const { 
   817       return (flow->get(in)); 
   818     }
   819 
   820     template<typename T> class NodeMap : public Graph::NodeMap<T> { 
   821     public:
   822       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) 
   823 	: Graph::NodeMap<T>(_G.getGraph()) { }
   824       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, 
   825 	      T a) : Graph::NodeMap<T>(_G.getGraph(), a) { }
   826     };
   827 
   828 //     template <typename T>
   829 //     class NodeMap {
   830 //       typename Graph::NodeMap<T> node_map; 
   831 //     public:
   832 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
   833 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
   834 //       void set(Node nit, T a) { node_map.set(nit, a); }
   835 //       T get(Node nit) const { return node_map.get(nit); }
   836 //     };
   837 
   838     template <typename T>
   839     class EdgeMap {
   840       typename Graph::EdgeMap<T> forward_map, backward_map; 
   841     public:
   842       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(_G.getGraph()), backward_map(_G.getGraph()) { }
   843       EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(_G.getGraph(), a), backward_map(_G.getGraph(), a) { }
   844       void set(Edge e, T a) { 
   845 	if (e.out_or_in) 
   846 	  forward_map.set(e.out, a); 
   847 	else 
   848 	  backward_map.set(e.in, a); 
   849       }
   850       T get(Edge e) { 
   851 	if (e.out_or_in) 
   852 	  return forward_map.get(e.out); 
   853 	else 
   854 	  return backward_map.get(e.in); 
   855       }
   856     };
   857   };
   858 
   859   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   860   class ErasingResGraphWrapper : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
   861   protected:
   862     ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
   863     //ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
   864   public:
   865     ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow, 
   866 			   const CapacityMap& _capacity) : 
   867       ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), 
   868       first_out_edges(*this) /*, dist(*this)*/ { 
   869       for(NodeIt n=this->template first<NodeIt>(); this->valid(n); this->next(n)) {
   870 	OutEdgeIt e;
   871 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
   872 	first_out_edges.set(n, e);
   873       }
   874     }
   875 
   876     //void setGraph(Graph& _graph) { graph = &_graph; }
   877     //Graph& getGraph() const { return (*graph); }
   878   
   879     //TrivGraphWrapper() : graph(0) { }
   880     //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { }
   881 
   882     //typedef Graph BaseGraph;
   883 
   884     //typedef typename Graph::Node Node;
   885     //typedef typename Graph::NodeIt NodeIt;
   886 
   887     //typedef typename Graph::Edge Edge;
   888     //typedef typename Graph::OutEdgeIt OutEdgeIt;
   889     //typedef typename Graph::InEdgeIt InEdgeIt;
   890     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   891     //typedef typename Graph::EdgeIt EdgeIt;
   892 
   893     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
   894     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
   895 
   896     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
   897     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
   898     //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
   899     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   900     //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
   901 
   902     NodeIt& first(NodeIt& n) const { 
   903       return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
   904     }
   905 
   906     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { 
   907       e=first_out_edges.get(n);
   908       return e;
   909     }
   910     
   911     //ROSSZ template<typename I> I& first(I& i) const { return first(i); }
   912     //ROSSZ template<typename I, typename P> I& first(I& i, const P& p) const { 
   913     //  return first(i, p); }
   914     
   915     //template<typename I> I getNext(const I& i) const { 
   916     //  return graph->getNext(i); }
   917     //template<typename I> I& next(I &i) const { return graph->next(i); }    
   918 
   919     template< typename It > It first() const { 
   920       It e; first(e); return e; }
   921 
   922     template< typename It > It first(const Node& v) const { 
   923       It e; first(e, v); return e; }
   924 
   925     //Node head(const Edge& e) const { return graph->head(e); }
   926     //Node tail(const Edge& e) const { return graph->tail(e); }
   927 
   928     //template<typename I> bool valid(const I& i) const 
   929     //  { return graph->valid(i); }
   930   
   931     //int nodeNum() const { return graph->nodeNum(); }
   932     //int edgeNum() const { return graph->edgeNum(); }
   933   
   934     //template<typename I> Node aNode(const I& e) const { 
   935     //  return graph->aNode(e); }
   936     //template<typename I> Node bNode(const I& e) const { 
   937     //  return graph->bNode(e); }
   938   
   939     //Node addNode() const { return graph->addNode(); }
   940     //Edge addEdge(const Node& tail, const Node& head) const { 
   941     //  return graph->addEdge(tail, head); }
   942   
   943     //void erase(const OutEdgeIt& e) {
   944     //  first_out_edge(this->tail(e))=e;
   945     //}
   946     void erase(const Edge& e) {
   947       OutEdgeIt f(e);
   948       next(f);
   949       first_out_edges.set(this->tail(e), f);
   950     }
   951     //template<typename I> void erase(const I& i) const { graph->erase(i); }
   952   
   953     //void clear() const { graph->clear(); }
   954     
   955     template<typename T> class NodeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> { 
   956     public:
   957       NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : 
   958 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
   959       NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : 
   960 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
   961     };
   962 
   963     template<typename T> class EdgeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> { 
   964     public:
   965       EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : 
   966 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
   967       EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : 
   968 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
   969     };
   970   };
   971 
   972   template<typename GraphWrapper> 
   973   class FilterGraphWrapper {
   974   };
   975 
   976   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
   977   class FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> {
   978 
   979     //Graph* graph;
   980   
   981   public:
   982     //typedef Graph BaseGraph;
   983 
   984     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node;
   985     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt;
   986 
   987     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge;
   988     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt;
   989     //typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt;
   990     //typedef typename Graph::SymEdgeIt SymEdgeIt;
   991     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
   992 
   993     //FilterGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges;
   994     
   995   public:
   996     FilterGraphWrapper(const Graph& _G, FlowMap& _flow, 
   997 			   const CapacityMap& _capacity) : 
   998       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), dist(*this, graph->nodeNum()) { 
   999     }
  1000 
  1001     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
  1002       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
  1003       while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e)))) 
  1004 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
  1005       return e;
  1006     }
  1007 
  1008     NodeIt& next(NodeIt& e) const {
  1009       return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
  1010     }
  1011 
  1012     OutEdgeIt& next(OutEdgeIt& e) const {
  1013       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
  1014       while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e)))) 
  1015 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
  1016       return e;
  1017     }
  1018 
  1019     NodeIt& first(NodeIt& n) const {
  1020       return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
  1021     }
  1022 
  1023     void erase(const Edge& e) {
  1024       OutEdgeIt f(e);
  1025       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
  1026       while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f)))) 
  1027 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f);
  1028       first_out_edges.set(this->tail(e), f);
  1029     }
  1030 
  1031     //TrivGraphWrapper() : graph(0) { }
  1032     //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
  1033 
  1034     //void setGraph(Graph& _graph) { graph = &_graph; }
  1035     //Graph& getGraph() const { return (*graph); }
  1036     
  1037     //template<typename I> I& first(I& i) const { return graph->first(i); }
  1038     //template<typename I, typename P> I& first(I& i, const P& p) const { 
  1039     //  return graph->first(i, p); }
  1040     
  1041     //template<typename I> I getNext(const I& i) const { 
  1042     //  return graph->getNext(i); }
  1043     //template<typename I> I& next(I &i) const { return graph->next(i); }    
  1044 
  1045     template< typename It > It first() const { 
  1046       It e; first(e); return e; }
  1047 
  1048     template< typename It > It first(const Node& v) const { 
  1049       It e; first(e, v); return e; }
  1050 
  1051     //Node head(const Edge& e) const { return graph->head(e); }
  1052     //Node tail(const Edge& e) const { return graph->tail(e); }
  1053 
  1054     //template<typename I> bool valid(const I& i) const 
  1055     //  { return graph->valid(i); }
  1056   
  1057     //template<typename I> void setInvalid(const I &i);
  1058     //{ return graph->setInvalid(i); }
  1059 
  1060     //int nodeNum() const { return graph->nodeNum(); }
  1061     //int edgeNum() const { return graph->edgeNum(); }
  1062   
  1063     //template<typename I> Node aNode(const I& e) const { 
  1064     //  return graph->aNode(e); }
  1065     //template<typename I> Node bNode(const I& e) const { 
  1066     //  return graph->bNode(e); }
  1067   
  1068     //Node addNode() const { return graph->addNode(); }
  1069     //Edge addEdge(const Node& tail, const Node& head) const { 
  1070     //  return graph->addEdge(tail, head); }
  1071   
  1072     //template<typename I> void erase(const I& i) const { graph->erase(i); }
  1073   
  1074     //void clear() const { graph->clear(); }
  1075     
  1076     template<typename T> class NodeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> { 
  1077     public:
  1078       NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) : 
  1079 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { }
  1080       NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) : 
  1081 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { }
  1082     };
  1083 
  1084     template<typename T> class EdgeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> { 
  1085     public:
  1086       EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) : 
  1087 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { }
  1088       EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) : 
  1089 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { }
  1090     };
  1091 
  1092   public:
  1093     ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist;
  1094 
  1095   };
  1096 
  1097 
  1098 
  1099 // // FIXME: comparison should be made better!!!
  1100 //   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
  1101 //   class ResGraphWrapper
  1102 //   {
  1103 //     Graph* graph;
  1104   
  1105 //   public:
  1106 //     typedef Graph BaseGraph;
  1107 
  1108 //     typedef typename Graph::Node Node;
  1109 //     typedef typename Graph::Edge Edge;
  1110   
  1111 //     typedef typename Graph::NodeIt NodeIt;
  1112    
  1113 //     class OutEdgeIt {
  1114 //     public:
  1115 //       //Graph::Node n;
  1116 //       bool out_or_in;
  1117 //       typename Graph::OutEdgeIt o;
  1118 //       typename Graph::InEdgeIt i;   
  1119 //     };
  1120 //     class InEdgeIt {
  1121 //     public:
  1122 //       //Graph::Node n;
  1123 //       bool out_or_in;
  1124 //       typename Graph::OutEdgeIt o;
  1125 //       typename Graph::InEdgeIt i;   
  1126 //     };
  1127 //     typedef typename Graph::SymEdgeIt SymEdgeIt;
  1128 //     typedef typename Graph::EdgeIt EdgeIt;
  1129 
  1130 //     int nodeNum() const { return graph->nodeNum(); }
  1131 //     int edgeNum() const { return graph->edgeNum(); }
  1132 
  1133 //     Node& first(Node& n) const { return graph->first(n); }
  1134 
  1135 //     // Edge and SymEdge  is missing!!!!
  1136 //     // Edge <-> In/OutEdgeIt conversion is missing!!!!
  1137 
  1138 //     //FIXME
  1139 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const 
  1140 //       {
  1141 // 	e.n=n;
  1142 // 	graph->first(e.o,n);
  1143 // 	while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
  1144 // 	  graph->goNext(e.o);
  1145 // 	if(!graph->valid(e.o)) {
  1146 // 	  graph->first(e.i,n);
  1147 // 	  while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
  1148 // 	    graph->goNext(e.i);
  1149 // 	}
  1150 // 	return e;
  1151 //       }
  1152 // /*
  1153 //   OutEdgeIt &goNext(OutEdgeIt &e)
  1154 //   {
  1155 //   if(graph->valid(e.o)) {
  1156 //   while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
  1157 //   graph->goNext(e.o);
  1158 //   if(graph->valid(e.o)) return e;
  1159 //   else graph->first(e.i,e.n);
  1160 //   }
  1161 //   else {
  1162 //   while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
  1163 //   graph->goNext(e.i);
  1164 //   return e;
  1165 //   }
  1166 //   }
  1167 //   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
  1168 // */
  1169 //     //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);}
  1170 
  1171 //     //FIXME
  1172 //     InEdgeIt& first(InEdgeIt& e, const Node& n) const 
  1173 //       {
  1174 // 	e.n=n;
  1175 // 	graph->first(e.i,n);
  1176 // 	while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
  1177 // 	  graph->goNext(e.i);
  1178 // 	if(!graph->valid(e.i)) {
  1179 // 	  graph->first(e.o,n);
  1180 // 	  while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
  1181 // 	    graph->goNext(e.o);
  1182 // 	}
  1183 // 	return e;
  1184 //       }
  1185 // /*
  1186 //   InEdgeIt &goNext(InEdgeIt &e)
  1187 //   {
  1188 //   if(graph->valid(e.i)) {
  1189 //   while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
  1190 //   graph->goNext(e.i);
  1191 //   if(graph->valid(e.i)) return e;
  1192 //   else graph->first(e.o,e.n);
  1193 //   }
  1194 //   else {
  1195 //   while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
  1196 //   graph->goNext(e.o);
  1197 //   return e;
  1198 //   }
  1199 //   }
  1200 //   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
  1201 // */
  1202 //     //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);}
  1203 
  1204 //     //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
  1205 //     //template<typename I> I next(const I i); { return graph->goNext(i); }
  1206 
  1207 //     template< typename It > It first() const { 
  1208 //       It e; first(e); return e; }
  1209 
  1210 //     template< typename It > It first(Node v) const { 
  1211 //       It e; first(e, v); return e; }
  1212 
  1213 //     Node head(const Edge& e) const { return graph->head(e); }
  1214 //     Node tail(const Edge& e) const { return graph->tail(e); }
  1215   
  1216 //     template<typename I> Node aNode(const I& e) const { 
  1217 //       return graph->aNode(e); }
  1218 //     template<typename I> Node bNode(const I& e) const { 
  1219 //       return graph->bNode(e); }
  1220   
  1221 //     //template<typename I> bool valid(const I i);
  1222 //     //{ return graph->valid(i); }
  1223   
  1224 //     //template<typename I> void setInvalid(const I &i);
  1225 //     //{ return graph->setInvalid(i); }
  1226   
  1227 //     Node addNode() { return graph->addNode(); }
  1228 //     Edge addEdge(const Node& tail, const Node& head) { 
  1229 //       return graph->addEdge(tail, head); }
  1230   
  1231 //     template<typename I> void erase(const I& i) { graph->erase(i); }
  1232   
  1233 //     void clear() { graph->clear(); }
  1234   
  1235 //     template<typename S> class NodeMap : public Graph::NodeMap<S> { };
  1236 //     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
  1237   
  1238 //     void setGraph(Graph& _graph) { graph = &_graph; }
  1239 //     Graph& getGraph() { return (*graph); }
  1240 
  1241 //     //ResGraphWrapper() : graph(0) { }
  1242 //     ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
  1243 //   };
  1244 
  1245 } //namespace hugo
  1246 
  1247 #endif //GRAPH_WRAPPER_H
  1248