lemon/bits/edge_set_extender.h
author Alpar Juttner <alpar@cs.elte.hu>
Tue, 06 Apr 2010 06:52:48 +0200
branch1.2
changeset 968 77704bf2a4ae
parent 956 141f9c0db4a3
parent 965 ece1f8a3052d
child 1110 02c93d1f00d7
permissions -rw-r--r--
Merge bugfix #364 to branch 1.2
alpar@956
     1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
deba@491
     2
 *
alpar@956
     3
 * This file is a part of LEMON, a generic C++ optimization library.
deba@491
     4
 *
alpar@956
     5
 * Copyright (C) 2003-2010
deba@491
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@491
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@491
     8
 *
deba@491
     9
 * Permission to use, modify and distribute this software is granted
deba@491
    10
 * provided that this copyright notice appears in all copies. For
deba@491
    11
 * precise terms see the accompanying LICENSE file.
deba@491
    12
 *
deba@491
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@491
    14
 * express or implied, and with no claim as to its suitability for any
deba@491
    15
 * purpose.
deba@491
    16
 *
deba@491
    17
 */
deba@491
    18
deba@491
    19
#ifndef LEMON_BITS_EDGE_SET_EXTENDER_H
deba@491
    20
#define LEMON_BITS_EDGE_SET_EXTENDER_H
deba@491
    21
deba@566
    22
#include <lemon/core.h>
deba@491
    23
#include <lemon/error.h>
deba@491
    24
#include <lemon/bits/default_map.h>
deba@566
    25
#include <lemon/bits/map_extender.h>
deba@491
    26
kpeter@606
    27
//\ingroup digraphbits
kpeter@606
    28
//\file
kpeter@606
    29
//\brief Extenders for the arc set types
deba@491
    30
