gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Reorganize header files (Ticket #97) In addition on some places the DefaultMap<G, K, V> is replaced with ItemSetTraits<G, K>::template Map<V>::Type, to decrease the dependencies of different tools. It is obviously better solution.
3 31 2
default
36 files changed:
↑ Collapse diff ↑
Ignore white space 384 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
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
// This file contains a modified version of the enable_if library from BOOST.
20
// See the appropriate copyright notice below.
21

	
22
// Boost enable_if library
23

	
24
// Copyright 2003 (c) The Trustees of Indiana University.
25

	
26
// Use, modification, and distribution is subject to the Boost Software
27
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
28
// http://www.boost.org/LICENSE_1_0.txt)
29

	
30
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
31
//             Jeremiah Willcock (jewillco at osl.iu.edu)
32
//             Andrew Lumsdaine (lums at osl.iu.edu)
33

	
34

	
35
#ifndef LEMON_BITS_ENABLE_IF_H
36
#define LEMON_BITS_ENABLE_IF_H
37

	
38
///\file
39
///\brief Miscellaneous basic utilities
40

	
41
namespace lemon
42
{
43

	
44
  /// Basic type for defining "tags". A "YES" condition for \c enable_if.
45

	
46
  /// Basic type for defining "tags". A "YES" condition for \c enable_if.
47
  ///
48
  ///\sa False
49
  struct True {
50
    ///\e
51
    static const bool value = true;
52
  };
53

	
54
  /// Basic type for defining "tags". A "NO" condition for \c enable_if.
55

	
56
  /// Basic type for defining "tags". A "NO" condition for \c enable_if.
57
  ///
58
  ///\sa True
59
  struct False {
60
    ///\e
61
    static const bool value = false;
62
  };
63

	
64

	
65

	
66
  template <typename T>
67
  struct Wrap {
68
    const T &value;
69
    Wrap(const T &t) : value(t) {}
70
  };
71

	
72
  /**************** dummy class to avoid ambiguity ****************/
73

	
74
  template<int T> struct dummy { dummy(int) {} };
75

	
76
  /**************** enable_if from BOOST ****************/
77

	
78
  template <typename Type, typename T = void>
79
  struct exists {
80
    typedef T type;
81
  };
82

	
83

	
84
  template <bool B, class T = void>
85
  struct enable_if_c {
86
    typedef T type;
87
  };
88

	
89
  template <class T>
90
  struct enable_if_c<false, T> {};
91

	
92
  template <class Cond, class T = void>
93
  struct enable_if : public enable_if_c<Cond::value, T> {};
94

	
95
  template <bool B, class T>
96
  struct lazy_enable_if_c {
97
    typedef typename T::type type;
98
  };
99

	
100
  template <class T>
101
  struct lazy_enable_if_c<false, T> {};
102

	
103
  template <class Cond, class T>
104
  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
105

	
106

	
107
  template <bool B, class T = void>
108
  struct disable_if_c {
109
    typedef T type;
110
  };
111

	
112
  template <class T>
113
  struct disable_if_c<true, T> {};
114

	
115
  template <class Cond, class T = void>
116
  struct disable_if : public disable_if_c<Cond::value, T> {};
117

	
118
  template <bool B, class T>
119
  struct lazy_disable_if_c {
120
    typedef typename T::type type;
121
  };
122

	
123
  template <class T>
124
  struct lazy_disable_if_c<true, T> {};
125

	
126
  template <class Cond, class T>
127
  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
128

	
129
} // namespace lemon
130

	
131
#endif
Ignore white space 384 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
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_CORE_H
20
#define LEMON_CORE_H
21

	
22
#include <vector>
23
#include <algorithm>
24

	
25
#include <lemon/bits/enable_if.h>
26
#include <lemon/bits/traits.h>
27

	
28
///\file
29
///\brief LEMON core utilities.
30

	
31
namespace lemon {
32

	
33
  /// \brief Dummy type to make it easier to create invalid iterators.
34
  ///
35
  /// Dummy type to make it easier to create invalid iterators.
36
  /// See \ref INVALID for the usage.
37
  struct Invalid {
38
  public:
39
    bool operator==(Invalid) { return true;  }
40
    bool operator!=(Invalid) { return false; }
41
    bool operator< (Invalid) { return false; }
42
  };
43

	
44
  /// \brief Invalid iterators.
45
  ///
46
  /// \ref Invalid is a global type that converts to each iterator
47
  /// in such a way that the value of the target iterator will be invalid.
48
#ifdef LEMON_ONLY_TEMPLATES
49
  const Invalid INVALID = Invalid();
50
#else
51
  extern const Invalid INVALID;
52
#endif
53

	
54
  /// \addtogroup gutils
55
  /// @{
56

	
57
  ///Creates convenience typedefs for the digraph types and iterators
58

	
59
  ///This \c \#define creates convenience typedefs for the following types
60
  ///of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
61
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap,
62
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap.
63
  ///
64
  ///\note If the graph type is a dependent type, ie. the graph type depend
65
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
66
  ///macro.
67
#define DIGRAPH_TYPEDEFS(Digraph)                                       \
68
  typedef Digraph::Node Node;                                           \
69
  typedef Digraph::NodeIt NodeIt;                                       \
70
  typedef Digraph::Arc Arc;                                             \
71
  typedef Digraph::ArcIt ArcIt;                                         \
72
  typedef Digraph::InArcIt InArcIt;                                     \
73
  typedef Digraph::OutArcIt OutArcIt;                                   \
74
  typedef Digraph::NodeMap<bool> BoolNodeMap;                           \
75
  typedef Digraph::NodeMap<int> IntNodeMap;                             \
76
  typedef Digraph::NodeMap<double> DoubleNodeMap;                       \
77
  typedef Digraph::ArcMap<bool> BoolArcMap;                             \
78
  typedef Digraph::ArcMap<int> IntArcMap;                               \
79
  typedef Digraph::ArcMap<double> DoubleArcMap
80

	
81
  ///Creates convenience typedefs for the digraph types and iterators
82

	
83
  ///\see DIGRAPH_TYPEDEFS
84
  ///
85
  ///\note Use this macro, if the graph type is a dependent type,
86
  ///ie. the graph type depend on a template parameter.
87
#define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph)                              \
88
  typedef typename Digraph::Node Node;                                  \
89
  typedef typename Digraph::NodeIt NodeIt;                              \
90
  typedef typename Digraph::Arc Arc;                                    \
91
  typedef typename Digraph::ArcIt ArcIt;                                \
92
  typedef typename Digraph::InArcIt InArcIt;                            \
93
  typedef typename Digraph::OutArcIt OutArcIt;                          \
94
  typedef typename Digraph::template NodeMap<bool> BoolNodeMap;         \
95
  typedef typename Digraph::template NodeMap<int> IntNodeMap;           \
96
  typedef typename Digraph::template NodeMap<double> DoubleNodeMap;     \
97
  typedef typename Digraph::template ArcMap<bool> BoolArcMap;           \
98
  typedef typename Digraph::template ArcMap<int> IntArcMap;             \
99
  typedef typename Digraph::template ArcMap<double> DoubleArcMap
100

	
101
  ///Creates convenience typedefs for the graph types and iterators
102

	
103
  ///This \c \#define creates the same convenience typedefs as defined
104
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
105
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
106
  ///\c DoubleEdgeMap.
107
  ///
108
  ///\note If the graph type is a dependent type, ie. the graph type depend
109
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
110
  ///macro.
111
#define GRAPH_TYPEDEFS(Graph)                                           \
112
  DIGRAPH_TYPEDEFS(Graph);                                              \
113
  typedef Graph::Edge Edge;                                             \
114
  typedef Graph::EdgeIt EdgeIt;                                         \
115
  typedef Graph::IncEdgeIt IncEdgeIt;                                   \
116
  typedef Graph::EdgeMap<bool> BoolEdgeMap;                             \
117
  typedef Graph::EdgeMap<int> IntEdgeMap;                               \
118
  typedef Graph::EdgeMap<double> DoubleEdgeMap
119

	
120
  ///Creates convenience typedefs for the graph types and iterators
121

	
122
  ///\see GRAPH_TYPEDEFS
123
  ///
124
  ///\note Use this macro, if the graph type is a dependent type,
125
  ///ie. the graph type depend on a template parameter.
126
#define TEMPLATE_GRAPH_TYPEDEFS(Graph)                                  \
127
  TEMPLATE_DIGRAPH_TYPEDEFS(Graph);                                     \
128
  typedef typename Graph::Edge Edge;                                    \
129
  typedef typename Graph::EdgeIt EdgeIt;                                \
130
  typedef typename Graph::IncEdgeIt IncEdgeIt;                          \
131
  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;           \
132
  typedef typename Graph::template EdgeMap<int> IntEdgeMap;             \
133
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
134

	
135
  /// \brief Function to count the items in the graph.
136
  ///
137
  /// This function counts the items (nodes, arcs etc) in the graph.
138
  /// The complexity of the function is O(n) because
139
  /// it iterates on all of the items.
140
  template <typename Graph, typename Item>
141
  inline int countItems(const Graph& g) {
142
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
143
    int num = 0;
144
    for (ItemIt it(g); it != INVALID; ++it) {
145
      ++num;
146
    }
147
    return num;
148
  }
149

	
150
  // Node counting:
151

	
152
  namespace _core_bits {
153

	
154
    template <typename Graph, typename Enable = void>
155
    struct CountNodesSelector {
156
      static int count(const Graph &g) {
157
        return countItems<Graph, typename Graph::Node>(g);
158
      }
159
    };
160

	
161
    template <typename Graph>
162
    struct CountNodesSelector<
163
      Graph, typename
164
      enable_if<typename Graph::NodeNumTag, void>::type>
165
    {
166
      static int count(const Graph &g) {
167
        return g.nodeNum();
168
      }
169
    };
170
  }
171

	
172
  /// \brief Function to count the nodes in the graph.
173
  ///
174
  /// This function counts the nodes in the graph.
175
  /// The complexity of the function is O(n) but for some
176
  /// graph structures it is specialized to run in O(1).
177
  ///
178
  /// If the graph contains a \e nodeNum() member function and a
179
  /// \e NodeNumTag tag then this function calls directly the member
180
  /// function to query the cardinality of the node set.
181
  template <typename Graph>
182
  inline int countNodes(const Graph& g) {
183
    return _core_bits::CountNodesSelector<Graph>::count(g);
184
  }
185

	
186
  // Arc counting:
187

	
188
  namespace _core_bits {
189

	
190
    template <typename Graph, typename Enable = void>
191
    struct CountArcsSelector {
192
      static int count(const Graph &g) {
193
        return countItems<Graph, typename Graph::Arc>(g);
194
      }
195
    };
196

	
197
    template <typename Graph>
198
    struct CountArcsSelector<
199
      Graph,
200
      typename enable_if<typename Graph::ArcNumTag, void>::type>
201
    {
202
      static int count(const Graph &g) {
203
        return g.arcNum();
204
      }
205
    };
206
  }
207

	
208
  /// \brief Function to count the arcs in the graph.
209
  ///
210
  /// This function counts the arcs in the graph.
211
  /// The complexity of the function is O(e) but for some
212
  /// graph structures it is specialized to run in O(1).
213
  ///
214
  /// If the graph contains a \e arcNum() member function and a
215
  /// \e EdgeNumTag tag then this function calls directly the member
216
  /// function to query the cardinality of the arc set.
217
  template <typename Graph>
218
  inline int countArcs(const Graph& g) {
219
    return _core_bits::CountArcsSelector<Graph>::count(g);
220
  }
221

	
222
  // Edge counting:
223
  namespace _core_bits {
224

	
225
    template <typename Graph, typename Enable = void>
226
    struct CountEdgesSelector {
227
      static int count(const Graph &g) {
228
        return countItems<Graph, typename Graph::Edge>(g);
229
      }
230
    };
231

	
232
    template <typename Graph>
233
    struct CountEdgesSelector<
234
      Graph,
235
      typename enable_if<typename Graph::EdgeNumTag, void>::type>
236
    {
237
      static int count(const Graph &g) {
238
        return g.edgeNum();
239
      }
240
    };
241
  }
242

	
243
  /// \brief Function to count the edges in the graph.
244
  ///
245
  /// This function counts the edges in the graph.
246
  /// The complexity of the function is O(m) but for some
247
  /// graph structures it is specialized to run in O(1).
248
  ///
249
  /// If the graph contains a \e edgeNum() member function and a
250
  /// \e EdgeNumTag tag then this function calls directly the member
251
  /// function to query the cardinality of the edge set.
252
  template <typename Graph>
253
  inline int countEdges(const Graph& g) {
254
    return _core_bits::CountEdgesSelector<Graph>::count(g);
255

	
256
  }
257

	
258

	
259
  template <typename Graph, typename DegIt>
260
  inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
261
    int num = 0;
262
    for (DegIt it(_g, _n); it != INVALID; ++it) {
263
      ++num;
264
    }
265
    return num;
266
  }
267

	
268
  /// \brief Function to count the number of the out-arcs from node \c n.
269
  ///
270
  /// This function counts the number of the out-arcs from node \c n
271
  /// in the graph.
272
  template <typename Graph>
273
  inline int countOutArcs(const Graph& _g,  const typename Graph::Node& _n) {
274
    return countNodeDegree<Graph, typename Graph::OutArcIt>(_g, _n);
275
  }
276

	
277
  /// \brief Function to count the number of the in-arcs to node \c n.
278
  ///
279
  /// This function counts the number of the in-arcs to node \c n
280
  /// in the graph.
281
  template <typename Graph>
282
  inline int countInArcs(const Graph& _g,  const typename Graph::Node& _n) {
283
    return countNodeDegree<Graph, typename Graph::InArcIt>(_g, _n);
284
  }
285

	
286
  /// \brief Function to count the number of the inc-edges to node \c n.
287
  ///
288
  /// This function counts the number of the inc-edges to node \c n
289
  /// in the graph.
290
  template <typename Graph>
291
  inline int countIncEdges(const Graph& _g,  const typename Graph::Node& _n) {
292
    return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
293
  }
294

	
295
  namespace _core_bits {
296

	
297
    template <typename Digraph, typename Item, typename RefMap>
298
    class MapCopyBase {
299
    public:
300
      virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
301

	
302
      virtual ~MapCopyBase() {}
303
    };
304

	
305
    template <typename Digraph, typename Item, typename RefMap,
306
              typename ToMap, typename FromMap>
307
    class MapCopy : public MapCopyBase<Digraph, Item, RefMap> {
308
    public:
309

	
310
      MapCopy(ToMap& tmap, const FromMap& map)
311
        : _tmap(tmap), _map(map) {}
312

	
313
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
314
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
315
        for (ItemIt it(digraph); it != INVALID; ++it) {
316
          _tmap.set(refMap[it], _map[it]);
317
        }
318
      }
319

	
320
    private:
321
      ToMap& _tmap;
322
      const FromMap& _map;
323
    };
324

	
325
    template <typename Digraph, typename Item, typename RefMap, typename It>
326
    class ItemCopy : public MapCopyBase<Digraph, Item, RefMap> {
327
    public:
328

	
329
      ItemCopy(It& it, const Item& item) : _it(it), _item(item) {}
330

	
331
      virtual void copy(const Digraph&, const RefMap& refMap) {
332
        _it = refMap[_item];
333
      }
334

	
335
    private:
336
      It& _it;
337
      Item _item;
338
    };
339

	
340
    template <typename Digraph, typename Item, typename RefMap, typename Ref>
341
    class RefCopy : public MapCopyBase<Digraph, Item, RefMap> {
342
    public:
343

	
344
      RefCopy(Ref& map) : _map(map) {}
345

	
346
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
347
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
348
        for (ItemIt it(digraph); it != INVALID; ++it) {
349
          _map.set(it, refMap[it]);
350
        }
351
      }
352

	
353
    private:
354
      Ref& _map;
355
    };
356

	
357
    template <typename Digraph, typename Item, typename RefMap,
358
              typename CrossRef>
359
    class CrossRefCopy : public MapCopyBase<Digraph, Item, RefMap> {
360
    public:
361

	
362
      CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {}
363

	
364
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
365
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
366
        for (ItemIt it(digraph); it != INVALID; ++it) {
367
          _cmap.set(refMap[it], it);
368
        }
369
      }
370

	
371
    private:
372
      CrossRef& _cmap;
373
    };
374

	
375
    template <typename Digraph, typename Enable = void>
376
    struct DigraphCopySelector {
377
      template <typename From, typename NodeRefMap, typename ArcRefMap>
378
      static void copy(Digraph &to, const From& from,
379
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
380
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
381
          nodeRefMap[it] = to.addNode();
382
        }
383
        for (typename From::ArcIt it(from); it != INVALID; ++it) {
384
          arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)],
385
                                    nodeRefMap[from.target(it)]);
386
        }
387
      }
388
    };
389

	
390
    template <typename Digraph>
391
    struct DigraphCopySelector<
392
      Digraph,
393
      typename enable_if<typename Digraph::BuildTag, void>::type>
394
    {
395
      template <typename From, typename NodeRefMap, typename ArcRefMap>
396
      static void copy(Digraph &to, const From& from,
397
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
398
        to.build(from, nodeRefMap, arcRefMap);
399
      }
400
    };
401

	
402
    template <typename Graph, typename Enable = void>
403
    struct GraphCopySelector {
404
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
405
      static void copy(Graph &to, const From& from,
406
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
407
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
408
          nodeRefMap[it] = to.addNode();
409
        }
410
        for (typename From::EdgeIt it(from); it != INVALID; ++it) {
411
          edgeRefMap[it] = to.addEdge(nodeRefMap[from.u(it)],
412
                                      nodeRefMap[from.v(it)]);
413
        }
414
      }
415
    };
416

	
417
    template <typename Graph>
418
    struct GraphCopySelector<
419
      Graph,
420
      typename enable_if<typename Graph::BuildTag, void>::type>
421
    {
422
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
423
      static void copy(Graph &to, const From& from,
424
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
425
        to.build(from, nodeRefMap, edgeRefMap);
426
      }
427
    };
428

	
429
  }
430

	
431
  /// \brief Class to copy a digraph.
432
  ///
433
  /// Class to copy a digraph to another digraph (duplicate a digraph). The
434
  /// simplest way of using it is through the \c copyDigraph() function.
435
  ///
436
  /// This class not just make a copy of a graph, but it can create
437
  /// references and cross references between the nodes and arcs of
438
  /// the two graphs, it can copy maps for use with the newly created
439
  /// graph and copy nodes and arcs.
440
  ///
441
  /// To make a copy from a graph, first an instance of DigraphCopy
442
  /// should be created, then the data belongs to the graph should
443
  /// assigned to copy. In the end, the \c run() member should be
444
  /// called.
445
  ///
446
  /// The next code copies a graph with several data:
447
  ///\code
448
  ///  DigraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
449
  ///  // create a reference for the nodes
450
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
451
  ///  dc.nodeRef(nr);
452
  ///  // create a cross reference (inverse) for the arcs
453
  ///  NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph);
454
  ///  dc.arcCrossRef(acr);
455
  ///  // copy an arc map
456
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
457
  ///  NewGraph::ArcMap<double> namap(new_graph);
458
  ///  dc.arcMap(namap, oamap);
459
  ///  // copy a node
460
  ///  OrigGraph::Node on;
461
  ///  NewGraph::Node nn;
462
  ///  dc.node(nn, on);
463
  ///  // Executions of copy
464
  ///  dc.run();
465
  ///\endcode
466
  template <typename To, typename From>
467
  class DigraphCopy {
468
  private:
469

	
470
    typedef typename From::Node Node;
471
    typedef typename From::NodeIt NodeIt;
472
    typedef typename From::Arc Arc;
473
    typedef typename From::ArcIt ArcIt;
474

	
475
    typedef typename To::Node TNode;
476
    typedef typename To::Arc TArc;
477

	
478
    typedef typename From::template NodeMap<TNode> NodeRefMap;
479
    typedef typename From::template ArcMap<TArc> ArcRefMap;
480

	
481

	
482
  public:
483

	
484

	
485
    /// \brief Constructor for the DigraphCopy.
486
    ///
487
    /// It copies the content of the \c _from digraph into the
488
    /// \c _to digraph.
489
    DigraphCopy(To& to, const From& from)
490
      : _from(from), _to(to) {}
491

	
492
    /// \brief Destructor of the DigraphCopy
493
    ///
494
    /// Destructor of the DigraphCopy
495
    ~DigraphCopy() {
496
      for (int i = 0; i < int(_node_maps.size()); ++i) {
497
        delete _node_maps[i];
498
      }
499
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
500
        delete _arc_maps[i];
501
      }
502

	
503
    }
504

	
505
    /// \brief Copies the node references into the given map.
506
    ///
507
    /// Copies the node references into the given map. The parameter
508
    /// should be a map, which key type is the Node type of the source
509
    /// graph, while the value type is the Node type of the
510
    /// destination graph.
511
    template <typename NodeRef>
512
    DigraphCopy& nodeRef(NodeRef& map) {
513
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
514
                           NodeRefMap, NodeRef>(map));
515
      return *this;
516
    }
517

	
518
    /// \brief Copies the node cross references into the given map.
519
    ///
520
    ///  Copies the node cross references (reverse references) into
521
    ///  the given map. The parameter should be a map, which key type
522
    ///  is the Node type of the destination graph, while the value type is
523
    ///  the Node type of the source graph.
524
    template <typename NodeCrossRef>
525
    DigraphCopy& nodeCrossRef(NodeCrossRef& map) {
526
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
527
                           NodeRefMap, NodeCrossRef>(map));
528
      return *this;
529
    }
530

	
531
    /// \brief Make copy of the given map.
532
    ///
533
    /// Makes copy of the given map for the newly created digraph.
534
    /// The new map's key type is the destination graph's node type,
535
    /// and the copied map's key type is the source graph's node type.
536
    template <typename ToMap, typename FromMap>
537
    DigraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
538
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
539
                           NodeRefMap, ToMap, FromMap>(tmap, map));
540
      return *this;
541
    }
542

	
543
    /// \brief Make a copy of the given node.
544
    ///
545
    /// Make a copy of the given node.
546
    DigraphCopy& node(TNode& tnode, const Node& snode) {
547
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
548
                           NodeRefMap, TNode>(tnode, snode));
549
      return *this;
550
    }
551

	
552
    /// \brief Copies the arc references into the given map.
553
    ///
554
    /// Copies the arc references into the given map.
555
    template <typename ArcRef>
556
    DigraphCopy& arcRef(ArcRef& map) {
557
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
558
                          ArcRefMap, ArcRef>(map));
559
      return *this;
560
    }
561

	
562
    /// \brief Copies the arc cross references into the given map.
563
    ///
564
    ///  Copies the arc cross references (reverse references) into
565
    ///  the given map.
566
    template <typename ArcCrossRef>
567
    DigraphCopy& arcCrossRef(ArcCrossRef& map) {
568
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
569
                          ArcRefMap, ArcCrossRef>(map));
570
      return *this;
571
    }
572

	
573
    /// \brief Make copy of the given map.
574
    ///
575
    /// Makes copy of the given map for the newly created digraph.
576
    /// The new map's key type is the to digraph's arc type,
577
    /// and the copied map's key type is the from digraph's arc
578
    /// type.
579
    template <typename ToMap, typename FromMap>
580
    DigraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
581
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
582
                          ArcRefMap, ToMap, FromMap>(tmap, map));
583
      return *this;
584
    }
585

	
586
    /// \brief Make a copy of the given arc.
587
    ///
588
    /// Make a copy of the given arc.
589
    DigraphCopy& arc(TArc& tarc, const Arc& sarc) {
590
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
591
                          ArcRefMap, TArc>(tarc, sarc));
592
      return *this;
593
    }
594

	
595
    /// \brief Executes the copies.
596
    ///
597
    /// Executes the copies.
598
    void run() {
599
      NodeRefMap nodeRefMap(_from);
600
      ArcRefMap arcRefMap(_from);
601
      _core_bits::DigraphCopySelector<To>::
602
        copy(_to, _from, nodeRefMap, arcRefMap);
603
      for (int i = 0; i < int(_node_maps.size()); ++i) {
604
        _node_maps[i]->copy(_from, nodeRefMap);
605
      }
606
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
607
        _arc_maps[i]->copy(_from, arcRefMap);
608
      }
609
    }
610

	
611
  protected:
612

	
613

	
614
    const From& _from;
615
    To& _to;
616

	
617
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
618
    _node_maps;
619

	
620
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
621
    _arc_maps;
622

	
623
  };
624

	
625
  /// \brief Copy a digraph to another digraph.
626
  ///
627
  /// Copy a digraph to another digraph. The complete usage of the
628
  /// function is detailed in the DigraphCopy class, but a short
629
  /// example shows a basic work:
630
  ///\code
631
  /// copyDigraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
632
  ///\endcode
633
  ///
634
  /// After the copy the \c nr map will contain the mapping from the
635
  /// nodes of the \c from digraph to the nodes of the \c to digraph and
636
  /// \c ecr will contain the mapping from the arcs of the \c to digraph
637
  /// to the arcs of the \c from digraph.
638
  ///
639
  /// \see DigraphCopy
640
  template <typename To, typename From>
641
  DigraphCopy<To, From> copyDigraph(To& to, const From& from) {
642
    return DigraphCopy<To, From>(to, from);
643
  }
