lemon/graph_adaptor.h
author Balazs Dezso <deba@inf.elte.hu>
Sun, 30 Nov 2008 19:00:30 +0100
changeset 415 4b6112235fad
parent 414 05357da973ce
permissions -rw-r--r--
Improvements in graph adaptors (#67)

Remove DigraphAdaptor and GraphAdaptor
Remove docs of base classes
Move the member documentations to real adaptors
Minor improvements in documentation
deba@414
     1
/* -*- C++ -*-
deba@414
     2
 *
deba@414
     3
 * This file is a part of LEMON, a generic C++ optimization library
deba@414
     4
 *
deba@414
     5
 * Copyright (C) 2003-2008
deba@414
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@414
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@414
     8
 *
deba@414
     9
 * Permission to use, modify and distribute this software is granted
deba@414
    10
 * provided that this copyright notice appears in all copies. For
deba@414
    11
 * precise terms see the accompanying LICENSE file.
deba@414
    12
 *
deba@414
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@414
    14
 * express or implied, and with no claim as to its suitability for any
deba@414
    15
 * purpose.
deba@414
    16
 *
deba@414
    17
 */
deba@414
    18
deba@414
    19
#ifndef LEMON_GRAPH_ADAPTOR_H
deba@414
    20
#define LEMON_GRAPH_ADAPTOR_H
deba@414
    21
deba@414
    22
///\ingroup graph_adaptors
deba@414
    23
///\file
deba@414
    24
///\brief Several graph adaptors.
deba@414
    25
///
deba@414
    26
///This file contains several useful undirected graph adaptor classes.
deba@414
    27
deba@414
    28
#include <lemon/core.h>
deba@414
    29
#include <lemon/maps.h>
deba@414
    30
#include <lemon/bits/graph_adaptor_extender.h>
deba@414
    31
deba@414
    32
namespace lemon {
deba@414
    33
deba@414
    34
  template<typename _Graph>
deba@414
    35
  class GraphAdaptorBase {
deba@414
    36
  public:
deba@414
    37
    typedef _Graph Graph;
deba@414
    38
    typedef Graph ParentGraph;
deba@414
    39
deba@414
    40
  protected:
deba@414
    41
    Graph* _graph;
deba@414
    42
deba@414
    43
    GraphAdaptorBase() : _graph(0) {}
deba@414
    44
deba@414
    45
    void setGraph(Graph& graph) { _graph = &graph; }
deba@414
    46
deba@414
    47
  public:
deba@414
    48
    GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
deba@414
    49
 
deba@414
    50
    typedef typename Graph::Node Node;
deba@414
    51
    typedef typename Graph::Arc Arc;
deba@414
    52
    typedef typename Graph::Edge Edge;
deba@414
    53
   
deba@414
    54
    void first(Node& i) const { _graph->first(i); }
deba@414
    55
    void first(Arc& i) const { _graph->first(i); }
deba@414
    56
    void first(Edge& i) const { _graph->first(i); }
deba@414
    57
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
deba@414
    58
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
deba@414
    59
    void firstInc(Edge &i, bool &d, const Node &n) const {
deba@414
    60
      _graph->firstInc(i, d, n);
deba@414
    61
    }
deba@414
    62
deba@414
    63
    void next(Node& i) const { _graph->next(i); }
deba@414
    64
    void next(Arc& i) const { _graph->next(i); }
deba@414
    65
    void next(Edge& i) const { _graph->next(i); }
deba@414
    66
    void nextIn(Arc& i) const { _graph->nextIn(i); }
deba@414
    67
    void nextOut(Arc& i) const { _graph->nextOut(i); }
deba@414
    68
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
deba@414
    69
deba@414
    70
    Node u(const Edge& e) const { return _graph->u(e); }
deba@414
    71
    Node v(const Edge& e) const { return _graph->v(e); }
deba@414
    72
deba@414
    73
    Node source(const Arc& a) const { return _graph->source(a); }
deba@414
    74
    Node target(const Arc& a) const { return _graph->target(a); }
deba@414
    75
deba@414
    76
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
deba@414
    77
    int nodeNum() const { return _graph->nodeNum(); }
deba@414
    78
    
deba@414
    79
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
deba@414
    80
    int arcNum() const { return _graph->arcNum(); }
deba@414
    81
    int edgeNum() const { return _graph->edgeNum(); }
deba@414
    82
deba@414
    83
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
deba@414
    84
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
deba@414
    85
      return _graph->findArc(u, v, prev);
deba@414
    86
    }
deba@414
    87
    Edge findEdge(const Node& u, const Node& v, const Edge& prev = INVALID) {
deba@414
    88
      return _graph->findEdge(u, v, prev);
deba@414
    89
    }
deba@414
    90
  
deba@414
    91
    Node addNode() { return _graph->addNode(); }
deba@414
    92
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
deba@414
    93
deba@414
    94
    void erase(const Node& i) { _graph->erase(i); }
deba@414
    95
    void erase(const Edge& i) { _graph->erase(i); }
deba@414
    96
  
deba@414
    97
    void clear() { _graph->clear(); }
deba@414
    98
    
deba@414
    99
    bool direction(const Arc& a) const { return _graph->direction(a); }
deba@414
   100
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
deba@414
   101
deba@414
   102
    int id(const Node& v) const { return _graph->id(v); }
deba@414
   103
    int id(const Arc& a) const { return _graph->id(a); }
deba@414
   104
    int id(const Edge& e) const { return _graph->id(e); }
deba@414
   105
deba@414
   106
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
deba@414
   107
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
deba@414
   108
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
deba@414
   109
deba@414
   110
    int maxNodeId() const { return _graph->maxNodeId(); }
deba@414
   111
    int maxArcId() const { return _graph->maxArcId(); }
deba@414
   112
    int maxEdgeId() const { return _graph->maxEdgeId(); }
deba@414
   113
deba@414
   114
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
deba@414
   115
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } 
deba@414
   116
deba@414
   117
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
deba@414
   118
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } 
deba@414
   119
deba@414
   120
    typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
deba@414
   121
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); } 
deba@414
   122
deba@414
   123
    template <typename _Value>
deba@414
   124
    class NodeMap : public Graph::template NodeMap<_Value> {
deba@414
   125
    public:
deba@414
   126
      typedef typename Graph::template NodeMap<_Value> Parent;
deba@414
   127
      explicit NodeMap(const GraphAdaptorBase<Graph>& adapter) 
deba@414
   128
	: Parent(*adapter._graph) {}
deba@414
   129
      NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
deba@414
   130
	: Parent(*adapter._graph, value) {}
deba@414
   131
deba@414
   132
    private:
deba@414
   133
      NodeMap& operator=(const NodeMap& cmap) {
deba@414
   134
	return operator=<NodeMap>(cmap);
deba@414
   135
      }
deba@414
   136
deba@414
   137
      template <typename CMap>
deba@414
   138
      NodeMap& operator=(const CMap& cmap) {
deba@414
   139
        Parent::operator=(cmap);
deba@414
   140
        return *this;
deba@414
   141
      }
deba@414
   142
      
deba@414
   143
    };
deba@414
   144