namespace lemon {
deba@491
    31
kpeter@606
    32
  // \ingroup digraphbits
kpeter@606
    33
  //
kpeter@606
    34
  // \brief Extender for the ArcSets
deba@491
    35
  template <typename Base>
deba@491
    36
  class ArcSetExtender : public Base {
kpeter@664
    37
    typedef Base Parent;
kpeter@664
    38
deba@491
    39
  public:
deba@491
    40
deba@491
    41
    typedef ArcSetExtender Digraph;
deba@491
    42
deba@491
    43
    // Base extensions
deba@491
    44
deba@491
    45
    typedef typename Parent::Node Node;
deba@491
    46
    typedef typename Parent::Arc Arc;
deba@491
    47
deba@491
    48
    int maxId(Node) const {
deba@491
    49
      return Parent::maxNodeId();
deba@491
    50
    }
deba@491
    51
deba@491
    52
    int maxId(Arc) const {
deba@491
    53
      return Parent::maxArcId();
deba@491
    54
    }
deba@491
    55
deba@491
    56
    Node fromId(int id, Node) const {
deba@491
    57
      return Parent::nodeFromId(id);
deba@491
    58
    }
deba@491
    59
deba@491
    60
    Arc fromId(int id, Arc) const {
deba@491
    61
      return Parent::arcFromId(id);
deba@491
    62
    }
deba@491
    63
deba@491
    64
    Node oppositeNode(const Node &n, const Arc &e) const {
deba@491
    65
      if (n == Parent::source(e))
alpar@956
    66
        return Parent::target(e);
deba@491
    67
      else if(n==Parent::target(e))
alpar@956
    68
        return Parent::source(e);
deba@491
    69
      else
alpar@956
    70
        return INVALID;
deba@491
    71
    }
deba@491
    72
deba@491
    73
deba@491
    74
    // Alteration notifier extensions
deba@491
    75
kpeter@606
    76
    // The arc observer registry.
deba@491
    77
    typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;
deba@491
    78
deba@491
    79
  protected:
deba@491
    80
deba@491
    81
    mutable ArcNotifier arc_notifier;
deba@491
    82
deba@491
    83
  public:
deba@491
    84
deba@491
    85
    using Parent::notifier;
deba@491
    86
kpeter@606
    87
    // Gives back the arc alteration notifier.
deba@491
    88
    ArcNotifier& notifier(Arc) const {
deba@491
    89
      return arc_notifier;
deba@491
    90
    }
deba@491
    91
deba@491
    92
    // Iterable extensions
deba@491
    93
alpar@956
    94
    class NodeIt : public Node {
deba@491
    95
      const Digraph* digraph;
deba@491
    96
    public:
deba@491
    97
deba@491
    98
      NodeIt() {}
deba@491
    99
deba@491
   100
      NodeIt(Invalid i) : Node(i) { }
deba@491
   101
deba@491
   102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
alpar@956
   103
        _graph.first(static_cast<Node&>(*this));
deba@491
   104
      }
deba@491
   105
alpar@956
   106
      NodeIt(const Digraph& _graph, const Node& node)
alpar@956
   107
        : Node(node), digraph(&_graph) {}
deba@491
   108
alpar@956
   109
      NodeIt& operator++() {
alpar@956
   110
        digraph->next(*this);
alpar@956
   111
        return *this;
deba@491
   112
      }
deba@491
   113
deba@491
   114
    };
deba@491
   115
deba@491
   116
alpar@956
   117
    class ArcIt : public Arc {
deba@491
   118
      const Digraph* digraph;
deba@491
   119
    public:
deba@491
   120
deba@491
   121
      ArcIt() { }
deba@491
   122
deba@491
   123
      ArcIt(Invalid i) : Arc(i) { }
deba@491
   124
deba@491
   125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
alpar@956
   126
        _graph.first(static_cast<Arc&>(*this));
deba@491
   127
      }
deba@491
   128
alpar@956
   129
      ArcIt(const Digraph& _graph, const Arc& e) :
alpar@956
   130
        Arc(e), digraph(&_graph) { }
deba@491
   131
alpar@956
   132
      ArcIt& operator++() {
alpar@956
   133
        digraph->next(*this);
alpar@956
   134
        return *this;
deba@491
   135
      }
deba@491
   136
deba@491
   137
    };
deba@491
   138
deba@491
   139
alpar@956
   140
    class OutArcIt : public Arc {
deba@491
   141
      const Digraph* digraph;
deba@491
   142
    public:
deba@491
   143
deba@491
   144
      OutArcIt() { }
deba@491
   145
deba@491
   146
      OutArcIt(Invalid i) : Arc(i) { }
deba@491
   147
alpar@956
   148
      OutArcIt(const Digraph& _graph, const Node& node)
alpar@956
   149
        : digraph(&_graph) {
alpar@956
   150
        _graph.firstOut(*this, node);
deba@491
   151
      }
deba@491
   152
alpar@956
   153
      OutArcIt(const Digraph& _graph, const Arc& arc)
alpar@956
   154
        : Arc(arc), digraph(&_graph) {}
deba@491
   155
alpar@956
   156
      OutArcIt& operator++() {
alpar@956
   157
        digraph->nextOut(*this);
alpar@956
   158
        return *this;
deba@491
   159
      }
deba@491
   160
deba@491
   161
    };
deba@491
   162
deba@491
   163
alpar@956
   164
    class InArcIt : public Arc {
deba@491
   165
      const Digraph* digraph;
deba@491
   166
    public:
deba@491
   167
deba@491
   168
      InArcIt() { }
deba@491
   169
deba@491
   170
      InArcIt(Invalid i) : Arc(i) { }
deba@491
   171
alpar@956
   172
      InArcIt(const Digraph& _graph, const Node& node)
alpar@956
   173
        : digraph(&_graph) {
alpar@956
   174
        _graph.firstIn(*this, node);
deba@491
   175
      }
deba@491
   176
alpar@956
   177
      InArcIt(const Digraph& _graph, const Arc& arc) :
alpar@956
   178
        Arc(arc), digraph(&_graph) {}
deba@491
   179
alpar@956
   180
      InArcIt& operator++() {
alpar@956
   181
        digraph->nextIn(*this);
alpar@956
   182
        return *this;
deba@491
   183
      }
deba@491
   184
deba@491
   185
    };
