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