↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -25,75 +25,73 @@
25 25

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

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50 50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \ref PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57
    ///\todo The digraph alone may be insufficient to initialize
58 57
    static PredMap *createPredMap(const Digraph &g)
59 58
    {
60 59
      return new PredMap(g);
61 60
    }
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
    ///By default it is a NullMap.
68 66
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
69 67
    ///Instantiates a \ref ProcessedMap.
70 68

	
71 69
    ///This function instantiates a \ref ProcessedMap.
72 70
    ///\param g is the digraph, to which
73 71
    ///we would like to define the \ref ProcessedMap
74 72
#ifdef DOXYGEN
75 73
    static ProcessedMap *createProcessedMap(const Digraph &g)
76 74
#else
77 75
    static ProcessedMap *createProcessedMap(const Digraph &)
78 76
#endif
79 77
    {
80 78
      return new ProcessedMap();
81 79
    }
82 80

	
83 81
    ///The type of the map that indicates which nodes are reached.
84 82

	
85 83
    ///The type of the map that indicates which nodes are reached.
86 84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
87 85
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
88 86
    ///Instantiates a \ref ReachedMap.
89 87

	
90 88
    ///This function instantiates a \ref ReachedMap.
91 89
    ///\param g is the digraph, to which
92 90
    ///we would like to define the \ref ReachedMap.
93 91
    static ReachedMap *createReachedMap(const Digraph &g)
94 92
    {
95 93
      return new ReachedMap(g);
96 94
    }
97 95

	
98 96
    ///The type of the map that stores the distances of the nodes.
99 97

	
... ...
@@ -167,66 +165,65 @@
167 165
    typedef TR Traits;
168 166

	
169 167
  private:
170 168

	
171 169
    typedef typename Digraph::Node Node;
172 170
    typedef typename Digraph::NodeIt NodeIt;
173 171
    typedef typename Digraph::Arc Arc;
174 172
    typedef typename Digraph::OutArcIt OutArcIt;
175 173

	
176 174
    //Pointer to the underlying digraph.
177 175
    const Digraph *G;
178 176
    //Pointer to the map of predecessor arcs.
179 177
    PredMap *_pred;
180 178
    //Indicates if _pred is locally allocated (true) or not.
181 179
    bool local_pred;
182 180
    //Pointer to the map of distances.
183 181
    DistMap *_dist;
184 182
    //Indicates if _dist is locally allocated (true) or not.
185 183
    bool local_dist;
186 184
    //Pointer to the map of reached status of the nodes.
187 185
    ReachedMap *_reached;
188 186
    //Indicates if _reached is locally allocated (true) or not.
189 187
    bool local_reached;
190 188
    //Pointer to the map of processed status of the nodes.
191 189
    ProcessedMap *_processed;
192 190
    //Indicates if _processed is locally allocated (true) or not.
193 191
    bool local_processed;
194 192

	
195 193
    std::vector<typename Digraph::Node> _queue;
196 194
    int _queue_head,_queue_tail,_queue_next_dist;
197 195
    int _curr_dist;
198 196

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

	
221 218
  protected:
222 219

	
223 220
    Bfs() {}
224 221

	
225 222
  public:
226 223

	
227 224
    typedef Bfs Create;
228 225

	
229 226
    ///\name Named template parameters
230 227

	
231 228
    ///@{
232 229

	
... ...
@@ -819,65 +816,64 @@
819 816
    ///Checks if a node is reachable from the root(s).
820 817

	
821 818
    ///Returns \c true if \c v is reachable from the root(s).
822 819
    ///\pre Either \ref run() or \ref start()
823 820
    ///must be called before using this function.
824 821
    bool reached(Node v) const { return (*_reached)[v]; }
825 822

	
826 823
    ///@}
827 824
  };
828 825

	
829 826
  ///Default traits class of bfs() function.
830 827

	
831 828
  ///Default traits class of bfs() function.
832 829
  ///\tparam GR Digraph type.
833 830
  template<class GR>
834 831
  struct BfsWizardDefaultTraits
835 832
  {
836 833
    ///The type of the digraph the algorithm runs on.
837 834
    typedef GR Digraph;
838 835

	
839 836
    ///\brief The type of the map that stores the predecessor
840 837
    ///arcs of the shortest paths.
841 838
    ///
842 839
    ///The type of the map that stores the predecessor
843 840
    ///arcs of the shortest paths.
844 841
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
845 842
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
846 843
    ///Instantiates a \ref PredMap.
847 844

	
848 845
    ///This function instantiates a \ref PredMap.
849 846
    ///\param g is the digraph, to which we would like to define the
850 847
    ///\ref PredMap.
851
    ///\todo The digraph alone may be insufficient to initialize
852 848
    static PredMap *createPredMap(const Digraph &g)
853 849
    {
854 850
      return new PredMap(g);
855 851
    }
856 852

	
857 853
    ///The type of the map that indicates which nodes are processed.
858 854

	
859 855
    ///The type of the map that indicates which nodes are processed.
860 856
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
861 857
    ///By default it is a NullMap.
862 858
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
863 859
    ///Instantiates a \ref ProcessedMap.
864 860

	
865 861
    ///This function instantiates a \ref ProcessedMap.
866 862
    ///\param g is the digraph, to which
867 863
    ///we would like to define the \ref ProcessedMap.
868 864
#ifdef DOXYGEN
869 865
    static ProcessedMap *createProcessedMap(const Digraph &g)
870 866
#else
871 867
    static ProcessedMap *createProcessedMap(const Digraph &)
872 868
#endif
873 869
    {
874 870
      return new ProcessedMap();
875 871
    }
876 872

	
877 873
    ///The type of the map that indicates which nodes are reached.
878 874

	
879 875
    ///The type of the map that indicates which nodes are reached.
880 876
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
881 877
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
882 878
    ///Instantiates a \ref ReachedMap.
883 879

	
... ...
@@ -1341,66 +1337,65 @@
1341 1337

	
1342 1338
    ///The traits class.
1343 1339
    typedef _Traits Traits;
1344 1340

	
1345 1341
    ///The type of the digraph the algorithm runs on.
1346 1342
    typedef typename Traits::Digraph Digraph;
1347 1343

	
1348 1344
    ///The visitor type used by the algorithm.
1349 1345
    typedef _Visitor Visitor;
1350 1346

	
1351 1347
    ///The type of the map that indicates which nodes are reached.
1352 1348
    typedef typename Traits::ReachedMap ReachedMap;
1353 1349

	
1354 1350
  private:
1355 1351

	
1356 1352
    typedef typename Digraph::Node Node;
1357 1353
    typedef typename Digraph::NodeIt NodeIt;
1358 1354
    typedef typename Digraph::Arc Arc;
1359 1355
    typedef typename Digraph::OutArcIt OutArcIt;
1360 1356

	
1361 1357
    //Pointer to the underlying digraph.
1362 1358
    const Digraph *_digraph;
1363 1359
    //Pointer to the visitor object.
1364 1360
    Visitor *_visitor;
1365 1361
    //Pointer to the map of reached status of the nodes.
1366 1362
    ReachedMap *_reached;
1367 1363
    //Indicates if _reached is locally allocated (true) or not.
1368 1364
    bool local_reached;
1369 1365

	
1370 1366
    std::vector<typename Digraph::Node> _list;
1371 1367
    int _list_front, _list_back;
1372 1368

	
1373
    ///Creates the maps if necessary.
1374
    ///\todo Better memory allocation (instead of new).
1369
    //Creates the maps if necessary.
1375 1370
    void create_maps() {
1376 1371
      if(!_reached) {
1377 1372
        local_reached = true;
1378 1373
        _reached = Traits::createReachedMap(*_digraph);
1379 1374
      }
1380 1375
    }
1381 1376

	
1382 1377
  protected:
1383 1378

	
1384 1379
    BfsVisit() {}
1385 1380

	
1386 1381
  public:
1387 1382

	
1388 1383
    typedef BfsVisit Create;
1389 1384

	
1390 1385
    /// \name Named template parameters
1391 1386

	
1392 1387
    ///@{
1393 1388
    template <class T>
1394 1389
    struct SetReachedMapTraits : public Traits {
1395 1390
      typedef T ReachedMap;
1396 1391
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1397 1392
        throw UninitializedParameter();
1398 1393
      }
1399 1394
    };