644

	
645
  /// \brief Class to copy a graph.
646
  ///
647
  /// Class to copy a graph to another graph (duplicate a graph). The
648
  /// simplest way of using it is through the \c copyGraph() function.
649
  ///
650
  /// This class not just make a copy of a graph, but it can create
651
  /// references and cross references between the nodes, edges and arcs of
652
  /// the two graphs, it can copy maps for use with the newly created
653
  /// graph and copy nodes, edges and arcs.
654
  ///
655
  /// To make a copy from a graph, first an instance of GraphCopy
656
  /// should be created, then the data belongs to the graph should
657
  /// assigned to copy. In the end, the \c run() member should be
658
  /// called.
659
  ///
660
  /// The next code copies a graph with several data:
661
  ///\code
662
  ///  GraphCopy<NewGraph, OrigGraph> dc(new_graph, orig_graph);
663
  ///  // create a reference for the nodes
664
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
665
  ///  dc.nodeRef(nr);
666
  ///  // create a cross reference (inverse) for the edges
667
  ///  NewGraph::EdgeMap<OrigGraph::Arc> ecr(new_graph);
668
  ///  dc.edgeCrossRef(ecr);
669
  ///  // copy an arc map
670
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
671
  ///  NewGraph::ArcMap<double> namap(new_graph);
672
  ///  dc.arcMap(namap, oamap);
673
  ///  // copy a node
674
  ///  OrigGraph::Node on;
675
  ///  NewGraph::Node nn;
676
  ///  dc.node(nn, on);
677
  ///  // Executions of copy
678
  ///  dc.run();
679
  ///\endcode
680
  template <typename To, typename From>
681
  class GraphCopy {
682
  private:
683

	
684
    typedef typename From::Node Node;
685
    typedef typename From::NodeIt NodeIt;
686
    typedef typename From::Arc Arc;
687
    typedef typename From::ArcIt ArcIt;
688
    typedef typename From::Edge Edge;
689
    typedef typename From::EdgeIt EdgeIt;
690

	
691
    typedef typename To::Node TNode;
692
    typedef typename To::Arc TArc;
693
    typedef typename To::Edge TEdge;
694

	
695
    typedef typename From::template NodeMap<TNode> NodeRefMap;
696
    typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
697

	
698
    struct ArcRefMap {
699
      ArcRefMap(const To& to, const From& from,
700
                const EdgeRefMap& edge_ref, const NodeRefMap& node_ref)
701
        : _to(to), _from(from),
702
          _edge_ref(edge_ref), _node_ref(node_ref) {}
703

	
704
      typedef typename From::Arc Key;
705
      typedef typename To::Arc Value;
706

	
707
      Value operator[](const Key& key) const {
708
        bool forward = _from.u(key) != _from.v(key) ?
709
          _node_ref[_from.source(key)] ==
710
          _to.source(_to.direct(_edge_ref[key], true)) :
711
          _from.direction(key);
712
        return _to.direct(_edge_ref[key], forward);
713
      }
714

	
715
      const To& _to;
716
      const From& _from;
717
      const EdgeRefMap& _edge_ref;
718
      const NodeRefMap& _node_ref;
719
    };
720

	
721

	
722
  public:
723

	
724

	
725
    /// \brief Constructor for the GraphCopy.
726
    ///
727
    /// It copies the content of the \c _from graph into the
728
    /// \c _to graph.
729
    GraphCopy(To& to, const From& from)
730
      : _from(from), _to(to) {}
731

	
732
    /// \brief Destructor of the GraphCopy
733
    ///
734
    /// Destructor of the GraphCopy
735
    ~GraphCopy() {
736
      for (int i = 0; i < int(_node_maps.size()); ++i) {
737
        delete _node_maps[i];
738
      }
739
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
740
        delete _arc_maps[i];
741
      }
742
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
743
        delete _edge_maps[i];
744
      }
745

	
746
    }
747

	
748
    /// \brief Copies the node references into the given map.
749
    ///
750
    /// Copies the node references into the given map.
751
    template <typename NodeRef>
752
    GraphCopy& nodeRef(NodeRef& map) {
753
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
754
                           NodeRefMap, NodeRef>(map));
755
      return *this;
756
    }
757

	
758
    /// \brief Copies the node cross references into the given map.
759
    ///
760
    ///  Copies the node cross references (reverse references) into
761
    ///  the given map.
762
    template <typename NodeCrossRef>
763
    GraphCopy& nodeCrossRef(NodeCrossRef& map) {
764
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
765
                           NodeRefMap, NodeCrossRef>(map));
766
      return *this;
767
    }
768

	
769
    /// \brief Make copy of the given map.
770
    ///
771
    /// Makes copy of the given map for the newly created graph.
772
    /// The new map's key type is the to graph's node type,
773
    /// and the copied map's key type is the from graph's node
774
    /// type.
775
    template <typename ToMap, typename FromMap>
776
    GraphCopy& nodeMap(ToMap& tmap, const FromMap& map) {
777
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
778
                           NodeRefMap, ToMap, FromMap>(tmap, map));
779
      return *this;
780
    }
781

	
782
    /// \brief Make a copy of the given node.
783
    ///
784
    /// Make a copy of the given node.
785
    GraphCopy& node(TNode& tnode, const Node& snode) {
786
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
787
                           NodeRefMap, TNode>(tnode, snode));
788
      return *this;
789
    }
790

	
791
    /// \brief Copies the arc references into the given map.
792
    ///
793
    /// Copies the arc references into the given map.
794
    template <typename ArcRef>
795
    GraphCopy& arcRef(ArcRef& map) {
796
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
797
                          ArcRefMap, ArcRef>(map));
798
      return *this;
799
    }
800

	
801
    /// \brief Copies the arc cross references into the given map.
802
    ///
803
    ///  Copies the arc cross references (reverse references) into
804
    ///  the given map.
805
    template <typename ArcCrossRef>
806
    GraphCopy& arcCrossRef(ArcCrossRef& map) {
807
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
808
                          ArcRefMap, ArcCrossRef>(map));
809
      return *this;
810
    }
811

	
812
    /// \brief Make copy of the given map.
813
    ///
814
    /// Makes copy of the given map for the newly created graph.
815
    /// The new map's key type is the to graph's arc type,
816
    /// and the copied map's key type is the from graph's arc
817
    /// type.
818
    template <typename ToMap, typename FromMap>
819
    GraphCopy& arcMap(ToMap& tmap, const FromMap& map) {
820
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
821
                          ArcRefMap, ToMap, FromMap>(tmap, map));
822
      return *this;
823
    }
824

	
825
    /// \brief Make a copy of the given arc.
826
    ///
827
    /// Make a copy of the given arc.
828
    GraphCopy& arc(TArc& tarc, const Arc& sarc) {
829
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
830
                          ArcRefMap, TArc>(tarc, sarc));
831
      return *this;
832
    }
833

	
834
    /// \brief Copies the edge references into the given map.
835
    ///
836
    /// Copies the edge references into the given map.
837
    template <typename EdgeRef>
838
    GraphCopy& edgeRef(EdgeRef& map) {
839
      _edge_maps.push_back(new _core_bits::RefCopy<From, Edge,
840
                           EdgeRefMap, EdgeRef>(map));
841
      return *this;
842
    }
843

	
844
    /// \brief Copies the edge cross references into the given map.
845
    ///
846
    /// Copies the edge cross references (reverse
847
    /// references) into the given map.
848
    template <typename EdgeCrossRef>
849
    GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
850
      _edge_maps.push_back(new _core_bits::CrossRefCopy<From,
851
                           Edge, EdgeRefMap, EdgeCrossRef>(map));
852
      return *this;
853
    }
854

	
855
    /// \brief Make copy of the given map.
856
    ///
857
    /// Makes copy of the given map for the newly created graph.
858
    /// The new map's key type is the to graph's edge type,
859
    /// and the copied map's key type is the from graph's edge
860
    /// type.
861
    template <typename ToMap, typename FromMap>
862
    GraphCopy& edgeMap(ToMap& tmap, const FromMap& map) {
863
      _edge_maps.push_back(new _core_bits::MapCopy<From, Edge,
864
                           EdgeRefMap, ToMap, FromMap>(tmap, map));
865
      return *this;
866
    }
867

	
868
    /// \brief Make a copy of the given edge.
869
    ///
870
    /// Make a copy of the given edge.
871
    GraphCopy& edge(TEdge& tedge, const Edge& sedge) {
872
      _edge_maps.push_back(new _core_bits::ItemCopy<From, Edge,
873
                           EdgeRefMap, TEdge>(tedge, sedge));
874
      return *this;
875
    }
876

	
877
    /// \brief Executes the copies.
878
    ///
879
    /// Executes the copies.
880
    void run() {
881
      NodeRefMap nodeRefMap(_from);
882
      EdgeRefMap edgeRefMap(_from);
883
      ArcRefMap arcRefMap(_to, _from, edgeRefMap, nodeRefMap);
884
      _core_bits::GraphCopySelector<To>::
885
        copy(_to, _from, nodeRefMap, edgeRefMap);
886
      for (int i = 0; i < int(_node_maps.size()); ++i) {
887
        _node_maps[i]->copy(_from, nodeRefMap);
888
      }
889
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
890
        _edge_maps[i]->copy(_from, edgeRefMap);
891
      }
892
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
893
        _arc_maps[i]->copy(_from, arcRefMap);
894
      }
895
    }
896

	
897
  private:
898

	
899
    const From& _from;
900
    To& _to;
901

	
902
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
903
    _node_maps;
904

	
905
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
906
    _arc_maps;
907

	
908
    std::vector<_core_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
909
    _edge_maps;
910

	
911
  };
912

	
913
  /// \brief Copy a graph to another graph.
914
  ///
915
  /// Copy a graph to another graph. The complete usage of the
916
  /// function is detailed in the GraphCopy class, but a short
917
  /// example shows a basic work:
918
  ///\code
919
  /// copyGraph(trg, src).nodeRef(nr).arcCrossRef(ecr).run();
920
  ///\endcode
921
  ///
922
  /// After the copy the \c nr map will contain the mapping from the
923
  /// nodes of the \c from graph to the nodes of the \c to graph and
924
  /// \c ecr will contain the mapping from the arcs of the \c to graph
925
  /// to the arcs of the \c from graph.
926
  ///
927
  /// \see GraphCopy
928
  template <typename To, typename From>
929
  GraphCopy<To, From>
930
  copyGraph(To& to, const From& from) {
931
    return GraphCopy<To, From>(to, from);
932
  }
933

	
934
  namespace _core_bits {
935

	
936
    template <typename Graph, typename Enable = void>
937
    struct FindArcSelector {
938
      typedef typename Graph::Node Node;
939
      typedef typename Graph::Arc Arc;
940
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
941
        if (e == INVALID) {
942
          g.firstOut(e, u);
943
        } else {
944
          g.nextOut(e);
945
        }
946
        while (e != INVALID && g.target(e) != v) {
947
          g.nextOut(e);
948
        }
949
        return e;
950
      }
951
    };
952

	
953
    template <typename Graph>
954
    struct FindArcSelector<
955
      Graph,
956
      typename enable_if<typename Graph::FindEdgeTag, void>::type>
957
    {
958
      typedef typename Graph::Node Node;
959
      typedef typename Graph::Arc Arc;
960
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
961
        return g.findArc(u, v, prev);
962
      }
963
    };
964
  }
965

	
966
  /// \brief Finds an arc between two nodes of a graph.
967
  ///
968
  /// Finds an arc from node \c u to node \c v in graph \c g.
969
  ///
970
  /// If \c prev is \ref INVALID (this is the default value), then
971
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
972
  /// the next arc from \c u to \c v after \c prev.
973
  /// \return The found arc or \ref INVALID if there is no such an arc.
974
  ///
975
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
976
  ///\code
977
  /// for(Arc e=findArc(g,u,v);e!=INVALID;e=findArc(g,u,v,e)) {
978
  ///   ...
979
  /// }
980
  ///\endcode
981
  ///
982
  ///\sa ArcLookUp
983
  ///\sa AllArcLookUp
984
  ///\sa DynArcLookUp
985
  ///\sa ConArcIt
986
  template <typename Graph>
987
  inline typename Graph::Arc
988
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
989
          typename Graph::Arc prev = INVALID) {
990
    return _core_bits::FindArcSelector<Graph>::find(g, u, v, prev);
991
  }
992

	
993
  /// \brief Iterator for iterating on arcs connected the same nodes.
994
  ///
995
  /// Iterator for iterating on arcs connected the same nodes. It is
996
  /// higher level interface for the findArc() function. You can
997
  /// use it the following way:
998
  ///\code
999
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
1000
  ///   ...
1001
  /// }
1002
  ///\endcode
1003
  ///
1004
  ///\sa findArc()
1005
  ///\sa ArcLookUp
1006
  ///\sa AllArcLookUp
1007
  ///\sa DynArcLookUp
1008
  template <typename _Graph>
1009
  class ConArcIt : public _Graph::Arc {
1010
  public:
1011

	
1012
    typedef _Graph Graph;
1013
    typedef typename Graph::Arc Parent;
1014

	
1015
    typedef typename Graph::Arc Arc;
1016
    typedef typename Graph::Node Node;
1017

	
1018
    /// \brief Constructor.
1019
    ///
1020
    /// Construct a new ConArcIt iterating on the arcs which
1021
    /// connects the \c u and \c v node.
1022
    ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
1023
      Parent::operator=(findArc(_graph, u, v));
1024
    }
1025

	
1026
    /// \brief Constructor.
1027
    ///
1028
    /// Construct a new ConArcIt which continues the iterating from
1029
    /// the \c e arc.
1030
    ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
1031

	
1032
    /// \brief Increment operator.
1033
    ///
1034
    /// It increments the iterator and gives back the next arc.
1035
    ConArcIt& operator++() {
1036
      Parent::operator=(findArc(_graph, _graph.source(*this),
1037
                                _graph.target(*this), *this));
1038
      return *this;
1039
    }
1040
  private:
1041
    const Graph& _graph;
1042
  };
1043

	
1044
  namespace _core_bits {
1045

	
1046
    template <typename Graph, typename Enable = void>
1047
    struct FindEdgeSelector {
1048
      typedef typename Graph::Node Node;
1049
      typedef typename Graph::Edge Edge;
1050
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
1051
        bool b;
1052
        if (u != v) {
1053
          if (e == INVALID) {
1054
            g.firstInc(e, b, u);
1055
          } else {
1056
            b = g.u(e) == u;
1057
            g.nextInc(e, b);
1058
          }
1059
          while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) {
1060
            g.nextInc(e, b);
1061
          }
1062
        } else {
1063
          if (e == INVALID) {
1064
            g.firstInc(e, b, u);
1065
          } else {
1066
            b = true;
1067
            g.nextInc(e, b);
1068
          }
1069
          while (e != INVALID && (!b || g.v(e) != v)) {
1070
            g.nextInc(e, b);
1071
          }
1072
        }
1073
        return e;
1074
      }
1075
    };
1076

	
1077
    template <typename Graph>
1078
    struct FindEdgeSelector<
1079
      Graph,
1080
      typename enable_if<typename Graph::FindEdgeTag, void>::type>
1081
    {
1082
      typedef typename Graph::Node Node;
1083
      typedef typename Graph::Edge Edge;
1084
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
1085
        return g.findEdge(u, v, prev);
1086
      }
1087
    };
1088
  }
1089

	
1090
  /// \brief Finds an edge between two nodes of a graph.
1091
  ///
1092
  /// Finds an edge from node \c u to node \c v in graph \c g.
1093
  /// If the node \c u and node \c v is equal then each loop edge
1094
  /// will be enumerated once.
1095
  ///
1096
  /// If \c prev is \ref INVALID (this is the default value), then
1097
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
1098
  /// the next arc from \c u to \c v after \c prev.
1099
  /// \return The found arc or \ref INVALID if there is no such an arc.
1100
  ///
1101
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
1102
  ///\code
1103
  /// for(Edge e = findEdge(g,u,v); e != INVALID;
1104
  ///     e = findEdge(g,u,v,e)) {
1105
  ///   ...
1106
  /// }
1107
  ///\endcode
1108
  ///
1109
  ///\sa ConEdgeIt
1110

	
1111
  template <typename Graph>
1112
  inline typename Graph::Edge
1113
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
1114
            typename Graph::Edge p = INVALID) {
1115
    return _core_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
1116
  }
1117

	
1118
  /// \brief Iterator for iterating on edges connected the same nodes.
1119
  ///
1120
  /// Iterator for iterating on edges connected the same nodes. It is
1121
  /// higher level interface for the findEdge() function. You can
1122
  /// use it the following way:
1123
  ///\code
1124
  /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
1125
  ///   ...
1126
  /// }
1127
  ///\endcode
1128
  ///
1129
  ///\sa findEdge()
1130
  template <typename _Graph>
1131
  class ConEdgeIt : public _Graph::Edge {
1132
  public:
1133

	
1134
    typedef _Graph Graph;
1135
    typedef typename Graph::Edge Parent;
1136

	
1137
    typedef typename Graph::Edge Edge;
1138
    typedef typename Graph::Node Node;
1139

	
1140
    /// \brief Constructor.
1141
    ///
1142
    /// Construct a new ConEdgeIt iterating on the edges which
1143
    /// connects the \c u and \c v node.
1144
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
1145
      Parent::operator=(findEdge(_graph, u, v));
1146
    }
1147

	
1148
    /// \brief Constructor.
1149
    ///
1150
    /// Construct a new ConEdgeIt which continues the iterating from
1151
    /// the \c e edge.
1152
    ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
1153

	
1154
    /// \brief Increment operator.
1155
    ///
1156
    /// It increments the iterator and gives back the next edge.
1157
    ConEdgeIt& operator++() {
1158
      Parent::operator=(findEdge(_graph, _graph.u(*this),
1159
                                 _graph.v(*this), *this));
1160
      return *this;
1161
    }
1162
  private:
1163
    const Graph& _graph;
1164
  };
1165

	
1166

	
1167
  ///Dynamic arc look up between given endpoints.
1168

	
1169
  ///Using this class, you can find an arc in a digraph from a given
1170
  ///source to a given target in amortized time <em>O(log d)</em>,
1171
  ///where <em>d</em> is the out-degree of the source node.
1172
  ///
1173
  ///It is possible to find \e all parallel arcs between two nodes with
1174
  ///the \c findFirst() and \c findNext() members.
1175
  ///
1176
  ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
1177
  ///digraph is not changed so frequently.
1178
  ///
1179
  ///This class uses a self-adjusting binary search tree, Sleator's
1180
  ///and Tarjan's Splay tree for guarantee the logarithmic amortized
1181
  ///time bound for arc lookups. This class also guarantees the
1182
  ///optimal time bound in a constant factor for any distribution of
1183
  ///queries.
1184
  ///
1185
  ///\tparam G The type of the underlying digraph.
1186
  ///
1187
  ///\sa ArcLookUp
1188
  ///\sa AllArcLookUp
1189
  template<class G>
1190
  class DynArcLookUp
1191
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
1192
  {
1193
  public:
1194
    typedef typename ItemSetTraits<G, typename G::Arc>
1195
    ::ItemNotifier::ObserverBase Parent;
1196

	
1197
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1198
    typedef G Digraph;
1199

	
1200
  protected:
1201

	
1202
    class AutoNodeMap : public ItemSetTraits<G, Node>::template Map<Arc>::Type {
1203
    public:
1204

	
1205
      typedef typename ItemSetTraits<G, Node>::template Map<Arc>::Type Parent;
1206

	
1207
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
1208

	
1209
      virtual void add(const Node& node) {
1210
        Parent::add(node);
1211
        Parent::set(node, INVALID);
1212
      }
1213

	
1214
      virtual void add(const std::vector<Node>& nodes) {
1215
        Parent::add(nodes);
1216
        for (int i = 0; i < int(nodes.size()); ++i) {
1217
          Parent::set(nodes[i], INVALID);
1218
        }
1219
      }
1220

	
1221
      virtual void build() {
1222
        Parent::build();
1223
        Node it;
1224
        typename Parent::Notifier* nf = Parent::notifier();
1225
        for (nf->first(it); it != INVALID; nf->next(it)) {
1226
          Parent::set(it, INVALID);
1227
        }
1228
      }
1229
    };
1230

	
1231
    const Digraph &_g;
1232
    AutoNodeMap _head;
1233
    typename Digraph::template ArcMap<Arc> _parent;
1234
    typename Digraph::template ArcMap<Arc> _left;
1235
    typename Digraph::template ArcMap<Arc> _right;
1236

	
1237
    class ArcLess {
1238
      const Digraph &g;
1239
    public:
1240
      ArcLess(const Digraph &_g) : g(_g) {}
1241
      bool operator()(Arc a,Arc b) const
1242
      {
1243
        return g.target(a)<g.target(b);
1244
      }
1245
    };
1246

	
1247
  public:
1248

	
1249
    ///Constructor
1250

	
1251
    ///Constructor.
1252
    ///
1253
    ///It builds up the search database.
1254
    DynArcLookUp(const Digraph &g)
1255
      : _g(g),_head(g),_parent(g),_left(g),_right(g)
1256
    {
1257
      Parent::attach(_g.notifier(typename Digraph::Arc()));
1258
      refresh();
1259
    }
1260

	
1261
  protected:
1262

	
1263
    virtual void add(const Arc& arc) {
1264
      insert(arc);
1265
    }
1266

	
1267
    virtual void add(const std::vector<Arc>& arcs) {
1268
      for (int i = 0; i < int(arcs.size()); ++i) {
1269
        insert(arcs[i]);
1270
      }
1271
    }
1272

	
1273
    virtual void erase(const Arc& arc) {
1274
      remove(arc);
1275
    }
1276

	
1277
    virtual void erase(const std::vector<Arc>& arcs) {
1278
      for (int i = 0; i < int(arcs.size()); ++i) {
1279
        remove(arcs[i]);
1280
      }
1281
    }
1282

	
1283
    virtual void build() {
1284
      refresh();
1285
    }
1286

	
1287
    virtual void clear() {
1288
      for(NodeIt n(_g);n!=INVALID;++n) {
1289
        _head.set(n, INVALID);
1290
      }
1291
    }
1292

	
1293
    void insert(Arc arc) {
1294
      Node s = _g.source(arc);
1295
      Node t = _g.target(arc);
1296
      _left.set(arc, INVALID);
1297
      _right.set(arc, INVALID);
1298

	
1299
      Arc e = _head[s];
1300
      if (e == INVALID) {
1301
        _head.set(s, arc);
1302
        _parent.set(arc, INVALID);
1303
        return;
1304
      }
1305
      while (true) {
1306
        if (t < _g.target(e)) {
1307
          if (_left[e] == INVALID) {
1308
            _left.set(e, arc);
1309
            _parent.set(arc, e);
1310
            splay(arc);
1311
            return;
1312
          } else {
1313
            e = _left[e];
1314
          }
1315
        } else {
1316
          if (_right[e] == INVALID) {
1317
            _right.set(e, arc);
1318
            _parent.set(arc, e);
1319
            splay(arc);
1320
            return;
1321
          } else {
1322
            e = _right[e];
1323
          }
1324
        }
1325
      }
1326
    }
1327

	
1328
    void remove(Arc arc) {
1329
      if (_left[arc] == INVALID) {
1330
        if (_right[arc] != INVALID) {
1331
          _parent.set(_right[arc], _parent[arc]);
1332
        }
1333
        if (_parent[arc] != INVALID) {
1334
          if (_left[_parent[arc]] == arc) {
1335
            _left.set(_parent[arc], _right[arc]);
1336
          } else {
1337
            _right.set(_parent[arc], _right[arc]);
1338
          }
1339
        } else {
1340
          _head.set(_g.source(arc), _right[arc]);
1341
        }
1342
      } else if (_right[arc] == INVALID) {
1343
        _parent.set(_left[arc], _parent[arc]);
1344
        if (_parent[arc] != INVALID) {
1345
          if (_left[_parent[arc]] == arc) {
1346
            _left.set(_parent[arc], _left[arc]);
1347
          } else {
1348
            _right.set(_parent[arc], _left[arc]);
1349
          }
1350
        } else {
1351
          _head.set(_g.source(arc), _left[arc]);
1352
        }
1353
      } else {
1354
        Arc e = _left[arc];
1355
        if (_right[e] != INVALID) {
1356
          e = _right[e];
1357
          while (_right[e] != INVALID) {
1358
            e = _right[e];
1359
          }
1360
          Arc s = _parent[e];
1361
          _right.set(_parent[e], _left[e]);
1362
          if (_left[e] != INVALID) {
1363
            _parent.set(_left[e], _parent[e]);
1364
          }
1365

	
1366
          _left.set(e, _left[arc]);
1367
          _parent.set(_left[arc], e);
1368
          _right.set(e, _right[arc]);
1369
          _parent.set(_right[arc], e);
1370

	
1371
          _parent.set(e, _parent[arc]);
1372
          if (_parent[arc] != INVALID) {
1373
            if (_left[_parent[arc]] == arc) {
1374
              _left.set(_parent[arc], e);
1375
            } else {
1376
              _right.set(_parent[arc], e);
1377
            }
1378
          }
1379
          splay(s);
1380
        } else {
1381
          _right.set(e, _right[arc]);
1382
          _parent.set(_right[arc], e);
1383

	
1384
          if (_parent[arc] != INVALID) {
1385
            if (_left[_parent[arc]] == arc) {
1386
              _left.set(_parent[arc], e);
1387
            } else {
1388
              _right.set(_parent[arc], e);
1389
            }
1390
          } else {
1391
            _head.set(_g.source(arc), e);
1392
          }
1393
        }
1394
      }
1395
    }
1396

	
1397
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1398
    {
1399
      int m=(a+b)/2;
1400
      Arc me=v[m];
1401
      if (a < m) {
1402
        Arc left = refreshRec(v,a,m-1);
1403
        _left.set(me, left);
1404
        _parent.set(left, me);
1405
      } else {
1406
        _left.set(me, INVALID);
1407
      }
1408
      if (m < b) {
1409
        Arc right = refreshRec(v,m+1,b);
1410
        _right.set(me, right);
1411
        _parent.set(right, me);
1412
      } else {
1413
        _right.set(me, INVALID);
1414
      }
1415
      return me;
1416
    }
1417

	
1418
    void refresh() {
1419
      for(NodeIt n(_g);n!=INVALID;++n) {
1420
        std::vector<Arc> v;
1421
        for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
1422
        if(v.size()) {
1423
          std::sort(v.begin(),v.end(),ArcLess(_g));
1424
          Arc head = refreshRec(v,0,v.size()-1);
1425
          _head.set(n, head);
1426
          _parent.set(head, INVALID);
1427
        }
1428
        else _head.set(n, INVALID);
1429
      }
1430
    }
1431

	
1432
    void zig(Arc v) {
1433
      Arc w = _parent[v];
1434
      _parent.set(v, _parent[w]);
1435
      _parent.set(w, v);
1436
      _left.set(w, _right[v]);
1437
      _right.set(v, w);
1438
      if (_parent[v] != INVALID) {
1439
        if (_right[_parent[v]] == w) {
1440
          _right.set(_parent[v], v);
1441
        } else {
1442
          _left.set(_parent[v], v);
1443
        }
1444
      }
1445
      if (_left[w] != INVALID){
1446
        _parent.set(_left[w], w);
1447
      }
1448
    }
1449

	
1450
    void zag(Arc v) {
1451
      Arc w = _parent[v];
1452
      _parent.set(v, _parent[w]);
1453
      _parent.set(w, v);
1454
      _right.set(w, _left[v]);
1455
      _left.set(v, w);
1456
      if (_parent[v] != INVALID){
1457
        if (_left[_parent[v]] == w) {
1458
          _left.set(_parent[v], v);
1459
        } else {
1460
          _right.set(_parent[v], v);
1461
        }
1462
      }
1463
      if (_right[w] != INVALID){
1464
        _parent.set(_right[w], w);
1465
      }
1466
    }
1467

	
1468
    void splay(Arc v) {
1469
      while (_parent[v] != INVALID) {
1470
        if (v == _left[_parent[v]]) {
1471
          if (_parent[_parent[v]] == INVALID) {
1472
            zig(v);
1473
          } else {
1474
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1475
              zig(_parent[v]);
1476
              zig(v);
1477
            } else {
1478
              zig(v);
1479
              zag(v);
1480
            }
1481
          }
1482
        } else {
1483
          if (_parent[_parent[v]] == INVALID) {
1484
            zag(v);
1485
          } else {
1486
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1487
              zag(v);
1488
              zig(v);
1489
            } else {
1490
              zag(_parent[v]);
1491
              zag(v);
1492
            }
1493
          }
1494
        }
1495
      }
