lemon/bits/graph_extender.h
author athos
Tue, 20 Jun 2006 15:20:08 +0000
changeset 2102 eb73ab0e4c74
parent 2098 12f67fa3df7d
child 2115 4cd528a30ec1
permissions -rw-r--r--
Slight changes in doc.
deba@1791
     1
/* -*- C++ -*-
deba@1791
     2
 *
alpar@1956
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@1956
     4
 *
alpar@1956
     5
 * Copyright (C) 2003-2006
alpar@1956
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@1956
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@1791
     8
 *
deba@1791
     9
 * Permission to use, modify and distribute this software is granted
deba@1791
    10
 * provided that this copyright notice appears in all copies. For
deba@1791
    11
 * precise terms see the accompanying LICENSE file.
deba@1791
    12
 *
deba@1791
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@1791
    14
 * express or implied, and with no claim as to its suitability for any
deba@1791
    15
 * purpose.
deba@1791
    16
 *
deba@1791
    17
 */
deba@1791
    18
deba@1996
    19
#ifndef LEMON_BITS_GRAPH_EXTENDER_H
deba@1996
    20
#define LEMON_BITS_GRAPH_EXTENDER_H
deba@1791
    21
deba@1993
    22
#include <lemon/bits/invalid.h>
deba@1820
    23
#include <lemon/error.h>
deba@1791
    24
deba@1999
    25
#include <lemon/bits/map_extender.h>
deba@1979
    26
#include <lemon/bits/default_map.h>
deba@1979
    27
deba@1999
    28
#include <lemon/concept_check.h>
deba@1999
    29
#include <lemon/concept/maps.h>
deba@1999
    30
deba@1996
    31
///\ingroup graphbits
deba@1996
    32
///\file
deba@1996
    33
///\brief Extenders for the graph types
deba@1791
    34
namespace lemon {
deba@1791
    35
deba@1996
    36
  /// \ingroup graphbits
deba@1996
    37
  ///
deba@1996
    38
  /// \brief Extender for the Graphs
deba@1979
    39
  template <typename Base>
deba@1979
    40
  class GraphExtender : public Base {
deba@1791
    41
  public:
deba@1791
    42
deba@1979
    43
    typedef Base Parent;
deba@1791
    44
    typedef GraphExtender Graph;
deba@1791
    45
deba@1979
    46
    // Base extensions
deba@1979
    47
deba@1791
    48
    typedef typename Parent::Node Node;
deba@1791
    49
    typedef typename Parent::Edge Edge;
deba@1791
    50
deba@1791
    51
    int maxId(Node) const {
deba@1791
    52
      return Parent::maxNodeId();
deba@1791
    53
    }
deba@1791
    54
deba@1791
    55
    int maxId(Edge) const {
deba@1791
    56
      return Parent::maxEdgeId();
deba@1791
    57
    }
deba@1791
    58
deba@1791
    59
    Node fromId(int id, Node) const {
deba@1791
    60
      return Parent::nodeFromId(id);
deba@1791
    61
    }
deba@1791
    62
deba@1791
    63
    Edge fromId(int id, Edge) const {
deba@1791
    64
      return Parent::edgeFromId(id);
deba@1791
    65
    }
deba@1791
    66
deba@1791
    67
    Node oppositeNode(const Node &n, const Edge &e) const {
deba@1791
    68
      if (n == Parent::source(e))
deba@1791
    69
	return Parent::target(e);
deba@1791
    70
      else if(n==Parent::target(e))
deba@1791
    71
	return Parent::source(e);
deba@1791
    72
      else
deba@1791
    73
	return INVALID;
deba@1791
    74
    }
deba@1791
    75
deba@1979
    76
    // Alterable extension
deba@1791
    77
deba@1999
    78
    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
deba@1999
    79
    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
deba@1979
    80
deba@1979
    81
deba@1979
    82
  protected:
deba@1979
    83
deba@1979
    84
    mutable NodeNotifier node_notifier;
deba@1979
    85
    mutable EdgeNotifier edge_notifier;
deba@1791
    86
deba@1791
    87
  public:
deba@1791
    88
deba@1979
    89
    NodeNotifier& getNotifier(Node) const {
deba@1979
    90
      return node_notifier;
deba@1979
    91
    }
deba@1979
    92
    
deba@1979
    93
    EdgeNotifier& getNotifier(Edge) const {
deba@1979
    94
      return edge_notifier;
deba@1979
    95
    }
deba@1979
    96
deba@1979
    97
    class NodeIt : public Node { 
deba@1979
    98
      const Graph* graph;
deba@1979
    99
    public:
deba@1979
   100
deba@1979
   101
      NodeIt() {}
deba@1979
   102
deba@1979
   103
      NodeIt(Invalid i) : Node(i) { }
deba@1979
   104
deba@1979
   105
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
deba@2031
   106
	_graph.first(static_cast<Node&>(*this));
deba@1979
   107
      }
deba@1979
   108
deba@1979
   109
      NodeIt(const Graph& _graph, const Node& node) 
deba@1979
   110
	: Node(node), graph(&_graph) {}
deba@1979
   111
deba@1979
   112
      NodeIt& operator++() { 
deba@1979
   113
	graph->next(*this);
deba@1979
   114
	return *this; 
deba@1979
   115
      }
deba@1979
   116
deba@1979
   117
    };
deba@1979
   118
deba@1979
   119
deba@1979
   120
    class EdgeIt : public Edge { 
deba@1979
   121
      const Graph* graph;
deba@1979
   122
    public:
deba@1979
   123
deba@1979
   124
      EdgeIt() { }
deba@1979
   125
deba@1979
   126
      EdgeIt(Invalid i) : Edge(i) { }
deba@1979
   127
deba@1979
   128
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
deba@2031
   129
	_graph.first(static_cast<Edge&>(*this));
deba@1979
   130
      }
deba@1979
   131
deba@1979
   132
      EdgeIt(const Graph& _graph, const Edge& e) : 
deba@1979
   133
	Edge(e), graph(&_graph) { }
deba@1979
   134
deba@1979
   135
      EdgeIt& operator++() { 
deba@1979
   136
	graph->next(*this);
deba@1979
   137
	return *this; 
deba@1979
   138
      }
deba@1979
   139
deba@1979
   140
    };
deba@1979
   141
deba@1979
   142
deba@1979
   143
    class OutEdgeIt : public Edge { 
deba@1979
   144
      const Graph* graph;
deba@1979
   145
    public:
deba@1979
   146
deba@1979
   147
      OutEdgeIt() { }
deba@1979
   148
deba@1979
   149
      OutEdgeIt(Invalid i) : Edge(i) { }
deba@1979
   150
deba@1979
   151
      OutEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
   152
	: graph(&_graph) {
deba@1979
   153
	_graph.firstOut(*this, node);
deba@1979
   154
      }
deba@1979
   155
deba@1979
   156
      OutEdgeIt(const Graph& _graph, const Edge& edge) 
deba@1979
   157
	: Edge(edge), graph(&_graph) {}
deba@1979
   158
deba@1979
   159
      OutEdgeIt& operator++() { 
deba@1979
   160
	graph->nextOut(*this);
deba@1979
   161
	return *this; 
deba@1979
   162
      }
deba@1979
   163
deba@1979
   164
    };
deba@1979
   165
deba@1979
   166
deba@1979
   167
    class InEdgeIt : public Edge { 
deba@1979
   168
      const Graph* graph;
deba@1979
   169
    public:
deba@1979
   170
deba@1979
   171
      InEdgeIt() { }
deba@1979
   172
deba@1979
   173
      InEdgeIt(Invalid i) : Edge(i) { }
deba@1979
   174
deba@1979
   175
      InEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
   176
	: graph(&_graph) {
deba@1979
   177
	_graph.firstIn(*this, node);
deba@1979
   178
      }
deba@1979
   179
deba@1979
   180
      InEdgeIt(const Graph& _graph, const Edge& edge) : 
deba@1979
   181
	Edge(edge), graph(&_graph) {}
deba@1979
   182
deba@1979
   183
      InEdgeIt& operator++() { 
deba@1979
   184
	graph->nextIn(*this);
deba@1979
   185
	return *this; 
deba@1979
   186
      }
deba@1979
   187
deba@1979
   188
    };
deba@1979
   189
deba@1979
   190
    /// \brief Base node of the iterator
deba@1979
   191
    ///
athos@2102
   192
    /// Returns the base node (i.e. the source in this case) of the iterator
deba@1979
   193
    Node baseNode(const OutEdgeIt &e) const {
deba@1979
   194
      return Parent::source(e);
deba@1979
   195
    }
deba@1979
   196
    /// \brief Running node of the iterator
deba@1979
   197
    ///
athos@2102
   198
    /// Returns the running node (i.e. the target in this case) of the
deba@1979
   199
    /// iterator
deba@1979
   200
    Node runningNode(const OutEdgeIt &e) const {
deba@1979
   201
      return Parent::target(e);
deba@1979
   202
    }
deba@1979
   203
deba@1979
   204
    /// \brief Base node of the iterator
deba@1979
   205
    ///