1400 1395
    /// \brief \ref named-templ-param "Named parameter" for setting
1401 1396
    /// ReachedMap type.
1402 1397
    ///
1403 1398
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1404 1399
    template <class T>
1405 1400
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1406 1401
                                            SetReachedMapTraits<T> > {
Ignore white space 6 line context
... ...
@@ -76,67 +76,64 @@
76 76

	
77 77
    /// First node of the edge
78 78
    Node u(const Edge &e) const {
79 79
      return Parent::source(e);
80 80
    }
81 81

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

	
87 87
    /// Second node of the edge
88 88
    Node v(const Edge &e) const {
89 89
      return Parent::target(e);
90 90
    }
91 91

	
92 92
    /// Target of the given arc
93 93
    Node target(const Arc &e) const {
94 94
      return e.forward ? Parent::target(e) : Parent::source(e);
95 95
    }
96 96

	
97 97
    /// \brief Directed arc from an edge.
98 98
    ///
99 99
    /// Returns a directed arc corresponding to the specified edge.
100 100
    /// If the given bool is true, the first node of the given edge and
101 101
    /// the source node of the returned arc are the same.
102 102
    static Arc direct(const Edge &e, bool d) {
103 103
      return Arc(e, d);
104 104
    }
105 105

	
106 106
    /// Returns whether the given directed arc has the same orientation
107 107
    /// as the corresponding edge.
108
    ///
109
    /// \todo reference to the corresponding point of the undirected digraph
110
    /// concept. "What does the direction of an edge mean?"
111 108
    static bool direction(const Arc &a) { return a.forward; }
112 109

	
113 110
    using Parent::first;
114 111
    using Parent::next;
115 112

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

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

	
131 128
    void firstOut(Arc &e, const Node &n) const {
132 129
      Parent::firstIn(e,n);
133 130
      if( Edge(e) != INVALID ) {
134 131
        e.forward = false;
135 132
      }
136 133
      else {
137 134
        Parent::firstOut(e,n);
138 135
        e.forward = true;
139 136
      }
140 137
    }
141 138
    void nextOut(Arc &e) const {
142 139
      if( ! e.forward ) {
Ignore white space 6 line context
... ...
@@ -13,68 +13,67 @@
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 25
#include <lemon/core.h>
26 26
#include <lemon/bits/alteration_notifier.h>
27 27

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

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

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

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

	
57 56
  public:
58 57

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

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

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

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

	
79 78
    /// The reference type of the map;
80 79
    typedef typename Container::reference Reference;
Ignore white space 6 line context
... ...
@@ -7,66 +7,64 @@
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
// This file contains a modified version of the concept checking
20 20
// utility from BOOST.
21 21
// See the appropriate copyright notice below.
22 22

	
23 23
// (C) Copyright Jeremy Siek 2000.
24 24
// Distributed under the Boost Software License, Version 1.0. (See
25 25
// accompanying file LICENSE_1_0.txt or copy at
26 26
// http://www.boost.org/LICENSE_1_0.txt)
27 27
//
28 28
// Revision History:
29 29
//   05 May   2001: Workarounds for HP aCC from Thomas Matelich. (Jeremy Siek)
30 30
//   02 April 2001: Removed limits header altogether. (Jeremy Siek)
31 31
//   01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)
32 32
//
33 33

	
34 34
// See http://www.boost.org/libs/concept_check for documentation.
35 35

	
36 36
///\file
37 37
///\brief Basic utilities for concept checking.
38 38
///
39
///\todo Are we still using BOOST concept checking utility?
40
///Is the BOOST copyright notice necessary?
41 39

	
42 40
#ifndef LEMON_CONCEPT_CHECK_H
43 41
#define LEMON_CONCEPT_CHECK_H
44 42

	
45 43
namespace lemon {
46 44

	
47 45
  /*
48 46
    "inline" is used for ignore_unused_variable_warning()
49 47
    and function_requires() to make sure there is no
50 48
    overtarget with g++.
51 49
  */
52 50

	
53 51
  template <class T> inline void ignore_unused_variable_warning(const T&) { }
54 52

	
55 53
  ///\e
56 54
  template <class Concept>
57 55
  inline void function_requires()
58 56
  {
59 57
#if !defined(NDEBUG)
60 58
    void (Concept::*x)() = & Concept::constraints;
61 59
    ignore_unused_variable_warning(x);
62 60
#endif
63 61
  }
64 62

	
65 63
  ///\e
66 64
  template <typename Concept, typename Type>
67 65
  inline void checkConcept() {
68 66
#if !defined(NDEBUG)
69 67
    typedef typename Concept::template Constraints<Type> ConceptCheck;
70 68
    void (ConceptCheck::*x)() = & ConceptCheck::constraints;
71 69
    ignore_unused_variable_warning(x);
72 70
#endif
Ignore white space 6 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
///\todo Iterators have obsolete style
24 23

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

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

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

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

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

	
53 52
      /// Type of the underlying digraph.
54 53
      typedef _Digraph Digraph;
55 54
      /// Arc type of the underlying digraph.
Ignore white space 6 line context
... ...
@@ -26,75 +26,73 @@
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/assert.h>
31 31
#include <lemon/maps.h>
32 32
#include <lemon/path.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  ///Default traits class of Dfs class.
37 37

	
38 38
  ///Default traits class of Dfs class.
39 39
  ///\tparam GR Digraph type.
40 40
  template<class GR>
41 41
  struct DfsDefaultTraits
42 42
  {
43 43
    ///The type of the digraph the algorithm runs on.
44 44
    typedef GR Digraph;
45 45

	
46 46
    ///\brief The type of the map that stores the predecessor
47 47
    ///arcs of the %DFS paths.
48 48
    ///
49 49
    ///The type of the map that stores the predecessor
50 50
    ///arcs of the %DFS paths.
51 51
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 52
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
53 53
    ///Instantiates a \ref PredMap.
54 54

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

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

	
66 65
    ///The type of the map that indicates which nodes are processed.
67 66
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
68
    ///By default it is a NullMap.
69 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
70 68
    ///Instantiates a \ref ProcessedMap.
71 69

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

	
84 82
    ///The type of the map that indicates which nodes are reached.
85 83

	
86 84
    ///The type of the map that indicates which nodes are reached.
87 85
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
88 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
89 87
    ///Instantiates a \ref ReachedMap.
90 88

	
91 89
    ///This function instantiates a \ref ReachedMap.
92 90
    ///\param g is the digraph, to which
93 91
    ///we would like to define the \ref ReachedMap.
94 92
    static ReachedMap *createReachedMap(const Digraph &g)
95 93
    {
96 94
      return new ReachedMap(g);
97 95
    }
98 96

	
99 97
    ///The type of the map that stores the distances of the nodes.
100 98

	
... ...
@@ -167,66 +165,65 @@
167 165
    ///The traits class.
168 166
    typedef TR Traits;
169 167

	
170 168
  private:
171 169

	
172 170
    typedef typename Digraph::Node Node;
173 171
    typedef typename Digraph::NodeIt NodeIt;
174 172
    typedef typename Digraph::Arc Arc;
175 173
    typedef typename Digraph::OutArcIt OutArcIt;
176 174

	
177 175
    //Pointer to the underlying digraph.
178 176
    const Digraph *G;
179 177
    //Pointer to the map of predecessor arcs.
180 178
    PredMap *_pred;
181 179
    //Indicates if _pred is locally allocated (true) or not.
182 180
    bool local_pred;
183 181
    //Pointer to the map of distances.
184 182
    DistMap *_dist;
185 183
    //Indicates if _dist is locally allocated (true) or not.
186 184
    bool local_dist;
187 185
    //Pointer to the map of reached status of the nodes.
188 186
    ReachedMap *_reached;
189 187
    //Indicates if _reached is locally allocated (true) or not.
190 188
    bool local_reached;
191 189
    //Pointer to the map of processed status of the nodes.
192 190
    ProcessedMap *_processed;
193 191
    //Indicates if _processed is locally allocated (true) or not.
194 192
    bool local_processed;
195 193

	
196 194
    std::vector<typename Digraph::OutArcIt> _stack;
197 195
    int _stack_head;
198 196

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

	
221 218
  protected:
222 219

	
223 220
    Dfs() {}
224 221

	
225 222
  public:
226 223

	
227 224
    typedef Dfs Create;
228 225

	
229 226
    ///\name Named template parameters
230 227

	
231 228
    ///@{
232 229

	
... ...
@@ -753,65 +750,64 @@
753 750
    ///Checks if a node is reachable from the root(s).
754 751

	
755 752
    ///Returns \c true if \c v is reachable from the root(s).
756 753
    ///\pre Either \ref run() or \ref start()
757 754
    ///must be called before using this function.
758 755
    bool reached(Node v) const { return (*_reached)[v]; }
759 756

	
760 757
    ///@}
761 758
  };
762 759

	
763 760
  ///Default traits class of dfs() function.
764 761

	
765 762
  ///Default traits class of dfs() function.
766 763
  ///\tparam GR Digraph type.
767 764
  template<class GR>
768 765
  struct DfsWizardDefaultTraits
769 766
  {
770 767
    ///The type of the digraph the algorithm runs on.
771 768
    typedef GR Digraph;
772 769

	
773 770
    ///\brief The type of the map that stores the predecessor
774 771
    ///arcs of the %DFS paths.
775 772
    ///
776 773
    ///The type of the map that stores the predecessor
777 774
    ///arcs of the %DFS paths.
778 775
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
779 776
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
780 777
    ///Instantiates a \ref PredMap.
781 778

	
782 779
    ///This function instantiates a \ref PredMap.
783 780
    ///\param g is the digraph, to which we would like to define the
784 781
    ///\ref PredMap.
785
    ///\todo The digraph alone may be insufficient to initialize
786 782
    static PredMap *createPredMap(const Digraph &g)
787 783
    {
788 784
      return new PredMap(g);
789 785
    }
790 786

	
791 787
    ///The type of the map that indicates which nodes are processed.
792 788

	
793 789
    ///The type of the map that indicates which nodes are processed.
794 790
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
795 791
    ///By default it is a NullMap.
796 792
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
797 793
    ///Instantiates a \ref ProcessedMap.
798 794

	
799 795
    ///This function instantiates a \ref ProcessedMap.
800 796
    ///\param g is the digraph, to which
801 797
    ///we would like to define the \ref ProcessedMap.
802 798
#ifdef DOXYGEN
803 799
    static ProcessedMap *createProcessedMap(const Digraph &g)
804 800
#else
805 801
    static ProcessedMap *createProcessedMap(const Digraph &)
806 802
#endif
807 803
    {
808 804
      return new ProcessedMap();
809 805
    }
810 806

	
811 807
    ///The type of the map that indicates which nodes are reached.
812 808

	
813 809
    ///The type of the map that indicates which nodes are reached.
814 810
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
815 811
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
816 812
    ///Instantiates a \ref ReachedMap.
817 813

	
... ...
@@ -1288,66 +1284,65 @@
1288 1284

	
1289 1285
    ///The traits class.
1290 1286
    typedef _Traits Traits;
1291 1287

	
1292 1288
    ///The type of the digraph the algorithm runs on.
1293 1289
    typedef typename Traits::Digraph Digraph;
1294 1290

	
1295 1291
    ///The visitor type used by the algorithm.
1296 1292
    typedef _Visitor Visitor;
1297 1293

	
1298 1294
    ///The type of the map that indicates which nodes are reached.
1299 1295
    typedef typename Traits::ReachedMap ReachedMap;
1300 1296

	
1301 1297
  private:
1302 1298

	
1303 1299
    typedef typename Digraph::Node Node;
1304 1300
    typedef typename Digraph::NodeIt NodeIt;
1305 1301
    typedef typename Digraph::Arc Arc;
1306 1302
    typedef typename Digraph::OutArcIt OutArcIt;
1307 1303

	
1308 1304
    //Pointer to the underlying digraph.
1309 1305
    const Digraph *_digraph;
1310 1306
    //Pointer to the visitor object.
1311 1307
    Visitor *_visitor;
1312 1308
    //Pointer to the map of reached status of the nodes.
1313 1309
    ReachedMap *_reached;
1314 1310
    //Indicates if _reached is locally allocated (true) or not.
1315 1311
    bool local_reached;
1316 1312

	
1317 1313
    std::vector<typename Digraph::Arc> _stack;
1318 1314
    int _stack_head;
1319 1315

	
1320
    ///Creates the maps if necessary.
1321
    ///\todo Better memory allocation (instead of new).
1316
    //Creates the maps if necessary.
1322 1317
    void create_maps() {
1323 1318
      if(!_reached) {
1324 1319
        local_reached = true;
1325 1320
        _reached = Traits::createReachedMap(*_digraph);
1326 1321
      }
1327 1322
    }
1328 1323

	
1329 1324
  protected:
1330 1325

	
1331 1326
    DfsVisit() {}
1332 1327

	
1333 1328
  public:
1334 1329

	
1335 1330
    typedef DfsVisit Create;
1336 1331

	
1337 1332
    /// \name Named template parameters
1338 1333

	
1339 1334
    ///@{
1340 1335
    template <class T>
1341 1336
    struct SetReachedMapTraits : public Traits {
1342 1337
      typedef T ReachedMap;
1343 1338
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1344 1339
        throw UninitializedParameter();
1345 1340
      }
1346 1341
    };
1347 1342
    /// \brief \ref named-templ-param "Named parameter" for setting
1348 1343
    /// ReachedMap type.
1349 1344
    ///
1350 1345
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1351 1346
    template <class T>
1352 1347
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1353 1348
                                            SetReachedMapTraits<T> > {
Ignore white space 6 line context
... ...
@@ -115,77 +115,74 @@
115 115
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
116 116
    {
117 117
      return new HeapCrossRef(g);
118 118
    }
119 119

	
120 120
    ///The heap type used by the Dijkstra algorithm.
121 121

	
122 122
    ///The heap type used by the Dijkstra algorithm.
123 123
    ///
124 124
    ///\sa BinHeap
125 125
    ///\sa Dijkstra
126 126
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
127 127
    ///Instantiates a \ref Heap.
128 128

	
129 129
    ///This function instantiates a \ref Heap.
130 130
    static Heap *createHeap(HeapCrossRef& r)
131 131
    {
132 132
      return new Heap(r);
133 133
    }
134 134

	
135 135
    ///\brief The type of the map that stores the predecessor
136 136
    ///arcs of the shortest paths.
137 137
    ///
138 138
    ///The type of the map that stores the predecessor
139 139
    ///arcs of the shortest paths.
140 140
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
141 141
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
142 142
    ///Instantiates a \ref PredMap.
143 143

	
144 144
    ///This function instantiates a \ref PredMap.
145 145
    ///\param g is the digraph, to which we would like to define the
146 146
    ///\ref PredMap.
147
    ///\todo The digraph alone may be insufficient for the initialization
148 147
    static PredMap *createPredMap(const Digraph &g)
149 148
    {
150 149
      return new PredMap(g);
151 150
    }
152 151

	
153 152
    ///The type of the map that indicates which nodes are processed.
154 153

	
155 154
    ///The type of the map that indicates which nodes are processed.
156 155
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
157 156
    ///By default it is a NullMap.
158
    ///\todo If it is set to a real map,
159
    ///Dijkstra::processed() should read this.
160 157
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
161 158
    ///Instantiates a \ref ProcessedMap.
162 159

	
163 160
    ///This function instantiates a \ref ProcessedMap.
164 161
    ///\param g is the digraph, to which
165 162
    ///we would like to define the \ref ProcessedMap
166 163
#ifdef DOXYGEN
167 164
    static ProcessedMap *createProcessedMap(const Digraph &g)
168 165
#else
169 166
    static ProcessedMap *createProcessedMap(const Digraph &)
170 167
#endif
171 168
    {
172 169
      return new ProcessedMap();
173 170
    }
174 171

	
175 172
    ///The type of the map that stores the distances of the nodes.
176 173

	
177 174
    ///The type of the map that stores the distances of the nodes.
178 175
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
179 176
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
180 177
    ///Instantiates a \ref DistMap.
181 178

	
182 179
    ///This function instantiates a \ref DistMap.
183 180
    ///\param g is the digraph, to which we would like to define
184 181
    ///the \ref DistMap
185 182
    static DistMap *createDistMap(const Digraph &g)
186 183
    {
187 184
      return new DistMap(g);
188 185
    }
189 186
  };
190 187

	
191 188
  ///%Dijkstra algorithm class.
... ...
@@ -268,66 +265,65 @@
268 265
  private:
269 266

	
270 267
    typedef typename Digraph::Node Node;
271 268
    typedef typename Digraph::NodeIt NodeIt;
272 269
    typedef typename Digraph::Arc Arc;
273 270
    typedef typename Digraph::OutArcIt OutArcIt;
274 271

	
275 272
    //Pointer to the underlying digraph.
276 273
    const Digraph *G;
277 274
    //Pointer to the length map.
278 275
    const LengthMap *length;
279 276
    //Pointer to the map of predecessors arcs.
280 277
    PredMap *_pred;
281 278
    //Indicates if _pred is locally allocated (true) or not.
282 279
    bool local_pred;
283 280
    //Pointer to the map of distances.
284 281
    DistMap *_dist;
285 282
    //Indicates if _dist is locally allocated (true) or not.
286 283
    bool local_dist;
287 284
    //Pointer to the map of processed status of the nodes.
288 285
    ProcessedMap *_processed;
289 286
    //Indicates if _processed is locally allocated (true) or not.
290 287
    bool local_processed;
291 288
    //Pointer to the heap cross references.
292 289
    HeapCrossRef *_heap_cross_ref;
293 290
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
294 291
    bool local_heap_cross_ref;
295 292
    //Pointer to the heap.
296 293
    Heap *_heap;
297 294
    //Indicates if _heap is locally allocated (true) or not.
298 295
    bool local_heap;
299 296

	
300
    ///Creates the maps if necessary.
301
    ///\todo Better memory allocation (instead of new).
297
    //Creates the maps if necessary.
302 298
    void create_maps()
303 299
    {
304 300
      if(!_pred) {
305 301
        local_pred = true;
306 302
        _pred = Traits::createPredMap(*G);
307 303
      }
308 304
      if(!_dist) {
309 305
        local_dist = true;
310 306
        _dist = Traits::createDistMap(*G);
311 307
      }
312 308
      if(!_processed) {
313 309
        local_processed = true;
314 310
        _processed = Traits::createProcessedMap(*G);
315 311
      }
316 312
      if (!_heap_cross_ref) {
317 313
        local_heap_cross_ref = true;
318 314
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
319 315
      }
320 316
      if (!_heap) {
321 317
        local_heap = true;
322 318
        _heap = Traits::createHeap(*_heap_cross_ref);
323 319
      }
324 320
    }
325 321

	
326 322
  public:
327 323

	
328 324
    typedef Dijkstra Create;
329 325

	
330 326
    ///\name Named template parameters
331 327

	
332 328
    ///@{
333 329

	
... ...
@@ -929,160 +925,154 @@
929 925
  ///Default traits class of dijkstra() function.
930 926
  ///\tparam GR The type of the digraph.
931 927
  ///\tparam LM The type of the length map.
932 928
  template<class GR, class LM>
933 929
  struct DijkstraWizardDefaultTraits
934 930
  {
935 931
    ///The type of the digraph the algorithm runs on.
936 932
    typedef GR Digraph;
937 933
    ///The type of the map that stores the arc lengths.
938 934

	
939 935
    ///The type of the map that stores the arc lengths.
940 936
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
941 937
    typedef LM LengthMap;
942 938
    ///The type of the length of the arcs.
943 939
    typedef typename LM::Value Value;
944 940

	
945 941
    /// Operation traits for Dijkstra algorithm.
946 942

	
947 943
    /// This class defines the operations that are used in the algorithm.
948 944
    /// \see DijkstraDefaultOperationTraits
949 945
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
950 946

	
951 947
    /// The cross reference type used by the heap.
952 948

	
953 949
    /// The cross reference type used by the heap.
954 950
    /// Usually it is \c Digraph::NodeMap<int>.
955 951
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
956 952
    ///Instantiates a \ref HeapCrossRef.
957 953

	
958 954
    ///This function instantiates a \ref HeapCrossRef.
959 955
    /// \param g is the digraph, to which we would like to define the
960 956
    /// HeapCrossRef.
961
    /// \todo The digraph alone may be insufficient for the initialization
962 957
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
963 958
    {
964 959
      return new HeapCrossRef(g);
965 960
    }
966 961

	
967 962
    ///The heap type used by the Dijkstra algorithm.
968 963

	
969 964
    ///The heap type used by the Dijkstra algorithm.
970 965
    ///
971 966
    ///\sa BinHeap
972 967
    ///\sa Dijkstra
973 968
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
974 969
                    std::less<Value> > Heap;
975 970

	
976 971
    ///Instantiates a \ref Heap.
977 972

	
978 973
    ///This function instantiates a \ref Heap.
979 974
    /// \param r is the HeapCrossRef which is used.
980 975
    static Heap *createHeap(HeapCrossRef& r)
981 976
    {
982 977
      return new Heap(r);
983 978
    }
984 979

	
985 980
    ///\brief The type of the map that stores the predecessor
986 981
    ///arcs of the shortest paths.
987 982
    ///
988 983
    ///The type of the map that stores the predecessor
989 984
    ///arcs of the shortest paths.
990 985
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
991 986
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
992 987
    ///Instantiates a \ref PredMap.
993 988

	
994 989
    ///This function instantiates a \ref PredMap.
995 990
    ///\param g is the digraph, to which we would like to define the
996 991
    ///\ref PredMap.
997
    ///\todo The digraph alone may be insufficient to initialize
998 992
    static PredMap *createPredMap(const Digraph &g)
999 993
    {
1000 994
      return new PredMap(g);
1001 995
    }
1002 996

	
1003 997
    ///The type of the map that indicates which nodes are processed.
1004 998

	
1005 999
    ///The type of the map that indicates which nodes are processed.
1006 1000
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1007 1001
    ///By default it is a NullMap.
1008
    ///\todo If it is set to a real map,
1009
    ///Dijkstra::processed() should read this.
1010
    ///\todo named parameter to set this type, function to read and write.
1011 1002
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1012 1003
    ///Instantiates a \ref ProcessedMap.
1013 1004

	
1014 1005
    ///This function instantiates a \ref ProcessedMap.
1015 1006
    ///\param g is the digraph, to which
1016 1007
    ///we would like to define the \ref ProcessedMap.
1017 1008
#ifdef DOXYGEN
1018 1009
    static ProcessedMap *createProcessedMap(const Digraph &g)
1019 1010
#else
1020 1011
    static ProcessedMap *createProcessedMap(const Digraph &)
1021 1012
#endif
1022 1013
    {
1023 1014
      return new ProcessedMap();
1024 1015
    }
1025 1016

	
1026 1017
    ///The type of the map that stores the distances of the nodes.
1027 1018

	
1028 1019
    ///The type of the map that stores the distances of the nodes.
1029 1020
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1030 1021
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
1031 1022
    ///Instantiates a \ref DistMap.
1032 1023

	
1033 1024
    ///This function instantiates a \ref DistMap.
1034 1025
    ///\param g is the digraph, to which we would like to define
1035 1026
    ///the \ref DistMap
1036 1027
    static DistMap *createDistMap(const Digraph &g)
1037 1028
    {
1038 1029
      return new DistMap(g);
1039 1030
    }
1040 1031

	
1041 1032
    ///The type of the shortest paths.
1042 1033

	
1043 1034
    ///The type of the shortest paths.
1044 1035
    ///It must meet the \ref concepts::Path "Path" concept.
1045 1036
    typedef lemon::Path<Digraph> Path;
1046 1037
  };
1047 1038

	
1048 1039
  /// Default traits class used by \ref DijkstraWizard
1049 1040

	
1050 1041
  /// To make it easier to use Dijkstra algorithm
1051 1042
  /// we have created a wizard class.
1052 1043
  /// This \ref DijkstraWizard class needs default traits,
1053 1044
  /// as well as the \ref Dijkstra class.
1054 1045
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1055 1046
  /// \ref DijkstraWizard class.
1056
  /// \todo More named parameters are required...
1057 1047
  template<class GR,class LM>
1058 1048
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
1059 1049
  {
1060 1050
    typedef DijkstraWizardDefaultTraits<GR,LM> Base;
1061 1051
  protected:
1062 1052
    //The type of the nodes in the digraph.
1063 1053
    typedef typename Base::Digraph::Node Node;
1064 1054

	
1065 1055
    //Pointer to the digraph the algorithm runs on.
1066 1056
    void *_g;
1067 1057
    //Pointer to the length map.
1068 1058
    void *_length;
1069 1059
    //Pointer to the map of processed nodes.
1070 1060
    void *_processed;
1071 1061
    //Pointer to the map of predecessors arcs.
1072 1062
    void *_pred;
1073 1063
    //Pointer to the map of distances.
1074 1064
    void *_dist;
1075 1065
    //Pointer to the shortest path to the target node.
1076 1066
    void *_path;
1077 1067
    //Pointer to the distance of the target node.
1078 1068
    void *_di;
1079 1069

	
1080 1070
  public:
1081 1071
    /// Constructor.
1082 1072

	
1083 1073
    /// This constructor does not require parameters, therefore it initiates
1084 1074
    /// all of the attributes to \c 0.
1085 1075
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1086 1076
                           _dist(0), _path(0), _di(0) {}
1087 1077

	
1088 1078
    /// Constructor.
Ignore white space 6 line context
... ...
@@ -73,66 +73,64 @@
73 73
        *ptr = copy.get();
74 74
      } catch (...) {}
75 75
    }
76 76

	
77 77
    void set(const Type& type) throw() {
78 78
      if (ptr.get() == 0) return;
79 79
      try {
80 80
        *ptr = type;
81 81
      } catch (...) {}
82 82
    }
83 83

	
84 84
    const Type& get() const {
85 85
      return *ptr;
86 86
    }
87 87

	
88 88
    bool valid() const throw() {
89 89
      return ptr.get() != 0;
90 90
    }
91 91

	
92 92
  private:
93 93
    std::auto_ptr<_Type> ptr;
94 94
  };
95 95

	
96 96
  /// Exception-safe convenient error message builder class.
97 97

	
98 98
  /// Helper class which provides a convenient ostream-like (operator <<
99 99
  /// based) interface to create a string message. Mostly useful in
100 100
  /// exception classes (therefore the name).
101 101
  class ErrorMessage {
102 102
  protected:
103 103
    ///\e
104 104

	
105
    ///\todo The good solution is boost::shared_ptr...
106
    ///
107 105
    mutable std::auto_ptr<std::ostringstream> buf;
108 106

	
109 107
    ///\e
110 108
    bool init() throw() {
111 109
      try {
112 110
        buf.reset(new std::ostringstream);
113 111
      }
114 112
      catch(...) {
115 113
        buf.reset();
116 114
      }
117 115
      return buf.get();
118 116
    }
119 117

	
120 118
  public:
121 119

	
122 120
    ///\e
123 121
    ErrorMessage() throw() { init(); }
124 122

	
125 123
    ErrorMessage(const ErrorMessage& em) throw() : buf(em.buf) { }
126 124

	
127 125
    ///\e
128 126
    ErrorMessage(const char *msg) throw() {
129 127
      init();
130 128
      *this << msg;
131 129
    }
132 130

	
133 131
    ///\e
134 132
    ErrorMessage(const std::string &msg) throw() {
135 133
      init();
136 134
      *this << msg;
137 135
    }
138 136

	
Ignore white space 6 line context
... ...
@@ -637,116 +637,113 @@
637 637

	
638 638
  ///Sets the copyright statement of the generated image,
639 639
  ///namely it inserts a <tt>%%Copyright:</tt> DSC field to the header of
640 640
  ///the EPS file.
641 641
  GraphToEps<T> &copyright(const std::string &t) {_copyright=t;return *this;}
642 642

	
643 643
protected:
644 644
  bool isInsideNode(dim2::Point<double> p, double r,int t)
645 645
  {
646 646
    switch(t) {
647 647
    case CIRCLE:
648 648
    case MALE:
649 649
    case FEMALE:
650 650
      return p.normSquare()<=r*r;
651 651
    case SQUARE:
652 652
      return p.x<=r&&p.x>=-r&&p.y<=r&&p.y>=-r;
653 653
    case DIAMOND:
654 654
      return p.x+p.y<=r && p.x-p.y<=r && -p.x+p.y<=r && -p.x-p.y<=r;
655 655
    }
656 656
    return false;
657 657
  }
658 658

	
659 659
public:
660 660
  ~GraphToEps() { }
661 661

	
662 662
  ///Draws the graph.
663 663

	
664 664
  ///Like other functions using
665 665
  ///\ref named-templ-func-param "named template parameters",
666 666
  ///this function calls the algorithm itself, i.e. in this case
667 667
  ///it draws the graph.
668 668
  void run() {
669
    //\todo better 'epsilon' would be nice here.
670 669
    const double EPSILON=1e-9;
671 670
    if(dontPrint) return;
672 671

	
673 672
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
674 673
      mycoords(_coords,_negY);
675 674

	
676 675
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
677 676
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
678 677
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
679 678
    os << "%%Creator: LEMON, graphToEps()\n";
680 679

	
681 680
    {
682 681
#ifndef WIN32
683 682
      timeval tv;
684 683
      gettimeofday(&tv, 0);
685 684

	
686 685
      char cbuf[26];
687 686
      ctime_r(&tv.tv_sec,cbuf);
688 687
      os << "%%CreationDate: " << cbuf;
689 688
#else
690 689
      SYSTEMTIME time;
691 690
      char buf1[11], buf2[9], buf3[5];
692 691

	
693 692
      GetSystemTime(&time);
694 693
      if (GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
695 694
                        "ddd MMM dd", buf1, 11) &&
696 695
          GetTimeFormat(LOCALE_USER_DEFAULT, 0, &time,
697 696
                        "HH':'mm':'ss", buf2, 9) &&
698 697
          GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
699 698
                                "yyyy", buf3, 5)) {
700 699
        os << "%%CreationDate: " << buf1 << ' '
701 700
           << buf2 << ' ' << buf3 << std::endl;
702 701
      }
703 702
#endif
704 703
    }
705 704

	
706 705
    if (_autoArcWidthScale) {
707 706
      double max_w=0;
708 707
      for(ArcIt e(g);e!=INVALID;++e)
709 708
        max_w=std::max(double(_arcWidths[e]),max_w);
710
      //\todo better 'epsilon' would be nice here.
711 709
      if(max_w>EPSILON) {
712 710
        _arcWidthScale/=max_w;
713 711
      }
714 712
    }
715 713

	
716 714
    if (_autoNodeScale) {
717 715
      double max_s=0;
718 716
      for(NodeIt n(g);n!=INVALID;++n)
719 717
        max_s=std::max(double(_nodeSizes[n]),max_s);
720
      //\todo better 'epsilon' would be nice here.
721 718
      if(max_s>EPSILON) {
722 719
        _nodeScale/=max_s;
723 720
      }
724 721
    }
725 722

	
726 723
    double diag_len = 1;
727 724
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
728 725
      dim2::Box<double> bb;
729 726
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
730 727
      if (bb.empty()) {
731 728
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
732 729
      }
733 730
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
734 731
      if(diag_len<EPSILON) diag_len = 1;
735 732
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
736 733
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
737 734
    }
738 735

	
739 736
    dim2::Box<double> bb;
740 737
    for(NodeIt n(g);n!=INVALID;++n) {
741 738
      double ns=_nodeSizes[n]*_nodeScale;
742 739
      dim2::Point<double> p(ns,ns);
743 740
      switch(_nodeShapes[n]) {
744 741
      case CIRCLE:
745 742
      case SQUARE:
746 743
      case DIAMOND:
747 744
        bb.add(p+mycoords[n]);
748 745
        bb.add(-p+mycoords[n]);
749 746
        break;
750 747
      case MALE:
751 748
        bb.add(-p+mycoords[n]);
752 749
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
... ...
@@ -844,98 +841,96 @@
844 841
    // l dx_norm dy_norm
845 842
    os << "/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def\n";
846 843
    //len w dx_norm dy_norm x1 y1 cr cg cb
847 844
    os << "/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx "
848 845
       << "exch def\n"
849 846
       << "       /w exch def /len exch def\n"
850 847
      //<< "0.1 setlinewidth x1 y1 moveto dx len mul dy len mul rlineto stroke"
851 848
       << "       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto\n"
852 849
       << "       len w sub arrl sub dx dy lrl\n"
853 850
       << "       arrw dy dx neg lrl\n"
854 851
       << "       dx arrl w add mul dy w 2 div arrw add mul sub\n"
855 852
       << "       dy arrl w add mul dx w 2 div arrw add mul add rlineto\n"
856 853
       << "       dx arrl w add mul neg dy w 2 div arrw add mul sub\n"
857 854
       << "       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto\n"
858 855
       << "       arrw dy dx neg lrl\n"
859 856
       << "       len w sub arrl sub neg dx dy lrl\n"
860 857
       << "       closepath fill } bind def\n";
861 858
    os << "/cshow { 2 index 2 index moveto dup stringwidth pop\n"
862 859
       << "         neg 2 div fosi .35 mul neg rmoveto show pop pop} def\n";
863 860

	
864 861
    os << "\ngsave\n";
865 862
    if(_scaleToA4)
866 863
      if(bb.height()>bb.width()) {
867 864
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.height(),
868 865
                  (A4WIDTH-2*A4BORDER)/bb.width());
869 866
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.width())/2 + A4BORDER << ' '
870 867
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.height())/2 + A4BORDER
871 868
           << " translate\n"
872 869
           << sc << " dup scale\n"
873 870
           << -bb.left() << ' ' << -bb.bottom() << " translate\n";
874 871
      }
875 872
      else {
876
        //\todo Verify centering
877 873
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.width(),
878 874
                  (A4WIDTH-2*A4BORDER)/bb.height());
879 875
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.height())/2 + A4BORDER << ' '
880 876
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.width())/2 + A4BORDER
881 877
           << " translate\n"
