lemon/bits/graph_adaptor_extender.h
author Balazs Dezso <deba@inf.elte.hu>
Sun, 30 Nov 2008 19:18:32 +0100
changeset 432 76287c8caa26
parent 430 05357da973ce
child 463 88ed40ad0d4f
child 476 c246659c8b19
permissions -rw-r--r--
Reorganication of graph adaptors and doc improvements (#67)

- Moving to one file, lemon/adaptors.h
- Renamings
- Doc cleanings
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
 *
deba@430
     5
 * Copyright (C) 2003-2008
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
#include <lemon/bits/default_map.h>
deba@430
    26
deba@430
    27
namespace lemon {
deba@430
    28
deba@430
    29
  template <typename _Digraph>
deba@430
    30
  class DigraphAdaptorExtender : public _Digraph {
deba@430
    31
  public:
deba@430
    32
deba@430
    33
    typedef _Digraph Parent;
deba@430
    34
    typedef _Digraph Digraph;
deba@430
    35
    typedef DigraphAdaptorExtender Adaptor;
deba@430
    36
deba@430
    37
    // Base extensions
deba@430
    38
deba@430
    39
    typedef typename Parent::Node Node;
deba@430
    40
    typedef typename Parent::Arc Arc;
deba@430
    41
deba@430
    42
    int maxId(Node) const {
deba@430
    43
      return Parent::maxNodeId();
deba@430
    44
    }
deba@430
    45
deba@430
    46
    int maxId(Arc) const {
deba@430
    47
      return Parent::maxArcId();
deba@430
    48
    }
deba@430
    49
deba@430
    50
    Node fromId(int id, Node) const {
deba@430
    51
      return Parent::nodeFromId(id);
deba@430
    52
    }
deba@430
    53
deba@430
    54
    Arc fromId(int id, Arc) const {
deba@430
    55
      return Parent::arcFromId(id);
deba@430
    56
    }
deba@430
    57
deba@430
    58
    Node oppositeNode(const Node &n, const Arc &e) const {
deba@430
    59
      if (n == Parent::source(e))
deba@432
    60
        return Parent::target(e);
deba@430
    61
      else if(n==Parent::target(e))
deba@432
    62
        return Parent::source(e);
deba@430
    63
      else
deba@432
    64
        return INVALID;
deba@430
    65
    }
deba@430
    66
deba@432
    67
    class NodeIt : public Node {
deba@430
    68
      const Adaptor* _adaptor;
deba@430
    69
    public:
deba@430
    70
deba@430
    71
      NodeIt() {}
deba@430
    72
deba@430
    73
      NodeIt(Invalid i) : Node(i) { }
deba@430
    74
deba@430
    75
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
    76
        _adaptor->first(static_cast<Node&>(*this));
deba@430
    77
      }
deba@430
    78
deba@432
    79
      NodeIt(const Adaptor& adaptor, const Node& node)
deba@432
    80
        : Node(node), _adaptor(&adaptor) {}
deba@430
    81
deba@432
    82
      NodeIt& operator++() {
deba@432
    83
        _adaptor->next(*this);
deba@432
    84
        return *this;
deba@430
    85
      }
deba@430
    86
deba@430
    87
    };
deba@430
    88
deba@430
    89
deba@432
    90
    class ArcIt : public Arc {
deba@430
    91
      const Adaptor* _adaptor;
deba@430
    92
    public:
deba@430
    93
deba@430
    94
      ArcIt() { }
deba@430
    95
deba@430
    96
      ArcIt(Invalid i) : Arc(i) { }
deba@430
    97
deba@430
    98
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
    99
        _adaptor->first(static_cast<Arc&>(*this));
deba@430
   100
      }
deba@430
   101
deba@432
   102
      ArcIt(const Adaptor& adaptor, const Arc& e) :
deba@432
   103
        Arc(e), _adaptor(&adaptor) { }
deba@430
   104
deba@432
   105
      ArcIt& operator++() {
deba@432
   106
        _adaptor->next(*this);
deba@432
   107
        return *this;
deba@430
   108
      }
deba@430
   109
deba@430
   110
    };
deba@430
   111
deba@430
   112
deba@432
   113
    class OutArcIt : public Arc {
deba@430
   114
      const Adaptor* _adaptor;
deba@430
   115
    public:
deba@430
   116
deba@430
   117
      OutArcIt() { }
deba@430
   118
deba@430
   119
      OutArcIt(Invalid i) : Arc(i) { }
deba@430
   120
deba@432
   121
      OutArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   122
        : _adaptor(&adaptor) {
deba@432
   123
        _adaptor->firstOut(*this, node);
deba@430
   124
      }
deba@430
   125
deba@432
   126
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
deba@432
   127
        : Arc(arc), _adaptor(&adaptor) {}
deba@430
   128
deba@432
   129
      OutArcIt& operator++() {
deba@432
   130
        _adaptor->nextOut(*this);
deba@432
   131
        return *this;
deba@430
   132
      }
deba@430
   133
deba@430
   134
    };
deba@430
   135
deba@430
   136
deba@432
   137
    class InArcIt : public Arc {
deba@430
   138
      const Adaptor* _adaptor;
deba@430
   139
    public:
deba@430
   140
deba@430
   141
      InArcIt() { }
deba@430
   142
deba@430
   143
      InArcIt(Invalid i) : Arc(i) { }
deba@430
   144
deba@432
   145
      InArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   146
        : _adaptor(&adaptor) {
deba@432
   147
        _adaptor->firstIn(*this, node);
deba@430
   148
      }
deba@430
   149
deba@432
   150
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
deba@432
   151
        Arc(arc), _adaptor(&adaptor) {}
deba@430
   152
deba@432
   153
      InArcIt& operator++() {
deba@432
   154
        _adaptor->nextIn(*this);
deba@432
   155
        return *this;
deba@430
   156
      }
deba@430
   157
deba@430
   158
    };
deba@430
   159
deba@430
   160
    Node baseNode(const OutArcIt &e) const {
deba@430
   161
      return Parent::source(e);
deba@430
   162
    }
deba@430
   163
    Node runningNode(const OutArcIt &e) const {
deba@430
   164
      return Parent::target(e);
deba@430
   165
    }
deba@430
   166
deba@430
   167
    Node baseNode(const InArcIt &e) const {
deba@430
   168
      return Parent::target(e);
deba@430
   169
    }
deba@430
   170
    Node runningNode(const InArcIt &e) const {
deba@430
   171
      return Parent::source(e);
deba@430
   172
    }
deba@430
   173
deba@430
   174
  };