deba@414
   145
    template <typename _Value>
deba@414
   146
    class ArcMap : public Graph::template ArcMap<_Value> {
deba@414
   147
    public:
deba@414
   148
      typedef typename Graph::template ArcMap<_Value> Parent;
deba@414
   149
      explicit ArcMap(const GraphAdaptorBase<Graph>& adapter) 
deba@414
   150
	: Parent(*adapter._graph) {}
deba@414
   151
      ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
deba@414
   152
	: Parent(*adapter._graph, value) {}
deba@414
   153
deba@414
   154
    private:
deba@414
   155
      ArcMap& operator=(const ArcMap& cmap) {
deba@414
   156
	return operator=<ArcMap>(cmap);
deba@414
   157
      }
deba@414
   158
deba@414
   159
      template <typename CMap>
deba@414
   160
      ArcMap& operator=(const CMap& cmap) {
deba@414
   161
        Parent::operator=(cmap);
deba@414
   162
	return *this;
deba@414
   163
      }
deba@414
   164
    };
deba@414
   165
deba@414
   166
    template <typename _Value>
deba@414
   167
    class EdgeMap : public Graph::template EdgeMap<_Value> {
deba@414
   168
    public:
deba@414
   169
      typedef typename Graph::template EdgeMap<_Value> Parent;
deba@414
   170
      explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter) 
deba@414
   171
	: Parent(*adapter._graph) {}
deba@414
   172
      EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
deba@414
   173
	: Parent(*adapter._graph, value) {}
deba@414
   174
deba@414
   175
    private:
deba@414
   176
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@414
   177
	return operator=<EdgeMap>(cmap);
deba@414
   178
      }
deba@414
   179
deba@414
   180
      template <typename CMap>
deba@414
   181
      EdgeMap& operator=(const CMap& cmap) {
deba@414
   182
        Parent::operator=(cmap);
deba@414
   183
        return *this;
deba@414
   184
      }
deba@414
   185
    };
deba@414
   186
deba@414
   187
  };
deba@414
   188
deba@414
   189
  template <typename _Graph, typename NodeFilterMap, 
deba@414
   190
	    typename EdgeFilterMap, bool checked = true>
deba@414
   191
  class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
deba@414
   192
  public:
deba@414
   193
    typedef _Graph Graph;
deba@414
   194
    typedef SubGraphAdaptorBase Adaptor;
deba@414
   195
    typedef GraphAdaptorBase<_Graph> Parent;
deba@414
   196
  protected:
deba@414
   197
deba@414
   198
    NodeFilterMap* _node_filter_map;
deba@414
   199
    EdgeFilterMap* _edge_filter_map;
deba@414
   200
deba@414
   201
    SubGraphAdaptorBase() 
deba@414
   202
      : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
deba@414
   203
deba@414
   204
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
deba@414
   205
      _node_filter_map=&node_filter_map;
deba@414
   206
    }
deba@414
   207
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
deba@414
   208
      _edge_filter_map=&edge_filter_map;
deba@414
   209
    }
deba@414
   210
deba@414
   211
  public:
deba@414
   212
deba@414
   213
    typedef typename Parent::Node Node;
deba@414
   214
    typedef typename Parent::Arc Arc;
deba@414
   215
    typedef typename Parent::Edge Edge;
deba@414
   216
deba@414
   217
    void first(Node& i) const { 
deba@414
   218
      Parent::first(i); 
deba@414
   219
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
deba@414
   220
    }
deba@414
   221
deba@414
   222
    void first(Arc& i) const { 
deba@414
   223
      Parent::first(i); 
deba@414
   224
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   225
	     || !(*_node_filter_map)[Parent::source(i)]
deba@414
   226
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); 
deba@414
   227
    }
deba@414
   228
deba@414
   229
    void first(Edge& i) const { 
deba@414
   230
      Parent::first(i); 
deba@414
   231
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   232
	     || !(*_node_filter_map)[Parent::u(i)]
deba@414
   233
	     || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); 
deba@414
   234
    }
deba@414
   235
deba@414
   236
    void firstIn(Arc& i, const Node& n) const { 
deba@414
   237
      Parent::firstIn(i, n); 
deba@414
   238
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   239
	     || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
deba@414
   240
    }
deba@414
   241
deba@414
   242
    void firstOut(Arc& i, const Node& n) const { 
deba@414
   243
      Parent::firstOut(i, n); 
deba@414
   244
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   245
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
deba@414
   246
    }
deba@414
   247
deba@414
   248
    void firstInc(Edge& i, bool& d, const Node& n) const { 
deba@414
   249
      Parent::firstInc(i, d, n); 
deba@414
   250
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   251
            || !(*_node_filter_map)[Parent::u(i)]
deba@414
   252
            || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); 
deba@414
   253
    }
deba@414
   254
deba@414
   255
    void next(Node& i) const { 
deba@414
   256
      Parent::next(i); 
deba@414
   257
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
deba@414
   258
    }
deba@414
   259
deba@414
   260
    void next(Arc& i) const { 
deba@414
   261
      Parent::next(i); 
deba@414
   262
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   263
	     || !(*_node_filter_map)[Parent::source(i)]
deba@414
   264
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); 
deba@414
   265
    }
deba@414
   266
deba@414
   267
    void next(Edge& i) const { 
deba@414
   268
      Parent::next(i); 
deba@414
   269
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   270
	     || !(*_node_filter_map)[Parent::u(i)]
deba@414
   271
	     || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); 
deba@414
   272
    }
deba@414
   273
deba@414
   274
    void nextIn(Arc& i) const { 
deba@414
   275
      Parent::nextIn(i); 
deba@414
   276
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   277
	     || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
deba@414
   278
    }
deba@414
   279
deba@414
   280
    void nextOut(Arc& i) const { 
deba@414
   281
      Parent::nextOut(i); 
deba@414
   282
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
deba@414
   283
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
deba@414
   284
    }
deba@414
   285
deba@414
   286
    void nextInc(Edge& i, bool& d) const { 
deba@414
   287
      Parent::nextInc(i, d); 
deba@414
   288
      while (i!=INVALID && (!(*_edge_filter_map)[i]
deba@414
   289
            || !(*_node_filter_map)[Parent::u(i)]
deba@414
   290
            || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); 
deba@414
   291
    }
deba@414
   292
deba@414
   293
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
deba@414
   294
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
deba@414
   295
deba@415
   296
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
deba@414
   297
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
deba@414
   298
deba@414
   299
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
deba@414
   300
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
deba@414
   301
deba@414
   302
    typedef False NodeNumTag;
deba@414
   303
    typedef False EdgeNumTag;
deba@414
   304
deba@414
   305
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
deba@414
   306
    Arc findArc(const Node& u, const Node& v, 
deba@414
   307
		  const Arc& prev = INVALID) {
deba@414
   308
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
deba@414
   309
        return INVALID;
deba@414
   310
      }
deba@414
   311
      Arc arc = Parent::findArc(u, v, prev);
deba@414
   312
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
deba@414
   313
        arc = Parent::findArc(u, v, arc);
deba@414
   314
      }
deba@414
   315
      return arc;