deba@491
   186
kpeter@606
   187
    // \brief Base node of the iterator
kpeter@606
   188
    //
kpeter@606
   189
    // Returns the base node (ie. the source in this case) of the iterator
deba@491
   190
    Node baseNode(const OutArcIt &e) const {
deba@491
   191
      return Parent::source(static_cast<const Arc&>(e));
deba@491
   192
    }
kpeter@606
   193
    // \brief Running node of the iterator
kpeter@606
   194
    //
kpeter@606
   195
    // Returns the running node (ie. the target in this case) of the
kpeter@606
   196
    // iterator
deba@491
   197
    Node runningNode(const OutArcIt &e) const {
deba@491
   198
      return Parent::target(static_cast<const Arc&>(e));
deba@491
   199
    }
deba@491
   200
kpeter@606
   201
    // \brief Base node of the iterator
kpeter@606
   202
    //
kpeter@606
   203
    // Returns the base node (ie. the target in this case) of the iterator
deba@491
   204
    Node baseNode(const InArcIt &e) const {
deba@491
   205
      return Parent::target(static_cast<const Arc&>(e));
deba@491
   206
    }
kpeter@606
   207
    // \brief Running node of the iterator
kpeter@606
   208
    //
kpeter@606
   209
    // Returns the running node (ie. the source in this case) of the
kpeter@606
   210
    // iterator
deba@491
   211
    Node runningNode(const InArcIt &e) const {
deba@491
   212
      return Parent::source(static_cast<const Arc&>(e));
deba@491
   213
    }
deba@491
   214
deba@491
   215
    using Parent::first;
deba@491
   216
deba@491
   217
    // Mappable extension
alpar@956
   218
deba@491
   219
    template <typename _Value>
alpar@956
   220
    class ArcMap
deba@491
   221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
deba@491
   222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
deba@491
   223
kpeter@664
   224
    public:
alpar@956
   225
      explicit ArcMap(const Digraph& _g)
alpar@956
   226
        : Parent(_g) {}
alpar@956
   227
      ArcMap(const Digraph& _g, const _Value& _v)
alpar@956
   228
        : Parent(_g, _v) {}
deba@491
   229
deba@491
   230
      ArcMap& operator=(const ArcMap& cmap) {
alpar@956
   231
        return operator=<ArcMap>(cmap);
deba@491
   232
      }
deba@491
   233
deba@491
   234
      template <typename CMap>
deba@491
   235
      ArcMap& operator=(const CMap& cmap) {
deba@491
   236
        Parent::operator=(cmap);
alpar@956
   237
        return *this;
deba@491
   238
      }
deba@491
   239
deba@491
   240
    };
deba@491
   241
deba@491
   242
deba@491
   243
    // Alteration extension
deba@491
   244
deba@491
   245
    Arc addArc(const Node& from, const Node& to) {
deba@491
   246
      Arc arc = Parent::addArc(from, to);
deba@491
   247
      notifier(Arc()).add(arc);
deba@491
   248
      return arc;
deba@491
   249
    }
alpar@956
   250
deba@491
   251
    void clear() {
deba@491
   252
      notifier(Arc()).clear();
deba@491
   253
      Parent::clear();
deba@491
   254
    }
deba@491
   255
deba@491
   256
    void erase(const Arc& arc) {
deba@491
   257
      notifier(Arc()).erase(arc);
deba@491
   258
      Parent::erase(arc);
deba@491
   259
    }
deba@491
   260
deba@491
   261
    ArcSetExtender() {
deba@491
   262
      arc_notifier.setContainer(*this);
deba@491
   263
    }
