lemon/bits/graph_adaptor_extender.h
author Alpar Juttner <alpar@cs.elte.hu>
Mon, 08 Aug 2011 12:36:16 +0200
branch1.1
changeset 1081 f1398882a928
parent 965 ece1f8a3052d
permissions -rw-r--r--
Unify sources
deba@432
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
deba@430
     2
 *
deba@432
     3
 * This file is a part of LEMON, a generic C++ optimization library.
deba@430
     4
 *
alpar@1081
     5
 * Copyright (C) 2003-2011
deba@430
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@430
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@430
     8
 *
deba@430
     9
 * Permission to use, modify and distribute this software is granted
deba@430
    10
 * provided that this copyright notice appears in all copies. For
deba@430
    11
 * precise terms see the accompanying LICENSE file.
deba@430
    12
 *
deba@430
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@430
    14
 * express or implied, and with no claim as to its suitability for any
deba@430
    15
 * purpose.
deba@430
    16
 *
deba@430
    17
 */
deba@430
    18
deba@430
    19
#ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
deba@430
    20
#define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
deba@430
    21
deba@430
    22
#include <lemon/core.h>
deba@430
    23
#include <lemon/error.h>
deba@430
    24
deba@430
    25
namespace lemon {
deba@430
    26
deba@430
    27
  template <typename _Digraph>
deba@430
    28
  class DigraphAdaptorExtender : public _Digraph {
kpeter@664
    29
    typedef _Digraph Parent;
kpeter@664
    30
deba@430
    31
  public:
deba@430
    32
deba@430
    33
    typedef _Digraph Digraph;
deba@430
    34
    typedef DigraphAdaptorExtender Adaptor;
deba@430
    35
deba@430
    36
    // Base extensions
deba@430
    37
deba@430
    38
    typedef typename Parent::Node Node;
deba@430
    39
    typedef typename Parent::Arc Arc;
deba@430
    40
deba@430
    41
    int maxId(Node) const {
deba@430
    42
      return Parent::maxNodeId();
deba@430
    43
    }
deba@430
    44
deba@430
    45
    int maxId(Arc) const {
deba@430
    46
      return Parent::maxArcId();
deba@430
    47
    }
deba@430
    48
deba@430
    49
    Node fromId(int id, Node) const {
deba@430
    50
      return Parent::nodeFromId(id);
deba@430
    51
    }
deba@430
    52
deba@430
    53
    Arc fromId(int id, Arc) const {
deba@430
    54
      return Parent::arcFromId(id);
deba@430
    55
    }
deba@430
    56
deba@430
    57
    Node oppositeNode(const Node &n, const Arc &e) const {
deba@430
    58
      if (n == Parent::source(e))
deba@432
    59
        return Parent::target(e);
deba@430
    60
      else if(n==Parent::target(e))
deba@432
    61
        return Parent::source(e);
deba@430
    62
      else
deba@432
    63
        return INVALID;
deba@430
    64
    }
deba@430
    65
deba@432
    66
    class NodeIt : public Node {
deba@430
    67
      const Adaptor* _adaptor;
deba@430
    68
    public:
deba@430
    69
deba@430
    70
      NodeIt() {}
deba@430
    71
deba@430
    72
      NodeIt(Invalid i) : Node(i) { }
deba@430
    73
deba@430
    74
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
    75
        _adaptor->first(static_cast<Node&>(*this));
deba@430
    76
      }
deba@430
    77
deba@432
    78
      NodeIt(const Adaptor& adaptor, const Node& node)
deba@432
    79
        : Node(node), _adaptor(&adaptor) {}
deba@430
    80
deba@432
    81
      NodeIt& operator++() {
deba@432
    82
        _adaptor->next(*this);
deba@432
    83
        return *this;
deba@430
    84
      }
deba@430
    85
deba@430
    86
    };
deba@430
    87
deba@430
    88
deba@432
    89
    class ArcIt : public Arc {
deba@430
    90
      const Adaptor* _adaptor;
deba@430
    91
    public:
deba@430
    92
deba@430
    93
      ArcIt() { }
deba@430
    94
deba@430
    95
      ArcIt(Invalid i) : Arc(i) { }
deba@430
    96
deba@430
    97
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
    98
        _adaptor->first(static_cast<Arc&>(*this));
deba@430
    99
      }
deba@430
   100
deba@432
   101
      ArcIt(const Adaptor& adaptor, const Arc& e) :
deba@432
   102
        Arc(e), _adaptor(&adaptor) { }
deba@430
   103
deba@432
   104
      ArcIt& operator++() {
deba@432
   105
        _adaptor->next(*this);
deba@432
   106
        return *this;
deba@430
   107
      }
deba@430
   108
deba@430
   109
    };