athos@2102
   206
    /// Returns the base node (i.e. the target in this case) of the iterator
deba@1979
   207
    Node baseNode(const InEdgeIt &e) const {
deba@1979
   208
      return Parent::target(e);
deba@1979
   209
    }
deba@1979
   210
    /// \brief Running node of the iterator
deba@1979
   211
    ///
athos@2102
   212
    /// Returns the running node (i.e. the source in this case) of the
deba@1979
   213
    /// iterator
deba@1979
   214
    Node runningNode(const InEdgeIt &e) const {
deba@1979
   215
      return Parent::source(e);
deba@1979
   216
    }
deba@1979
   217
deba@1979
   218
    
deba@1979
   219
    template <typename _Value>
deba@1979
   220
    class NodeMap 
deba@1999
   221
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
deba@1979
   222
    public:
deba@1979
   223
      typedef GraphExtender Graph;
deba@1999
   224
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
deba@1979
   225
klao@2046
   226
      explicit NodeMap(const Graph& graph) 
deba@1999
   227
	: Parent(graph) {}
deba@1999
   228
      NodeMap(const Graph& graph, const _Value& value) 
deba@1999
   229
	: Parent(graph, value) {}
deba@1979
   230
deba@1979
   231
      NodeMap& operator=(const NodeMap& cmap) {
deba@1979
   232
	return operator=<NodeMap>(cmap);
deba@1979
   233
      }
deba@1979
   234
deba@1979
   235
      template <typename CMap>
deba@1979
   236
      NodeMap& operator=(const CMap& cmap) {
deba@2031
   237
        Parent::operator=(cmap);
deba@1979
   238
	return *this;
deba@1979
   239
      }
deba@1979
   240
deba@1979
   241
    };
deba@1979
   242
deba@1979
   243
    template <typename _Value>
deba@1979
   244
    class EdgeMap 
deba@1999
   245
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
deba@1979
   246
    public:
deba@1979
   247
      typedef GraphExtender Graph;
deba@1999
   248
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
deba@1979
   249
klao@2046
   250
      explicit EdgeMap(const Graph& graph) 
deba@1999
   251
	: Parent(graph) {}
deba@1999
   252
      EdgeMap(const Graph& graph, const _Value& value) 
deba@1999
   253
	: Parent(graph, value) {}
deba@1979
   254
deba@1979
   255
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@1979
   256
	return operator=<EdgeMap>(cmap);
deba@1979
   257
      }
deba@1979
   258
deba@1979
   259
      template <typename CMap>
deba@1979
   260
      EdgeMap& operator=(const CMap& cmap) {
deba@2031
   261
        Parent::operator=(cmap);
deba@1979
   262
	return *this;
deba@1979
   263
      }
deba@1979
   264
    };
deba@1979
   265
deba@1979
   266
deba@1979
   267
    Node addNode() {
deba@1979
   268
      Node node = Parent::addNode();
deba@1979
   269
      getNotifier(Node()).add(node);
deba@1979
   270
      return node;
deba@1979
   271
    }
deba@1979
   272
    
deba@1979
   273
    Edge addEdge(const Node& from, const Node& to) {
deba@1979
   274
      Edge edge = Parent::addEdge(from, to);
deba@1979
   275
      getNotifier(Edge()).add(edge);
deba@1979
   276
      return edge;
deba@1979
   277
    }
deba@1979
   278
deba@1979
   279
    void clear() {
deba@1979
   280
      getNotifier(Edge()).clear();
deba@1979
   281
      getNotifier(Node()).clear();
deba@1979
   282
      Parent::clear();
deba@1979
   283
    }
deba@1979
   284
deba@1979
   285
deba@1979
   286
    void erase(const Node& node) {
deba@1979
   287
      Edge edge;
deba@1979
   288
      Parent::firstOut(edge, node);
deba@1979
   289
      while (edge != INVALID ) {
deba@1979
   290
	erase(edge);
deba@1979
   291
	Parent::firstOut(edge, node);
deba@1979
   292
      } 
deba@1979
   293
deba@1979
   294
      Parent::firstIn(edge, node);
deba@1979
   295
      while (edge != INVALID ) {
deba@1979
   296
	erase(edge);
deba@1979
   297
	Parent::firstIn(edge, node);
deba@1979
   298
      }
deba@1979
   299
deba@1979
   300
      getNotifier(Node()).erase(node);
deba@1979
   301
      Parent::erase(node);
deba@1979
   302
    }
deba@1979
   303
    
deba@1979
   304
    void erase(const Edge& edge) {
deba@1979
   305
      getNotifier(Edge()).erase(edge);
deba@1979
   306
      Parent::erase(edge);
deba@1979
   307
    }
deba@1979
   308
deba@1999
   309
    GraphExtender() {
deba@1999
   310
      node_notifier.setContainer(*this);
deba@1999
   311
      edge_notifier.setContainer(*this);
deba@1999
   312
    } 
deba@1999
   313
    
deba@1979
   314
deba@1979
   315
    ~GraphExtender() {
deba@1999
   316
      edge_notifier.clear();
deba@1999
   317
      node_notifier.clear();
deba@1979
   318
    }
deba@1979
   319
  };
deba@1979
   320
deba@1996
   321
  /// \ingroup graphbits
deba@1996
   322
  ///
deba@1996
   323
  /// \brief Extender for the UGraphs
deba@1979
   324
  template <typename Base> 
deba@1979
   325
  class UGraphExtender : public Base {
deba@1979
   326
  public:
deba@1979
   327
    
deba@1979
   328
    typedef Base Parent;
deba@1979
   329
    typedef UGraphExtender Graph;
deba@1979
   330
deba@1979
   331
    typedef typename Parent::Node Node;
deba@1979
   332
    typedef typename Parent::Edge Edge;
deba@1979
   333
    typedef typename Parent::UEdge UEdge;
deba@1979
   334
deba@1979
   335
    // UGraph extension    
deba@1979
   336
deba@1979
   337
    int maxId(Node) const {
deba@1979
   338
      return Parent::maxNodeId();
deba@1979
   339
    }
deba@1979
   340
deba@1979
   341
    int maxId(Edge) const {
deba@1979
   342
      return Parent::maxEdgeId();
deba@1979
   343
    }
deba@1979
   344
deba@1979
   345
    int maxId(UEdge) const {
deba@1979
   346
      return Parent::maxUEdgeId();
deba@1979
   347
    }
deba@1979
   348
deba@1979
   349
    Node fromId(int id, Node) const {
deba@1979
   350
      return Parent::nodeFromId(id);
deba@1979
   351
    }
deba@1979
   352
deba@1979
   353
    Edge fromId(int id, Edge) const {
deba@1979
   354
      return Parent::edgeFromId(id);
deba@1979
   355
    }
deba@1979
   356
deba@1979
   357
    UEdge fromId(int id, UEdge) const {
deba@1979
   358
      return Parent::uEdgeFromId(id);
deba@1979
   359
    }
deba@1979
   360
deba@1979
   361
    Node oppositeNode(const Node &n, const UEdge &e) const {
deba@1979
   362
      if( n == Parent::source(e))
deba@1979
   363
	return Parent::target(e);
deba@1979
   364
      else if( n == Parent::target(e))
deba@1979
   365
	return Parent::source(e);
deba@1979
   366
      else
deba@1979
   367
	return INVALID;
deba@1979
   368
    }
deba@1979
   369
deba@1979
   370
    Edge oppositeEdge(const Edge &e) const {
deba@1979
   371
      return Parent::direct(e, !Parent::direction(e));
deba@1979
   372
    }
deba@1979
   373
deba@1979
   374
    using Parent::direct;
deba@1979
   375
    Edge direct(const UEdge &ue, const Node &s) const {
deba@1979
   376
      return Parent::direct(ue, Parent::source(ue) == s);
deba@1979
   377
    }
deba@1979
   378
deba@1979
   379
    // Alterable extension
deba@1979
   380
deba@1999
   381
    typedef AlterationNotifier<UGraphExtender, Node> NodeNotifier;
deba@1999
   382
    typedef AlterationNotifier<UGraphExtender, Edge> EdgeNotifier;
deba@1999
   383
    typedef AlterationNotifier<UGraphExtender, UEdge> UEdgeNotifier;
deba@1979
   384
deba@1979
   385
deba@1979
   386
  protected:
deba@1979
   387
deba@1979
   388
    mutable NodeNotifier node_notifier;
deba@1979
   389
    mutable EdgeNotifier edge_notifier;
deba@1979
   390
    mutable UEdgeNotifier uedge_notifier;
deba@1979
   391
deba@1979
   392
  public:
deba@1979
   393
deba@1979
   394
    NodeNotifier& getNotifier(Node) const {
deba@1979
   395
      return node_notifier;
deba@1979
   396
    }
deba@1979
   397
    
deba@1979
   398
    EdgeNotifier& getNotifier(Edge) const {
deba@1979
   399
      return edge_notifier;
deba@1979
   400
    }
deba@1979
   401
deba@1979
   402
    UEdgeNotifier& getNotifier(UEdge) const {
deba@1979
   403
      return uedge_notifier;
deba@1979
   404
    }
deba@1979
   405
deba@1979
   406
deba@1979
   407
deba@1979
   408
    class NodeIt : public Node { 
deba@1979
   409
      const Graph* graph;
deba@1979
   410
    public:
deba@1979
   411
deba@1979
   412
      NodeIt() {}
deba@1979
   413
deba@1979
   414
      NodeIt(Invalid i) : Node(i) { }
deba@1979
   415
deba@1979
   416
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
deba@2031
   417
	_graph.first(static_cast<Node&>(*this));
deba@1979
   418
      }
deba@1979
   419
deba@1979
   420
      NodeIt(const Graph& _graph, const Node& node) 
deba@1979
   421
	: Node(node), graph(&_graph) {}
deba@1979
   422
deba@1979
   423
      NodeIt& operator++() { 
deba@1979
   424
	graph->next(*this);
deba@1979
   425
	return *this; 
deba@1979
   426
      }
deba@1979
   427
deba@1979
   428
    };