deba@414
   316
    }
deba@414
   317
    Edge findEdge(const Node& u, const Node& v, 
deba@414
   318
		  const Edge& prev = INVALID) {
deba@414
   319
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
deba@414
   320
        return INVALID;
deba@414
   321
      }
deba@414
   322
      Edge edge = Parent::findEdge(u, v, prev);
deba@414
   323
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
deba@414
   324
        edge = Parent::findEdge(u, v, edge);
deba@414
   325
      }
deba@414
   326
      return edge;
deba@414
   327
    }
deba@414
   328
deba@414
   329
    template <typename _Value>
deba@414
   330
    class NodeMap : public SubMapExtender<Adaptor, 
deba@414
   331
        typename Parent::template NodeMap<_Value> > {
deba@414
   332
    public:
deba@414
   333
      typedef _Value Value;
deba@414
   334
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   335
                             template NodeMap<Value> > MapParent;
deba@414
   336
    
deba@414
   337
      NodeMap(const Adaptor& adaptor) 
deba@414
   338
	: MapParent(adaptor) {}
deba@414
   339
      NodeMap(const Adaptor& adaptor, const Value& value) 
deba@414
   340
	: MapParent(adaptor, value) {}
deba@414
   341
deba@414
   342
    private:
deba@414
   343
      NodeMap& operator=(const NodeMap& cmap) {
deba@414
   344
	return operator=<NodeMap>(cmap);
deba@414
   345
      }
deba@414
   346
    
deba@414
   347
      template <typename CMap>
deba@414
   348
      NodeMap& operator=(const CMap& cmap) {
deba@414
   349
        MapParent::operator=(cmap);
deba@414
   350
	return *this;
deba@414
   351
      }
deba@414
   352
    };
deba@414
   353
deba@414
   354
    template <typename _Value>
deba@414
   355
    class ArcMap : public SubMapExtender<Adaptor, 
deba@414
   356
	typename Parent::template ArcMap<_Value> > {
deba@414
   357
    public:
deba@414
   358
      typedef _Value Value;
deba@414
   359
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   360
                             template ArcMap<Value> > MapParent;
deba@414
   361
    
deba@414
   362
      ArcMap(const Adaptor& adaptor) 
deba@414
   363
	: MapParent(adaptor) {}
deba@414
   364
      ArcMap(const Adaptor& adaptor, const Value& value) 
deba@414
   365
	: MapParent(adaptor, value) {}
deba@414
   366
deba@414
   367
    private:
deba@414
   368
      ArcMap& operator=(const ArcMap& cmap) {
deba@414
   369
	return operator=<ArcMap>(cmap);
deba@414
   370
      }
deba@414
   371
    
deba@414
   372
      template <typename CMap>
deba@414
   373
      ArcMap& operator=(const CMap& cmap) {
deba@414
   374
        MapParent::operator=(cmap);
deba@414
   375
	return *this;
deba@414
   376
      }
deba@414
   377
    };
deba@414
   378
deba@414
   379
    template <typename _Value>
deba@414
   380
    class EdgeMap : public SubMapExtender<Adaptor, 
deba@414
   381
        typename Parent::template EdgeMap<_Value> > {
deba@414
   382
    public:
deba@414
   383
      typedef _Value Value;
deba@414
   384
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   385
                             template EdgeMap<Value> > MapParent;
deba@414
   386
    
deba@414
   387
      EdgeMap(const Adaptor& adaptor) 
deba@414
   388
	: MapParent(adaptor) {}
deba@414
   389
deba@414
   390
      EdgeMap(const Adaptor& adaptor, const Value& value) 
deba@414
   391
	: MapParent(adaptor, value) {}
deba@414
   392
deba@414
   393
    private:
deba@414
   394
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@414
   395
	return operator=<EdgeMap>(cmap);
deba@414
   396
      }
deba@414
   397
    
deba@414
   398
      template <typename CMap>
deba@414
   399
      EdgeMap& operator=(const CMap& cmap) {
deba@414
   400
        MapParent::operator=(cmap);
deba@414
   401
	return *this;
deba@414
   402
      }
deba@414
   403
    };
deba@414
   404
deba@414
   405
  };
deba@414
   406
deba@414
   407
  template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
deba@414
   408
  class SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, false> 
deba@414
   409
    : public GraphAdaptorBase<_Graph> {
deba@414
   410
  public:
deba@414
   411
    typedef _Graph Graph;
deba@414
   412
    typedef SubGraphAdaptorBase Adaptor;
deba@414
   413
    typedef GraphAdaptorBase<_Graph> Parent;
deba@414
   414
  protected:
deba@414
   415
    NodeFilterMap* _node_filter_map;
deba@414
   416
    EdgeFilterMap* _edge_filter_map;
deba@414
   417
    SubGraphAdaptorBase() : Parent(), 
deba@414
   418
			    _node_filter_map(0), _edge_filter_map(0) { }
deba@414
   419
deba@414
   420
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
deba@414
   421
      _node_filter_map=&node_filter_map;
deba@414
   422
    }
deba@414
   423
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
deba@414
   424
      _edge_filter_map=&edge_filter_map;
deba@414
   425
    }
deba@414
   426
deba@414
   427
  public:
deba@414
   428
deba@414
   429
    typedef typename Parent::Node Node;
deba@414
   430
    typedef typename Parent::Arc Arc;
deba@414
   431
    typedef typename Parent::Edge Edge;
deba@414
   432
deba@414
   433
    void first(Node& i) const { 
deba@414
   434
      Parent::first(i); 
deba@414
   435
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
deba@414
   436
    }
deba@414
   437
deba@414
   438
    void first(Arc& i) const { 
deba@414
   439
      Parent::first(i); 
deba@414
   440
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
deba@414
   441
    }
deba@414
   442
deba@414
   443
    void first(Edge& i) const { 
deba@414
   444
      Parent::first(i); 
deba@414
   445
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
deba@414
   446
    }
deba@414
   447
deba@414
   448
    void firstIn(Arc& i, const Node& n) const { 
deba@414
   449
      Parent::firstIn(i, n); 
deba@414
   450
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); 
deba@414
   451
    }
deba@414
   452
deba@414
   453
    void firstOut(Arc& i, const Node& n) const { 
deba@414
   454
      Parent::firstOut(i, n); 
deba@414
   455
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); 
deba@414
   456
    }
deba@414
   457
deba@414
   458
    void firstInc(Edge& i, bool& d, const Node& n) const { 
deba@414
   459
      Parent::firstInc(i, d, n); 
deba@414
   460
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); 
deba@414
   461
    }
deba@414
   462
deba@414
   463
    void next(Node& i) const { 
deba@414
   464
      Parent::next(i); 
deba@414
   465
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
deba@414
   466
    }
deba@414
   467
    void next(Arc& i) const { 
deba@414
   468
      Parent::next(i); 
deba@414
   469
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
deba@414
   470
    }
deba@414
   471
    void next(Edge& i) const { 
deba@414
   472
      Parent::next(i); 
deba@414
   473
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
deba@414
   474
    }