882 878
           << sc << " dup scale\n90 rotate\n"
883 879
           << -bb.left() << ' ' << -bb.top() << " translate\n";
884 880
        }
885 881
    else if(_scale!=1.0) os << _scale << " dup scale\n";
886 882

	
887 883
    if(_showArcs) {
888 884
      os << "%Arcs:\ngsave\n";
889 885
      if(_enableParallel) {
890 886
        std::vector<Arc> el;
891 887
        for(ArcIt e(g);e!=INVALID;++e)
892 888
          if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
893 889
             &&g.source(e)!=g.target(e))
894 890
            el.push_back(e);
895 891
        std::sort(el.begin(),el.end(),arcLess(g));
896 892

	
897 893
        typename std::vector<Arc>::iterator j;
898 894
        for(typename std::vector<Arc>::iterator i=el.begin();i!=el.end();i=j) {
899 895
          for(j=i+1;j!=el.end()&&isParallel(*i,*j);++j) ;
900 896

	
901 897
          double sw=0;
902 898
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e)
903 899
            sw+=_arcWidths[*e]*_arcWidthScale+_parArcDist;
904 900
          sw-=_parArcDist;
905 901
          sw/=-2.0;
906 902
          dim2::Point<double>
907 903
            dvec(mycoords[g.target(*i)]-mycoords[g.source(*i)]);
908 904
          double l=std::sqrt(dvec.normSquare());
909
          //\todo better 'epsilon' would be nice here.
910 905
          dim2::Point<double> d(dvec/std::max(l,EPSILON));
911 906
          dim2::Point<double> m;
912 907
//           m=dim2::Point<double>(mycoords[g.target(*i)]+
913 908
//                                 mycoords[g.source(*i)])/2.0;
914 909

	
915 910
//            m=dim2::Point<double>(mycoords[g.source(*i)])+
916 911
//             dvec*(double(_nodeSizes[g.source(*i)])/
917 912
//                (_nodeSizes[g.source(*i)]+_nodeSizes[g.target(*i)]));
918 913

	
919 914
          m=dim2::Point<double>(mycoords[g.source(*i)])+
920 915
            d*(l+_nodeSizes[g.source(*i)]-_nodeSizes[g.target(*i)])/2.0;
921 916

	
922 917
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e) {
923 918
            sw+=_arcWidths[*e]*_arcWidthScale/2.0;
924 919
            dim2::Point<double> mm=m+rot90(d)*sw/.75;
925 920
            if(_drawArrows) {
926 921
              int node_shape;
927 922
              dim2::Point<double> s=mycoords[g.source(*e)];
928 923
              dim2::Point<double> t=mycoords[g.target(*e)];
929 924
              double rn=_nodeSizes[g.target(*e)]*_nodeScale;
930 925
              node_shape=_nodeShapes[g.target(*e)];
931 926
              dim2::Bezier3 bez(s,mm,mm,t);
932 927
              double t1=0,t2=1;
933 928
              for(int ii=0;ii<INTERPOL_PREC;++ii)
934 929
                if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape)) t2=(t1+t2)/2;
