COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/marci/graph_wrapper.h @ 188:ad1417e74042

Last change on this file since 188:ad1417e74042 was 174:44700ed9ffaa, checked in by marci, 20 years ago

towards on ListGraph?, SmartGraph? compatibility

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