1496
      _head[_g.source(v)] = v;
1497
    }
1498

	
1499

	
1500
  public:
1501

	
1502
    ///Find an arc between two nodes.
1503

	
1504
    ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
1505
    /// <em>d</em> is the number of outgoing arcs of \c s.
1506
    ///\param s The source node
1507
    ///\param t The target node
1508
    ///\return An arc from \c s to \c t if there exists,
1509
    ///\ref INVALID otherwise.
1510
    Arc operator()(Node s, Node t) const
1511
    {
1512
      Arc a = _head[s];
1513
      while (true) {
1514
        if (_g.target(a) == t) {
1515
          const_cast<DynArcLookUp&>(*this).splay(a);
1516
          return a;
1517
        } else if (t < _g.target(a)) {
1518
          if (_left[a] == INVALID) {
1519
            const_cast<DynArcLookUp&>(*this).splay(a);
1520
            return INVALID;
1521
          } else {
1522
            a = _left[a];
1523
          }
1524
        } else  {
1525
          if (_right[a] == INVALID) {
1526
            const_cast<DynArcLookUp&>(*this).splay(a);
1527
            return INVALID;
1528
          } else {
1529
            a = _right[a];
1530
          }
1531
        }
1532
      }
1533
    }
1534

	
1535
    ///Find the first arc between two nodes.
1536

	
1537
    ///Find the first arc between two nodes in time
1538
    /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
1539
    /// outgoing arcs of \c s.
1540
    ///\param s The source node
1541
    ///\param t The target node
1542
    ///\return An arc from \c s to \c t if there exists, \ref INVALID
1543
    /// otherwise.
1544
    Arc findFirst(Node s, Node t) const
1545
    {
1546
      Arc a = _head[s];
1547
      Arc r = INVALID;
1548
      while (true) {
1549
        if (_g.target(a) < t) {
1550
          if (_right[a] == INVALID) {
1551
            const_cast<DynArcLookUp&>(*this).splay(a);
1552
            return r;
1553
          } else {
1554
            a = _right[a];
1555
          }
1556
        } else {
1557
          if (_g.target(a) == t) {
1558
            r = a;
1559
          }
1560
          if (_left[a] == INVALID) {
1561
            const_cast<DynArcLookUp&>(*this).splay(a);
1562
            return r;
1563
          } else {
1564
            a = _left[a];
1565
          }
1566
        }
1567
      }
1568
    }
1569

	
1570
    ///Find the next arc between two nodes.
1571

	
1572
    ///Find the next arc between two nodes in time
1573
    /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
1574
    /// outgoing arcs of \c s.
1575
    ///\param s The source node
1576
    ///\param t The target node
1577
    ///\return An arc from \c s to \c t if there exists, \ref INVALID
1578
    /// otherwise.
1579

	
1580
    ///\note If \c e is not the result of the previous \c findFirst()
1581
    ///operation then the amorized time bound can not be guaranteed.
1582
#ifdef DOXYGEN
1583
    Arc findNext(Node s, Node t, Arc a) const
1584
#else
1585
    Arc findNext(Node, Node t, Arc a) const
1586
#endif
1587
    {
1588
      if (_right[a] != INVALID) {
1589
        a = _right[a];
1590
        while (_left[a] != INVALID) {
1591
          a = _left[a];
1592
        }
1593
        const_cast<DynArcLookUp&>(*this).splay(a);
1594
      } else {
1595
        while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
1596
          a = _parent[a];
1597
        }
1598
        if (_parent[a] == INVALID) {
1599
          return INVALID;
1600
        } else {
1601
          a = _parent[a];
1602
          const_cast<DynArcLookUp&>(*this).splay(a);
1603
        }
1604
      }
1605
      if (_g.target(a) == t) return a;
1606
      else return INVALID;
1607
    }
1608

	
1609
  };
1610

	
1611
  ///Fast arc look up between given endpoints.
1612

	
1613
  ///Using this class, you can find an arc in a digraph from a given
1614
  ///source to a given target in time <em>O(log d)</em>,
1615
  ///where <em>d</em> is the out-degree of the source node.
1616
  ///
1617
  ///It is not possible to find \e all parallel arcs between two nodes.
1618
  ///Use \ref AllArcLookUp for this purpose.
1619
  ///
1620
  ///\warning This class is static, so you should refresh() (or at least
1621
  ///refresh(Node)) this data structure
1622
  ///whenever the digraph changes. This is a time consuming (superlinearly
1623
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
1624
  ///
1625
  ///\tparam G The type of the underlying digraph.
1626
  ///
1627
  ///\sa DynArcLookUp
1628
  ///\sa AllArcLookUp
1629
  template<class G>
1630
  class ArcLookUp
1631
  {
1632
  public:
1633
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1634
    typedef G Digraph;
1635

	
1636
  protected:
1637
    const Digraph &_g;
1638
    typename Digraph::template NodeMap<Arc> _head;
1639
    typename Digraph::template ArcMap<Arc> _left;
1640
    typename Digraph::template ArcMap<Arc> _right;
1641

	
1642
    class ArcLess {
1643
      const Digraph &g;
1644
    public:
1645
      ArcLess(const Digraph &_g) : g(_g) {}
1646
      bool operator()(Arc a,Arc b) const
1647
      {
1648
        return g.target(a)<g.target(b);
1649
      }
1650
    };
1651

	
1652
  public:
1653

	
1654
    ///Constructor
1655

	
1656
    ///Constructor.
1657
    ///
1658
    ///It builds up the search database, which remains valid until the digraph
1659
    ///changes.
1660
    ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
1661

	
1662
  private:
1663
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1664
    {
1665
      int m=(a+b)/2;
1666
      Arc me=v[m];
1667
      _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
1668
      _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
1669
      return me;
1670
    }
1671
  public:
1672
    ///Refresh the data structure at a node.
1673

	
1674
    ///Build up the search database of node \c n.
1675
    ///
1676
    ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
1677
    ///the number of the outgoing arcs of \c n.
1678
    void refresh(Node n)
1679
    {
1680
      std::vector<Arc> v;
1681
      for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
1682
      if(v.size()) {
1683
        std::sort(v.begin(),v.end(),ArcLess(_g));
1684
        _head[n]=refreshRec(v,0,v.size()-1);
1685
      }
1686
      else _head[n]=INVALID;
1687
    }
1688
    ///Refresh the full data structure.
1689

	
1690
    ///Build up the full search database. In fact, it simply calls
1691
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1692
    ///
1693
    ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
1694
    ///the number of the arcs of \c n and <em>D</em> is the maximum
1695
    ///out-degree of the digraph.
1696

	
1697
    void refresh()
1698
    {
1699
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
1700
    }
1701

	
1702
    ///Find an arc between two nodes.
1703

	
1704
    ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
1705
    /// <em>d</em> is the number of outgoing arcs of \c s.
1706
    ///\param s The source node
1707
    ///\param t The target node
1708
    ///\return An arc from \c s to \c t if there exists,
1709
    ///\ref INVALID otherwise.
1710
    ///
1711
    ///\warning If you change the digraph, refresh() must be called before using
1712
    ///this operator. If you change the outgoing arcs of
1713
    ///a single node \c n, then
1714
    ///\ref refresh(Node) "refresh(n)" is enough.
1715
    ///
1716
    Arc operator()(Node s, Node t) const
1717
    {
1718
      Arc e;
1719
      for(e=_head[s];
1720
          e!=INVALID&&_g.target(e)!=t;
1721
          e = t < _g.target(e)?_left[e]:_right[e]) ;
1722
      return e;
1723
    }
1724

	
1725
  };
1726

	
1727
  ///Fast look up of all arcs between given endpoints.
1728

	
1729
  ///This class is the same as \ref ArcLookUp, with the addition
1730
  ///that it makes it possible to find all arcs between given endpoints.
1731
  ///
1732
  ///\warning This class is static, so you should refresh() (or at least
1733
  ///refresh(Node)) this data structure
1734
  ///whenever the digraph changes. This is a time consuming (superlinearly
1735
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
1736
  ///
1737
  ///\tparam G The type of the underlying digraph.
1738
  ///
1739
  ///\sa DynArcLookUp
1740
  ///\sa ArcLookUp
1741
  template<class G>
1742
  class AllArcLookUp : public ArcLookUp<G>
1743
  {
1744
    using ArcLookUp<G>::_g;
1745
    using ArcLookUp<G>::_right;
1746
    using ArcLookUp<G>::_left;
1747
    using ArcLookUp<G>::_head;
1748

	
1749
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1750
    typedef G Digraph;
1751

	
1752
    typename Digraph::template ArcMap<Arc> _next;
1753

	
1754
    Arc refreshNext(Arc head,Arc next=INVALID)
1755
    {
1756
      if(head==INVALID) return next;
1757
      else {
1758
        next=refreshNext(_right[head],next);
1759
//         _next[head]=next;
1760
        _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
1761
          ? next : INVALID;
1762
        return refreshNext(_left[head],head);
1763
      }
1764
    }
1765

	
1766
    void refreshNext()
1767
    {
1768
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
1769
    }
1770

	
1771
  public:
1772
    ///Constructor
1773

	
1774
    ///Constructor.
1775
    ///
1776
    ///It builds up the search database, which remains valid until the digraph
1777
    ///changes.
1778
    AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
1779

	
1780
    ///Refresh the data structure at a node.
1781

	
1782
    ///Build up the search database of node \c n.
1783
    ///
1784
    ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
1785
    ///the number of the outgoing arcs of \c n.
1786

	
1787
    void refresh(Node n)
1788
    {
1789
      ArcLookUp<G>::refresh(n);
1790
      refreshNext(_head[n]);
1791
    }
1792

	
1793
    ///Refresh the full data structure.
1794

	
1795
    ///Build up the full search database. In fact, it simply calls
1796
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1797
    ///
1798
    ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
1799
    ///the number of the arcs of \c n and <em>D</em> is the maximum
1800
    ///out-degree of the digraph.
1801

	
1802
    void refresh()
1803
    {
1804
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
1805
    }
1806

	
1807
    ///Find an arc between two nodes.
1808

	
1809
    ///Find an arc between two nodes.
1810
    ///\param s The source node
1811
    ///\param t The target node
1812
    ///\param prev The previous arc between \c s and \c t. It it is INVALID or
1813
    ///not given, the operator finds the first appropriate arc.
1814
    ///\return An arc from \c s to \c t after \c prev or
1815
    ///\ref INVALID if there is no more.
1816
    ///
1817
    ///For example, you can count the number of arcs from \c u to \c v in the
1818
    ///following way.
1819
    ///\code
1820
    ///AllArcLookUp<ListDigraph> ae(g);
1821
    ///...
1822
    ///int n=0;
1823
    ///for(Arc e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++;
1824
    ///\endcode
1825
    ///
1826
    ///Finding the first arc take <em>O(</em>log<em>d)</em> time, where
1827
    /// <em>d</em> is the number of outgoing arcs of \c s. Then, the
1828
    ///consecutive arcs are found in constant time.
1829
    ///
1830
    ///\warning If you change the digraph, refresh() must be called before using
1831
    ///this operator. If you change the outgoing arcs of
1832
    ///a single node \c n, then
1833
    ///\ref refresh(Node) "refresh(n)" is enough.
1834
    ///
1835
#ifdef DOXYGEN
1836
    Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
1837
#else
1838
    using ArcLookUp<G>::operator() ;
1839
    Arc operator()(Node s, Node t, Arc prev) const
1840
    {
1841
      return prev==INVALID?(*this)(s,t):_next[prev];
1842
    }
1843
#endif
1844

	
1845
  };
1846

	
1847
  /// @}
1848

	
1849
} //namespace lemon
1850

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

	
19 19
/// \ingroup demos
20 20
/// \file
21 21
/// \brief Demo of the graph drawing function \ref graphToEps()
22 22
///
23 23
/// This demo program shows examples how to use the function \ref
24 24
/// graphToEps(). It takes no input but simply creates seven
25 25
/// <tt>.eps</tt> files demonstrating the capability of \ref
26 26
/// graphToEps(), and showing how to draw directed graphs,
27 27
/// how to handle parallel egdes, how to change the properties (like
28 28
/// color, shape, size, title etc.) of nodes and arcs individually
29 29
/// using appropriate \ref maps-page "graph maps".
30 30
///
31 31
/// \include graph_to_eps_demo.cc
32 32

	
33 33
#include<lemon/list_graph.h>
34
#include<lemon/graph_utils.h>
35 34
#include<lemon/graph_to_eps.h>
36 35
#include<lemon/math.h>
37 36

	
38 37
using namespace std;
39 38
using namespace lemon;
40 39

	
41 40
int main()
42 41
{
43 42
  Palette palette;
44 43
  Palette paletteW(true);
45 44

	
46 45
  // Create a small digraph
47 46
  ListDigraph g;
48 47
  typedef ListDigraph::Node Node;
49 48
  typedef ListDigraph::NodeIt NodeIt;
50 49
  typedef ListDigraph::Arc Arc;
51 50
  typedef dim2::Point<int> Point;
52 51

	
53 52
  Node n1=g.addNode();
54 53
  Node n2=g.addNode();
55 54
  Node n3=g.addNode();
56 55
  Node n4=g.addNode();
57 56
  Node n5=g.addNode();
58 57

	
59 58
  ListDigraph::NodeMap<Point> coords(g);
60 59
  ListDigraph::NodeMap<double> sizes(g);
61 60
  ListDigraph::NodeMap<int> colors(g);
62 61
  ListDigraph::NodeMap<int> shapes(g);
63 62
  ListDigraph::ArcMap<int> acolors(g);
64 63
  ListDigraph::ArcMap<int> widths(g);
65 64

	
66 65
  coords[n1]=Point(50,50);  sizes[n1]=1; colors[n1]=1; shapes[n1]=0;
67 66
  coords[n2]=Point(50,70);  sizes[n2]=2; colors[n2]=2; shapes[n2]=2;
68 67
  coords[n3]=Point(70,70);  sizes[n3]=1; colors[n3]=3; shapes[n3]=0;
69 68
  coords[n4]=Point(70,50);  sizes[n4]=2; colors[n4]=4; shapes[n4]=1;
70 69
  coords[n5]=Point(85,60);  sizes[n5]=3; colors[n5]=5; shapes[n5]=2;
71 70

	
72 71
  Arc a;
73 72

	
74 73
  a=g.addArc(n1,n2); acolors[a]=0; widths[a]=1;
75 74
  a=g.addArc(n2,n3); acolors[a]=0; widths[a]=1;
76 75
  a=g.addArc(n3,n5); acolors[a]=0; widths[a]=3;
77 76
  a=g.addArc(n5,n4); acolors[a]=0; widths[a]=1;
78 77
  a=g.addArc(n4,n1); acolors[a]=0; widths[a]=1;
79 78
  a=g.addArc(n2,n4); acolors[a]=1; widths[a]=2;
80 79
  a=g.addArc(n3,n4); acolors[a]=2; widths[a]=1;
81 80

	
82 81
  IdMap<ListDigraph,Node> id(g);
83 82

	
84 83
  // Create .eps files showing the digraph with different options
85 84
  cout << "Create 'graph_to_eps_demo_out_1_pure.eps'" << endl;
86 85
  graphToEps(g,"graph_to_eps_demo_out_1_pure.eps").
87 86
    coords(coords).
88 87
    title("Sample .eps figure").
89 88
    copyright("(C) 2003-2008 LEMON Project").
90 89
    run();
91 90

	
92 91
  cout << "Create 'graph_to_eps_demo_out_2.eps'" << endl;
93 92
  graphToEps(g,"graph_to_eps_demo_out_2.eps").
94 93
    coords(coords).
95 94
    title("Sample .eps figure").
96 95
    copyright("(C) 2003-2008 LEMON Project").
97 96
    absoluteNodeSizes().absoluteArcWidths().
98 97
    nodeScale(2).nodeSizes(sizes).
99 98
    nodeShapes(shapes).
100 99
    nodeColors(composeMap(palette,colors)).
101 100
    arcColors(composeMap(palette,acolors)).
102 101
    arcWidthScale(.4).arcWidths(widths).
103 102
    nodeTexts(id).nodeTextSize(3).
104 103
    run();
105 104

	
106 105
  cout << "Create 'graph_to_eps_demo_out_3_arr.eps'" << endl;
107 106
  graphToEps(g,"graph_to_eps_demo_out_3_arr.eps").
108 107
    title("Sample .eps figure (with arrowheads)").
109 108
    copyright("(C) 2003-2008 LEMON Project").
110 109
    absoluteNodeSizes().absoluteArcWidths().
111 110
    nodeColors(composeMap(palette,colors)).
112 111
    coords(coords).
113 112
    nodeScale(2).nodeSizes(sizes).
114 113
    nodeShapes(shapes).
115 114
    arcColors(composeMap(palette,acolors)).
116 115
    arcWidthScale(.4).arcWidths(widths).
117 116
    nodeTexts(id).nodeTextSize(3).
118 117
    drawArrows().arrowWidth(2).arrowLength(2).
119 118
    run();
120 119

	
121 120
  // Add more arcs to the digraph
122 121
  a=g.addArc(n1,n4); acolors[a]=2; widths[a]=1;
123 122
  a=g.addArc(n4,n1); acolors[a]=1; widths[a]=2;
124 123

	
125 124
  a=g.addArc(n1,n2); acolors[a]=1; widths[a]=1;
126 125
  a=g.addArc(n1,n2); acolors[a]=2; widths[a]=1;
127 126
  a=g.addArc(n1,n2); acolors[a]=3; widths[a]=1;
128 127
  a=g.addArc(n1,n2); acolors[a]=4; widths[a]=1;
129 128
  a=g.addArc(n1,n2); acolors[a]=5; widths[a]=1;
130 129
  a=g.addArc(n1,n2); acolors[a]=6; widths[a]=1;
131 130
  a=g.addArc(n1,n2); acolors[a]=7; widths[a]=1;
132 131

	
133 132
  cout << "Create 'graph_to_eps_demo_out_4_par.eps'" << endl;
134 133
  graphToEps(g,"graph_to_eps_demo_out_4_par.eps").
135 134
    title("Sample .eps figure (parallel arcs)").
136 135
    copyright("(C) 2003-2008 LEMON Project").
137 136
    absoluteNodeSizes().absoluteArcWidths().
138 137
    nodeShapes(shapes).
139 138
    coords(coords).
140 139
    nodeScale(2).nodeSizes(sizes).
141 140
    nodeColors(composeMap(palette,colors)).
142 141
    arcColors(composeMap(palette,acolors)).
143 142
    arcWidthScale(.4).arcWidths(widths).
144 143
    nodeTexts(id).nodeTextSize(3).
145 144
    enableParallel().parArcDist(1.5).
146 145
    run();
147 146

	
148 147
  cout << "Create 'graph_to_eps_demo_out_5_par_arr.eps'" << endl;
149 148
  graphToEps(g,"graph_to_eps_demo_out_5_par_arr.eps").
150 149
    title("Sample .eps figure (parallel arcs and arrowheads)").
151 150
    copyright("(C) 2003-2008 LEMON Project").
152 151
    absoluteNodeSizes().absoluteArcWidths().
153 152
    nodeScale(2).nodeSizes(sizes).
154 153
    coords(coords).
155 154
    nodeShapes(shapes).
156 155
    nodeColors(composeMap(palette,colors)).
157 156
    arcColors(composeMap(palette,acolors)).
158 157
    arcWidthScale(.3).arcWidths(widths).
159 158
    nodeTexts(id).nodeTextSize(3).
160 159
    enableParallel().parArcDist(1).
161 160
    drawArrows().arrowWidth(1).arrowLength(1).
162 161
    run();
163 162

	
164 163
  cout << "Create 'graph_to_eps_demo_out_6_par_arr_a4.eps'" << endl;
165 164
  graphToEps(g,"graph_to_eps_demo_out_6_par_arr_a4.eps").
166 165
    title("Sample .eps figure (fits to A4)").
167 166
    copyright("(C) 2003-2008 LEMON Project").
168 167
    scaleToA4().
169 168
    absoluteNodeSizes().absoluteArcWidths().
170 169
    nodeScale(2).nodeSizes(sizes).
171 170
    coords(coords).
172 171
    nodeShapes(shapes).
173 172
    nodeColors(composeMap(palette,colors)).
174 173
    arcColors(composeMap(palette,acolors)).
175 174
    arcWidthScale(.3).arcWidths(widths).
176 175
    nodeTexts(id).nodeTextSize(3).
177 176
    enableParallel().parArcDist(1).
178 177
    drawArrows().arrowWidth(1).arrowLength(1).
179 178
    run();
180 179

	
181 180
  // Create an .eps file showing the colors of a default Palette
182 181
  ListDigraph h;
183 182
  ListDigraph::NodeMap<int> hcolors(h);
184 183
  ListDigraph::NodeMap<Point> hcoords(h);
185 184

	
186 185
  int cols=int(sqrt(double(palette.size())));
187 186
  for(int i=0;i<int(paletteW.size());i++) {
188 187
    Node n=h.addNode();
189 188
    hcoords[n]=Point(1+i%cols,1+i/cols);
190 189
    hcolors[n]=i;
191 190
  }
192 191

	
193 192
  cout << "Create 'graph_to_eps_demo_out_7_colors.eps'" << endl;
194 193
  graphToEps(h,"graph_to_eps_demo_out_7_colors.eps").
195 194
    scale(60).
196 195
    title("Sample .eps figure (Palette demo)").
197 196
    copyright("(C) 2003-2008 LEMON Project").
198 197
    coords(hcoords).
199 198
    absoluteNodeSizes().absoluteArcWidths().
200 199
    nodeScale(.45).
201 200
    distantColorNodeTexts().
202 201
    nodeTexts(hcolors).nodeTextSize(.6).
203 202
    nodeColors(composeMap(paletteW,hcolors)).
204 203
    run();
205 204

	
206 205
  return 0;
207 206
}
Ignore white space 384 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt
4 4

	
5 5
pkgconfig_DATA += lemon/lemon.pc
6 6

	
7 7
lib_LTLIBRARIES += lemon/libemon.la
8 8

	
9 9
lemon_libemon_la_SOURCES = \
10 10
        lemon/arg_parser.cc \