deba@430
   110
deba@430
   111
deba@432
   112
    class OutArcIt : public Arc {
deba@430
   113
      const Adaptor* _adaptor;
deba@430
   114
    public:
deba@430
   115
deba@430
   116
      OutArcIt() { }
deba@430
   117
deba@430
   118
      OutArcIt(Invalid i) : Arc(i) { }
deba@430
   119
deba@432
   120
      OutArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   121
        : _adaptor(&adaptor) {
deba@432
   122
        _adaptor->firstOut(*this, node);
deba@430
   123
      }
deba@430
   124
deba@432
   125
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
deba@432
   126
        : Arc(arc), _adaptor(&adaptor) {}
deba@430
   127
deba@432
   128
      OutArcIt& operator++() {
deba@432
   129
        _adaptor->nextOut(*this);
deba@432
   130
        return *this;
deba@430
   131
      }
deba@430
   132
deba@430
   133
    };
deba@430
   134
deba@430
   135
deba@432
   136
    class InArcIt : public Arc {
deba@430
   137
      const Adaptor* _adaptor;
deba@430
   138
    public:
deba@430
   139
deba@430
   140
      InArcIt() { }
deba@430
   141
deba@430
   142
      InArcIt(Invalid i) : Arc(i) { }
deba@430
   143
deba@432
   144
      InArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   145
        : _adaptor(&adaptor) {
deba@432
   146
        _adaptor->firstIn(*this, node);
deba@430
   147
      }
deba@430
   148
deba@432
   149
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
deba@432
   150
        Arc(arc), _adaptor(&adaptor) {}
deba@430
   151
deba@432
   152
      InArcIt& operator++() {
deba@432
   153
        _adaptor->nextIn(*this);
deba@432
   154
        return *this;
deba@430
   155
      }
deba@430
   156
deba@430
   157
    };
deba@430
   158
deba@430
   159
    Node baseNode(const OutArcIt &e) const {
deba@430
   160
      return Parent::source(e);
deba@430
   161
    }
deba@430
   162
    Node runningNode(const OutArcIt &e) const {
deba@430
   163
      return Parent::target(e);
deba@430
   164
    }
deba@430
   165
deba@430
   166
    Node baseNode(const InArcIt &e) const {
deba@430
   167
      return Parent::target(e);
deba@430
   168
    }
deba@430
   169
    Node runningNode(const InArcIt &e) const {
deba@430
   170
      return Parent::source(e);
deba@430
   171
    }
deba@430
   172
deba@430
   173
  };
deba@430
   174
deba@432
   175
  template <typename _Graph>