935 930
                else t1=(t1+t2)/2;
936 931
              dim2::Point<double> apoint=bez((t1+t2)/2);
937 932
              rn = _arrowLength+_arcWidths[*e]*_arcWidthScale;
938 933
              rn*=rn;
939 934
              t2=(t1+t2)/2;t1=0;
940 935
              for(int ii=0;ii<INTERPOL_PREC;++ii)
941 936
                if((bez((t1+t2)/2)-apoint).normSquare()>rn) t1=(t1+t2)/2;
Ignore white space 6 line context
... ...
@@ -472,68 +472,66 @@
472 472
    ///feature.
473 473
    void contract(Node a, Node b, bool r = true)
474 474
    {
475 475
      for(OutArcIt e(*this,b);e!=INVALID;) {
476 476
        OutArcIt f=e;
477 477
        ++f;
478 478
        if(r && target(e)==a) erase(e);
479 479
        else changeSource(e,a);
480 480
        e=f;
481 481
      }
482 482
      for(InArcIt e(*this,b);e!=INVALID;) {
483 483
        InArcIt f=e;
484 484
        ++f;
485 485
        if(r && source(e)==a) erase(e);
486 486
        else changeTarget(e,a);
487 487
        e=f;
488 488
      }
489 489
      erase(b);
490 490
    }