deba@1979
   429
deba@1979
   430
deba@1979
   431
    class EdgeIt : public Edge { 
deba@1979
   432
      const Graph* graph;
deba@1979
   433
    public:
deba@1979
   434
deba@1979
   435
      EdgeIt() { }
deba@1979
   436
deba@1979
   437
      EdgeIt(Invalid i) : Edge(i) { }
deba@1979
   438
deba@1979
   439
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
deba@2031
   440
	_graph.first(static_cast<Edge&>(*this));
deba@1979
   441
      }
deba@1979
   442
deba@1979
   443
      EdgeIt(const Graph& _graph, const Edge& e) : 
deba@1979
   444
	Edge(e), graph(&_graph) { }
deba@1979
   445
deba@1979
   446
      EdgeIt& operator++() { 
deba@1979
   447
	graph->next(*this);
deba@1979
   448
	return *this; 
deba@1979
   449
      }
deba@1979
   450
deba@1979
   451
    };
deba@1979
   452
deba@1979
   453
deba@1979
   454
    class OutEdgeIt : public Edge { 
deba@1979
   455
      const Graph* graph;
deba@1979
   456
    public:
deba@1979
   457
deba@1979
   458
      OutEdgeIt() { }
deba@1979
   459
deba@1979
   460
      OutEdgeIt(Invalid i) : Edge(i) { }
deba@1979
   461
deba@1979
   462
      OutEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
   463
	: graph(&_graph) {
deba@1979
   464
	_graph.firstOut(*this, node);
deba@1979
   465
      }
deba@1979
   466
deba@1979
   467
      OutEdgeIt(const Graph& _graph, const Edge& edge) 
deba@1979
   468
	: Edge(edge), graph(&_graph) {}
deba@1979
   469
deba@1979
   470
      OutEdgeIt& operator++() { 
deba@1979
   471
	graph->nextOut(*this);
deba@1979
   472
	return *this; 
deba@1979
   473
      }
deba@1979
   474
deba@1979
   475
    };
deba@1979
   476
deba@1979
   477
deba@1979
   478
    class InEdgeIt : public Edge { 
deba@1979
   479
      const Graph* graph;
deba@1979
   480
    public:
deba@1979
   481
deba@1979
   482
      InEdgeIt() { }
deba@1979
   483
deba@1979
   484
      InEdgeIt(Invalid i) : Edge(i) { }
deba@1979
   485
deba@1979
   486
      InEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
   487
	: graph(&_graph) {
deba@1979
   488
	_graph.firstIn(*this, node);
deba@1979
   489
      }
deba@1979
   490
deba@1979
   491
      InEdgeIt(const Graph& _graph, const Edge& edge) : 
deba@1979
   492
	Edge(edge), graph(&_graph) {}
deba@1979
   493
deba@1979
   494
      InEdgeIt& operator++() { 
deba@1979
   495
	graph->nextIn(*this);
deba@1979
   496
	return *this; 
deba@1979
   497
      }
deba@1979
   498
deba@1979
   499
    };
deba@1979
   500
deba@1979
   501
deba@1979
   502
    class UEdgeIt : public Parent::UEdge { 
deba@1979
   503
      const Graph* graph;
deba@1979
   504
    public:
deba@1979
   505
deba@1979
   506
      UEdgeIt() { }
deba@1979
   507
deba@1979
   508
      UEdgeIt(Invalid i) : UEdge(i) { }
deba@1979
   509
deba@1979
   510
      explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
deba@2031
   511
	_graph.first(static_cast<UEdge&>(*this));
deba@1979
   512
      }
deba@1979
   513
deba@1979
   514
      UEdgeIt(const Graph& _graph, const UEdge& e) : 
deba@1979
   515
	UEdge(e), graph(&_graph) { }
deba@1979
   516
deba@1979
   517
      UEdgeIt& operator++() { 
deba@1979
   518
	graph->next(*this);
deba@1979
   519
	return *this; 
deba@1979
   520
      }
deba@1979
   521
deba@1979
   522
    };
deba@1979
   523
deba@1979
   524
    class IncEdgeIt : public Parent::UEdge {
deba@1979
   525
      friend class UGraphExtender;
deba@1979
   526
      const Graph* graph;
deba@1979
   527
      bool direction;
deba@1979
   528
    public:
deba@1979
   529
deba@1979
   530
      IncEdgeIt() { }
deba@1979
   531
deba@1979
   532
      IncEdgeIt(Invalid i) : UEdge(i), direction(false) { }
deba@1979
   533
deba@1979
   534
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
deba@1979
   535
	_graph.firstInc(*this, direction, n);
deba@1979
   536
      }
deba@1979
   537
deba@1979
   538
      IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
deba@1979
   539
	: graph(&_graph), UEdge(ue) {
deba@1979
   540
	direction = (_graph.source(ue) == n);
deba@1979
   541
      }
deba@1979
   542
deba@1979
   543
      IncEdgeIt& operator++() {
deba@1979
   544
	graph->nextInc(*this, direction);
deba@1979
   545
	return *this; 
deba@1979
   546
      }
deba@1979
   547
    };
deba@1979
   548
deba@1979
   549
    /// \brief Base node of the iterator
deba@1979
   550
    ///
deba@1979
   551
    /// Returns the base node (ie. the source in this case) of the iterator
deba@1979
   552
    Node baseNode(const OutEdgeIt &e) const {
deba@1979
   553
      return Parent::source((Edge)e);
deba@1979
   554
    }
deba@1979
   555
    /// \brief Running node of the iterator
deba@1979
   556
    ///
deba@1979
   557
    /// Returns the running node (ie. the target in this case) of the
deba@1979
   558
    /// iterator
deba@1979
   559
    Node runningNode(const OutEdgeIt &e) const {
deba@1979
   560
      return Parent::target((Edge)e);
deba@1979
   561
    }
deba@1979
   562
deba@1979
   563
    /// \brief Base node of the iterator
deba@1979
   564
    ///
deba@1979
   565
    /// Returns the base node (ie. the target in this case) of the iterator
deba@1979
   566
    Node baseNode(const InEdgeIt &e) const {
deba@1979
   567
      return Parent::target((Edge)e);
deba@1979
   568
    }
deba@1979
   569
    /// \brief Running node of the iterator
deba@1979
   570
    ///
deba@1979
   571
    /// Returns the running node (ie. the source in this case) of the
deba@1979
   572
    /// iterator
deba@1979
   573
    Node runningNode(const InEdgeIt &e) const {
deba@1979
   574
      return Parent::source((Edge)e);
deba@1979
   575
    }
deba@1979
   576
deba@1979
   577
    /// Base node of the iterator
deba@1979
   578
    ///
deba@1979
   579
    /// Returns the base node of the iterator
deba@1979
   580
    Node baseNode(const IncEdgeIt &e) const {
deba@1979
   581
      return e.direction ? source(e) : target(e);
deba@1979
   582
    }
deba@1979
   583
    /// Running node of the iterator
deba@1979
   584
    ///
deba@1979
   585
    /// Returns the running node of the iterator
deba@1979
   586
    Node runningNode(const IncEdgeIt &e) const {
deba@1979
   587
      return e.direction ? target(e) : source(e);
deba@1979
   588
    }
deba@1979
   589
deba@1979
   590
    // Mappable extension
deba@1979
   591
deba@1979
   592
    template <typename _Value>
deba@1979
   593
    class NodeMap 
deba@1999
   594
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
deba@1979
   595
    public:
deba@1979
   596
      typedef UGraphExtender Graph;
deba@1999
   597
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
deba@1979
   598
deba@1999
   599
      NodeMap(const Graph& graph) 
deba@1999
   600
	: Parent(graph) {}
deba@1999
   601
      NodeMap(const Graph& graph, const _Value& value) 
deba@1999
   602
	: Parent(graph, value) {}
deba@1979
   603
deba@1979
   604
      NodeMap& operator=(const NodeMap& cmap) {
deba@1979
   605
	return operator=<NodeMap>(cmap);
deba@1979
   606
      }
deba@1979
   607
deba@1979
   608
      template <typename CMap>