deba@430
   176
  class GraphAdaptorExtender : public _Graph {
kpeter@664
   177
    typedef _Graph Parent;
kpeter@664
   178
deba@430
   179
  public:
deba@432
   180
deba@430
   181
    typedef _Graph Graph;
deba@430
   182
    typedef GraphAdaptorExtender Adaptor;
deba@430
   183
kpeter@965
   184
    typedef True UndirectedTag;
kpeter@965
   185
deba@430
   186
    typedef typename Parent::Node Node;
deba@430
   187
    typedef typename Parent::Arc Arc;
deba@430
   188
    typedef typename Parent::Edge Edge;
deba@430
   189
deba@432
   190
    // Graph extension
deba@430
   191
deba@430
   192
    int maxId(Node) const {
deba@430
   193
      return Parent::maxNodeId();
deba@430
   194
    }
deba@430
   195
deba@430
   196
    int maxId(Arc) const {
deba@430
   197
      return Parent::maxArcId();
deba@430
   198
    }
deba@430
   199
deba@430
   200
    int maxId(Edge) const {
deba@430
   201
      return Parent::maxEdgeId();
deba@430
   202
    }
deba@430
   203
deba@430
   204
    Node fromId(int id, Node) const {
deba@430
   205
      return Parent::nodeFromId(id);
deba@430
   206
    }
deba@430
   207
deba@430
   208
    Arc fromId(int id, Arc) const {
deba@430
   209
      return Parent::arcFromId(id);
deba@430
   210
    }
deba@430
   211
deba@430
   212
    Edge fromId(int id, Edge) const {
deba@430
   213
      return Parent::edgeFromId(id);
deba@430
   214
    }
deba@430
   215
deba@430
   216
    Node oppositeNode(const Node &n, const Edge &e) const {
deba@430
   217
      if( n == Parent::u(e))
deba@432
   218
        return Parent::v(e);
deba@430
   219
      else if( n == Parent::v(e))
deba@432
   220
        return Parent::u(e);
deba@430
   221
      else
deba@432
   222
        return INVALID;
deba@430
   223
    }
deba@430
   224
deba@430
   225
    Arc oppositeArc(const Arc &a) const {
deba@430
   226
      return Parent::direct(a, !Parent::direction(a));
deba@430
   227
    }
deba@430
   228
deba@430
   229
    using Parent::direct;
deba@430
   230
    Arc direct(const Edge &e, const Node &s) const {
deba@430
   231
      return Parent::direct(e, Parent::u(e) == s);
deba@430
   232
    }
deba@430
   233
deba@430
   234
deba@432
   235
    class NodeIt : public Node {
deba@430
   236
      const Adaptor* _adaptor;
deba@430
   237
    public:
deba@430
   238
deba@430
   239
      NodeIt() {}
deba@430
   240
deba@430
   241
      NodeIt(Invalid i) : Node(i) { }
deba@430
   242
deba@430
   243
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   244
        _adaptor->first(static_cast<Node&>(*this));
deba@430
   245
      }
deba@430
   246
deba@432
   247
      NodeIt(const Adaptor& adaptor, const Node& node)
deba@432
   248
        : Node(node), _adaptor(&adaptor) {}
deba@430
   249
deba@432
   250
      NodeIt& operator++() {
deba@432
   251
        _adaptor->next(*this);
deba@432
   252
        return *this;
deba@430
   253
      }
deba@430
   254
deba@430
   255
    };
deba@430
   256
deba@430
   257
deba@432
   258
    class ArcIt : public Arc {
deba@430
   259
      const Adaptor* _adaptor;
deba@430
   260
    public:
deba@430
   261
deba@430
   262
      ArcIt() { }
deba@430
   263
deba@430
   264
      ArcIt(Invalid i) : Arc(i) { }
deba@430
   265
deba@430
   266
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   267
        _adaptor->first(static_cast<Arc&>(*this));
deba@430
   268
      }
deba@430
   269
deba@432
   270
      ArcIt(const Adaptor& adaptor, const Arc& e) :
deba@432
   271
        Arc(e), _adaptor(&adaptor) { }
deba@430
   272
deba@432
   273
      ArcIt& operator++() {
deba@432
   274
        _adaptor->next(*this);
deba@432
   275
        return *this;
deba@430
   276
      }
deba@430
   277
deba@430
   278
    };
deba@430
   279
deba@430
   280
deba@432
   281
    class OutArcIt : public Arc {
deba@430
   282
      const Adaptor* _adaptor;
deba@430
   283
    public:
deba@430
   284
deba@430
   285
      OutArcIt() { }
deba@430
   286
deba@430
   287
      OutArcIt(Invalid i) : Arc(i) { }
deba@430
   288
deba@432
   289
      OutArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   290
        : _adaptor(&adaptor) {
deba@432
   291
        _adaptor->firstOut(*this, node);
deba@430
   292
      }
deba@430
   293
deba@432
   294
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
deba@432
   295
        : Arc(arc), _adaptor(&adaptor) {}
deba@430
   296
deba@432
   297
      OutArcIt& operator++() {
deba@432
   298
        _adaptor->nextOut(*this);
deba@432
   299
        return *this;
deba@430
   300
      }
deba@430
   301
deba@430
   302
    };