deba@414
   475
    void nextIn(Arc& i) const { 
deba@414
   476
      Parent::nextIn(i); 
deba@414
   477
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); 
deba@414
   478
    }
deba@414
   479
deba@414
   480
    void nextOut(Arc& i) const { 
deba@414
   481
      Parent::nextOut(i); 
deba@414
   482
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); 
deba@414
   483
    }
deba@414
   484
    void nextInc(Edge& i, bool& d) const { 
deba@414
   485
      Parent::nextInc(i, d); 
deba@414
   486
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); 
deba@414
   487
    }
deba@414
   488
deba@414
   489
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
deba@414
   490
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
deba@414
   491
deba@415
   492
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
deba@414
   493
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
deba@414
   494
deba@414
   495
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
deba@414
   496
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
deba@414
   497
deba@414
   498
    typedef False NodeNumTag;
deba@414
   499
    typedef False EdgeNumTag;
deba@414
   500
deba@414
   501
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
deba@414
   502
    Arc findArc(const Node& u, const Node& v, 
deba@414
   503
		  const Arc& prev = INVALID) {
deba@414
   504
      Arc arc = Parent::findArc(u, v, prev);
deba@414
   505
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
deba@414
   506
        arc = Parent::findArc(u, v, arc);
deba@414
   507
      }
deba@414
   508
      return arc;
deba@414
   509
    }
deba@414
   510
    Edge findEdge(const Node& u, const Node& v, 
deba@414
   511
		  const Edge& prev = INVALID) {
deba@414
   512
      Edge edge = Parent::findEdge(u, v, prev);
deba@414
   513
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
deba@414
   514
        edge = Parent::findEdge(u, v, edge);
deba@414
   515
      }
deba@414
   516
      return edge;
deba@414
   517
    }
deba@414
   518
deba@414
   519
    template <typename _Value>
deba@414
   520
    class NodeMap : public SubMapExtender<Adaptor, 
deba@414
   521
        typename Parent::template NodeMap<_Value> > {
deba@414
   522
    public:
deba@414
   523
      typedef _Value Value;
deba@414
   524
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   525
                             template NodeMap<Value> > MapParent;
deba@414
   526
    
deba@414
   527
      NodeMap(const Adaptor& adaptor) 
deba@414
   528
	: MapParent(adaptor) {}
deba@414
   529
      NodeMap(const Adaptor& adaptor, const Value& value) 
deba@414
   530
	: MapParent(adaptor, value) {}
deba@414
   531
    
deba@414
   532
    private:
deba@414
   533
      NodeMap& operator=(const NodeMap& cmap) {
deba@414
   534
	return operator=<NodeMap>(cmap);
deba@414
   535
      }
deba@414
   536
    
deba@414
   537
      template <typename CMap>
deba@414
   538
      NodeMap& operator=(const CMap& cmap) {
deba@414
   539
        MapParent::operator=(cmap);
deba@414
   540
	return *this;
deba@414
   541
      }
deba@414
   542
    };
deba@414
   543
deba@414
   544
    template <typename _Value>
deba@414
   545
    class ArcMap : public SubMapExtender<Adaptor, 
deba@414
   546
	typename Parent::template ArcMap<_Value> > {
deba@414
   547
    public:
deba@414
   548
      typedef _Value Value;
deba@414
   549
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   550
                             template ArcMap<Value> > MapParent;
deba@414
   551
    
deba@414
   552
      ArcMap(const Adaptor& adaptor) 
deba@414
   553
	: MapParent(adaptor) {}
deba@414
   554
      ArcMap(const Adaptor& adaptor, const Value& value) 
deba@414
   555
	: MapParent(adaptor, value) {}
deba@414
   556
deba@414
   557
    private:
deba@414
   558
      ArcMap& operator=(const ArcMap& cmap) {
deba@414
   559
	return operator=<ArcMap>(cmap);
deba@414
   560
      }
deba@414
   561
    
deba@414
   562
      template <typename CMap>
deba@414
   563
      ArcMap& operator=(const CMap& cmap) {
deba@414
   564
        MapParent::operator=(cmap);
deba@414
   565
	return *this;
deba@414
   566
      }
deba@414
   567
    };
deba@414
   568
deba@414
   569
    template <typename _Value>
deba@414
   570
    class EdgeMap : public SubMapExtender<Adaptor, 
deba@414
   571
        typename Parent::template EdgeMap<_Value> > {
deba@414
   572
    public:
deba@414
   573
      typedef _Value Value;
deba@414
   574
      typedef SubMapExtender<Adaptor, typename Parent::
deba@414
   575
                             template EdgeMap<Value> > MapParent;
deba@414
   576
    
deba@414
   577
      EdgeMap(const Adaptor& adaptor) 
deba@414
   578
	: MapParent(adaptor) {}
deba@414
   579
deba@414
   580
      EdgeMap(const Adaptor& adaptor, const _Value& value) 
deba@414
   581
	: MapParent(adaptor, value) {}
deba@414
   582
deba@414
   583
    private:
deba@414
   584
      EdgeMap& operator=(const EdgeMap& cmap) {
deba@414
   585
	return operator=<EdgeMap>(cmap);
deba@414
   586
      }
deba@414
   587
    
deba@414
   588
      template <typename CMap>
deba@414
   589
      EdgeMap& operator=(const CMap& cmap) {
deba@414
   590
        MapParent::operator=(cmap);
deba@414
   591
	return *this;
deba@414
   592
      }
deba@414
   593
    };
deba@414
   594
deba@414
   595
  };
deba@414
   596
deba@414
   597
  /// \ingroup graph_adaptors
deba@414
   598
  ///
deba@415
   599
  /// \brief A graph adaptor for hiding nodes and edges from an
deba@414
   600
  /// undirected graph.
deba@414
   601
  /// 
deba@414
   602
  /// SubGraphAdaptor shows the graph with filtered node-set and
deba@414
   603
  /// edge-set. If the \c checked parameter is true then it filters
deba@414
   604
  /// the edge-set to do not get invalid edges which incident node is
deba@414
   605
  /// filtered.
deba@414
   606
  /// 
deba@414
   607
  /// If the \c checked template parameter is false then we have to
deba@414
   608
  /// note that the node-iterator cares only the filter on the
deba@414
   609
  /// node-set, and the edge-iterator cares only the filter on the
deba@414
   610
  /// edge-set.  This way the edge-map should filter all arcs which
deba@414
   611
  /// has filtered end node.
deba@414
   612
  template<typename _Graph, typename NodeFilterMap, 
deba@414
   613
	   typename EdgeFilterMap, bool checked = true>
deba@414
   614
  class SubGraphAdaptor : 
deba@414
   615
    public GraphAdaptorExtender<
deba@414
   616
    SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
deba@414
   617
  public:
deba@414
   618
    typedef _Graph Graph;
deba@414
   619
    typedef GraphAdaptorExtender<
deba@414
   620
      SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
deba@415
   621
deba@415
   622
    typedef typename Parent::Node Node;
deba@415
   623
    typedef typename Parent::Edge Edge;
deba@415
   624
deba@414
   625
  protected:
deba@414
   626
    SubGraphAdaptor() { }
deba@414
   627
  public:
deba@415
   628
    
