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