11 11
        lemon/base.cc \
12 12
        lemon/color.cc \
13 13
        lemon/random.cc
14 14

	
15 15

	
16 16
lemon_libemon_la_CXXFLAGS = $(GLPK_CFLAGS) $(CPLEX_CFLAGS) $(SOPLEX_CXXFLAGS)
17 17
lemon_libemon_la_LDFLAGS = $(GLPK_LIBS) $(CPLEX_LIBS) $(SOPLEX_LIBS)
18 18

	
19 19
lemon_HEADERS += \
20 20
        lemon/arg_parser.h \
21 21
	lemon/assert.h \
22 22
        lemon/bfs.h \
23 23
        lemon/bin_heap.h \
24 24
        lemon/color.h \
25 25
	lemon/concept_check.h \
26 26
        lemon/counter.h \
27
	lemon/core.h \
27 28
        lemon/dfs.h \
28 29
        lemon/dijkstra.h \
29 30
        lemon/dim2.h \
30 31
	lemon/error.h \
31 32
        lemon/graph_to_eps.h \
32
	lemon/graph_utils.h \
33 33
	lemon/kruskal.h \
34 34
	lemon/lgf_reader.h \
35 35
	lemon/lgf_writer.h \
36 36
	lemon/list_graph.h \
37 37
	lemon/maps.h \
38 38
	lemon/math.h \
39 39
	lemon/path.h \
40 40
        lemon/random.h \
41 41
	lemon/smart_graph.h \
42 42
        lemon/time_measure.h \
43 43
        lemon/tolerance.h \
44 44
	lemon/unionfind.h
45 45

	
46 46
bits_HEADERS += \
47 47
	lemon/bits/alteration_notifier.h \
48 48
	lemon/bits/array_map.h \
49 49
	lemon/bits/base_extender.h \
50 50
        lemon/bits/bezier.h \
51 51
	lemon/bits/default_map.h \
52
        lemon/bits/enable_if.h \
52 53
	lemon/bits/graph_extender.h \
53
        lemon/bits/invalid.h \
54 54
	lemon/bits/map_extender.h \
55 55
	lemon/bits/path_dump.h \
56 56
	lemon/bits/traits.h \
57
        lemon/bits/utility.h \
58 57
	lemon/bits/vector_map.h
59 58

	
60 59
concept_HEADERS += \
61 60
	lemon/concepts/digraph.h \
62 61
	lemon/concepts/graph.h \
63 62
	lemon/concepts/graph_components.h \
64 63
	lemon/concepts/heap.h \
65 64
	lemon/concepts/maps.h \
