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