491 491

	
492 492
    ///Split a node.
493 493

	
494 494
    ///This function splits a node. First a new node is added to the digraph,
495 495
    ///then the source of each outgoing arc of \c n is moved to this new node.
496 496
    ///If \c connect is \c true (this is the default value), then a new arc
497 497
    ///from \c n to the newly created node is also added.
498 498
    ///\return The newly created node.
499 499
    ///
500 500
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
501 501
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s may
502 502
    ///be invalidated.
503 503
    ///
504
    ///\warning This functionality cannot be used together with the
504
    ///\warning This functionality cannot be used in conjunction with the
505 505
    ///Snapshot feature.
506
    ///
507
    ///\todo It could be implemented in a bit faster way.
508 506
    Node split(Node n, bool connect = true) {
509 507
      Node b = addNode();
510 508
      for(OutArcIt e(*this,n);e!=INVALID;) {
511 509
        OutArcIt f=e;
512 510
        ++f;
513 511
        changeSource(e,b);
514 512
        e=f;
515 513
      }
516 514
      if (connect) addArc(n,b);
517 515
      return b;
518 516
    }
519 517

	
520 518
    ///Split an arc.
521 519

	
522 520
    ///This function splits an arc. First a new node \c b is added to
523 521
    ///the digraph, then the original arc is re-targeted to \c