deba@415
   629
    /// \brief Constructor
deba@415
   630
    ///
deba@415
   631
    /// Creates a sub-graph-adaptor for the given graph with
deba@415
   632
    /// given node and edge map filters.
deba@414
   633
    SubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map, 
deba@414
   634
		    EdgeFilterMap& edge_filter_map) { 
deba@414
   635
      setGraph(_graph);
deba@414
   636
      setNodeFilterMap(node_filter_map);
deba@414
   637
      setEdgeFilterMap(edge_filter_map);
deba@414
   638
    }
deba@415
   639
deba@415
   640
    /// \brief Hides the node of the graph
deba@415
   641
    ///
deba@415
   642
    /// This function hides \c n in the digraph, i.e. the iteration 
deba@415
   643
    /// jumps over it. This is done by simply setting the value of \c n  
deba@415
   644
    /// to be false in the corresponding node-map.
deba@415
   645
    void hide(const Node& n) const { Parent::hide(n); }
deba@415
   646
deba@415
   647
    /// \brief Hides the edge of the graph
deba@415
   648
    ///
deba@415
   649
    /// This function hides \c e in the digraph, i.e. the iteration 
deba@415
   650
    /// jumps over it. This is done by simply setting the value of \c e
deba@415
   651
    /// to be false in the corresponding edge-map.
deba@415
   652
    void hide(const Edge& e) const { Parent::hide(e); }
deba@415
   653
deba@415
   654
    /// \brief Unhides the node of the graph
deba@415
   655
    ///
deba@415
   656
    /// The value of \c n is set to be true in the node-map which stores 
deba@415
   657
    /// hide information. If \c n was hidden previuosly, then it is shown 
deba@415
   658
    /// again
deba@415
   659
    void unHide(const Node& n) const { Parent::unHide(n); }
deba@415
   660
deba@415
   661
    /// \brief Unhides the edge of the graph
deba@415
   662
    ///
deba@415
   663
    /// The value of \c e is set to be true in the edge-map which stores 
deba@415
   664
    /// hide information. If \c e was hidden previuosly, then it is shown 
deba@415
   665
    /// again
deba@415
   666
    void unHide(const Edge& e) const { Parent::unHide(e); }
deba@415
   667
deba@415
   668
    /// \brief Returns true if \c n is hidden.
deba@415
   669
    ///
deba@415
   670
    /// Returns true if \c n is hidden.
deba@415
   671
    ///
deba@415
   672
    bool hidden(const Node& n) const { return Parent::hidden(n); }
deba@415
   673
deba@415
   674
    /// \brief Returns true if \c e is hidden.
deba@415
   675
    ///
deba@415
   676
    /// Returns true if \c e is hidden.
deba@415
   677
    ///
deba@415
   678
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
deba@414
   679
  };
deba@414
   680
deba@415
   681
  /// \brief Just gives back a sub-graph adaptor
deba@415
   682
  ///
deba@415
   683
  /// Just gives back a sub-graph adaptor
deba@414
   684
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
deba@414
   685
  SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
deba@414
   686
  subGraphAdaptor(const Graph& graph, 
deba@414
   687
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
deba@414
   688
    return SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
deba@414
   689
      (graph, nfm, efm);
deba@414
   690
  }
deba@414
   691
deba@414
   692
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
deba@414
   693
  SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap>
deba@414
   694
  subGraphAdaptor(const Graph& graph, 
deba@414
   695
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
deba@414
   696
    return SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap>
deba@414
   697
      (graph, nfm, efm);
deba@414
   698
  }
deba@414
   699
deba@414
   700
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
deba@414
   701
  SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap>
deba@414
   702
  subGraphAdaptor(const Graph& graph, 
deba@414
   703
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
deba@414
   704
    return SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap>
deba@414
   705
      (graph, nfm, efm);
deba@414
   706
  }
deba@414
   707
deba@414
   708
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
deba@414
   709
  SubGraphAdaptor<const Graph, const NodeFilterMap, const ArcFilterMap>
deba@414
   710
  subGraphAdaptor(const Graph& graph, 
deba@414
   711
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
deba@414
   712
    return SubGraphAdaptor<const Graph, const NodeFilterMap, 
deba@414
   713
      const ArcFilterMap>(graph, nfm, efm);
deba@414
   714
  }
deba@414
   715
deba@414
   716
  /// \ingroup graph_adaptors
deba@414
   717
  ///
deba@414
   718
  /// \brief An adaptor for hiding nodes from an graph.
deba@414
   719
  ///
deba@414
   720
  /// An adaptor for hiding nodes from an graph.  This
deba@414
   721
  /// adaptor specializes SubGraphAdaptor in the way that only the
deba@414
   722
  /// node-set can be filtered. In usual case the checked parameter is
deba@414
   723
  /// true, we get the induced subgraph. But if the checked parameter
deba@414
   724
  /// is false then we can filter only isolated nodes.
deba@414
   725
  template<typename _Graph, typename _NodeFilterMap, bool checked = true>
deba@414
   726
  class NodeSubGraphAdaptor : 
deba@414
   727
    public SubGraphAdaptor<_Graph, _NodeFilterMap, 
deba@414
   728
			   ConstMap<typename _Graph::Edge, bool>, checked> {
deba@414
   729
  public:
deba@414
   730
    typedef _Graph Graph;
deba@414
   731
    typedef _NodeFilterMap NodeFilterMap;
deba@414
   732
    typedef SubGraphAdaptor<Graph, NodeFilterMap, 
deba@414
   733
			    ConstMap<typename Graph::Edge, bool> > Parent;
deba@415
   734
deba@415
   735
    typedef typename Parent::Node Node;
deba@414
   736
  protected:
deba@414
   737
    ConstMap<typename Graph::Edge, bool> const_true_map;
deba@414
   738
deba@414
   739
    NodeSubGraphAdaptor() : const_true_map(true) {
deba@414
   740
      Parent::setEdgeFilterMap(const_true_map);
deba@414
   741
    }
deba@414
   742
deba@414
   743
  public:
deba@415
   744
deba@415
   745
    /// \brief Constructor
deba@415
   746
    ///
deba@415
   747
    /// Creates a node-sub-graph-adaptor for the given graph with
deba@415
   748
    /// given node map filters.
deba@414
   749
    NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map) : 
deba@414
   750
      Parent(), const_true_map(true) { 
deba@414
   751
      Parent::setGraph(_graph);
deba@414
   752
      Parent::setNodeFilterMap(node_filter_map);
deba@414
   753
      Parent::setEdgeFilterMap(const_true_map);
deba@414
   754
    }
deba@415
   755
deba@415
   756
    /// \brief Hides the node of the graph
deba@415
   757
    ///
deba@415
   758
    /// This function hides \c n in the digraph, i.e. the iteration 
deba@415
   759
    /// jumps over it. This is done by simply setting the value of \c n  
deba@415
   760
    /// to be false in the corresponding node-map.
deba@415
   761
    void hide(const Node& n) const { Parent::hide(n); }
deba@415
   762
deba@415
   763
    /// \brief Unhides the node of the graph
deba@415
   764
    ///