deba@491
   264
deba@491
   265
    ~ArcSetExtender() {
deba@491
   266
      arc_notifier.clear();
deba@491
   267
    }
deba@491
   268
deba@491
   269
  };
deba@491
   270
deba@491
   271
kpeter@606
   272
  // \ingroup digraphbits
kpeter@606
   273
  //
kpeter@606
   274
  // \brief Extender for the EdgeSets
deba@491
   275
  template <typename Base>
deba@491
   276
  class EdgeSetExtender : public Base {
kpeter@664
   277
    typedef Base Parent;
deba@491
   278
deba@491
   279
  public:
deba@491
   280
kpeter@664
   281
    typedef EdgeSetExtender Graph;
deba@491
   282
kpeter@965
   283
    typedef True UndirectedTag;
kpeter@965
   284
deba@491
   285
    typedef typename Parent::Node Node;
deba@491
   286
    typedef typename Parent::Arc Arc;
deba@491
   287
    typedef typename Parent::Edge Edge;
deba@491
   288
deba@491
   289
    int maxId(Node) const {
deba@491
   290
      return Parent::maxNodeId();
deba@491
   291
    }
deba@491
   292
deba@491
   293
    int maxId(Arc) const {
deba@491
   294
      return Parent::maxArcId();
deba@491
   295
    }
deba@491
   296
deba@491
   297
    int maxId(Edge) const {
deba@491
   298
      return Parent::maxEdgeId();
deba@491
   299
    }
deba@491
   300
deba@491
   301
    Node fromId(int id, Node) const {
deba@491
   302
      return Parent::nodeFromId(id);
deba@491
   303
    }
deba@491
   304
deba@491
   305
    Arc fromId(int id, Arc) const {
deba@491
   306
      return Parent::arcFromId(id);
deba@491
   307
    }
deba@491
   308
deba@491
   309
    Edge fromId(int id, Edge) const {
deba@491
   310
      return Parent::edgeFromId(id);
deba@491
   311
    }
deba@491
   312
deba@491
   313
    Node oppositeNode(const Node &n, const Edge &e) const {
deba@491
   314
      if( n == Parent::u(e))
alpar@956
   315
        return Parent::v(e);
deba@491
   316
      else if( n == Parent::v(e))
alpar@956
   317
        return Parent::u(e);
deba@491
   318
      else
alpar@956
   319
        return INVALID;
deba@491
   320
    }
deba@491
   321
deba@491
   322
    Arc oppositeArc(const Arc &e) const {
deba@491
   323
      return Parent::direct(e, !Parent::direction(e));
deba@491
   324
    }
deba@491
   325
deba@491
   326
    using Parent::direct;
deba@491
   327
    Arc direct(const Edge &e, const Node &s) const {
deba@491
   328
      return Parent::direct(e, Parent::u(e) == s);
deba@491
   329
    }
deba@491
   330
deba@491
   331
    typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;
deba@491
   332
    typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;
deba@491
   333
deba@491
   334
deba@491
   335
  protected:
deba@491
   336
deba@491
   337
    mutable ArcNotifier arc_notifier;
deba@491
   338
    mutable EdgeNotifier edge_notifier;
deba@491
   339
deba@491
   340
  public:
deba@491
   341
deba@491
   342
    using Parent::notifier;
alpar@956
   343
deba@491
   344
    ArcNotifier& notifier(Arc) const {
deba@491
   345
      return arc_notifier;
deba@491
   346
    }
deba@491
   347
deba@491
   348
    EdgeNotifier& notifier(Edge) const {
deba@491
   349
      return edge_notifier;
deba@491
   350
    }
deba@491
   351
deba@491
   352
alpar@956
   353
    class NodeIt : public Node {
kpeter@664
   354
      const Graph* graph;
deba@491
   355
    public:
deba@491
   356
deba@491
   357
      NodeIt() {}
deba@491
   358
deba@491
   359
      NodeIt(Invalid i) : Node(i) { }
deba@491
   360
kpeter@664
   361
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
alpar@956
   362
        _graph.first(static_cast<Node&>(*this));
deba@491
   363
      }
deba@491
   364
alpar@956
   365
      NodeIt(const Graph& _graph, const Node& node)
alpar@956
   366
        : Node(node), graph(&_graph) {}
deba@491
   367
alpar@956
   368
      NodeIt& operator++() {
alpar@956
   369
        graph->next(*this);
alpar@956
   370
        return *this;
deba@491
   371
      }
deba@491
   372
deba@491
   373
    };