524 522
    ///b. Finally an arc from \c b to the original target is added.
525 523
    ///
526 524
    ///\return The newly created node.
527 525
    ///
528 526
    ///\warning This functionality cannot be used together with the
529 527
    ///Snapshot feature.
530 528
    Node split(Arc e) {
531 529
      Node b = addNode();
532 530
      addArc(b,target(e));
533 531
      changeTarget(e,b);
534 532
      return b;
535 533
    }
536 534

	
537 535
    /// \brief Class to make a snapshot of the digraph and restore
538 536
    /// it later.
539 537
    ///
Ignore white space 64 line context
... ...
@@ -455,122 +455,118 @@
455 455
  /// appropriate \c std::map.
456 456
  /// \relates SparseMap
457 457
  template<typename K, typename V, typename Compare>
458 458
  inline SparseMap<K, V, Compare>
459 459
    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
460 460
  {
461 461
    return SparseMap<K, V, Compare>(map, value);
462 462
  }
463 463

	
464 464
  /// @}
465 465

	
466 466
  /// \addtogroup map_adaptors
467 467
  /// @{
468 468

	
469 469
  /// Composition of two maps
470 470

	
471 471
  /// This \ref concepts::ReadMap "read-only map" returns the
472 472
  /// composition of two given maps. That is to say, if \c m1 is of