deba@1979
   609
      NodeMap& operator=(const CMap& cmap) {
deba@2031
   610
        Parent::operator=(cmap);
deba@1979
   611
	return *this;
deba@1979
   612
      }
deba@1979
   613
deba@1979
   614
    };
deba@1979
   615
deba@1979
   616
    template <typename _Value>
deba@1979
   617
    class EdgeMap 
deba@1999
   618
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
deba@1979
   619
    public:
deba@1979
   620
      typedef UGraphExtender Graph;
deba@1999
   621
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
deba@1979
   622
deba@1999
   623
      EdgeMap(const Graph& graph) 
deba@1999
   624
	: Parent(graph) {}
deba@1999
   625
      EdgeMap(const Graph& graph, const _Value& value) 
deba@1999
   626
	: Parent(graph, value) {}
deba@1979
   627
deba@1979
   628
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@1979
   629
	return operator=<EdgeMap>(cmap);
deba@1979
   630
      }
deba@1979
   631
deba@1979
   632
      template <typename CMap>
deba@1979
   633
      EdgeMap& operator=(const CMap& cmap) {
deba@2031
   634
        Parent::operator=(cmap);
deba@1979
   635
	return *this;
deba@1979
   636
      }
deba@1979
   637
    };
deba@1979
   638
deba@1979
   639
deba@1979
   640
    template <typename _Value>
deba@1979
   641
    class UEdgeMap 
deba@1999
   642
      : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
deba@1979
   643
    public:
deba@1979
   644
      typedef UGraphExtender Graph;
deba@1999
   645
      typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
deba@1979
   646
deba@1999
   647
      UEdgeMap(const Graph& graph) 
deba@1999
   648
	: Parent(graph) {}
deba@2031
   649
deba@1999
   650
      UEdgeMap(const Graph& graph, const _Value& value) 
deba@1999
   651
	: Parent(graph, value) {}
deba@1979
   652
deba@1979
   653
      UEdgeMap& operator=(const UEdgeMap& cmap) {
deba@1979
   654
	return operator=<UEdgeMap>(cmap);
deba@1979
   655
      }
deba@1979
   656
deba@1979
   657
      template <typename CMap>
deba@1979
   658
      UEdgeMap& operator=(const CMap& cmap) {
deba@2031
   659
        Parent::operator=(cmap);
deba@1979
   660
	return *this;
deba@1979
   661
      }
deba@2031
   662
deba@1979
   663
    };
deba@1979
   664
deba@1979
   665
    // Alteration extension
deba@1979
   666
deba@1979
   667
    Node addNode() {
deba@1979
   668
      Node node = Parent::addNode();
deba@1979
   669
      getNotifier(Node()).add(node);
deba@1979
   670
      return node;
deba@1979
   671
    }
deba@1979
   672
deba@1979
   673
    UEdge addEdge(const Node& from, const Node& to) {
deba@1979
   674
      UEdge uedge = Parent::addEdge(from, to);
deba@1979
   675
      getNotifier(UEdge()).add(uedge);
deba@1979
   676
      getNotifier(Edge()).add(Parent::direct(uedge, true));
deba@1979
   677
      getNotifier(Edge()).add(Parent::direct(uedge, false));
deba@1979
   678
      return uedge;
deba@1979
   679
    }
deba@1979
   680
    
deba@1979
   681
    void clear() {
deba@1979
   682
      getNotifier(Edge()).clear();
deba@1979
   683
      getNotifier(UEdge()).clear();
deba@1979
   684
      getNotifier(Node()).clear();
deba@1979
   685
      Parent::clear();
deba@1979
   686
    }
deba@1979
   687
deba@1979
   688
    void erase(const Node& node) {
deba@1979
   689
      Edge edge;
deba@1979
   690
      Parent::firstOut(edge, node);
deba@1979
   691
      while (edge != INVALID ) {
deba@1979
   692
	erase(edge);
deba@1979
   693
	Parent::firstOut(edge, node);
deba@1979
   694
      } 
deba@1979
   695
deba@1979
   696
      Parent::firstIn(edge, node);
deba@1979
   697
      while (edge != INVALID ) {
deba@1979
   698
	erase(edge);
deba@1979
   699
	Parent::firstIn(edge, node);
deba@1979
   700
      }
deba@1979
   701
deba@1979
   702
      getNotifier(Node()).erase(node);
deba@1979
   703
      Parent::erase(node);
deba@1979
   704
    }
deba@1979
   705
deba@1979
   706
    void erase(const UEdge& uedge) {
deba@1979
   707
      getNotifier(Edge()).erase(Parent::direct(uedge, true));
deba@1979
   708
      getNotifier(Edge()).erase(Parent::direct(uedge, false));
deba@1979
   709
      getNotifier(UEdge()).erase(uedge);
deba@1979
   710
      Parent::erase(uedge);
deba@1979
   711
    }
deba@1979
   712
deba@1999
   713
    UGraphExtender() {
deba@1999
   714
      node_notifier.setContainer(*this); 
deba@1999
   715
      edge_notifier.setContainer(*this);
deba@1999
   716
      uedge_notifier.setContainer(*this);
deba@1999
   717
    } 
deba@1999
   718
deba@1979
   719
    ~UGraphExtender() {
deba@1999
   720
      uedge_notifier.clear();
deba@1999
   721
      edge_notifier.clear();
deba@1999
   722
      node_notifier.clear(); 
deba@1999
   723
    } 
deba@1791
   724
deba@1791
   725
  };
deba@1791
   726
deba@1996
   727
  /// \ingroup graphbits
deba@1996
   728
  ///
deba@1996
   729
  /// \brief Extender for the BpUGraphs
deba@1979
   730
  template <typename Base>
