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