473 473
  /// type \c M1 and \c m2 is of \c M2, then for
474 474
  /// \code
475 475
  ///   ComposeMap<M1, M2> cm(m1,m2);
476 476
  /// \endcode
477 477
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
478 478
  ///
479 479
  /// The \c Key type of the map is inherited from \c M2 and the
480 480
  /// \c Value type is from \c M1.
481 481
  /// \c M2::Value must be convertible to \c M1::Key.
482 482
  ///
483 483
  /// The simplest way of using this map is through the composeMap()
484 484
  /// function.
485 485
  ///
486 486
  /// \sa CombineMap
487
  ///
488
  /// \todo Check the requirements.
489 487
  template <typename M1, typename M2>
490 488
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
491 489
    const M1 &_m1;
492 490
    const M2 &_m2;
493 491
  public:
494 492
    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
495 493
    typedef typename Parent::Key Key;
496 494
    typedef typename Parent::Value Value;
497 495

	
498 496
    /// Constructor
499 497
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
500 498

	
501 499
    /// \e
502 500
    typename MapTraits<M1>::ConstReturnValue
503 501
    operator[](const Key &k) const { return _m1[_m2[k]]; }
504 502
  };
505 503

	
506 504
  /// Returns a \ref ComposeMap class
507 505

	
508 506
  /// This function just returns a \ref ComposeMap class.
509 507
  ///
510 508
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
511 509
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
512 510
  /// will be equal to <tt>m1[m2[x]]</tt>.
513 511
  ///
514 512
  /// \relates ComposeMap
515 513
  template <typename M1, typename M2>
516 514
  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
517 515
    return ComposeMap<M1, M2>(m1, m2);
518 516
  }
519 517

	
520 518

	
521 519
  /// Combination of two maps using an STL (binary) functor.
522 520

	
523 521
  /// This \ref concepts::ReadMap "read-only map" takes two maps and a
524 522
  /// binary functor and returns the combination of the two given maps
525 523
  /// using the functor.
526 524
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
527 525
  /// and \c f is of \c F, then for
528 526
  /// \code
529 527
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
530 528
  /// \endcode
531 529
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
532 530
  ///
533 531
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
534 532
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
535 533
  /// \c M2::Value and \c M1::Value must be convertible to the
536 534
  /// corresponding input parameter of \c F and the return type of \c F
537 535
  /// must be convertible to \c V.
538 536
  ///
539 537
  /// The simplest way of using this map is through the combineMap()
540 538
  /// function.
541 539
  ///
542 540
  /// \sa ComposeMap
543
  ///
544
  /// \todo Check the requirements.
545 541
  template<typename M1, typename M2, typename F,
546 542
           typename V = typename F::result_type>
547 543
  class CombineMap : public MapBase<typename M1::Key, V> {
548 544
    const M1 &_m1;
549 545
    const M2 &_m2;
550 546
    F _f;
551 547
  public:
552 548
    typedef MapBase<typename M1::Key, V> Parent;
553 549
    typedef typename Parent::Key Key;
554 550
    typedef typename Parent::Value Value;
555 551

	
556 552
    /// Constructor
557 553
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
558 554
      : _m1(m1), _m2(m2), _f(f) {}
559 555
    /// \e
560 556
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
561 557
  };
562 558

	
563 559
  /// Returns a \ref CombineMap class
564 560

	
565 561
  /// This function just returns a \ref CombineMap class.
566 562
  ///
567 563
  /// For example, if \c m1 and \c m2 are both maps with \c double
568 564
  /// values, then
569 565
  /// \code
570 566
  ///   combineMap(m1,m2,std::plus<double>())
571 567
  /// \endcode
572 568
  /// is equivalent to
573 569
  /// \code
574 570
  ///   addMap(m1,m2)
575 571
  /// \endcode
576 572
  ///
Ignore white space 6 line context
... ...
@@ -792,65 +792,64 @@
792 792
    int integer() {
793 793
      return integer<int>();
794 794
    }
795 795

	
796 796
    /// \brief Returns a random bool
797 797
    ///
798 798
    /// It returns a random bool. The generator holds a buffer for
799 799
    /// random bits. Every time when it become empty the generator makes
800 800
    /// a new random word and fill the buffer up.
801 801
    bool boolean() {
802 802
      return bool_producer.convert(core);
803 803
    }
804 804

	
805 805
    /// @}
806 806

	
807 807
    ///\name Non-uniform distributions
808 808
    ///
809 809

	
810 810
    ///@{
811 811

	
812 812
    /// \brief Returns a random bool
813 813
    ///
814 814
    /// It returns a random bool with given probability of true result.
815 815
    bool boolean(double p) {
816 816
      return operator()() < p;
817 817
    }
818 818

	
819 819
    /// Standard Gauss distribution
820 820

	
821 821
    /// Standard Gauss distribution.
822 822
    /// \note The Cartesian form of the Box-Muller
823 823
    /// transformation is used to generate a random normal distribution.
824
    /// \todo Consider using the "ziggurat" method instead.
825 824
    double gauss()
826 825
    {
827 826
      double V1,V2,S;
828 827
      do {
829 828
        V1=2*real<double>()-1;
830 829
        V2=2*real<double>()-1;
831 830
        S=V1*V1+V2*V2;
832 831
      } while(S>=1);
833 832
      return std::sqrt(-2*std::log(S)/S)*V1;
834 833
    }
835 834
    /// Gauss distribution with given mean and standard deviation
836 835

	
837 836
    /// Gauss distribution with given mean and standard deviation.
838 837
    /// \sa gauss()
839 838
    double gauss(double mean,double std_dev)
840 839
    {
841 840
      return gauss()*std_dev+mean;
842 841
    }
843 842

	
844 843
    /// Exponential distribution with given mean
845 844

	
846 845
    /// This function generates an exponential distribution random number
847 846
    /// with mean <tt>1/lambda</tt>.
848 847
    ///
849 848
    double exponential(double lambda=1.0)
850 849
    {
851 850
      return -std::log(1.0-real<double>())/lambda;
852 851
    }
853 852

	
854 853
    /// Gamma distribution with given integer shape
855 854

	
856 855
    /// This function generates a gamma distribution random number.
Ignore white space 6 line context
... ...
@@ -271,65 +271,64 @@
271 271

	
272 272
    /// \brief Arc validity check
273 273
    ///
274 274
    /// This function gives back true if the given arc is valid,
275 275
    /// ie. it is a real arc of the graph.
276 276
    ///
277 277
    /// \warning A removed arc (using Snapshot) could become valid again
278 278
    /// when new arcs are added to the graph.
279 279
    bool valid(Arc a) const { return Parent::valid(a); }
280 280

	
281 281
    ///Clear the digraph.
282 282

	
283 283
    ///Erase all the nodes and arcs from the digraph.
284 284
    ///
285 285
    void clear() {
286 286
      Parent::clear();
287 287
    }
288 288

	
289 289
    ///Split a node.
290 290

	
291 291
    ///This function splits a node. First a new node is added to the digraph,
292 292
    ///then the source of each outgoing arc of \c n is moved to this new node.
293 293
    ///If \c connect is \c true (this is the default value), then a new arc
294 294
    ///from \c n to the newly created node is also added.
295 295
    ///\return The newly created node.
296 296
    ///
297 297
    ///\note The <tt>Arc</tt>s
298 298
    ///referencing a moved arc remain
299 299
    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