deba@430
   175
deba@430
   176
deba@430
   177
  /// \ingroup digraphbits
deba@430
   178
  ///
deba@430
   179
  /// \brief Extender for the GraphAdaptors
deba@432
   180
  template <typename _Graph>
deba@430
   181
  class GraphAdaptorExtender : public _Graph {
deba@430
   182
  public:
deba@432
   183
deba@430
   184
    typedef _Graph Parent;
deba@430
   185
    typedef _Graph Graph;
deba@430
   186
    typedef GraphAdaptorExtender Adaptor;
deba@430
   187
deba@430
   188
    typedef typename Parent::Node Node;
deba@430
   189
    typedef typename Parent::Arc Arc;
deba@430
   190
    typedef typename Parent::Edge Edge;
deba@430
   191
deba@432
   192
    // Graph extension
deba@430
   193
deba@430
   194
    int maxId(Node) const {
deba@430
   195
      return Parent::maxNodeId();
deba@430
   196
    }
deba@430
   197
deba@430
   198
    int maxId(Arc) const {
deba@430
   199
      return Parent::maxArcId();
deba@430
   200
    }
deba@430
   201
deba@430
   202
    int maxId(Edge) const {
deba@430
   203
      return Parent::maxEdgeId();
deba@430
   204
    }
deba@430
   205
deba@430
   206
    Node fromId(int id, Node) const {
deba@430
   207
      return Parent::nodeFromId(id);
deba@430
   208
    }
deba@430
   209
deba@430
   210
    Arc fromId(int id, Arc) const {
deba@430
   211
      return Parent::arcFromId(id);
deba@430
   212
    }
deba@430
   213
deba@430
   214
    Edge fromId(int id, Edge) const {
deba@430
   215
      return Parent::edgeFromId(id);
deba@430
   216
    }
deba@430
   217
deba@430
   218
    Node oppositeNode(const Node &n, const Edge &e) const {
deba@430
   219
      if( n == Parent::u(e))
deba@432
   220
        return Parent::v(e);
deba@430
   221
      else if( n == Parent::v(e))
deba@432
   222
        return Parent::u(e);
deba@430
   223
      else
deba@432
   224
        return INVALID;
deba@430
   225
    }
deba@430
   226
deba@430
   227
    Arc oppositeArc(const Arc &a) const {
deba@430
   228
      return Parent::direct(a, !Parent::direction(a));
deba@430
   229
    }
deba@430
   230
deba@430
   231
    using Parent::direct;
deba@430
   232
    Arc direct(const Edge &e, const Node &s) const {
deba@430
   233
      return Parent::direct(e, Parent::u(e) == s);
deba@430
   234
    }
deba@430
   235
deba@430
   236
deba@432
   237
    class NodeIt : public Node {
deba@430
   238
      const Adaptor* _adaptor;
deba@430
   239
    public:
deba@430
   240
deba@430
   241
      NodeIt() {}
deba@430
   242
deba@430
   243
      NodeIt(Invalid i) : Node(i) { }
deba@430
   244
deba@430
   245
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   246
        _adaptor->first(static_cast<Node&>(*this));
deba@430
   247
      }
deba@430
   248
deba@432
   249
      NodeIt(const Adaptor& adaptor, const Node& node)
deba@432
   250
        : Node(node), _adaptor(&adaptor) {}
deba@430
   251
deba@432
   252
      NodeIt& operator++() {
deba@432
   253
        _adaptor->next(*this);
deba@432
   254
        return *this;
deba@430
   255
      }
deba@430
   256
deba@430
   257
    };
