gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Reorganication of graph adaptors and doc improvements (#67) - Moving to one file, lemon/adaptors.h - Renamings - Doc cleanings
2 5 1
default
8 files changed with 2163 insertions and 2494 deletions:
↑ Collapse diff ↑
Show white space 6 line context
... ...
@@ -62,2 +62,75 @@
62 62
/**
63
@defgroup graph_adaptors Adaptor Classes for graphs
64
@ingroup graphs
65
\brief This group contains several adaptor classes for digraphs and graphs
66

	
67
The main parts of LEMON are the different graph structures, generic
68
graph algorithms, graph concepts which couple these, and graph
69
adaptors. While the previous notions are more or less clear, the
70
latter one needs further explanation. Graph adaptors are graph classes
71
which serve for considering graph structures in different ways.
72

	
73
A short example makes this much clearer.  Suppose that we have an
74
instance \c g of a directed graph type say ListDigraph and an algorithm
75
\code
76
template <typename Digraph>
77
int algorithm(const Digraph&);
78
\endcode
79
is needed to run on the reverse oriented graph.  It may be expensive
80
(in time or in memory usage) to copy \c g with the reversed
81
arcs.  In this case, an adaptor class is used, which (according
82
to LEMON digraph concepts) works as a digraph.  The adaptor uses the
83
original digraph structure and digraph operations when methods of the
84
reversed oriented graph are called.  This means that the adaptor have
85
minor memory usage, and do not perform sophisticated algorithmic
86
actions.  The purpose of it is to give a tool for the cases when a
87
graph have to be used in a specific alteration.  If this alteration is
88
obtained by a usual construction like filtering the arc-set or
89
considering a new orientation, then an adaptor is worthwhile to use.
90
To come back to the reverse oriented graph, in this situation
91
\code
92
template<typename Digraph> class ReverseDigraph;
93
\endcode
94
template class can be used. The code looks as follows
95
\code
96
ListDigraph g;
97
ReverseDigraph<ListGraph> rg(g);
98
int result = algorithm(rg);
99
\endcode
100
After running the algorithm, the original graph \c g is untouched.
101
This techniques gives rise to an elegant code, and based on stable
102
graph adaptors, complex algorithms can be implemented easily.
103

	
104
In flow, circulation and bipartite matching problems, the residual
105
graph is of particular importance. Combining an adaptor implementing
106
this, shortest path algorithms and minimum mean cycle algorithms,
107
a range of weighted and cardinality optimization algorithms can be
108
obtained. For other examples, the interested user is referred to the
109
detailed documentation of particular adaptors.
110

	
111
The behavior of graph adaptors can be very different. Some of them keep
112
capabilities of the original graph while in other cases this would be
113
meaningless. This means that the concepts that they are models of depend
114
on the graph adaptor, and the wrapped graph(s).
115
If an arc of \c rg is deleted, this is carried out by deleting the
116
corresponding arc of \c g, thus the adaptor modifies the original graph.
117

	
118
But for a residual graph, this operation has no sense.
119
Let us stand one more example here to simplify your work.
120
RevGraphAdaptor has constructor
121
\code
122
ReverseDigraph(Digraph& digraph);
123
\endcode
124
This means that in a situation, when a <tt>const ListDigraph&</tt>
125
reference to a graph is given, then it have to be instantiated with
126
<tt>Digraph=const ListDigraph</tt>.
127
\code
128
int algorithm1(const ListDigraph& g) {
129
  RevGraphAdaptor<const ListDigraph> rg(g);
130
  return algorithm2(rg);
131
}
132
\endcode
133
*/
134

	
135
/**
63 136
@defgroup semi_adaptors Semi-Adaptor Classes for Graphs
Ignore white space 6 line context
... ...
@@ -18,2 +18,3 @@
18 18
lemon_HEADERS += \
19
	lemon/adaptors.h \
19 20
        lemon/arg_parser.h \
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
... ...
@@ -18,10 +18,10 @@
18 18

	
19
#ifndef LEMON_DIGRAPH_ADAPTOR_H
20
#define LEMON_DIGRAPH_ADAPTOR_H
21

	
22
///\ingroup graph_adaptors
23
///\file
24
///\brief Several digraph adaptors.
19
#ifndef LEMON_ADAPTORS_H
20
#define LEMON_ADAPTORS_H
21

	
22
/// \ingroup graph_adaptors
23
/// \file
24
/// \brief Several graph adaptors
25 25
///
26
///This file contains several useful digraph adaptor classes.
26
/// This file contains several useful adaptors for digraphs and graphs.
27 27

	
... ...
@@ -31,5 +31,3 @@
31 31

	
32
#include <lemon/bits/base_extender.h>
33 32
#include <lemon/bits/graph_adaptor_extender.h>
34
#include <lemon/bits/graph_extender.h>
35 33
#include <lemon/tolerance.h>
... ...
@@ -57,3 +55,3 @@
57 55
    typedef typename Digraph::Arc Arc;
58
   
56

	
59 57
    void first(Node& i) const { _digraph->first(i); }
... ...
@@ -73,3 +71,3 @@
73 71
    int nodeNum() const { return _digraph->nodeNum(); }
74
    
72

	
75 73
    typedef EdgeNumTagIndicator<Digraph> EdgeNumTag;
... ...
@@ -81,3 +79,3 @@
81 79
    }
82
  
80

	
83 81
    Node addNode() { return _digraph->addNode(); }
... ...
@@ -87,5 +85,5 @@
87 85
    void erase(const Arc& a) const { _digraph->erase(a); }
88
  
86

	
89 87
    void clear() const { _digraph->clear(); }
90
    
88

	
91 89
    int id(const Node& n) const { return _digraph->id(n); }
... ...
@@ -100,7 +98,7 @@
100 98
    typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
101
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); } 
99
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
102 100

	
103 101
    typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
104
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); } 
105
    
102
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
103

	
106 104
    template <typename _Value>
... ...
@@ -111,7 +109,7 @@
111 109

	
112
      explicit NodeMap(const Adaptor& adaptor) 
113
	: Parent(*adaptor._digraph) {}
110
      explicit NodeMap(const Adaptor& adaptor)
111
        : Parent(*adaptor._digraph) {}
114 112

	
115 113
      NodeMap(const Adaptor& adaptor, const _Value& value)
116
	: Parent(*adaptor._digraph, value) { }
114
        : Parent(*adaptor._digraph, value) { }
117 115

	
... ...
@@ -127,3 +125,3 @@
127 125
      }
128
      
126

	
129 127
    };
... ...
@@ -133,10 +131,10 @@
133 131
    public:
134
      
132

	
135 133
      typedef typename Digraph::template ArcMap<_Value> Parent;
136
      
137
      explicit ArcMap(const Adaptor& adaptor) 
138
	: Parent(*adaptor._digraph) {}
134

	
135
      explicit ArcMap(const Adaptor& adaptor)
136
        : Parent(*adaptor._digraph) {}
139 137

	
140 138
      ArcMap(const Adaptor& adaptor, const _Value& value)
141
	: Parent(*adaptor._digraph, value) {}
139
        : Parent(*adaptor._digraph, value) {}
142 140

	
... ...
@@ -157,5 +155,159 @@
157 155

	
156
  template<typename _Graph>
157
  class GraphAdaptorBase {
158
  public:
159
    typedef _Graph Graph;
160
    typedef Graph ParentGraph;
161

	
162
  protected:
163
    Graph* _graph;
164

	
165
    GraphAdaptorBase() : _graph(0) {}
166

	
167
    void setGraph(Graph& graph) { _graph = &graph; }
168

	
169
  public:
170
    GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
171

	
172
    typedef typename Graph::Node Node;
173
    typedef typename Graph::Arc Arc;
174
    typedef typename Graph::Edge Edge;
175

	
176
    void first(Node& i) const { _graph->first(i); }
177
    void first(Arc& i) const { _graph->first(i); }
178
    void first(Edge& i) const { _graph->first(i); }
179
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
180
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
181
    void firstInc(Edge &i, bool &d, const Node &n) const {
182
      _graph->firstInc(i, d, n);
183
    }
184

	
185
    void next(Node& i) const { _graph->next(i); }
186
    void next(Arc& i) const { _graph->next(i); }
187
    void next(Edge& i) const { _graph->next(i); }
188
    void nextIn(Arc& i) const { _graph->nextIn(i); }
189
    void nextOut(Arc& i) const { _graph->nextOut(i); }
190
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
191

	
192
    Node u(const Edge& e) const { return _graph->u(e); }
193
    Node v(const Edge& e) const { return _graph->v(e); }
194

	
195
    Node source(const Arc& a) const { return _graph->source(a); }
196
    Node target(const Arc& a) const { return _graph->target(a); }
197

	
198
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
199
    int nodeNum() const { return _graph->nodeNum(); }
200

	
201
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
202
    int arcNum() const { return _graph->arcNum(); }
203
    int edgeNum() const { return _graph->edgeNum(); }
204

	
205
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
206
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
207
      return _graph->findArc(u, v, prev);
208
    }
209
    Edge findEdge(const Node& u, const Node& v, const Edge& prev = INVALID) {
210
      return _graph->findEdge(u, v, prev);
211
    }
212

	
213
    Node addNode() { return _graph->addNode(); }
214
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
215

	
216
    void erase(const Node& i) { _graph->erase(i); }
217
    void erase(const Edge& i) { _graph->erase(i); }
218

	
219
    void clear() { _graph->clear(); }
220

	
221
    bool direction(const Arc& a) const { return _graph->direction(a); }
222
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
223

	
224
    int id(const Node& v) const { return _graph->id(v); }
225
    int id(const Arc& a) const { return _graph->id(a); }
226
    int id(const Edge& e) const { return _graph->id(e); }
227

	
228
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
229
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
230
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
231

	
232
    int maxNodeId() const { return _graph->maxNodeId(); }
233
    int maxArcId() const { return _graph->maxArcId(); }
234
    int maxEdgeId() const { return _graph->maxEdgeId(); }
235

	
236
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
237
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
238

	
239
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
240
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
241

	
242
    typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
243
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
244

	
245
    template <typename _Value>
246
    class NodeMap : public Graph::template NodeMap<_Value> {
247
    public:
248
      typedef typename Graph::template NodeMap<_Value> Parent;
249
      explicit NodeMap(const GraphAdaptorBase<Graph>& adapter)
250
        : Parent(*adapter._graph) {}
251
      NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
252
        : Parent(*adapter._graph, value) {}
253

	
254
    private:
255
      NodeMap& operator=(const NodeMap& cmap) {
256
        return operator=<NodeMap>(cmap);
257
      }
258

	
259
      template <typename CMap>
260
      NodeMap& operator=(const CMap& cmap) {
261
        Parent::operator=(cmap);
262
        return *this;
263
      }
264

	
265
    };
266

	
267
    template <typename _Value>
268
    class ArcMap : public Graph::template ArcMap<_Value> {
269
    public:
270
      typedef typename Graph::template ArcMap<_Value> Parent;
271
      explicit ArcMap(const GraphAdaptorBase<Graph>& adapter)
272
        : Parent(*adapter._graph) {}
273
      ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
274
        : Parent(*adapter._graph, value) {}
275

	
276
    private:
277
      ArcMap& operator=(const ArcMap& cmap) {
278
        return operator=<ArcMap>(cmap);
279
      }
280

	
281
      template <typename CMap>
282
      ArcMap& operator=(const CMap& cmap) {
283
        Parent::operator=(cmap);
284
        return *this;
285
      }
286
    };
287

	
288
    template <typename _Value>
289
    class EdgeMap : public Graph::template EdgeMap<_Value> {
290
    public:
291
      typedef typename Graph::template EdgeMap<_Value> Parent;
292
      explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
293
        : Parent(*adapter._graph) {}
294
      EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
295
        : Parent(*adapter._graph, value) {}
296

	
297
    private:
298
      EdgeMap& operator=(const EdgeMap& cmap) {
299
        return operator=<EdgeMap>(cmap);
300
      }
301

	
302
      template <typename CMap>
303
      EdgeMap& operator=(const CMap& cmap) {
304
        Parent::operator=(cmap);
305
        return *this;
306
      }
307
    };
308

	
309
  };
158 310

	
159 311
  template <typename _Digraph>
160
  class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
312
  class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
161 313
  public:
... ...
@@ -164,3 +316,3 @@
164 316
  protected:
165
    RevDigraphAdaptorBase() : Parent() { }
317
    ReverseDigraphBase() : Parent() { }
166 318
  public:
... ...
@@ -178,5 +330,7 @@
178 330

	
331
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
332

	
179 333
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
180
    Arc findArc(const Node& u, const Node& v, 
181
		const Arc& prev = INVALID) {
334
    Arc findArc(const Node& u, const Node& v,
335
                const Arc& prev = INVALID) {
182 336
      return Parent::findArc(v, u, prev);
... ...
@@ -185,54 +339,16 @@
185 339
  };
186
    
187

	
188
  ///\ingroup graph_adaptors
340

	
341
  /// \ingroup graph_adaptors
189 342
  ///
190
  ///\brief A digraph adaptor which reverses the orientation of the arcs.
343
  /// \brief A digraph adaptor which reverses the orientation of the arcs.
191 344
  ///
192
  /// If \c g is defined as
193
  ///\code
194
  /// ListDigraph dg;
195
  ///\endcode
196
  /// then
197
  ///\code
198
  /// RevDigraphAdaptor<ListDigraph> dga(dg);
199
  ///\endcode
200
  /// implements the digraph obtained from \c dg by 
201
  /// reversing the orientation of its arcs.
345
  /// ReverseDigraph reverses the arcs in the adapted digraph. The
346
  /// SubDigraph is conform to the \ref concepts::Digraph
347
  /// "Digraph concept".
202 348
  ///
203
  /// A good example of using RevDigraphAdaptor is to decide whether
204
  /// the directed graph is strongly connected or not. The digraph is
205
  /// strongly connected iff each node is reachable from one node and
206
  /// this node is reachable from the others. Instead of this
207
  /// condition we use a slightly different, from one node each node
208
  /// is reachable both in the digraph and the reversed digraph. Now
209
  /// this condition can be checked with the Dfs algorithm and the
210
  /// RevDigraphAdaptor class.
211
  ///
212
  /// The implementation:
213
  ///\code
214
  /// bool stronglyConnected(const Digraph& digraph) {
215
  ///   if (NodeIt(digraph) == INVALID) return true;
216
  ///   Dfs<Digraph> dfs(digraph);
217
  ///   dfs.run(NodeIt(digraph));
218
  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
219
  ///     if (!dfs.reached(it)) {
220
  ///       return false;
221
  ///     }
222
  ///   }
223
  ///   typedef RevDigraphAdaptor<const Digraph> RDigraph;
224
  ///   RDigraph rdigraph(digraph);
225
  ///   DfsVisit<RDigraph> rdfs(rdigraph);
226
  ///   rdfs.run(NodeIt(digraph));
227
  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
228
  ///     if (!rdfs.reached(it)) {
229
  ///       return false;
230
  ///     }
231
  ///   }
232
  ///   return true;
233
  /// }
234
  ///\endcode
349
  /// \tparam _Digraph It must be conform to the \ref concepts::Digraph
350
  /// "Digraph concept". The type can be specified to be const.
235 351
  template<typename _Digraph>
236
  class RevDigraphAdaptor : 
237
    public DigraphAdaptorExtender<RevDigraphAdaptorBase<_Digraph> > {
352
  class ReverseDigraph :
353
    public DigraphAdaptorExtender<ReverseDigraphBase<_Digraph> > {
238 354
  public:
... ...
@@ -240,5 +356,5 @@
240 356
    typedef DigraphAdaptorExtender<
241
      RevDigraphAdaptorBase<_Digraph> > Parent;
357
      ReverseDigraphBase<_Digraph> > Parent;
242 358
  protected:
243
    RevDigraphAdaptor() { }
359
    ReverseDigraph() { }
244 360
  public:
... ...
@@ -247,5 +363,5 @@
247 363
    ///
248
    /// Creates a reverse graph adaptor for the given digraph
249
    explicit RevDigraphAdaptor(Digraph& digraph) { 
250
      Parent::setDigraph(digraph); 
364
    /// Creates a reverse digraph adaptor for the given digraph
365
    explicit ReverseDigraph(Digraph& digraph) {
366
      Parent::setDigraph(digraph);
251 367
    }
... ...
@@ -257,10 +373,9 @@
257 373
  template<typename Digraph>
258
  RevDigraphAdaptor<const Digraph>
259
  revDigraphAdaptor(const Digraph& digraph) {
260
    return RevDigraphAdaptor<const Digraph>(digraph);
374
  ReverseDigraph<const Digraph> reverseDigraph(const Digraph& digraph) {
375
    return ReverseDigraph<const Digraph>(digraph);
261 376
  }
262 377

	
263
  template <typename _Digraph, typename _NodeFilterMap, 
264
	    typename _ArcFilterMap, bool checked = true>
265
  class SubDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> {
378
  template <typename _Digraph, typename _NodeFilterMap,
379
            typename _ArcFilterMap, bool _checked = true>
380
  class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
266 381
  public:
... ...
@@ -270,3 +385,3 @@
270 385

	
271
    typedef SubDigraphAdaptorBase Adaptor;
386
    typedef SubDigraphBase Adaptor;
272 387
    typedef DigraphAdaptorBase<_Digraph> Parent;
... ...
@@ -275,3 +390,3 @@
275 390
    ArcFilterMap* _arc_filter;
276
    SubDigraphAdaptorBase() 
391
    SubDigraphBase()
277 392
      : Parent(), _node_filter(0), _arc_filter(0) { }
... ...
@@ -290,48 +405,54 @@
290 405

	
291
    void first(Node& i) const { 
292
      Parent::first(i); 
293
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i); 
406
    void first(Node& i) const {
407
      Parent::first(i);
408
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
294 409
    }
295 410

	
296
    void first(Arc& i) const { 
297
      Parent::first(i); 
298
      while (i != INVALID && (!(*_arc_filter)[i] 
299
	     || !(*_node_filter)[Parent::source(i)]
300
	     || !(*_node_filter)[Parent::target(i)])) Parent::next(i); 
411
    void first(Arc& i) const {
412
      Parent::first(i);
413
      while (i != INVALID && (!(*_arc_filter)[i]
414
                              || !(*_node_filter)[Parent::source(i)]
415
                              || !(*_node_filter)[Parent::target(i)]))
416
        Parent::next(i);
301 417
    }
302 418

	
303
    void firstIn(Arc& i, const Node& n) const { 
304
      Parent::firstIn(i, n); 
305
      while (i != INVALID && (!(*_arc_filter)[i] 
306
	     || !(*_node_filter)[Parent::source(i)])) Parent::nextIn(i); 
419
    void firstIn(Arc& i, const Node& n) const {
420
      Parent::firstIn(i, n);
421
      while (i != INVALID && (!(*_arc_filter)[i]
422
                              || !(*_node_filter)[Parent::source(i)]))
423
        Parent::nextIn(i);
307 424
    }
308 425

	
309
    void firstOut(Arc& i, const Node& n) const { 
310
      Parent::firstOut(i, n); 
311
      while (i != INVALID && (!(*_arc_filter)[i] 
312
	     || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); 
426
    void firstOut(Arc& i, const Node& n) const {
427
      Parent::firstOut(i, n);
428
      while (i != INVALID && (!(*_arc_filter)[i]
429
                              || !(*_node_filter)[Parent::target(i)]))
430
        Parent::nextOut(i);
313 431
    }
314 432

	
315
    void next(Node& i) const { 
316
      Parent::next(i); 
317
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i); 
433
    void next(Node& i) const {
434
      Parent::next(i);
435
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
318 436
    }
319 437

	
320
    void next(Arc& i) const { 
321
      Parent::next(i); 
322
      while (i != INVALID && (!(*_arc_filter)[i] 
323
	     || !(*_node_filter)[Parent::source(i)]
324
	     || !(*_node_filter)[Parent::target(i)])) Parent::next(i); 
438
    void next(Arc& i) const {
439
      Parent::next(i);
440
      while (i != INVALID && (!(*_arc_filter)[i]
441
                              || !(*_node_filter)[Parent::source(i)]
442
                              || !(*_node_filter)[Parent::target(i)]))
443
        Parent::next(i);
325 444
    }
326 445

	
327
    void nextIn(Arc& i) const { 
328
      Parent::nextIn(i); 
329
      while (i != INVALID && (!(*_arc_filter)[i] 
330
	     || !(*_node_filter)[Parent::source(i)])) Parent::nextIn(i); 
446
    void nextIn(Arc& i) const {
447
      Parent::nextIn(i);
448
      while (i != INVALID && (!(*_arc_filter)[i]
449
                              || !(*_node_filter)[Parent::source(i)]))
450
        Parent::nextIn(i);
331 451
    }
332 452

	
333
    void nextOut(Arc& i) const { 
334
      Parent::nextOut(i); 
335
      while (i != INVALID && (!(*_arc_filter)[i] 
336
	     || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); 
453
    void nextOut(Arc& i) const {
454
      Parent::nextOut(i);
455
      while (i != INVALID && (!(*_arc_filter)[i]
456
                              || !(*_node_filter)[Parent::target(i)]))
457
        Parent::nextOut(i);
337 458
    }
... ...
@@ -351,4 +472,4 @@
351 472
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
352
    Arc findArc(const Node& source, const Node& target, 
353
		const Arc& prev = INVALID) {
473
    Arc findArc(const Node& source, const Node& target,
474
                const Arc& prev = INVALID) {
354 475
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
... ...
@@ -364,4 +485,4 @@
364 485
    template <typename _Value>
365
    class NodeMap : public SubMapExtender<Adaptor, 
366
        typename Parent::template NodeMap<_Value> > {
486
    class NodeMap : public SubMapExtender<Adaptor,
487
      typename Parent::template NodeMap<_Value> > {
367 488
    public:
... ...
@@ -370,13 +491,13 @@
370 491
                             template NodeMap<Value> > MapParent;
371
    
372
      NodeMap(const Adaptor& adaptor) 
373
	: MapParent(adaptor) {}
374
      NodeMap(const Adaptor& adaptor, const Value& value) 
375
	: MapParent(adaptor, value) {}
376
    
492

	
493
      NodeMap(const Adaptor& adaptor)
494
        : MapParent(adaptor) {}
495
      NodeMap(const Adaptor& adaptor, const Value& value)
496
        : MapParent(adaptor, value) {}
497

	
377 498
    private:
378 499
      NodeMap& operator=(const NodeMap& cmap) {
379
	return operator=<NodeMap>(cmap);
500
        return operator=<NodeMap>(cmap);
380 501
      }
381
    
502

	
382 503
      template <typename CMap>
... ...
@@ -384,3 +505,3 @@
384 505
        MapParent::operator=(cmap);
385
	return *this;
506
        return *this;
386 507
      }
... ...
@@ -389,4 +510,4 @@
389 510
    template <typename _Value>
390
    class ArcMap : public SubMapExtender<Adaptor, 
391
	typename Parent::template ArcMap<_Value> > {
511
    class ArcMap : public SubMapExtender<Adaptor,
512
      typename Parent::template ArcMap<_Value> > {
392 513
    public:
... ...
@@ -395,13 +516,13 @@
395 516
                             template ArcMap<Value> > MapParent;
396
    
397
      ArcMap(const Adaptor& adaptor) 
398
	: MapParent(adaptor) {}
399
      ArcMap(const Adaptor& adaptor, const Value& value) 
400
	: MapParent(adaptor, value) {}
401
    
517

	
518
      ArcMap(const Adaptor& adaptor)
519
        : MapParent(adaptor) {}
520
      ArcMap(const Adaptor& adaptor, const Value& value)
521
        : MapParent(adaptor, value) {}
522

	
402 523
    private:
403 524
      ArcMap& operator=(const ArcMap& cmap) {
404
	return operator=<ArcMap>(cmap);
525
        return operator=<ArcMap>(cmap);
405 526
      }
406
    
527

	
407 528
      template <typename CMap>
... ...
@@ -409,3 +530,3 @@
409 530
        MapParent::operator=(cmap);
410
	return *this;
531
        return *this;
411 532
      }
... ...
@@ -416,3 +537,3 @@
416 537
  template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
417
  class SubDigraphAdaptorBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false> 
538
  class SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
418 539
    : public DigraphAdaptorBase<_Digraph> {
... ...
@@ -423,3 +544,3 @@
423 544

	
424
    typedef SubDigraphAdaptorBase Adaptor;
545
    typedef SubDigraphBase Adaptor;
425 546
    typedef DigraphAdaptorBase<Digraph> Parent;
... ...
@@ -428,3 +549,3 @@
428 549
    ArcFilterMap* _arc_filter;
429
    SubDigraphAdaptorBase() 
550
    SubDigraphBase()
430 551
      : Parent(), _node_filter(0), _arc_filter(0) { }
... ...
@@ -443,38 +564,38 @@
443 564

	
444
    void first(Node& i) const { 
445
      Parent::first(i); 
446
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i); 
565
    void first(Node& i) const {
566
      Parent::first(i);
567
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
447 568
    }
448 569

	
449
    void first(Arc& i) const { 
450
      Parent::first(i); 
451
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i); 
570
    void first(Arc& i) const {
571
      Parent::first(i);
572
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
452 573
    }
453 574

	
454
    void firstIn(Arc& i, const Node& n) const { 
455
      Parent::firstIn(i, n); 
456
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i); 
575
    void firstIn(Arc& i, const Node& n) const {
576
      Parent::firstIn(i, n);
577
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
457 578
    }
458 579

	
459
    void firstOut(Arc& i, const Node& n) const { 
460
      Parent::firstOut(i, n); 
461
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); 
580
    void firstOut(Arc& i, const Node& n) const {
581
      Parent::firstOut(i, n);
582
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
462 583
    }
463 584

	
464
    void next(Node& i) const { 
465
      Parent::next(i); 
466
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i); 
585
    void next(Node& i) const {
586
      Parent::next(i);
587
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
467 588
    }
468
    void next(Arc& i) const { 
469
      Parent::next(i); 
470
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i); 
589
    void next(Arc& i) const {
590
      Parent::next(i);
591
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
471 592
    }
472
    void nextIn(Arc& i) const { 
473
      Parent::nextIn(i); 
474
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i); 
593
    void nextIn(Arc& i) const {
594
      Parent::nextIn(i);
595
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
475 596
    }
476 597

	
477
    void nextOut(Arc& i) const { 
478
      Parent::nextOut(i); 
479
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); 
598
    void nextOut(Arc& i) const {
599
      Parent::nextOut(i);
600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
480 601
    }
... ...
@@ -494,4 +615,4 @@
494 615
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
495
    Arc findArc(const Node& source, const Node& target, 
496
		  const Arc& prev = INVALID) {
616
    Arc findArc(const Node& source, const Node& target,
617
                const Arc& prev = INVALID) {
497 618
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
... ...
@@ -507,4 +628,4 @@
507 628
    template <typename _Value>
508
    class NodeMap : public SubMapExtender<Adaptor, 
509
        typename Parent::template NodeMap<_Value> > {
629
    class NodeMap : public SubMapExtender<Adaptor,
630
      typename Parent::template NodeMap<_Value> > {
510 631
    public:
... ...
@@ -513,13 +634,13 @@
513 634
                             template NodeMap<Value> > MapParent;
514
    
515
      NodeMap(const Adaptor& adaptor) 
516
	: MapParent(adaptor) {}
517
      NodeMap(const Adaptor& adaptor, const Value& value) 
518
	: MapParent(adaptor, value) {}
519
    
635

	
636
      NodeMap(const Adaptor& adaptor)
637
        : MapParent(adaptor) {}
638
      NodeMap(const Adaptor& adaptor, const Value& value)
639
        : MapParent(adaptor, value) {}
640

	
520 641
    private:
521 642
      NodeMap& operator=(const NodeMap& cmap) {
522
	return operator=<NodeMap>(cmap);
643
        return operator=<NodeMap>(cmap);
523 644
      }
524
    
645

	
525 646
      template <typename CMap>
... ...
@@ -527,3 +648,3 @@
527 648
        MapParent::operator=(cmap);
528
	return *this;
649
        return *this;
529 650
      }
... ...
@@ -532,4 +653,4 @@
532 653
    template <typename _Value>
533
    class ArcMap : public SubMapExtender<Adaptor, 
534
	typename Parent::template ArcMap<_Value> > {
654
    class ArcMap : public SubMapExtender<Adaptor,
655
      typename Parent::template ArcMap<_Value> > {
535 656
    public:
... ...
@@ -538,13 +659,13 @@
538 659
                             template ArcMap<Value> > MapParent;
539
    
540
      ArcMap(const Adaptor& adaptor) 
541
	: MapParent(adaptor) {}
542
      ArcMap(const Adaptor& adaptor, const Value& value) 
543
	: MapParent(adaptor, value) {}
544
    
660

	
661
      ArcMap(const Adaptor& adaptor)
662
        : MapParent(adaptor) {}
663
      ArcMap(const Adaptor& adaptor, const Value& value)
664
        : MapParent(adaptor, value) {}
665

	
545 666
    private:
546 667
      ArcMap& operator=(const ArcMap& cmap) {
547
	return operator=<ArcMap>(cmap);
668
        return operator=<ArcMap>(cmap);
548 669
      }
549
    
670

	
550 671
      template <typename CMap>
... ...
@@ -552,3 +673,3 @@
552 673
        MapParent::operator=(cmap);
553
	return *this;
674
        return *this;
554 675
      }
... ...
@@ -560,49 +681,30 @@
560 681
  ///
561
  /// \brief A digraph adaptor for hiding nodes and arcs from a digraph.
562
  /// 
563
  /// SubDigraphAdaptor shows the digraph with filtered node-set and 
564
  /// arc-set. If the \c checked parameter is true then it filters the arc-set
565
  /// respect to the source and target.
566
  /// 
567
  /// If the \c checked template parameter is false then the
568
  /// node-iterator cares only the filter on the node-set, and the
569
  /// arc-iterator cares only the filter on the arc-set.  Therefore
570
  /// the arc-map have to filter all arcs which's source or target is
571
  /// filtered by the node-filter.
572
  ///\code
573
  /// typedef ListDigraph Digraph;
574
  /// DIGRAPH_TYPEDEFS(Digraph);
575
  /// Digraph g;
576
  /// Node u=g.addNode(); //node of id 0
577
  /// Node v=g.addNode(); //node of id 1
578
  /// Arc a=g.addArc(u, v); //arc of id 0
579
  /// Arc f=g.addArc(v, u); //arc of id 1
580
  /// BoolNodeMap nm(g, true);
581
  /// nm.set(u, false);
582
  /// BoolArcMap am(g, true);
583
  /// am.set(a, false);
584
  /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubDGA;
585
  /// SubDGA ga(g, nm, am);
586
  /// for (SubDGA::NodeIt n(ga); n!=INVALID; ++n)
587
  ///   std::cout << g.id(n) << std::endl;
588
  /// for (SubDGA::ArcIt a(ga); a!=INVALID; ++a) 
589
  ///   std::cout << g.id(a) << std::endl;
590
  ///\endcode
591
  /// The output of the above code is the following.
592
  ///\code
593
  /// 1
594
  /// 1
595
  ///\endcode
596
  /// Note that \c n is of type \c SubDGA::NodeIt, but it can be converted to
597
  /// \c Digraph::Node that is why \c g.id(n) can be applied.
598
  /// 
599
  /// For other examples see also the documentation of
600
  /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor.
601
  template<typename _Digraph, 
602
	   typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>, 
603
	   typename _ArcFilterMap = typename _Digraph::template ArcMap<bool>, 
604
	   bool checked = true>
605
  class SubDigraphAdaptor : 
606
    public DigraphAdaptorExtender<
607
    SubDigraphAdaptorBase<_Digraph, _NodeFilterMap, _ArcFilterMap, checked> > {
682
  /// \brief An adaptor for hiding nodes and arcs in a digraph
683
  ///
684
  /// SubDigraph hides nodes and arcs in a digraph. A bool node map
685
  /// and a bool arc map must be specified, which define the filters
686
  /// for nodes and arcs. Just the nodes and arcs with true value are
687
  /// shown in the subdigraph. The SubDigraph is conform to the \ref
688
  /// concepts::Digraph "Digraph concept". If the \c _checked parameter
689
  /// is true, then the arcs incident to filtered nodes are also
690
  /// filtered out.
691
  ///
692
  /// \tparam _Digraph It must be conform to the \ref
693
  /// concepts::Digraph "Digraph concept". The type can be specified
694
  /// to const.
695
  /// \tparam _NodeFilterMap A bool valued node map of the the adapted digraph.
696
  /// \tparam _ArcFilterMap A bool valued arc map of the the adapted digraph.
697
  /// \tparam _checked If the parameter is false then the arc filtering
698
  /// is not checked with respect to node filter. Otherwise, each arc
699
  /// is automatically filtered, which is incident to a filtered node.
700
  ///
701
  /// \see FilterNodes
702
  /// \see FilterArcs
703
  template<typename _Digraph,
704
           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
705
           typename _ArcFilterMap = typename _Digraph::template ArcMap<bool>,
706
           bool _checked = true>
707
  class SubDigraph
708
    : public DigraphAdaptorExtender<
709
      SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, _checked> > {
608 710
  public:
... ...
@@ -613,3 +715,3 @@
613 715
    typedef DigraphAdaptorExtender<
614
      SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> >
716
      SubDigraphBase<Digraph, NodeFilterMap, ArcFilterMap, _checked> >
615 717
    Parent;
... ...
@@ -620,3 +722,3 @@
620 722
  protected:
621
    SubDigraphAdaptor() { }
723
    SubDigraph() { }
622 724
  public:
... ...
@@ -625,6 +727,6 @@
625 727
    ///
626
    /// Creates a sub-digraph-adaptor for the given digraph with
728
    /// Creates a subdigraph for the given digraph with
627 729
    /// given node and arc map filters.
628
    SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, 
629
		      ArcFilterMap& arc_filter) { 
730
    SubDigraph(Digraph& digraph, NodeFilterMap& node_filter,
731
               ArcFilterMap& arc_filter) {
630 732
      setDigraph(digraph);
... ...
@@ -636,4 +738,4 @@
636 738
    ///
637
    /// This function hides \c n in the digraph, i.e. the iteration 
638
    /// jumps over it. This is done by simply setting the value of \c n  
739
    /// This function hides \c n in the digraph, i.e. the iteration
740
    /// jumps over it. This is done by simply setting the value of \c n
639 741
    /// to be false in the corresponding node-map.
... ...
@@ -643,3 +745,3 @@
643 745
    ///
644
    /// This function hides \c a in the digraph, i.e. the iteration 
746
    /// This function hides \c a in the digraph, i.e. the iteration
645 747
    /// jumps over it. This is done by simply setting the value of \c a
... ...
@@ -650,4 +752,4 @@
650 752
    ///
651
    /// The value of \c n is set to be true in the node-map which stores 
652
    /// hide information. If \c n was hidden previuosly, then it is shown 
753
    /// The value of \c n is set to be true in the node-map which stores
754
    /// hide information. If \c n was hidden previuosly, then it is shown
653 755
    /// again
... ...
@@ -657,4 +759,4 @@
657 759
    ///
658
    /// The value of \c a is set to be true in the arc-map which stores 
659
    /// hide information. If \c a was hidden previuosly, then it is shown 
760
    /// The value of \c a is set to be true in the arc-map which stores
761
    /// hide information. If \c a was hidden previuosly, then it is shown
660 762
    /// again
... ...
@@ -676,10 +778,9 @@
676 778

	
677
  /// \brief Just gives back a sub-digraph-adaptor
779
  /// \brief Just gives back a subdigraph
678 780
  ///
679
  /// Just gives back a sub-digraph-adaptor
781
  /// Just gives back a subdigraph
680 782
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
681
  SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
682
  subDigraphAdaptor(const Digraph& digraph, 
683
		    NodeFilterMap& nfm, ArcFilterMap& afm) {
684
    return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap>
783
  SubDigraph<const Digraph, NodeFilterMap, ArcFilterMap>
784
  subDigraph(const Digraph& digraph, NodeFilterMap& nfm, ArcFilterMap& afm) {
785
    return SubDigraph<const Digraph, NodeFilterMap, ArcFilterMap>
685 786
      (digraph, nfm, afm);
... ...
@@ -688,6 +789,6 @@
688 789
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
689
  SubDigraphAdaptor<const Digraph, const NodeFilterMap, ArcFilterMap>
690
  subDigraphAdaptor(const Digraph& digraph, 
691
                   NodeFilterMap& nfm, ArcFilterMap& afm) {
692
    return SubDigraphAdaptor<const Digraph, const NodeFilterMap, ArcFilterMap>
790
  SubDigraph<const Digraph, const NodeFilterMap, ArcFilterMap>
791
  subDigraph(const Digraph& digraph,
792
             const NodeFilterMap& nfm, ArcFilterMap& afm) {
793
    return SubDigraph<const Digraph, const NodeFilterMap, ArcFilterMap>
693 794
      (digraph, nfm, afm);
... ...
@@ -696,6 +797,6 @@
696 797
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
697
  SubDigraphAdaptor<const Digraph, NodeFilterMap, const ArcFilterMap>
698
  subDigraphAdaptor(const Digraph& digraph, 
699
                   NodeFilterMap& nfm, ArcFilterMap& afm) {
700
    return SubDigraphAdaptor<const Digraph, NodeFilterMap, const ArcFilterMap>
798
  SubDigraph<const Digraph, NodeFilterMap, const ArcFilterMap>
799
  subDigraph(const Digraph& digraph,
800
             NodeFilterMap& nfm, const ArcFilterMap& afm) {
801
    return SubDigraph<const Digraph, NodeFilterMap, const ArcFilterMap>
701 802
      (digraph, nfm, afm);
... ...
@@ -704,8 +805,7 @@
704 805
  template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap>
705
  SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap>
706
  subDigraphAdaptor(const Digraph& digraph, 
707
                   NodeFilterMap& nfm, ArcFilterMap& afm) {
708
    return SubDigraphAdaptor<const Digraph, const NodeFilterMap, 
806
  SubDigraph<const Digraph, const NodeFilterMap, const ArcFilterMap>
807
  subDigraph(const Digraph& digraph,
808
             const NodeFilterMap& nfm, const ArcFilterMap& afm) {
809
    return SubDigraph<const Digraph, const NodeFilterMap,
709 810
      const ArcFilterMap>(digraph, nfm, afm);
710

	
711 811
  }
... ...
@@ -713,36 +813,459 @@
713 813

	
714

	
715
  ///\ingroup graph_adaptors
814
  template <typename _Graph, typename NodeFilterMap,
815
            typename EdgeFilterMap, bool _checked = true>
816
  class SubGraphBase : public GraphAdaptorBase<_Graph> {
817
  public:
818
    typedef _Graph Graph;
819
    typedef SubGraphBase Adaptor;
820
    typedef GraphAdaptorBase<_Graph> Parent;
821
  protected:
822

	
823
    NodeFilterMap* _node_filter_map;
824
    EdgeFilterMap* _edge_filter_map;
825

	
826
    SubGraphBase()
827
      : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
828

	
829
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
830
      _node_filter_map=&node_filter_map;
831
    }
832
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
833
      _edge_filter_map=&edge_filter_map;
834
    }
835

	
836
  public:
837

	
838
    typedef typename Parent::Node Node;
839
    typedef typename Parent::Arc Arc;
840
    typedef typename Parent::Edge Edge;
841

	
842
    void first(Node& i) const {
843
      Parent::first(i);
844
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
845
    }
846

	
847
    void first(Arc& i) const {
848
      Parent::first(i);
849
      while (i!=INVALID && (!(*_edge_filter_map)[i]
850
                            || !(*_node_filter_map)[Parent::source(i)]
851
                            || !(*_node_filter_map)[Parent::target(i)]))
852
        Parent::next(i);
853
    }
854

	
855
    void first(Edge& i) const {
856
      Parent::first(i);
857
      while (i!=INVALID && (!(*_edge_filter_map)[i]
858
                            || !(*_node_filter_map)[Parent::u(i)]
859
                            || !(*_node_filter_map)[Parent::v(i)]))
860
        Parent::next(i);
861
    }
862

	
863
    void firstIn(Arc& i, const Node& n) const {
864
      Parent::firstIn(i, n);
865
      while (i!=INVALID && (!(*_edge_filter_map)[i]
866
                            || !(*_node_filter_map)[Parent::source(i)]))
867
        Parent::nextIn(i);
868
    }
869

	
870
    void firstOut(Arc& i, const Node& n) const {
871
      Parent::firstOut(i, n);
872
      while (i!=INVALID && (!(*_edge_filter_map)[i]
873
                            || !(*_node_filter_map)[Parent::target(i)]))
874
        Parent::nextOut(i);
875
    }
876

	
877
    void firstInc(Edge& i, bool& d, const Node& n) const {
878
      Parent::firstInc(i, d, n);
879
      while (i!=INVALID && (!(*_edge_filter_map)[i]
880
                            || !(*_node_filter_map)[Parent::u(i)]
881
                            || !(*_node_filter_map)[Parent::v(i)]))
882
        Parent::nextInc(i, d);
883
    }
884

	
885
    void next(Node& i) const {
886
      Parent::next(i);
887
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
888
    }
889

	
890
    void next(Arc& i) const {
891
      Parent::next(i);
892
      while (i!=INVALID && (!(*_edge_filter_map)[i]
893
                            || !(*_node_filter_map)[Parent::source(i)]
894
                            || !(*_node_filter_map)[Parent::target(i)]))
895
        Parent::next(i);
896
    }
897

	
898
    void next(Edge& i) const {
899
      Parent::next(i);
900
      while (i!=INVALID && (!(*_edge_filter_map)[i]
901
                            || !(*_node_filter_map)[Parent::u(i)]
902
                            || !(*_node_filter_map)[Parent::v(i)]))
903
        Parent::next(i);
904
    }
905

	
906
    void nextIn(Arc& i) const {
907
      Parent::nextIn(i);
908
      while (i!=INVALID && (!(*_edge_filter_map)[i]
909
                            || !(*_node_filter_map)[Parent::source(i)]))
910
        Parent::nextIn(i);
911
    }
912

	
913
    void nextOut(Arc& i) const {
914
      Parent::nextOut(i);
915
      while (i!=INVALID && (!(*_edge_filter_map)[i]
916
                            || !(*_node_filter_map)[Parent::target(i)]))
917
        Parent::nextOut(i);
918
    }
919

	
920
    void nextInc(Edge& i, bool& d) const {
921
      Parent::nextInc(i, d);
922
      while (i!=INVALID && (!(*_edge_filter_map)[i]
923
                            || !(*_node_filter_map)[Parent::u(i)]
924
                            || !(*_node_filter_map)[Parent::v(i)]))
925
        Parent::nextInc(i, d);
926
    }
927

	
928
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
929
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
930

	
931
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
932
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
933

	
934
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
935
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
936

	
937
    typedef False NodeNumTag;
938
    typedef False EdgeNumTag;
939

	
940
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
941
    Arc findArc(const Node& u, const Node& v,
942
                const Arc& prev = INVALID) {
943
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
944
        return INVALID;
945
      }
946
      Arc arc = Parent::findArc(u, v, prev);
947
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
948
        arc = Parent::findArc(u, v, arc);
949
      }
950
      return arc;
951
    }
952
    Edge findEdge(const Node& u, const Node& v,
953
                  const Edge& prev = INVALID) {
954
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
955
        return INVALID;
956
      }
957
      Edge edge = Parent::findEdge(u, v, prev);
958
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
959
        edge = Parent::findEdge(u, v, edge);
960
      }
961
      return edge;
962
    }
963

	
964
    template <typename _Value>
965
    class NodeMap : public SubMapExtender<Adaptor,
966
      typename Parent::template NodeMap<_Value> > {
967
    public:
968
      typedef _Value Value;
969
      typedef SubMapExtender<Adaptor, typename Parent::
970
                             template NodeMap<Value> > MapParent;
971

	
972
      NodeMap(const Adaptor& adaptor)
973
        : MapParent(adaptor) {}
974
      NodeMap(const Adaptor& adaptor, const Value& value)
975
        : MapParent(adaptor, value) {}
976

	
977
    private:
978
      NodeMap& operator=(const NodeMap& cmap) {
979
        return operator=<NodeMap>(cmap);
980
      }
981

	
982
      template <typename CMap>
983
      NodeMap& operator=(const CMap& cmap) {
984
        MapParent::operator=(cmap);
985
        return *this;
986
      }
987
    };
988

	
989
    template <typename _Value>
990
    class ArcMap : public SubMapExtender<Adaptor,
991
      typename Parent::template ArcMap<_Value> > {
992
    public:
993
      typedef _Value Value;
994
      typedef SubMapExtender<Adaptor, typename Parent::
995
                             template ArcMap<Value> > MapParent;
996

	
997
      ArcMap(const Adaptor& adaptor)
998
        : MapParent(adaptor) {}
999
      ArcMap(const Adaptor& adaptor, const Value& value)
1000
        : MapParent(adaptor, value) {}
1001

	
1002
    private:
1003
      ArcMap& operator=(const ArcMap& cmap) {
1004
        return operator=<ArcMap>(cmap);
1005
      }
1006

	
1007
      template <typename CMap>
1008
      ArcMap& operator=(const CMap& cmap) {
1009
        MapParent::operator=(cmap);
1010
        return *this;
1011
      }
1012
    };
1013

	
1014
    template <typename _Value>
1015
    class EdgeMap : public SubMapExtender<Adaptor,
1016
      typename Parent::template EdgeMap<_Value> > {
1017
    public:
1018
      typedef _Value Value;
1019
      typedef SubMapExtender<Adaptor, typename Parent::
1020
                             template EdgeMap<Value> > MapParent;
1021

	
1022
      EdgeMap(const Adaptor& adaptor)
1023
        : MapParent(adaptor) {}
1024

	
1025
      EdgeMap(const Adaptor& adaptor, const Value& value)
1026
        : MapParent(adaptor, value) {}
1027

	
1028
    private:
1029
      EdgeMap& operator=(const EdgeMap& cmap) {
1030
        return operator=<EdgeMap>(cmap);
1031
      }
1032

	
1033
      template <typename CMap>
1034
      EdgeMap& operator=(const CMap& cmap) {
1035
        MapParent::operator=(cmap);
1036
        return *this;
1037
      }
1038
    };
1039

	
1040
  };
1041

	
1042
  template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
1043
  class SubGraphBase<_Graph, NodeFilterMap, EdgeFilterMap, false>
1044
    : public GraphAdaptorBase<_Graph> {
1045
  public:
1046
    typedef _Graph Graph;
1047
    typedef SubGraphBase Adaptor;
1048
    typedef GraphAdaptorBase<_Graph> Parent;
1049
  protected:
1050
    NodeFilterMap* _node_filter_map;
1051
    EdgeFilterMap* _edge_filter_map;
1052
    SubGraphBase() : Parent(),
1053
                     _node_filter_map(0), _edge_filter_map(0) { }
1054

	
1055
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
1056
      _node_filter_map=&node_filter_map;
1057
    }
1058
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
1059
      _edge_filter_map=&edge_filter_map;
1060
    }
1061

	
1062
  public:
1063

	
1064
    typedef typename Parent::Node Node;
1065
    typedef typename Parent::Arc Arc;
1066
    typedef typename Parent::Edge Edge;
1067

	
1068
    void first(Node& i) const {
1069
      Parent::first(i);
1070
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1071
    }
1072

	
1073
    void first(Arc& i) const {
1074
      Parent::first(i);
1075
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1076
    }
1077

	
1078
    void first(Edge& i) const {
1079
      Parent::first(i);
1080
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1081
    }
1082

	
1083
    void firstIn(Arc& i, const Node& n) const {
1084
      Parent::firstIn(i, n);
1085
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1086
    }
1087

	
1088
    void firstOut(Arc& i, const Node& n) const {
1089
      Parent::firstOut(i, n);
1090
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1091
    }
1092

	
1093
    void firstInc(Edge& i, bool& d, const Node& n) const {
1094
      Parent::firstInc(i, d, n);
1095
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1096
    }
1097

	
1098
    void next(Node& i) const {
1099
      Parent::next(i);
1100
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1101
    }
1102
    void next(Arc& i) const {
1103
      Parent::next(i);
1104
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1105
    }
1106
    void next(Edge& i) const {
1107
      Parent::next(i);
1108
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1109
    }
1110
    void nextIn(Arc& i) const {
1111
      Parent::nextIn(i);
1112
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1113
    }
1114

	
1115
    void nextOut(Arc& i) const {
1116
      Parent::nextOut(i);
1117
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1118
    }
1119
    void nextInc(Edge& i, bool& d) const {
1120
      Parent::nextInc(i, d);
1121
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1122
    }
1123

	
1124
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
1125
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
1126

	
1127
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
1128
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
1129

	
1130
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
1131
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
1132

	
1133
    typedef False NodeNumTag;
1134
    typedef False EdgeNumTag;
1135

	
1136
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1137
    Arc findArc(const Node& u, const Node& v,
1138
                const Arc& prev = INVALID) {
1139
      Arc arc = Parent::findArc(u, v, prev);
1140
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
1141
        arc = Parent::findArc(u, v, arc);
1142
      }
1143
      return arc;
1144
    }
1145
    Edge findEdge(const Node& u, const Node& v,
1146
                  const Edge& prev = INVALID) {
1147
      Edge edge = Parent::findEdge(u, v, prev);
1148
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
1149
        edge = Parent::findEdge(u, v, edge);
1150
      }
1151
      return edge;
1152
    }
1153

	
1154
    template <typename _Value>
1155
    class NodeMap : public SubMapExtender<Adaptor,
1156
      typename Parent::template NodeMap<_Value> > {
1157
    public:
1158
      typedef _Value Value;
1159
      typedef SubMapExtender<Adaptor, typename Parent::
1160
                             template NodeMap<Value> > MapParent;
1161

	
1162
      NodeMap(const Adaptor& adaptor)
1163
        : MapParent(adaptor) {}
1164
      NodeMap(const Adaptor& adaptor, const Value& value)
1165
        : MapParent(adaptor, value) {}
1166

	
1167
    private:
1168
      NodeMap& operator=(const NodeMap& cmap) {
1169
        return operator=<NodeMap>(cmap);
1170
      }
1171

	
1172
      template <typename CMap>
1173
      NodeMap& operator=(const CMap& cmap) {
1174
        MapParent::operator=(cmap);
1175
        return *this;
1176
      }
1177
    };
1178

	
1179
    template <typename _Value>
1180
    class ArcMap : public SubMapExtender<Adaptor,
1181
      typename Parent::template ArcMap<_Value> > {
1182
    public:
1183
      typedef _Value Value;
1184
      typedef SubMapExtender<Adaptor, typename Parent::
1185
                             template ArcMap<Value> > MapParent;
1186

	
1187
      ArcMap(const Adaptor& adaptor)
1188
        : MapParent(adaptor) {}
1189
      ArcMap(const Adaptor& adaptor, const Value& value)
1190
        : MapParent(adaptor, value) {}
1191

	
1192
    private:
1193
      ArcMap& operator=(const ArcMap& cmap) {
1194
        return operator=<ArcMap>(cmap);
1195
      }
1196

	
1197
      template <typename CMap>
1198
      ArcMap& operator=(const CMap& cmap) {
1199
        MapParent::operator=(cmap);
1200
        return *this;
1201
      }
1202
    };
1203

	
1204
    template <typename _Value>
1205
    class EdgeMap : public SubMapExtender<Adaptor,
1206
      typename Parent::template EdgeMap<_Value> > {
1207
    public:
1208
      typedef _Value Value;
1209
      typedef SubMapExtender<Adaptor, typename Parent::
1210
                             template EdgeMap<Value> > MapParent;
1211

	
1212
      EdgeMap(const Adaptor& adaptor)
1213
        : MapParent(adaptor) {}
1214

	
1215
      EdgeMap(const Adaptor& adaptor, const _Value& value)
1216
        : MapParent(adaptor, value) {}
1217

	
1218
    private:
1219
      EdgeMap& operator=(const EdgeMap& cmap) {
1220
        return operator=<EdgeMap>(cmap);
1221
      }
1222

	
1223
      template <typename CMap>
1224
      EdgeMap& operator=(const CMap& cmap) {
1225
        MapParent::operator=(cmap);
1226
        return *this;
1227
      }
1228
    };
1229

	
1230
  };
1231

	
1232
  /// \ingroup graph_adaptors
716 1233
  ///
717
  ///\brief An adaptor for hiding nodes from a digraph.
1234
  /// \brief A graph adaptor for hiding nodes and edges in an
1235
  /// undirected graph.
718 1236
  ///
719
  ///An adaptor for hiding nodes from a digraph.  This adaptor
720
  ///specializes SubDigraphAdaptor in the way that only the node-set
721
  ///can be filtered. In usual case the checked parameter is true, we
722
  ///get the induced subgraph. But if the checked parameter is false
723
  ///then we can filter only isolated nodes.
724
  template<typename _Digraph, 
725
	   typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>, 
726
	   bool checked = true>
727
  class NodeSubDigraphAdaptor : 
728
    public SubDigraphAdaptor<_Digraph, _NodeFilterMap, 
729
			     ConstMap<typename _Digraph::Arc, bool>, checked> {
1237
  /// SubGraph hides nodes and edges in a graph. A bool node map and a
1238
  /// bool edge map must be specified, which define the filters for
1239
  /// nodes and edges. Just the nodes and edges with true value are
1240
  /// shown in the subgraph. The SubGraph is conform to the \ref
1241
  /// concepts::Graph "Graph concept". If the \c _checked parameter is
1242
  /// true, then the edges incident to filtered nodes are also
1243
  /// filtered out.
1244
  ///
1245
  /// \tparam _Graph It must be conform to the \ref
1246
  /// concepts::Graph "Graph concept". The type can be specified
1247
  /// to const.
1248
  /// \tparam _NodeFilterMap A bool valued node map of the the adapted graph.
1249
  /// \tparam _EdgeFilterMap A bool valued edge map of the the adapted graph.
1250
  /// \tparam _checked If the parameter is false then the edge filtering
1251
  /// is not checked with respect to node filter. Otherwise, each edge
1252
  /// is automatically filtered, which is incident to a filtered node.
1253
  ///
1254
  /// \see FilterNodes
1255
  /// \see FilterEdges
1256
  template<typename _Graph, typename NodeFilterMap,
1257
           typename EdgeFilterMap, bool _checked = true>
1258
  class SubGraph
1259
    : public GraphAdaptorExtender<
1260
      SubGraphBase<_Graph, NodeFilterMap, EdgeFilterMap, _checked> > {
730 1261
  public:
731

	
732
    typedef _Digraph Digraph;
733
    typedef _NodeFilterMap NodeFilterMap;
734

	
735
    typedef SubDigraphAdaptor<Digraph, NodeFilterMap, 
736
			      ConstMap<typename Digraph::Arc, bool>, checked> 
737
    Parent;
1262
    typedef _Graph Graph;
1263
    typedef GraphAdaptorExtender<
1264
      SubGraphBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
738 1265

	
739 1266
    typedef typename Parent::Node Node;
1267
    typedef typename Parent::Edge Edge;
740 1268

	
741 1269
  protected:
742
    ConstMap<typename Digraph::Arc, bool> const_true_map;
743

	
744
    NodeSubDigraphAdaptor() : const_true_map(true) {
745
      Parent::setArcFilterMap(const_true_map);
746
    }
747

	
1270
    SubGraph() { }
748 1271
  public:
... ...
@@ -751,9 +1274,9 @@
751 1274
    ///
752
    /// Creates a node-sub-digraph-adaptor for the given digraph with
753
    /// given node map filter.
754
    NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : 
755
      Parent(), const_true_map(true) { 
756
      Parent::setDigraph(_digraph);
757
      Parent::setNodeFilterMap(node_filter);
758
      Parent::setArcFilterMap(const_true_map);
1275
    /// Creates a subgraph for the given graph with given node and
1276
    /// edge map filters.
1277
    SubGraph(Graph& _graph, NodeFilterMap& node_filter_map,
1278
             EdgeFilterMap& edge_filter_map) {
1279
      setGraph(_graph);
1280
      setNodeFilterMap(node_filter_map);
1281
      setEdgeFilterMap(edge_filter_map);
759 1282
    }
... ...
@@ -762,4 +1285,4 @@
762 1285
    ///
763
    /// This function hides \c n in the digraph, i.e. the iteration 
764
    /// jumps over it. This is done by simply setting the value of \c n  
1286
    /// This function hides \c n in the graph, i.e. the iteration
1287
    /// jumps over it. This is done by simply setting the value of \c n
765 1288
    /// to be false in the corresponding node-map.
... ...
@@ -767,6 +1290,13 @@
767 1290

	
1291
    /// \brief Hides the edge of the graph
1292
    ///
1293
    /// This function hides \c e in the graph, i.e. the iteration
1294
    /// jumps over it. This is done by simply setting the value of \c e
1295
    /// to be false in the corresponding edge-map.
1296
    void hide(const Edge& e) const { Parent::hide(e); }
1297

	
768 1298
    /// \brief Unhides the node of the graph
769 1299
    ///
770
    /// The value of \c n is set to be true in the node-map which stores 
771
    /// hide information. If \c n was hidden previuosly, then it is shown 
1300
    /// The value of \c n is set to be true in the node-map which stores
1301
    /// hide information. If \c n was hidden previuosly, then it is shown
772 1302
    /// again
... ...
@@ -774,2 +1304,9 @@
774 1304

	
1305
    /// \brief Unhides the edge of the graph
1306
    ///
1307
    /// The value of \c e is set to be true in the edge-map which stores
1308
    /// hide information. If \c e was hidden previuosly, then it is shown
1309
    /// again
1310
    void unHide(const Edge& e) const { Parent::unHide(e); }
1311

	
775 1312
    /// \brief Returns true if \c n is hidden.
... ...
@@ -780,12 +1317,172 @@
780 1317

	
1318
    /// \brief Returns true if \c e is hidden.
1319
    ///
1320
    /// Returns true if \c e is hidden.
1321
    ///
1322
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
781 1323
  };
782 1324

	
783

	
784
  /// \brief Just gives back a  node-sub-digraph adaptor
1325
  /// \brief Just gives back a subgraph
785 1326
  ///
786
  /// Just gives back a node-sub-digraph adaptor
1327
  /// Just gives back a subgraph
1328
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1329
  SubGraph<const Graph, NodeFilterMap, ArcFilterMap>
1330
  subGraph(const Graph& graph, NodeFilterMap& nfm, ArcFilterMap& efm) {
1331
    return SubGraph<const Graph, NodeFilterMap, ArcFilterMap>(graph, nfm, efm);
1332
  }
1333

	
1334
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1335
  SubGraph<const Graph, const NodeFilterMap, ArcFilterMap>
1336
  subGraph(const Graph& graph,
1337
           const NodeFilterMap& nfm, ArcFilterMap& efm) {
1338
    return SubGraph<const Graph, const NodeFilterMap, ArcFilterMap>
1339
      (graph, nfm, efm);
1340
  }
1341

	
1342
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1343
  SubGraph<const Graph, NodeFilterMap, const ArcFilterMap>
1344
  subGraph(const Graph& graph,
1345
           NodeFilterMap& nfm, const ArcFilterMap& efm) {
1346
    return SubGraph<const Graph, NodeFilterMap, const ArcFilterMap>
1347
      (graph, nfm, efm);
1348
  }
1349

	
1350
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
1351
  SubGraph<const Graph, const NodeFilterMap, const ArcFilterMap>
1352
  subGraph(const Graph& graph,
1353
           const NodeFilterMap& nfm, const ArcFilterMap& efm) {
1354
    return SubGraph<const Graph, const NodeFilterMap, const ArcFilterMap>
1355
      (graph, nfm, efm);
1356
  }
1357

	
1358
  /// \ingroup graph_adaptors
1359
  ///
1360
  /// \brief An adaptor for hiding nodes from a digraph or a graph.
1361
  ///
1362
  /// FilterNodes adaptor hides nodes in a graph or a digraph. A bool
1363
  /// node map must be specified, which defines the filters for
1364
  /// nodes. Just the unfiltered nodes and the arcs or edges incident
1365
  /// to unfiltered nodes are shown in the subdigraph or subgraph. The
1366
  /// FilterNodes is conform to the \ref concepts::Digraph
1367
  /// "Digraph concept" or \ref concepts::Graph "Graph concept" depending
1368
  /// on the \c _Digraph template parameter. If the \c _checked
1369
  /// parameter is true, then the arc or edges incident to filtered nodes
1370
  /// are also filtered out.
1371
  ///
1372
  /// \tparam _Digraph It must be conform to the \ref
1373
  /// concepts::Digraph "Digraph concept" or \ref concepts::Graph
1374
  /// "Graph concept". The type can be specified to be const.
1375
  /// \tparam _NodeFilterMap A bool valued node map of the the adapted graph.
1376
  /// \tparam _checked If the parameter is false then the arc or edge
1377
  /// filtering is not checked with respect to node filter. In this
1378
  /// case just isolated nodes can be filtered out from the
1379
  /// graph.
1380
#ifdef DOXYGEN
1381
  template<typename _Digraph,
1382
           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
1383
           bool _checked = true>
1384
#else
1385
  template<typename _Digraph,
1386
           typename _NodeFilterMap = typename _Digraph::template NodeMap<bool>,
1387
           bool _checked = true,
1388
           typename Enable = void>
1389
#endif
1390
  class FilterNodes
1391
    : public SubDigraph<_Digraph, _NodeFilterMap,
1392
                        ConstMap<typename _Digraph::Arc, bool>, _checked> {
1393
  public:
1394

	
1395
    typedef _Digraph Digraph;
1396
    typedef _NodeFilterMap NodeFilterMap;
1397

	
1398
    typedef SubDigraph<Digraph, NodeFilterMap,
1399
                       ConstMap<typename Digraph::Arc, bool>, _checked>
1400
    Parent;
1401

	
1402
    typedef typename Parent::Node Node;
1403

	
1404
  protected:
1405
    ConstMap<typename Digraph::Arc, bool> const_true_map;
1406

	
1407
    FilterNodes() : const_true_map(true) {
1408
      Parent::setArcFilterMap(const_true_map);
1409
    }
1410

	
1411
  public:
1412

	
1413
    /// \brief Constructor
1414
    ///
1415
    /// Creates an adaptor for the given digraph or graph with
1416
    /// given node filter map.
1417
    FilterNodes(Digraph& _digraph, NodeFilterMap& node_filter) :
1418
      Parent(), const_true_map(true) {
1419
      Parent::setDigraph(_digraph);
1420
      Parent::setNodeFilterMap(node_filter);
1421
      Parent::setArcFilterMap(const_true_map);
1422
    }
1423

	
1424
    /// \brief Hides the node of the graph
1425
    ///
1426
    /// This function hides \c n in the digraph or graph, i.e. the iteration
1427
    /// jumps over it. This is done by simply setting the value of \c n
1428
    /// to be false in the corresponding node map.
1429
    void hide(const Node& n) const { Parent::hide(n); }
1430

	
1431
    /// \brief Unhides the node of the graph
1432
    ///
1433
    /// The value of \c n is set to be true in the node-map which stores
1434
    /// hide information. If \c n was hidden previuosly, then it is shown
1435
    /// again
1436
    void unHide(const Node& n) const { Parent::unHide(n); }
1437

	
1438
    /// \brief Returns true if \c n is hidden.
1439
    ///
1440
    /// Returns true if \c n is hidden.
1441
    ///
1442
    bool hidden(const Node& n) const { return Parent::hidden(n); }
1443

	
1444
  };
1445

	
1446
  template<typename _Graph, typename _NodeFilterMap, bool _checked>
1447
  class FilterNodes<_Graph, _NodeFilterMap, _checked,
1448
                    typename enable_if<UndirectedTagIndicator<_Graph> >::type>
1449
    : public SubGraph<_Graph, _NodeFilterMap,
1450
                      ConstMap<typename _Graph::Edge, bool>, _checked> {
1451
  public:
1452
    typedef _Graph Graph;
1453
    typedef _NodeFilterMap NodeFilterMap;
1454
    typedef SubGraph<Graph, NodeFilterMap,
1455
                     ConstMap<typename Graph::Edge, bool> > Parent;
1456

	
1457
    typedef typename Parent::Node Node;
1458
  protected:
1459
    ConstMap<typename Graph::Edge, bool> const_true_map;
1460

	
1461
    FilterNodes() : const_true_map(true) {
1462
      Parent::setEdgeFilterMap(const_true_map);
1463
    }
1464

	
1465
  public:
1466

	
1467
    FilterNodes(Graph& _graph, NodeFilterMap& node_filter_map) :
1468
      Parent(), const_true_map(true) {
1469
      Parent::setGraph(_graph);
1470
      Parent::setNodeFilterMap(node_filter_map);
1471
      Parent::setEdgeFilterMap(const_true_map);
1472
    }
1473

	
1474
    void hide(const Node& n) const { Parent::hide(n); }
1475
    void unHide(const Node& n) const { Parent::unHide(n); }
1476
    bool hidden(const Node& n) const { return Parent::hidden(n); }
1477

	
1478
  };
1479

	
1480

	
1481
  /// \brief Just gives back a FilterNodes adaptor
1482
  ///
1483
  /// Just gives back a FilterNodes adaptor
787 1484
  template<typename Digraph, typename NodeFilterMap>
788
  NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>
789
  nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) {
790
    return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm);
1485
  FilterNodes<const Digraph, NodeFilterMap>
1486
  filterNodes(const Digraph& digraph, NodeFilterMap& nfm) {
1487
    return FilterNodes<const Digraph, NodeFilterMap>(digraph, nfm);
791 1488
  }
... ...
@@ -793,140 +1490,24 @@
793 1490
  template<typename Digraph, typename NodeFilterMap>
794
  NodeSubDigraphAdaptor<const Digraph, const NodeFilterMap>
795
  nodeSubDigraphAdaptor(const Digraph& digraph, const NodeFilterMap& nfm) {
796
    return NodeSubDigraphAdaptor<const Digraph, const NodeFilterMap>
797
      (digraph, nfm);
1491
  FilterNodes<const Digraph, const NodeFilterMap>
1492
  filterNodes(const Digraph& digraph, const NodeFilterMap& nfm) {
1493
    return FilterNodes<const Digraph, const NodeFilterMap>(digraph, nfm);
798 1494
  }
799 1495

	
800
  ///\ingroup graph_adaptors
1496
  /// \ingroup graph_adaptors
801 1497
  ///
802
  ///\brief An adaptor for hiding arcs from a digraph.
1498
  /// \brief An adaptor for hiding arcs from a digraph.
803 1499
  ///
804
  ///An adaptor for hiding arcs from a digraph. This adaptor
805
  ///specializes SubDigraphAdaptor in the way that only the arc-set
806
  ///can be filtered. The usefulness of this adaptor is demonstrated
807
  ///in the problem of searching a maximum number of arc-disjoint
808
  ///shortest paths between two nodes \c s and \c t. Shortest here
809
  ///means being shortest with respect to non-negative
810
  ///arc-lengths. Note that the comprehension of the presented
811
  ///solution need's some elementary knowledge from combinatorial
812
  ///optimization.
1500
  /// FilterArcs adaptor hides arcs in a digraph. A bool arc map must
1501
  /// be specified, which defines the filters for arcs. Just the
1502
  /// unfiltered arcs are shown in the subdigraph. The FilterArcs is
1503
  /// conform to the \ref concepts::Digraph "Digraph concept".
813 1504
  ///
814
  ///If a single shortest path is to be searched between \c s and \c
815
  ///t, then this can be done easily by applying the Dijkstra
816
  ///algorithm. What happens, if a maximum number of arc-disjoint
817
  ///shortest paths is to be computed. It can be proved that an arc
818
  ///can be in a shortest path if and only if it is tight with respect
819
  ///to the potential function computed by Dijkstra.  Moreover, any
820
  ///path containing only such arcs is a shortest one.  Thus we have
821
  ///to compute a maximum number of arc-disjoint paths between \c s
822
  ///and \c t in the digraph which has arc-set all the tight arcs. The
823
  ///computation will be demonstrated on the following digraph, which
824
  ///is read from the dimacs file \c sub_digraph_adaptor_demo.dim.
825
  ///The full source code is available in \ref
826
  ///sub_digraph_adaptor_demo.cc.  If you are interested in more demo
827
  ///programs, you can use \ref dim_to_dot.cc to generate .dot files
828
  ///from dimacs files.  The .dot file of the following figure was
829
  ///generated by the demo program \ref dim_to_dot.cc.
830
  ///
831
  ///\dot
832
  ///digraph lemon_dot_example {
833
  ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
834
  ///n0 [ label="0 (s)" ];
835
  ///n1 [ label="1" ];
836
  ///n2 [ label="2" ];
837
  ///n3 [ label="3" ];
838
  ///n4 [ label="4" ];
839
  ///n5 [ label="5" ];
840
  ///n6 [ label="6 (t)" ];
841
  ///arc [ shape=ellipse, fontname=Helvetica, fontsize=10 ];
842
  ///n5 ->  n6 [ label="9, length:4" ];
843
  ///n4 ->  n6 [ label="8, length:2" ];
844
  ///n3 ->  n5 [ label="7, length:1" ];
845
  ///n2 ->  n5 [ label="6, length:3" ];
846
  ///n2 ->  n6 [ label="5, length:5" ];
847
  ///n2 ->  n4 [ label="4, length:2" ];
848
  ///n1 ->  n4 [ label="3, length:3" ];
849
  ///n0 ->  n3 [ label="2, length:1" ];
850
  ///n0 ->  n2 [ label="1, length:2" ];
851
  ///n0 ->  n1 [ label="0, length:3" ];
852
  ///}
853
  ///\enddot
854
  ///
855
  ///\code
856
  ///Digraph g;
857
  ///Node s, t;
858
  ///LengthMap length(g);
859
  ///
860
  ///readDimacs(std::cin, g, length, s, t);
861
  ///
862
  ///cout << "arcs with lengths (of form id, source--length->target): " << endl;
863
  ///for(ArcIt e(g); e!=INVALID; ++e) 
864
  ///  cout << g.id(e) << ", " << g.id(g.source(e)) << "--" 
865
  ///       << length[e] << "->" << g.id(g.target(e)) << endl;
866
  ///
867
  ///cout << "s: " << g.id(s) << " t: " << g.id(t) << endl;
868
  ///\endcode
869
  ///Next, the potential function is computed with Dijkstra.
870
  ///\code
871
  ///typedef Dijkstra<Digraph, LengthMap> Dijkstra;
872
  ///Dijkstra dijkstra(g, length);
873
  ///dijkstra.run(s);
874
  ///\endcode
875
  ///Next, we consrtruct a map which filters the arc-set to the tight arcs.
876
  ///\code
877
  ///typedef TightArcFilterMap<Digraph, const Dijkstra::DistMap, LengthMap> 
878
  ///  TightArcFilter;
879
  ///TightArcFilter tight_arc_filter(g, dijkstra.distMap(), length);
880
  ///
881
  ///typedef ArcSubDigraphAdaptor<Digraph, TightArcFilter> SubGA;
882
  ///SubGA ga(g, tight_arc_filter);
883
  ///\endcode
884
  ///Then, the maximum nimber of arc-disjoint \c s-\c t paths are computed 
885
  ///with a max flow algorithm Preflow.
886
  ///\code
887
  ///ConstMap<Arc, int> const_1_map(1);
888
  ///Digraph::ArcMap<int> flow(g, 0);
889
  ///
890
  ///Preflow<SubGA, ConstMap<Arc, int>, Digraph::ArcMap<int> > 
891
  ///  preflow(ga, const_1_map, s, t);
892
  ///preflow.run();
893
  ///\endcode
894
  ///Last, the output is:
895
  ///\code  
896
  ///cout << "maximum number of arc-disjoint shortest path: " 
897
  ///     << preflow.flowValue() << endl;
898
  ///cout << "arcs of the maximum number of arc-disjoint shortest s-t paths: " 
899
  ///     << endl;
900
  ///for(ArcIt e(g); e!=INVALID; ++e) 
901
  ///  if (preflow.flow(e))
902
  ///    cout << " " << g.id(g.source(e)) << "--"
903
  ///         << length[e] << "->" << g.id(g.target(e)) << endl;
904
  ///\endcode
905
  ///The program has the following (expected :-)) output:
906
  ///\code
907
  ///arcs with lengths (of form id, source--length->target):
908
  /// 9, 5--4->6
909
  /// 8, 4--2->6
910
  /// 7, 3--1->5
911
  /// 6, 2--3->5
912
  /// 5, 2--5->6
913
  /// 4, 2--2->4
914
  /// 3, 1--3->4
915
  /// 2, 0--1->3
916
  /// 1, 0--2->2
917
  /// 0, 0--3->1
918
  ///s: 0 t: 6
919
  ///maximum number of arc-disjoint shortest path: 2
920
  ///arcs of the maximum number of arc-disjoint shortest s-t paths:
921
  /// 9, 5--4->6
922
  /// 8, 4--2->6
923
  /// 7, 3--1->5
924
  /// 4, 2--2->4
925
  /// 2, 0--1->3
926
  /// 1, 0--2->2
927
  ///\endcode
1505
  /// \tparam _Digraph It must be conform to the \ref concepts::Digraph
1506
  /// "Digraph concept". The type can be specified to be const.
1507
  /// \tparam _ArcFilterMap A bool valued arc map of the the adapted
1508
  /// graph.
928 1509
  template<typename _Digraph, typename _ArcFilterMap>
929
  class ArcSubDigraphAdaptor : 
930
    public SubDigraphAdaptor<_Digraph, ConstMap<typename _Digraph::Node, bool>, 
931
			     _ArcFilterMap, false> {
1510
  class FilterArcs :
1511
    public SubDigraph<_Digraph, ConstMap<typename _Digraph::Node, bool>,
1512
                      _ArcFilterMap, false> {
932 1513
  public:
... ...
@@ -935,4 +1516,4 @@
935 1516

	
936
    typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, 
937
			      ArcFilterMap, false> Parent;
1517
    typedef SubDigraph<Digraph, ConstMap<typename Digraph::Node, bool>,
1518
                       ArcFilterMap, false> Parent;
938 1519

	
... ...
@@ -943,3 +1524,3 @@
943 1524

	
944
    ArcSubDigraphAdaptor() : const_true_map(true) {
1525
    FilterArcs() : const_true_map(true) {
945 1526
      Parent::setNodeFilterMap(const_true_map);
... ...
@@ -951,6 +1532,6 @@
951 1532
    ///
952
    /// Creates a arc-sub-digraph-adaptor for the given digraph with
1533
    /// Creates a FilterArcs adaptor for the given graph with
953 1534
    /// given arc map filter.
954
    ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) 
955
      : Parent(), const_true_map(true) { 
1535
    FilterArcs(Digraph& digraph, ArcFilterMap& arc_filter)
1536
      : Parent(), const_true_map(true) {
956 1537
      Parent::setDigraph(digraph);
... ...
@@ -962,5 +1543,5 @@
962 1543
    ///
963
    /// This function hides \c a in the digraph, i.e. the iteration 
1544
    /// This function hides \c a in the graph, i.e. the iteration
964 1545
    /// jumps over it. This is done by simply setting the value of \c a
965
    /// to be false in the corresponding arc-map.
1546
    /// to be false in the corresponding arc map.
966 1547
    void hide(const Arc& a) const { Parent::hide(a); }
... ...
@@ -969,4 +1550,4 @@
969 1550
    ///
970
    /// The value of \c a is set to be true in the arc-map which stores 
971
    /// hide information. If \c a was hidden previuosly, then it is shown 
1551
    /// The value of \c a is set to be true in the arc-map which stores
1552
    /// hide information. If \c a was hidden previuosly, then it is shown
972 1553
    /// again
... ...
@@ -982,9 +1563,9 @@
982 1563

	
983
  /// \brief Just gives back an arc-sub-digraph adaptor
1564
  /// \brief Just gives back an FilterArcs adaptor
984 1565
  ///
985
  /// Just gives back an arc-sub-digraph adaptor
1566
  /// Just gives back an FilterArcs adaptor
986 1567
  template<typename Digraph, typename ArcFilterMap>
987
  ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>
988
  arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) {
989
    return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm);
1568
  FilterArcs<const Digraph, ArcFilterMap>
1569
  filterArcs(const Digraph& digraph, ArcFilterMap& afm) {
1570
    return FilterArcs<const Digraph, ArcFilterMap>(digraph, afm);
990 1571
  }
... ...
@@ -992,13 +1573,92 @@
992 1573
  template<typename Digraph, typename ArcFilterMap>
993
  ArcSubDigraphAdaptor<const Digraph, const ArcFilterMap>
994
  arcSubDigraphAdaptor(const Digraph& digraph, const ArcFilterMap& afm) {
995
    return ArcSubDigraphAdaptor<const Digraph, const ArcFilterMap>
996
      (digraph, afm);
1574
  FilterArcs<const Digraph, const ArcFilterMap>
1575
  filterArcs(const Digraph& digraph, const ArcFilterMap& afm) {
1576
    return FilterArcs<const Digraph, const ArcFilterMap>(digraph, afm);
997 1577
  }
998 1578

	
1579
  /// \ingroup graph_adaptors
1580
  ///
1581
  /// \brief An adaptor for hiding edges from a graph.
1582
  ///
1583
  /// FilterEdges adaptor hides edges in a digraph. A bool edge map must
1584
  /// be specified, which defines the filters for edges. Just the
1585
  /// unfiltered edges are shown in the subdigraph. The FilterEdges is
1586
  /// conform to the \ref concepts::Graph "Graph concept".
1587
  ///
1588
  /// \tparam _Graph It must be conform to the \ref concepts::Graph
1589
  /// "Graph concept". The type can be specified to be const.
1590
  /// \tparam _EdgeFilterMap A bool valued edge map of the the adapted
1591
  /// graph.
1592
  template<typename _Graph, typename _EdgeFilterMap>
1593
  class FilterEdges :
1594
    public SubGraph<_Graph, ConstMap<typename _Graph::Node,bool>,
1595
                    _EdgeFilterMap, false> {
1596
  public:
1597
    typedef _Graph Graph;
1598
    typedef _EdgeFilterMap EdgeFilterMap;
1599
    typedef SubGraph<Graph, ConstMap<typename Graph::Node,bool>,
1600
                     EdgeFilterMap, false> Parent;
1601
    typedef typename Parent::Edge Edge;
1602
  protected:
1603
    ConstMap<typename Graph::Node, bool> const_true_map;
1604

	
1605
    FilterEdges() : const_true_map(true) {
1606
      Parent::setNodeFilterMap(const_true_map);
1607
    }
1608

	
1609
  public:
1610

	
1611
    /// \brief Constructor
1612
    ///
1613
    /// Creates a FilterEdges adaptor for the given graph with
1614
    /// given edge map filters.
1615
    FilterEdges(Graph& _graph, EdgeFilterMap& edge_filter_map) :
1616
      Parent(), const_true_map(true) {
1617
      Parent::setGraph(_graph);
1618
      Parent::setNodeFilterMap(const_true_map);
1619
      Parent::setEdgeFilterMap(edge_filter_map);
1620
    }
1621

	
1622
    /// \brief Hides the edge of the graph
1623
    ///
1624
    /// This function hides \c e in the graph, i.e. the iteration
1625
    /// jumps over it. This is done by simply setting the value of \c e
1626
    /// to be false in the corresponding edge-map.
1627
    void hide(const Edge& e) const { Parent::hide(e); }
1628

	
1629
    /// \brief Unhides the edge of the graph
1630
    ///
1631
    /// The value of \c e is set to be true in the edge-map which stores
1632
    /// hide information. If \c e was hidden previuosly, then it is shown
1633
    /// again
1634
    void unHide(const Edge& e) const { Parent::unHide(e); }
1635

	
1636
    /// \brief Returns true if \c e is hidden.
1637
    ///
1638
    /// Returns true if \c e is hidden.
1639
    ///
1640
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
1641

	
1642
  };
1643

	
1644
  /// \brief Just gives back a FilterEdges adaptor
1645
  ///
1646
  /// Just gives back a FilterEdges adaptor
1647
  template<typename Graph, typename EdgeFilterMap>
1648
  FilterEdges<const Graph, EdgeFilterMap>
1649
  filterEdges(const Graph& graph, EdgeFilterMap& efm) {
1650
    return FilterEdges<const Graph, EdgeFilterMap>(graph, efm);
1651
  }
1652

	
1653
  template<typename Graph, typename EdgeFilterMap>
1654
  FilterEdges<const Graph, const EdgeFilterMap>
1655
  filterEdges(const Graph& graph, const EdgeFilterMap& efm) {
1656
    return FilterEdges<const Graph, const EdgeFilterMap>(graph, efm);
1657
  }
1658

	
999 1659
  template <typename _Digraph>
1000
  class UndirDigraphAdaptorBase { 
1660
  class UndirectorBase {
1001 1661
  public:
1002 1662
    typedef _Digraph Digraph;
1003
    typedef UndirDigraphAdaptorBase Adaptor;
1663
    typedef UndirectorBase Adaptor;
1004 1664

	
... ...
@@ -1010,3 +1670,3 @@
1010 1670
    class Arc : public Edge {
1011
      friend class UndirDigraphAdaptorBase;
1671
      friend class UndirectorBase;
1012 1672
    protected:
... ...
@@ -1023,13 +1683,13 @@
1023 1683
      bool operator==(const Arc &other) const {
1024
	return _forward == other._forward && 
1025
	  static_cast<const Edge&>(*this) == static_cast<const Edge&>(other);
1684
        return _forward == other._forward &&
1685
          static_cast<const Edge&>(*this) == static_cast<const Edge&>(other);
1026 1686
      }
1027 1687
      bool operator!=(const Arc &other) const {
1028
	return _forward != other._forward || 
1029
	  static_cast<const Edge&>(*this) != static_cast<const Edge&>(other);
1688
        return _forward != other._forward ||
1689
          static_cast<const Edge&>(*this) != static_cast<const Edge&>(other);
1030 1690
      }
1031 1691
      bool operator<(const Arc &other) const {
1032
	return _forward < other._forward ||
1033
	  (_forward == other._forward &&
1034
	   static_cast<const Edge&>(*this) < static_cast<const Edge&>(other));
1692
        return _forward < other._forward ||
1693
          (_forward == other._forward &&
1694
           static_cast<const Edge&>(*this) < static_cast<const Edge&>(other));
1035 1695
      }
... ...
@@ -1054,6 +1714,6 @@
1054 1714
      if (a._forward) {
1055
	a._forward = false;
1715
        a._forward = false;
1056 1716
      } else {
1057
	_digraph->next(a);
1058
	a._forward = true;
1717
        _digraph->next(a);
1718
        a._forward = true;
1059 1719
      }
... ...
@@ -1072,6 +1732,6 @@
1072 1732
      if( static_cast<const Edge&>(a) != INVALID ) {
1073
	a._forward = false;
1733
        a._forward = false;
1074 1734
      } else {
1075
	_digraph->firstOut(a, n);
1076
	a._forward = true;
1735
        _digraph->firstOut(a, n);
1736
        a._forward = true;
1077 1737
      }
... ...
@@ -1080,11 +1740,11 @@
1080 1740
      if (!a._forward) {
1081
	Node n = _digraph->target(a);
1082
	_digraph->nextIn(a);
1083
	if (static_cast<const Edge&>(a) == INVALID ) {
1084
	  _digraph->firstOut(a, n);
1085
	  a._forward = true;
1086
	}
1741
        Node n = _digraph->target(a);
1742
        _digraph->nextIn(a);
1743
        if (static_cast<const Edge&>(a) == INVALID ) {
1744
          _digraph->firstOut(a, n);
1745
          a._forward = true;
1746
        }
1087 1747
      }
1088 1748
      else {
1089
	_digraph->nextOut(a);
1749
        _digraph->nextOut(a);
1090 1750
      }
... ...
@@ -1095,6 +1755,6 @@
1095 1755
      if (static_cast<const Edge&>(a) != INVALID ) {
1096
	a._forward = false;
1756
        a._forward = false;
1097 1757
      } else {
1098
	_digraph->firstIn(a, n);
1099
	a._forward = true;
1758
        _digraph->firstIn(a, n);
1759
        a._forward = true;
1100 1760
      }
... ...
@@ -1103,11 +1763,11 @@
1103 1763
      if (!a._forward) {
1104
	Node n = _digraph->source(a);
1105
	_digraph->nextOut(a);
1106
	if( static_cast<const Edge&>(a) == INVALID ) {
1107
	  _digraph->firstIn(a, n);
1108
	  a._forward = true;
1109
	}
1764
        Node n = _digraph->source(a);
1765
        _digraph->nextOut(a);
1766
        if( static_cast<const Edge&>(a) == INVALID ) {
1767
          _digraph->firstIn(a, n);
1768
          a._forward = true;
1769
        }
1110 1770
      }
1111 1771
      else {
1112
	_digraph->nextIn(a);
1772
        _digraph->nextIn(a);
1113 1773
      }
... ...
@@ -1125,9 +1785,9 @@
1125 1785
      if (d) {
1126
	Node s = _digraph->source(e);
1127
	_digraph->nextOut(e);
1128
	if (e != INVALID) return;
1129
	d = false;
1130
	_digraph->firstIn(e, s);
1786
        Node s = _digraph->source(e);
1787
        _digraph->nextOut(e);
1788
        if (e != INVALID) return;
1789
        d = false;
1790
        _digraph->firstIn(e, s);
1131 1791
      } else {
1132
	_digraph->nextIn(e);
1792
        _digraph->nextIn(e);
1133 1793
      }
... ...
@@ -1177,4 +1837,4 @@
1177 1837
    Node addNode() { return _digraph->addNode(); }
1178
    Edge addEdge(const Node& u, const Node& v) { 
1179
      return _digraph->addArc(u, v); 
1838
    Edge addEdge(const Node& u, const Node& v) {
1839
      return _digraph->addArc(u, v);
1180 1840
    }
... ...
@@ -1183,3 +1843,3 @@
1183 1843
    void erase(const Edge& i) { _digraph->erase(i); }
1184
  
1844

	
1185 1845
    void clear() { _digraph->clear(); }
... ...
@@ -1195,14 +1855,14 @@
1195 1855
      if (p == INVALID) {
1196
	Edge arc = _digraph->findArc(s, t);
1197
	if (arc != INVALID) return direct(arc, true);
1198
	arc = _digraph->findArc(t, s);
1199
	if (arc != INVALID) return direct(arc, false);
1856
        Edge arc = _digraph->findArc(s, t);
1857
        if (arc != INVALID) return direct(arc, true);
1858
        arc = _digraph->findArc(t, s);
1859
        if (arc != INVALID) return direct(arc, false);
1200 1860
      } else if (direction(p)) {
1201
	Edge arc = _digraph->findArc(s, t, p);
1202
	if (arc != INVALID) return direct(arc, true);
1203
	arc = _digraph->findArc(t, s);
1204
	if (arc != INVALID) return direct(arc, false);	
1861
        Edge arc = _digraph->findArc(s, t, p);
1862
        if (arc != INVALID) return direct(arc, true);
1863
        arc = _digraph->findArc(t, s);
1864
        if (arc != INVALID) return direct(arc, false);
1205 1865
      } else {
1206
	Edge arc = _digraph->findArc(t, s, p);
1207
	if (arc != INVALID) return direct(arc, false);	      
1866
        Edge arc = _digraph->findArc(t, s, p);
1867
        if (arc != INVALID) return direct(arc, false);
1208 1868
      }
... ...
@@ -1222,6 +1882,6 @@
1222 1882
          arc = _digraph->findArc(t, s);
1223
          if (arc != INVALID) return arc;	
1883
          if (arc != INVALID) return arc;
1224 1884
        } else {
1225 1885
          Edge arc = _digraph->findArc(t, s, p);
1226
          if (arc != INVALID) return arc;	      
1886
          if (arc != INVALID) return arc;
1227 1887
        }
... ...
@@ -1234,3 +1894,3 @@
1234 1894
  private:
1235
    
1895

	
1236 1896
    template <typename _Value>
... ...
@@ -1238,5 +1898,5 @@
1238 1898
    private:
1239
      
1899

	
1240 1900
      typedef typename Digraph::template ArcMap<_Value> MapImpl;
1241
      
1901

	
1242 1902
    public:
... ...
@@ -1247,23 +1907,14 @@
1247 1907
      typedef Arc Key;
1248
      
1908

	
1249 1909
      ArcMapBase(const Adaptor& adaptor) :
1250
	_forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
1251

	
1252
      ArcMapBase(const Adaptor& adaptor, const Value& v) 
1910
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
1911

	
1912
      ArcMapBase(const Adaptor& adaptor, const Value& v)
1253 1913
        : _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {}
1254
      
1255
      void set(const Arc& a, const Value& v) { 
1256
	if (direction(a)) {
1257
	  _forward.set(a, v); 
1258
        } else { 
1259
	  _backward.set(a, v);
1260
        } 
1261
      }
1262

	
1263
      typename MapTraits<MapImpl>::ConstReturnValue 
1264
      operator[](const Arc& a) const { 
1265
	if (direction(a)) {
1266
	  return _forward[a]; 
1267
	} else { 
1268
	  return _backward[a]; 
1914

	
1915
      void set(const Arc& a, const Value& v) {
1916
        if (direction(a)) {
1917
          _forward.set(a, v);
1918
        } else {
1919
          _backward.set(a, v);
1269 1920
        }
... ...
@@ -1271,8 +1922,8 @@
1271 1922

	
1272
      typename MapTraits<MapImpl>::ReturnValue 
1273
      operator[](const Arc& a) { 
1274
	if (direction(a)) {
1275
	  return _forward[a]; 
1276
	} else { 
1277
	  return _backward[a]; 
1923
      typename MapTraits<MapImpl>::ConstReturnValue
1924
      operator[](const Arc& a) const {
1925
        if (direction(a)) {
1926
          return _forward[a];
1927
        } else {
1928
          return _backward[a];
1278 1929
        }
... ...
@@ -1280,5 +1931,14 @@
1280 1931

	
1932
      typename MapTraits<MapImpl>::ReturnValue
1933
      operator[](const Arc& a) {
1934
        if (direction(a)) {
1935
          return _forward[a];
1936
        } else {
1937
          return _backward[a];
1938
        }
1939
      }
1940

	
1281 1941
    protected:
1282 1942

	
1283
      MapImpl _forward, _backward; 
1943
      MapImpl _forward, _backward;
1284 1944

	
... ...
@@ -1295,7 +1955,7 @@
1295 1955

	
1296
      explicit NodeMap(const Adaptor& adaptor) 
1297
	: Parent(*adaptor._digraph) {}
1956
      explicit NodeMap(const Adaptor& adaptor)
1957
        : Parent(*adaptor._digraph) {}
1298 1958

	
1299 1959
      NodeMap(const Adaptor& adaptor, const _Value& value)
1300
	: Parent(*adaptor._digraph, value) { }
1960
        : Parent(*adaptor._digraph, value) { }
1301 1961

	
... ...
@@ -1311,3 +1971,3 @@
1311 1971
      }
1312
      
1972

	
1313 1973
    };
... ...
@@ -1315,4 +1975,4 @@
1315 1975
    template <typename _Value>
1316
    class ArcMap 
1317
      : public SubMapExtender<Adaptor, ArcMapBase<_Value> > 
1976
    class ArcMap
1977
      : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
1318 1978
    {
... ...
@@ -1321,14 +1981,14 @@
1321 1981
      typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
1322
    
1323
      ArcMap(const Adaptor& adaptor) 
1324
	: Parent(adaptor) {}
1325

	
1326
      ArcMap(const Adaptor& adaptor, const Value& value) 
1327
	: Parent(adaptor, value) {}
1328
    
1982

	
1983
      ArcMap(const Adaptor& adaptor)
1984
        : Parent(adaptor) {}
1985

	
1986
      ArcMap(const Adaptor& adaptor, const Value& value)
1987
        : Parent(adaptor, value) {}
1988

	
1329 1989
    private:
1330 1990
      ArcMap& operator=(const ArcMap& cmap) {
1331
	return operator=<ArcMap>(cmap);
1991
        return operator=<ArcMap>(cmap);
1332 1992
      }
1333
    
1993

	
1334 1994
      template <typename CMap>
... ...
@@ -1336,6 +1996,6 @@
1336 1996
        Parent::operator=(cmap);
1337
	return *this;
1997
        return *this;
1338 1998
      }
1339 1999
    };
1340
        
2000

	
1341 2001
    template <typename _Value>
... ...
@@ -1343,11 +2003,11 @@
1343 2003
    public:
1344
      
2004

	
1345 2005
      typedef _Value Value;
1346 2006
      typedef typename Digraph::template ArcMap<Value> Parent;
1347
      
1348
      explicit EdgeMap(const Adaptor& adaptor) 
1349
	: Parent(*adaptor._digraph) {}
2007

	
2008
      explicit EdgeMap(const Adaptor& adaptor)
2009
        : Parent(*adaptor._digraph) {}
1350 2010

	
1351 2011
      EdgeMap(const Adaptor& adaptor, const Value& value)
1352
	: Parent(*adaptor._digraph, value) {}
2012
        : Parent(*adaptor._digraph, value) {}
1353 2013

	
... ...
@@ -1367,3 +2027,3 @@
1367 2027
    typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
1368
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); } 
2028
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
1369 2029

	
... ...
@@ -1371,3 +2031,3 @@
1371 2031

	
1372
    UndirDigraphAdaptorBase() : _digraph(0) {}
2032
    UndirectorBase() : _digraph(0) {}
1373 2033

	
... ...
@@ -1378,57 +2038,25 @@
1378 2038
    }
1379
    
2039

	
1380 2040
  };
1381 2041

	
1382
  ///\ingroup graph_adaptors
2042
  /// \ingroup graph_adaptors
1383 2043
  ///
1384
  /// \brief A graph is made from a directed digraph by an adaptor
2044
  /// \brief Undirect the graph
1385 2045
  ///
1386 2046
  /// This adaptor makes an undirected graph from a directed
1387
  /// graph. All arc of the underlying digraph will be showed in the
1388
  /// adaptor as an edge. Let's see an informal example about using
1389
  /// this adaptor.
2047
  /// graph. All arcs of the underlying digraph will be showed in the
2048
  /// adaptor as an edge. The Orienter adaptor is conform to the \ref
2049
  /// concepts::Graph "Graph concept".
1390 2050
  ///
1391
  /// There is a network of the streets of a town. Of course there are
1392
  /// some one-way street in the town hence the network is a directed
1393
  /// one. There is a crazy driver who go oppositely in the one-way
1394
  /// street without moral sense. Of course he can pass this streets
1395
  /// slower than the regular way, in fact his speed is half of the
1396
  /// normal speed. How long should he drive to get from a source
1397
  /// point to the target? Let see the example code which calculate it:
1398
  ///
1399
  /// \todo BadCode, SimpleMap does no exists
1400
  ///\code
1401
  /// typedef UndirDigraphAdaptor<Digraph> Graph;
1402
  /// Graph graph(digraph);
1403
  ///
1404
  /// typedef SimpleMap<LengthMap> FLengthMap;
1405
  /// FLengthMap flength(length);
1406
  ///
1407
  /// typedef ScaleMap<LengthMap> RLengthMap;
1408
  /// RLengthMap rlength(length, 2.0);
1409
  ///
1410
  /// typedef Graph::CombinedArcMap<FLengthMap, RLengthMap > ULengthMap;
1411
  /// ULengthMap ulength(flength, rlength);
1412
  /// 
1413
  /// Dijkstra<Graph, ULengthMap> dijkstra(graph, ulength);
1414
  /// std::cout << "Driving time : " << dijkstra.run(src, trg) << std::endl;
1415
  ///\endcode
1416
  ///
1417
  /// The combined arc map makes the length map for the undirected
1418
  /// graph. It is created from a forward and reverse map. The forward
1419
  /// map is created from the original length map with a SimpleMap
1420
  /// adaptor which just makes a read-write map from the reference map
1421
  /// i.e. it forgets that it can be return reference to values. The
1422
  /// reverse map is just the scaled original map with the ScaleMap
1423
  /// adaptor. The combination solves that passing the reverse way
1424
  /// takes double time than the original. To get the driving time we
1425
  /// run the dijkstra algorithm on the graph.
2051
  /// \tparam _Digraph It must be conform to the \ref
2052
  /// concepts::Digraph "Digraph concept". The type can be specified
2053
  /// to const.
1426 2054
  template<typename _Digraph>
1427
  class UndirDigraphAdaptor 
1428
    : public GraphAdaptorExtender<UndirDigraphAdaptorBase<_Digraph> > {
2055
  class Undirector
2056
    : public GraphAdaptorExtender<UndirectorBase<_Digraph> > {
1429 2057
  public:
1430 2058
    typedef _Digraph Digraph;
1431
    typedef GraphAdaptorExtender<UndirDigraphAdaptorBase<Digraph> > Parent;
2059
    typedef GraphAdaptorExtender<UndirectorBase<Digraph> > Parent;
1432 2060
  protected:
1433
    UndirDigraphAdaptor() { }
2061
    Undirector() { }
1434 2062
  public:
... ...
@@ -1437,5 +2065,5 @@
1437 2065
    ///
1438
    /// Constructor
1439
    UndirDigraphAdaptor(_Digraph& _digraph) { 
1440
      setDigraph(_digraph);
2066
    /// Creates a undirected graph from the given digraph
2067
    Undirector(_Digraph& digraph) {
2068
      setDigraph(digraph);
1441 2069
    }
... ...
@@ -1445,3 +2073,3 @@
1445 2073
    /// This class adapts two original digraph ArcMap to
1446
    /// get an arc map on the adaptor.
2074
    /// get an arc map on the undirected graph.
1447 2075
    template <typename _ForwardMap, typename _BackwardMap>
... ...
@@ -1449,3 +2077,3 @@
1449 2077
    public:
1450
      
2078

	
1451 2079
      typedef _ForwardMap ForwardMap;
... ...
@@ -1458,13 +2086,8 @@
1458 2086

	
1459
      /// \brief Constructor      
2087
      /// \brief Constructor
1460 2088
      ///
1461
      /// Constructor      
1462
      CombinedArcMap() : _forward(0), _backward(0) {}
1463

	
1464
      /// \brief Constructor      
1465
      ///
1466
      /// Constructor      
1467
      CombinedArcMap(ForwardMap& forward, BackwardMap& backward) 
2089
      /// Constructor
2090
      CombinedArcMap(ForwardMap& forward, BackwardMap& backward)
1468 2091
        : _forward(&forward), _backward(&backward) {}
1469
      
2092

	
1470 2093

	
... ...
@@ -1473,8 +2096,8 @@
1473 2096
      /// Sets the value associated with a key.
1474
      void set(const Key& e, const Value& a) { 
1475
	if (Parent::direction(e)) {
1476
	  _forward->set(e, a); 
1477
        } else { 
1478
	  _backward->set(e, a);
1479
        } 
2097
      void set(const Key& e, const Value& a) {
2098
        if (Parent::direction(e)) {
2099
          _forward->set(e, a);
2100
        } else {
2101
          _backward->set(e, a);
2102
        }
1480 2103
      }
... ...
@@ -1484,8 +2107,8 @@
1484 2107
      /// Returns the value associated with a key.
1485
      typename MapTraits<ForwardMap>::ConstReturnValue 
1486
      operator[](const Key& e) const { 
1487
	if (Parent::direction(e)) {
1488
	  return (*_forward)[e]; 
1489
	} else { 
1490
	  return (*_backward)[e]; 
2108
      typename MapTraits<ForwardMap>::ConstReturnValue
2109
      operator[](const Key& e) const {
2110
        if (Parent::direction(e)) {
2111
          return (*_forward)[e];
2112
        } else {
2113
          return (*_backward)[e];
1491 2114
        }
... ...
@@ -1496,8 +2119,8 @@
1496 2119
      /// Returns the value associated with a key.
1497
      typename MapTraits<ForwardMap>::ReturnValue 
1498
      operator[](const Key& e) { 
1499
	if (Parent::direction(e)) {
1500
	  return (*_forward)[e]; 
1501
	} else { 
1502
	  return (*_backward)[e]; 
2120
      typename MapTraits<ForwardMap>::ReturnValue
2121
      operator[](const Key& e) {
2122
        if (Parent::direction(e)) {
2123
          return (*_forward)[e];
2124
        } else {
2125
          return (*_backward)[e];
1503 2126
        }
... ...
@@ -1505,20 +2128,174 @@
1505 2128

	
1506
      /// \brief Sets the forward map
1507
      ///
1508
      /// Sets the forward map
1509
      void setForwardMap(ForwardMap& forward) {
1510
        _forward = &forward;
2129
    protected:
2130

	
2131
      ForwardMap* _forward;
2132
      BackwardMap* _backward;
2133

	
2134
    };
2135

	
2136
    /// \brief Just gives back a combined arc map
2137
    ///
2138
    /// Just gives back a combined arc map
2139
    template <typename ForwardMap, typename BackwardMap>
2140
    static CombinedArcMap<ForwardMap, BackwardMap>
2141
    combinedArcMap(ForwardMap& forward, BackwardMap& backward) {
2142
      return CombinedArcMap<ForwardMap, BackwardMap>(forward, backward);
2143
    }
2144

	
2145
    template <typename ForwardMap, typename BackwardMap>
2146
    static CombinedArcMap<const ForwardMap, BackwardMap>
2147
    combinedArcMap(const ForwardMap& forward, BackwardMap& backward) {
2148
      return CombinedArcMap<const ForwardMap,
2149
        BackwardMap>(forward, backward);
2150
    }
2151

	
2152
    template <typename ForwardMap, typename BackwardMap>
2153
    static CombinedArcMap<ForwardMap, const BackwardMap>
2154
    combinedArcMap(ForwardMap& forward, const BackwardMap& backward) {
2155
      return CombinedArcMap<ForwardMap,
2156
        const BackwardMap>(forward, backward);
2157
    }
2158

	
2159
    template <typename ForwardMap, typename BackwardMap>
2160
    static CombinedArcMap<const ForwardMap, const BackwardMap>
2161
    combinedArcMap(const ForwardMap& forward, const BackwardMap& backward) {
2162
      return CombinedArcMap<const ForwardMap,
2163
        const BackwardMap>(forward, backward);
2164
    }
2165

	
2166
  };
2167

	
2168
  /// \brief Just gives back an undirected view of the given digraph
2169
  ///
2170
  /// Just gives back an undirected view of the given digraph
2171
  template<typename Digraph>
2172
  Undirector<const Digraph>
2173
  undirector(const Digraph& digraph) {
2174
    return Undirector<const Digraph>(digraph);
2175
  }
2176

	
2177
  template <typename _Graph, typename _DirectionMap>
2178
  class OrienterBase {
2179
  public:
2180

	
2181
    typedef _Graph Graph;
2182
    typedef _DirectionMap DirectionMap;
2183

	
2184
    typedef typename Graph::Node Node;
2185
    typedef typename Graph::Edge Arc;
2186

	
2187
    void reverseArc(const Arc& arc) {
2188
      _direction->set(arc, !(*_direction)[arc]);
2189
    }
2190

	
2191
    void first(Node& i) const { _graph->first(i); }
2192
    void first(Arc& i) const { _graph->first(i); }
2193
    void firstIn(Arc& i, const Node& n) const {
2194
      bool d;
2195
      _graph->firstInc(i, d, n);
2196
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2197
    }
2198
    void firstOut(Arc& i, const Node& n ) const {
2199
      bool d;
2200
      _graph->firstInc(i, d, n);
2201
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2202
    }
2203

	
2204
    void next(Node& i) const { _graph->next(i); }
2205
    void next(Arc& i) const { _graph->next(i); }
2206
    void nextIn(Arc& i) const {
2207
      bool d = !(*_direction)[i];
2208
      _graph->nextInc(i, d);
2209
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2210
    }
2211
    void nextOut(Arc& i) const {
2212
      bool d = (*_direction)[i];
2213
      _graph->nextInc(i, d);
2214
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2215
    }
2216

	
2217
    Node source(const Arc& e) const {
2218
      return (*_direction)[e] ? _graph->u(e) : _graph->v(e);
2219
    }
2220
    Node target(const Arc& e) const {
2221
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e);
2222
    }
2223

	
2224
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
2225
    int nodeNum() const { return _graph->nodeNum(); }
2226

	
2227
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
2228
    int arcNum() const { return _graph->edgeNum(); }
2229

	
2230
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
2231
    Arc findArc(const Node& u, const Node& v,
2232
                const Arc& prev = INVALID) {
2233
      Arc arc = prev;
2234
      bool d = arc == INVALID ? true : (*_direction)[arc];
2235
      if (d) {
2236
        arc = _graph->findEdge(u, v, arc);
2237
        while (arc != INVALID && !(*_direction)[arc]) {
2238
          _graph->findEdge(u, v, arc);
2239
        }
2240
        if (arc != INVALID) return arc;
1511 2241
      }
1512

	
1513
      /// \brief Sets the backward map
1514
      ///
1515
      /// Sets the backward map
1516
      void setBackwardMap(BackwardMap& backward) {
1517
        _backward = &backward;
2242
      _graph->findEdge(v, u, arc);
2243
      while (arc != INVALID && (*_direction)[arc]) {
2244
        _graph->findEdge(u, v, arc);
1518 2245
      }
1519

	
1520
    protected:
1521

	
1522
      ForwardMap* _forward;
1523
      BackwardMap* _backward; 
2246
      return arc;
2247
    }
2248

	
2249
    Node addNode() {
2250
      return Node(_graph->addNode());
2251
    }
2252

	
2253
    Arc addArc(const Node& u, const Node& v) {
2254
      Arc arc = _graph->addArc(u, v);
2255
      _direction->set(arc, _graph->source(arc) == u);
2256
      return arc;
2257
    }
2258

	
2259
    void erase(const Node& i) { _graph->erase(i); }
2260
    void erase(const Arc& i) { _graph->erase(i); }
2261

	
2262
    void clear() { _graph->clear(); }
2263

	
2264
    int id(const Node& v) const { return _graph->id(v); }
2265
    int id(const Arc& e) const { return _graph->id(e); }
2266

	
2267
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
2268
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
2269

	
2270
    int maxNodeId() const { return _graph->maxNodeId(); }
2271
    int maxArcId() const { return _graph->maxEdgeId(); }
2272

	
2273
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
2274
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
2275

	
2276
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
2277
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
2278

	
2279
    template <typename _Value>
2280
    class NodeMap : public _Graph::template NodeMap<_Value> {
2281
    public:
2282

	
2283
      typedef typename _Graph::template NodeMap<_Value> Parent;
2284

	
2285
      explicit NodeMap(const OrienterBase& adapter)
2286
        : Parent(*adapter._graph) {}
2287

	
2288
      NodeMap(const OrienterBase& adapter, const _Value& value)
2289
        : Parent(*adapter._graph, value) {}
2290

	
2291
    private:
2292
      NodeMap& operator=(const NodeMap& cmap) {
2293
        return operator=<NodeMap>(cmap);
2294
      }
2295

	
2296
      template <typename CMap>
2297
      NodeMap& operator=(const CMap& cmap) {
2298
        Parent::operator=(cmap);
2299
        return *this;
2300
      }
1524 2301

	
... ...
@@ -1526,18 +2303,209 @@
1526 2303

	
2304
    template <typename _Value>
2305
    class ArcMap : public _Graph::template EdgeMap<_Value> {
2306
    public:
2307

	
2308
      typedef typename Graph::template EdgeMap<_Value> Parent;
2309

	
2310
      explicit ArcMap(const OrienterBase& adapter)
2311
        : Parent(*adapter._graph) { }
2312

	
2313
      ArcMap(const OrienterBase& adapter, const _Value& value)
2314
        : Parent(*adapter._graph, value) { }
2315

	
2316
    private:
2317
      ArcMap& operator=(const ArcMap& cmap) {
2318
        return operator=<ArcMap>(cmap);
2319
      }
2320

	
2321
      template <typename CMap>
2322
      ArcMap& operator=(const CMap& cmap) {
2323
        Parent::operator=(cmap);
2324
        return *this;
2325
      }
2326
    };
2327

	
2328

	
2329

	
2330
  protected:
2331
    Graph* _graph;
2332
    DirectionMap* _direction;
2333

	
2334
    void setDirectionMap(DirectionMap& direction) {
2335
      _direction = &direction;
2336
    }
2337

	
2338
    void setGraph(Graph& graph) {
2339
      _graph = &graph;
2340
    }
2341

	
1527 2342
  };
1528 2343

	
1529
  /// \brief Just gives back an undir digraph adaptor
2344
  /// \ingroup graph_adaptors
1530 2345
  ///
1531
  /// Just gives back an undir digraph adaptor
1532
  template<typename Digraph>
1533
  UndirDigraphAdaptor<const Digraph>
1534
  undirDigraphAdaptor(const Digraph& digraph) {
1535
    return UndirDigraphAdaptor<const Digraph>(digraph);
2346
  /// \brief Orients the edges of the graph to get a digraph
2347
  ///
2348
  /// This adaptor orients each edge in the undirected graph. The
2349
  /// direction of the arcs stored in an edge node map.  The arcs can
2350
  /// be easily reverted by the \c reverseArc() member function in the
2351
  /// adaptor. The Orienter adaptor is conform to the \ref
2352
  /// concepts::Digraph "Digraph concept".
2353
  ///
2354
  /// \tparam _Graph It must be conform to the \ref concepts::Graph
2355
  /// "Graph concept". The type can be specified to be const.
2356
  /// \tparam _DirectionMap A bool valued edge map of the the adapted
2357
  /// graph.
2358
  ///
2359
  /// \sa orienter
2360
  template<typename _Graph,
2361
           typename DirectionMap = typename _Graph::template EdgeMap<bool> >
2362
  class Orienter :
2363
    public DigraphAdaptorExtender<OrienterBase<_Graph, DirectionMap> > {
2364
  public:
2365
    typedef _Graph Graph;
2366
    typedef DigraphAdaptorExtender<
2367
      OrienterBase<_Graph, DirectionMap> > Parent;
2368
    typedef typename Parent::Arc Arc;
2369
  protected:
2370
    Orienter() { }
2371
  public:
2372

	
2373
    /// \brief Constructor of the adaptor
2374
    ///
2375
    /// Constructor of the adaptor
2376
    Orienter(Graph& graph, DirectionMap& direction) {
2377
      setGraph(graph);
2378
      setDirectionMap(direction);
2379
    }
2380

	
2381
    /// \brief Reverse arc
2382
    ///
2383
    /// It reverse the given arc. It simply negate the direction in the map.
2384
    void reverseArc(const Arc& a) {
2385
      Parent::reverseArc(a);
2386
    }
2387
  };
2388

	
2389
  /// \brief Just gives back a Orienter
2390
  ///
2391
  /// Just gives back a Orienter
2392
  template<typename Graph, typename DirectionMap>
2393
  Orienter<const Graph, DirectionMap>
2394
  orienter(const Graph& graph, DirectionMap& dm) {
2395
    return Orienter<const Graph, DirectionMap>(graph, dm);
1536 2396
  }
1537 2397

	
1538
  template<typename _Digraph, 
1539
	   typename _CapacityMap = typename _Digraph::template ArcMap<int>, 
1540
	   typename _FlowMap = _CapacityMap, 
2398
  template<typename Graph, typename DirectionMap>
2399
  Orienter<const Graph, const DirectionMap>
2400
  orienter(const Graph& graph, const DirectionMap& dm) {
2401
    return Orienter<const Graph, const DirectionMap>(graph, dm);
2402
  }
2403

	
2404
  namespace _adaptor_bits {
2405

	
2406
    template<typename _Digraph,
2407
             typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2408
             typename _FlowMap = _CapacityMap,
2409
             typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
2410
    class ResForwardFilter {
2411
    public:
2412

	
2413
      typedef _Digraph Digraph;
2414
      typedef _CapacityMap CapacityMap;
2415
      typedef _FlowMap FlowMap;
2416
      typedef _Tolerance Tolerance;
2417

	
2418
      typedef typename Digraph::Arc Key;
2419
      typedef bool Value;
2420

	
2421
    private:
2422

	
2423
      const CapacityMap* _capacity;
2424
      const FlowMap* _flow;
2425
      Tolerance _tolerance;
2426
    public:
2427

	
2428
      ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2429
                       const Tolerance& tolerance = Tolerance())
2430
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2431

	
2432
      bool operator[](const typename Digraph::Arc& a) const {
2433
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2434
      }
2435
    };
2436

	
2437
    template<typename _Digraph,
2438
             typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2439
             typename _FlowMap = _CapacityMap,
2440
             typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
2441
    class ResBackwardFilter {
2442
    public:
2443

	
2444
      typedef _Digraph Digraph;
2445
      typedef _CapacityMap CapacityMap;
2446
      typedef _FlowMap FlowMap;
2447
      typedef _Tolerance Tolerance;
2448

	
2449
      typedef typename Digraph::Arc Key;
2450
      typedef bool Value;
2451

	
2452
    private:
2453

	
2454
      const CapacityMap* _capacity;
2455
      const FlowMap* _flow;
2456
      Tolerance _tolerance;
2457

	
2458
    public:
2459

	
2460
      ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
2461
                        const Tolerance& tolerance = Tolerance())
2462
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2463

	
2464
      bool operator[](const typename Digraph::Arc& a) const {
2465
        return _tolerance.positive((*_flow)[a]);
2466
      }
2467
    };
2468

	
2469
  }
2470

	
2471
  /// \ingroup graph_adaptors
2472
  ///
2473
  /// \brief An adaptor for composing the residual graph for directed
2474
  /// flow and circulation problems.
2475
  ///
2476
  /// An adaptor for composing the residual graph for directed flow and
2477
  /// circulation problems.  Let \f$ G=(V, A) \f$ be a directed graph
2478
  /// and let \f$ F \f$ be a number type. Let moreover \f$ f,c:A\to F \f$,
2479
  /// be functions on the arc-set.
2480
  ///
2481
  /// Then Residual implements the digraph structure with
2482
  /// node-set \f$ V \f$ and arc-set \f$ A_{forward}\cup A_{backward} \f$,
2483
  /// where \f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and
2484
  /// \f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$, i.e. the so
2485
  /// called residual graph.  When we take the union
2486
  /// \f$ A_{forward}\cup A_{backward} \f$, multiplicities are counted,
2487
  /// i.e.  if an arc is in both \f$ A_{forward} \f$ and
2488
  /// \f$ A_{backward} \f$, then in the adaptor it appears in both
2489
  /// orientation.
2490
  ///
2491
  /// \tparam _Digraph It must be conform to the \ref concepts::Digraph
2492
  /// "Digraph concept". The type is implicitly const.
2493
  /// \tparam _CapacityMap An arc map of some numeric type, it defines
2494
  /// the capacities in the flow problem. The map is implicitly const.
2495
  /// \tparam _FlowMap An arc map of some numeric type, it defines
2496
  /// the capacities in the flow problem.
2497
  /// \tparam _Tolerance Handler for inexact computation.
2498
  template<typename _Digraph,
2499
           typename _CapacityMap = typename _Digraph::template ArcMap<int>,
2500
           typename _FlowMap = _CapacityMap,
1541 2501
           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1542
  class ResForwardFilter {
2502
  class Residual :
2503
    public FilterArcs<
2504
    Undirector<const _Digraph>,
2505
    typename Undirector<const _Digraph>::template CombinedArcMap<
2506
      _adaptor_bits::ResForwardFilter<const _Digraph, _CapacityMap,
2507
                                      _FlowMap, _Tolerance>,
2508
      _adaptor_bits::ResBackwardFilter<const _Digraph, _CapacityMap,
2509
                                       _FlowMap, _Tolerance> > >
2510
  {
1543 2511
  public:
... ...
@@ -1549,117 +2517,4 @@
1549 2517

	
1550
    typedef typename Digraph::Arc Key;
1551
    typedef bool Value;
1552

	
1553
  private:
1554

	
1555
    const CapacityMap* _capacity;
1556
    const FlowMap* _flow;
1557
    Tolerance _tolerance;
1558
  public:
1559

	
1560
    ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1561
                     const Tolerance& tolerance = Tolerance()) 
1562
      : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1563

	
1564
    ResForwardFilter(const Tolerance& tolerance = Tolerance()) 
1565
      : _capacity(0), _flow(0), _tolerance(tolerance)  { }
1566

	
1567
    void setCapacity(const CapacityMap& capacity) { _capacity = &capacity; }
1568
    void setFlow(const FlowMap& flow) { _flow = &flow; }
1569

	
1570
    bool operator[](const typename Digraph::Arc& a) const {
1571
      return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
1572
    }
1573
  };
1574

	
1575
  template<typename _Digraph, 
1576
	   typename _CapacityMap = typename _Digraph::template ArcMap<int>, 
1577
	   typename _FlowMap = _CapacityMap, 
1578
           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1579
  class ResBackwardFilter {
1580
  public:
1581

	
1582
    typedef _Digraph Digraph;
1583
    typedef _CapacityMap CapacityMap;
1584
    typedef _FlowMap FlowMap;
1585
    typedef _Tolerance Tolerance;
1586

	
1587
    typedef typename Digraph::Arc Key;
1588
    typedef bool Value;
1589

	
1590
  private:
1591

	
1592
    const CapacityMap* _capacity;
1593
    const FlowMap* _flow;
1594
    Tolerance _tolerance;
1595

	
1596
  public:
1597

	
1598
    ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1599
                      const Tolerance& tolerance = Tolerance())
1600
      : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1601
    ResBackwardFilter(const Tolerance& tolerance = Tolerance())
1602
      : _capacity(0), _flow(0), _tolerance(tolerance) { }
1603

	
1604
    void setCapacity(const CapacityMap& capacity) { _capacity = &capacity; }
1605
    void setFlow(const FlowMap& flow) { _flow = &flow; }
1606

	
1607
    bool operator[](const typename Digraph::Arc& a) const {
1608
      return _tolerance.positive((*_flow)[a]);
1609
    }
1610
  };
1611

	
1612
  
1613
  ///\ingroup graph_adaptors
1614
  ///
1615
  ///\brief An adaptor for composing the residual graph for directed
1616
  ///flow and circulation problems.
1617
  ///
1618
  ///An adaptor for composing the residual graph for directed flow and
1619
  ///circulation problems.  Let \f$ G=(V, A) \f$ be a directed digraph
1620
  ///and let \f$ F \f$ be a number type. Let moreover \f$ f,c:A\to F
1621
  ///\f$, be functions on the arc-set.
1622
  ///
1623
  ///In the appications of ResDigraphAdaptor, \f$ f \f$ usually stands
1624
  ///for a flow and \f$ c \f$ for a capacity function.  Suppose that a
1625
  ///graph instance \c g of type \c ListDigraph implements \f$ G \f$.
1626
  ///
1627
  ///\code 
1628
  ///  ListDigraph g;
1629
  ///\endcode 
1630
  ///
1631
  ///Then ResDigraphAdaptor implements the digraph structure with
1632
  /// node-set \f$ V \f$ and arc-set \f$ A_{forward}\cup A_{backward}
1633
  /// \f$, where \f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and
1634
  /// \f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$, i.e. the so
1635
  /// called residual graph.  When we take the union \f$
1636
  /// A_{forward}\cup A_{backward} \f$, multilicities are counted,
1637
  /// i.e.  if an arc is in both \f$ A_{forward} \f$ and \f$
1638
  /// A_{backward} \f$, then in the adaptor it appears twice. The
1639
  /// following code shows how such an instance can be constructed.
1640
  ///
1641
  ///\code 
1642
  ///  typedef ListDigraph Digraph; 
1643
  ///  IntArcMap f(g), c(g);
1644
  ///  ResDigraphAdaptor<Digraph, int, IntArcMap, IntArcMap> ga(g); 
1645
  ///\endcode
1646
  template<typename _Digraph, 
1647
	   typename _CapacityMap = typename _Digraph::template ArcMap<int>, 
1648
	   typename _FlowMap = _CapacityMap,
1649
           typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
1650
  class ResDigraphAdaptor : 
1651
    public ArcSubDigraphAdaptor< 
1652
    UndirDigraphAdaptor<const _Digraph>, 
1653
    typename UndirDigraphAdaptor<const _Digraph>::template CombinedArcMap<
1654
      ResForwardFilter<const _Digraph, _CapacityMap, _FlowMap>,  
1655
      ResBackwardFilter<const _Digraph, _CapacityMap, _FlowMap> > > {
1656
  public:
1657

	
1658
    typedef _Digraph Digraph;
1659
    typedef _CapacityMap CapacityMap;
1660
    typedef _FlowMap FlowMap;
1661
    typedef _Tolerance Tolerance;
1662

	
1663 2518
    typedef typename CapacityMap::Value Value;
1664
    typedef ResDigraphAdaptor Adaptor;
2519
    typedef Residual Adaptor;
1665 2520

	
... ...
@@ -1667,14 +2522,14 @@
1667 2522

	
1668
    typedef UndirDigraphAdaptor<const Digraph> UndirDigraph;
1669

	
1670
    typedef ResForwardFilter<const Digraph, CapacityMap, FlowMap> 
1671
    ForwardFilter;
1672

	
1673
    typedef ResBackwardFilter<const Digraph, CapacityMap, FlowMap> 
1674
    BackwardFilter;
1675

	
1676
    typedef typename UndirDigraph::
2523
    typedef Undirector<const Digraph> Undirected;
2524

	
2525
    typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
2526
                                            FlowMap, Tolerance> ForwardFilter;
2527

	
2528
    typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
2529
                                             FlowMap, Tolerance> BackwardFilter;
2530

	
2531
    typedef typename Undirected::
1677 2532
    template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
1678 2533

	
1679
    typedef ArcSubDigraphAdaptor<UndirDigraph, ArcFilter> Parent;
2534
    typedef FilterArcs<Undirected, ArcFilter> Parent;
1680 2535

	
... ...
@@ -1683,3 +2538,3 @@
1683 2538

	
1684
    UndirDigraph _graph;
2539
    Undirected _graph;
1685 2540
    ForwardFilter _forward_filter;
... ...
@@ -1688,14 +2543,2 @@
1688 2543

	
1689
    void setCapacityMap(const CapacityMap& capacity) {
1690
      _capacity = &capacity;
1691
      _forward_filter.setCapacity(capacity);
1692
      _backward_filter.setCapacity(capacity);
1693
    }
1694

	
1695
    void setFlowMap(FlowMap& flow) {
1696
      _flow = &flow;
1697
      _forward_filter.setFlow(flow);
1698
      _backward_filter.setFlow(flow);
1699
    }
1700

	
1701 2544
  public:
... ...
@@ -1704,8 +2547,8 @@
1704 2547
    ///
1705
    /// Constructor of the residual graph. The parameters are the digraph type,
2548
    /// Constructor of the residual graph. The parameters are the digraph,
1706 2549
    /// the flow map, the capacity map and a tolerance object.
1707
    ResDigraphAdaptor(const Digraph& digraph, const CapacityMap& capacity, 
1708
                    FlowMap& flow, const Tolerance& tolerance = Tolerance()) 
2550
    Residual(const Digraph& digraph, const CapacityMap& capacity,
2551
             FlowMap& flow, const Tolerance& tolerance = Tolerance())
1709 2552
      : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
1710
        _forward_filter(capacity, flow, tolerance), 
2553
        _forward_filter(capacity, flow, tolerance),
1711 2554
        _backward_filter(capacity, flow, tolerance),
... ...
@@ -1722,20 +2565,20 @@
1722 2565
    /// Gives back the residual capacity of the arc.
1723
    Value rescap(const Arc& arc) const {
1724
      if (UndirDigraph::direction(arc)) {
1725
        return (*_capacity)[arc] - (*_flow)[arc]; 
2566
    Value residualCapacity(const Arc& a) const {
2567
      if (Undirected::direction(a)) {
2568
        return (*_capacity)[a] - (*_flow)[a];
1726 2569
      } else {
1727
        return (*_flow)[arc];
2570
        return (*_flow)[a];
1728 2571
      }
1729
    } 
1730

	
1731
    /// \brief Augment on the given arc in the residual digraph.
2572
    }
2573

	
2574
    /// \brief Augment on the given arc in the residual graph.
1732 2575
    ///
1733
    /// Augment on the given arc in the residual digraph. It increase
2576
    /// Augment on the given arc in the residual graph. It increase
1734 2577
    /// or decrease the flow on the original arc depend on the direction
1735 2578
    /// of the residual arc.
1736
    void augment(const Arc& e, const Value& a) const {
1737
      if (UndirDigraph::direction(e)) {
1738
        _flow->set(e, (*_flow)[e] + a);
1739
      } else {  
1740
        _flow->set(e, (*_flow)[e] - a);
2579
    void augment(const Arc& a, const Value& v) const {
2580
      if (Undirected::direction(a)) {
2581
        _flow->set(a, (*_flow)[a] + v);
2582
      } else {
2583
        _flow->set(a, (*_flow)[a] - v);
1741 2584
      }
... ...
@@ -1746,4 +2589,4 @@
1746 2589
    /// Returns true when the arc is same oriented as the original arc.
1747
    static bool forward(const Arc& e) {
1748
      return UndirDigraph::direction(e);
2590
    static bool forward(const Arc& a) {
2591
      return Undirected::direction(a);
1749 2592
    }
... ...
@@ -1753,4 +2596,4 @@
1753 2596
    /// Returns true when the arc is opposite oriented as the original arc.
1754
    static bool backward(const Arc& e) {
1755
      return !UndirDigraph::direction(e);
2597
    static bool backward(const Arc& a) {
2598
      return !Undirected::direction(a);
1756 2599
    }
... ...
@@ -1760,4 +2603,4 @@
1760 2603
    /// Gives back the forward oriented residual arc.
1761
    static Arc forward(const typename Digraph::Arc& e) {
1762
      return UndirDigraph::direct(e, true);
2604
    static Arc forward(const typename Digraph::Arc& a) {
2605
      return Undirected::direct(a, true);
1763 2606
    }
... ...
@@ -1767,4 +2610,4 @@
1767 2610
    /// Gives back the backward oriented residual arc.
1768
    static Arc backward(const typename Digraph::Arc& e) {
1769
      return UndirDigraph::direct(e, false);
2611
    static Arc backward(const typename Digraph::Arc& a) {
2612
      return Undirected::direct(a, false);
1770 2613
    }
... ...
@@ -1773,5 +2616,5 @@
1773 2616
    ///
1774
    /// In generic residual digraphs the residual capacity can be obtained 
1775
    /// as a map. 
1776
    class ResCap {
2617
    /// In generic residual graph the residual capacity can be obtained
2618
    /// as a map.
2619
    class ResidualCapacity {
1777 2620
    protected:
... ...
@@ -1779,11 +2622,15 @@
1779 2622
    public:
2623
      /// The Key type
1780 2624
      typedef Arc Key;
2625
      /// The Value type
1781 2626
      typedef typename _CapacityMap::Value Value;
1782 2627

	
1783
      ResCap(const Adaptor& adaptor) : _adaptor(&adaptor) {}
1784
      
1785
      Value operator[](const Arc& e) const {
1786
        return _adaptor->rescap(e);
2628
      /// Constructor
2629
      ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
2630

	
2631
      /// \e
2632
      Value operator[](const Arc& a) const {
2633
        return _adaptor->residualCapacity(a);
1787 2634
      }
1788
      
2635

	
1789 2636
    };
... ...
@@ -1793,3 +2640,3 @@
1793 2640
  template <typename _Digraph>
1794
  class SplitDigraphAdaptorBase {
2641
  class SplitNodesBase {
1795 2642
  public:
... ...
@@ -1798,3 +2645,3 @@
1798 2645
    typedef DigraphAdaptorBase<const _Digraph> Parent;
1799
    typedef SplitDigraphAdaptorBase Adaptor;
2646
    typedef SplitNodesBase Adaptor;
1800 2647

	
... ...
@@ -1812,5 +2659,5 @@
1812 2659
  public:
1813
    
2660

	
1814 2661
    class Node : public DigraphNode {
1815
      friend class SplitDigraphAdaptorBase;
2662
      friend class SplitNodesBase;
1816 2663
      template <typename T> friend class NodeMapBase;
... ...
@@ -1820,4 +2667,4 @@
1820 2667
      Node(DigraphNode node, bool in)
1821
	: DigraphNode(node), _in(in) {}
1822
      
2668
        : DigraphNode(node), _in(in) {}
2669

	
1823 2670
    public:
... ...
@@ -1828,12 +2675,12 @@
1828 2675
      bool operator==(const Node& node) const {
1829
	return DigraphNode::operator==(node) && _in == node._in;
2676
        return DigraphNode::operator==(node) && _in == node._in;
1830 2677
      }
1831
      
2678

	
1832 2679
      bool operator!=(const Node& node) const {
1833
	return !(*this == node);
2680
        return !(*this == node);
1834 2681
      }
1835
      
2682

	
1836 2683
      bool operator<(const Node& node) const {
1837
	return DigraphNode::operator<(node) || 
1838
	  (DigraphNode::operator==(node) && _in < node._in);
2684
        return DigraphNode::operator<(node) ||
2685
          (DigraphNode::operator==(node) && _in < node._in);
1839 2686
      }
... ...
@@ -1842,3 +2689,3 @@
1842 2689
    class Arc {
1843
      friend class SplitDigraphAdaptorBase;
2690
      friend class SplitNodesBase;
1844 2691
      template <typename T> friend class ArcMapBase;
... ...
@@ -1849,3 +2696,3 @@
1849 2696
      explicit Arc(const DigraphNode& node) : _item(node) {}
1850
      
2697

	
1851 2698
      ArcImpl _item;
... ...
@@ -1868,7 +2715,7 @@
1868 2715
      }
1869
      
2716

	
1870 2717
      bool operator!=(const Arc& arc) const {
1871
	return !(*this == arc);
2718
        return !(*this == arc);
1872 2719
      }
1873
      
2720

	
1874 2721
      bool operator<(const Arc& arc) const {
... ...
@@ -1899,6 +2746,6 @@
1899 2746
      if (n._in) {
1900
	n._in = false;
2747
        n._in = false;
1901 2748
      } else {
1902
	n._in = true;
1903
	_digraph->next(n);
2749
        n._in = true;
2750
        _digraph->next(n);
1904 2751
      }
... ...
@@ -1911,3 +2758,3 @@
1911 2758
        e._item.setFirst();
1912
	_digraph->first(e._item.first());
2759
        _digraph->first(e._item.first());
1913 2760
      }
... ...
@@ -1917,3 +2764,3 @@
1917 2764
      if (e._item.secondState()) {
1918
	_digraph->next(e._item.second());
2765
        _digraph->next(e._item.second());
1919 2766
        if (e._item.second() == INVALID) {
... ...
@@ -1923,4 +2770,4 @@
1923 2770
      } else {
1924
	_digraph->next(e._item.first());
1925
      }      
2771
        _digraph->next(e._item.first());
2772
      }
1926 2773
    }
... ...
@@ -1932,3 +2779,3 @@
1932 2779
        e._item.setFirst();
1933
	_digraph->firstOut(e._item.first(), n);
2780
        _digraph->firstOut(e._item.first(), n);
1934 2781
      }
... ...
@@ -1938,6 +2785,6 @@
1938 2785
      if (!e._item.firstState()) {
1939
	e._item.setFirst(INVALID);
2786
        e._item.setFirst(INVALID);
1940 2787
      } else {
1941
	_digraph->nextOut(e._item.first());
1942
      }      
2788
        _digraph->nextOut(e._item.first());
2789
      }
1943 2790
    }
... ...
@@ -1946,6 +2793,6 @@
1946 2793
      if (!n._in) {
1947
        e._item.setSecond(n);        
2794
        e._item.setSecond(n);
1948 2795
      } else {
1949 2796
        e._item.setFirst();
1950
	_digraph->firstIn(e._item.first(), n);
2797
        _digraph->firstIn(e._item.first(), n);
1951 2798
      }
... ...
@@ -1955,5 +2802,5 @@
1955 2802
      if (!e._item.firstState()) {
1956
	e._item.setFirst(INVALID);
2803
        e._item.setFirst(INVALID);
1957 2804
      } else {
1958
	_digraph->nextIn(e._item.first());
2805
        _digraph->nextIn(e._item.first());
1959 2806
      }
... ...
@@ -1963,5 +2810,5 @@
1963 2810
      if (e._item.firstState()) {
1964
	return Node(_digraph->source(e._item.first()), false);
2811
        return Node(_digraph->source(e._item.first()), false);
1965 2812
      } else {
1966
	return Node(e._item.second(), true);
2813
        return Node(e._item.second(), true);
1967 2814
      }
... ...
@@ -1971,5 +2818,5 @@
1971 2818
      if (e._item.firstState()) {
1972
	return Node(_digraph->target(e._item.first()), true);
2819
        return Node(_digraph->target(e._item.first()), true);
1973 2820
      } else {
1974
	return Node(e._item.second(), false);
2821
        return Node(e._item.second(), false);
1975 2822
      }
... ...
@@ -2002,3 +2849,3 @@
2002 2849
    int maxArcId() const {
2003
      return std::max(_digraph->maxNodeId() << 1, 
2850
      return std::max(_digraph->maxNodeId() << 1,
2004 2851
                      (_digraph->maxArcId() << 1) | 1);
... ...
@@ -2050,7 +2897,7 @@
2050 2897
    typedef True FindEdgeTag;
2051
    Arc findArc(const Node& u, const Node& v, 
2052
		const Arc& prev = INVALID) const {
2898
    Arc findArc(const Node& u, const Node& v,
2899
                const Arc& prev = INVALID) const {
2053 2900
      if (inNode(u)) {
2054 2901
        if (outNode(v)) {
2055
          if (static_cast<const DigraphNode&>(u) == 
2902
          if (static_cast<const DigraphNode&>(u) ==
2056 2903
              static_cast<const DigraphNode&>(v) && prev == INVALID) {
... ...
@@ -2068,5 +2915,5 @@
2068 2915
  private:
2069
    
2916

	
2070 2917
    template <typename _Value>
2071
    class NodeMapBase 
2918
    class NodeMapBase
2072 2919
      : public MapTraits<typename Parent::template NodeMap<_Value> > {
... ...
@@ -2076,18 +2923,18 @@
2076 2923
      typedef _Value Value;
2077
      
2078
      NodeMapBase(const Adaptor& adaptor) 
2079
	: _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
2080
      NodeMapBase(const Adaptor& adaptor, const Value& value) 
2081
	: _in_map(*adaptor._digraph, value), 
2082
	  _out_map(*adaptor._digraph, value) {}
2924

	
2925
      NodeMapBase(const Adaptor& adaptor)
2926
        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
2927
      NodeMapBase(const Adaptor& adaptor, const Value& value)
2928
        : _in_map(*adaptor._digraph, value),
2929
          _out_map(*adaptor._digraph, value) {}
2083 2930

	
2084 2931
      void set(const Node& key, const Value& val) {
2085
	if (Adaptor::inNode(key)) { _in_map.set(key, val); }
2086
	else {_out_map.set(key, val); }
2932
        if (Adaptor::inNode(key)) { _in_map.set(key, val); }
2933
        else {_out_map.set(key, val); }
2087 2934
      }
2088
      
2089
      typename MapTraits<NodeImpl>::ReturnValue 
2935

	
2936
      typename MapTraits<NodeImpl>::ReturnValue
2090 2937
      operator[](const Node& key) {
2091
	if (Adaptor::inNode(key)) { return _in_map[key]; }
2092
	else { return _out_map[key]; }
2938
        if (Adaptor::inNode(key)) { return _in_map[key]; }
2939
        else { return _out_map[key]; }
2093 2940
      }
... ...
@@ -2096,4 +2943,4 @@
2096 2943
      operator[](const Node& key) const {
2097
	if (Adaptor::inNode(key)) { return _in_map[key]; }
2098
	else { return _out_map[key]; }
2944
        if (Adaptor::inNode(key)) { return _in_map[key]; }
2945
        else { return _out_map[key]; }
2099 2946
      }
... ...
@@ -2105,3 +2952,3 @@
2105 2952
    template <typename _Value>
2106
    class ArcMapBase 
2953
    class ArcMapBase
2107 2954
      : public MapTraits<typename Parent::template ArcMap<_Value> > {
... ...
@@ -2113,19 +2960,19 @@
2113 2960

	
2114
      ArcMapBase(const Adaptor& adaptor) 
2115
	: _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
2116
      ArcMapBase(const Adaptor& adaptor, const Value& value) 
2117
	: _arc_map(*adaptor._digraph, value), 
2118
	  _node_map(*adaptor._digraph, value) {}
2961
      ArcMapBase(const Adaptor& adaptor)
2962
        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
2963
      ArcMapBase(const Adaptor& adaptor, const Value& value)
2964
        : _arc_map(*adaptor._digraph, value),
2965
          _node_map(*adaptor._digraph, value) {}
2119 2966

	
2120 2967
      void set(const Arc& key, const Value& val) {
2121
	if (Adaptor::origArc(key)) { 
2122
          _arc_map.set(key._item.first(), val); 
2968
        if (Adaptor::origArc(key)) {
2969
          _arc_map.set(key._item.first(), val);
2123 2970
        } else {
2124
          _node_map.set(key._item.second(), val); 
2971
          _node_map.set(key._item.second(), val);
2125 2972
        }
2126 2973
      }
2127
      
2974

	
2128 2975
      typename MapTraits<ArcImpl>::ReturnValue
2129 2976
      operator[](const Arc& key) {
2130
	if (Adaptor::origArc(key)) { 
2977
        if (Adaptor::origArc(key)) {
2131 2978
          return _arc_map[key._item.first()];
... ...
@@ -2138,3 +2985,3 @@
2138 2985
      operator[](const Arc& key) const {
2139
	if (Adaptor::origArc(key)) { 
2986
        if (Adaptor::origArc(key)) {
2140 2987
          return _arc_map[key._item.first()];
... ...
@@ -2153,4 +3000,4 @@
2153 3000
    template <typename _Value>
2154
    class NodeMap 
2155
      : public SubMapExtender<Adaptor, NodeMapBase<_Value> > 
3001
    class NodeMap
3002
      : public SubMapExtender<Adaptor, NodeMapBase<_Value> >
2156 3003
    {
... ...
@@ -2159,14 +3006,14 @@
2159 3006
      typedef SubMapExtender<Adaptor, NodeMapBase<Value> > Parent;
2160
    
2161
      NodeMap(const Adaptor& adaptor) 
2162
	: Parent(adaptor) {}
2163

	
2164
      NodeMap(const Adaptor& adaptor, const Value& value) 
2165
	: Parent(adaptor, value) {}
2166
    
3007

	
3008
      NodeMap(const Adaptor& adaptor)
3009
        : Parent(adaptor) {}
3010

	
3011
      NodeMap(const Adaptor& adaptor, const Value& value)
3012
        : Parent(adaptor, value) {}
3013

	
2167 3014
    private:
2168 3015
      NodeMap& operator=(const NodeMap& cmap) {
2169
	return operator=<NodeMap>(cmap);
3016
        return operator=<NodeMap>(cmap);
2170 3017
      }
2171
    
3018

	
2172 3019
      template <typename CMap>
... ...
@@ -2174,3 +3021,3 @@
2174 3021
        Parent::operator=(cmap);
2175
	return *this;
3022
        return *this;
2176 3023
      }
... ...
@@ -2179,4 +3026,4 @@
2179 3026
    template <typename _Value>
2180
    class ArcMap 
2181
      : public SubMapExtender<Adaptor, ArcMapBase<_Value> > 
3027
    class ArcMap
3028
      : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
2182 3029
    {
... ...
@@ -2185,14 +3032,14 @@
2185 3032
      typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
2186
    
2187
      ArcMap(const Adaptor& adaptor) 
2188
	: Parent(adaptor) {}
2189

	
2190
      ArcMap(const Adaptor& adaptor, const Value& value) 
2191
	: Parent(adaptor, value) {}
2192
    
3033

	
3034
      ArcMap(const Adaptor& adaptor)
3035
        : Parent(adaptor) {}
3036

	
3037
      ArcMap(const Adaptor& adaptor, const Value& value)
3038
        : Parent(adaptor, value) {}
3039

	
2193 3040
    private:
2194 3041
      ArcMap& operator=(const ArcMap& cmap) {
2195
	return operator=<ArcMap>(cmap);
3042
        return operator=<ArcMap>(cmap);
2196 3043
      }
2197
    
3044

	
2198 3045
      template <typename CMap>
... ...
@@ -2200,3 +3047,3 @@
2200 3047
        Parent::operator=(cmap);
2201
	return *this;
3048
        return *this;
2202 3049
      }
... ...
@@ -2206,3 +3053,3 @@
2206 3053

	
2207
    SplitDigraphAdaptorBase() : _digraph(0) {}
3054
    SplitNodesBase() : _digraph(0) {}
2208 3055

	
... ...
@@ -2213,3 +3060,3 @@
2213 3060
    }
2214
    
3061

	
2215 3062
  };
... ...
@@ -2218,73 +3065,27 @@
2218 3065
  ///
2219
  /// \brief Split digraph adaptor class
2220
  /// 
2221
  /// This is an digraph adaptor which splits all node into an in-node
2222
  /// and an out-node. Formaly, the adaptor replaces each \f$ u \f$
2223
  /// node in the digraph with two node, \f$ u_{in} \f$ node and 
2224
  /// \f$ u_{out} \f$ node. If there is an \f$ (v, u) \f$ arc in the 
2225
  /// original digraph the new target of the arc will be \f$ u_{in} \f$ and
2226
  /// similarly the source of the original \f$ (u, v) \f$ arc will be
2227
  /// \f$ u_{out} \f$.  The adaptor will add for each node in the 
2228
  /// original digraph an additional arc which will connect 
3066
  /// \brief Split the nodes of a directed graph
3067
  ///
3068
  /// The SplitNodes adaptor splits each node into an in-node and an
3069
  /// out-node. Formaly, the adaptor replaces each \f$ u \f$ node in
3070
  /// the digraph with two nodes(namely node \f$ u_{in} \f$ and node
3071
  /// \f$ u_{out} \f$). If there is a \f$ (v, u) \f$ arc in the
3072
  /// original digraph the new target of the arc will be \f$ u_{in} \f$
3073
  /// and similarly the source of the original \f$ (u, v) \f$ arc
3074
  /// will be \f$ u_{out} \f$.  The adaptor will add for each node in
3075
  /// the original digraph an additional arc which connects
2229 3076
  /// \f$ (u_{in}, u_{out}) \f$.
2230 3077
  ///
2231
  /// The aim of this class is to run algorithm with node costs if the 
3078
  /// The aim of this class is to run algorithm with node costs if the
2232 3079
  /// algorithm can use directly just arc costs. In this case we should use
2233
  /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the
2234
  /// bind arc in the adapted digraph.
2235
  /// 
2236
  /// For example a maximum flow algorithm can compute how many arc
2237
  /// disjoint paths are in the digraph. But we would like to know how
2238
  /// many node disjoint paths are in the digraph. First we have to
2239
  /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow
2240
  /// algorithm on the adapted digraph. The bottleneck of the flow will
2241
  /// be the bind arcs which bounds the flow with the count of the
2242
  /// node disjoint paths.
3080
  /// a \c SplitNodes and set the node cost of the graph to the
3081
  /// bind arc in the adapted graph.
2243 3082
  ///
2244
  ///\code
2245
  ///
2246
  /// typedef SplitDigraphAdaptor<SmartDigraph> SDigraph;
2247
  ///
2248
  /// SDigraph sdigraph(digraph);
2249
  ///
2250
  /// typedef ConstMap<SDigraph::Arc, int> SCapacity;
2251
  /// SCapacity scapacity(1);
2252
  ///
2253
  /// SDigraph::ArcMap<int> sflow(sdigraph);
2254
  ///
2255
  /// Preflow<SDigraph, SCapacity> 
2256
  ///   spreflow(sdigraph, scapacity, 
2257
  ///            SDigraph::outNode(source), SDigraph::inNode(target));
2258
  ///                                            
2259
  /// spreflow.run();
2260
  ///
2261
  ///\endcode
2262
  ///
2263
  /// The result of the mamixum flow on the original digraph
2264
  /// shows the next figure:
2265
  ///
2266
  /// \image html arc_disjoint.png
2267
  /// \image latex arc_disjoint.eps "Arc disjoint paths" width=\textwidth
2268
  /// 
2269
  /// And the maximum flow on the adapted digraph:
2270
  ///
2271
  /// \image html node_disjoint.png
2272
  /// \image latex node_disjoint.eps "Node disjoint paths" width=\textwidth
2273
  ///
2274
  /// The second solution contains just 3 disjoint paths while the first 4.
2275
  /// The full code can be found in the \ref disjoint_paths_demo.cc demo file.
2276
  ///
2277
  /// This digraph adaptor is fully conform to the 
2278
  /// \ref concepts::Digraph "Digraph" concept and
2279
  /// contains some additional member functions and types. The 
2280
  /// documentation of some member functions may be found just in the
2281
  /// SplitDigraphAdaptorBase class.
2282
  ///
2283
  /// \sa SplitDigraphAdaptorBase
3083
  /// \tparam _Digraph It must be conform to the \ref concepts::Digraph
3084
  /// "Digraph concept". The type can be specified to be const.
2284 3085
  template <typename _Digraph>
2285
  class SplitDigraphAdaptor 
2286
    : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > {
3086
  class SplitNodes
3087
    : public DigraphAdaptorExtender<SplitNodesBase<_Digraph> > {
2287 3088
  public:
2288 3089
    typedef _Digraph Digraph;
2289
    typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent;
3090
    typedef DigraphAdaptorExtender<SplitNodesBase<Digraph> > Parent;
2290 3091

	
... ...
@@ -2299,3 +3100,3 @@
2299 3100
    /// Constructor of the adaptor.
2300
    SplitDigraphAdaptor(Digraph& g) {
3101
    SplitNodes(Digraph& g) {
2301 3102
      Parent::setDigraph(g);
... ...
@@ -2346,3 +3147,3 @@
2346 3147
    /// \brief Gives back the arc binds the two part of the node.
2347
    /// 
3148
    ///
2348 3149
    /// Gives back the arc binds the two part of the node.
... ...
@@ -2353,3 +3154,3 @@
2353 3154
    /// \brief Gives back the arc of the original arc.
2354
    /// 
3155
    ///
2355 3156
    /// Gives back the arc of the original arc.
... ...
@@ -2373,4 +3174,4 @@
2373 3174
      /// Constructor.
2374
      CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) 
2375
	: _in_map(in_map), _out_map(out_map) {}
3175
      CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
3176
        : _in_map(in_map), _out_map(out_map) {}
2376 3177

	
... ...
@@ -2380,7 +3181,7 @@
2380 3181
      Value& operator[](const Key& key) {
2381
	if (Parent::inNode(key)) {
2382
	  return _in_map[key];
2383
	} else {
2384
	  return _out_map[key];
2385
	}
3182
        if (Parent::inNode(key)) {
3183
          return _in_map[key];
3184
        } else {
3185
          return _out_map[key];
3186
        }
2386 3187
      }
... ...
@@ -2391,7 +3192,7 @@
2391 3192
      Value operator[](const Key& key) const {
2392
	if (Parent::inNode(key)) {
2393
	  return _in_map[key];
2394
	} else {
2395
	  return _out_map[key];
2396
	}
3193
        if (Parent::inNode(key)) {
3194
          return _in_map[key];
3195
        } else {
3196
          return _out_map[key];
3197
        }
2397 3198
      }
... ...
@@ -2399,17 +3200,17 @@
2399 3200
      /// \brief The setter function of the map.
2400
      /// 
3201
      ///
2401 3202
      /// The setter function of the map.
2402 3203
      void set(const Key& key, const Value& value) {
2403
	if (Parent::inNode(key)) {
2404
	  _in_map.set(key, value);
2405
	} else {
2406
	  _out_map.set(key, value);
2407
	}
3204
        if (Parent::inNode(key)) {
3205
          _in_map.set(key, value);
3206
        } else {
3207
          _out_map.set(key, value);
3208
        }
2408 3209
      }
2409
      
3210

	
2410 3211
    private:
2411
      
3212

	
2412 3213
      InNodeMap& _in_map;
2413 3214
      OutNodeMap& _out_map;
2414
      
3215

	
2415 3216
    };
... ...
@@ -2417,7 +3218,7 @@
2417 3218

	
2418
    /// \brief Just gives back a combined node map.
2419
    /// 
2420
    /// Just gives back a combined node map.
3219
    /// \brief Just gives back a combined node map
3220
    ///
3221
    /// Just gives back a combined node map
2421 3222
    template <typename InNodeMap, typename OutNodeMap>
2422
    static CombinedNodeMap<InNodeMap, OutNodeMap> 
3223
    static CombinedNodeMap<InNodeMap, OutNodeMap>
2423 3224
    combinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) {
... ...
@@ -2427,3 +3228,3 @@
2427 3228
    template <typename InNodeMap, typename OutNodeMap>
2428
    static CombinedNodeMap<const InNodeMap, OutNodeMap> 
3229
    static CombinedNodeMap<const InNodeMap, OutNodeMap>
2429 3230
    combinedNodeMap(const InNodeMap& in_map, OutNodeMap& out_map) {
... ...
@@ -2433,3 +3234,3 @@
2433 3234
    template <typename InNodeMap, typename OutNodeMap>
2434
    static CombinedNodeMap<InNodeMap, const OutNodeMap> 
3235
    static CombinedNodeMap<InNodeMap, const OutNodeMap>
2435 3236
    combinedNodeMap(InNodeMap& in_map, const OutNodeMap& out_map) {
... ...
@@ -2439,5 +3240,5 @@
2439 3240
    template <typename InNodeMap, typename OutNodeMap>
2440
    static CombinedNodeMap<const InNodeMap, const OutNodeMap> 
3241
    static CombinedNodeMap<const InNodeMap, const OutNodeMap>
2441 3242
    combinedNodeMap(const InNodeMap& in_map, const OutNodeMap& out_map) {
2442
      return CombinedNodeMap<const InNodeMap, 
3243
      return CombinedNodeMap<const InNodeMap,
2443 3244
        const OutNodeMap>(in_map, out_map);
... ...
@@ -2445,6 +3246,6 @@
2445 3246

	
2446
    /// \brief ArcMap combined from an original ArcMap and NodeMap
3247
    /// \brief ArcMap combined from an original ArcMap and a NodeMap
2447 3248
    ///
2448
    /// This class adapt an original digraph ArcMap and NodeMap to
2449
    /// get an arc map on the adapted digraph.
3249
    /// This class adapt an original ArcMap and a NodeMap to get an
3250
    /// arc map on the adapted digraph
2450 3251
    template <typename DigraphArcMap, typename DigraphNodeMap>
... ...
@@ -2452,6 +3253,6 @@
2452 3253
    public:
2453
      
3254

	
2454 3255
      typedef Arc Key;
2455 3256
      typedef typename DigraphArcMap::Value Value;
2456
      
3257

	
2457 3258
      /// \brief Constructor
... ...
@@ -2459,4 +3260,4 @@
2459 3260
      /// Constructor.
2460
      CombinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map) 
2461
	: _arc_map(arc_map), _node_map(node_map) {}
3261
      CombinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map)
3262
        : _arc_map(arc_map), _node_map(node_map) {}
2462 3263

	
... ...
@@ -2466,7 +3267,7 @@
2466 3267
      void set(const Arc& arc, const Value& val) {
2467
	if (Parent::origArc(arc)) {
2468
	  _arc_map.set(arc, val);
2469
	} else {
2470
	  _node_map.set(arc, val);
2471
	}
3268
        if (Parent::origArc(arc)) {
3269
          _arc_map.set(arc, val);
3270
        } else {
3271
          _node_map.set(arc, val);
3272
        }
2472 3273
      }
... ...
@@ -2477,8 +3278,8 @@
2477 3278
      Value operator[](const Key& arc) const {
2478
	if (Parent::origArc(arc)) {
2479
	  return _arc_map[arc];
2480
	} else {
2481
	  return _node_map[arc];
2482
	}
2483
      }      
3279
        if (Parent::origArc(arc)) {
3280
          return _arc_map[arc];
3281
        } else {
3282
          return _node_map[arc];
3283
        }
3284
      }
2484 3285

	
... ...
@@ -2488,9 +3289,9 @@
2488 3289
      Value& operator[](const Key& arc) {
2489
	if (Parent::origArc(arc)) {
2490
	  return _arc_map[arc];
2491
	} else {
2492
	  return _node_map[arc];
2493
	}
2494
      }      
2495
      
3290
        if (Parent::origArc(arc)) {
3291
          return _arc_map[arc];
3292
        } else {
3293
          return _node_map[arc];
3294
        }
3295
      }
3296

	
2496 3297
    private:
... ...
@@ -2499,8 +3300,8 @@
2499 3300
    };
2500
                    
2501
    /// \brief Just gives back a combined arc map.
2502
    /// 
2503
    /// Just gives back a combined arc map.
3301

	
3302
    /// \brief Just gives back a combined arc map
3303
    ///
3304
    /// Just gives back a combined arc map
2504 3305
    template <typename DigraphArcMap, typename DigraphNodeMap>
2505
    static CombinedArcMap<DigraphArcMap, DigraphNodeMap> 
3306
    static CombinedArcMap<DigraphArcMap, DigraphNodeMap>
2506 3307
    combinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map) {
... ...
@@ -2510,5 +3311,5 @@
2510 3311
    template <typename DigraphArcMap, typename DigraphNodeMap>
2511
    static CombinedArcMap<const DigraphArcMap, DigraphNodeMap> 
3312
    static CombinedArcMap<const DigraphArcMap, DigraphNodeMap>
2512 3313
    combinedArcMap(const DigraphArcMap& arc_map, DigraphNodeMap& node_map) {
2513
      return CombinedArcMap<const DigraphArcMap, 
3314
      return CombinedArcMap<const DigraphArcMap,
2514 3315
        DigraphNodeMap>(arc_map, node_map);
... ...
@@ -2517,5 +3318,5 @@
2517 3318
    template <typename DigraphArcMap, typename DigraphNodeMap>
2518
    static CombinedArcMap<DigraphArcMap, const DigraphNodeMap> 
3319
    static CombinedArcMap<DigraphArcMap, const DigraphNodeMap>
2519 3320
    combinedArcMap(DigraphArcMap& arc_map, const DigraphNodeMap& node_map) {
2520
      return CombinedArcMap<DigraphArcMap, 
3321
      return CombinedArcMap<DigraphArcMap,
2521 3322
        const DigraphNodeMap>(arc_map, node_map);
... ...
@@ -2524,6 +3325,6 @@
2524 3325
    template <typename DigraphArcMap, typename DigraphNodeMap>
2525
    static CombinedArcMap<const DigraphArcMap, const DigraphNodeMap> 
2526
    combinedArcMap(const DigraphArcMap& arc_map, 
2527
                    const DigraphNodeMap& node_map) {
2528
      return CombinedArcMap<const DigraphArcMap, 
3326
    static CombinedArcMap<const DigraphArcMap, const DigraphNodeMap>
3327
    combinedArcMap(const DigraphArcMap& arc_map,
3328
                   const DigraphNodeMap& node_map) {
3329
      return CombinedArcMap<const DigraphArcMap,
2529 3330
        const DigraphNodeMap>(arc_map, node_map);
... ...
@@ -2533,9 +3334,9 @@
2533 3334

	
2534
  /// \brief Just gives back a split digraph adaptor
3335
  /// \brief Just gives back a node splitter
2535 3336
  ///
2536
  /// Just gives back a split digraph adaptor
3337
  /// Just gives back a node splitter
2537 3338
  template<typename Digraph>
2538
  SplitDigraphAdaptor<Digraph>
2539
  splitDigraphAdaptor(const Digraph& digraph) {
2540
    return SplitDigraphAdaptor<Digraph>(digraph);
3339
  SplitNodes<Digraph>
3340
  splitNodes(const Digraph& digraph) {
3341
    return SplitNodes<Digraph>(digraph);
2541 3342
  }
... ...
@@ -2545,3 +3346,2 @@
2545 3346

	
2546
#endif //LEMON_DIGRAPH_ADAPTOR_H
2547

	
3347
#endif //LEMON_ADAPTORS_H
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
... ...
@@ -26,11 +26,4 @@
26 26

	
27

	
28
///\ingroup digraphbits
29
///\file
30
///\brief Extenders for the digraph adaptor types
31 27
namespace lemon {
32 28

	
33
  /// \ingroup digraphbits
34
  ///
35
  /// \brief Extender for the DigraphAdaptors
36 29
  template <typename _Digraph>
... ...
@@ -66,10 +59,10 @@
66 59
      if (n == Parent::source(e))
67
	return Parent::target(e);
60
        return Parent::target(e);
68 61
      else if(n==Parent::target(e))
69
	return Parent::source(e);
62
        return Parent::source(e);
70 63
      else
71
	return INVALID;
64
        return INVALID;
72 65
    }
73 66

	
74
    class NodeIt : public Node { 
67
    class NodeIt : public Node {
75 68
      const Adaptor* _adaptor;
... ...
@@ -82,11 +75,11 @@
82 75
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
83
	_adaptor->first(static_cast<Node&>(*this));
76
        _adaptor->first(static_cast<Node&>(*this));
84 77
      }
85 78

	
86
      NodeIt(const Adaptor& adaptor, const Node& node) 
87
	: Node(node), _adaptor(&adaptor) {}
79
      NodeIt(const Adaptor& adaptor, const Node& node)
80
        : Node(node), _adaptor(&adaptor) {}
88 81

	
89
      NodeIt& operator++() { 
90
	_adaptor->next(*this);
91
	return *this; 
82
      NodeIt& operator++() {
83
        _adaptor->next(*this);
84
        return *this;
92 85
      }
... ...
@@ -96,3 +89,3 @@
96 89

	
97
    class ArcIt : public Arc { 
90
    class ArcIt : public Arc {
98 91
      const Adaptor* _adaptor;
... ...
@@ -105,11 +98,11 @@
105 98
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
106
	_adaptor->first(static_cast<Arc&>(*this));
99
        _adaptor->first(static_cast<Arc&>(*this));
107 100
      }
108 101

	
109
      ArcIt(const Adaptor& adaptor, const Arc& e) : 
110
	Arc(e), _adaptor(&adaptor) { }
102
      ArcIt(const Adaptor& adaptor, const Arc& e) :
103
        Arc(e), _adaptor(&adaptor) { }
111 104

	
112
      ArcIt& operator++() { 
113
	_adaptor->next(*this);
114
	return *this; 
105
      ArcIt& operator++() {
106
        _adaptor->next(*this);
107
        return *this;
115 108
      }
... ...
@@ -119,3 +112,3 @@
119 112

	
120
    class OutArcIt : public Arc { 
113
    class OutArcIt : public Arc {
121 114
      const Adaptor* _adaptor;
... ...
@@ -127,13 +120,13 @@
127 120

	
128
      OutArcIt(const Adaptor& adaptor, const Node& node) 
129
	: _adaptor(&adaptor) {
130
	_adaptor->firstOut(*this, node);
121
      OutArcIt(const Adaptor& adaptor, const Node& node)
122
        : _adaptor(&adaptor) {
123
        _adaptor->firstOut(*this, node);
131 124
      }
132 125

	
133
      OutArcIt(const Adaptor& adaptor, const Arc& arc) 
134
	: Arc(arc), _adaptor(&adaptor) {}
126
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
127
        : Arc(arc), _adaptor(&adaptor) {}
135 128

	
136
      OutArcIt& operator++() { 
137
	_adaptor->nextOut(*this);
138
	return *this; 
129
      OutArcIt& operator++() {
130
        _adaptor->nextOut(*this);
131
        return *this;
139 132
      }
... ...
@@ -143,3 +136,3 @@
143 136

	
144
    class InArcIt : public Arc { 
137
    class InArcIt : public Arc {
145 138
      const Adaptor* _adaptor;
... ...
@@ -151,13 +144,13 @@
151 144

	
152
      InArcIt(const Adaptor& adaptor, const Node& node) 
153
	: _adaptor(&adaptor) {
154
	_adaptor->firstIn(*this, node);
145
      InArcIt(const Adaptor& adaptor, const Node& node)
146
        : _adaptor(&adaptor) {
147
        _adaptor->firstIn(*this, node);
155 148
      }
156 149

	
157
      InArcIt(const Adaptor& adaptor, const Arc& arc) : 
158
	Arc(arc), _adaptor(&adaptor) {}
150
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
151
        Arc(arc), _adaptor(&adaptor) {}
159 152

	
160
      InArcIt& operator++() { 
161
	_adaptor->nextIn(*this);
162
	return *this; 
153
      InArcIt& operator++() {
154
        _adaptor->nextIn(*this);
155
        return *this;
163 156
      }
... ...
@@ -166,5 +159,2 @@
166 159

	
167
    /// \brief Base node of the iterator
168
    ///
169
    /// Returns the base node (ie. the source in this case) of the iterator
170 160
    Node baseNode(const OutArcIt &e) const {
... ...
@@ -172,6 +162,2 @@
172 162
    }
173
    /// \brief Running node of the iterator
174
    ///
175
    /// Returns the running node (ie. the target in this case) of the
176
    /// iterator
177 163
    Node runningNode(const OutArcIt &e) const {
... ...
@@ -180,5 +166,2 @@
180 166

	
181
    /// \brief Base node of the iterator
182
    ///
183
    /// Returns the base node (ie. the target in this case) of the iterator
184 167
    Node baseNode(const InArcIt &e) const {
... ...
@@ -186,6 +169,2 @@
186 169
    }
187
    /// \brief Running node of the iterator
188
    ///
189
    /// Returns the running node (ie. the source in this case) of the
190
    /// iterator
191 170
    Node runningNode(const InArcIt &e) const {
... ...
@@ -200,6 +179,6 @@
200 179
  /// \brief Extender for the GraphAdaptors
201
  template <typename _Graph> 
180
  template <typename _Graph>
202 181
  class GraphAdaptorExtender : public _Graph {
203 182
  public:
204
    
183

	
205 184
    typedef _Graph Parent;
... ...
@@ -212,3 +191,3 @@
212 191

	
213
    // Graph extension    
192
    // Graph extension
214 193

	
... ...
@@ -240,7 +219,7 @@
240 219
      if( n == Parent::u(e))
241
	return Parent::v(e);
220
        return Parent::v(e);
242 221
      else if( n == Parent::v(e))
243
	return Parent::u(e);
222
        return Parent::u(e);
244 223
      else
245
	return INVALID;
224
        return INVALID;
246 225
    }
... ...
@@ -257,3 +236,3 @@
257 236

	
258
    class NodeIt : public Node { 
237
    class NodeIt : public Node {
259 238
      const Adaptor* _adaptor;
... ...
@@ -266,11 +245,11 @@
266 245
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
267
	_adaptor->first(static_cast<Node&>(*this));
246
        _adaptor->first(static_cast<Node&>(*this));
268 247
      }
269 248

	
270
      NodeIt(const Adaptor& adaptor, const Node& node) 
271
	: Node(node), _adaptor(&adaptor) {}
249
      NodeIt(const Adaptor& adaptor, const Node& node)
250
        : Node(node), _adaptor(&adaptor) {}
272 251

	
273
      NodeIt& operator++() { 
274
	_adaptor->next(*this);
275
	return *this; 
252
      NodeIt& operator++() {
253
        _adaptor->next(*this);
254
        return *this;
276 255
      }
... ...
@@ -280,3 +259,3 @@
280 259

	
281
    class ArcIt : public Arc { 
260
    class ArcIt : public Arc {
282 261
      const Adaptor* _adaptor;
... ...
@@ -289,11 +268,11 @@
289 268
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
290
	_adaptor->first(static_cast<Arc&>(*this));
269
        _adaptor->first(static_cast<Arc&>(*this));
291 270
      }
292 271

	
293
      ArcIt(const Adaptor& adaptor, const Arc& e) : 
294
	Arc(e), _adaptor(&adaptor) { }
272
      ArcIt(const Adaptor& adaptor, const Arc& e) :
273
        Arc(e), _adaptor(&adaptor) { }
295 274

	
296
      ArcIt& operator++() { 
297
	_adaptor->next(*this);
298
	return *this; 
275
      ArcIt& operator++() {
276
        _adaptor->next(*this);
277
        return *this;
299 278
      }
... ...
@@ -303,3 +282,3 @@
303 282

	
304
    class OutArcIt : public Arc { 
283
    class OutArcIt : public Arc {
305 284
      const Adaptor* _adaptor;
... ...
@@ -311,13 +290,13 @@
311 290

	
312
      OutArcIt(const Adaptor& adaptor, const Node& node) 
313
	: _adaptor(&adaptor) {
314
	_adaptor->firstOut(*this, node);
291
      OutArcIt(const Adaptor& adaptor, const Node& node)
292
        : _adaptor(&adaptor) {
293
        _adaptor->firstOut(*this, node);
315 294
      }
316 295

	
317
      OutArcIt(const Adaptor& adaptor, const Arc& arc) 
318
	: Arc(arc), _adaptor(&adaptor) {}
296
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
297
        : Arc(arc), _adaptor(&adaptor) {}
319 298

	
320
      OutArcIt& operator++() { 
321
	_adaptor->nextOut(*this);
322
	return *this; 
299
      OutArcIt& operator++() {
300
        _adaptor->nextOut(*this);
301
        return *this;
323 302
      }
... ...
@@ -327,3 +306,3 @@
327 306

	
328
    class InArcIt : public Arc { 
307
    class InArcIt : public Arc {
329 308
      const Adaptor* _adaptor;
... ...
@@ -335,13 +314,13 @@
335 314

	
336
      InArcIt(const Adaptor& adaptor, const Node& node) 
337
	: _adaptor(&adaptor) {
338
	_adaptor->firstIn(*this, node);
315
      InArcIt(const Adaptor& adaptor, const Node& node)
316
        : _adaptor(&adaptor) {
317
        _adaptor->firstIn(*this, node);
339 318
      }
340 319

	
341
      InArcIt(const Adaptor& adaptor, const Arc& arc) : 
342
	Arc(arc), _adaptor(&adaptor) {}
320
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
321
        Arc(arc), _adaptor(&adaptor) {}
343 322

	
344
      InArcIt& operator++() { 
345
	_adaptor->nextIn(*this);
346
	return *this; 
323
      InArcIt& operator++() {
324
        _adaptor->nextIn(*this);
325
        return *this;
347 326
      }
... ...
@@ -350,3 +329,3 @@
350 329

	
351
    class EdgeIt : public Parent::Edge { 
330
    class EdgeIt : public Parent::Edge {
352 331
      const Adaptor* _adaptor;
... ...
@@ -359,11 +338,11 @@
359 338
      explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
360
	_adaptor->first(static_cast<Edge&>(*this));
339
        _adaptor->first(static_cast<Edge&>(*this));
361 340
      }
362 341

	
363
      EdgeIt(const Adaptor& adaptor, const Edge& e) : 
364
	Edge(e), _adaptor(&adaptor) { }
342
      EdgeIt(const Adaptor& adaptor, const Edge& e) :
343
        Edge(e), _adaptor(&adaptor) { }
365 344

	
366
      EdgeIt& operator++() { 
367
	_adaptor->next(*this);
368
	return *this; 
345
      EdgeIt& operator++() {
346
        _adaptor->next(*this);
347
        return *this;
369 348
      }
... ...
@@ -372,3 +351,3 @@
372 351

	
373
    class IncEdgeIt : public Edge { 
352
    class IncEdgeIt : public Edge {
374 353
      friend class GraphAdaptorExtender;
... ...
@@ -383,3 +362,3 @@
383 362
      IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
384
	_adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
363
        _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
385 364
      }
... ...
@@ -387,4 +366,4 @@
387 366
      IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
388
	: _adaptor(&adaptor), Edge(e) {
389
	direction = (_adaptor->u(e) == n);
367
        : _adaptor(&adaptor), Edge(e) {
368
        direction = (_adaptor->u(e) == n);
390 369
      }
... ...
@@ -392,4 +371,4 @@
392 371
      IncEdgeIt& operator++() {
393
	_adaptor->nextInc(*this, direction);
394
	return *this; 
372
        _adaptor->nextInc(*this, direction);
373
        return *this;
395 374
      }
... ...
@@ -397,5 +376,2 @@
397 376

	
398
    /// \brief Base node of the iterator
399
    ///
400
    /// Returns the base node (ie. the source in this case) of the iterator
401 377
    Node baseNode(const OutArcIt &a) const {
... ...
@@ -403,6 +379,2 @@
403 379
    }
404
    /// \brief Running node of the iterator
405
    ///
406
    /// Returns the running node (ie. the target in this case) of the
407
    /// iterator
408 380
    Node runningNode(const OutArcIt &a) const {
... ...
@@ -411,5 +383,2 @@
411 383

	
412
    /// \brief Base node of the iterator
413
    ///
414
    /// Returns the base node (ie. the target in this case) of the iterator
415 384
    Node baseNode(const InArcIt &a) const {
... ...
@@ -417,6 +386,2 @@
417 386
    }
418
    /// \brief Running node of the iterator
419
    ///
420
    /// Returns the running node (ie. the source in this case) of the
421
    /// iterator
422 387
    Node runningNode(const InArcIt &a) const {
... ...
@@ -425,5 +390,2 @@
425 390

	
426
    /// Base node of the iterator
427
    ///
428
    /// Returns the base node of the iterator
429 391
    Node baseNode(const IncEdgeIt &e) const {
... ...
@@ -431,5 +393,2 @@
431 393
    }
432
    /// Running node of the iterator
433
    ///
434
    /// Returns the running node of the iterator
435 394
    Node runningNode(const IncEdgeIt &e) const {
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
... ...
@@ -29,3 +29,3 @@
29 29
  namespace _variant_bits {
30
  
30

	
31 31
    template <int left, int right>
... ...
@@ -88,5 +88,5 @@
88 88
      if (flag) {
89
        new(reinterpret_cast<First*>(data)) First(bivariant.first());      
89
        new(reinterpret_cast<First*>(data)) First(bivariant.first());
90 90
      } else {
91
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());      
91
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());
92 92
      }
... ...
@@ -108,3 +108,3 @@
108 108
      flag = true;
109
      new(reinterpret_cast<First*>(data)) First();   
109
      new(reinterpret_cast<First*>(data)) First();
110 110
      return *this;
... ...
@@ -119,3 +119,3 @@
119 119
      flag = true;
120
      new(reinterpret_cast<First*>(data)) First(f);   
120
      new(reinterpret_cast<First*>(data)) First(f);
121 121
      return *this;
... ...
@@ -130,3 +130,3 @@
130 130
      flag = false;
131
      new(reinterpret_cast<Second*>(data)) Second();   
131
      new(reinterpret_cast<Second*>(data)) Second();
132 132
      return *this;
... ...
@@ -141,3 +141,3 @@
141 141
      flag = false;
142
      new(reinterpret_cast<Second*>(data)) Second(s);   
142
      new(reinterpret_cast<Second*>(data)) Second(s);
143 143
      return *this;
... ...
@@ -161,5 +161,5 @@
161 161
      if (flag) {
162
        new(reinterpret_cast<First*>(data)) First(bivariant.first());      
162
        new(reinterpret_cast<First*>(data)) First(bivariant.first());
163 163
      } else {
164
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());      
164
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());
165 165
      }
... ...
@@ -233,3 +233,3 @@
233 233
    }
234
    
234

	
235 235
    char data[_variant_bits::CTMax<sizeof(First), sizeof(Second)>::value];
... ...
@@ -239,3 +239,3 @@
239 239
  namespace _variant_bits {
240
    
240

	
241 241
    template <int _idx, typename _TypeMap>
... ...
@@ -278,4 +278,4 @@
278 278
    struct Size {
279
      static const int value = 
280
      CTMax<sizeof(typename _TypeMap::template Map<_idx>::Type), 
279
      static const int value =
280
      CTMax<sizeof(typename _TypeMap::template Map<_idx>::Type),
281 281
            Size<_idx - 1, _TypeMap>::value>::value;
... ...
@@ -285,3 +285,3 @@
285 285
    struct Size<0, _TypeMap> {
286
      static const int value = 
286
      static const int value =
287 287
      sizeof(typename _TypeMap::template Map<0>::Type);
... ...
@@ -303,3 +303,3 @@
303 303
  /// \param _TypeMap This class describes the types of the Variant. The
304
  /// _TypeMap::Map<index>::Type should be a valid type for each index 
304
  /// _TypeMap::Map<index>::Type should be a valid type for each index
305 305
  /// in the range {0, 1, ..., _num - 1}. The \c VariantTypeMap is helper
... ...
@@ -339,3 +339,3 @@
339 339
      flag = 0;
340
      new(reinterpret_cast<typename TypeMap::template Map<0>::Type*>(data)) 
340
      new(reinterpret_cast<typename TypeMap::template Map<0>::Type*>(data))
341 341
        typename TypeMap::template Map<0>::Type();
... ...
@@ -380,3 +380,3 @@
380 380
      flag = _idx;
381
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data)) 
381
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data))
382 382
        typename TypeMap::template Map<_idx>::Type();
... ...
@@ -393,3 +393,3 @@
393 393
      flag = _idx;
394
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data)) 
394
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data))
395 395
        typename TypeMap::template Map<_idx>::Type(init);
... ...
@@ -405,3 +405,3 @@
405 405
      return *reinterpret_cast<const typename TypeMap::
406
        template Map<_idx>::Type*>(data); 
406
        template Map<_idx>::Type*>(data);
407 407
    }
... ...
@@ -415,3 +415,3 @@
415 415
      return *reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>
416
        (data); 
416
        (data);
417 417
    }
... ...
@@ -426,3 +426,3 @@
426 426
  private:
427
    
427

	
428 428
    char data[_variant_bits::Size<num - 1, TypeMap>::value];
... ...
@@ -444,3 +444,3 @@
444 444
    struct List {};
445
    
445

	
446 446
    template <typename _Type, typename _List>
... ...
@@ -451,3 +451,3 @@
451 451

	
452
    template <int _idx, typename _T0, typename _T1, typename _T2, 
452
    template <int _idx, typename _T0, typename _T1, typename _T2,
453 453
              typename _T3, typename _T5, typename _T4, typename _T6,
... ...
@@ -468,3 +468,3 @@
468 468
    };
469
    
469

	
470 470
  }
... ...
@@ -477,3 +477,3 @@
477 477
  template <
478
    typename _T0, 
478
    typename _T0,
479 479
    typename _T1 = void, typename _T2 = void, typename _T3 = void,
... ...
@@ -489,3 +489,3 @@
489 489
  };
490
  
490

	
491 491
}
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
... ...
@@ -27,4 +27,3 @@
27 27

	
28
#include<lemon/digraph_adaptor.h>
29
#include<lemon/graph_adaptor.h>
28
#include<lemon/adaptors.h>
30 29

	
... ...
@@ -39,7 +38,7 @@
39 38

	
40
void checkRevDigraphAdaptor() {
41
  checkConcept<concepts::Digraph, RevDigraphAdaptor<concepts::Digraph> >();
39
void checkReverseDigraph() {
40
  checkConcept<concepts::Digraph, ReverseDigraph<concepts::Digraph> >();
42 41

	
43 42
  typedef ListDigraph Digraph;
44
  typedef RevDigraphAdaptor<Digraph> Adaptor;
43
  typedef ReverseDigraph<Digraph> Adaptor;
45 44

	
... ...
@@ -55,3 +54,3 @@
55 54
  Digraph::Arc a3 = digraph.addArc(n2, n3);
56
  
55

	
57 56
  checkGraphNodeList(adaptor, 3);
... ...
@@ -80,5 +79,5 @@
80 79

	
81
void checkSubDigraphAdaptor() {
82
  checkConcept<concepts::Digraph, 
83
    SubDigraphAdaptor<concepts::Digraph, 
80
void checkSubDigraph() {
81
  checkConcept<concepts::Digraph,
82
    SubDigraph<concepts::Digraph,
84 83
    concepts::Digraph::NodeMap<bool>,
... ...
@@ -89,3 +88,3 @@
89 88
  typedef Digraph::ArcMap<bool> ArcFilter;
90
  typedef SubDigraphAdaptor<Digraph, NodeFilter, ArcFilter> Adaptor;
89
  typedef SubDigraph<Digraph, NodeFilter, ArcFilter> Adaptor;
91 90

	
... ...
@@ -125,3 +124,3 @@
125 124

	
126
  arc_filter[a2] = false; 
125
  arc_filter[a2] = false;
127 126

	
... ...
@@ -145,3 +144,3 @@
145 144

	
146
  node_filter[n1] = false; 
145
  node_filter[n1] = false;
147 146

	
... ...
@@ -177,5 +176,5 @@
177 176

	
178
void checkNodeSubDigraphAdaptor() {
179
  checkConcept<concepts::Digraph, 
180
    NodeSubDigraphAdaptor<concepts::Digraph, 
177
void checkFilterNodes1() {
178
  checkConcept<concepts::Digraph,
179
    FilterNodes<concepts::Digraph,
181 180
      concepts::Digraph::NodeMap<bool> > >();
... ...
@@ -184,3 +183,3 @@
184 183
  typedef Digraph::NodeMap<bool> NodeFilter;
185
  typedef NodeSubDigraphAdaptor<Digraph, NodeFilter> Adaptor;
184
  typedef FilterNodes<Digraph, NodeFilter> Adaptor;
186 185

	
... ...
@@ -218,3 +217,3 @@
218 217

	
219
  node_filter[n1] = false; 
218
  node_filter[n1] = false;
220 219

	
... ...
@@ -249,5 +248,5 @@
249 248

	
250
void checkArcSubDigraphAdaptor() {
251
  checkConcept<concepts::Digraph, 
252
    ArcSubDigraphAdaptor<concepts::Digraph, 
249
void checkFilterArcs() {
250
  checkConcept<concepts::Digraph,
251
    FilterArcs<concepts::Digraph,
253 252
    concepts::Digraph::ArcMap<bool> > >();
... ...
@@ -256,3 +255,3 @@
256 255
  typedef Digraph::ArcMap<bool> ArcFilter;
257
  typedef ArcSubDigraphAdaptor<Digraph, ArcFilter> Adaptor;
256
  typedef FilterArcs<Digraph, ArcFilter> Adaptor;
258 257

	
... ...
@@ -290,3 +289,3 @@
290 289

	
291
  arc_filter[a2] = false; 
290
  arc_filter[a2] = false;
292 291

	
... ...
@@ -323,7 +322,7 @@
323 322

	
324
void checkUndirDigraphAdaptor() {
325
  checkConcept<concepts::Graph, UndirDigraphAdaptor<concepts::Digraph> >();
323
void checkUndirector() {
324
  checkConcept<concepts::Graph, Undirector<concepts::Digraph> >();
326 325

	
327 326
  typedef ListDigraph Digraph;
328
  typedef UndirDigraphAdaptor<Digraph> Adaptor;
327
  typedef Undirector<Digraph> Adaptor;
329 328

	
... ...
@@ -339,3 +338,3 @@
339 338
  Digraph::Arc a3 = digraph.addArc(n2, n3);
340
  
339

	
341 340
  checkGraphNodeList(adaptor, 3);
... ...
@@ -373,6 +372,6 @@
373 372

	
374
void checkResDigraphAdaptor() {
375
  checkConcept<concepts::Digraph, 
376
    ResDigraphAdaptor<concepts::Digraph, 
377
    concepts::Digraph::ArcMap<int>, 
373
void checkResidual() {
374
  checkConcept<concepts::Digraph,
375
    Residual<concepts::Digraph,
376
    concepts::Digraph::ArcMap<int>,
378 377
    concepts::Digraph::ArcMap<int> > >();
... ...
@@ -381,3 +380,3 @@
381 380
  typedef Digraph::ArcMap<int> IntArcMap;
382
  typedef ResDigraphAdaptor<Digraph, IntArcMap> Adaptor;
381
  typedef Residual<Digraph, IntArcMap> Adaptor;
383 382

	
... ...
@@ -409,3 +408,3 @@
409 408
  }
410
  
409

	
411 410
  checkGraphNodeList(adaptor, 4);
... ...
@@ -427,3 +426,3 @@
427 426
  }
428
  
427

	
429 428
  checkGraphNodeList(adaptor, 4);
... ...
@@ -451,3 +450,3 @@
451 450
  }
452
  
451

	
453 452
  checkGraphNodeList(adaptor, 4);
... ...
@@ -472,6 +471,6 @@
472 471
  while (true) {
473
    
472

	
474 473
    Bfs<Adaptor> bfs(adaptor);
475 474
    bfs.run(n1, n4);
476
    
475

	
477 476
    if (!bfs.reached(n4)) break;
... ...
@@ -479,6 +478,7 @@
479 478
    Path<Adaptor> p = bfs.path(n4);
480
    
479

	
481 480
    int min = std::numeric_limits<int>::max();
482 481
    for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
483
      if (adaptor.rescap(a) < min) min = adaptor.rescap(a);
482
      if (adaptor.residualCapacity(a) < min)
483
        min = adaptor.residualCapacity(a);
484 484
    }
... ...
@@ -495,7 +495,7 @@
495 495

	
496
void checkSplitDigraphAdaptor() {
497
  checkConcept<concepts::Digraph, SplitDigraphAdaptor<concepts::Digraph> >();
496
void checkSplitNodes() {
497
  checkConcept<concepts::Digraph, SplitNodes<concepts::Digraph> >();
498 498

	
499 499
  typedef ListDigraph Digraph;
500
  typedef SplitDigraphAdaptor<Digraph> Adaptor;
500
  typedef SplitNodes<Digraph> Adaptor;
501 501

	
... ...
@@ -511,3 +511,3 @@
511 511
  Digraph::Arc a3 = digraph.addArc(n2, n3);
512
  
512

	
513 513
  checkGraphNodeList(adaptor, 6);
... ...
@@ -532,3 +532,3 @@
532 532
  checkArcIds(adaptor);
533
  
533

	
534 534
  checkGraphNodeMap(adaptor);
... ...
@@ -539,6 +539,6 @@
539 539
      Digraph::Arc oa = a;
540
      check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)), 
541
	    "Wrong split");
542
      check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)), 
543
	    "Wrong split"); 
540
      check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)),
541
            "Wrong split");
542
      check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)),
543
            "Wrong split");
544 544
    } else {
... ...
@@ -551,5 +551,5 @@
551 551

	
552
void checkSubGraphAdaptor() {
553
  checkConcept<concepts::Graph, 
554
    SubGraphAdaptor<concepts::Graph, 
552
void checkSubGraph() {
553
  checkConcept<concepts::Graph,
554
    SubGraph<concepts::Graph,
555 555
    concepts::Graph::NodeMap<bool>,
... ...
@@ -560,3 +560,3 @@
560 560
  typedef Graph::EdgeMap<bool> EdgeFilter;
561
  typedef SubGraphAdaptor<Graph, NodeFilter, EdgeFilter> Adaptor;
561
  typedef SubGraph<Graph, NodeFilter, EdgeFilter> Adaptor;
562 562

	
... ...
@@ -609,3 +609,3 @@
609 609

	
610
  edge_filter[e2] = false; 
610
  edge_filter[e2] = false;
611 611

	
... ...
@@ -640,3 +640,3 @@
640 640

	
641
  node_filter[n1] = false; 
641
  node_filter[n1] = false;
642 642

	
... ...
@@ -686,5 +686,5 @@
686 686

	
687
void checkNodeSubGraphAdaptor() {
688
  checkConcept<concepts::Graph, 
689
    NodeSubGraphAdaptor<concepts::Graph, 
687
void checkFilterNodes2() {
688
  checkConcept<concepts::Graph,
689
    FilterNodes<concepts::Graph,
690 690
      concepts::Graph::NodeMap<bool> > >();
... ...
@@ -693,3 +693,3 @@
693 693
  typedef Graph::NodeMap<bool> NodeFilter;
694
  typedef NodeSubGraphAdaptor<Graph, NodeFilter> Adaptor;
694
  typedef FilterNodes<Graph, NodeFilter> Adaptor;
695 695

	
... ...
@@ -740,3 +740,3 @@
740 740

	
741
  node_filter[n1] = false; 
741
  node_filter[n1] = false;
742 742

	
... ...
@@ -785,5 +785,5 @@
785 785

	
786
void checkEdgeSubGraphAdaptor() {
787
  checkConcept<concepts::Graph, 
788
    EdgeSubGraphAdaptor<concepts::Graph, 
786
void checkFilterEdges() {
787
  checkConcept<concepts::Graph,
788
    FilterEdges<concepts::Graph,
789 789
    concepts::Graph::EdgeMap<bool> > >();
... ...
@@ -792,3 +792,3 @@
792 792
  typedef Graph::EdgeMap<bool> EdgeFilter;
793
  typedef EdgeSubGraphAdaptor<Graph, EdgeFilter> Adaptor;
793
  typedef FilterEdges<Graph, EdgeFilter> Adaptor;
794 794

	
... ...
@@ -839,3 +839,3 @@
839 839

	
840
  edge_filter[e2] = false; 
840
  edge_filter[e2] = false;
841 841

	
... ...
@@ -887,5 +887,5 @@
887 887

	
888
void checkDirGraphAdaptor() {
889
  checkConcept<concepts::Digraph, 
890
    DirGraphAdaptor<concepts::Graph, concepts::Graph::EdgeMap<bool> > >();
888
void checkOrienter() {
889
  checkConcept<concepts::Digraph,
890
    Orienter<concepts::Graph, concepts::Graph::EdgeMap<bool> > >();
891 891

	
... ...
@@ -893,3 +893,3 @@
893 893
  typedef ListGraph::EdgeMap<bool> DirMap;
894
  typedef DirGraphAdaptor<Graph> Adaptor;
894
  typedef Orienter<Graph> Adaptor;
895 895

	
... ...
@@ -906,3 +906,3 @@
906 906
  Graph::Edge e3 = graph.addEdge(n2, n3);
907
  
907

	
908 908
  checkGraphNodeList(adaptor, 3);
... ...
@@ -910,3 +910,3 @@
910 910
  checkGraphConArcList(adaptor, 3);
911
  
911

	
912 912
  {
... ...
@@ -915,3 +915,3 @@
915 915
    Adaptor::Node v = adaptor.target(e1);
916
    
916

	
917 917
    dir[e1] = false;
... ...
@@ -928,3 +928,3 @@
928 928
    Adaptor::Node v = adaptor.target(e2);
929
    
929

	
930 930
    dir[e2] = false;
... ...
@@ -941,3 +941,3 @@
941 941
    Adaptor::Node v = adaptor.target(e3);
942
    
942

	
943 943
    dir[e3] = false;
... ...
@@ -969,14 +969,14 @@
969 969

	
970
  checkRevDigraphAdaptor();
971
  checkSubDigraphAdaptor();
972
  checkNodeSubDigraphAdaptor();
973
  checkArcSubDigraphAdaptor();
974
  checkUndirDigraphAdaptor();
975
  checkResDigraphAdaptor();
976
  checkSplitDigraphAdaptor();
970
  checkReverseDigraph();
971
  checkSubDigraph();
972
  checkFilterNodes1();
973
  checkFilterArcs();
974
  checkUndirector();
975
  checkResidual();
976
  checkSplitNodes();
977 977

	
978
  checkSubGraphAdaptor();
979
  checkNodeSubGraphAdaptor();
980
  checkEdgeSubGraphAdaptor();
981
  checkDirGraphAdaptor();
978
  checkSubGraph();
979
  checkFilterNodes2();
980
  checkFilterEdges();
981
  checkOrienter();
982 982

	
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_GRAPH_ADAPTOR_H
20
#define LEMON_GRAPH_ADAPTOR_H
21

	
22
///\ingroup graph_adaptors
23
///\file
24
///\brief Several graph adaptors.
25
///
26
///This file contains several useful undirected graph adaptor classes.
27

	
28
#include <lemon/core.h>
29
#include <lemon/maps.h>
30
#include <lemon/bits/graph_adaptor_extender.h>
31

	
32
namespace lemon {
33

	
34
  template<typename _Graph>
35
  class GraphAdaptorBase {
36
  public:
37
    typedef _Graph Graph;
38
    typedef Graph ParentGraph;
39

	
40
  protected:
41
    Graph* _graph;
42

	
43
    GraphAdaptorBase() : _graph(0) {}
44

	
45
    void setGraph(Graph& graph) { _graph = &graph; }
46

	
47
  public:
48
    GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
49
 
50
    typedef typename Graph::Node Node;
51
    typedef typename Graph::Arc Arc;
52
    typedef typename Graph::Edge Edge;
53
   
54
    void first(Node& i) const { _graph->first(i); }
55
    void first(Arc& i) const { _graph->first(i); }
56
    void first(Edge& i) const { _graph->first(i); }
57
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
58
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
59
    void firstInc(Edge &i, bool &d, const Node &n) const {
60
      _graph->firstInc(i, d, n);
61
    }
62

	
63
    void next(Node& i) const { _graph->next(i); }
64
    void next(Arc& i) const { _graph->next(i); }
65
    void next(Edge& i) const { _graph->next(i); }
66
    void nextIn(Arc& i) const { _graph->nextIn(i); }
67
    void nextOut(Arc& i) const { _graph->nextOut(i); }
68
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
69

	
70
    Node u(const Edge& e) const { return _graph->u(e); }
71
    Node v(const Edge& e) const { return _graph->v(e); }
72

	
73
    Node source(const Arc& a) const { return _graph->source(a); }
74
    Node target(const Arc& a) const { return _graph->target(a); }
75

	
76
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
77
    int nodeNum() const { return _graph->nodeNum(); }
78
    
79
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
80
    int arcNum() const { return _graph->arcNum(); }
81
    int edgeNum() const { return _graph->edgeNum(); }
82

	
83
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
84
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
85
      return _graph->findArc(u, v, prev);
86
    }
87
    Edge findEdge(const Node& u, const Node& v, const Edge& prev = INVALID) {
88
      return _graph->findEdge(u, v, prev);
89
    }
90
  
91
    Node addNode() { return _graph->addNode(); }
92
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
93

	
94
    void erase(const Node& i) { _graph->erase(i); }
95
    void erase(const Edge& i) { _graph->erase(i); }
96
  
97
    void clear() { _graph->clear(); }
98
    
99
    bool direction(const Arc& a) const { return _graph->direction(a); }
100
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
101

	
102
    int id(const Node& v) const { return _graph->id(v); }
103
    int id(const Arc& a) const { return _graph->id(a); }
104
    int id(const Edge& e) const { return _graph->id(e); }
105

	
106
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
107
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
108
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
109

	
110
    int maxNodeId() const { return _graph->maxNodeId(); }
111
    int maxArcId() const { return _graph->maxArcId(); }
112
    int maxEdgeId() const { return _graph->maxEdgeId(); }
113

	
114
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
115
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } 
116

	
117
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
118
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } 
119

	
120
    typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
121
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); } 
122

	
123
    template <typename _Value>
124
    class NodeMap : public Graph::template NodeMap<_Value> {
125
    public:
126
      typedef typename Graph::template NodeMap<_Value> Parent;
127
      explicit NodeMap(const GraphAdaptorBase<Graph>& adapter) 
128
	: Parent(*adapter._graph) {}
129
      NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
130
	: Parent(*adapter._graph, value) {}
131

	
132
    private:
133
      NodeMap& operator=(const NodeMap& cmap) {
134
	return operator=<NodeMap>(cmap);
135
      }
136

	
137
      template <typename CMap>
138
      NodeMap& operator=(const CMap& cmap) {
139
        Parent::operator=(cmap);
140
        return *this;
141
      }
142
      
143
    };
144

	
145
    template <typename _Value>
146
    class ArcMap : public Graph::template ArcMap<_Value> {
147
    public:
148
      typedef typename Graph::template ArcMap<_Value> Parent;
149
      explicit ArcMap(const GraphAdaptorBase<Graph>& adapter) 
150
	: Parent(*adapter._graph) {}
151
      ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
152
	: Parent(*adapter._graph, value) {}
153

	
154
    private:
155
      ArcMap& operator=(const ArcMap& cmap) {
156
	return operator=<ArcMap>(cmap);
157
      }
158

	
159
      template <typename CMap>
160
      ArcMap& operator=(const CMap& cmap) {
161
        Parent::operator=(cmap);
162
	return *this;
163
      }
164
    };
165

	
166
    template <typename _Value>
167
    class EdgeMap : public Graph::template EdgeMap<_Value> {
168
    public:
169
      typedef typename Graph::template EdgeMap<_Value> Parent;
170
      explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter) 
171
	: Parent(*adapter._graph) {}
172
      EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
173
	: Parent(*adapter._graph, value) {}
174

	
175
    private:
176
      EdgeMap& operator=(const EdgeMap& cmap) {
177
	return operator=<EdgeMap>(cmap);
178
      }
179

	
180
      template <typename CMap>
181
      EdgeMap& operator=(const CMap& cmap) {
182
        Parent::operator=(cmap);
183
        return *this;
184
      }
185
    };
186

	
187
  };
188

	
189
  template <typename _Graph, typename NodeFilterMap, 
190
	    typename EdgeFilterMap, bool checked = true>
191
  class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
192
  public:
193
    typedef _Graph Graph;
194
    typedef SubGraphAdaptorBase Adaptor;
195
    typedef GraphAdaptorBase<_Graph> Parent;
196
  protected:
197

	
198
    NodeFilterMap* _node_filter_map;
199
    EdgeFilterMap* _edge_filter_map;
200

	
201
    SubGraphAdaptorBase() 
202
      : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
203

	
204
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
205
      _node_filter_map=&node_filter_map;
206
    }
207
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
208
      _edge_filter_map=&edge_filter_map;
209
    }
210

	
211
  public:
212

	
213
    typedef typename Parent::Node Node;
214
    typedef typename Parent::Arc Arc;
215
    typedef typename Parent::Edge Edge;
216

	
217
    void first(Node& i) const { 
218
      Parent::first(i); 
219
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
220
    }
221

	
222
    void first(Arc& i) const { 
223
      Parent::first(i); 
224
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
225
	     || !(*_node_filter_map)[Parent::source(i)]
226
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); 
227
    }
228

	
229
    void first(Edge& i) const { 
230
      Parent::first(i); 
231
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
232
	     || !(*_node_filter_map)[Parent::u(i)]
233
	     || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); 
234
    }
235

	
236
    void firstIn(Arc& i, const Node& n) const { 
237
      Parent::firstIn(i, n); 
238
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
239
	     || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
240
    }
241

	
242
    void firstOut(Arc& i, const Node& n) const { 
243
      Parent::firstOut(i, n); 
244
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
245
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
246
    }
247

	
248
    void firstInc(Edge& i, bool& d, const Node& n) const { 
249
      Parent::firstInc(i, d, n); 
250
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
251
            || !(*_node_filter_map)[Parent::u(i)]
252
            || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); 
253
    }
254

	
255
    void next(Node& i) const { 
256
      Parent::next(i); 
257
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
258
    }
259

	
260
    void next(Arc& i) const { 
261
      Parent::next(i); 
262
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
263
	     || !(*_node_filter_map)[Parent::source(i)]
264
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::next(i); 
265
    }
266

	
267
    void next(Edge& i) const { 
268
      Parent::next(i); 
269
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
270
	     || !(*_node_filter_map)[Parent::u(i)]
271
	     || !(*_node_filter_map)[Parent::v(i)])) Parent::next(i); 
272
    }
273

	
274
    void nextIn(Arc& i) const { 
275
      Parent::nextIn(i); 
276
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
277
	     || !(*_node_filter_map)[Parent::source(i)])) Parent::nextIn(i); 
278
    }
279

	
280
    void nextOut(Arc& i) const { 
281
      Parent::nextOut(i); 
282
      while (i!=INVALID && (!(*_edge_filter_map)[i] 
283
	     || !(*_node_filter_map)[Parent::target(i)])) Parent::nextOut(i); 
284
    }
285

	
286
    void nextInc(Edge& i, bool& d) const { 
287
      Parent::nextInc(i, d); 
288
      while (i!=INVALID && (!(*_edge_filter_map)[i]
289
            || !(*_node_filter_map)[Parent::u(i)]
290
            || !(*_node_filter_map)[Parent::v(i)])) Parent::nextInc(i, d); 
291
    }
292

	
293
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
294
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
295

	
296
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
297
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
298

	
299
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
300
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
301

	
302
    typedef False NodeNumTag;
303
    typedef False EdgeNumTag;
304

	
305
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
306
    Arc findArc(const Node& u, const Node& v, 
307
		  const Arc& prev = INVALID) {
308
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
309
        return INVALID;
310
      }
311
      Arc arc = Parent::findArc(u, v, prev);
312
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
313
        arc = Parent::findArc(u, v, arc);
314
      }
315
      return arc;
316
    }
317
    Edge findEdge(const Node& u, const Node& v, 
318
		  const Edge& prev = INVALID) {
319
      if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
320
        return INVALID;
321
      }
322
      Edge edge = Parent::findEdge(u, v, prev);
323
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
324
        edge = Parent::findEdge(u, v, edge);
325
      }
326
      return edge;
327
    }
328

	
329
    template <typename _Value>
330
    class NodeMap : public SubMapExtender<Adaptor, 
331
        typename Parent::template NodeMap<_Value> > {
332
    public:
333
      typedef _Value Value;
334
      typedef SubMapExtender<Adaptor, typename Parent::
335
                             template NodeMap<Value> > MapParent;
336
    
337
      NodeMap(const Adaptor& adaptor) 
338
	: MapParent(adaptor) {}
339
      NodeMap(const Adaptor& adaptor, const Value& value) 
340
	: MapParent(adaptor, value) {}
341

	
342
    private:
343
      NodeMap& operator=(const NodeMap& cmap) {
344
	return operator=<NodeMap>(cmap);
345
      }
346
    
347
      template <typename CMap>
348
      NodeMap& operator=(const CMap& cmap) {
349
        MapParent::operator=(cmap);
350
	return *this;
351
      }
352
    };
353

	
354
    template <typename _Value>
355
    class ArcMap : public SubMapExtender<Adaptor, 
356
	typename Parent::template ArcMap<_Value> > {
357
    public:
358
      typedef _Value Value;
359
      typedef SubMapExtender<Adaptor, typename Parent::
360
                             template ArcMap<Value> > MapParent;
361
    
362
      ArcMap(const Adaptor& adaptor) 
363
	: MapParent(adaptor) {}
364
      ArcMap(const Adaptor& adaptor, const Value& value) 
365
	: MapParent(adaptor, value) {}
366

	
367
    private:
368
      ArcMap& operator=(const ArcMap& cmap) {
369
	return operator=<ArcMap>(cmap);
370
      }
371
    
372
      template <typename CMap>
373
      ArcMap& operator=(const CMap& cmap) {
374
        MapParent::operator=(cmap);
375
	return *this;
376
      }
377
    };
378

	
379
    template <typename _Value>
380
    class EdgeMap : public SubMapExtender<Adaptor, 
381
        typename Parent::template EdgeMap<_Value> > {
382
    public:
383
      typedef _Value Value;
384
      typedef SubMapExtender<Adaptor, typename Parent::
385
                             template EdgeMap<Value> > MapParent;
386
    
387
      EdgeMap(const Adaptor& adaptor) 
388
	: MapParent(adaptor) {}
389

	
390
      EdgeMap(const Adaptor& adaptor, const Value& value) 
391
	: MapParent(adaptor, value) {}
392

	
393
    private:
394
      EdgeMap& operator=(const EdgeMap& cmap) {
395
	return operator=<EdgeMap>(cmap);
396
      }
397
    
398
      template <typename CMap>
399
      EdgeMap& operator=(const CMap& cmap) {
400
        MapParent::operator=(cmap);
401
	return *this;
402
      }
403
    };
404

	
405
  };
406

	
407
  template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
408
  class SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, false> 
409
    : public GraphAdaptorBase<_Graph> {
410
  public:
411
    typedef _Graph Graph;
412
    typedef SubGraphAdaptorBase Adaptor;
413
    typedef GraphAdaptorBase<_Graph> Parent;
414
  protected:
415
    NodeFilterMap* _node_filter_map;
416
    EdgeFilterMap* _edge_filter_map;
417
    SubGraphAdaptorBase() : Parent(), 
418
			    _node_filter_map(0), _edge_filter_map(0) { }
419

	
420
    void setNodeFilterMap(NodeFilterMap& node_filter_map) {
421
      _node_filter_map=&node_filter_map;
422
    }
423
    void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
424
      _edge_filter_map=&edge_filter_map;
425
    }
426

	
427
  public:
428

	
429
    typedef typename Parent::Node Node;
430
    typedef typename Parent::Arc Arc;
431
    typedef typename Parent::Edge Edge;
432

	
433
    void first(Node& i) const { 
434
      Parent::first(i); 
435
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
436
    }
437

	
438
    void first(Arc& i) const { 
439
      Parent::first(i); 
440
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
441
    }
442

	
443
    void first(Edge& i) const { 
444
      Parent::first(i); 
445
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
446
    }
447

	
448
    void firstIn(Arc& i, const Node& n) const { 
449
      Parent::firstIn(i, n); 
450
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); 
451
    }
452

	
453
    void firstOut(Arc& i, const Node& n) const { 
454
      Parent::firstOut(i, n); 
455
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); 
456
    }
457

	
458
    void firstInc(Edge& i, bool& d, const Node& n) const { 
459
      Parent::firstInc(i, d, n); 
460
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); 
461
    }
462

	
463
    void next(Node& i) const { 
464
      Parent::next(i); 
465
      while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i); 
466
    }
467
    void next(Arc& i) const { 
468
      Parent::next(i); 
469
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
470
    }
471
    void next(Edge& i) const { 
472
      Parent::next(i); 
473
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i); 
474
    }
475
    void nextIn(Arc& i) const { 
476
      Parent::nextIn(i); 
477
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i); 
478
    }
479

	
480
    void nextOut(Arc& i) const { 
481
      Parent::nextOut(i); 
482
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); 
483
    }
484
    void nextInc(Edge& i, bool& d) const { 
485
      Parent::nextInc(i, d); 
486
      while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); 
487
    }
488

	
489
    void hide(const Node& n) const { _node_filter_map->set(n, false); }
490
    void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
491

	
492
    void unHide(const Node& n) const { _node_filter_map->set(n, true); }
493
    void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
494

	
495
    bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
496
    bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
497

	
498
    typedef False NodeNumTag;
499
    typedef False EdgeNumTag;
500

	
501
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
502
    Arc findArc(const Node& u, const Node& v, 
503
		  const Arc& prev = INVALID) {
504
      Arc arc = Parent::findArc(u, v, prev);
505
      while (arc != INVALID && !(*_edge_filter_map)[arc]) {
506
        arc = Parent::findArc(u, v, arc);
507
      }
508
      return arc;
509
    }
510
    Edge findEdge(const Node& u, const Node& v, 
511
		  const Edge& prev = INVALID) {
512
      Edge edge = Parent::findEdge(u, v, prev);
513
      while (edge != INVALID && !(*_edge_filter_map)[edge]) {
514
        edge = Parent::findEdge(u, v, edge);
515
      }
516
      return edge;
517
    }
518

	
519
    template <typename _Value>
520
    class NodeMap : public SubMapExtender<Adaptor, 
521
        typename Parent::template NodeMap<_Value> > {
522
    public:
523
      typedef _Value Value;
524
      typedef SubMapExtender<Adaptor, typename Parent::
525
                             template NodeMap<Value> > MapParent;
526
    
527
      NodeMap(const Adaptor& adaptor) 
528
	: MapParent(adaptor) {}
529
      NodeMap(const Adaptor& adaptor, const Value& value) 
530
	: MapParent(adaptor, value) {}
531
    
532
    private:
533
      NodeMap& operator=(const NodeMap& cmap) {
534
	return operator=<NodeMap>(cmap);
535
      }
536
    
537
      template <typename CMap>
538
      NodeMap& operator=(const CMap& cmap) {
539
        MapParent::operator=(cmap);
540
	return *this;
541
      }
542
    };
543

	
544
    template <typename _Value>
545
    class ArcMap : public SubMapExtender<Adaptor, 
546
	typename Parent::template ArcMap<_Value> > {
547
    public:
548
      typedef _Value Value;
549
      typedef SubMapExtender<Adaptor, typename Parent::
550
                             template ArcMap<Value> > MapParent;
551
    
552
      ArcMap(const Adaptor& adaptor) 
553
	: MapParent(adaptor) {}
554
      ArcMap(const Adaptor& adaptor, const Value& value) 
555
	: MapParent(adaptor, value) {}
556

	
557
    private:
558
      ArcMap& operator=(const ArcMap& cmap) {
559
	return operator=<ArcMap>(cmap);
560
      }
561
    
562
      template <typename CMap>
563
      ArcMap& operator=(const CMap& cmap) {
564
        MapParent::operator=(cmap);
565
	return *this;
566
      }
567
    };
568

	
569
    template <typename _Value>
570
    class EdgeMap : public SubMapExtender<Adaptor, 
571
        typename Parent::template EdgeMap<_Value> > {
572
    public:
573
      typedef _Value Value;
574
      typedef SubMapExtender<Adaptor, typename Parent::
575
                             template EdgeMap<Value> > MapParent;
576
    
577
      EdgeMap(const Adaptor& adaptor) 
578
	: MapParent(adaptor) {}
579

	
580
      EdgeMap(const Adaptor& adaptor, const _Value& value) 
581
	: MapParent(adaptor, value) {}
582

	
583
    private:
584
      EdgeMap& operator=(const EdgeMap& cmap) {
585
	return operator=<EdgeMap>(cmap);
586
      }
587
    
588
      template <typename CMap>
589
      EdgeMap& operator=(const CMap& cmap) {
590
        MapParent::operator=(cmap);
591
	return *this;
592
      }
593
    };
594

	
595
  };
596

	
597
  /// \ingroup graph_adaptors
598
  ///
599
  /// \brief A graph adaptor for hiding nodes and edges from an
600
  /// undirected graph.
601
  /// 
602
  /// SubGraphAdaptor shows the graph with filtered node-set and
603
  /// edge-set. If the \c checked parameter is true then it filters
604
  /// the edge-set to do not get invalid edges which incident node is
605
  /// filtered.
606
  /// 
607
  /// If the \c checked template parameter is false then we have to
608
  /// note that the node-iterator cares only the filter on the
609
  /// node-set, and the edge-iterator cares only the filter on the
610
  /// edge-set.  This way the edge-map should filter all arcs which
611
  /// has filtered end node.
612
  template<typename _Graph, typename NodeFilterMap, 
613
	   typename EdgeFilterMap, bool checked = true>
614
  class SubGraphAdaptor : 
615
    public GraphAdaptorExtender<
616
    SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
617
  public:
618
    typedef _Graph Graph;
619
    typedef GraphAdaptorExtender<
620
      SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
621

	
622
    typedef typename Parent::Node Node;
623
    typedef typename Parent::Edge Edge;
624

	
625
  protected:
626
    SubGraphAdaptor() { }
627
  public:
628
    
629
    /// \brief Constructor
630
    ///
631
    /// Creates a sub-graph-adaptor for the given graph with
632
    /// given node and edge map filters.
633
    SubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map, 
634
		    EdgeFilterMap& edge_filter_map) { 
635
      setGraph(_graph);
636
      setNodeFilterMap(node_filter_map);
637
      setEdgeFilterMap(edge_filter_map);
638
    }
639

	
640
    /// \brief Hides the node of the graph
641
    ///
642
    /// This function hides \c n in the digraph, i.e. the iteration 
643
    /// jumps over it. This is done by simply setting the value of \c n  
644
    /// to be false in the corresponding node-map.
645
    void hide(const Node& n) const { Parent::hide(n); }
646

	
647
    /// \brief Hides the edge of the graph
648
    ///
649
    /// This function hides \c e in the digraph, i.e. the iteration 
650
    /// jumps over it. This is done by simply setting the value of \c e
651
    /// to be false in the corresponding edge-map.
652
    void hide(const Edge& e) const { Parent::hide(e); }
653

	
654
    /// \brief Unhides the node of the graph
655
    ///
656
    /// The value of \c n is set to be true in the node-map which stores 
657
    /// hide information. If \c n was hidden previuosly, then it is shown 
658
    /// again
659
    void unHide(const Node& n) const { Parent::unHide(n); }
660

	
661
    /// \brief Unhides the edge of the graph
662
    ///
663
    /// The value of \c e is set to be true in the edge-map which stores 
664
    /// hide information. If \c e was hidden previuosly, then it is shown 
665
    /// again
666
    void unHide(const Edge& e) const { Parent::unHide(e); }
667

	
668
    /// \brief Returns true if \c n is hidden.
669
    ///
670
    /// Returns true if \c n is hidden.
671
    ///
672
    bool hidden(const Node& n) const { return Parent::hidden(n); }
673

	
674
    /// \brief Returns true if \c e is hidden.
675
    ///
676
    /// Returns true if \c e is hidden.
677
    ///
678
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
679
  };
680

	
681
  /// \brief Just gives back a sub-graph adaptor
682
  ///
683
  /// Just gives back a sub-graph adaptor
684
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
685
  SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
686
  subGraphAdaptor(const Graph& graph, 
687
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
688
    return SubGraphAdaptor<const Graph, NodeFilterMap, ArcFilterMap>
689
      (graph, nfm, efm);
690
  }
691

	
692
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
693
  SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap>
694
  subGraphAdaptor(const Graph& graph, 
695
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
696
    return SubGraphAdaptor<const Graph, const NodeFilterMap, ArcFilterMap>
697
      (graph, nfm, efm);
698
  }
699

	
700
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
701
  SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap>
702
  subGraphAdaptor(const Graph& graph, 
703
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
704
    return SubGraphAdaptor<const Graph, NodeFilterMap, const ArcFilterMap>
705
      (graph, nfm, efm);
706
  }
707

	
708
  template<typename Graph, typename NodeFilterMap, typename ArcFilterMap>
709
  SubGraphAdaptor<const Graph, const NodeFilterMap, const ArcFilterMap>
710
  subGraphAdaptor(const Graph& graph, 
711
                   NodeFilterMap& nfm, ArcFilterMap& efm) {
712
    return SubGraphAdaptor<const Graph, const NodeFilterMap, 
713
      const ArcFilterMap>(graph, nfm, efm);
714
  }
715

	
716
  /// \ingroup graph_adaptors
717
  ///
718
  /// \brief An adaptor for hiding nodes from an graph.
719
  ///
720
  /// An adaptor for hiding nodes from an graph.  This
721
  /// adaptor specializes SubGraphAdaptor in the way that only the
722
  /// node-set can be filtered. In usual case the checked parameter is
723
  /// true, we get the induced subgraph. But if the checked parameter
724
  /// is false then we can filter only isolated nodes.
725
  template<typename _Graph, typename _NodeFilterMap, bool checked = true>
726
  class NodeSubGraphAdaptor : 
727
    public SubGraphAdaptor<_Graph, _NodeFilterMap, 
728
			   ConstMap<typename _Graph::Edge, bool>, checked> {
729
  public:
730
    typedef _Graph Graph;
731
    typedef _NodeFilterMap NodeFilterMap;
732
    typedef SubGraphAdaptor<Graph, NodeFilterMap, 
733
			    ConstMap<typename Graph::Edge, bool> > Parent;
734

	
735
    typedef typename Parent::Node Node;
736
  protected:
737
    ConstMap<typename Graph::Edge, bool> const_true_map;
738

	
739
    NodeSubGraphAdaptor() : const_true_map(true) {
740
      Parent::setEdgeFilterMap(const_true_map);
741
    }
742

	
743
  public:
744

	
745
    /// \brief Constructor
746
    ///
747
    /// Creates a node-sub-graph-adaptor for the given graph with
748
    /// given node map filters.
749
    NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& node_filter_map) : 
750
      Parent(), const_true_map(true) { 
751
      Parent::setGraph(_graph);
752
      Parent::setNodeFilterMap(node_filter_map);
753
      Parent::setEdgeFilterMap(const_true_map);
754
    }
755

	
756
    /// \brief Hides the node of the graph
757
    ///
758
    /// This function hides \c n in the digraph, i.e. the iteration 
759
    /// jumps over it. This is done by simply setting the value of \c n  
760
    /// to be false in the corresponding node-map.
761
    void hide(const Node& n) const { Parent::hide(n); }
762

	
763
    /// \brief Unhides the node of the graph
764
    ///
765
    /// The value of \c n is set to be true in the node-map which stores 
766
    /// hide information. If \c n was hidden previuosly, then it is shown 
767
    /// again
768
    void unHide(const Node& n) const { Parent::unHide(n); }
769

	
770
    /// \brief Returns true if \c n is hidden.
771
    ///
772
    /// Returns true if \c n is hidden.
773
    ///
774
    bool hidden(const Node& n) const { return Parent::hidden(n); }
775

	
776
  };
777

	
778
  /// \brief Just gives back a node-sub-graph adaptor
779
  ///
780
  /// Just gives back a node-sub-graph adaptor
781
  template<typename Graph, typename NodeFilterMap>
782
  NodeSubGraphAdaptor<const Graph, NodeFilterMap>
783
  nodeSubGraphAdaptor(const Graph& graph, NodeFilterMap& nfm) {
784
    return NodeSubGraphAdaptor<const Graph, NodeFilterMap>(graph, nfm);
785
  }
786

	
787
  template<typename Graph, typename NodeFilterMap>
788
  NodeSubGraphAdaptor<const Graph, const NodeFilterMap>
789
  nodeSubGraphAdaptor(const Graph& graph, const NodeFilterMap& nfm) {
790
    return NodeSubGraphAdaptor<const Graph, const NodeFilterMap>(graph, nfm);
791
  }
792

	
793
  /// \ingroup graph_adaptors
794
  ///
795
  /// \brief An adaptor for hiding edges from an graph.
796
  ///
797
  /// \warning Graph adaptors are in even more experimental state
798
  /// than the other parts of the lib. Use them at you own risk.
799
  ///
800
  /// An adaptor for hiding edges from an graph.
801
  /// This adaptor specializes SubGraphAdaptor in the way that
802
  /// only the arc-set 
803
  /// can be filtered.
804
  template<typename _Graph, typename _EdgeFilterMap>
805
  class EdgeSubGraphAdaptor : 
806
    public SubGraphAdaptor<_Graph, ConstMap<typename _Graph::Node,bool>, 
807
                           _EdgeFilterMap, false> {
808
  public:
809
    typedef _Graph Graph;
810
    typedef _EdgeFilterMap EdgeFilterMap;
811
    typedef SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, 
812
			    EdgeFilterMap, false> Parent;
813
    typedef typename Parent::Edge Edge;
814
  protected:
815
    ConstMap<typename Graph::Node, bool> const_true_map;
816

	
817
    EdgeSubGraphAdaptor() : const_true_map(true) {
818
      Parent::setNodeFilterMap(const_true_map);
819
    }
820

	
821
  public:
822

	
823
    /// \brief Constructor
824
    ///
825
    /// Creates a edge-sub-graph-adaptor for the given graph with
826
    /// given node map filters.
827
    EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& edge_filter_map) : 
828
      Parent(), const_true_map(true) { 
829
      Parent::setGraph(_graph);
830
      Parent::setNodeFilterMap(const_true_map);
831
      Parent::setEdgeFilterMap(edge_filter_map);
832
    }
833

	
834
    /// \brief Hides the edge of the graph
835
    ///
836
    /// This function hides \c e in the digraph, i.e. the iteration 
837
    /// jumps over it. This is done by simply setting the value of \c e
838
    /// to be false in the corresponding edge-map.
839
    void hide(const Edge& e) const { Parent::hide(e); }
840

	
841
    /// \brief Unhides the edge of the graph
842
    ///
843
    /// The value of \c e is set to be true in the edge-map which stores 
844
    /// hide information. If \c e was hidden previuosly, then it is shown 
845
    /// again
846
    void unHide(const Edge& e) const { Parent::unHide(e); }
847

	
848
    /// \brief Returns true if \c e is hidden.
849
    ///
850
    /// Returns true if \c e is hidden.
851
    ///
852
    bool hidden(const Edge& e) const { return Parent::hidden(e); }
853

	
854
  };
855

	
856
  /// \brief Just gives back an edge-sub-graph adaptor
857
  ///
858
  /// Just gives back an edge-sub-graph adaptor
859
  template<typename Graph, typename EdgeFilterMap>
860
  EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>
861
  edgeSubGraphAdaptor(const Graph& graph, EdgeFilterMap& efm) {
862
    return EdgeSubGraphAdaptor<const Graph, EdgeFilterMap>(graph, efm);
863
  }
864

	
865
  template<typename Graph, typename EdgeFilterMap>
866
  EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>
867
  edgeSubGraphAdaptor(const Graph& graph, const EdgeFilterMap& efm) {
868
    return EdgeSubGraphAdaptor<const Graph, const EdgeFilterMap>(graph, efm);
869
  }
870

	
871
  template <typename _Graph, typename _DirectionMap>
872
  class DirGraphAdaptorBase {
873
  public:
874
    
875
    typedef _Graph Graph;
876
    typedef _DirectionMap DirectionMap;
877

	
878
    typedef typename Graph::Node Node;
879
    typedef typename Graph::Edge Arc;
880
   
881
    /// \brief Reverse arc
882
    /// 
883
    /// It reverse the given arc. It simply negate the direction in the map.
884
    void reverseArc(const Arc& arc) {
885
      _direction->set(arc, !(*_direction)[arc]);
886
    }
887

	
888
    void first(Node& i) const { _graph->first(i); }
889
    void first(Arc& i) const { _graph->first(i); }
890
    void firstIn(Arc& i, const Node& n) const {
891
      bool d;
892
      _graph->firstInc(i, d, n);
893
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
894
    }
895
    void firstOut(Arc& i, const Node& n ) const { 
896
      bool d;
897
      _graph->firstInc(i, d, n);
898
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
899
    }
900

	
901
    void next(Node& i) const { _graph->next(i); }
902
    void next(Arc& i) const { _graph->next(i); }
903
    void nextIn(Arc& i) const {
904
      bool d = !(*_direction)[i];
905
      _graph->nextInc(i, d);
906
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
907
    }
908
    void nextOut(Arc& i) const {
909
      bool d = (*_direction)[i];
910
      _graph->nextInc(i, d);
911
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
912
    }
913

	
914
    Node source(const Arc& e) const { 
915
      return (*_direction)[e] ? _graph->u(e) : _graph->v(e); 
916
    }
917
    Node target(const Arc& e) const { 
918
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e); 
919
    }
920

	
921
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
922
    int nodeNum() const { return _graph->nodeNum(); }
923
    
924
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
925
    int arcNum() const { return _graph->edgeNum(); }
926

	
927
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
928
    Arc findArc(const Node& u, const Node& v, 
929
		  const Arc& prev = INVALID) {
930
      Arc arc = prev;
931
      bool d = arc == INVALID ? true : (*_direction)[arc];
932
      if (d) {
933
        arc = _graph->findEdge(u, v, arc);
934
        while (arc != INVALID && !(*_direction)[arc]) {
935
          _graph->findEdge(u, v, arc);
936
        }
937
        if (arc != INVALID) return arc;
938
      }
939
      _graph->findEdge(v, u, arc);
940
      while (arc != INVALID && (*_direction)[arc]) {
941
        _graph->findEdge(u, v, arc);
942
      }
943
      return arc;
944
    }
945
  
946
    Node addNode() { 
947
      return Node(_graph->addNode()); 
948
    }
949

	
950
    Arc addArc(const Node& u, const Node& v) {
951
      Arc arc = _graph->addArc(u, v);
952
      _direction->set(arc, _graph->source(arc) == u);
953
      return arc; 
954
    }
955

	
956
    void erase(const Node& i) { _graph->erase(i); }
957
    void erase(const Arc& i) { _graph->erase(i); }
958
  
959
    void clear() { _graph->clear(); }
960
    
961
    int id(const Node& v) const { return _graph->id(v); }
962
    int id(const Arc& e) const { return _graph->id(e); }
963

	
964
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
965
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
966

	
967
    int maxNodeId() const { return _graph->maxNodeId(); }
968
    int maxArcId() const { return _graph->maxEdgeId(); }
969

	
970
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
971
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); } 
972

	
973
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
974
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); } 
975

	
976
    template <typename _Value>
977
    class NodeMap : public _Graph::template NodeMap<_Value> {
978
    public:
979

	
980
      typedef typename _Graph::template NodeMap<_Value> Parent;
981

	
982
      explicit NodeMap(const DirGraphAdaptorBase& adapter) 
983
	: Parent(*adapter._graph) {}
984

	
985
      NodeMap(const DirGraphAdaptorBase& adapter, const _Value& value)
986
	: Parent(*adapter._graph, value) {}
987

	
988
    private:
989
      NodeMap& operator=(const NodeMap& cmap) {
990
        return operator=<NodeMap>(cmap);
991
      }
992

	
993
      template <typename CMap>
994
      NodeMap& operator=(const CMap& cmap) {
995
        Parent::operator=(cmap);
996
        return *this;
997
      }
998

	
999
    };
1000

	
1001
    template <typename _Value>
1002
    class ArcMap : public _Graph::template EdgeMap<_Value> {
1003
    public:
1004

	
1005
      typedef typename Graph::template EdgeMap<_Value> Parent;
1006

	
1007
      explicit ArcMap(const DirGraphAdaptorBase& adapter) 
1008
	: Parent(*adapter._graph) { }
1009

	
1010
      ArcMap(const DirGraphAdaptorBase& adapter, const _Value& value)
1011
	: Parent(*adapter._graph, value) { }
1012

	
1013
    private:
1014
      ArcMap& operator=(const ArcMap& cmap) {
1015
        return operator=<ArcMap>(cmap);
1016
      }
1017

	
1018
      template <typename CMap>
1019
      ArcMap& operator=(const CMap& cmap) {
1020
        Parent::operator=(cmap);
1021
        return *this;
1022
      }
1023
    };
1024

	
1025
    
1026

	
1027
  protected:
1028
    Graph* _graph;
1029
    DirectionMap* _direction;
1030

	
1031
    void setDirectionMap(DirectionMap& direction) {
1032
      _direction = &direction;
1033
    }
1034

	
1035
    void setGraph(Graph& graph) {
1036
      _graph = &graph;
1037
    }
1038

	
1039
  };
1040

	
1041

	
1042
  /// \ingroup graph_adaptors
1043
  ///
1044
  /// \brief A directed graph is made from an graph by an adaptor
1045
  ///
1046
  /// This adaptor gives a direction for each edge in the undirected
1047
  /// graph. The direction of the arcs stored in the
1048
  /// DirectionMap. This map is a bool map on the edges. If
1049
  /// the edge is mapped to true then the direction of the directed
1050
  /// arc will be the same as the default direction of the edge. The
1051
  /// arcs can be easily reverted by the \ref
1052
  /// DirGraphAdaptorBase::reverseArc "reverseArc()" member in the
1053
  /// adaptor.
1054
  ///
1055
  /// It can be used to solve orientation problems on directed graphs.
1056
  /// For example how can we orient an graph to get the minimum
1057
  /// number of strongly connected components. If we orient the arcs with
1058
  /// the dfs algorithm out from the source then we will get such an 
1059
  /// orientation. 
1060
  ///
1061
  /// We use the \ref DfsVisitor "visitor" interface of the 
1062
  /// \ref DfsVisit "dfs" algorithm:
1063
  ///\code
1064
  /// template <typename DirMap>
1065
  /// class OrientVisitor : public DfsVisitor<Graph> {
1066
  /// public:
1067
  ///
1068
  ///   OrientVisitor(const Graph& graph, DirMap& dirMap)
1069
  ///     : _graph(graph), _dirMap(dirMap), _processed(graph, false) {}
1070
  ///
1071
  ///   void discover(const Arc& arc) {
1072
  ///     _processed.set(arc, true);
1073
  ///     _dirMap.set(arc, _graph.direction(arc));
1074
  ///   }
1075
  ///
1076
  ///   void examine(const Arc& arc) {
1077
  ///     if (_processed[arc]) return;
1078
  ///     _processed.set(arc, true);
1079
  ///     _dirMap.set(arc, _graph.direction(arc));
1080
  ///   }  
1081
  /// 
1082
  /// private:
1083
  ///   const Graph& _graph;  
1084
  ///   DirMap& _dirMap;
1085
  ///   Graph::EdgeMap<bool> _processed;
1086
  /// };
1087
  ///\endcode
1088
  ///
1089
  /// And now we can use the orientation:
1090
  ///\code
1091
  /// Graph::EdgeMap<bool> dmap(graph);
1092
  ///
1093
  /// typedef OrientVisitor<Graph::EdgeMap<bool> > Visitor;
1094
  /// Visitor visitor(graph, dmap);
1095
  ///
1096
  /// DfsVisit<Graph, Visitor> dfs(graph, visitor);
1097
  ///
1098
  /// dfs.run();
1099
  ///
1100
  /// typedef DirGraphAdaptor<Graph> DGraph;
1101
  /// DGraph dgraph(graph, dmap);
1102
  ///
1103
  /// LEMON_ASSERT(countStronglyConnectedComponents(dgraph) == 
1104
  ///              countBiArcConnectedComponents(graph), "Wrong Orientation");
1105
  ///\endcode
1106
  ///
1107
  /// The number of the bi-connected components is a lower bound for
1108
  /// the number of the strongly connected components in the directed
1109
  /// graph because if we contract the bi-connected components to
1110
  /// nodes we will get a tree therefore we cannot orient arcs in
1111
  /// both direction between bi-connected components. In the other way
1112
  /// the algorithm will orient one component to be strongly
1113
  /// connected. The two relations proof that the assertion will
1114
  /// be always true and the found solution is optimal.
1115
  ///
1116
  /// \sa DirGraphAdaptorBase
1117
  /// \sa dirGraphAdaptor
1118
  template<typename _Graph, 
1119
           typename DirectionMap = typename _Graph::template EdgeMap<bool> > 
1120
  class DirGraphAdaptor : 
1121
    public DigraphAdaptorExtender<DirGraphAdaptorBase<_Graph, DirectionMap> > {
1122
  public:
1123
    typedef _Graph Graph;
1124
    typedef DigraphAdaptorExtender<
1125
      DirGraphAdaptorBase<_Graph, DirectionMap> > Parent;
1126
    typedef typename Parent::Arc Arc;
1127
  protected:
1128
    DirGraphAdaptor() { }
1129
  public:
1130
    
1131
    /// \brief Constructor of the adaptor
1132
    ///
1133
    /// Constructor of the adaptor
1134
    DirGraphAdaptor(Graph& graph, DirectionMap& direction) { 
1135
      setGraph(graph);
1136
      setDirectionMap(direction);
1137
    }
1138

	
1139
    /// \brief Reverse arc
1140
    /// 
1141
    /// It reverse the given arc. It simply negate the direction in the map.
1142
    void reverseArc(const Arc& a) {
1143
      Parent::reverseArc(a);
1144
    }
1145
  };
1146

	
1147
  /// \brief Just gives back a DirGraphAdaptor
1148
  ///
1149
  /// Just gives back a DirGraphAdaptor
1150
  template<typename Graph, typename DirectionMap>
1151
  DirGraphAdaptor<const Graph, DirectionMap>
1152
  dirGraphAdaptor(const Graph& graph, DirectionMap& dm) {
1153
    return DirGraphAdaptor<const Graph, DirectionMap>(graph, dm);
1154
  }
1155

	
1156
  template<typename Graph, typename DirectionMap>
1157
  DirGraphAdaptor<const Graph, const DirectionMap>
1158
  dirGraphAdaptor(const Graph& graph, const DirectionMap& dm) {
1159
    return DirGraphAdaptor<const Graph, const DirectionMap>(graph, dm);
1160
  }
1161

	
1162
}
1163

	
1164
#endif
0 comments (0 inline)