deba@415
   765
    /// The value of \c n is set to be true in the node-map which stores 
deba@415
   766
    /// hide information. If \c n was hidden previuosly, then it is shown 
deba@415
   767
    /// again
deba@415
   768
    void unHide(const Node& n) const { Parent::unHide(n); }
deba@415
   769
deba@415
   770
    /// \brief Returns true if \c n is hidden.
deba@415
   771
    ///
deba@415
   772
    /// Returns true if \c n is hidden.
deba@415
   773
    ///
deba@415
   774
    bool hidden(const Node& n) const { return Parent::hidden(n); }
deba@415
   775
deba@414
   776
  };
deba@414
   777
deba@415
   778
  /// \brief Just gives back a node-sub-graph adaptor
deba@415
   779
  ///
deba@415
   780
  /// Just gives back a node-sub-graph adaptor
deba@414
   781
  template<typename Graph, typename NodeFilterMap>
deba@414
   782
  NodeSubGraphAdaptor<const Graph, NodeFilterMap>
deba@414
   783
  nodeSubGraphAdaptor(const Graph& graph, NodeFilterMap& nfm) {
deba@414
   784
    return NodeSubGraphAdaptor<const Graph, NodeFilterMap>(graph, nfm);
deba@414
   785
  }
deba@414
   786
deba@414
   787
  template<typename Graph, typename NodeFilterMap>
deba@414
   788
  NodeSubGraphAdaptor<const Graph, const NodeFilterMap>
deba@414
   789
  nodeSubGraphAdaptor(const Graph& graph, const NodeFilterMap& nfm) {
deba@414
   790
    return NodeSubGraphAdaptor<const Graph, const NodeFilterMap>(graph, nfm);
deba@414
   791
  }
deba@414
   792
deba@414
   793
  /// \ingroup graph_adaptors
deba@414
   794
  ///
deba@414
   795
  /// \brief An adaptor for hiding edges from an graph.
deba@414
   796
  ///
deba@414
   797
  /// \warning Graph adaptors are in even more experimental state
deba@414
   798
  /// than the other parts of the lib. Use them at you own risk.
deba@414
   799
  ///
deba@414
   800
  /// An adaptor for hiding edges from an graph.
deba@414
   801
  /// This adaptor specializes SubGraphAdaptor in the way that
deba@414
   802
  /// only the arc-set 
deba@414
   803
  /// can be filtered.
deba@414
   804
  template<typename _Graph, typename _EdgeFilterMap>
deba@414
   805
  class EdgeSubGraphAdaptor : 
deba@414
   806
    public SubGraphAdaptor<_Graph, ConstMap<typename _Graph::Node,bool>, 
deba@414
   807
                           _EdgeFilterMap, false> {
deba@414
   808
  public:
deba@414
   809
    typedef _Graph Graph;
deba@414
   810
    typedef _EdgeFilterMap EdgeFilterMap;
deba@414
   811
    typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
deba@414
   812
			    EdgeFilterMap, false> Parent;
deba@415
   813
    typedef typename Parent::Edge Edge;
deba@414
   814
  protected:
deba@414
   815
    ConstMap<typename Graph::Node, bool> const_true_map;
deba@414
   816
deba@414
   817
    EdgeSubGraphAdaptor() : const_true_map(true) {
deba@414
   818
      Parent::setNodeFilterMap(const_true_map);
deba@414
   819
    }
deba@414
   820
deba@414
   821
  public:
deba@414
   822
deba@415
   823
    /// \brief Constructor
deba@415
   824
    ///
deba@415
   825
    /// Creates a edge-sub-graph-adaptor for the given graph with
deba@415
   826
    /// given node map filters.
deba@414
   827
    EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& edge_filter_map) : 
deba@414
   828
      Parent(), const_true_map(true) { 
deba@414
   829
      Parent::setGraph(_graph);
deba@414
   830
      Parent::setNodeFilterMap(const_true_map);
deba@414
   831
      Parent::setEdgeFilterMap(edge_filter_map);
deba@414
   832
    }
deba@414
   833
deba@415
   834
    /// \brief Hides the edge of the graph
deba@415
   835
    ///
deba@415
   836
    /// This function hides \c e in the digraph, i.e. the iteration 
deba@415
   837
    /// jumps over it. This is done by simply setting the value of \c e
deba@415
   838
    /// to be false in the corresponding edge-map.
deba@415
   839
    void hide(const Edge& e) const { Parent::hide(e); }
deba@415
   840
deba@415
   841
    /// \brief Unhides the edge of the graph
deba@415
   842
    ///
deba@415
   843
    /// The value of \c e is set to be true in the edge-map which stores 
deba@415
   844
    /// hide information. If \c e was hidden previuosly, then it is shown 
deba@415
   845
    /// again
deba@415
   846
    void unHide(const Edge& e) const { Parent::unHide(e); }
deba@415
   847
deba@415
   848
    /// \brief Returns true if \c e is hidden.
deba@415
   849
    ///
deba@415
   850
    /// Returns true if \c e is hidden.
deba@415
   851
    ///
deba@415
   852
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
deba@415
   853
deba@414
   854
  };
deba@414
   855
deba@415
   856
  /// \brief Just gives back an edge-sub-graph adaptor
deba@415
   857
  ///
deba@415
   858
  /// Just gives back an edge-sub-graph adaptor
deba@414
   859
  template<typename Graph, typename EdgeFilterMap>
deba@414
   860
  EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>
deba@414
   861
  edgeSubGraphAdaptor(const Graph& graph, EdgeFilterMap& efm) {
deba@414
   862
    return EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>(graph, efm);
deba@414
   863
  }
deba@414
   864
deba@414
   865
  template<typename Graph, typename EdgeFilterMap>
deba@414
   866
  EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>
deba@414
   867
  edgeSubGraphAdaptor(const Graph& graph, const EdgeFilterMap& efm) {
deba@414
   868
    return EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>(graph, efm);
deba@414
   869
  }
deba@414
   870
deba@414
   871
  template <typename _Graph, typename _DirectionMap>