66 65
	lemon/concepts/path.h
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\file
20 20
///\brief Some basic non-inline functions and static global data.
21 21

	
22 22
#include<lemon/tolerance.h>
23
#include<lemon/bits/invalid.h>
23
#include<lemon/core.h>
24 24
namespace lemon {
25 25

	
26 26
  float Tolerance<float>::def_epsilon = 1e-4;
27 27
  double Tolerance<double>::def_epsilon = 1e-10;
28 28
  long double Tolerance<long double>::def_epsilon = 1e-14;
29 29

	
30 30
#ifndef LEMON_ONLY_TEMPLATES
31 31
  const Invalid INVALID = Invalid();
32 32
#endif
33 33

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

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief Bfs algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27
#include <lemon/graph_utils.h>
28 27
#include <lemon/bits/path_dump.h>
29
#include <lemon/bits/invalid.h>
28
#include <lemon/core.h>
30 29
#include <lemon/error.h>
31 30
#include <lemon/maps.h>
32 31

	
33 32
namespace lemon {
34 33

	
35 34

	
36 35

	
37 36
  ///Default traits class of Bfs class.
38 37

	
39 38
  ///Default traits class of Bfs class.
40 39
  ///\tparam GR Digraph type.
41 40
  template<class GR>
42 41
  struct BfsDefaultTraits
43 42
  {
44 43
    ///The digraph type the algorithm runs on.
45 44
    typedef GR Digraph;
46 45
    ///\brief The type of the map that stores the last
47 46
    ///arcs of the shortest paths.
48 47
    ///
49 48
    ///The type of the map that stores the last
50 49
    ///arcs of the shortest paths.
51 50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 51
    ///
53 52
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
54 53
    ///Instantiates a PredMap.
55 54

	
56 55
    ///This function instantiates a \ref PredMap.
57 56
    ///\param G is the digraph, to which we would like to define the PredMap.
58 57
    ///\todo The digraph alone may be insufficient to initialize
59 58
    static PredMap *createPredMap(const GR &G)
60 59
    {
61 60
      return new PredMap(G);
62 61
    }
63 62
    ///The type of the map that indicates which nodes are processed.
64 63

	
65 64
    ///The type of the map that indicates which nodes are processed.
66 65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
67 66
    ///\todo named parameter to set this type, function to read and write.
68 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
69 68
    ///Instantiates a ProcessedMap.
70 69

	
71 70
    ///This function instantiates a \ref ProcessedMap.
72 71
    ///\param g is the digraph, to which
73 72
    ///we would like to define the \ref ProcessedMap
74 73
#ifdef DOXYGEN
75 74
    static ProcessedMap *createProcessedMap(const GR &g)
76 75
#else
77 76
    static ProcessedMap *createProcessedMap(const GR &)
78 77
#endif
79 78
    {
80 79
      return new ProcessedMap();
81 80
    }
82 81
    ///The type of the map that indicates which nodes are reached.
83 82

	
84 83
    ///The type of the map that indicates which nodes are reached.
85 84
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
86 85
    ///\todo named parameter to set this type, function to read and write.
87 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
88 87
    ///Instantiates a ReachedMap.
89 88

	
90 89
    ///This function instantiates a \ref ReachedMap.
91 90
    ///\param G is the digraph, to which
92 91
    ///we would like to define the \ref ReachedMap.
93 92
    static ReachedMap *createReachedMap(const GR &G)
94 93
    {
95 94
      return new ReachedMap(G);
96 95
    }
97 96
    ///The type of the map that stores the dists of the nodes.
98 97

	
99 98
    ///The type of the map that stores the dists of the nodes.
100 99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 100
    ///
102 101
    typedef typename Digraph::template NodeMap<int> DistMap;
103 102
    ///Instantiates a DistMap.
104 103

	
105 104
    ///This function instantiates a \ref DistMap.
106 105
    ///\param G is the digraph, to which we would like to define
107 106
    ///the \ref DistMap
108 107
    static DistMap *createDistMap(const GR &G)
109 108
    {
110 109
      return new DistMap(G);
111 110
    }
112 111
  };
113 112

	
114 113
  ///%BFS algorithm class.
115 114

	
116 115
  ///\ingroup search
117 116
  ///This class provides an efficient implementation of the %BFS algorithm.
118 117
  ///
119 118
  ///\tparam GR The digraph type the algorithm runs on. The default value is
120 119
  ///\ref ListDigraph. The value of GR is not used directly by Bfs, it
121 120
  ///is only passed to \ref BfsDefaultTraits.
122 121
  ///\tparam TR Traits class to set various data types used by the algorithm.
123 122
  ///The default traits class is
124 123
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
125 124
  ///See \ref BfsDefaultTraits for the documentation of
126 125
  ///a Bfs traits class.
127 126

	
128 127
#ifdef DOXYGEN
129 128
  template <typename GR,
130 129
            typename TR>
131 130
#else
132 131
  template <typename GR=ListDigraph,
133 132
            typename TR=BfsDefaultTraits<GR> >
134 133
#endif
135 134
  class Bfs {
136 135
  public:
137 136
    /**
138 137
     * \brief \ref Exception for uninitialized parameters.
139 138
     *
140 139
     * This error represents problems in the initialization
141 140
     * of the parameters of the algorithms.
142 141
     */
143 142
    class UninitializedParameter : public lemon::UninitializedParameter {
144 143
    public:
145 144
      virtual const char* what() const throw() {
146 145
        return "lemon::Bfs::UninitializedParameter";
147 146
      }
148 147
    };
149 148

	
150 149
    typedef TR Traits;
151 150
    ///The type of the underlying digraph.
152 151
    typedef typename TR::Digraph Digraph;
153 152

	
154 153
    ///\brief The type of the map that stores the last
155 154
    ///arcs of the shortest paths.
156 155
    typedef typename TR::PredMap PredMap;
157 156
    ///The type of the map indicating which nodes are reached.
158 157
    typedef typename TR::ReachedMap ReachedMap;
159 158
    ///The type of the map indicating which nodes are processed.
160 159
    typedef typename TR::ProcessedMap ProcessedMap;
161 160
    ///The type of the map that stores the dists of the nodes.
162 161
    typedef typename TR::DistMap DistMap;
163 162
  private:
164 163

	
165 164
    typedef typename Digraph::Node Node;
166 165
    typedef typename Digraph::NodeIt NodeIt;
167 166
    typedef typename Digraph::Arc Arc;
168 167
    typedef typename Digraph::OutArcIt OutArcIt;
169 168

	
170 169
    /// Pointer to the underlying digraph.
171 170
    const Digraph *G;
172 171
    ///Pointer to the map of predecessors arcs.
173 172
    PredMap *_pred;
174 173
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
175 174
    bool local_pred;
176 175
    ///Pointer to the map of distances.
177 176
    DistMap *_dist;
178 177
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
179 178
    bool local_dist;
180 179
    ///Pointer to the map of reached status of the nodes.
181 180
    ReachedMap *_reached;
182 181
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
183 182
    bool local_reached;
184 183
    ///Pointer to the map of processed status of the nodes.
185 184
    ProcessedMap *_processed;
186 185
    ///Indicates if \ref _processed is locally allocated (\c true) or not.
187 186
    bool local_processed;
188 187

	
189 188
    std::vector<typename Digraph::Node> _queue;
190 189
    int _queue_head,_queue_tail,_queue_next_dist;
191 190
    int _curr_dist;
192 191

	
193 192
    ///Creates the maps if necessary.
194 193

	
195 194
    ///\todo Better memory allocation (instead of new).
196 195
    void create_maps()
197 196
    {
198 197
      if(!_pred) {
199 198
        local_pred = true;
200 199
        _pred = Traits::createPredMap(*G);
201 200
      }
202 201
      if(!_dist) {
203 202
        local_dist = true;
204 203
        _dist = Traits::createDistMap(*G);
205 204
      }
206 205
      if(!_reached) {
207 206
        local_reached = true;
208 207
        _reached = Traits::createReachedMap(*G);
209 208
      }
210 209
      if(!_processed) {
211 210
        local_processed = true;
212 211
        _processed = Traits::createProcessedMap(*G);
213 212
      }
214 213
    }
215 214

	
216 215
  protected:
217 216

	
218 217
    Bfs() {}
219 218

	
220 219
  public:
221 220

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

	
19 19
#ifndef LEMON_BITS_ALTERATION_NOTIFIER_H
20 20
#define LEMON_BITS_ALTERATION_NOTIFIER_H
21 21

	
22 22
#include <vector>
23 23
#include <list>
24 24

	
25
#include <lemon/bits/utility.h>
25
#include <lemon/core.h>
26 26

	
27 27
///\ingroup graphbits
28 28
///\file
29 29
///\brief Observer notifier for graph alteration observers.
30 30

	
31 31
namespace lemon {
32 32

	
33 33
  /// \ingroup graphbits
34 34
  ///
35 35
  /// \brief Notifier class to notify observes about alterations in
36 36
  /// a container.
37 37
  ///
38 38
  /// The simple graph's can be refered as two containers, one node container
39 39
  /// and one edge container. But they are not standard containers they
40 40
  /// does not store values directly they are just key continars for more
41 41
  /// value containers which are the node and edge maps.
42 42
  ///
43 43
  /// The graph's node and edge sets can be changed as we add or erase
44 44
  /// nodes and edges in the graph. Lemon would like to handle easily
45 45
  /// that the node and edge maps should contain values for all nodes or
46 46
  /// edges. If we want to check on every indicing if the map contains
47 47
  /// the current indicing key that cause a drawback in the performance
48 48
  /// in the library. We use another solution we notify all maps about
49 49
  /// an alteration in the graph, which cause only drawback on the
50 50
  /// alteration of the graph.
51 51
  ///
52 52
  /// This class provides an interface to the container. The \e first() and \e
53 53
  /// next() member functions make possible to iterate on the keys of the
54 54
  /// container. The \e id() function returns an integer id for each key.
55 55
  /// The \e maxId() function gives back an upper bound of the ids.
56 56
  ///
57 57
  /// For the proper functonality of this class, we should notify it
58 58
  /// about each alteration in the container. The alterations have four type
59 59
  /// as \e add(), \e erase(), \e build() and \e clear(). The \e add() and
60 60
  /// \e erase() signals that only one or few items added or erased to or
61 61
  /// from the graph. If all items are erased from the graph or from an empty
62 62
  /// graph a new graph is builded then it can be signaled with the
63 63
  /// clear() and build() members. Important rule that if we erase items
64 64
  /// from graph we should first signal the alteration and after that erase
65 65
  /// them from the container, on the other way on item addition we should
66 66
  /// first extend the container and just after that signal the alteration.
67 67
  ///
68 68
  /// The alteration can be observed with a class inherited from the
69 69
  /// \e ObserverBase nested class. The signals can be handled with
70 70
  /// overriding the virtual functions defined in the base class.  The
71 71
  /// observer base can be attached to the notifier with the
72 72
  /// \e attach() member and can be detached with detach() function. The
73 73
  /// alteration handlers should not call any function which signals
74 74
  /// an other alteration in the same notifier and should not
75 75
  /// detach any observer from the notifier.
76 76
  ///
77 77
  /// Alteration observers try to be exception safe. If an \e add() or
78 78
  /// a \e clear() function throws an exception then the remaining
79 79
  /// observeres will not be notified and the fulfilled additions will
80 80
  /// be rolled back by calling the \e erase() or \e clear()
81 81
  /// functions. Thence the \e erase() and \e clear() should not throw
82 82
  /// exception. Actullay, it can be throw only
83 83
  /// \ref AlterationObserver::ImmediateDetach ImmediateDetach
84 84
  /// exception which detach the observer from the notifier.
85 85
  ///
86 86
  /// There are some place when the alteration observing is not completly
87 87
  /// reliable. If we want to carry out the node degree in the graph
88 88
  /// as in the \ref InDegMap and we use the reverseEdge that cause
89 89
  /// unreliable functionality. Because the alteration observing signals
90 90
  /// only erasing and adding but not the reversing it will stores bad
91 91
  /// degrees. The sub graph adaptors cannot signal the alterations because
92 92
  /// just a setting in the filter map can modify the graph and this cannot
93 93
  /// be watched in any way.
94 94
  ///
95 95
  /// \param _Container The container which is observed.
96 96
  /// \param _Item The item type which is obserbved.
97 97

	
98 98
  template <typename _Container, typename _Item>
99 99
  class AlterationNotifier {
100 100
  public:
101 101

	
102 102
    typedef True Notifier;
103 103

	
104 104
    typedef _Container Container;
105 105
    typedef _Item Item;
106 106

	
107 107
    /// \brief Exception which can be called from \e clear() and
108 108
    /// \e erase().
109 109
    ///
110 110
    /// From the \e clear() and \e erase() function only this
111 111
    /// exception is allowed to throw. The exception immediatly
112 112
    /// detaches the current observer from the notifier. Because the
113 113
    /// \e clear() and \e erase() should not throw other exceptions
114 114
    /// it can be used to invalidate the observer.
115 115
    struct ImmediateDetach {};
116 116

	
117 117
    /// \brief ObserverBase is the base class for the observers.
118 118
    ///
119 119
    /// ObserverBase is the abstract base class for the observers.
120 120
    /// It will be notified about an item was inserted into or
121 121
    /// erased from the graph.
122 122
    ///
123 123
    /// The observer interface contains some pure virtual functions
124 124
    /// to override. The add() and erase() functions are
125 125
    /// to notify the oberver when one item is added or
126 126
    /// erased.
127 127
    ///
128 128
    /// The build() and clear() members are to notify the observer
129 129
    /// about the container is built from an empty container or
130 130
    /// is cleared to an empty container.
131 131

	
132 132
    class ObserverBase {
133 133
    protected:
134 134
      typedef AlterationNotifier Notifier;
135 135

	
136 136
      friend class AlterationNotifier;
137 137

	
138 138
      /// \brief Default constructor.
139 139
      ///
140 140
      /// Default constructor for ObserverBase.
141 141
      ///
142 142
      ObserverBase() : _notifier(0) {}
143 143

	
144 144
      /// \brief Constructor which attach the observer into notifier.
145 145
      ///
146 146
      /// Constructor which attach the observer into notifier.
147 147
      ObserverBase(AlterationNotifier& nf) {
148 148
        attach(nf);
149 149
      }
150 150

	
151 151
      /// \brief Constructor which attach the obserever to the same notifier.
152 152
      ///
153 153
      /// Constructor which attach the obserever to the same notifier as
154 154
      /// the other observer is attached to.
155 155
      ObserverBase(const ObserverBase& copy) {
156 156
        if (copy.attached()) {
157 157
          attach(*copy.notifier());
158 158
        }
159 159
      }
160 160

	
161 161
      /// \brief Destructor
162 162
      virtual ~ObserverBase() {
163 163
        if (attached()) {
164 164
          detach();
165 165
        }
166 166
      }
167 167

	
168 168
      /// \brief Attaches the observer into an AlterationNotifier.
169 169
      ///
170 170
      /// This member attaches the observer into an AlterationNotifier.
171 171
      ///
172 172
      void attach(AlterationNotifier& nf) {
173 173
        nf.attach(*this);
174 174
      }
175 175

	
176 176
      /// \brief Detaches the observer into an AlterationNotifier.
177 177
      ///
178 178
      /// This member detaches the observer from an AlterationNotifier.
179 179
      ///
180 180
      void detach() {
181 181
        _notifier->detach(*this);
182 182
      }
183 183

	
184 184
      /// \brief Gives back a pointer to the notifier which the map
185 185
      /// attached into.
186 186
      ///
187 187
      /// This function gives back a pointer to the notifier which the map
188 188
      /// attached into.
189 189
      ///
190 190
      Notifier* notifier() const { return const_cast<Notifier*>(_notifier); }
191 191

	
192 192
      /// Gives back true when the observer is attached into a notifier.
193 193
      bool attached() const { return _notifier != 0; }
194 194

	
195 195
    private:
196 196

	
197 197
      ObserverBase& operator=(const ObserverBase& copy);
198 198

	
199 199
    protected:
200 200

	
201 201
      Notifier* _notifier;
202 202
      typename std::list<ObserverBase*>::iterator _index;
203 203

	
204 204
      /// \brief The member function to notificate the observer about an
205 205
      /// item is added to the container.
206 206
      ///
207 207
      /// The add() member function notificates the observer about an item
208 208
      /// is added to the container. It have to be overrided in the
209 209
      /// subclasses.
210 210
      virtual void add(const Item&) = 0;
211 211

	
212 212
      /// \brief The member function to notificate the observer about
213 213
      /// more item is added to the container.
214 214
      ///
215 215
      /// The add() member function notificates the observer about more item
216 216
      /// is added to the container. It have to be overrided in the
217 217
      /// subclasses.
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_BASE_EXTENDER_H
20 20
#define LEMON_BITS_BASE_EXTENDER_H
21 21

	
22
#include <lemon/bits/invalid.h>
22
#include <lemon/core.h>
23 23
#include <lemon/error.h>
24 24

	
25 25
#include <lemon/bits/map_extender.h>
26 26
#include <lemon/bits/default_map.h>
27 27

	
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/maps.h>
30 30

	
31 31
///\ingroup digraphbits
32 32
///\file
33 33
///\brief Extenders for the digraph types
34 34
namespace lemon {
35 35

	
36 36
  /// \ingroup digraphbits
37 37
  ///
38 38
  /// \brief BaseDigraph to BaseGraph extender
39 39
  template <typename Base>
40 40
  class UndirDigraphExtender : public Base {
41 41

	
42 42
  public:
43 43

	
44 44
    typedef Base Parent;
45 45
    typedef typename Parent::Arc Edge;
46 46
    typedef typename Parent::Node Node;
47 47

	
48 48
    typedef True UndirectedTag;
49 49

	
50 50
    class Arc : public Edge {
51 51
      friend class UndirDigraphExtender;
52 52

	
53 53
    protected:
54 54
      bool forward;
55 55

	
56 56
      Arc(const Edge &ue, bool _forward) :
57 57
        Edge(ue), forward(_forward) {}
58 58

	
59 59
    public:
60 60
      Arc() {}
61 61

	
62 62
      /// Invalid arc constructor
63 63
      Arc(Invalid i) : Edge(i), forward(true) {}
64 64

	
65 65
      bool operator==(const Arc &that) const {
66 66
        return forward==that.forward && Edge(*this)==Edge(that);
67 67
      }
68 68
      bool operator!=(const Arc &that) const {
69 69
        return forward!=that.forward || Edge(*this)!=Edge(that);
70 70
      }
71 71
      bool operator<(const Arc &that) const {
72 72
        return forward<that.forward ||
73 73
          (!(that.forward<forward) && Edge(*this)<Edge(that));
74 74
      }
75 75
    };
76 76

	
77 77

	
78 78

	
79 79
    using Parent::source;
80 80

	
81 81
    /// Source of the given Arc.
82 82
    Node source(const Arc &e) const {
83 83
      return e.forward ? Parent::source(e) : Parent::target(e);
84 84
    }
85 85

	
86 86
    using Parent::target;
87 87

	
88 88
    /// Target of the given Arc.
89 89
    Node target(const Arc &e) const {
90 90
      return e.forward ? Parent::target(e) : Parent::source(e);
91 91
    }
92 92

	
93 93
    /// \brief Directed arc from an edge.
94 94
    ///
95 95
    /// Returns a directed arc corresponding to the specified Edge.
96 96
    /// If the given bool is true the given edge and the
97 97
    /// returned arc have the same source node.
98 98
    static Arc direct(const Edge &ue, bool d) {
99 99
      return Arc(ue, d);
100 100
    }
101 101

	
102 102
    /// Returns whether the given directed arc is same orientation as the
103 103
    /// corresponding edge.
104 104
    ///
105 105
    /// \todo reference to the corresponding point of the undirected digraph
106 106
    /// concept. "What does the direction of an edge mean?"
107 107
    static bool direction(const Arc &e) { return e.forward; }
108 108

	
109 109

	
110 110
    using Parent::first;
111 111
    using Parent::next;
112 112

	
113 113
    void first(Arc &e) const {
114 114
      Parent::first(e);
115 115
      e.forward=true;
116 116
    }
117 117

	
118 118
    void next(Arc &e) const {
119 119
      if( e.forward ) {
120 120
        e.forward = false;
121 121
      }
122 122
      else {
123 123
        Parent::next(e);
124 124
        e.forward = true;
125 125
      }
126 126
    }
127 127

	
128 128
    void firstOut(Arc &e, const Node &n) const {
129 129
      Parent::firstIn(e,n);
130 130
      if( Edge(e) != INVALID ) {
131 131
        e.forward = false;
132 132
      }
133 133
      else {
134 134
        Parent::firstOut(e,n);
135 135
        e.forward = true;
136 136
      }
137 137
    }
138 138
    void nextOut(Arc &e) const {
139 139
      if( ! e.forward ) {
140 140
        Node n = Parent::target(e);
141 141
        Parent::nextIn(e);
142 142
        if( Edge(e) == INVALID ) {
143 143
          Parent::firstOut(e, n);
144 144
          e.forward = true;
145 145
        }
146 146
      }
147 147
      else {
148 148
        Parent::nextOut(e);
149 149
      }
150 150
    }
151 151

	
152 152
    void firstIn(Arc &e, const Node &n) const {
153 153
      Parent::firstOut(e,n);
154 154
      if( Edge(e) != INVALID ) {
155 155
        e.forward = false;
156 156
      }
157 157
      else {
158 158
        Parent::firstIn(e,n);
159 159
        e.forward = true;
160 160
      }
161 161
    }
162 162
    void nextIn(Arc &e) const {
163 163
      if( ! e.forward ) {
164 164
        Node n = Parent::source(e);
165 165
        Parent::nextOut(e);
166 166
        if( Edge(e) == INVALID ) {
167 167
          Parent::firstIn(e, n);
168 168
          e.forward = true;
169 169
        }
170 170
      }
171 171
      else {
172 172
        Parent::nextIn(e);
173 173
      }
174 174
    }
175 175

	
176 176
    void firstInc(Edge &e, bool &d, const Node &n) const {
177 177
      d = true;
178 178
      Parent::firstOut(e, n);
179 179
      if (e != INVALID) return;
180 180
      d = false;
181 181
      Parent::firstIn(e, n);
182 182
    }
183 183

	
184 184
    void nextInc(Edge &e, bool &d) const {
185 185
      if (d) {
186 186
        Node s = Parent::source(e);
187 187
        Parent::nextOut(e);
188 188
        if (e != INVALID) return;
189 189
        d = false;
190 190
        Parent::firstIn(e, s);
191 191
      } else {
192 192
        Parent::nextIn(e);
193 193
      }
194 194
    }
195 195

	
196 196
    Node nodeFromId(int ix) const {
197 197
      return Parent::nodeFromId(ix);
198 198
    }
199 199

	
200 200
    Arc arcFromId(int ix) const {
201 201
      return direct(Parent::arcFromId(ix >> 1), bool(ix & 1));
202 202
    }
203 203

	
204 204
    Edge edgeFromId(int ix) const {
205 205
      return Parent::arcFromId(ix);
206 206
    }
207 207

	
208 208
    int id(const Node &n) const {
209 209
      return Parent::id(n);
210 210
    }
211 211

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

	
19 19
#ifndef LEMON_BITS_GRAPH_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_EXTENDER_H
21 21

	
22
#include <lemon/bits/invalid.h>
23
#include <lemon/bits/utility.h>
22
#include <lemon/core.h>
24 23

	
25 24
#include <lemon/bits/map_extender.h>
26 25
#include <lemon/bits/default_map.h>
27 26

	
28 27
#include <lemon/concept_check.h>
29 28
#include <lemon/concepts/maps.h>
30 29

	
31 30
///\ingroup graphbits
32 31
///\file
33 32
///\brief Extenders for the digraph types
34 33
namespace lemon {
35 34

	
36 35
  /// \ingroup graphbits
37 36
  ///
38 37
  /// \brief Extender for the Digraphs
39 38
  template <typename Base>
40 39
  class DigraphExtender : public Base {
41 40
  public:
42 41

	
43 42
    typedef Base Parent;
44 43
    typedef DigraphExtender Digraph;
45 44

	
46 45
    // Base extensions
47 46

	
48 47
    typedef typename Parent::Node Node;
49 48
    typedef typename Parent::Arc Arc;
50 49

	
51 50
    int maxId(Node) const {
52 51
      return Parent::maxNodeId();
53 52
    }
54 53

	
55 54
    int maxId(Arc) const {
56 55
      return Parent::maxArcId();
57 56
    }
58 57

	
59 58
    Node fromId(int id, Node) const {
60 59
      return Parent::nodeFromId(id);
61 60
    }
62 61

	
63 62
    Arc fromId(int id, Arc) const {
64 63
      return Parent::arcFromId(id);
65 64
    }
66 65

	
67 66
    Node oppositeNode(const Node &node, const Arc &arc) const {
68 67
      if (node == Parent::source(arc))
69 68
        return Parent::target(arc);
70 69
      else if(node == Parent::target(arc))
71 70
        return Parent::source(arc);
72 71
      else
73 72
        return INVALID;
74 73
    }
75 74

	
76 75
    // Alterable extension
77 76

	
78 77
    typedef AlterationNotifier<DigraphExtender, Node> NodeNotifier;
79 78
    typedef AlterationNotifier<DigraphExtender, Arc> ArcNotifier;
80 79

	
81 80

	
82 81
  protected:
83 82

	
84 83
    mutable NodeNotifier node_notifier;
85 84
    mutable ArcNotifier arc_notifier;
86 85

	
87 86
  public:
88 87

	
89 88
    NodeNotifier& notifier(Node) const {
90 89
      return node_notifier;
91 90
    }
92 91

	
93 92
    ArcNotifier& notifier(Arc) const {
94 93
      return arc_notifier;
95 94
    }
96 95

	
97 96
    class NodeIt : public Node {
98 97
      const Digraph* _digraph;
99 98
    public:
100 99

	
101 100
      NodeIt() {}
102 101

	
103 102
      NodeIt(Invalid i) : Node(i) { }
104 103

	
105 104
      explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) {
106 105
        _digraph->first(static_cast<Node&>(*this));
107 106
      }
108 107

	
109 108
      NodeIt(const Digraph& digraph, const Node& node)
110 109
        : Node(node), _digraph(&digraph) {}
111 110

	
112 111
      NodeIt& operator++() {
113 112
        _digraph->next(*this);
114 113
        return *this;
115 114
      }
116 115

	
117 116
    };
118 117

	
119 118

	
120 119
    class ArcIt : public Arc {
121 120
      const Digraph* _digraph;
122 121
    public:
123 122

	
124 123
      ArcIt() { }
125 124

	
126 125
      ArcIt(Invalid i) : Arc(i) { }
127 126

	
128 127
      explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) {
129 128
        _digraph->first(static_cast<Arc&>(*this));
130 129
      }
131 130

	
132 131
      ArcIt(const Digraph& digraph, const Arc& arc) :
133 132
        Arc(arc), _digraph(&digraph) { }
134 133

	
135 134
      ArcIt& operator++() {
136 135
        _digraph->next(*this);
137 136
        return *this;
138 137
      }
139 138

	
140 139
    };
141 140

	
142 141

	
143 142
    class OutArcIt : public Arc {
144 143
      const Digraph* _digraph;
145 144
    public:
146 145

	
147 146
      OutArcIt() { }
148 147

	
149 148
      OutArcIt(Invalid i) : Arc(i) { }
150 149

	
151 150
      OutArcIt(const Digraph& digraph, const Node& node)
152 151
        : _digraph(&digraph) {
153 152
        _digraph->firstOut(*this, node);
154 153
      }
155 154

	
156 155
      OutArcIt(const Digraph& digraph, const Arc& arc)
157 156
        : Arc(arc), _digraph(&digraph) {}
158 157

	
159 158
      OutArcIt& operator++() {
160 159
        _digraph->nextOut(*this);
161 160
        return *this;
162 161
      }
163 162

	
164 163
    };
165 164

	
166 165

	
167 166
    class InArcIt : public Arc {
168 167
      const Digraph* _digraph;
169 168
    public:
170 169

	
171 170
      InArcIt() { }
172 171

	
173 172
      InArcIt(Invalid i) : Arc(i) { }
174 173

	
175 174
      InArcIt(const Digraph& digraph, const Node& node)
176 175
        : _digraph(&digraph) {
177 176
        _digraph->firstIn(*this, node);
178 177
      }
179 178

	
180 179
      InArcIt(const Digraph& digraph, const Arc& arc) :
181 180
        Arc(arc), _digraph(&digraph) {}
182 181

	
183 182
      InArcIt& operator++() {
184 183
        _digraph->nextIn(*this);
185 184
        return *this;
186 185
      }
187 186

	
188 187
    };
189 188

	
190 189
    /// \brief Base node of the iterator
191 190
    ///
192 191
    /// Returns the base node (i.e. the source in this case) of the iterator
193 192
    Node baseNode(const OutArcIt &arc) const {
194 193
      return Parent::source(arc);
195 194
    }
196 195
    /// \brief Running node of the iterator
197 196
    ///
198 197
    /// Returns the running node (i.e. the target in this case) of the
199 198
    /// iterator
200 199
    Node runningNode(const OutArcIt &arc) const {
201 200
      return Parent::target(arc);
202 201
    }
203 202

	
204 203
    /// \brief Base node of the iterator
205 204
    ///
206 205
    /// Returns the base node (i.e. the target in this case) of the iterator
207 206
    Node baseNode(const InArcIt &arc) const {
208 207
      return Parent::target(arc);
209 208
    }
210 209
    /// \brief Running node of the iterator
211 210
    ///
212 211
    /// Returns the running node (i.e. the source in this case) of the
213 212
    /// iterator
214 213
    Node runningNode(const InArcIt &arc) const {
215 214
      return Parent::source(arc);
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_TRAITS_H
20 20
#define LEMON_BITS_TRAITS_H
21 21

	
22
#include <lemon/bits/utility.h>
23

	
24 22
///\file
25 23
///\brief Traits for graphs and maps
26 24
///
27 25

	
26
#include <lemon/bits/enable_if.h>
27

	
28 28
namespace lemon {
29

	
30
  struct InvalidType {};
31

	
29 32
  template <typename _Graph, typename _Item>
30 33
  class ItemSetTraits {};
31 34

	
32 35

	
33 36
  template <typename Graph, typename Enable = void>
34 37
  struct NodeNotifierIndicator {
35 38
    typedef InvalidType Type;
36 39
  };
37 40
  template <typename Graph>
38 41
  struct NodeNotifierIndicator<
39 42
    Graph,
40 43
    typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type
41 44
  > {
42 45
    typedef typename Graph::NodeNotifier Type;
43 46
  };
44 47

	
45 48
  template <typename _Graph>
46 49
  class ItemSetTraits<_Graph, typename _Graph::Node> {
47 50
  public:
48 51

	
49 52
    typedef _Graph Graph;
50 53

	
51 54
    typedef typename Graph::Node Item;
52 55
    typedef typename Graph::NodeIt ItemIt;
53 56

	
54 57
    typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier;
55 58

	
56 59
    template <typename _Value>
57 60
    class Map : public Graph::template NodeMap<_Value> {
58 61
    public:
59 62
      typedef typename Graph::template NodeMap<_Value> Parent;
60 63
      typedef typename Graph::template NodeMap<_Value> Type;
61 64
      typedef typename Parent::Value Value;
62 65

	
63 66
      Map(const Graph& _digraph) : Parent(_digraph) {}
64 67
      Map(const Graph& _digraph, const Value& _value)
65 68
        : Parent(_digraph, _value) {}
66 69

	
67 70
     };
68 71

	
69 72
  };
70 73

	
71 74
  template <typename Graph, typename Enable = void>
72 75
  struct ArcNotifierIndicator {
73 76
    typedef InvalidType Type;
74 77
  };
75 78
  template <typename Graph>
76 79
  struct ArcNotifierIndicator<
77 80
    Graph,
78 81
    typename enable_if<typename Graph::ArcNotifier::Notifier, void>::type
79 82
  > {
80 83
    typedef typename Graph::ArcNotifier Type;
81 84
  };
82 85

	
83 86
  template <typename _Graph>
84 87
  class ItemSetTraits<_Graph, typename _Graph::Arc> {
85 88
  public:
86 89

	
87 90
    typedef _Graph Graph;
88 91

	
89 92
    typedef typename Graph::Arc Item;
90 93
    typedef typename Graph::ArcIt ItemIt;
91 94

	
92 95
    typedef typename ArcNotifierIndicator<Graph>::Type ItemNotifier;
93 96

	
94 97
    template <typename _Value>
95 98
    class Map : public Graph::template ArcMap<_Value> {
96 99
    public:
97 100
      typedef typename Graph::template ArcMap<_Value> Parent;
98 101
      typedef typename Graph::template ArcMap<_Value> Type;
99 102
      typedef typename Parent::Value Value;
100 103

	
101 104
      Map(const Graph& _digraph) : Parent(_digraph) {}
102 105
      Map(const Graph& _digraph, const Value& _value)
103 106
        : Parent(_digraph, _value) {}
104 107
    };
105 108

	
106 109
  };
107 110

	
108 111
  template <typename Graph, typename Enable = void>
109 112
  struct EdgeNotifierIndicator {
110 113
    typedef InvalidType Type;
111 114
  };
112 115
  template <typename Graph>
113 116
  struct EdgeNotifierIndicator<
114 117
    Graph,
115 118
    typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
116 119
  > {
117 120
    typedef typename Graph::EdgeNotifier Type;
118 121
  };
119 122

	
120 123
  template <typename _Graph>
121 124
  class ItemSetTraits<_Graph, typename _Graph::Edge> {
122 125
  public:
123 126

	
124 127
    typedef _Graph Graph;
125 128

	
126 129
    typedef typename Graph::Edge Item;
127 130
    typedef typename Graph::EdgeIt ItemIt;
128 131

	
129 132
    typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
130 133

	
131 134
    template <typename _Value>
132 135
    class Map : public Graph::template EdgeMap<_Value> {
133 136
    public:
134 137
      typedef typename Graph::template EdgeMap<_Value> Parent;
135 138
      typedef typename Graph::template EdgeMap<_Value> Type;
136 139
      typedef typename Parent::Value Value;
137 140

	
138 141
      Map(const Graph& _digraph) : Parent(_digraph) {}
139 142
      Map(const Graph& _digraph, const Value& _value)
140 143
        : Parent(_digraph, _value) {}
141 144
    };
142 145

	
143 146
  };
144 147

	
145 148
  template <typename Map, typename Enable = void>
146 149
  struct MapTraits {
147 150
    typedef False ReferenceMapTag;
148 151

	
149 152
    typedef typename Map::Key Key;
150 153
    typedef typename Map::Value Value;
151 154

	
152 155
    typedef Value ConstReturnValue;
153 156
    typedef Value ReturnValue;
154 157
  };
155 158

	
156 159
  template <typename Map>
157 160
  struct MapTraits<
158 161
    Map, typename enable_if<typename Map::ReferenceMapTag, void>::type >
159 162
  {
160 163
    typedef True ReferenceMapTag;
161 164

	
162 165
    typedef typename Map::Key Key;
163 166
    typedef typename Map::Value Value;
164 167

	
165 168
    typedef typename Map::ConstReference ConstReturnValue;
166 169
    typedef typename Map::Reference ReturnValue;
167 170

	
168 171
    typedef typename Map::ConstReference ConstReference;
169 172
    typedef typename Map::Reference Reference;
170 173
 };
171 174

	
172 175
  template <typename MatrixMap, typename Enable = void>
173 176
  struct MatrixMapTraits {
174 177
    typedef False ReferenceMapTag;
175 178

	
176 179
    typedef typename MatrixMap::FirstKey FirstKey;
177 180
    typedef typename MatrixMap::SecondKey SecondKey;
178 181
    typedef typename MatrixMap::Value Value;
179 182

	
180 183
    typedef Value ConstReturnValue;
181 184
    typedef Value ReturnValue;
182 185
  };
183 186

	
184 187
  template <typename MatrixMap>
185 188
  struct MatrixMapTraits<
186 189
    MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag,
187 190
                                  void>::type >
188 191
  {
189 192
    typedef True ReferenceMapTag;
190 193

	
191 194
    typedef typename MatrixMap::FirstKey FirstKey;
192 195
    typedef typename MatrixMap::SecondKey SecondKey;
193 196
    typedef typename MatrixMap::Value Value;
194 197

	
195 198
    typedef typename MatrixMap::ConstReference ConstReturnValue;
196 199
    typedef typename MatrixMap::Reference ReturnValue;
197 200

	
198 201
    typedef typename MatrixMap::ConstReference ConstReference;
199 202
    typedef typename MatrixMap::Reference Reference;
200 203
 };
201 204

	
202 205
  // Indicators for the tags
203 206

	
204 207
  template <typename Graph, typename Enable = void>
205 208
  struct NodeNumTagIndicator {
206 209
    static const bool value = false;
207 210
  };
208 211

	
209 212
  template <typename Graph>
210 213
  struct NodeNumTagIndicator<
211 214
    Graph,
212 215
    typename enable_if<typename Graph::NodeNumTag, void>::type
213 216
  > {
214 217
    static const bool value = true;
215 218
  };
216 219

	
217 220
  template <typename Graph, typename Enable = void>
218 221
  struct EdgeNumTagIndicator {
219 222
    static const bool value = false;
220 223
  };
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_VECTOR_MAP_H
20 20
#define LEMON_BITS_VECTOR_MAP_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25
#include <lemon/bits/traits.h>
26
#include <lemon/bits/utility.h>
27

	
25
#include <lemon/core.h>
28 26
#include <lemon/bits/alteration_notifier.h>
29 27

	
30 28
#include <lemon/concept_check.h>
31 29
#include <lemon/concepts/maps.h>
32 30

	
33 31
///\ingroup graphbits
34 32
///
35 33
///\file
36 34
///\brief Vector based graph maps.
37 35
namespace lemon {
38 36

	
39 37
  /// \ingroup graphbits
40 38
  ///
41 39
  /// \brief Graph map based on the std::vector storage.
42 40
  ///
43 41
  /// The VectorMap template class is graph map structure what
44 42
  /// automatically updates the map when a key is added to or erased from
45 43
  /// the map. This map type uses the std::vector to store the values.
46 44
  ///
47 45
  /// \tparam _Notifier The AlterationNotifier that will notify this map.
48 46
  /// \tparam _Item The item type of the graph items.
49 47
  /// \tparam _Value The value type of the map.
50 48
  /// \todo Fix the doc: there is _Graph parameter instead of _Notifier.
51 49
  template <typename _Graph, typename _Item, typename _Value>
52 50
  class VectorMap
53 51
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
54 52
  private:
55 53

	
56 54
    /// The container type of the map.
57 55
    typedef std::vector<_Value> Container;
58 56

	
59 57
  public:
60 58

	
61 59
    /// The graph type of the map.
62 60
    typedef _Graph Graph;
63 61
    /// The item type of the map.
64 62
    typedef _Item Item;
65 63
    /// The reference map tag.
66 64
    typedef True ReferenceMapTag;
67 65

	
68 66
    /// The key type of the map.
69 67
    typedef _Item Key;
70 68
    /// The value type of the map.
71 69
    typedef _Value Value;
72 70

	
73 71
    /// The notifier type.
74 72
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
75 73

	
76 74
    /// The map type.
77 75
    typedef VectorMap Map;
78 76
    /// The base class of the map.
79 77
    typedef typename Notifier::ObserverBase Parent;
80 78

	
81 79
    /// The reference type of the map;
82 80
    typedef typename Container::reference Reference;
83 81
    /// The const reference type of the map;
84 82
    typedef typename Container::const_reference ConstReference;
85 83

	
86 84

	
87 85
    /// \brief Constructor to attach the new map into the notifier.
88 86
    ///
89 87
    /// It constructs a map and attachs it into the notifier.
90 88
    /// It adds all the items of the graph to the map.
91 89
    VectorMap(const Graph& graph) {
92 90
      Parent::attach(graph.notifier(Item()));
93 91
      container.resize(Parent::notifier()->maxId() + 1);
94 92
    }
95 93

	
96 94
    /// \brief Constructor uses given value to initialize the map.
97 95
    ///
98 96
    /// It constructs a map uses a given value to initialize the map.
99 97
    /// It adds all the items of the graph to the map.
100 98
    VectorMap(const Graph& graph, const Value& value) {
101 99
      Parent::attach(graph.notifier(Item()));
102 100
      container.resize(Parent::notifier()->maxId() + 1, value);
103 101
    }
104 102

	
105 103
    /// \brief Copy constructor
106 104
    ///
107 105
    /// Copy constructor.
108 106
    VectorMap(const VectorMap& _copy) : Parent() {
109 107
      if (_copy.attached()) {
110 108
        Parent::attach(*_copy.notifier());
111 109
        container = _copy.container;
112 110
      }
113 111
    }
114 112

	
115 113
    /// \brief Assign operator.
116 114
    ///
117 115
    /// This operator assigns for each item in the map the
118 116
    /// value mapped to the same item in the copied map.
119 117
    /// The parameter map should be indiced with the same
120 118
    /// itemset because this assign operator does not change
121 119
    /// the container of the map.
122 120
    VectorMap& operator=(const VectorMap& cmap) {
123 121
      return operator=<VectorMap>(cmap);
124 122
    }
125 123

	
126 124

	
127 125
    /// \brief Template assign operator.
128 126
    ///
129 127
    /// The given parameter should be conform to the ReadMap
130 128
    /// concecpt and could be indiced by the current item set of
131 129
    /// the NodeMap. In this case the value for each item
132 130
    /// is assigned by the value of the given ReadMap.
133 131
    template <typename CMap>
134 132
    VectorMap& operator=(const CMap& cmap) {
135 133
      checkConcept<concepts::ReadMap<Key, _Value>, CMap>();
136 134
      const typename Parent::Notifier* nf = Parent::notifier();
137 135
      Item it;
138 136
      for (nf->first(it); it != INVALID; nf->next(it)) {
139 137
        set(it, cmap[it]);
140 138
      }
141 139
      return *this;
142 140
    }
143 141

	
144 142
  public:
145 143

	
146 144
    /// \brief The subcript operator.
147 145
    ///
148 146
    /// The subscript operator. The map can be subscripted by the
149 147
    /// actual items of the graph.
150 148
    Reference operator[](const Key& key) {
151 149
      return container[Parent::notifier()->id(key)];
152 150
    }
153 151

	
154 152
    /// \brief The const subcript operator.
155 153
    ///
156 154
    /// The const subscript operator. The map can be subscripted by the
157 155
    /// actual items of the graph.
158 156
    ConstReference operator[](const Key& key) const {
159 157
      return container[Parent::notifier()->id(key)];
160 158
    }
161 159

	
162 160

	
163 161
    /// \brief The setter function of the map.
164 162
    ///
165 163
    /// It the same as operator[](key) = value expression.
166 164
    void set(const Key& key, const Value& value) {
167 165
      (*this)[key] = value;
168 166
    }
169 167

	
170 168
  protected:
171 169

	
172 170
    /// \brief Adds a new key to the map.
173 171
    ///
174 172
    /// It adds a new key to the map. It called by the observer notifier
175 173
    /// and it overrides the add() member function of the observer base.
176 174
    virtual void add(const Key& key) {
177 175
      int id = Parent::notifier()->id(key);
178 176
      if (id >= int(container.size())) {
179 177
        container.resize(id + 1);
180 178
      }
181 179
    }
182 180

	
183 181
    /// \brief Adds more new keys to the map.
184 182
    ///
185 183
    /// It adds more new keys to the map. It called by the observer notifier
186 184
    /// and it overrides the add() member function of the observer base.
187 185
    virtual void add(const std::vector<Key>& keys) {
188 186
      int max = container.size() - 1;
189 187
      for (int i = 0; i < int(keys.size()); ++i) {
190 188
        int id = Parent::notifier()->id(keys[i]);
191 189
        if (id >= max) {
192 190
          max = id;
193 191
        }
194 192
      }
195 193
      container.resize(max + 1);
196 194
    }
197 195

	
198 196
    /// \brief Erase a key from the map.
199 197
    ///
200 198
    /// Erase a key from the map. It called by the observer notifier
201 199
    /// and it overrides the erase() member function of the observer base.
202 200
    virtual void erase(const Key& key) {
203 201
      container[Parent::notifier()->id(key)] = Value();
204 202
    }
205 203

	
206 204
    /// \brief Erase more keys from the map.
207 205
    ///
208 206
    /// Erase more keys from the map. It called by the observer notifier
209 207
    /// and it overrides the erase() member function of the observer base.
210 208
    virtual void erase(const std::vector<Key>& keys) {
211 209
      for (int i = 0; i < int(keys.size()); ++i) {
212 210
        container[Parent::notifier()->id(keys[i])] = Value();
213 211
      }
214 212
    }
215 213

	
216 214
    /// \brief Buildes the map.
217 215
    ///
218 216
    /// It buildes the map. It called by the observer notifier
219 217
    /// and it overrides the build() member function of the observer base.
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CONCEPT_DIGRAPH_H
20 20
#define LEMON_CONCEPT_DIGRAPH_H
21 21

	
22 22
///\ingroup graph_concepts
23 23
///\file
24 24
///\brief The concept of directed graphs.
25 25

	
26
#include <lemon/bits/invalid.h>
27
#include <lemon/bits/utility.h>
26
#include <lemon/core.h>
28 27
#include <lemon/concepts/maps.h>
29 28
#include <lemon/concept_check.h>
30 29
#include <lemon/concepts/graph_components.h>
31 30

	
32 31
namespace lemon {
33 32
  namespace concepts {
34 33

	
35 34
    /// \ingroup graph_concepts
36 35
    ///
37 36
    /// \brief Class describing the concept of directed graphs.
38 37
    ///
39 38
    /// This class describes the \ref concept "concept" of the
40 39
    /// immutable directed digraphs.
41 40
    ///
42 41
    /// Note that actual digraph implementation like @ref ListDigraph or
43 42
    /// @ref SmartDigraph may have several additional functionality.
44 43
    ///
45 44
    /// \sa concept
46 45
    class Digraph {
47 46
    private:
48 47
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
49 48

	
50 49
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
51 50
      ///
52 51
      Digraph(const Digraph &) {};
53 52
      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
54 53
      ///\e not allowed. Use DigraphCopy() instead.
55 54

	
56 55
      ///Assignment of \ref Digraph "Digraph"s to another ones are
57 56
      ///\e not allowed.  Use DigraphCopy() instead.
58 57

	
59 58
      void operator=(const Digraph &) {}
60 59
    public:
61 60
      ///\e
62 61

	
63 62
      /// Defalult constructor.
64 63

	
65 64
      /// Defalult constructor.
66 65
      ///
67 66
      Digraph() { }
68 67
      /// Class for identifying a node of the digraph
69 68

	
70 69
      /// This class identifies a node of the digraph. It also serves
71 70
      /// as a base class of the node iterators,
72 71
      /// thus they will convert to this type.
73 72
      class Node {
74 73
      public:
75 74
        /// Default constructor
76 75

	
77 76
        /// @warning The default constructor sets the iterator
78 77
        /// to an undefined value.
79 78
        Node() { }
80 79
        /// Copy constructor.
81 80

	
82 81
        /// Copy constructor.
83 82
        ///
84 83
        Node(const Node&) { }
85 84

	
86 85
        /// Invalid constructor \& conversion.
87 86

	
88 87
        /// This constructor initializes the iterator to be invalid.
89 88
        /// \sa Invalid for more details.
90 89
        Node(Invalid) { }
91 90
        /// Equality operator
92 91

	
93 92
        /// Two iterators are equal if and only if they point to the
94 93
        /// same object or both are invalid.
95 94
        bool operator==(Node) const { return true; }
96 95

	
97 96
        /// Inequality operator
98 97

	
99 98
        /// \sa operator==(Node n)
100 99
        ///
101 100
        bool operator!=(Node) const { return true; }
102 101

	
103 102
        /// Artificial ordering operator.
104 103

	
105 104
        /// To allow the use of digraph descriptors as key type in std::map or
106 105
        /// similar associative container we require this.
107 106
        ///
108 107
        /// \note This operator only have to define some strict ordering of
109 108
        /// the items; this order has nothing to do with the iteration
110 109
        /// ordering of the items.
111 110
        bool operator<(Node) const { return false; }
112 111

	
113 112
      };
114 113

	
115 114
      /// This iterator goes through each node.
116 115

	
117 116
      /// This iterator goes through each node.
118 117
      /// Its usage is quite simple, for example you can count the number
119 118
      /// of nodes in digraph \c g of type \c Digraph like this:
120 119
      ///\code
121 120
      /// int count=0;
122 121
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
123 122
      ///\endcode
124 123
      class NodeIt : public Node {
125 124
      public:
126 125
        /// Default constructor
127 126

	
128 127
        /// @warning The default constructor sets the iterator
129 128
        /// to an undefined value.
130 129
        NodeIt() { }
131 130
        /// Copy constructor.
132 131

	
133 132
        /// Copy constructor.
134 133
        ///
135 134
        NodeIt(const NodeIt& n) : Node(n) { }
136 135
        /// Invalid constructor \& conversion.
137 136

	
138 137
        /// Initialize the iterator to be invalid.
139 138
        /// \sa Invalid for more details.
140 139
        NodeIt(Invalid) { }
141 140
        /// Sets the iterator to the first node.
142 141

	
143 142
        /// Sets the iterator to the first node of \c g.
144 143
        ///
145 144
        NodeIt(const Digraph&) { }
146 145
        /// Node -> NodeIt conversion.
147 146

	
148 147
        /// Sets the iterator to the node of \c the digraph pointed by
149 148
        /// the trivial iterator.
150 149
        /// This feature necessitates that each time we
151 150
        /// iterate the arc-set, the iteration order is the same.
152 151
        NodeIt(const Digraph&, const Node&) { }
153 152
        /// Next node.
154 153

	
155 154
        /// Assign the iterator to the next node.
156 155
        ///
157 156
        NodeIt& operator++() { return *this; }
158 157
      };
159 158

	
160 159

	
161 160
      /// Class for identifying an arc of the digraph
162 161

	
163 162
      /// This class identifies an arc of the digraph. It also serves
164 163
      /// as a base class of the arc iterators,
165 164
      /// thus they will convert to this type.
166 165
      class Arc {
167 166
      public:
168 167
        /// Default constructor
169 168

	
170 169
        /// @warning The default constructor sets the iterator
171 170
        /// to an undefined value.
172 171
        Arc() { }
173 172
        /// Copy constructor.
174 173

	
175 174
        /// Copy constructor.
176 175
        ///
177 176
        Arc(const Arc&) { }
178 177
        /// Initialize the iterator to be invalid.
179 178

	
180 179
        /// Initialize the iterator to be invalid.
181 180
        ///
182 181
        Arc(Invalid) { }
183 182
        /// Equality operator
184 183

	
185 184
        /// Two iterators are equal if and only if they point to the
186 185
        /// same object or both are invalid.
187 186
        bool operator==(Arc) const { return true; }
188 187
        /// Inequality operator
189 188

	
190 189
        /// \sa operator==(Arc n)
191 190
        ///
192 191
        bool operator!=(Arc) const { return true; }
193 192

	
194 193
        /// Artificial ordering operator.
195 194

	
196 195
        /// To allow the use of digraph descriptors as key type in std::map or
197 196
        /// similar associative container we require this.
198 197
        ///
199 198
        /// \note This operator only have to define some strict ordering of
200 199
        /// the items; this order has nothing to do with the iteration
201 200
        /// ordering of the items.
202 201
        bool operator<(Arc) const { return false; }
203 202
      };
204 203

	
205 204
      /// This iterator goes trough the outgoing arcs of a node.
206 205

	
207 206
      /// This iterator goes trough the \e outgoing arcs of a certain node
208 207
      /// of a digraph.
209 208
      /// Its usage is quite simple, for example you can count the number
210 209
      /// of outgoing arcs of a node \c n
211 210
      /// in digraph \c g of type \c Digraph as follows.
212 211
      ///\code
213 212
      /// int count=0;
214 213
      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
215 214
      ///\endcode
216 215

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

	
19 19
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of Undirected Graphs.
22 22

	
23 23
#ifndef LEMON_CONCEPT_GRAPH_H
24 24
#define LEMON_CONCEPT_GRAPH_H
25 25

	
26 26
#include <lemon/concepts/graph_components.h>
27 27
#include <lemon/concepts/graph.h>
28
#include <lemon/bits/utility.h>
28
#include <lemon/core.h>
29 29

	
30 30
namespace lemon {
31 31
  namespace concepts {
32 32

	
33 33
    /// \ingroup graph_concepts
34 34
    ///
35 35
    /// \brief Class describing the concept of Undirected Graphs.
36 36
    ///
37 37
    /// This class describes the common interface of all Undirected
38 38
    /// Graphs.
39 39
    ///
40 40
    /// As all concept describing classes it provides only interface
41 41
    /// without any sensible implementation. So any algorithm for
42 42
    /// undirected graph should compile with this class, but it will not
43 43
    /// run properly, of course.
44 44
    ///
45 45
    /// The LEMON undirected graphs also fulfill the concept of
46 46
    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
47 47
    /// Concept"). Each edges can be seen as two opposite
48 48
    /// directed arc and consequently the undirected graph can be
49 49
    /// seen as the direceted graph of these directed arcs. The
50 50
    /// Graph has the Edge inner class for the edges and
51 51
    /// the Arc type for the directed arcs. The Arc type is
52 52
    /// convertible to Edge or inherited from it so from a directed
53 53
    /// arc we can get the represented edge.
54 54
    ///
55 55
    /// In the sense of the LEMON each edge has a default
56 56
    /// direction (it should be in every computer implementation,
57 57
    /// because the order of edge's nodes defines an
58 58
    /// orientation). With the default orientation we can define that
59 59
    /// the directed arc is forward or backward directed. With the \c
60 60
    /// direction() and \c direct() function we can get the direction
61 61
    /// of the directed arc and we can direct an edge.
62 62
    ///
63 63
    /// The EdgeIt is an iterator for the edges. We can use
64 64
    /// the EdgeMap to map values for the edges. The InArcIt and
65 65
    /// OutArcIt iterates on the same edges but with opposite
66 66
    /// direction. The IncEdgeIt iterates also on the same edges
67 67
    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
68 68
    /// to Edge.
69 69
    class Graph {
70 70
    public:
71 71
      /// \brief The undirected graph should be tagged by the
72 72
      /// UndirectedTag.
73 73
      ///
74 74
      /// The undirected graph should be tagged by the UndirectedTag. This
75 75
      /// tag helps the enable_if technics to make compile time
76 76
      /// specializations for undirected graphs.
77 77
      typedef True UndirectedTag;
78 78

	
79 79
      /// \brief The base type of node iterators,
80 80
      /// or in other words, the trivial node iterator.
81 81
      ///
82 82
      /// This is the base type of each node iterator,
83 83
      /// thus each kind of node iterator converts to this.
84 84
      /// More precisely each kind of node iterator should be inherited
85 85
      /// from the trivial node iterator.
86 86
      class Node {
87 87
      public:
88 88
        /// Default constructor
89 89

	
90 90
        /// @warning The default constructor sets the iterator
91 91
        /// to an undefined value.
92 92
        Node() { }
93 93
        /// Copy constructor.
94 94

	
95 95
        /// Copy constructor.
96 96
        ///
97 97
        Node(const Node&) { }
98 98

	
99 99
        /// Invalid constructor \& conversion.
100 100

	
101 101
        /// This constructor initializes the iterator to be invalid.
102 102
        /// \sa Invalid for more details.
103 103
        Node(Invalid) { }
104 104
        /// Equality operator
105 105

	
106 106
        /// Two iterators are equal if and only if they point to the
107 107
        /// same object or both are invalid.
108 108
        bool operator==(Node) const { return true; }
109 109

	
110 110
        /// Inequality operator
111 111

	
112 112
        /// \sa operator==(Node n)
113 113
        ///
114 114
        bool operator!=(Node) const { return true; }
115 115

	
116 116
        /// Artificial ordering operator.
117 117

	
118 118
        /// To allow the use of graph descriptors as key type in std::map or
119 119
        /// similar associative container we require this.
120 120
        ///
121 121
        /// \note This operator only have to define some strict ordering of
122 122
        /// the items; this order has nothing to do with the iteration
123 123
        /// ordering of the items.
124 124
        bool operator<(Node) const { return false; }
125 125

	
126 126
      };
127 127

	
128 128
      /// This iterator goes through each node.
129 129

	
130 130
      /// This iterator goes through each node.
131 131
      /// Its usage is quite simple, for example you can count the number
132 132
      /// of nodes in graph \c g of type \c Graph like this:
133 133
      ///\code
134 134
      /// int count=0;
135 135
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
136 136
      ///\endcode
137 137
      class NodeIt : public Node {
138 138
      public:
139 139
        /// Default constructor
140 140

	
141 141
        /// @warning The default constructor sets the iterator
142 142
        /// to an undefined value.
143 143
        NodeIt() { }
144 144
        /// Copy constructor.
145 145

	
146 146
        /// Copy constructor.
147 147
        ///
148 148
        NodeIt(const NodeIt& n) : Node(n) { }
149 149
        /// Invalid constructor \& conversion.
150 150

	
151 151
        /// Initialize the iterator to be invalid.
152 152
        /// \sa Invalid for more details.
153 153
        NodeIt(Invalid) { }
154 154
        /// Sets the iterator to the first node.
155 155

	
156 156
        /// Sets the iterator to the first node of \c g.
157 157
        ///
158 158
        NodeIt(const Graph&) { }
159 159
        /// Node -> NodeIt conversion.
160 160

	
161 161
        /// Sets the iterator to the node of \c the graph pointed by
162 162
        /// the trivial iterator.
163 163
        /// This feature necessitates that each time we
164 164
        /// iterate the arc-set, the iteration order is the same.
165 165
        NodeIt(const Graph&, const Node&) { }
166 166
        /// Next node.
167 167

	
168 168
        /// Assign the iterator to the next node.
169 169
        ///
170 170
        NodeIt& operator++() { return *this; }
171 171
      };
172 172

	
173 173

	
174 174
      /// The base type of the edge iterators.
175 175

	
176 176
      /// The base type of the edge iterators.
177 177
      ///
178 178
      class Edge {
179 179
      public:
180 180
        /// Default constructor
181 181

	
182 182
        /// @warning The default constructor sets the iterator
183 183
        /// to an undefined value.
184 184
        Edge() { }
185 185
        /// Copy constructor.
186 186

	
187 187
        /// Copy constructor.
188 188
        ///
189 189
        Edge(const Edge&) { }
190 190
        /// Initialize the iterator to be invalid.
191 191

	
192 192
        /// Initialize the iterator to be invalid.
193 193
        ///
194 194
        Edge(Invalid) { }
195 195
        /// Equality operator
196 196

	
197 197
        /// Two iterators are equal if and only if they point to the
198 198
        /// same object or both are invalid.
199 199
        bool operator==(Edge) const { return true; }
200 200
        /// Inequality operator
201 201

	
202 202
        /// \sa operator==(Edge n)
203 203
        ///
204 204
        bool operator!=(Edge) const { return true; }
205 205

	
206 206
        /// Artificial ordering operator.
207 207

	
208 208
        /// To allow the use of graph descriptors as key type in std::map or
209 209
        /// similar associative container we require this.
210 210
        ///
211 211
        /// \note This operator only have to define some strict ordering of
212 212
        /// the items; this order has nothing to do with the iteration
213 213
        /// ordering of the items.
214 214
        bool operator<(Edge) const { return false; }
215 215
      };
216 216

	
217 217
      /// This iterator goes through each edge.
218 218

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

	
19 19
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of graph components.
22 22

	
23 23

	
24 24
#ifndef LEMON_CONCEPT_GRAPH_COMPONENTS_H
25 25
#define LEMON_CONCEPT_GRAPH_COMPONENTS_H
26 26

	
27
#include <lemon/bits/invalid.h>
27
#include <lemon/core.h>
28 28
#include <lemon/concepts/maps.h>
29 29

	
30 30
#include <lemon/bits/alteration_notifier.h>
31 31

	
32 32
namespace lemon {
33 33
  namespace concepts {
34 34

	
35 35
    /// \brief Skeleton class for graph Node and Arc types
36 36
    ///
37 37
    /// This class describes the interface of Node and Arc (and Edge
38 38
    /// in undirected graphs) subtypes of graph types.
39 39
    ///
40 40
    /// \note This class is a template class so that we can use it to
41 41
    /// create graph skeleton classes. The reason for this is than Node
42 42
    /// and Arc types should \em not derive from the same base class.
43 43
    /// For Node you should instantiate it with character 'n' and for Arc
44 44
    /// with 'a'.
45 45

	
46 46
#ifndef DOXYGEN
47 47
    template <char _selector = '0'>
48 48
#endif
49 49
    class GraphItem {
50 50
    public:
51 51
      /// \brief Default constructor.
52 52
      ///
53 53
      /// \warning The default constructor is not required to set
54 54
      /// the item to some well-defined value. So you should consider it
55 55
      /// as uninitialized.
56 56
      GraphItem() {}
57 57
      /// \brief Copy constructor.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      ///
61 61
      GraphItem(const GraphItem &) {}
62 62
      /// \brief Invalid constructor \& conversion.
63 63
      ///
64 64
      /// This constructor initializes the item to be invalid.
65 65
      /// \sa Invalid for more details.
66 66
      GraphItem(Invalid) {}
67 67
      /// \brief Assign operator for nodes.
68 68
      ///
69 69
      /// The nodes are assignable.
70 70
      ///
71 71
      GraphItem& operator=(GraphItem const&) { return *this; }
72 72
      /// \brief Equality operator.
73 73
      ///
74 74
      /// Two iterators are equal if and only if they represents the
75 75
      /// same node in the graph or both are invalid.
76 76
      bool operator==(GraphItem) const { return false; }
77 77
      /// \brief Inequality operator.
78 78
      ///
79 79
      /// \sa operator==(const Node& n)
80 80
      ///
81 81
      bool operator!=(GraphItem) const { return false; }
82 82

	
83 83
      /// \brief Artificial ordering operator.
84 84
      ///
85 85
      /// To allow the use of graph descriptors as key type in std::map or
86 86
      /// similar associative container we require this.
87 87
      ///
88 88
      /// \note This operator only have to define some strict ordering of
89 89
      /// the items; this order has nothing to do with the iteration
90 90
      /// ordering of the items.
91 91
      bool operator<(GraphItem) const { return false; }
92 92

	
93 93
      template<typename _GraphItem>
94 94
      struct Constraints {
95 95
        void constraints() {
96 96
          _GraphItem i1;
97 97
          _GraphItem i2 = i1;
98 98
          _GraphItem i3 = INVALID;
99 99

	
100 100
          i1 = i2 = i3;
101 101

	
102 102
          bool b;
103 103
          //          b = (ia == ib) && (ia != ib) && (ia < ib);
104 104
          b = (ia == ib) && (ia != ib);
105 105
          b = (ia == INVALID) && (ib != INVALID);
106 106
          b = (ia < ib);
107 107
        }
108 108

	
109 109
        const _GraphItem &ia;
110 110
        const _GraphItem &ib;
111 111
      };
112 112
    };
113 113

	
114 114
    /// \brief An empty base directed graph class.
115 115
    ///
116 116
    /// This class provides the minimal set of features needed for a
117 117
    /// directed graph structure. All digraph concepts have to be
118 118
    /// conform to this base directed graph. It just provides types
119 119
    /// for nodes and arcs and functions to get the source and the
120 120
    /// target of the arcs.
121 121
    class BaseDigraphComponent {
122 122
    public:
123 123

	
124 124
      typedef BaseDigraphComponent Digraph;
125 125

	
126 126
      /// \brief Node class of the digraph.
127 127
      ///
128 128
      /// This class represents the Nodes of the digraph.
129 129
      ///
130 130
      typedef GraphItem<'n'> Node;
131 131

	
132 132
      /// \brief Arc class of the digraph.
133 133
      ///
134 134
      /// This class represents the Arcs of the digraph.
135 135
      ///
136 136
      typedef GraphItem<'e'> Arc;
137 137

	
138 138
      /// \brief Gives back the target node of an arc.
139 139
      ///
140 140
      /// Gives back the target node of an arc.
141 141
      ///
142 142
      Node target(const Arc&) const { return INVALID;}
143 143

	
144 144
      /// \brief Gives back the source node of an arc.
145 145
      ///
146 146
      /// Gives back the source node of an arc.
147 147
      ///
148 148
      Node source(const Arc&) const { return INVALID;}
149 149

	
150 150
      /// \brief Gives back the opposite node on the given arc.
151 151
      ///
152 152
      /// Gives back the opposite node on the given arc.
153 153
      Node oppositeNode(const Node&, const Arc&) const {
154 154
        return INVALID;
155 155
      }
156 156

	
157 157
      template <typename _Digraph>
158 158
      struct Constraints {
159 159
        typedef typename _Digraph::Node Node;
160 160
        typedef typename _Digraph::Arc Arc;
161 161

	
162 162
        void constraints() {
163 163
          checkConcept<GraphItem<'n'>, Node>();
164 164
          checkConcept<GraphItem<'a'>, Arc>();
165 165
          {
166 166
            Node n;
167 167
            Arc e(INVALID);
168 168
            n = digraph.source(e);
169 169
            n = digraph.target(e);
170 170
            n = digraph.oppositeNode(n, e);
171 171
          }
172 172
        }
173 173

	
174 174
        const _Digraph& digraph;
175 175
      };
176 176
    };
177 177

	
178 178
    /// \brief An empty base undirected graph class.
179 179
    ///
180 180
    /// This class provides the minimal set of features needed for an
181 181
    /// undirected graph structure. All undirected graph concepts have
182 182
    /// to be conform to this base graph. It just provides types for
183 183
    /// nodes, arcs and edges and functions to get the
184 184
    /// source and the target of the arcs and edges,
185 185
    /// conversion from arcs to edges and function to get
186 186
    /// both direction of the edges.
187 187
    class BaseGraphComponent : public BaseDigraphComponent {
188 188
    public:
189 189
      typedef BaseDigraphComponent::Node Node;
190 190
      typedef BaseDigraphComponent::Arc Arc;
191 191
      /// \brief Undirected arc class of the graph.
192 192
      ///
193 193
      /// This class represents the edges of the graph.
194 194
      /// The undirected graphs can be used as a directed graph which
195 195
      /// for each arc contains the opposite arc too so the graph is
196 196
      /// bidirected. The edge represents two opposite
197 197
      /// directed arcs.
198 198
      class Edge : public GraphItem<'u'> {
199 199
      public:
200 200
        typedef GraphItem<'u'> Parent;
201 201
        /// \brief Default constructor.
202 202
        ///
203 203
        /// \warning The default constructor is not required to set
204 204
        /// the item to some well-defined value. So you should consider it
205 205
        /// as uninitialized.
206 206
        Edge() {}
207 207
        /// \brief Copy constructor.
208 208
        ///
209 209
        /// Copy constructor.
210 210
        ///
211 211
        Edge(const Edge &) : Parent() {}
212 212
        /// \brief Invalid constructor \& conversion.
213 213
        ///
214 214
        /// This constructor initializes the item to be invalid.
215 215
        /// \sa Invalid for more details.
216 216
        Edge(Invalid) {}
217 217
        /// \brief Converter from arc to edge.
218 218
        ///
219 219
        /// Besides the core graph item functionality each arc should
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup concept
20 20
///\file
21 21
///\brief The concept of heaps.
22 22

	
23 23
#ifndef LEMON_CONCEPT_HEAP_H
24 24
#define LEMON_CONCEPT_HEAP_H
25 25

	
26
#include <lemon/bits/invalid.h>
26
#include <lemon/core.h>
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  namespace concepts {
31 31

	
32 32
    /// \addtogroup concept
33 33
    /// @{
34 34

	
35 35
    /// \brief The heap concept.
36 36
    ///
37 37
    /// Concept class describing the main interface of heaps.
38 38
    template <typename Priority, typename ItemIntMap>
39 39
    class Heap {
40 40
    public:
41 41

	
42 42
      /// Type of the items stored in the heap.
43 43
      typedef typename ItemIntMap::Key Item;
44 44

	
45 45
      /// Type of the priorities.
46 46
      typedef Priority Prio;
47 47

	
48 48
      /// \brief Type to represent the states of the items.
49 49
      ///
50 50
      /// Each item has a state associated to it. It can be "in heap",
51 51
      /// "pre heap" or "post heap". The later two are indifferent
52 52
      /// from the point of view of the heap, but may be useful for
53 53
      /// the user.
54 54
      ///
55 55
      /// The \c ItemIntMap must be initialized in such a way, that it
56 56
      /// assigns \c PRE_HEAP (<tt>-1</tt>) to every item.
57 57
      enum State {
58 58
        IN_HEAP = 0,
59 59
        PRE_HEAP = -1,
60 60
        POST_HEAP = -2
61 61
      };
62 62

	
63 63
      /// \brief The constructor.
64 64
      ///
65 65
      /// The constructor.
66 66
      /// \param map A map that assigns \c int values to keys of type
67 67
      /// \c Item. It is used internally by the heap implementations to
68 68
      /// handle the cross references. The assigned value must be
69 69
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
70 70
      explicit Heap(ItemIntMap &map) {}
71 71

	
72 72
      /// \brief The number of items stored in the heap.
73 73
      ///
74 74
      /// Returns the number of items stored in the heap.
75 75
      int size() const { return 0; }
76 76

	
77 77
      /// \brief Checks if the heap is empty.
78 78
      ///
79 79
      /// Returns \c true if the heap is empty.
80 80
      bool empty() const { return false; }
81 81

	
82 82
      /// \brief Makes the heap empty.
83 83
      ///
84 84
      /// Makes the heap empty.
85 85
      void clear();
86 86

	
87 87
      /// \brief Inserts an item into the heap with the given priority.
88 88
      ///
89 89
      /// Inserts the given item into the heap with the given priority.
90 90
      /// \param i The item to insert.
91 91
      /// \param p The priority of the item.
92 92
      void push(const Item &i, const Prio &p) {}
93 93

	
94 94
      /// \brief Returns the item having minimum priority.
95 95
      ///
96 96
      /// Returns the item having minimum priority.
97 97
      /// \pre The heap must be non-empty.
98 98
      Item top() const {}
99 99

	
100 100
      /// \brief The minimum priority.
101 101
      ///
102 102
      /// Returns the minimum priority.
103 103
      /// \pre The heap must be non-empty.
104 104
      Prio prio() const {}
105 105

	
106 106
      /// \brief Removes the item having minimum priority.
107 107
      ///
108 108
      /// Removes the item having minimum priority.
109 109
      /// \pre The heap must be non-empty.
110 110
      void pop() {}
111 111

	
112 112
      /// \brief Removes an item from the heap.
113 113
      ///
114 114
      /// Removes the given item from the heap if it is already stored.
115 115
      /// \param i The item to delete.
116 116
      void erase(const Item &i) {}
117 117

	
118 118
      /// \brief The priority of an item.
119 119
      ///
120 120
      /// Returns the priority of the given item.
121 121
      /// \pre \c i must be in the heap.
122 122
      /// \param i The item.
123 123
      Prio operator[](const Item &i) const {}
124 124

	
125 125
      /// \brief Sets the priority of an item or inserts it, if it is
126 126
      /// not stored in the heap.
127 127
      ///
128 128
      /// This method sets the priority of the given item if it is
129 129
      /// already stored in the heap.
130 130
      /// Otherwise it inserts the given item with the given priority.
131 131
      ///
132 132
      /// It may throw an \ref UnderflowPriorityException.
133 133
      /// \param i The item.
134 134
      /// \param p The priority.
135 135
      void set(const Item &i, const Prio &p) {}
136 136

	
137 137
      /// \brief Decreases the priority of an item to the given value.
138 138
      ///
139 139
      /// Decreases the priority of an item to the given value.
140 140
      /// \pre \c i must be stored in the heap with priority at least \c p.
141 141
      /// \param i The item.
142 142
      /// \param p The priority.
143 143
      void decrease(const Item &i, const Prio &p) {}
144 144

	
145 145
      /// \brief Increases the priority of an item to the given value.
146 146
      ///
147 147
      /// Increases the priority of an item to the given value.
148 148
      /// \pre \c i must be stored in the heap with priority at most \c p.
149 149
      /// \param i The item.
150 150
      /// \param p The priority.
151 151
      void increase(const Item &i, const Prio &p) {}
152 152

	
153 153
      /// \brief Returns if an item is in, has already been in, or has
154 154
      /// never been in the heap.
155 155
      ///
156 156
      /// This method returns \c PRE_HEAP if the given item has never
157 157
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
158 158
      /// and \c POST_HEAP otherwise.
159 159
      /// In the latter case it is possible that the item will get back
160 160
      /// to the heap again.
161 161
      /// \param i The item.
162 162
      State state(const Item &i) const {}
163 163

	
164 164
      /// \brief Sets the state of an item in the heap.
165 165
      ///
166 166
      /// Sets the state of the given item in the heap. It can be used
167 167
      /// to manually clear the heap when it is important to achive the
168 168
      /// better time complexity.
169 169
      /// \param i The item.
170 170
      /// \param st The state. It should not be \c IN_HEAP.
171 171
      void state(const Item& i, State st) {}
172 172

	
173 173

	
174 174
      template <typename _Heap>
175 175
      struct Constraints {
176 176
      public:
177 177
        void constraints() {
178 178
          typedef typename _Heap::Item OwnItem;
179 179
          typedef typename _Heap::Prio OwnPrio;
180 180
          typedef typename _Heap::State OwnState;
181 181

	
182 182
          Item item;
183 183
          Prio prio;
184 184
          item=Item();
185 185
          prio=Prio();
186 186
          ignore_unused_variable_warning(item);
187 187
          ignore_unused_variable_warning(prio);
188 188

	
189 189
          OwnItem own_item;
190 190
          OwnPrio own_prio;
191 191
          OwnState own_state;
192 192
          own_item=Item();
193 193
          own_prio=Prio();
194 194
          ignore_unused_variable_warning(own_item);
195 195
          ignore_unused_variable_warning(own_prio);
196 196
          ignore_unused_variable_warning(own_state);
197 197

	
198 198
          _Heap heap1(map);
199 199
          _Heap heap2 = heap1;
200 200
          ignore_unused_variable_warning(heap1);
201 201
          ignore_unused_variable_warning(heap2);
202 202

	
203 203
          int s = heap.size();
204 204
          ignore_unused_variable_warning(s);
205 205
          bool e = heap.empty();
206 206
          ignore_unused_variable_warning(e);
207 207

	
208 208
          prio = heap.prio();
209 209
          item = heap.top();
210 210
          prio = heap[item];
211 211
          own_prio = heap.prio();
212 212
          own_item = heap.top();
213 213
          own_prio = heap[own_item];
214 214

	
215 215
          heap.push(item, prio);
216 216
          heap.push(own_item, own_prio);
217 217
          heap.pop();
218 218

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

	
19 19
#ifndef LEMON_CONCEPT_MAPS_H
20 20
#define LEMON_CONCEPT_MAPS_H
21 21

	
22
#include <lemon/bits/utility.h>
22
#include <lemon/core.h>
23 23
#include <lemon/concept_check.h>
24 24

	
25 25
///\ingroup concept
26 26
///\file
27 27
///\brief The concept of maps.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// Readable map concept
37 37

	
38 38
    /// Readable map concept.
39 39
    ///
40 40
    template<typename K, typename T>
41 41
    class ReadMap
42 42
    {
43 43
    public:
44 44
      /// The key type of the map.
45 45
      typedef K Key;
46 46
      /// \brief The value type of the map.
47 47
      /// (The type of objects associated with the keys).
48 48
      typedef T Value;
49 49

	
50 50
      /// Returns the value associated with the given key.
51 51
      Value operator[](const Key &) const {
52 52
        return *static_cast<Value *>(0);
53 53
      }
54 54

	
55 55
      template<typename _ReadMap>
56 56
      struct Constraints {
57 57
        void constraints() {
58 58
          Value val = m[key];
59 59
          val = m[key];
60 60
          typename _ReadMap::Value own_val = m[own_key];
61 61
          own_val = m[own_key];
62 62

	
63 63
          ignore_unused_variable_warning(key);
64 64
          ignore_unused_variable_warning(val);
65 65
          ignore_unused_variable_warning(own_key);
66 66
          ignore_unused_variable_warning(own_val);
67 67
        }
68 68
        const Key& key;
69 69
        const typename _ReadMap::Key& own_key;
70 70
        const _ReadMap& m;
71 71
      };
72 72

	
73 73
    };
74 74

	
75 75

	
76 76
    /// Writable map concept
77 77

	
78 78
    /// Writable map concept.
79 79
    ///
80 80
    template<typename K, typename T>
81 81
    class WriteMap
82 82
    {
83 83
    public:
84 84
      /// The key type of the map.
85 85
      typedef K Key;
86 86
      /// \brief The value type of the map.
87 87
      /// (The type of objects associated with the keys).
88 88
      typedef T Value;
89 89

	
90 90
      /// Sets the value associated with the given key.
91 91
      void set(const Key &, const Value &) {}
92 92

	
93 93
      /// Default constructor.
94 94
      WriteMap() {}
95 95

	
96 96
      template <typename _WriteMap>
97 97
      struct Constraints {
98 98
        void constraints() {
99 99
          m.set(key, val);
100 100
          m.set(own_key, own_val);
101 101

	
102 102
          ignore_unused_variable_warning(key);
103 103
          ignore_unused_variable_warning(val);
104 104
          ignore_unused_variable_warning(own_key);
105 105
          ignore_unused_variable_warning(own_val);
106 106
        }
107 107
        const Key& key;
108 108
        const Value& val;
109 109
        const typename _WriteMap::Key& own_key;
110 110
        const typename _WriteMap::Value& own_val;
111 111
        _WriteMap& m;
112 112
      };
113 113
    };
114 114

	
115 115
    /// Read/writable map concept
116 116

	
117 117
    /// Read/writable map concept.
118 118
    ///
119 119
    template<typename K, typename T>
120 120
    class ReadWriteMap : public ReadMap<K,T>,
121 121
                         public WriteMap<K,T>
122 122
    {
123 123
    public:
124 124
      /// The key type of the map.
125 125
      typedef K Key;
126 126
      /// \brief The value type of the map.
127 127
      /// (The type of objects associated with the keys).
128 128
      typedef T Value;
129 129

	
130 130
      /// Returns the value associated with the given key.
131 131
      Value operator[](const Key &) const {
132 132
        return *static_cast<Value *>(0);
133 133
      }
134 134

	
135 135
      /// Sets the value associated with the given key.
136 136
      void set(const Key &, const Value &) {}
137 137

	
138 138
      template<typename _ReadWriteMap>
139 139
      struct Constraints {
140 140
        void constraints() {
141 141
          checkConcept<ReadMap<K, T>, _ReadWriteMap >();
142 142
          checkConcept<WriteMap<K, T>, _ReadWriteMap >();
143 143
        }
144 144
      };
145 145
    };
146 146

	
147 147

	
148 148
    /// Dereferable map concept
149 149

	
150 150
    /// Dereferable map concept.
151 151
    ///
152 152
    template<typename K, typename T, typename R, typename CR>
153 153
    class ReferenceMap : public ReadWriteMap<K,T>
154 154
    {
155 155
    public:
156 156
      /// Tag for reference maps.
157 157
      typedef True ReferenceMapTag;
158 158
      /// The key type of the map.
159 159
      typedef K Key;
160 160
      /// \brief The value type of the map.
161 161
      /// (The type of objects associated with the keys).
162 162
      typedef T Value;
163 163
      /// The reference type of the map.
164 164
      typedef R Reference;
165 165
      /// The const reference type of the map.
166 166
      typedef CR ConstReference;
167 167

	
168 168
    public:
169 169

	
170 170
      /// Returns a reference to the value associated with the given key.
171 171
      Reference operator[](const Key &) {
172 172
        return *static_cast<Value *>(0);
173 173
      }
174 174

	
175 175
      /// Returns a const reference to the value associated with the given key.
176 176
      ConstReference operator[](const Key &) const {
177 177
        return *static_cast<Value *>(0);
178 178
      }
179 179

	
180 180
      /// Sets the value associated with the given key.
181 181
      void set(const Key &k,const Value &t) { operator[](k)=t; }
182 182

	
183 183
      template<typename _ReferenceMap>
184 184
      struct Constraints {
185 185
        void constraints() {
186 186
          checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
187 187
          ref = m[key];
188 188
          m[key] = val;
189 189
          m[key] = ref;
190 190
          m[key] = cref;
191 191
          own_ref = m[own_key];
192 192
          m[own_key] = own_val;
193 193
          m[own_key] = own_ref;
194 194
          m[own_key] = own_cref;
195 195
          m[key] = m[own_key];
196 196
          m[own_key] = m[key];
197 197
        }
198 198
        const Key& key;
199 199
        Value& val;
200 200
        Reference ref;
201 201
        ConstReference cref;
202 202
        const typename _ReferenceMap::Key& own_key;
203 203
        typename _ReferenceMap::Value& own_val;
204 204
        typename _ReferenceMap::Reference own_ref;
205 205
        typename _ReferenceMap::ConstReference own_cref;
206 206
        _ReferenceMap& m;
207 207
      };
208 208
    };
209 209

	
210 210
    // @}
211 211

	
212 212
  } //namespace concepts
213 213

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

	
19 19
///\ingroup concept
20 20
///\file
21 21
///\brief Classes for representing paths in digraphs.
22 22
///
23 23
///\todo Iterators have obsolete style
24 24

	
25 25
#ifndef LEMON_CONCEPT_PATH_H
26 26
#define LEMON_CONCEPT_PATH_H
27 27

	
28
#include <lemon/bits/invalid.h>
29
#include <lemon/bits/utility.h>
28
#include <lemon/core.h>
30 29
#include <lemon/concept_check.h>
31 30

	
32 31
namespace lemon {
33 32
  namespace concepts {
34 33

	
35 34
    /// \addtogroup concept
36 35
    /// @{
37 36

	
38 37
    /// \brief A skeleton structure for representing directed paths in
39 38
    /// a digraph.
40 39
    ///
41 40
    /// A skeleton structure for representing directed paths in a
42 41
    /// digraph.
43 42
    /// \tparam _Digraph The digraph type in which the path is.
44 43
    ///
45 44
    /// In a sense, the path can be treated as a list of arcs. The
46 45
    /// lemon path type stores just this list. As a consequence it
47 46
    /// cannot enumerate the nodes in the path and the zero length
48 47
    /// paths cannot store the source.
49 48
    ///
50 49
    template <typename _Digraph>
51 50
    class Path {
52 51
    public:
53 52

	
54 53
      /// Type of the underlying digraph.
55 54
      typedef _Digraph Digraph;
56 55
      /// Arc type of the underlying digraph.
57 56
      typedef typename Digraph::Arc Arc;
58 57

	
59 58
      class ArcIt;
60 59

	
61 60
      /// \brief Default constructor
62 61
      Path() {}
63 62

	
64 63
      /// \brief Template constructor
65 64
      template <typename CPath>
66 65
      Path(const CPath& cpath) {}
67 66

	
68 67
      /// \brief Template assigment
69 68
      template <typename CPath>
70 69
      Path& operator=(const CPath& cpath) {}
71 70

	
72 71
      /// Length of the path ie. the number of arcs in the path.
73 72
      int length() const { return 0;}
74 73

	
75 74
      /// Returns whether the path is empty.
76 75
      bool empty() const { return true;}
77 76

	
78 77
      /// Resets the path to an empty path.
79 78
      void clear() {}
80 79

	
81 80
      /// \brief Lemon style iterator for path arcs
82 81
      ///
83 82
      /// This class is used to iterate on the arcs of the paths.
84 83
      class ArcIt {
85 84
      public:
86 85
        /// Default constructor
87 86
        ArcIt() {}
88 87
        /// Invalid constructor
89 88
        ArcIt(Invalid) {}
90 89
        /// Constructor for first arc
91 90
        ArcIt(const Path &) {}
92 91

	
93 92
        /// Conversion to Arc
94 93
        operator Arc() const { return INVALID; }
95 94

	
96 95
        /// Next arc
97 96
        ArcIt& operator++() {return *this;}
98 97

	
99 98
        /// Comparison operator
100 99
        bool operator==(const ArcIt&) const {return true;}
101 100
        /// Comparison operator
102 101
        bool operator!=(const ArcIt&) const {return true;}
103 102
        /// Comparison operator
104 103
        bool operator<(const ArcIt&) const {return false;}
105 104

	
106 105
      };
107 106

	
108 107
      template <typename _Path>
109 108
      struct Constraints {
110 109
        void constraints() {
111 110
          Path<Digraph> pc;
112 111
          _Path p, pp(pc);
113 112
          int l = p.length();
114 113
          int e = p.empty();
115 114
          p.clear();
116 115

	
117 116
          p = pc;
118 117

	
119 118
          typename _Path::ArcIt id, ii(INVALID), i(p);
120 119

	
121 120
          ++i;
122 121
          typename Digraph::Arc ed = i;
123 122

	
124 123
          e = (i == ii);
125 124
          e = (i != ii);
126 125
          e = (i < ii);
127 126

	
128 127
          ignore_unused_variable_warning(l);
129 128
          ignore_unused_variable_warning(pp);
130 129
          ignore_unused_variable_warning(e);
131 130
          ignore_unused_variable_warning(id);
132 131
          ignore_unused_variable_warning(ii);
133 132
          ignore_unused_variable_warning(ed);
134 133
        }
135 134
      };
136 135

	
137 136
    };
138 137

	
139 138
    namespace _path_bits {
140 139

	
141 140
      template <typename _Digraph, typename _Path, typename RevPathTag = void>
142 141
      struct PathDumperConstraints {
143 142
        void constraints() {
144 143
          int l = p.length();
145 144
          int e = p.empty();
146 145

	
147 146
          typename _Path::ArcIt id, i(p);
148 147

	
149 148
          ++i;
150 149
          typename _Digraph::Arc ed = i;
151 150

	
152 151
          e = (i == INVALID);
153 152
          e = (i != INVALID);
154 153

	
155 154
          ignore_unused_variable_warning(l);
156 155
          ignore_unused_variable_warning(e);
157 156
          ignore_unused_variable_warning(id);
158 157
          ignore_unused_variable_warning(ed);
159 158
        }
160 159
        _Path& p;
161 160
      };
162 161

	
163 162
      template <typename _Digraph, typename _Path>
164 163
      struct PathDumperConstraints<
165 164
        _Digraph, _Path,
166 165
        typename enable_if<typename _Path::RevPathTag, void>::type
167 166
      > {
168 167
        void constraints() {
169 168
          int l = p.length();
170 169
          int e = p.empty();
171 170

	
172 171
          typename _Path::RevArcIt id, i(p);
173 172

	
174 173
          ++i;
175 174
          typename _Digraph::Arc ed = i;
176 175

	
177 176
          e = (i == INVALID);
178 177
          e = (i != INVALID);
179 178

	
180 179
          ignore_unused_variable_warning(l);
181 180
          ignore_unused_variable_warning(e);
182 181
          ignore_unused_variable_warning(id);
183 182
          ignore_unused_variable_warning(ed);
184 183
        }
185 184
        _Path& p;
186 185
      };
187 186

	
188 187
    }
189 188

	
190 189

	
191 190
    /// \brief A skeleton structure for path dumpers.
192 191
    ///
193 192
    /// A skeleton structure for path dumpers. The path dumpers are
194 193
    /// the generalization of the paths. The path dumpers can
195 194
    /// enumerate the arcs of the path wheter in forward or in
196 195
    /// backward order.  In most time these classes are not used
197 196
    /// directly rather it used to assign a dumped class to a real
198 197
    /// path type.
199 198
    ///
200 199
    /// The main purpose of this concept is that the shortest path
201 200
    /// algorithms can enumerate easily the arcs in reverse order.
202 201
    /// If we would like to give back a real path from these
203 202
    /// algorithms then we should create a temporarly path object. In
204 203
    /// Lemon such algorithms gives back a path dumper what can
205 204
    /// assigned to a real path and the dumpers can be implemented as
206 205
    /// an adaptor class to the predecessor map.
207 206

	
208 207
    /// \tparam _Digraph  The digraph type in which the path is.
209 208
    ///
210 209
    /// The paths can be constructed from any path type by a
211 210
    /// template constructor or a template assignment operator.
212 211
    ///
213 212
    template <typename _Digraph>
214 213
    class PathDumper {
215 214
    public:
216 215

	
217 216
      /// Type of the underlying digraph.
218 217
      typedef _Digraph Digraph;
219 218
      /// Arc type of the underlying digraph.
220 219
      typedef typename Digraph::Arc Arc;
221 220

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

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief Dfs algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27
#include <lemon/graph_utils.h>
28 27
#include <lemon/bits/path_dump.h>
29
#include <lemon/bits/invalid.h>
28
#include <lemon/core.h>
30 29
#include <lemon/error.h>
31 30
#include <lemon/maps.h>
32 31

	
33 32
#include <lemon/concept_check.h>
34 33

	
35 34
namespace lemon {
36 35

	
37 36

	
38 37
  ///Default traits class of Dfs class.
39 38

	
40 39
  ///Default traits class of Dfs class.
41 40
  ///\tparam GR Digraph type.
42 41
  template<class GR>
43 42
  struct DfsDefaultTraits
44 43
  {
45 44
    ///The digraph type the algorithm runs on.
46 45
    typedef GR Digraph;
47 46
    ///\brief The type of the map that stores the last
48 47
    ///arcs of the %DFS paths.
49 48
    ///
50 49
    ///The type of the map that stores the last
51 50
    ///arcs of the %DFS paths.
52 51
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
53 52
    ///
54 53
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
55 54
    ///Instantiates a PredMap.
56 55

	
57 56
    ///This function instantiates a \ref PredMap.
58 57
    ///\param G is the digraph, to which we would like to define the PredMap.
59 58
    ///\todo The digraph alone may be insufficient to initialize
60 59
    static PredMap *createPredMap(const GR &G)
61 60
    {
62 61
      return new PredMap(G);
63 62
    }
64 63

	
65 64
    ///The type of the map that indicates which nodes are processed.
66 65

	
67 66
    ///The type of the map that indicates which nodes are processed.
68 67
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
69 68
    ///\todo named parameter to set this type, function to read and write.
70 69
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
71 70
    ///Instantiates a ProcessedMap.
72 71

	
73 72
    ///This function instantiates a \ref ProcessedMap.
74 73
    ///\param g is the digraph, to which
75 74
    ///we would like to define the \ref ProcessedMap
76 75
#ifdef DOXYGEN
77 76
    static ProcessedMap *createProcessedMap(const GR &g)
78 77
#else
79 78
    static ProcessedMap *createProcessedMap(const GR &)
80 79
#endif
81 80
    {
82 81
      return new ProcessedMap();
83 82
    }
84 83
    ///The type of the map that indicates which nodes are reached.
85 84

	
86 85
    ///The type of the map that indicates which nodes are reached.
87 86
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
88 87
    ///\todo named parameter to set this type, function to read and write.
89 88
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
90 89
    ///Instantiates a ReachedMap.
91 90

	
92 91
    ///This function instantiates a \ref ReachedMap.
93 92
    ///\param G is the digraph, to which
94 93
    ///we would like to define the \ref ReachedMap.
95 94
    static ReachedMap *createReachedMap(const GR &G)
96 95
    {
97 96
      return new ReachedMap(G);
98 97
    }
99 98
    ///The type of the map that stores the dists of the nodes.
100 99

	
101 100
    ///The type of the map that stores the dists of the nodes.
102 101
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
103 102
    ///
104 103
    typedef typename Digraph::template NodeMap<int> DistMap;
105 104
    ///Instantiates a DistMap.
106 105

	
107 106
    ///This function instantiates a \ref DistMap.
108 107
    ///\param G is the digraph, to which we would like to define
109 108
    ///the \ref DistMap
110 109
    static DistMap *createDistMap(const GR &G)
111 110
    {
112 111
      return new DistMap(G);
113 112
    }
114 113
  };
115 114

	
116 115
  ///%DFS algorithm class.
117 116

	
118 117
  ///\ingroup search
119 118
  ///This class provides an efficient implementation of the %DFS algorithm.
120 119
  ///
121 120
  ///\tparam GR The digraph type the algorithm runs on. The default value is
122 121
  ///\ref ListDigraph. The value of GR is not used directly by Dfs, it
123 122
  ///is only passed to \ref DfsDefaultTraits.
124 123
  ///\tparam TR Traits class to set various data types used by the algorithm.
125 124
  ///The default traits class is
126 125
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
127 126
  ///See \ref DfsDefaultTraits for the documentation of
128 127
  ///a Dfs traits class.
129 128
#ifdef DOXYGEN
130 129
  template <typename GR,
131 130
            typename TR>
132 131
#else
133 132
  template <typename GR=ListDigraph,
134 133
            typename TR=DfsDefaultTraits<GR> >
135 134
#endif
136 135
  class Dfs {
137 136
  public:
138 137
    /**
139 138
     * \brief \ref Exception for uninitialized parameters.
140 139
     *
141 140
     * This error represents problems in the initialization
142 141
     * of the parameters of the algorithms.
143 142
     */
144 143
    class UninitializedParameter : public lemon::UninitializedParameter {
145 144
    public:
146 145
      virtual const char* what() const throw() {
147 146
        return "lemon::Dfs::UninitializedParameter";
148 147
      }
149 148
    };
150 149

	
151 150
    typedef TR Traits;
152 151
    ///The type of the underlying digraph.
153 152
    typedef typename TR::Digraph Digraph;
154 153
    ///\e
155 154
    typedef typename Digraph::Node Node;
156 155
    ///\e
157 156
    typedef typename Digraph::NodeIt NodeIt;
158 157
    ///\e
159 158
    typedef typename Digraph::Arc Arc;
160 159
    ///\e
161 160
    typedef typename Digraph::OutArcIt OutArcIt;
162 161

	
163 162
    ///\brief The type of the map that stores the last
164 163
    ///arcs of the %DFS paths.
165 164
    typedef typename TR::PredMap PredMap;
166 165
    ///The type of the map indicating which nodes are reached.
167 166
    typedef typename TR::ReachedMap ReachedMap;
168 167
    ///The type of the map indicating which nodes are processed.
169 168
    typedef typename TR::ProcessedMap ProcessedMap;
170 169
    ///The type of the map that stores the dists of the nodes.
171 170
    typedef typename TR::DistMap DistMap;
172 171
  private:
173 172
    /// Pointer to the underlying digraph.
174 173
    const Digraph *G;
175 174
    ///Pointer to the map of predecessors arcs.
176 175
    PredMap *_pred;
177 176
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
178 177
    bool local_pred;
179 178
    ///Pointer to the map of distances.
180 179
    DistMap *_dist;
181 180
    ///Indicates if \ref _dist is locally allocated (\c true) or not.
182 181
    bool local_dist;
183 182
    ///Pointer to the map of reached status of the nodes.
184 183
    ReachedMap *_reached;
185 184
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
186 185
    bool local_reached;
187 186
    ///Pointer to the map of processed status of the nodes.
188 187
    ProcessedMap *_processed;
189 188
    ///Indicates if \ref _processed is locally allocated (\c true) or not.
190 189
    bool local_processed;
191 190

	
192 191
    std::vector<typename Digraph::OutArcIt> _stack;
193 192
    int _stack_head;
194 193

	
195 194
    ///Creates the maps if necessary.
196 195

	
197 196
    ///\todo Better memory allocation (instead of new).
198 197
    void create_maps()
199 198
    {
200 199
      if(!_pred) {
201 200
        local_pred = true;
202 201
        _pred = Traits::createPredMap(*G);
203 202
      }
204 203
      if(!_dist) {
205 204
        local_dist = true;
206 205
        _dist = Traits::createDistMap(*G);
207 206
      }
208 207
      if(!_reached) {
209 208
        local_reached = true;
210 209
        _reached = Traits::createReachedMap(*G);
211 210
      }
212 211
      if(!_processed) {
213 212
        local_processed = true;
214 213
        _processed = Traits::createProcessedMap(*G);
215 214
      }
216 215
    }
217 216

	
218 217
  protected:
219 218

	
220 219
    Dfs() {}
221 220

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

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30
#include <lemon/bits/invalid.h>
30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \brief Default OperationTraits for the Dijkstra algorithm class.
37 37
  ///
38 38
  /// It defines all computational operations and constants which are
39 39
  /// used in the Dijkstra algorithm.
40 40
  template <typename Value>
41 41
  struct DijkstraDefaultOperationTraits {
42 42
    /// \brief Gives back the zero value of the type.
43 43
    static Value zero() {
44 44
      return static_cast<Value>(0);
45 45
    }
46 46
    /// \brief Gives back the sum of the given two elements.
47 47
    static Value plus(const Value& left, const Value& right) {
48 48
      return left + right;
49 49
    }
50 50
    /// \brief Gives back true only if the first value less than the second.
51 51
    static bool less(const Value& left, const Value& right) {
52 52
      return left < right;
53 53
    }
54 54
  };
55 55

	
56 56
  /// \brief Widest path OperationTraits for the Dijkstra algorithm class.
57 57
  ///
58 58
  /// It defines all computational operations and constants which are
59 59
  /// used in the Dijkstra algorithm for widest path computation.
60 60
  template <typename Value>
61 61
  struct DijkstraWidestPathOperationTraits {
62 62
    /// \brief Gives back the maximum value of the type.
63 63
    static Value zero() {
64 64
      return std::numeric_limits<Value>::max();
65 65
    }
66 66
    /// \brief Gives back the minimum of the given two elements.
67 67
    static Value plus(const Value& left, const Value& right) {
68 68
      return std::min(left, right);
69 69
    }
70 70
    /// \brief Gives back true only if the first value less than the second.
71 71
    static bool less(const Value& left, const Value& right) {
72 72
      return left < right;
73 73
    }
74 74
  };
75 75

	
76 76
  ///Default traits class of Dijkstra class.
77 77

	
78 78
  ///Default traits class of Dijkstra class.
79 79
  ///\tparam GR Digraph type.
80 80
  ///\tparam LM Type of length map.
81 81
  template<class GR, class LM>
82 82
  struct DijkstraDefaultTraits
83 83
  {
84 84
    ///The digraph type the algorithm runs on.
85 85
    typedef GR Digraph;
86 86
    ///The type of the map that stores the arc lengths.
87 87

	
88 88
    ///The type of the map that stores the arc lengths.
89 89
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
90 90
    typedef LM LengthMap;
91 91
    //The type of the length of the arcs.
92 92
    typedef typename LM::Value Value;
93 93
    /// Operation traits for Dijkstra algorithm.
94 94

	
95 95
    /// It defines the used operation by the algorithm.
96 96
    /// \see DijkstraDefaultOperationTraits
97 97
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
98 98
    /// The cross reference type used by heap.
99 99

	
100 100

	
101 101
    /// The cross reference type used by heap.
102 102
    /// Usually it is \c Digraph::NodeMap<int>.
103 103
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
104 104
    ///Instantiates a HeapCrossRef.
105 105

	
106 106
    ///This function instantiates a \c HeapCrossRef.
107 107
    /// \param G is the digraph, to which we would like to define the
108 108
    /// HeapCrossRef.
109 109
    static HeapCrossRef *createHeapCrossRef(const GR &G)
110 110
    {
111 111
      return new HeapCrossRef(G);
112 112
    }
113 113

	
114 114
    ///The heap type used by Dijkstra algorithm.
115 115

	
116 116
    ///The heap type used by Dijkstra algorithm.
117 117
    ///
118 118
    ///\sa BinHeap
119 119
    ///\sa Dijkstra
120 120
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
121 121

	
122 122
    static Heap *createHeap(HeapCrossRef& R)
123 123
    {
124 124
      return new Heap(R);
125 125
    }
126 126

	
127 127
    ///\brief The type of the map that stores the last
128 128
    ///arcs of the shortest paths.
129 129
    ///
130 130
    ///The type of the map that stores the last
131 131
    ///arcs of the shortest paths.
132 132
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
133 133
    ///
134 134
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
135 135
    ///Instantiates a PredMap.
136 136

	
137 137
    ///This function instantiates a \c PredMap.
138 138
    ///\param G is the digraph, to which we would like to define the PredMap.
139 139
    ///\todo The digraph alone may be insufficient for the initialization
140 140
    static PredMap *createPredMap(const GR &G)
141 141
    {
142 142
      return new PredMap(G);
143 143
    }
144 144

	
145 145
    ///The type of the map that stores whether a nodes is processed.
146 146

	
147 147
    ///The type of the map that stores whether a nodes is processed.
148 148
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
149 149
    ///By default it is a NullMap.
150 150
    ///\todo If it is set to a real map,
151 151
    ///Dijkstra::processed() should read this.
152 152
    ///\todo named parameter to set this type, function to read and write.
153 153
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
154 154
    ///Instantiates a ProcessedMap.
155 155

	
156 156
    ///This function instantiates a \c ProcessedMap.
157 157
    ///\param g is the digraph, to which
158 158
    ///we would like to define the \c ProcessedMap
159 159
#ifdef DOXYGEN
160 160
    static ProcessedMap *createProcessedMap(const GR &g)
161 161
#else
162 162
    static ProcessedMap *createProcessedMap(const GR &)
163 163
#endif
164 164
    {
165 165
      return new ProcessedMap();
166 166
    }
167 167
    ///The type of the map that stores the dists of the nodes.
168 168

	
169 169
    ///The type of the map that stores the dists of the nodes.
170 170
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
171 171
    ///
172 172
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
173 173
    ///Instantiates a DistMap.
174 174

	
175 175
    ///This function instantiates a \ref DistMap.
176 176
    ///\param G is the digraph, to which we would like to define
177 177
    ///the \ref DistMap
178 178
    static DistMap *createDistMap(const GR &G)
179 179
    {
180 180
      return new DistMap(G);
181 181
    }
182 182
  };
183 183

	
184 184
  ///%Dijkstra algorithm class.
185 185

	
186 186
  /// \ingroup shortest_path
187 187
  ///This class provides an efficient implementation of %Dijkstra algorithm.
188 188
  ///The arc lengths are passed to the algorithm using a
189 189
  ///\ref concepts::ReadMap "ReadMap",
190 190
  ///so it is easy to change it to any kind of length.
191 191
  ///
192 192
  ///The type of the length is determined by the
193 193
  ///\ref concepts::ReadMap::Value "Value" of the length map.
194 194
  ///
195 195
  ///It is also possible to change the underlying priority heap.
196 196
  ///
197 197
  ///\tparam GR The digraph type the algorithm runs on. The default value
198 198
  ///is \ref ListDigraph. The value of GR is not used directly by
199 199
  ///Dijkstra, it is only passed to \ref DijkstraDefaultTraits.
200 200
  ///\tparam LM This read-only ArcMap determines the lengths of the
201 201
  ///arcs. It is read once for each arc, so the map may involve in
202 202
  ///relatively time consuming process to compute the arc length if
203 203
  ///it is necessary. The default map type is \ref
204 204
  ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".  The value
205 205
  ///of LM is not used directly by Dijkstra, it is only passed to \ref
206 206
  ///DijkstraDefaultTraits.
207 207
  ///\tparam TR Traits class to set
208 208
  ///various data types used by the algorithm.  The default traits
209 209
  ///class is \ref DijkstraDefaultTraits
210 210
  ///"DijkstraDefaultTraits<GR,LM>".  See \ref
211 211
  ///DijkstraDefaultTraits for the documentation of a Dijkstra traits
212 212
  ///class.
213 213

	
214 214
#ifdef DOXYGEN
215 215
  template <typename GR, typename LM, typename TR>
216 216
#else
217 217
  template <typename GR=ListDigraph,
218 218
            typename LM=typename GR::template ArcMap<int>,
219 219
            typename TR=DijkstraDefaultTraits<GR,LM> >
220 220
#endif
221 221
  class Dijkstra {
222 222
  public:
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23
#include <lemon/bits/utility.h>
23
#include <lemon/core.h>
24 24

	
25 25
///\ingroup misc
26 26
///\file
27 27
///\brief A simple two dimensional vector and a bounding box implementation
28 28
///
29 29
/// The class \ref lemon::dim2::Point "dim2::Point" implements
30 30
/// a two dimensional vector with the usual operations.
31 31
///
32 32
/// The class \ref lemon::dim2::BoundingBox "dim2::BoundingBox"
33 33
/// can be used to determine
34 34
/// the rectangular bounding box of a set of
35 35
/// \ref lemon::dim2::Point "dim2::Point"'s.
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  ///Tools for handling two dimensional coordinates
40 40

	
41 41
  ///This namespace is a storage of several
42 42
  ///tools for handling two dimensional coordinates
43 43
  namespace dim2 {
44 44

	
45 45
  /// \addtogroup misc
46 46
  /// @{
47 47

	
48 48
  /// A simple two dimensional vector (plainvector) implementation
49 49

	
50 50
  /// A simple two dimensional vector (plainvector) implementation
51 51
  /// with the usual vector operations.
52 52
  template<typename T>
53 53
    class Point {
54 54

	
55 55
    public:
56 56

	
57 57
      typedef T Value;
58 58

	
59 59
      ///First coordinate
60 60
      T x;
61 61
      ///Second coordinate
62 62
      T y;
63 63

	
64 64
      ///Default constructor
65 65
      Point() {}
66 66

	
67 67
      ///Construct an instance from coordinates
68 68
      Point(T a, T b) : x(a), y(b) { }
69 69

	
70 70
      ///Returns the dimension of the vector (i.e. returns 2).
71 71

	
72 72
      ///The dimension of the vector.
73 73
      ///This function always returns 2.
74 74
      int size() const { return 2; }
75 75

	
76 76
      ///Subscripting operator
77 77

	
78 78
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
79 79
      ///
80 80
      T& operator[](int idx) { return idx == 0 ? x : y; }
81 81

	
82 82
      ///Const subscripting operator
83 83

	
84 84
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
85 85
      ///
86 86
      const T& operator[](int idx) const { return idx == 0 ? x : y; }
87 87

	
88 88
      ///Conversion constructor
89 89
      template<class TT> Point(const Point<TT> &p) : x(p.x), y(p.y) {}
90 90

	
91 91
      ///Give back the square of the norm of the vector
92 92
      T normSquare() const {
93 93
        return x*x+y*y;
94 94
      }
95 95

	
96 96
      ///Increment the left hand side by \c u
97 97
      Point<T>& operator +=(const Point<T>& u) {
98 98
        x += u.x;
99 99
        y += u.y;
100 100
        return *this;
101 101
      }
102 102

	
103 103
      ///Decrement the left hand side by \c u
104 104
      Point<T>& operator -=(const Point<T>& u) {
105 105
        x -= u.x;
106 106
        y -= u.y;
107 107
        return *this;
108 108
      }
109 109

	
110 110
      ///Multiply the left hand side with a scalar
111 111
      Point<T>& operator *=(const T &u) {
112 112
        x *= u;
113 113
        y *= u;
114 114
        return *this;
115 115
      }
116 116

	
117 117
      ///Divide the left hand side by a scalar
118 118
      Point<T>& operator /=(const T &u) {
119 119
        x /= u;
120 120
        y /= u;
121 121
        return *this;
122 122
      }
123 123

	
124 124
      ///Return the scalar product of two vectors
125 125
      T operator *(const Point<T>& u) const {
126 126
        return x*u.x+y*u.y;
127 127
      }
128 128

	
129 129
      ///Return the sum of two vectors
130 130
      Point<T> operator+(const Point<T> &u) const {
131 131
        Point<T> b=*this;
132 132
        return b+=u;
133 133
      }
134 134

	
135 135
      ///Return the negative of the vector
136 136
      Point<T> operator-() const {
137 137
        Point<T> b=*this;
138 138
        b.x=-b.x; b.y=-b.y;
139 139
        return b;
140 140
      }
141 141

	
142 142
      ///Return the difference of two vectors
143 143
      Point<T> operator-(const Point<T> &u) const {
144 144
        Point<T> b=*this;
145 145
        return b-=u;
146 146
      }
147 147

	
148 148
      ///Return a vector multiplied by a scalar
149 149
      Point<T> operator*(const T &u) const {
150 150
        Point<T> b=*this;
151 151
        return b*=u;
152 152
      }
153 153

	
154 154
      ///Return a vector divided by a scalar
155 155
      Point<T> operator/(const T &u) const {
156 156
        Point<T> b=*this;
157 157
        return b/=u;
158 158
      }
159 159

	
160 160
      ///Test equality
161 161
      bool operator==(const Point<T> &u) const {
162 162
        return (x==u.x) && (y==u.y);
163 163
      }
164 164

	
165 165
      ///Test inequality
166 166
      bool operator!=(Point u) const {
167 167
        return  (x!=u.x) || (y!=u.y);
168 168
      }
169 169

	
170 170
    };
171 171

	
172 172
  ///Return a Point
173 173

	
174 174
  ///Return a Point.
175 175
  ///\relates Point
176 176
  template <typename T>
177 177
  inline Point<T> makePoint(const T& x, const T& y) {
178 178
    return Point<T>(x, y);
179 179
  }
180 180

	
181 181
  ///Return a vector multiplied by a scalar
182 182

	
183 183
  ///Return a vector multiplied by a scalar.
184 184
  ///\relates Point
185 185
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
186 186
    return x*u;
187 187
  }
188 188

	
189 189
  ///Read a plainvector from a stream
190 190

	
191 191
  ///Read a plainvector from a stream.
192 192
  ///\relates Point
193 193
  ///
194 194
  template<typename T>
195 195
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
196 196
    char c;
197 197
    if (is >> c) {
198 198
      if (c != '(') is.putback(c);
199 199
    } else {
200 200
      is.clear();
201 201
    }
202 202
    if (!(is >> z.x)) return is;
203 203
    if (is >> c) {
204 204
      if (c != ',') is.putback(c);
205 205
    } else {
206 206
      is.clear();
207 207
    }
208 208
    if (!(is >> z.y)) return is;
209 209
    if (is >> c) {
210 210
      if (c != ')') is.putback(c);
211 211
    } else {
212 212
      is.clear();
213 213
    }
214 214
    return is;
215 215
  }
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GRAPH_TO_EPS_H
20 20
#define LEMON_GRAPH_TO_EPS_H
21 21

	
22 22
#include<iostream>
23 23
#include<fstream>
24 24
#include<sstream>
25 25
#include<algorithm>
26 26
#include<vector>
27 27

	
28 28
#ifndef WIN32
29 29
#include<sys/time.h>
30 30
#include<ctime>
31 31
#else
32 32
#define WIN32_LEAN_AND_MEAN
33 33
#define NOMINMAX
34 34
#include<windows.h>
35 35
#endif
36 36

	
37 37
#include<lemon/math.h>
38
#include<lemon/bits/invalid.h>
38
#include<lemon/core.h>
39 39
#include<lemon/dim2.h>
40 40
#include<lemon/maps.h>
41 41
#include<lemon/color.h>
42 42
#include<lemon/bits/bezier.h>
43 43

	
44 44

	
45 45
///\ingroup eps_io
46 46
///\file
47 47
///\brief A well configurable tool for visualizing graphs
48 48

	
49 49
namespace lemon {
50 50

	
51 51
  namespace _graph_to_eps_bits {
52 52
    template<class MT>
53 53
    class _NegY {
54 54
    public:
55 55
      typedef typename MT::Key Key;
56 56
      typedef typename MT::Value Value;
57 57
      const MT &map;
58 58
      int yscale;
59 59
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
60 60
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
61 61
    };
62 62
  }
63 63

	
64 64
///Default traits class of \ref GraphToEps
65 65

	
66 66
///Default traits class of \ref GraphToEps.
67 67
///
68 68
///\c G is the type of the underlying graph.
69 69
template<class G>
70 70
struct DefaultGraphToEpsTraits
71 71
{
72 72
  typedef G Graph;
73 73
  typedef typename Graph::Node Node;
74 74
  typedef typename Graph::NodeIt NodeIt;
75 75
  typedef typename Graph::Arc Arc;
76 76
  typedef typename Graph::ArcIt ArcIt;
77 77
  typedef typename Graph::InArcIt InArcIt;
78 78
  typedef typename Graph::OutArcIt OutArcIt;
79 79

	
80 80

	
81 81
  const Graph &g;
82 82

	
83 83
  std::ostream& os;
84 84

	
85 85
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
86 86
  CoordsMapType _coords;
87 87
  ConstMap<typename Graph::Node,double > _nodeSizes;
88 88
  ConstMap<typename Graph::Node,int > _nodeShapes;
89 89

	
90 90
  ConstMap<typename Graph::Node,Color > _nodeColors;
91 91
  ConstMap<typename Graph::Arc,Color > _arcColors;
92 92

	
93 93
  ConstMap<typename Graph::Arc,double > _arcWidths;
94 94

	
95 95
  double _arcWidthScale;
96 96

	
97 97
  double _nodeScale;
98 98
  double _xBorder, _yBorder;
99 99
  double _scale;
100 100
  double _nodeBorderQuotient;
101 101

	
102 102
  bool _drawArrows;
103 103
  double _arrowLength, _arrowWidth;
104 104

	
105 105
  bool _showNodes, _showArcs;
106 106

	
107 107
  bool _enableParallel;
108 108
  double _parArcDist;
109 109

	
110 110
  bool _showNodeText;
111 111
  ConstMap<typename Graph::Node,bool > _nodeTexts;
112 112
  double _nodeTextSize;
113 113

	
114 114
  bool _showNodePsText;
115 115
  ConstMap<typename Graph::Node,bool > _nodePsTexts;
116 116
  char *_nodePsTextsPreamble;
117 117

	
118 118
  bool _undirected;
119 119

	
120 120
  bool _pleaseRemoveOsStream;
121 121

	
122 122
  bool _scaleToA4;
123 123

	
124 124
  std::string _title;
125 125
  std::string _copyright;
126 126

	
127 127
  enum NodeTextColorType
128 128
    { DIST_COL=0, DIST_BW=1, CUST_COL=2, SAME_COL=3 } _nodeTextColorType;
129 129
  ConstMap<typename Graph::Node,Color > _nodeTextColors;
130 130

	
131 131
  bool _autoNodeScale;
132 132
  bool _autoArcWidthScale;
133 133

	
134 134
  bool _absoluteNodeSizes;
135 135
  bool _absoluteArcWidths;
136 136

	
137 137
  bool _negY;
138 138

	
139 139
  bool _preScale;
140 140
  ///Constructor
141 141

	
142 142
  ///Constructor
143 143
  ///\param _g  Reference to the graph to be printed.
144 144
  ///\param _os Reference to the output stream.
145 145
  ///\param _os Reference to the output stream.
146 146
  ///By default it is <tt>std::cout</tt>.
147 147
  ///\param _pros If it is \c true, then the \c ostream referenced by \c _os
148 148
  ///will be explicitly deallocated by the destructor.
149 149
  DefaultGraphToEpsTraits(const G &_g,std::ostream& _os=std::cout,
150 150
                          bool _pros=false) :
151 151
    g(_g), os(_os),
152 152
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
153 153
    _nodeColors(WHITE), _arcColors(BLACK),
154 154
    _arcWidths(1.0), _arcWidthScale(0.003),
155 155
    _nodeScale(.01), _xBorder(10), _yBorder(10), _scale(1.0),
156 156
    _nodeBorderQuotient(.1),
157 157
    _drawArrows(false), _arrowLength(1), _arrowWidth(0.3),
158 158
    _showNodes(true), _showArcs(true),
159 159
    _enableParallel(false), _parArcDist(1),
160 160
    _showNodeText(false), _nodeTexts(false), _nodeTextSize(1),
161 161
    _showNodePsText(false), _nodePsTexts(false), _nodePsTextsPreamble(0),
162 162
    _undirected(lemon::UndirectedTagIndicator<G>::value),
163 163
    _pleaseRemoveOsStream(_pros), _scaleToA4(false),
164 164
    _nodeTextColorType(SAME_COL), _nodeTextColors(BLACK),
165 165
    _autoNodeScale(false),
166 166
    _autoArcWidthScale(false),
167 167
    _absoluteNodeSizes(false),
168 168
    _absoluteArcWidths(false),
169 169
    _negY(false),
170 170
    _preScale(true)
171 171
  {}
172 172
};
173 173

	
174 174
///Auxiliary class to implement the named parameters of \ref graphToEps()
175 175

	
176 176
///Auxiliary class to implement the named parameters of \ref graphToEps().
177 177
///
178 178
///For detailed examples see the \ref graph_to_eps_demo.cc demo file.
179 179
template<class T> class GraphToEps : public T
180 180
{
181 181
  // Can't believe it is required by the C++ standard
182 182
  using T::g;
183 183
  using T::os;
184 184

	
185 185
  using T::_coords;
186 186
  using T::_nodeSizes;
187 187
  using T::_nodeShapes;
188 188
  using T::_nodeColors;
189 189
  using T::_arcColors;
190 190
  using T::_arcWidths;
191 191

	
192 192
  using T::_arcWidthScale;
193 193
  using T::_nodeScale;
194 194
  using T::_xBorder;
195 195
  using T::_yBorder;
196 196
  using T::_scale;
197 197
  using T::_nodeBorderQuotient;
198 198

	
199 199
  using T::_drawArrows;
200 200
  using T::_arrowLength;
201 201
  using T::_arrowWidth;
202 202

	
203 203
  using T::_showNodes;
204 204
  using T::_showArcs;
205 205

	
206 206
  using T::_enableParallel;
207 207
  using T::_parArcDist;
208 208

	
209 209
  using T::_showNodeText;
210 210
  using T::_nodeTexts;
211 211
  using T::_nodeTextSize;
212 212

	
213 213
  using T::_showNodePsText;
214 214
  using T::_nodePsTexts;
215 215
  using T::_nodePsTextsPreamble;
216 216

	
217 217
  using T::_undirected;
218 218

	
219 219
  using T::_pleaseRemoveOsStream;
220 220

	
221 221
  using T::_scaleToA4;
222 222

	
223 223
  using T::_title;
224 224
  using T::_copyright;
225 225

	
226 226
  using T::NodeTextColorType;
227 227
  using T::CUST_COL;
228 228
  using T::DIST_COL;
229 229
  using T::DIST_BW;
230 230
  using T::_nodeTextColorType;
Ignore white space 384 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
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_BITS_INVALID_H
20
#define LEMON_BITS_INVALID_H
21

	
22
///\file
23
///\brief Definition of INVALID.
24

	
25
namespace lemon {
26

	
27
  /// \brief Dummy type to make it easier to create invalid iterators.
28
  ///
29
  /// Dummy type to make it easier to create invalid iterators.
30
  /// See \ref INVALID for the usage.
31
  struct Invalid {
32
  public:
33
    bool operator==(Invalid) { return true;  }
34
    bool operator!=(Invalid) { return false; }
35
    bool operator< (Invalid) { return false; }
36
  };
37

	
38
  /// \brief Invalid iterators.
39
  ///
40
  /// \ref Invalid is a global type that converts to each iterator
41
  /// in such a way that the value of the target iterator will be invalid.
42

	
43
  //Some people didn't like this:
44
  //const Invalid &INVALID = *(Invalid *)0;
45

	
46
#ifdef LEMON_ONLY_TEMPLATES
47
  const Invalid INVALID = Invalid();
48
#else
49
  extern const Invalid INVALID;
50
#endif
51

	
52
} //namespace lemon
53

	
54
#endif
55

	
Ignore white space 384 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
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
// This file contains a modified version of the enable_if library from BOOST.
20
// See the appropriate copyright notice below.
21

	
22
// Boost enable_if library
23

	
24
// Copyright 2003 (c) The Trustees of Indiana University.
25

	
26
// Use, modification, and distribution is subject to the Boost Software
27
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
28
// http://www.boost.org/LICENSE_1_0.txt)
29

	
30
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
31
//             Jeremiah Willcock (jewillco at osl.iu.edu)
32
//             Andrew Lumsdaine (lums at osl.iu.edu)
33

	
34

	
35
#ifndef LEMON_BITS_UTILITY_H
36
#define LEMON_BITS_UTILITY_H
37

	
38
///\file
39
///\brief Miscellaneous basic utilities
40
///
41
///\todo Please rethink the organisation of the basic files like this.
42
///E.g. this file might be merged with invalid.h.
43

	
44

	
45
namespace lemon
46
{
47

	
48
  /// Basic type for defining "tags". A "YES" condition for \c enable_if.
49

	
50
  /// Basic type for defining "tags". A "YES" condition for \c enable_if.
51
  ///
52
  ///\sa False
53
  ///
54
  /// \todo This should go to a separate "basic_types.h" (or something)
55
  /// file.
56
  struct True {
57
    ///\e
58
    static const bool value = true;
59
  };
60

	
61
  /// Basic type for defining "tags". A "NO" condition for \c enable_if.
62

	
63
  /// Basic type for defining "tags". A "NO" condition for \c enable_if.
64
  ///
65
  ///\sa True
66
  struct False {
67
    ///\e
68
    static const bool value = false;
69
  };
70

	
71

	
72
  struct InvalidType {
73
  };
74

	
75
  template <typename T>
76
  struct Wrap {
77
    const T &value;
78
    Wrap(const T &t) : value(t) {}
79
  };
80

	
81
  /**************** dummy class to avoid ambiguity ****************/
82

	
83
  template<int T> struct dummy { dummy(int) {} };
84

	
85
  /**************** enable_if from BOOST ****************/
86

	
87
  template <typename Type, typename T = void>
88
  struct exists {
89
    typedef T type;
90
  };
91

	
92

	
93
  template <bool B, class T = void>
94
  struct enable_if_c {
95
    typedef T type;
96
  };
97

	
98
  template <class T>
99
  struct enable_if_c<false, T> {};
100

	
101
  template <class Cond, class T = void>
102
  struct enable_if : public enable_if_c<Cond::value, T> {};
103

	
104
  template <bool B, class T>
105
  struct lazy_enable_if_c {
106
    typedef typename T::type type;
107
  };
108

	
109
  template <class T>
110
  struct lazy_enable_if_c<false, T> {};
111

	
112
  template <class Cond, class T>
113
  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};
114

	
115

	
116
  template <bool B, class T = void>
117
  struct disable_if_c {
118
    typedef T type;
119
  };
120

	
121
  template <class T>
122
  struct disable_if_c<true, T> {};
123

	
124
  template <class Cond, class T = void>
125
  struct disable_if : public disable_if_c<Cond::value, T> {};
126

	
127
  template <bool B, class T>
128
  struct lazy_disable_if_c {
129
    typedef typename T::type type;
130
  };
131

	
132
  template <class T>
133
  struct lazy_disable_if_c<true, T> {};
134

	
135
  template <class Cond, class T>
136
  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
137

	
138
} // namespace lemon
139

	
140
#endif

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)