deba@491
   374
deba@491
   375
alpar@956
   376
    class ArcIt : public Arc {
kpeter@664
   377
      const Graph* graph;
deba@491
   378
    public:
deba@491
   379
deba@491
   380
      ArcIt() { }
deba@491
   381
deba@491
   382
      ArcIt(Invalid i) : Arc(i) { }
deba@491
   383
kpeter@664
   384
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
alpar@956
   385
        _graph.first(static_cast<Arc&>(*this));
deba@491
   386
      }
deba@491
   387
alpar@956
   388
      ArcIt(const Graph& _graph, const Arc& e) :
alpar@956
   389
        Arc(e), graph(&_graph) { }
deba@491
   390
alpar@956
   391
      ArcIt& operator++() {
alpar@956
   392
        graph->next(*this);
alpar@956
   393
        return *this;
deba@491
   394
      }
deba@491
   395
deba@491
   396
    };
deba@491
   397
deba@491
   398
alpar@956
   399
    class OutArcIt : public Arc {
kpeter@664
   400
      const Graph* graph;
deba@491
   401
    public:
deba@491
   402
deba@491
   403
      OutArcIt() { }
deba@491
   404
deba@491
   405
      OutArcIt(Invalid i) : Arc(i) { }
deba@491
   406
alpar@956
   407
      OutArcIt(const Graph& _graph, const Node& node)
alpar@956
   408
        : graph(&_graph) {
alpar@956
   409
        _graph.firstOut(*this, node);
deba@491
   410
      }
deba@491
   411
alpar@956
   412
      OutArcIt(const Graph& _graph, const Arc& arc)
alpar@956
   413
        : Arc(arc), graph(&_graph) {}
deba@491
   414
alpar@956
   415
      OutArcIt& operator++() {
alpar@956
   416
        graph->nextOut(*this);
alpar@956
   417
        return *this;
deba@491
   418
      }
deba@491
   419
deba@491
   420
    };
deba@491
   421
deba@491
   422
alpar@956
   423
    class InArcIt : public Arc {
kpeter@664
   424
      const Graph* graph;
deba@491
   425
    public:
deba@491
   426
deba@491
   427
      InArcIt() { }
deba@491
   428
deba@491
   429
      InArcIt(Invalid i) : Arc(i) { }
deba@491
   430
alpar@956
   431
      InArcIt(const Graph& _graph, const Node& node)
alpar@956
   432
        : graph(&_graph) {
alpar@956
   433
        _graph.firstIn(*this, node);
deba@491
   434
      }
deba@491
   435
alpar@956
   436
      InArcIt(const Graph& _graph, const Arc& arc) :
alpar@956
   437
        Arc(arc), graph(&_graph) {}
deba@491
   438
alpar@956
   439
      InArcIt& operator++() {
alpar@956
   440
        graph->nextIn(*this);
alpar@956
   441
        return *this;
deba@491
   442
      }
deba@491
   443
deba@491
   444
    };
deba@491
   445
deba@491
   446
alpar@956
   447
    class EdgeIt : public Parent::Edge {
kpeter@664
   448
      const Graph* graph;
deba@491
   449
    public:
deba@491
   450
deba@491
   451
      EdgeIt() { }
deba@491
   452
deba@491
   453
      EdgeIt(Invalid i) : Edge(i) { }
deba@491
   454
kpeter@664
   455
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
alpar@956
   456
        _graph.first(static_cast<Edge&>(*this));
deba@491
   457
      }