300 300
    ///may be invalidated.
301 301
    ///\warning This functionality cannot be used together with the Snapshot
302 302
    ///feature.
303
    ///\todo It could be implemented in a bit faster way.
304 303
    Node split(Node n, bool connect = true)
305 304
    {
306 305
      Node b = addNode();
307 306
      nodes[b._id].first_out=nodes[n._id].first_out;
308 307
      nodes[n._id].first_out=-1;
309 308
      for(int i=nodes[b._id].first_out;i!=-1;i++) arcs[i].source=b._id;
310 309
      if(connect) addArc(n,b);
311 310
      return b;
312 311
    }
313 312

	
314 313
  public:
315 314

	
316 315
    class Snapshot;
317 316

	
318 317
  protected:
319 318

	
320 319
    void restoreSnapshot(const Snapshot &s)
321 320
    {
322 321
      while(s.arc_num<arcs.size()) {
323 322
        Arc arc = arcFromId(arcs.size()-1);
324 323
        Parent::notifier(Arc()).erase(arc);
325 324
        nodes[arcs.back().source].first_out=arcs.back().next_out;
326 325
        nodes[arcs.back().target].first_in=arcs.back().next_in;
327 326
        arcs.pop_back();
328 327
      }
329 328
      while(s.node_num<nodes.size()) {
330 329
        Node node = nodeFromId(nodes.size()-1);
331 330
        Parent::notifier(Node()).erase(node);
332 331
        nodes.pop_back();
333 332
      }
334 333
    }
335 334

	
Ignore white space 6 line context
... ...
@@ -263,65 +263,64 @@
263 263
  ///
264 264
  /// int main()
265 265
  /// {
266 266
  ///
267 267
  ///   ...
268 268
  ///
269 269
  ///   Timer t;
270 270
  ///   doSomething();
271 271
  ///   std::cout << t << '\n';
272 272
  ///   t.restart();
273 273
  ///   doSomethingElse();
274 274
  ///   std::cout << t << '\n';
275 275
  ///
276 276
  ///   ...
277 277
  ///
278 278
  /// }
279 279
  ///\endcode
280 280
  ///
281 281
  ///The \ref Timer can also be \ref stop() "stopped" and
282 282
  ///\ref start() "started" again, so it is possible to compute collected
283 283
  ///running times.
284 284
  ///
285 285
  ///\warning Depending on the operation system and its actual configuration
286 286
  ///the time counters have a certain (10ms on a typical Linux system)
287 287
  ///granularity.
288 288
  ///Therefore this tool is not appropriate to measure very short times.
289 289
  ///Also, if you start and stop the timer very frequently, it could lead to
290 290
  ///distorted results.
291 291
  ///
292 292
  ///\note If you want to measure the running time of the execution of a certain
293 293
  ///function, consider the usage of \ref TimeReport instead.
294 294
  ///
295
  ///\todo This shouldn't be Unix (Linux) specific.
296 295
  ///\sa TimeReport
297 296
  class Timer
298 297
  {
299 298
    int _running; //Timer is running iff _running>0; (_running>=0 always holds)
300 299
    TimeStamp start_time; //This is the relativ start-time if the timer
301 300
                          //is _running, the collected _running time otherwise.
302 301

	
303 302
    void _reset() {if(_running) start_time.stamp(); else start_time.reset();}
304 303

	
305 304
  public:
306 305
    ///Constructor.
307 306

	
308 307
    ///\param run indicates whether or not the timer starts immediately.
309 308
    ///
310 309
    Timer(bool run=true) :_running(run) {_reset();}
311 310

	
312 311
    ///\name Control the state of the timer
313 312
    ///Basically a Timer can be either running or stopped,
314 313
    ///but it provides a bit finer control on the execution.
315 314
    ///The \ref Timer also counts the number of \ref start()
316 315
    ///executions, and is stops only after the same amount (or more)
317 316
    ///\ref stop() "stop()"s. This can be useful e.g. to compute
318 317
    ///the running time
319 318
    ///of recursive functions.
320 319
    ///
321 320

	
322 321
    ///@{
323 322

	
324 323
    ///Reset and stop the time counters
325 324

	
326 325
    ///This function resets and stops the time counters
327 326
    ///\sa restart()
... ...
@@ -458,65 +457,64 @@
458 457
    ///This conversion computes the ellapsed time, therefore you can print
459 458
    ///the ellapsed time like this.
460 459
    ///\code
461 460
    ///  Timer t;
462 461
    ///  doSomething();
463 462
    ///  std::cout << t << '\n';
464 463
    ///\endcode
465 464
    operator TimeStamp () const
466 465
    {
467 466
      TimeStamp t;
468 467
      t.stamp();
469 468
      return _running?t-start_time:start_time;
470 469
    }
471 470

	
472 471

	
473 472
    ///@}
474 473
  };
475 474

	
476 475
  ///Same as \ref Timer but prints a report on destruction.
477 476

	
478 477
  ///Same as \ref Timer but prints a report on destruction.
479 478
  ///This example shows its usage.
480 479
  ///\code
481 480
  ///  void myAlg(ListGraph &g,int n)
482 481
  ///  {
483 482
  ///    TimeReport tr("Running time of myAlg: ");
484 483
  ///    ... //Here comes the algorithm
485 484
  ///  }
486 485
  ///\endcode
487 486
  ///
488 487
  ///\sa Timer
489 488
  ///\sa NoTimeReport
490
  ///\todo There is no test case for this
491 489
  class TimeReport : public Timer
492 490
  {
493 491
    std::string _title;
494 492
    std::ostream &_os;
495 493
  public:
496 494
    ///\e
497 495

	
498 496
    ///\param title This text will be printed before the ellapsed time.
499 497
    ///\param os The stream to print the report to.
500 498
    ///\param run Sets whether the timer should start immediately.
501 499

	
502 500
    TimeReport(std::string title,std::ostream &os=std::cerr,bool run=true)
503 501
      : Timer(run), _title(title), _os(os){}
504 502
    ///\e Prints the ellapsed time on destruction.
505 503
    ~TimeReport()
506 504
    {
507 505
      _os << _title << *this << std::endl;
508 506
    }
509 507
  };
510 508

	
511 509
  ///'Do nothing' version of \ref TimeReport
512 510

	
513 511
  ///\sa TimeReport
514 512
  ///
515 513
  class NoTimeReport
516 514
  {
517 515
  public:
518 516
    ///\e
519 517
    NoTimeReport(std::string,std::ostream &,bool) {}
520 518
    ///\e
521 519
    NoTimeReport(std::string,std::ostream &) {}
522 520
    ///\e
Ignore white space 6 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_TOLERANCE_H
20 20
#define LEMON_TOLERANCE_H
21 21

	
22 22
///\ingroup misc
23 23
///\file
24 24
///\brief A basic tool to handle the anomalies of calculation with
25 25
///floating point numbers.
26 26
///
27
///\todo It should be in a module like "Basic tools"
28

	
29 27

	
30 28
namespace lemon {
31 29

	
32 30
  /// \addtogroup misc
33 31
  /// @{
34 32

	
35 33
  ///\brief A class to provide a basic way to
36 34
  ///handle the comparison of numbers that are obtained
37 35
  ///as a result of a probably inexact computation.
38 36
  ///
39 37
  ///\ref Tolerance is a class to provide a basic way to
40 38
  ///handle the comparison of numbers that are obtained
41 39
  ///as a result of a probably inexact computation.
42 40
  ///
43 41
  ///This is an abstract class, it should be specialized for all
44 42
  ///numerical data types. These specialized classes like
45 43
  ///Tolerance<double> may offer additional tuning parameters.
46 44
  ///
47 45
  ///\sa Tolerance<float>
48 46
  ///\sa Tolerance<double>
49 47
  ///\sa Tolerance<long double>
50 48
  ///\sa Tolerance<int>
51 49
  ///\sa Tolerance<long long int>
52 50
  ///\sa Tolerance<unsigned int>
53 51
  ///\sa Tolerance<unsigned long long int>
54 52

	
55 53
  template<class T>
56 54
  class Tolerance
57 55
  {
58 56
  public:
59 57
    typedef T Value;
60 58

	
0 comments (0 inline)