deba@1979
   731
  class BpUGraphExtender : public Base {
deba@1979
   732
  public:
deba@1979
   733
    typedef Base Parent;
deba@1979
   734
    typedef BpUGraphExtender Graph;
deba@1979
   735
deba@1979
   736
    typedef typename Parent::Node Node;
deba@1979
   737
    typedef typename Parent::UEdge UEdge;
deba@1979
   738
deba@2076
   739
deba@2076
   740
    using Parent::first;
deba@2076
   741
    using Parent::next;
deba@2076
   742
deba@2076
   743
    using Parent::id;
deba@2076
   744
deba@2076
   745
    class ANode : public Node {
deba@2076
   746
      friend class BpUGraphExtender;
deba@2076
   747
    public:
deba@2076
   748
      ANode() {}
deba@2076
   749
      ANode(const Node& node) : Node(node) {
deba@2076
   750
	LEMON_ASSERT(Parent::aNode(node) || node == INVALID, 
deba@2076
   751
		     typename Parent::NodeSetError());
deba@2076
   752
      }
deba@2076
   753
      ANode(Invalid) : Node(INVALID) {}
deba@2076
   754
    };
deba@2076
   755
deba@2076
   756
    void first(ANode& node) const {
deba@2076
   757
      Parent::firstANode(static_cast<Node&>(node));
deba@2076
   758
    }
deba@2076
   759
    void next(ANode& node) const {
deba@2076
   760
      Parent::nextANode(static_cast<Node&>(node));
deba@2076
   761
    }
deba@2076
   762
deba@2076
   763
    int id(const ANode& node) const {
deba@2076
   764
      return Parent::aNodeId(node);
deba@2076
   765
    }
deba@2076
   766
deba@2076
   767
    class BNode : public Node {
deba@2076
   768
      friend class BpUGraphExtender;
deba@2076
   769
    public:
deba@2076
   770
      BNode() {}
deba@2076
   771
      BNode(const Node& node) : Node(node) {
deba@2076
   772
	LEMON_ASSERT(Parent::bNode(node) || node == INVALID,
deba@2076
   773
		     typename Parent::NodeSetError());
deba@2076
   774
      }
deba@2076
   775
      BNode(Invalid) : Node(INVALID) {}
deba@2076
   776
    };
deba@2076
   777
deba@2076
   778
    void first(BNode& node) const {
deba@2076
   779
      Parent::firstBNode(static_cast<Node&>(node));
deba@2076
   780
    }
deba@2076
   781
    void next(BNode& node) const {
deba@2076
   782
      Parent::nextBNode(static_cast<Node&>(node));
deba@2076
   783
    }
deba@2076
   784
  
deba@2076
   785
    int id(const BNode& node) const {
deba@2076
   786
      return Parent::aNodeId(node);
deba@2076
   787
    }
deba@2076
   788
deba@2076
   789
    Node source(const UEdge& edge) const {
deba@2076
   790
      return aNode(edge);
deba@2076
   791
    }
deba@2076
   792
    Node target(const UEdge& edge) const {
deba@2076
   793
      return bNode(edge);
deba@2076
   794
    }
deba@2076
   795
deba@2076
   796
    void firstInc(UEdge& edge, bool& direction, const Node& node) const {
deba@2076
   797
      if (Parent::aNode(node)) {
deba@2076
   798
	Parent::firstFromANode(edge, node);
deba@2076
   799
	direction = true;
deba@2076
   800
      } else {
deba@2076
   801
	Parent::firstFromBNode(edge, node);
deba@2076
   802
	direction = static_cast<UEdge&>(edge) == INVALID;
deba@2076
   803
      }
deba@2076
   804
    }
deba@2076
   805
    void nextInc(UEdge& edge, bool& direction) const {
deba@2076
   806
      if (direction) {
deba@2076
   807
	Parent::nextFromANode(edge);
deba@2076
   808
      } else {
deba@2076
   809
	Parent::nextFromBNode(edge);
deba@2076
   810
	if (edge == INVALID) direction = true;
deba@2076
   811
      }
deba@2076
   812
    }
deba@2076
   813
deba@2076
   814
    class Edge : public UEdge {
deba@2076
   815
      friend class BpUGraphExtender;
deba@2076
   816
    protected:
deba@2076
   817
      bool forward;
deba@2076
   818
deba@2076
   819
      Edge(const UEdge& edge, bool _forward)
deba@2076
   820
	: UEdge(edge), forward(_forward) {}
deba@2076
   821
deba@2076
   822
    public:
deba@2076
   823
      Edge() {}
deba@2076
   824
      Edge (Invalid) : UEdge(INVALID), forward(true) {}
deba@2076
   825
      bool operator==(const Edge& i) const {
deba@2076
   826
	return UEdge::operator==(i) && forward == i.forward;
deba@2076
   827
      }
deba@2076
   828
      bool operator!=(const Edge& i) const {
deba@2076
   829
	return UEdge::operator!=(i) || forward != i.forward;
deba@2076
   830
      }
deba@2076
   831
      bool operator<(const Edge& i) const {
deba@2076
   832
	return UEdge::operator<(i) || 
deba@2076
   833
	  (!(i.forward<forward) && UEdge(*this)<UEdge(i));
deba@2076
   834
      }
deba@2076
   835
    };
deba@2076
   836
deba@2076
   837
    void first(Edge& edge) const {
deba@2076
   838
      Parent::first(static_cast<UEdge&>(edge));
deba@2076
   839
      edge.forward = true;
deba@2076
   840
    }
deba@2076
   841
deba@2076
   842
    void next(Edge& edge) const {
deba@2076
   843
      if (!edge.forward) {
deba@2076
   844
	Parent::next(static_cast<UEdge&>(edge));
deba@2076
   845
      }
deba@2076
   846
      edge.forward = !edge.forward;
deba@2076
   847
    }
deba@2076
   848
deba@2076
   849
    void firstOut(Edge& edge, const Node& node) const {
deba@2076
   850
      if (Parent::aNode(node)) {
deba@2076
   851
	Parent::firstFromANode(edge, node);
deba@2076
   852
	edge.forward = true;
deba@2076
   853
      } else {
deba@2076
   854
	Parent::firstFromBNode(edge, node);
deba@2076
   855
	edge.forward = static_cast<UEdge&>(edge) == INVALID;
deba@2076
   856
      }
deba@2076
   857
    }
deba@2076
   858
    void nextOut(Edge& edge) const {
deba@2076
   859
      if (edge.forward) {
deba@2076
   860
	Parent::nextFromANode(edge);
deba@2076
   861
      } else {
deba@2076
   862
	Parent::nextFromBNode(edge);
deba@2076
   863
        edge.forward = static_cast<UEdge&>(edge) == INVALID;
deba@2076
   864
      }
deba@2076
   865
    }
deba@2076
   866
deba@2076
   867
    void firstIn(Edge& edge, const Node& node) const {
deba@2076
   868
      if (Parent::bNode(node)) {
deba@2076
   869
	Parent::firstFromBNode(edge, node);
deba@2076
   870
	edge.forward = true;	
deba@2076
   871
      } else {
deba@2076
   872
	Parent::firstFromANode(edge, node);
deba@2076
   873
	edge.forward = static_cast<UEdge&>(edge) == INVALID;
deba@2076
   874
      }
deba@2076
   875
    }
deba@2076
   876
    void nextIn(Edge& edge) const {
deba@2076
   877
      if (edge.forward) {
deba@2076
   878
	Parent::nextFromBNode(edge);
deba@2076
   879
      } else {
deba@2076
   880
	Parent::nextFromANode(edge);
deba@2076
   881
	edge.forward = static_cast<UEdge&>(edge) == INVALID;
deba@2076
   882
      }
deba@2076
   883
    }
deba@2076
   884
deba@2076
   885
    Node source(const Edge& edge) const {
deba@2076
   886
      return edge.forward ? Parent::aNode(edge) : Parent::bNode(edge);
deba@2076
   887
    }
deba@2076
   888
    Node target(const Edge& edge) const {
deba@2076
   889
      return edge.forward ? Parent::bNode(edge) : Parent::aNode(edge);
deba@2076
   890
    }
deba@2076
   891
deba@2076
   892
    int id(const Edge& edge) const {
deba@2076
   893
      return (Parent::id(static_cast<const UEdge&>(edge)) << 1) + 
deba@2076
   894
        (edge.forward ? 0 : 1);
deba@2076
   895
    }
deba@2076
   896
    Edge edgeFromId(int id) const {
deba@2076
   897
      return Edge(Parent::fromUEdgeId(id >> 1), (id & 1) == 0);
deba@2076
   898
    }
deba@2076
   899
    int maxEdgeId() const {
deba@2076
   900
      return (Parent::maxUEdgeId(UEdge()) << 1) + 1;
deba@2076
   901
    }
deba@2076
   902
deba@2076
   903
    bool direction(const Edge& edge) const {
deba@2076
   904
      return edge.forward;
deba@2076
   905
    }
deba@2076
   906
deba@2076
   907
    Edge direct(const UEdge& edge, bool direction) const {
deba@2076
   908
      return Edge(edge, direction);
deba@2076
   909
    }
deba@2076
   910
deba@2076
   911
    int edgeNum() const {
deba@2076
   912
      return 2 * Parent::uEdgeNum();
deba@2076
   913
    }
deba@2076
   914
deba@2076
   915
    int uEdgeNum() const {
deba@2076
   916
      return Parent::uEdgeNum();
deba@2076
   917
    }
deba@2076
   918
deba@1979
   919
    Node oppositeNode(const UEdge& edge, const Node& node) const {
deba@1979
   920
      return source(edge) == node ? 
deba@1979
   921
	target(edge) : source(edge);
deba@1820
   922
    }
deba@1820
   923
deba@1979
   924
    Edge direct(const UEdge& edge, const Node& node) const {
deba@1979
   925
      return Edge(edge, node == Parent::source(edge));
deba@1820
   926
    }
deba@1820
   927
deba@1979
   928
    Edge oppositeEdge(const Edge& edge) const {
deba@1979
   929
      return Parent::direct(edge, !Parent::direction(edge));
deba@1979
   930
    }
deba@1820
   931
deba@1820
   932
deba@1820
   933
    int maxId(Node) const {
deba@1820
   934
      return Parent::maxNodeId();
deba@1820
   935
    }
deba@1910
   936
    int maxId(BNode) const {
deba@1910
   937
      return Parent::maxBNodeId();
deba@1820
   938
    }
deba@1910
   939
    int maxId(ANode) const {
deba@1910
   940
      return Parent::maxANodeId();
deba@1820
   941
    }
deba@1820
   942
    int maxId(Edge) const {
deba@2076
   943
      return maxEdgeId();
deba@1820
   944
    }
klao@1909
   945
    int maxId(UEdge) const {
deba@1979
   946
      return Parent::maxUEdgeId();
deba@1820
   947
    }
deba@1820
   948
deba@1820
   949
deba@1820
   950
    Node fromId(int id, Node) const {
deba@1820
   951
      return Parent::nodeFromId(id);
deba@1820
   952
    }
deba@1910
   953
    ANode fromId(int id, ANode) const {
deba@1910
   954
      return Parent::fromANodeId(id);
deba@1820
   955
    }
deba@1910
   956
    BNode fromId(int id, BNode) const {
deba@1910
   957
      return Parent::fromBNodeId(id);
deba@1820
   958
    }
deba@1820
   959
    Edge fromId(int id, Edge) const {
deba@1979
   960
      return Parent::edgeFromId(id);
deba@1820
   961
    }
klao@1909
   962
    UEdge fromId(int id, UEdge) const {
deba@1979
   963
      return Parent::uEdgeFromId(id);
deba@1979
   964
    }  
deba@1979
   965
  
deba@1999
   966
    typedef AlterationNotifier<BpUGraphExtender, ANode> ANodeNotifier;
deba@1999
   967
    typedef AlterationNotifier<BpUGraphExtender, BNode> BNodeNotifier;
deba@1999
   968
    typedef AlterationNotifier<BpUGraphExtender, Node> NodeNotifier;
deba@1999
   969
    typedef AlterationNotifier<BpUGraphExtender, Edge> EdgeNotifier;
deba@1999
   970
    typedef AlterationNotifier<BpUGraphExtender, UEdge> UEdgeNotifier;
deba@1979
   971
deba@1979
   972
  protected:
deba@1979
   973
deba@1999
   974
    mutable ANodeNotifier anode_notifier;
deba@1999
   975
    mutable BNodeNotifier bnode_notifier;
deba@1999
   976
    mutable NodeNotifier node_notifier;
deba@1999
   977
    mutable EdgeNotifier edge_notifier;
deba@1999
   978
    mutable UEdgeNotifier uedge_notifier;
deba@1979
   979
deba@1979
   980
  public:
deba@1979
   981
deba@1979
   982
    NodeNotifier& getNotifier(Node) const {
deba@1999
   983
      return node_notifier;
deba@1999
   984
    }
deba@1999
   985
deba@1999
   986
    ANodeNotifier& getNotifier(ANode) const {
deba@1999
   987
      return anode_notifier;
deba@1820
   988
    }
deba@1820
   989
deba@1979
   990
    BNodeNotifier& getNotifier(BNode) const {
deba@1999
   991
      return bnode_notifier;
deba@1979
   992
    }
deba@1979
   993
deba@1979
   994
    EdgeNotifier& getNotifier(Edge) const {
deba@1999
   995
      return edge_notifier;
deba@1979
   996
    }
deba@1979
   997
deba@1979
   998
    UEdgeNotifier& getNotifier(UEdge) const {
deba@1999
   999
      return uedge_notifier;
deba@1979
  1000
    }
deba@1979
  1001
deba@1979
  1002
    class NodeIt : public Node { 
deba@1979
  1003
      const Graph* graph;
deba@1979
  1004
    public:
deba@1979
  1005
    
deba@1979
  1006
      NodeIt() { }
deba@1979
  1007
    
deba@1979
  1008
      NodeIt(Invalid i) : Node(INVALID) { }
deba@1979
  1009
    
deba@1979
  1010
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
deba@1979
  1011
	graph->first(static_cast<Node&>(*this));
deba@1979
  1012
      }
deba@1979
  1013
deba@1979
  1014
      NodeIt(const Graph& _graph, const Node& node) 
deba@1979
  1015
	: Node(node), graph(&_graph) { }
deba@1979
  1016
    
deba@1979
  1017
      NodeIt& operator++() { 
deba@1979
  1018
	graph->next(*this);
deba@1979
  1019
	return *this; 
deba@1979
  1020
      }
deba@1979
  1021
deba@1979
  1022
    };