deba@491
   458
alpar@956
   459
      EdgeIt(const Graph& _graph, const Edge& e) :
alpar@956
   460
        Edge(e), graph(&_graph) { }
deba@491
   461
alpar@956
   462
      EdgeIt& operator++() {
alpar@956
   463
        graph->next(*this);
alpar@956
   464
        return *this;
deba@491
   465
      }
deba@491
   466
deba@491
   467
    };
deba@491
   468
deba@491
   469
    class IncEdgeIt : public Parent::Edge {
deba@491
   470
      friend class EdgeSetExtender;
kpeter@664
   471
      const Graph* graph;
deba@491
   472
      bool direction;
deba@491
   473
    public:
deba@491
   474
deba@491
   475
      IncEdgeIt() { }
deba@491
   476
deba@491
   477
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
deba@491
   478
kpeter@664
   479
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
alpar@956
   480
        _graph.firstInc(*this, direction, n);
deba@491
   481
      }
deba@491
   482
kpeter@664
   483
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
alpar@956
   484
        : graph(&_graph), Edge(ue) {
alpar@956
   485
        direction = (_graph.source(ue) == n);
deba@491
   486
      }
deba@491
   487
deba@491
   488
      IncEdgeIt& operator++() {
alpar@956
   489
        graph->nextInc(*this, direction);
alpar@956
   490
        return *this;
deba@491
   491
      }
deba@491
   492
    };
deba@491
   493
kpeter@606
   494
    // \brief Base node of the iterator
kpeter@606
   495
    //
kpeter@606
   496
    // Returns the base node (ie. the source in this case) of the iterator
deba@491
   497
    Node baseNode(const OutArcIt &e) const {
deba@491
   498
      return Parent::source(static_cast<const Arc&>(e));
deba@491
   499
    }
kpeter@606
   500
    // \brief Running node of the iterator
kpeter@606
   501
    //
kpeter@606
   502
    // Returns the running node (ie. the target in this case) of the
kpeter@606
   503
    // iterator
deba@491
   504
    Node runningNode(const OutArcIt &e) const {
deba@491
   505
      return Parent::target(static_cast<const Arc&>(e));
deba@491
   506
    }
deba@491
   507
kpeter@606
   508
    // \brief Base node of the iterator
kpeter@606
   509
    //
kpeter@606
   510
    // Returns the base node (ie. the target in this case) of the iterator
deba@491
   511
    Node baseNode(const InArcIt &e) const {
deba@491
   512
      return Parent::target(static_cast<const Arc&>(e));
deba@491
   513
    }
kpeter@606
   514
    // \brief Running node of the iterator
kpeter@606
   515
    //
kpeter@606
   516
    // Returns the running node (ie. the source in this case) of the
kpeter@606
   517
    // iterator
deba@491
   518
    Node runningNode(const InArcIt &e) const {
deba@491
   519
      return Parent::source(static_cast<const Arc&>(e));
deba@491
   520
    }
deba@491
   521
kpeter@606
   522
    // Base node of the iterator
kpeter@606
   523
    //
kpeter@606
   524
    // Returns the base node of the iterator
deba@491
   525
    Node baseNode(const IncEdgeIt &e) const {
deba@491
   526
      return e.direction ? u(e) : v(e);
deba@491
   527
    }
kpeter@606
   528
    // Running node of the iterator
kpeter@606
   529
    //
kpeter@606
   530
    // Returns the running node of the iterator
deba@491
   531
    Node runningNode(const IncEdgeIt &e) const {
deba@491
   532
      return e.direction ? v(e) : u(e);
deba@491
   533
    }
deba@491
   534
deba@491
   535
deba@491
   536
    template <typename _Value>
alpar@956
   537
    class ArcMap
kpeter@664
   538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
