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