deba@430
   258
deba@430
   259
deba@432
   260
    class ArcIt : public Arc {
deba@430
   261
      const Adaptor* _adaptor;
deba@430
   262
    public:
deba@430
   263
deba@430
   264
      ArcIt() { }
deba@430
   265
deba@430
   266
      ArcIt(Invalid i) : Arc(i) { }
deba@430
   267
deba@430
   268
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   269
        _adaptor->first(static_cast<Arc&>(*this));
deba@430
   270
      }
deba@430
   271
deba@432
   272
      ArcIt(const Adaptor& adaptor, const Arc& e) :
deba@432
   273
        Arc(e), _adaptor(&adaptor) { }
deba@430
   274
deba@432
   275
      ArcIt& operator++() {
deba@432
   276
        _adaptor->next(*this);
deba@432
   277
        return *this;
deba@430
   278
      }
deba@430
   279
deba@430
   280
    };
deba@430
   281
deba@430
   282
deba@432
   283
    class OutArcIt : public Arc {
deba@430
   284
      const Adaptor* _adaptor;
deba@430
   285
    public:
deba@430
   286
deba@430
   287
      OutArcIt() { }
deba@430
   288
deba@430
   289
      OutArcIt(Invalid i) : Arc(i) { }
deba@430
   290
deba@432
   291
      OutArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   292
        : _adaptor(&adaptor) {
deba@432
   293
        _adaptor->firstOut(*this, node);
deba@430
   294
      }
deba@430
   295
deba@432
   296
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
deba@432
   297
        : Arc(arc), _adaptor(&adaptor) {}
deba@430
   298
deba@432
   299
      OutArcIt& operator++() {
deba@432
   300
        _adaptor->nextOut(*this);
deba@432
   301
        return *this;
deba@430
   302
      }
deba@430
   303
deba@430
   304
    };
deba@430
   305
deba@430
   306