kpeter@664
   539
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
kpeter@664
   540
deba@491
   541
    public:
alpar@956
   542
      explicit ArcMap(const Graph& _g)
alpar@956
   543
        : Parent(_g) {}
alpar@956
   544
      ArcMap(const Graph& _g, const _Value& _v)
alpar@956
   545
        : Parent(_g, _v) {}
deba@491
   546
deba@491
   547
      ArcMap& operator=(const ArcMap& cmap) {
alpar@956
   548
        return operator=<ArcMap>(cmap);
deba@491
   549
      }
deba@491
   550
deba@491
   551
      template <typename CMap>
deba@491
   552
      ArcMap& operator=(const CMap& cmap) {
deba@491
   553
        Parent::operator=(cmap);
alpar@956
   554
        return *this;
deba@491
   555
      }
deba@491
   556
deba@491
   557
    };
deba@491
   558
deba@491
   559
deba@491
   560
    template <typename _Value>
alpar@956
   561
    class EdgeMap
kpeter@664
   562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
kpeter@664
   563
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
kpeter@664
   564
deba@491
   565
    public:
alpar@956
   566
      explicit EdgeMap(const Graph& _g)
alpar@956
   567
        : Parent(_g) {}
deba@491
   568
alpar@956
   569
      EdgeMap(const Graph& _g, const _Value& _v)
alpar@956
   570
        : Parent(_g, _v) {}
deba@491
   571
deba@491
   572
      EdgeMap& operator=(const EdgeMap& cmap) {
alpar@956
   573
        return operator=<EdgeMap>(cmap);
deba@491
   574
      }
deba@491
   575
deba@491
   576
      template <typename CMap>
deba@491
   577
      EdgeMap& operator=(const CMap& cmap) {
deba@491
   578
        Parent::operator=(cmap);
alpar@956
   579
        return *this;
deba@491
   580
      }
deba@491
   581
deba@491
   582
    };
deba@491
   583
deba@491
   584
deba@491
   585
    // Alteration extension
deba@491
   586
deba@491
   587
    Edge addEdge(const Node& from, const Node& to) {
deba@491
   588
      Edge edge = Parent::addEdge(from, to);
deba@491
   589
      notifier(Edge()).add(edge);
deba@491
   590
      std::vector<Arc> arcs;
deba@491
   591
      arcs.push_back(Parent::direct(edge, true));
deba@491
   592
      arcs.push_back(Parent::direct(edge, false));
deba@491
   593
      notifier(Arc()).add(arcs);
deba@491
   594
      return edge;
deba@491
   595
    }
alpar@956
   596
deba@491
   597
    void clear() {
deba@491
   598
      notifier(Arc()).clear();
deba@491
   599
      notifier(Edge()).clear();
deba@491
   600
      Parent::clear();
deba@491
   601
    }
deba@491
   602
deba@491
   603
    void erase(const Edge& edge) {
deba@491
   604
      std::vector<Arc> arcs;
deba@491
   605
      arcs.push_back(Parent::direct(edge, true));
deba@491
   606
      arcs.push_back(Parent::direct(edge, false));
deba@491
   607
      notifier(Arc()).erase(arcs);
deba@491
   608
      notifier(Edge()).erase(edge);
deba@491
   609
      Parent::erase(edge);
deba@491
   610
    }
deba@491
   611
deba@491
   612
deba@491
   613
    EdgeSetExtender() {
deba@491
   614
      arc_notifier.setContainer(*this);
deba@491
   615
      edge_notifier.setContainer(*this);
deba@491
   616
    }
deba@491
   617
deba@491
   618
    ~EdgeSetExtender() {
deba@491
   619
      edge_notifier.clear();
deba@491
   620
      arc_notifier.clear();
deba@491
   621
    }
alpar@956
   622
deba@491
   623
  };
deba@491
   624
deba@491
   625
}
deba@491
   626
deba@491
   627
#endif