deba@1979
  1023
deba@1979
  1024
    class ANodeIt : public Node { 
deba@1979
  1025
      friend class BpUGraphExtender;
deba@1979
  1026
      const Graph* graph;
deba@1979
  1027
    public:
deba@1979
  1028
    
deba@1979
  1029
      ANodeIt() { }
deba@1979
  1030
    
deba@1979
  1031
      ANodeIt(Invalid i) : Node(INVALID) { }
deba@1979
  1032
    
deba@1979
  1033
      explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
deba@1979
  1034
	graph->firstANode(static_cast<Node&>(*this));
deba@1979
  1035
      }
deba@1979
  1036
deba@1979
  1037
      ANodeIt(const Graph& _graph, const Node& node) 
deba@1979
  1038
	: Node(node), graph(&_graph) {}
deba@1979
  1039
    
deba@1979
  1040
      ANodeIt& operator++() { 
deba@1979
  1041
	graph->nextANode(*this);
deba@1979
  1042
	return *this; 
deba@1979
  1043
      }
deba@1979
  1044
    };
deba@1979
  1045
deba@1979
  1046
    class BNodeIt : public Node { 
deba@1979
  1047
      friend class BpUGraphExtender;
deba@1979
  1048
      const Graph* graph;
deba@1979
  1049
    public:
deba@1979
  1050
    
deba@1979
  1051
      BNodeIt() { }
deba@1979
  1052
    
deba@1979
  1053
      BNodeIt(Invalid i) : Node(INVALID) { }
deba@1979
  1054
    
deba@1979
  1055
      explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
deba@1979
  1056
	graph->firstBNode(static_cast<Node&>(*this));
deba@1979
  1057
      }
deba@1979
  1058
deba@1979
  1059
      BNodeIt(const Graph& _graph, const Node& node) 
deba@1979
  1060
	: Node(node), graph(&_graph) {}
deba@1979
  1061
    
deba@1979
  1062
      BNodeIt& operator++() { 
deba@1979
  1063
	graph->nextBNode(*this);
deba@1979
  1064
	return *this; 
deba@1979
  1065
      }
deba@1979
  1066
    };
deba@1979
  1067
deba@1979
  1068
    class EdgeIt : public Edge { 
deba@1979
  1069
      friend class BpUGraphExtender;
deba@1979
  1070
      const Graph* graph;
deba@1979
  1071
    public:
deba@1979
  1072
    
deba@1979
  1073
      EdgeIt() { }
deba@1979
  1074
    
deba@1979
  1075
      EdgeIt(Invalid i) : Edge(INVALID) { }
deba@1979
  1076
    
deba@1979
  1077
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
deba@1979
  1078
	graph->first(static_cast<Edge&>(*this));
deba@1979
  1079
      }
deba@1979
  1080
deba@1979
  1081
      EdgeIt(const Graph& _graph, const Edge& edge) 
deba@1979
  1082
	: Edge(edge), graph(&_graph) { }
deba@1979
  1083
    
deba@1979
  1084
      EdgeIt& operator++() { 
deba@1979
  1085
	graph->next(*this);
deba@1979
  1086
	return *this; 
deba@1979
  1087
      }
deba@1979
  1088
deba@1979
  1089
    };
deba@1979
  1090
deba@1979
  1091
    class UEdgeIt : public UEdge { 
deba@1979
  1092
      friend class BpUGraphExtender;
deba@1979
  1093
      const Graph* graph;
deba@1979
  1094
    public:
deba@1979
  1095
    
deba@1979
  1096
      UEdgeIt() { }
deba@1979
  1097
    
deba@1979
  1098
      UEdgeIt(Invalid i) : UEdge(INVALID) { }
deba@1979
  1099
    
deba@1979
  1100
      explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
deba@1979
  1101
	graph->first(static_cast<UEdge&>(*this));
deba@1979
  1102
      }
deba@1979
  1103
deba@1979
  1104
      UEdgeIt(const Graph& _graph, const UEdge& edge) 
deba@1979
  1105
	: UEdge(edge), graph(&_graph) { }
deba@1979
  1106
    
deba@1979
  1107
      UEdgeIt& operator++() { 
deba@1979
  1108
	graph->next(*this);
deba@1979
  1109
	return *this; 
deba@1979
  1110
      }
deba@1979
  1111
    };
deba@1979
  1112
deba@1979
  1113
    class OutEdgeIt : public Edge { 
deba@1979
  1114
      friend class BpUGraphExtender;
deba@1979
  1115
      const Graph* graph;
deba@1979
  1116
    public:
deba@1979
  1117
    
deba@1979
  1118
      OutEdgeIt() { }
deba@1979
  1119
    
deba@1979
  1120
      OutEdgeIt(Invalid i) : Edge(i) { }
deba@1979
  1121
    
deba@1979
  1122
      OutEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
  1123
	: graph(&_graph) {
deba@1979
  1124
	graph->firstOut(*this, node);
deba@1979
  1125
      }
deba@1979
  1126
    
deba@1979
  1127
      OutEdgeIt(const Graph& _graph, const Edge& edge) 
deba@1979
  1128
	: Edge(edge), graph(&_graph) {}
deba@1979
  1129
    
deba@1979
  1130
      OutEdgeIt& operator++() { 
deba@1979
  1131
	graph->nextOut(*this);
deba@1979
  1132
	return *this; 
deba@1979
  1133
      }
deba@1979
  1134
deba@1979
  1135
    };
deba@1979
  1136
deba@1979
  1137
deba@1979
  1138
    class InEdgeIt : public Edge { 
deba@1979
  1139
      friend class BpUGraphExtender;
deba@1979
  1140
      const Graph* graph;
deba@1979
  1141
    public:
deba@1979
  1142
    
deba@1979
  1143
      InEdgeIt() { }
deba@1979
  1144
    
deba@1979
  1145
      InEdgeIt(Invalid i) : Edge(i) { }
deba@1979
  1146
    
deba@1979
  1147
      InEdgeIt(const Graph& _graph, const Node& node) 
deba@1979
  1148
	: graph(&_graph) {
deba@1979
  1149
	graph->firstIn(*this, node);
deba@1979
  1150
      }
deba@1979
  1151
    
deba@1979
  1152
      InEdgeIt(const Graph& _graph, const Edge& edge) : 
deba@1979
  1153
	Edge(edge), graph(&_graph) {}
deba@1979
  1154
    
deba@1979
  1155
      InEdgeIt& operator++() { 
deba@1979
  1156
	graph->nextIn(*this);
deba@1979
  1157
	return *this; 
deba@1979
  1158
      }
deba@1979
  1159
deba@1979
  1160
    };
deba@1979
  1161
  
deba@1979
  1162
    /// \brief Base node of the iterator
deba@1979
  1163
    ///
deba@1979
  1164
    /// Returns the base node (ie. the source in this case) of the iterator
deba@1979
  1165
    Node baseNode(const OutEdgeIt &e) const {
deba@1979
  1166
      return Parent::source((Edge&)e);
deba@1979
  1167
    }