deba@432
   307
    class InArcIt : public Arc {
deba@430
   308
      const Adaptor* _adaptor;
deba@430
   309
    public:
deba@430
   310
deba@430
   311
      InArcIt() { }
deba@430
   312
deba@430
   313
      InArcIt(Invalid i) : Arc(i) { }
deba@430
   314
deba@432
   315
      InArcIt(const Adaptor& adaptor, const Node& node)
deba@432
   316
        : _adaptor(&adaptor) {
deba@432
   317
        _adaptor->firstIn(*this, node);
deba@430
   318
      }
deba@430
   319
deba@432
   320
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
deba@432
   321
        Arc(arc), _adaptor(&adaptor) {}
deba@430
   322
deba@432
   323
      InArcIt& operator++() {
deba@432
   324
        _adaptor->nextIn(*this);
deba@432
   325
        return *this;
deba@430
   326
      }
deba@430
   327
deba@430
   328
    };
deba@430
   329
deba@432
   330
    class EdgeIt : public Parent::Edge {
deba@430
   331
      const Adaptor* _adaptor;
deba@430
   332
    public:
deba@430
   333
deba@430
   334
      EdgeIt() { }
deba@430
   335
deba@430
   336
      EdgeIt(Invalid i) : Edge(i) { }
deba@430
   337
deba@430
   338
      explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
deba@432
   339
        _adaptor->first(static_cast<Edge&>(*this));
deba@430
   340
      }
deba@430
   341
deba@432
   342
      EdgeIt(const Adaptor& adaptor, const Edge& e) :
deba@432
   343
        Edge(e), _adaptor(&adaptor) { }
deba@430
   344
deba@432
   345
      EdgeIt& operator++() {
deba@432
   346
        _adaptor->next(*this);
deba@432
   347
        return *this;
deba@430
   348
      }
deba@430
   349
deba@430
   350
    };
deba@430
   351
deba@432
   352
    class IncEdgeIt : public Edge {
deba@430
   353
      friend class GraphAdaptorExtender;
deba@430
   354
      const Adaptor* _adaptor;
deba@430
   355
      bool direction;
deba@430
   356
    public:
deba@430
   357
deba@430
   358
      IncEdgeIt() { }
deba@430
   359
deba@430
   360
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
deba@430
   361
deba@430
   362
      IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
deba@432
   363
        _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
deba@430
   364
      }
deba@430
   365
deba@430
   366
      IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
deba@432
   367
        : _adaptor(&adaptor), Edge(e) {
deba@432
   368
        direction = (_adaptor->u(e) == n);
deba@430
   369
      }
deba@430
   370
deba@430
   371
      IncEdgeIt& operator++() {
deba@432
   372
        _adaptor->nextInc(*this, direction);
deba@432
   373
        return *this;
deba@430
   374
      }
deba@430
   375
    };
deba@430
   376
deba@430
   377
    Node baseNode(const OutArcIt &a) const {
deba@430
   378
      return Parent::source(a);
deba@430
   379
    }
deba@430
   380
    Node runningNode(const OutArcIt &a) const {
deba@430
   381
      return Parent::target(a);
deba@430
   382
    }
deba@430
   383
deba@430
   384
    Node baseNode(const InArcIt &a) const {
deba@430
   385
      return Parent::target(a);
deba@430
   386
    }
deba@430
   387
    Node runningNode(const InArcIt &a) const {
deba@430
   388
      return Parent::source(a);
deba@430
   389
    }
deba@430
   390
deba@430
   391
    Node baseNode(const IncEdgeIt &e) const {
deba@430
   392
      return e.direction ? Parent::u(e) : Parent::v(e);
deba@430
   393
    }
deba@430
   394
    Node runningNode(const IncEdgeIt &e) const {
deba@430
   395
      return e.direction ? Parent::v(e) : Parent::u(e);
deba@430
   396
    }
deba@430
   397
deba@430
   398
  };
deba@430
   399
deba@430
   400
}
deba@430
   401
deba@430
   402
deba@430
   403
#endif