deba@430
   303
deba@430
   304
deba@432
   305
    class InArcIt : public Arc {
deba@430
   306
      const Adaptor* _adaptor;
deba@430
   307
    public:
deba@430
   308
deba@430
   309
      InArcIt() { }
deba@430
   310
deba@430
   311
      InArcIt(Invalid i) : Arc(i) { }
deba@430
   312
deba@432
   313
      InArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   314
        : _adaptor(&adaptor) {
deba@432
   315
        _adaptor->firstIn(*this, node);
deba@430
   316
      }
deba@430
   317
deba@432
   318
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
deba@432
   319
        Arc(arc), _adaptor(&adaptor) {}
deba@430
   320
deba@432
   321
      InArcIt& operator++() {
deba@432
   322
        _adaptor->nextIn(*this);
deba@432
   323
        return *this;
deba@430
   324
      }
deba@430
   325
deba@430
   326
    };
deba@430
   327
deba@432
   328
    class EdgeIt : public Parent::Edge {
deba@430
   329
      const Adaptor* _adaptor;
deba@430
   330
    public:
deba@430
   331
deba@430
   332
      EdgeIt() { }
deba@430
   333
deba@430
   334
      EdgeIt(Invalid i) : Edge(i) { }
deba@430
   335
deba@430
   336
      explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   337
        _adaptor->first(static_cast<Edge&>(*this));
deba@430
   338
      }
deba@430
   339
deba@432
   340
      EdgeIt(const Adaptor& adaptor, const Edge& e) :
deba@432
   341
        Edge(e), _adaptor(&adaptor) { }
deba@430
   342
deba@432
   343
      EdgeIt& operator++() {
deba@432
   344
        _adaptor->next(*this);
deba@432
   345
        return *this;
deba@430
   346
      }
deba@430
   347
deba@430
   348
    };
deba@430
   349
deba@432
   350
    class IncEdgeIt : public Edge {
deba@430
   351
      friend class GraphAdaptorExtender;
deba@430
   352
      const Adaptor* _adaptor;
deba@430
   353
      bool direction;
deba@430
   354
    public:
deba@430
   355
deba@430
   356
      IncEdgeIt() { }
deba@430
   357
deba@430
   358
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
deba@430
   359
deba@430
   360
      IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
deba@432
   361
        _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
deba@430
   362
      }
deba@430
   363
deba@430
   364
      IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
deba@432
   365
        : _adaptor(&adaptor), Edge(e) {
deba@432
   366
        direction = (_adaptor->u(e) == n);
deba@430
   367
      }
deba@430
   368
deba@430
   369
      IncEdgeIt& operator++() {
deba@432
   370
        _adaptor->nextInc(*this, direction);
deba@432
   371
        return *this;
deba@430
   372
      }
deba@430
   373
    };
deba@430
   374
deba@430
   375
    Node baseNode(const OutArcIt &a) const {
deba@430
   376
      return Parent::source(a);
deba@430
   377
    }
deba@430
   378
    Node runningNode(const OutArcIt &a) const {
deba@430
   379
      return Parent::target(a);
deba@430
   380
    }
deba@430
   381
deba@430
   382
    Node baseNode(const InArcIt &a) const {
deba@430
   383
      return Parent::target(a);
deba@430
   384
    }
deba@430
   385
    Node runningNode(const InArcIt &a) const {
deba@430
   386
      return Parent::source(a);
deba@430
   387
    }
deba@430
   388
deba@430
   389
    Node baseNode(const IncEdgeIt &e) const {
deba@430
   390
      return e.direction ? Parent::u(e) : Parent::v(e);
deba@430
   391
    }
deba@430
   392
    Node runningNode(const IncEdgeIt &e) const {
deba@430
   393
      return e.direction ? Parent::v(e) : Parent::u(e);
deba@430
   394
    }
deba@430
   395
deba@430
   396
  };
deba@430
   397
deba@430
   398
}
deba@430
   399
deba@430
   400
deba@430
   401
#endif