deba@1979
  1168
    /// \brief Running node of the iterator
deba@1979
  1169
    ///
deba@1979
  1170
    /// Returns the running node (ie. the target in this case) of the
deba@1979
  1171
    /// iterator
deba@1979
  1172
    Node runningNode(const OutEdgeIt &e) const {
deba@1979
  1173
      return Parent::target((Edge&)e);
deba@1979
  1174
    }
deba@1979
  1175
  
deba@1979
  1176
    /// \brief Base node of the iterator
deba@1979
  1177
    ///
deba@1979
  1178
    /// Returns the base node (ie. the target in this case) of the iterator
deba@1979
  1179
    Node baseNode(const InEdgeIt &e) const {
deba@1979
  1180
      return Parent::target((Edge&)e);
deba@1979
  1181
    }
deba@1979
  1182
    /// \brief Running node of the iterator
deba@1979
  1183
    ///
deba@1979
  1184
    /// Returns the running node (ie. the source in this case) of the
deba@1979
  1185
    /// iterator
deba@1979
  1186
    Node runningNode(const InEdgeIt &e) const {
deba@1979
  1187
      return Parent::source((Edge&)e);
deba@1979
  1188
    }
deba@1979
  1189
  
deba@1979
  1190
    class IncEdgeIt : public Parent::UEdge { 
deba@1979
  1191
      friend class BpUGraphExtender;
deba@1979
  1192
      const Graph* graph;
deba@1979
  1193
      bool direction;
deba@1979
  1194
    public:
deba@1979
  1195
    
deba@1979
  1196
      IncEdgeIt() { }
deba@1979
  1197
    
deba@1979
  1198
      IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
deba@1979
  1199
    
deba@1979
  1200
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
deba@1979
  1201
	graph->firstInc(*this, direction, n);
deba@1979
  1202
      }
deba@1979
  1203
deba@1979
  1204
      IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
deba@1979
  1205
	: graph(&_graph), UEdge(ue) {
deba@1979
  1206
	direction = (graph->source(ue) == n);
deba@1979
  1207
      }
deba@1979
  1208
deba@1979
  1209
      IncEdgeIt& operator++() {
deba@1979
  1210
	graph->nextInc(*this, direction);
deba@1979
  1211
	return *this; 
deba@1979
  1212
      }
deba@1979
  1213
    };
deba@1979
  1214
  
deba@1979
  1215
deba@1979
  1216
    /// Base node of the iterator
deba@1979
  1217
    ///
deba@1979
  1218
    /// Returns the base node of the iterator
deba@1979
  1219
    Node baseNode(const IncEdgeIt &e) const {
deba@1979
  1220
      return e.direction ? source(e) : target(e);
deba@1979
  1221
    }
deba@1979
  1222
deba@1979
  1223
    /// Running node of the iterator
deba@1979
  1224
    ///
deba@1979
  1225
    /// Returns the running node of the iterator
deba@1979
  1226
    Node runningNode(const IncEdgeIt &e) const {
deba@1979
  1227
      return e.direction ? target(e) : source(e);
deba@1979
  1228
    }
deba@1979
  1229
deba@1979
  1230
    template <typename _Value>
deba@1979
  1231
    class ANodeMap 
deba@1999
  1232
      : public MapExtender<DefaultMap<Graph, ANode, _Value> > {
deba@1979
  1233
    public:
deba@1979
  1234
      typedef BpUGraphExtender Graph;
deba@1999
  1235
      typedef MapExtender<DefaultMap<Graph, ANode, _Value> > Parent;
deba@1979
  1236
    
deba@1999
  1237
      ANodeMap(const Graph& graph) 
deba@1999
  1238
	: Parent(graph) {}
deba@1999
  1239
      ANodeMap(const Graph& graph, const _Value& value) 
deba@1999
  1240
	: Parent(graph, value) {}
deba@1979
  1241
    
deba@1979
  1242
      ANodeMap& operator=(const ANodeMap& cmap) {
deba@1979
  1243
	return operator=<ANodeMap>(cmap);
deba@1979
  1244
      }
deba@1979
  1245
    
deba@1979
  1246
      template <typename CMap>
deba@1979
  1247
      ANodeMap& operator=(const CMap& cmap) {
deba@2031
  1248
        Parent::operator=(cmap);
deba@1979
  1249
	return *this;
deba@1979
  1250
      }
deba@1979
  1251
    
deba@1979
  1252
    };
deba@1979
  1253
deba@1979
  1254
    template <typename _Value>
deba@1979
  1255
    class BNodeMap 
deba@1999
  1256
      : public MapExtender<DefaultMap<Graph, BNode, _Value> > {
deba@1979
  1257
    public:
deba@1979
  1258
      typedef BpUGraphExtender Graph;
deba@1999
  1259
      typedef MapExtender<DefaultMap<Graph, BNode, _Value> > Parent;
deba@1979
  1260
    
deba@1999
  1261
      BNodeMap(const Graph& graph) 
deba@1999
  1262
	: Parent(graph) {}
deba@1999
  1263
      BNodeMap(const Graph& graph, const _Value& value) 
deba@1999
  1264
	: Parent(graph, value) {}
deba@1979
  1265
    
deba@1979
  1266
      BNodeMap& operator=(const BNodeMap& cmap) {
deba@1979
  1267
	return operator=<BNodeMap>(cmap);
deba@1979
  1268
      }
deba@1979
  1269
    
deba@1979
  1270
      template <typename CMap>
deba@1979
  1271
      BNodeMap& operator=(const CMap& cmap) {
deba@2031
  1272
        Parent::operator=(cmap);
deba@1979
  1273
	return *this;
deba@1979
  1274
      }
deba@1979
  1275
    
deba@1979
  1276
    };
deba@1979
  1277
deba@2031
  1278
  public:
deba@1979
  1279
deba@1979
  1280
    template <typename _Value>
deba@2031
  1281
    class NodeMap {
deba@1979
  1282
    public:
deba@1979
  1283
      typedef BpUGraphExtender Graph;
deba@1979
  1284
deba@1979
  1285
      typedef Node Key;
deba@1979
  1286
      typedef _Value Value;
deba@1979
  1287
deba@1979
  1288
      /// The reference type of the map;
deba@1999
  1289
      typedef typename ANodeMap<_Value>::Reference Reference;
deba@1979
  1290
      /// The const reference type of the map;
deba@1999
  1291
      typedef typename ANodeMap<_Value>::ConstReference ConstReference;
deba@1979
  1292
deba@1979
  1293
      typedef True ReferenceMapTag;
deba@1979
  1294
deba@2031
  1295
      NodeMap(const Graph& _graph) 
deba@2031
  1296
	: graph(_graph), aNodeMap(_graph), bNodeMap(_graph) {}
deba@2031
  1297
      NodeMap(const Graph& _graph, const _Value& _value) 
deba@2031
  1298
	: graph(_graph), aNodeMap(_graph, _value), bNodeMap(_graph, _value) {}
deba@2031
  1299
deba@2031
  1300
      NodeMap& operator=(const NodeMap& cmap) {
deba@2031
  1301
	return operator=<NodeMap>(cmap);
deba@2031
  1302
      }
deba@2031
  1303
    
deba@2031
  1304
      template <typename CMap>
deba@2031
  1305
      NodeMap& operator=(const CMap& cmap) {
deba@2031
  1306
	checkConcept<concept::ReadMap<Node, _Value>, CMap>();
deba@2031
  1307
	const typename Parent::Notifier* notifier = Parent::getNotifier();
deba@2031
  1308
	Edge it;
deba@2031
  1309
	for (graph.first(it); it != INVALID; graph.next(it)) {
deba@2031
  1310
	  Parent::set(it, cmap[it]);
deba@2031
  1311
	}
deba@2031
  1312
	return *this;
deba@2031
  1313
      }
deba@1979
  1314
deba@1979
  1315
      ConstReference operator[](const Key& node) const {
deba@1979
  1316
	if (Parent::aNode(node)) {
deba@1979
  1317
	  return aNodeMap[node];
deba@1979
  1318
	} else {
deba@1979
  1319
	  return bNodeMap[node];
deba@1979
  1320
	}
deba@1979
  1321
      } 
deba@1979
  1322
deba@1979
  1323
      Reference operator[](const Key& node) {
deba@1979
  1324
	if (Parent::aNode(node)) {
deba@1979
  1325
	  return aNodeMap[node];
deba@1979
  1326
	} else {
deba@1979
  1327
	  return bNodeMap[node];
deba@1979
  1328
	}
deba@1979
  1329
      }
deba@1979
  1330
deba@1979
  1331
      void set(const Key& node, const Value& value) {
deba@1979
  1332
	if (Parent::aNode(node)) {
deba@1979
  1333
	  aNodeMap.set(node, value);
deba@1979
  1334
	} else {
deba@1979
  1335
	  bNodeMap.set(node, value);
deba@1979
  1336
	}
deba@1979
  1337
      }
deba@1979
  1338
deba@2031
  1339
      class MapIt : public NodeIt {
deba@2031
  1340
      public:
deba@1979
  1341
deba@2031
  1342
        typedef NodeIt Parent;
deba@2031
  1343
        
deba@2031
  1344
        explicit MapIt(NodeMap& _map) 
deba@2031
  1345
          : Parent(_map.graph), map(_map) {}
deba@2031
  1346
        
deba@2031
  1347
        typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
deba@2031
  1348
          return map[*this];
deba@2031
  1349
        }
deba@2031
  1350
        
deba@2031
  1351
        typename MapTraits<NodeMap>::ReturnValue operator*() {
deba@2031
  1352
          return map[*this];
deba@2031
  1353
        }
deba@2031
  1354
        
deba@2031
  1355
        void set(const Value& value) {
deba@2031
  1356
          map.set(*this, value);
deba@2031
  1357
        }
deba@2031
  1358
deba@2031
  1359
      private:
deba@2031
  1360
        NodeMap& map;
deba@2031
  1361
      };