deba@414
   872
  class DirGraphAdaptorBase {
deba@414
   873
  public:
deba@414
   874
    
deba@414
   875
    typedef _Graph Graph;
deba@414
   876
    typedef _DirectionMap DirectionMap;
deba@414
   877
deba@414
   878
    typedef typename Graph::Node Node;
deba@414
   879
    typedef typename Graph::Edge Arc;
deba@414
   880
   
deba@414
   881
    /// \brief Reverse arc
deba@414
   882
    /// 
deba@414
   883
    /// It reverse the given arc. It simply negate the direction in the map.
deba@414
   884
    void reverseArc(const Arc& arc) {
deba@414
   885
      _direction->set(arc, !(*_direction)[arc]);
deba@414
   886
    }
deba@414
   887
deba@414
   888
    void first(Node& i) const { _graph->first(i); }
deba@414
   889
    void first(Arc& i) const { _graph->first(i); }
deba@414
   890
    void firstIn(Arc& i, const Node& n) const {
deba@414
   891
      bool d;
deba@414
   892
      _graph->firstInc(i, d, n);
deba@414
   893
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
deba@414
   894
    }
deba@414
   895
    void firstOut(Arc& i, const Node& n ) const { 
deba@414
   896
      bool d;
deba@414
   897
      _graph->firstInc(i, d, n);
deba@414
   898
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
deba@414
   899
    }
deba@414
   900
deba@414
   901
    void next(Node& i) const { _graph->next(i); }
deba@414
   902
    void next(Arc& i) const { _graph->next(i); }
deba@414
   903
    void nextIn(Arc& i) const {
deba@414
   904
      bool d = !(*_direction)[i];
deba@414
   905
      _graph->nextInc(i, d);
deba@414
   906
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
deba@414
   907
    }
deba@414
   908
    void nextOut(Arc& i) const {
deba@414
   909
      bool d = (*_direction)[i];
deba@414
   910
      _graph->nextInc(i, d);
deba@414
   911
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
deba@414
   912
    }
deba@414
   913
deba@414
   914
    Node source(const Arc& e) const { 
deba@414
   915
      return (*_direction)[e] ? _graph->u(e) : _graph->v(e); 
deba@414
   916
    }
deba@414
   917
    Node target(const Arc& e) const { 
deba@414
   918
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e); 
deba@414
   919
    }
deba@414
   920
deba@414
   921
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
deba@414
   922
    int nodeNum() const { return _graph->nodeNum(); }
deba@414
   923
    
deba@414
   924
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
deba@414
   925
    int arcNum() const { return _graph->edgeNum(); }
deba@414
   926
deba@414
   927
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
deba@414
   928
    Arc findArc(const Node& u, const Node& v, 
deba@414
   929
		  const Arc& prev = INVALID) {
deba@414
   930
      Arc arc = prev;
deba@414
   931
      bool d = arc == INVALID ? true : (*_direction)[arc];
deba@414
   932
      if (d) {
deba@414
   933
        arc = _graph->findEdge(u, v, arc);
deba@414
   934
        while (arc != INVALID && !(*_direction)[arc]) {
deba@414
   935
          _graph->findEdge(u, v, arc);
deba@414
   936
        }
deba@414
   937
        if (arc != INVALID) return arc;
deba@414
   938
      }
deba@414
   939
      _graph->findEdge(v, u, arc);
deba@414
   940
      while (arc != INVALID && (*_direction)[arc]) {
deba@414
   941
        _graph->findEdge(u, v, arc);
deba@414
   942
      }
deba@414
   943
      return arc;
deba@414
   944
    }
deba@414
   945
  
deba@414
   946
    Node addNode() { 
deba@414
   947
      return Node(_graph->addNode()); 
deba@414
   948
    }
deba@414
   949
deba@414
   950
    Arc addArc(const Node& u, const Node& v) {
deba@414
   951
      Arc arc = _graph->addArc(u, v);
deba@414
   952
      _direction->set(arc, _graph->source(arc) == u);
deba@414
   953
      return arc; 
deba@414
   954
    }
deba@414
   955
deba@414
   956
    void erase(const Node& i) { _graph->erase(i); }
deba@414
   957
    void erase(const Arc& i) { _graph->erase(i); }
deba@414
   958
  
deba@414
   959
    void clear() { _graph->clear(); }
deba@414
   960
    
deba@414
   961
    int id(const Node& v) const { return _graph->id(v); }
deba@414
   962
    int id(const Arc& e) const { return _graph->id(e); }
deba@414
   963
deba@414
   964
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
deba@414
   965
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
deba@414
   966
deba@414
   967
    int maxNodeId() const { return _graph->maxNodeId(); }
deba@414
   968
    int maxArcId() const { return _graph->maxEdgeId(); }
deba@414
   969
deba@414
   970
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
deba@414
   971
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } 
deba@414
   972
deba@414
   973
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
deba@414
   974
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } 
deba@414
   975
deba@414
   976
    template <typename _Value>
deba@414
   977
    class NodeMap : public _Graph::template NodeMap<_Value> {
deba@414
   978
    public:
deba@414
   979
deba@414
   980
      typedef typename _Graph::template NodeMap<_Value> Parent;
deba@414
   981
deba@414
   982
      explicit NodeMap(const DirGraphAdaptorBase& adapter) 
deba@414
   983
	: Parent(*adapter._graph) {}
deba@414
   984
deba@414
   985
      NodeMap(const DirGraphAdaptorBase& adapter, const _Value& value)
deba@414
   986
	: Parent(*adapter._graph, value) {}
deba@414
   987
deba@414
   988
    private:
deba@414
   989
      NodeMap& operator=(const NodeMap& cmap) {
deba@414
   990
        return operator=<NodeMap>(cmap);
deba@414
   991
      }
deba@414
   992
deba@414
   993
      template <typename CMap>
deba@414
   994
      NodeMap& operator=(const CMap& cmap) {
deba@414
   995
        Parent::operator=(cmap);
deba@414
   996
        return *this;
deba@414
   997
      }
deba@414
   998
deba@414
   999
    };
deba@414
  1000
deba@414
  1001
    template <typename _Value>
deba@414
  1002
    class ArcMap : public _Graph::template EdgeMap<_Value> {
deba@414
  1003
    public:
deba@414
  1004
deba@414
  1005
      typedef typename Graph::template EdgeMap<_Value> Parent;
deba@414
  1006
deba@414
  1007
      explicit ArcMap(const DirGraphAdaptorBase& adapter) 
deba@414
  1008
	: Parent(*adapter._graph) { }
deba@414
  1009
deba@414
  1010
      ArcMap(const DirGraphAdaptorBase& adapter, const _Value& value)
deba@414
  1011
	: Parent(*adapter._graph, value) { }
deba@414
  1012
deba@414
  1013
    private:
deba@414
  1014
      ArcMap& operator=(const ArcMap& cmap) {
deba@414
  1015
        return operator=<ArcMap>(cmap);
deba@414
  1016
      }
deba@414
  1017
deba@414
  1018
      template <typename CMap>
deba@414
  1019
      ArcMap& operator=(const CMap& cmap) {
deba@414
  1020
        Parent::operator=(cmap);
deba@414
  1021
        return *this;
deba@414
  1022
      }
deba@414
  1023
    };
deba@414
  1024
deba@414
  1025
    
deba@414
  1026
deba@414
  1027
  protected:
deba@414
  1028
    Graph* _graph;
deba@414
  1029
    DirectionMap* _direction;
deba@414
  1030
deba@414
  1031
    void setDirectionMap(DirectionMap& direction) {
deba@414
  1032
      _direction = &direction;
deba@414
  1033
    }
deba@414
  1034
deba@414
  1035
    void setGraph(Graph& graph) {
deba@414
  1036
      _graph = &graph;
deba@414
  1037
    }
deba@414
  1038
deba@414
  1039
  };
deba@414
  1040
deba@414
  1041
deba@414
  1042
  /// \ingroup graph_adaptors
deba@414
  1043
  ///
deba@414
  1044
  /// \brief A directed graph is made from an graph by an adaptor
deba@414
  1045
  ///
deba@414
  1046
  /// This adaptor gives a direction for each edge in the undirected
