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