deba@2031
  1362
deba@2031
  1363
      class ConstMapIt : public NodeIt {
deba@2031
  1364
      public:
deba@2031
  1365
deba@2031
  1366
        typedef NodeIt Parent;
deba@2031
  1367
        
deba@2031
  1368
        explicit ConstMapIt(const NodeMap& _map) 
deba@2031
  1369
          : Parent(_map.graph), map(_map) {}
deba@2031
  1370
        
deba@2031
  1371
        typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
deba@2031
  1372
          return map[*this];
deba@2031
  1373
        }
deba@2031
  1374
        
deba@2031
  1375
      private:
deba@2031
  1376
        const NodeMap& map;
deba@2031
  1377
      };
deba@2031
  1378
deba@2031
  1379
      class ItemIt : public NodeIt {
deba@2031
  1380
      public:
deba@2031
  1381
deba@2031
  1382
        typedef NodeIt Parent;
deba@2031
  1383
deba@2031
  1384
        explicit ItemIt(const NodeMap& _map)
deba@2031
  1385
          : Parent(_map.graph) {}
deba@2031
  1386
        
deba@2031
  1387
      };
deba@2031
  1388
      
deba@1979
  1389
    private:
deba@2031
  1390
      const Graph& graph;
deba@1991
  1391
      ANodeMap<_Value> aNodeMap;
deba@1979
  1392
      BNodeMap<_Value> bNodeMap;
deba@1979
  1393
    };
deba@1979
  1394
    
deba@1979
  1395
deba@1979
  1396
    template <typename _Value>
deba@1979
  1397
    class EdgeMap 
deba@1999
  1398
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
deba@1979
  1399
    public:
deba@1979
  1400
      typedef BpUGraphExtender Graph;
deba@1999
  1401
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
deba@1979
  1402
    
deba@1999
  1403
      EdgeMap(const Graph& graph) 
deba@1999
  1404
	: Parent(graph) {}
deba@1999
  1405
      EdgeMap(const Graph& graph, const _Value& value) 
deba@1999
  1406
	: Parent(graph, value) {}
deba@1979
  1407
    
deba@1979
  1408
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@1979
  1409
	return operator=<EdgeMap>(cmap);
deba@1979
  1410
      }
deba@1979
  1411
    
deba@1979
  1412
      template <typename CMap>
deba@1979
  1413
      EdgeMap& operator=(const CMap& cmap) {
deba@2031
  1414
        Parent::operator=(cmap);
deba@1979
  1415
	return *this;
deba@1979
  1416
      }
deba@1979
  1417
    };
deba@1979
  1418
deba@1979
  1419
    template <typename _Value>
deba@1979
  1420
    class UEdgeMap 
deba@1999
  1421
      : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
deba@1979
  1422
    public:
deba@1979
  1423
      typedef BpUGraphExtender Graph;
deba@1999
  1424
      typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
deba@1979
  1425
    
deba@1999
  1426
      UEdgeMap(const Graph& graph) 
deba@1999
  1427
	: Parent(graph) {}
deba@1999
  1428
      UEdgeMap(const Graph& graph, const _Value& value) 
deba@1999
  1429
	: Parent(graph, value) {}
deba@1979
  1430
    
deba@1979
  1431
      UEdgeMap& operator=(const UEdgeMap& cmap) {
deba@1979
  1432
	return operator=<UEdgeMap>(cmap);
deba@1979
  1433
      }
deba@1979
  1434
    
deba@1979
  1435
      template <typename CMap>
deba@1979
  1436
      UEdgeMap& operator=(const CMap& cmap) {
deba@2031
  1437
        Parent::operator=(cmap);
deba@1979
  1438
	return *this;
deba@1979
  1439
      }
deba@1979
  1440
    };
deba@1979
  1441
deba@1979
  1442
  
deba@1979
  1443
    Node addANode() {
deba@1979
  1444
      Node node = Parent::addANode();
deba@1979
  1445
      getNotifier(ANode()).add(node);
deba@1979
  1446
      getNotifier(Node()).add(node);
deba@1979
  1447
      return node;
deba@1979
  1448
    }
deba@1979
  1449
deba@1979
  1450
    Node addBNode() {
deba@1979
  1451
      Node node = Parent::addBNode();
deba@1979
  1452
      getNotifier(BNode()).add(node);
deba@1979
  1453
      getNotifier(Node()).add(node);
deba@1979
  1454
      return node;
deba@1979
  1455
    }
deba@1979
  1456
  
deba@1979
  1457
    UEdge addEdge(const Node& source, const Node& target) {
deba@1979
  1458
      UEdge uedge = Parent::addEdge(source, target);
deba@1979
  1459
      getNotifier(UEdge()).add(uedge);
deba@1979
  1460
    
deba@1979
  1461
      std::vector<Edge> edges;
deba@1979
  1462
      edges.push_back(direct(uedge, true));
deba@1979
  1463
      edges.push_back(direct(uedge, false));
deba@1979
  1464
      getNotifier(Edge()).add(edges);
deba@1979
  1465
    
deba@1979
  1466
      return uedge;
deba@1979
  1467
    }
deba@1979
  1468
deba@1979
  1469
    void clear() {
deba@1979
  1470
      getNotifier(Edge()).clear();
deba@1979
  1471
      getNotifier(UEdge()).clear();
deba@1979
  1472
      getNotifier(Node()).clear();
deba@1979
  1473
      getNotifier(BNode()).clear();
deba@1979
  1474
      getNotifier(ANode()).clear();
deba@1979
  1475
      Parent::clear();
deba@1979
  1476
    }
deba@1979
  1477
deba@1979
  1478
    void erase(const Node& node) {
deba@1979
  1479
      UEdge uedge;
deba@2098
  1480
      if (Parent::aNode(node)) {
deba@2098
  1481
        Parent::firstFromANode(uedge, node);
deba@2098
  1482
        while (uedge != INVALID) {
deba@2098
  1483
          erase(uedge);
deba@2098
  1484
          Parent::firstFromANode(uedge, node);
deba@2098
  1485
        }
deba@2098
  1486
      } else {
deba@2098
  1487
        Parent::firstFromBNode(uedge, node);
deba@2098
  1488
        while (uedge != INVALID) {
deba@2098
  1489
          erase(uedge);
deba@2098
  1490
          Parent::firstFromBNode(uedge, node);
deba@2098
  1491
        }
deba@2098
  1492
      }
deba@1979
  1493
deba@1979
  1494
      getNotifier(Node()).erase(node);
deba@1979
  1495
      Parent::erase(node);
deba@1979
  1496
    }
deba@1979
  1497
    
deba@1979
  1498
    void erase(const UEdge& uedge) {
deba@1979
  1499
      std::vector<Edge> edges;
deba@1979
  1500
      edges.push_back(direct(uedge, true));
deba@1979
  1501
      edges.push_back(direct(uedge, false));
deba@1979
  1502
      getNotifier(Edge()).erase(edges);
deba@1979
  1503
      getNotifier(UEdge()).erase(uedge);
deba@1979
  1504
      Parent::erase(uedge);
deba@1979
  1505
    }
deba@1979
  1506
deba@1979
  1507
deba@1999
  1508
    BpUGraphExtender() {
deba@1999
  1509
      anode_notifier.setContainer(*this); 
deba@1999
  1510
      bnode_notifier.setContainer(*this); 
deba@1999
  1511
      node_notifier.setContainer(*this); 
deba@1999
  1512
      edge_notifier.setContainer(*this); 
deba@1999
  1513
      uedge_notifier.setContainer(*this);
deba@1999
  1514
    } 
deba@1999
  1515
deba@1979
  1516
    ~BpUGraphExtender() {
deba@1999
  1517
      uedge_notifier.clear();
deba@1999
  1518
      edge_notifier.clear(); 
deba@1999
  1519
      node_notifier.clear(); 
deba@1999
  1520
      anode_notifier.clear(); 
deba@1999
  1521
      bnode_notifier.clear(); 
deba@1979
  1522
    }
deba@1979
  1523
deba@1979
  1524
deba@1820
  1525
  };
deba@1820
  1526
deba@1791
  1527
}
deba@1791
  1528
deba@1996
  1529
#endif