deba@414
  1047
  /// graph. The direction of the arcs stored in the
deba@414
  1048
  /// DirectionMap. This map is a bool map on the edges. If
deba@414
  1049
  /// the edge is mapped to true then the direction of the directed
deba@414
  1050
  /// arc will be the same as the default direction of the edge. The
deba@414
  1051
  /// arcs can be easily reverted by the \ref
deba@414
  1052
  /// DirGraphAdaptorBase::reverseArc "reverseArc()" member in the
deba@414
  1053
  /// adaptor.
deba@414
  1054
  ///
deba@414
  1055
  /// It can be used to solve orientation problems on directed graphs.
deba@414
  1056
  /// For example how can we orient an graph to get the minimum
deba@414
  1057
  /// number of strongly connected components. If we orient the arcs with
deba@414
  1058
  /// the dfs algorithm out from the source then we will get such an 
deba@414
  1059
  /// orientation. 
deba@414
  1060
  ///
deba@414
  1061
  /// We use the \ref DfsVisitor "visitor" interface of the 
deba@414
  1062
  /// \ref DfsVisit "dfs" algorithm:
deba@414
  1063
  ///\code
deba@414
  1064
  /// template <typename DirMap>
deba@414
  1065
  /// class OrientVisitor : public DfsVisitor<Graph> {
deba@414
  1066
  /// public:
deba@414
  1067
  ///
deba@414
  1068
  ///   OrientVisitor(const Graph& graph, DirMap& dirMap)
deba@414
  1069
  ///     : _graph(graph), _dirMap(dirMap), _processed(graph, false) {}
deba@414
  1070
  ///
deba@414
  1071
  ///   void discover(const Arc& arc) {
deba@414
  1072
  ///     _processed.set(arc, true);
deba@414
  1073
  ///     _dirMap.set(arc, _graph.direction(arc));
deba@414
  1074
  ///   }
deba@414
  1075
  ///
deba@414
  1076
  ///   void examine(const Arc& arc) {
deba@414
  1077
  ///     if (_processed[arc]) return;
deba@414
  1078
  ///     _processed.set(arc, true);
deba@414
  1079
  ///     _dirMap.set(arc, _graph.direction(arc));
deba@414
  1080
  ///   }  
deba@414
  1081
  /// 
deba@414
  1082
  /// private:
deba@414
  1083
  ///   const Graph& _graph;  
deba@414
  1084
  ///   DirMap& _dirMap;
deba@414
  1085
  ///   Graph::EdgeMap<bool> _processed;
deba@414
  1086
  /// };
deba@414
  1087
  ///\endcode
deba@414
  1088
  ///
deba@414
  1089
  /// And now we can use the orientation:
deba@414
  1090
  ///\code
deba@414
  1091
  /// Graph::EdgeMap<bool> dmap(graph);
deba@414
  1092
  ///
deba@414
  1093
  /// typedef OrientVisitor<Graph::EdgeMap<bool> > Visitor;
deba@414
  1094
  /// Visitor visitor(graph, dmap);
deba@414
  1095
  ///
deba@414
  1096
  /// DfsVisit<Graph, Visitor> dfs(graph, visitor);
deba@414
  1097
  ///
deba@414
  1098
  /// dfs.run();
deba@414
  1099
  ///
deba@414
  1100
  /// typedef DirGraphAdaptor<Graph> DGraph;
deba@414
  1101
  /// DGraph dgraph(graph, dmap);
deba@414
  1102
  ///
deba@414
  1103
  /// LEMON_ASSERT(countStronglyConnectedComponents(dgraph) == 
deba@414
  1104
  ///              countBiArcConnectedComponents(graph), "Wrong Orientation");
deba@414
  1105
  ///\endcode
deba@414
  1106
  ///
deba@414
  1107
  /// The number of the bi-connected components is a lower bound for
deba@414
  1108
  /// the number of the strongly connected components in the directed
deba@414
  1109
  /// graph because if we contract the bi-connected components to
deba@414
  1110
  /// nodes we will get a tree therefore we cannot orient arcs in
deba@414
  1111
  /// both direction between bi-connected components. In the other way
deba@414
  1112
  /// the algorithm will orient one component to be strongly
deba@414
  1113
  /// connected. The two relations proof that the assertion will
deba@414
  1114
  /// be always true and the found solution is optimal.
deba@414
  1115
  ///
deba@414
  1116
  /// \sa DirGraphAdaptorBase
deba@414
  1117
  /// \sa dirGraphAdaptor
deba@414
  1118
  template<typename _Graph, 
deba@414
  1119
           typename DirectionMap = typename _Graph::template EdgeMap<bool> > 
deba@414
  1120
  class DirGraphAdaptor : 
deba@414
  1121
    public DigraphAdaptorExtender<DirGraphAdaptorBase<_Graph, DirectionMap> > {
deba@414
  1122
  public:
deba@414
  1123
    typedef _Graph Graph;
deba@414
  1124
    typedef DigraphAdaptorExtender<
deba@414
  1125
      DirGraphAdaptorBase<_Graph, DirectionMap> > Parent;
deba@415
  1126
    typedef typename Parent::Arc Arc;
deba@414
  1127
  protected:
deba@414
  1128
    DirGraphAdaptor() { }
deba@414
  1129
  public:
deba@414
  1130
    
deba@414
  1131
    /// \brief Constructor of the adaptor
deba@414
  1132
    ///
deba@414
  1133
    /// Constructor of the adaptor
deba@414
  1134
    DirGraphAdaptor(Graph& graph, DirectionMap& direction) { 
deba@414
  1135
      setGraph(graph);
deba@414
  1136
      setDirectionMap(direction);
deba@414
  1137
    }
deba@415
  1138
deba@415
  1139
    /// \brief Reverse arc
deba@415
  1140
    /// 
deba@415
  1141
    /// It reverse the given arc. It simply negate the direction in the map.
deba@415
  1142
    void reverseArc(const Arc& a) {
deba@415
  1143
      Parent::reverseArc(a);
deba@415
  1144
    }
deba@414
  1145
  };
deba@414
  1146
deba@414
  1147
  /// \brief Just gives back a DirGraphAdaptor
deba@414
  1148
  ///
deba@414
  1149
  /// Just gives back a DirGraphAdaptor
deba@414
  1150
  template<typename Graph, typename DirectionMap>
deba@414
  1151
  DirGraphAdaptor<const Graph, DirectionMap>
deba@414
  1152
  dirGraphAdaptor(const Graph& graph, DirectionMap& dm) {
deba@414
  1153
    return DirGraphAdaptor<const Graph, DirectionMap>(graph, dm);
deba@414
  1154
  }
deba@414
  1155
deba@414
  1156
  template<typename Graph, typename DirectionMap>
deba@414
  1157
  DirGraphAdaptor<const Graph, const DirectionMap>
deba@414
  1158
  dirGraphAdaptor(const Graph& graph, const DirectionMap& dm) {
deba@414
  1159
    return DirGraphAdaptor<const Graph, const DirectionMap>(graph, dm);
deba@414
  1160
  }
deba@414
  1161
deba@414
  1162
}
deba@414
  1163
deba@414
  1164
#endif