gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 7 0
merge default
3 files changed with 139 insertions and 81 deletions:
↑ Collapse diff ↑
Show white space 384 line context
... ...
@@ -1072,384 +1072,389 @@
1072 1072
    ///\brief \ref named-templ-param "Named parameter"
1073 1073
    ///for setting \ref PredMap object.
1074 1074
    ///
1075 1075
    /// \ref named-templ-param "Named parameter"
1076 1076
    ///for setting \ref PredMap object.
1077 1077
    template<class T>
1078 1078
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1079 1079
    {
1080 1080
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1081 1081
      return BfsWizard<SetPredMapBase<T> >(*this);
1082 1082
    }
1083 1083

	
1084 1084
    template<class T>
1085 1085
    struct SetReachedMapBase : public Base {
1086 1086
      typedef T ReachedMap;
1087 1087
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1088 1088
      SetReachedMapBase(const TR &b) : TR(b) {}
1089 1089
    };
1090 1090
    ///\brief \ref named-templ-param "Named parameter"
1091 1091
    ///for setting \ref ReachedMap object.
1092 1092
    ///
1093 1093
    /// \ref named-templ-param "Named parameter"
1094 1094
    ///for setting \ref ReachedMap object.
1095 1095
    template<class T>
1096 1096
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1097 1097
    {
1098 1098
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1099 1099
      return BfsWizard<SetReachedMapBase<T> >(*this);
1100 1100
    }
1101 1101

	
1102 1102
    template<class T>
1103 1103
    struct SetProcessedMapBase : public Base {
1104 1104
      typedef T ProcessedMap;
1105 1105
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1106 1106
      SetProcessedMapBase(const TR &b) : TR(b) {}
1107 1107
    };
1108 1108
    ///\brief \ref named-templ-param "Named parameter"
1109 1109
    ///for setting \ref ProcessedMap object.
1110 1110
    ///
1111 1111
    /// \ref named-templ-param "Named parameter"
1112 1112
    ///for setting \ref ProcessedMap object.
1113 1113
    template<class T>
1114 1114
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1115 1115
    {
1116 1116
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1117 1117
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1118 1118
    }
1119 1119

	
1120 1120
    template<class T>
1121 1121
    struct SetDistMapBase : public Base {
1122 1122
      typedef T DistMap;
1123 1123
      static DistMap *createDistMap(const Digraph &) { return 0; };
1124 1124
      SetDistMapBase(const TR &b) : TR(b) {}
1125 1125
    };
1126 1126
    ///\brief \ref named-templ-param "Named parameter"
1127 1127
    ///for setting \ref DistMap object.
1128 1128
    ///
1129 1129
    /// \ref named-templ-param "Named parameter"
1130 1130
    ///for setting \ref DistMap object.
1131 1131
    template<class T>
1132 1132
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1133 1133
    {
1134 1134
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1135 1135
      return BfsWizard<SetDistMapBase<T> >(*this);
1136 1136
    }
1137 1137

	
1138 1138
  };
1139 1139

	
1140 1140
  ///Function type interface for Bfs algorithm.
1141 1141

	
1142 1142
  /// \ingroup search
1143 1143
  ///Function type interface for Bfs algorithm.
1144 1144
  ///
1145 1145
  ///This function also has several
1146 1146
  ///\ref named-templ-func-param "named parameters",
1147 1147
  ///they are declared as the members of class \ref BfsWizard.
1148 1148
  ///The following
1149 1149
  ///example shows how to use these parameters.
1150 1150
  ///\code
1151 1151
  ///  bfs(g,source).predMap(preds).run();
1152 1152
  ///\endcode
1153 1153
  ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1154 1154
  ///to the end of the parameter list.
1155 1155
  ///\sa BfsWizard
1156 1156
  ///\sa Bfs
1157 1157
  template<class GR>
1158 1158
  BfsWizard<BfsWizardBase<GR> >
1159 1159
  bfs(const GR &g,typename GR::Node s=INVALID)
1160 1160
  {
1161 1161
    return BfsWizard<BfsWizardBase<GR> >(g,s);
1162 1162
  }
1163 1163

	
1164 1164
#ifdef DOXYGEN
1165 1165
  /// \brief Visitor class for BFS.
1166 1166
  ///
1167 1167
  /// This class defines the interface of the BfsVisit events, and
1168 1168
  /// it could be the base of a real visitor class.
1169 1169
  template <typename _Digraph>
1170 1170
  struct BfsVisitor {
1171 1171
    typedef _Digraph Digraph;
1172 1172
    typedef typename Digraph::Arc Arc;
1173 1173
    typedef typename Digraph::Node Node;
1174 1174
    /// \brief Called for the source node(s) of the BFS.
1175 1175
    ///
1176 1176
    /// This function is called for the source node(s) of the BFS.
1177 1177
    void start(const Node& node) {}
1178 1178
    /// \brief Called when a node is reached first time.
1179 1179
    ///
1180 1180
    /// This function is called when a node is reached first time.
1181 1181
    void reach(const Node& node) {}
1182 1182
    /// \brief Called when a node is processed.
1183 1183
    ///
1184 1184
    /// This function is called when a node is processed.
1185 1185
    void process(const Node& node) {}
1186 1186
    /// \brief Called when an arc reaches a new node.
1187 1187
    ///
1188 1188
    /// This function is called when the BFS finds an arc whose target node
1189 1189
    /// is not reached yet.
1190 1190
    void discover(const Arc& arc) {}
1191 1191
    /// \brief Called when an arc is examined but its target node is
1192 1192
    /// already discovered.
1193 1193
    ///
1194 1194
    /// This function is called when an arc is examined but its target node is
1195 1195
    /// already discovered.
1196 1196
    void examine(const Arc& arc) {}
1197 1197
  };
1198 1198
#else
1199 1199
  template <typename _Digraph>
1200 1200
  struct BfsVisitor {
1201 1201
    typedef _Digraph Digraph;
1202 1202
    typedef typename Digraph::Arc Arc;
1203 1203
    typedef typename Digraph::Node Node;
1204 1204
    void start(const Node&) {}
1205 1205
    void reach(const Node&) {}
1206 1206
    void process(const Node&) {}
1207 1207
    void discover(const Arc&) {}
1208 1208
    void examine(const Arc&) {}
1209 1209

	
1210 1210
    template <typename _Visitor>
1211 1211
    struct Constraints {
1212 1212
      void constraints() {
1213 1213
        Arc arc;
1214 1214
        Node node;
1215 1215
        visitor.start(node);
1216 1216
        visitor.reach(node);
1217 1217
        visitor.process(node);
1218 1218
        visitor.discover(arc);
1219 1219
        visitor.examine(arc);
1220 1220
      }
1221 1221
      _Visitor& visitor;
1222 1222
    };
1223 1223
  };
1224 1224
#endif
1225 1225

	
1226 1226
  /// \brief Default traits class of BfsVisit class.
1227 1227
  ///
1228 1228
  /// Default traits class of BfsVisit class.
1229 1229
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1230 1230
  template<class _Digraph>
1231 1231
  struct BfsVisitDefaultTraits {
1232 1232

	
1233 1233
    /// \brief The type of the digraph the algorithm runs on.
1234 1234
    typedef _Digraph Digraph;
1235 1235

	
1236 1236
    /// \brief The type of the map that indicates which nodes are reached.
1237 1237
    ///
1238 1238
    /// The type of the map that indicates which nodes are reached.
1239 1239
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1240 1240
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1241 1241

	
1242 1242
    /// \brief Instantiates a \ref ReachedMap.
1243 1243
    ///
1244 1244
    /// This function instantiates a \ref ReachedMap.
1245 1245
    /// \param digraph is the digraph, to which
1246 1246
    /// we would like to define the \ref ReachedMap.
1247 1247
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1248 1248
      return new ReachedMap(digraph);
1249 1249
    }
1250 1250

	
1251 1251
  };
1252 1252

	
1253 1253
  /// \ingroup search
1254 1254
  ///
1255 1255
  /// \brief %BFS algorithm class with visitor interface.
1256 1256
  ///
1257 1257
  /// This class provides an efficient implementation of the %BFS algorithm
1258 1258
  /// with visitor interface.
1259 1259
  ///
1260 1260
  /// The %BfsVisit class provides an alternative interface to the Bfs
1261 1261
  /// class. It works with callback mechanism, the BfsVisit object calls
1262 1262
  /// the member functions of the \c Visitor class on every BFS event.
1263 1263
  ///
1264
  /// This interface of the BFS algorithm should be used in special cases
1265
  /// when extra actions have to be performed in connection with certain
1266
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1267
  /// instead.
1268
  ///
1264 1269
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1265 1270
  /// The default value is
1266 1271
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1267 1272
  /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1268 1273
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1269 1274
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1270 1275
  /// does not observe the BFS events. If you want to observe the BFS
1271 1276
  /// events, you should implement your own visitor class.
1272 1277
  /// \tparam _Traits Traits class to set various data types used by the
1273 1278
  /// algorithm. The default traits class is
1274 1279
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1275 1280
  /// See \ref BfsVisitDefaultTraits for the documentation of
1276 1281
  /// a BFS visit traits class.
1277 1282
#ifdef DOXYGEN
1278 1283
  template <typename _Digraph, typename _Visitor, typename _Traits>
1279 1284
#else
1280 1285
  template <typename _Digraph = ListDigraph,
1281 1286
            typename _Visitor = BfsVisitor<_Digraph>,
1282 1287
            typename _Traits = BfsDefaultTraits<_Digraph> >
1283 1288
#endif
1284 1289
  class BfsVisit {
1285 1290
  public:
1286 1291

	
1287 1292
    /// \brief \ref Exception for uninitialized parameters.
1288 1293
    ///
1289 1294
    /// This error represents problems in the initialization
1290 1295
    /// of the parameters of the algorithm.
1291 1296
    class UninitializedParameter : public lemon::UninitializedParameter {
1292 1297
    public:
1293 1298
      virtual const char* what() const throw()
1294 1299
      {
1295 1300
        return "lemon::BfsVisit::UninitializedParameter";
1296 1301
      }
1297 1302
    };
1298 1303

	
1299 1304
    ///The traits class.
1300 1305
    typedef _Traits Traits;
1301 1306

	
1302 1307
    ///The type of the digraph the algorithm runs on.
1303 1308
    typedef typename Traits::Digraph Digraph;
1304 1309

	
1305 1310
    ///The visitor type used by the algorithm.
1306 1311
    typedef _Visitor Visitor;
1307 1312

	
1308 1313
    ///The type of the map that indicates which nodes are reached.
1309 1314
    typedef typename Traits::ReachedMap ReachedMap;
1310 1315

	
1311 1316
  private:
1312 1317

	
1313 1318
    typedef typename Digraph::Node Node;
1314 1319
    typedef typename Digraph::NodeIt NodeIt;
1315 1320
    typedef typename Digraph::Arc Arc;
1316 1321
    typedef typename Digraph::OutArcIt OutArcIt;
1317 1322

	
1318 1323
    //Pointer to the underlying digraph.
1319 1324
    const Digraph *_digraph;
1320 1325
    //Pointer to the visitor object.
1321 1326
    Visitor *_visitor;
1322 1327
    //Pointer to the map of reached status of the nodes.
1323 1328
    ReachedMap *_reached;
1324 1329
    //Indicates if _reached is locally allocated (true) or not.
1325 1330
    bool local_reached;
1326 1331

	
1327 1332
    std::vector<typename Digraph::Node> _list;
1328 1333
    int _list_front, _list_back;
1329 1334

	
1330 1335
    ///Creates the maps if necessary.
1331 1336
    ///\todo Better memory allocation (instead of new).
1332 1337
    void create_maps() {
1333 1338
      if(!_reached) {
1334 1339
        local_reached = true;
1335 1340
        _reached = Traits::createReachedMap(*_digraph);
1336 1341
      }
1337 1342
    }
1338 1343

	
1339 1344
  protected:
1340 1345

	
1341 1346
    BfsVisit() {}
1342 1347

	
1343 1348
  public:
1344 1349

	
1345 1350
    typedef BfsVisit Create;
1346 1351

	
1347 1352
    /// \name Named template parameters
1348 1353

	
1349 1354
    ///@{
1350 1355
    template <class T>
1351 1356
    struct SetReachedMapTraits : public Traits {
1352 1357
      typedef T ReachedMap;
1353 1358
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1354 1359
        throw UninitializedParameter();
1355 1360
      }
1356 1361
    };
1357 1362
    /// \brief \ref named-templ-param "Named parameter" for setting
1358 1363
    /// ReachedMap type.
1359 1364
    ///
1360 1365
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1361 1366
    template <class T>
1362 1367
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1363 1368
                                            SetReachedMapTraits<T> > {
1364 1369
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1365 1370
    };
1366 1371
    ///@}
1367 1372

	
1368 1373
  public:
1369 1374

	
1370 1375
    /// \brief Constructor.
1371 1376
    ///
1372 1377
    /// Constructor.
1373 1378
    ///
1374 1379
    /// \param digraph The digraph the algorithm runs on.
1375 1380
    /// \param visitor The visitor object of the algorithm.
1376 1381
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1377 1382
      : _digraph(&digraph), _visitor(&visitor),
1378 1383
        _reached(0), local_reached(false) {}
1379 1384

	
1380 1385
    /// \brief Destructor.
1381 1386
    ~BfsVisit() {
1382 1387
      if(local_reached) delete _reached;
1383 1388
    }
1384 1389

	
1385 1390
    /// \brief Sets the map that indicates which nodes are reached.
1386 1391
    ///
1387 1392
    /// Sets the map that indicates which nodes are reached.
1388 1393
    /// If you don't use this function before calling \ref run(),
1389 1394
    /// it will allocate one. The destructor deallocates this
1390 1395
    /// automatically allocated map, of course.
1391 1396
    /// \return <tt> (*this) </tt>
1392 1397
    BfsVisit &reachedMap(ReachedMap &m) {
1393 1398
      if(local_reached) {
1394 1399
        delete _reached;
1395 1400
        local_reached = false;
1396 1401
      }
1397 1402
      _reached = &m;
1398 1403
      return *this;
1399 1404
    }
1400 1405

	
1401 1406
  public:
1402 1407

	
1403 1408
    /// \name Execution control
1404 1409
    /// The simplest way to execute the algorithm is to use
1405 1410
    /// one of the member functions called \ref lemon::BfsVisit::run()
1406 1411
    /// "run()".
1407 1412
    /// \n
1408 1413
    /// If you need more control on the execution, first you must call
1409 1414
    /// \ref lemon::BfsVisit::init() "init()", then you can add several
1410 1415
    /// source nodes with \ref lemon::BfsVisit::addSource() "addSource()".
1411 1416
    /// Finally \ref lemon::BfsVisit::start() "start()" will perform the
1412 1417
    /// actual path computation.
1413 1418

	
1414 1419
    /// @{
1415 1420

	
1416 1421
    /// \brief Initializes the internal data structures.
1417 1422
    ///
1418 1423
    /// Initializes the internal data structures.
1419 1424
    void init() {
1420 1425
      create_maps();
1421 1426
      _list.resize(countNodes(*_digraph));
1422 1427
      _list_front = _list_back = -1;
1423 1428
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1424 1429
        _reached->set(u, false);
1425 1430
      }
1426 1431
    }
1427 1432

	
1428 1433
    /// \brief Adds a new source node.
1429 1434
    ///
1430 1435
    /// Adds a new source node to the set of nodes to be processed.
1431 1436
    void addSource(Node s) {
1432 1437
      if(!(*_reached)[s]) {
1433 1438
          _reached->set(s,true);
1434 1439
          _visitor->start(s);
1435 1440
          _visitor->reach(s);
1436 1441
          _list[++_list_back] = s;
1437 1442
        }
1438 1443
    }
1439 1444

	
1440 1445
    /// \brief Processes the next node.
1441 1446
    ///
1442 1447
    /// Processes the next node.
1443 1448
    ///
1444 1449
    /// \return The processed node.
1445 1450
    ///
1446 1451
    /// \pre The queue must not be empty.
1447 1452
    Node processNextNode() {
1448 1453
      Node n = _list[++_list_front];
1449 1454
      _visitor->process(n);
1450 1455
      Arc e;
1451 1456
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1452 1457
        Node m = _digraph->target(e);
1453 1458
        if (!(*_reached)[m]) {
1454 1459
          _visitor->discover(e);
1455 1460
          _visitor->reach(m);
Show 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 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
      /// Invalid arc constructor
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
    /// First node of the edge
78
    Node u(const Edge &e) const {
79
      return Parent::source(e);
80
    }
77 81

	
78

	
79
    using Parent::source;
80

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

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

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

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

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

	
111
    static bool direction(const Arc &a) { return a.forward; }
109 112

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

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

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

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

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

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

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

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

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

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

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

	
212 215
    int id(const Edge &e) const {
213 216
      return Parent::id(e);
214 217
    }
215 218

	
216 219
    int id(const Arc &e) const {
217 220
      return 2 * Parent::id(e) + int(e.forward);
218 221
    }
219 222

	
220 223
    int maxNodeId() const {
221 224
      return Parent::maxNodeId();
222 225
    }
223 226

	
224 227
    int maxArcId() const {
225 228
      return 2 * Parent::maxArcId() + 1;
226 229
    }
227 230

	
228 231
    int maxEdgeId() const {
229 232
      return Parent::maxArcId();
230 233
    }
231 234

	
232

	
233 235
    int arcNum() const {
234 236
      return 2 * Parent::arcNum();
235 237
    }
236 238

	
237 239
    int edgeNum() const {
238 240
      return Parent::arcNum();
239 241
    }
240 242

	
241 243
    Arc findArc(Node s, Node t, Arc p = INVALID) const {
242 244
      if (p == INVALID) {
243 245
        Edge arc = Parent::findArc(s, t);
244 246
        if (arc != INVALID) return direct(arc, true);
245 247
        arc = Parent::findArc(t, s);
246 248
        if (arc != INVALID) return direct(arc, false);
247 249
      } else if (direction(p)) {
248 250
        Edge arc = Parent::findArc(s, t, p);
249 251
        if (arc != INVALID) return direct(arc, true);
250 252
        arc = Parent::findArc(t, s);
251 253
        if (arc != INVALID) return direct(arc, false);
252 254
      } else {
253 255
        Edge arc = Parent::findArc(t, s, p);
254 256
        if (arc != INVALID) return direct(arc, false);
255 257
      }
256 258
      return INVALID;
257 259
    }
258 260

	
259 261
    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
260 262
      if (s != t) {
261 263
        if (p == INVALID) {
262 264
          Edge arc = Parent::findArc(s, t);
263 265
          if (arc != INVALID) return arc;
264 266
          arc = Parent::findArc(t, s);
265 267
          if (arc != INVALID) return arc;
266 268
        } else if (Parent::s(p) == s) {
267 269
          Edge arc = Parent::findArc(s, t, p);
268 270
          if (arc != INVALID) return arc;
269 271
          arc = Parent::findArc(t, s);
270 272
          if (arc != INVALID) return arc;
271 273
        } else {
272 274
          Edge arc = Parent::findArc(t, s, p);
273 275
          if (arc != INVALID) return arc;
274 276
        }
275 277
      } else {
276 278
        return Parent::findArc(s, t, p);
277 279
      }
278 280
      return INVALID;
279 281
    }
280 282
  };
281 283

	
282 284
  template <typename Base>
283 285
  class BidirBpGraphExtender : public Base {
284 286
  public:
285 287
    typedef Base Parent;
286 288
    typedef BidirBpGraphExtender Digraph;
287 289

	
288 290
    typedef typename Parent::Node Node;
289 291
    typedef typename Parent::Edge Edge;
290 292

	
291 293

	
292 294
    using Parent::first;
293 295
    using Parent::next;
294 296

	
295 297
    using Parent::id;
296 298

	
297 299
    class Red : public Node {
298 300
      friend class BidirBpGraphExtender;
299 301
    public:
300 302
      Red() {}
301 303
      Red(const Node& node) : Node(node) {
302 304
        LEMON_ASSERT(Parent::red(node) || node == INVALID,
303 305
                     typename Parent::NodeSetError());
304 306
      }
305 307
      Red& operator=(const Node& node) {
306 308
        LEMON_ASSERT(Parent::red(node) || node == INVALID,
307 309
                     typename Parent::NodeSetError());
308 310
        Node::operator=(node);
309 311
        return *this;
310 312
      }
311 313
      Red(Invalid) : Node(INVALID) {}
312 314
      Red& operator=(Invalid) {
313 315
        Node::operator=(INVALID);
314 316
        return *this;
315 317
      }
316 318
    };
317 319

	
318 320
    void first(Red& node) const {
319 321
      Parent::firstRed(static_cast<Node&>(node));
320 322
    }
321 323
    void next(Red& node) const {
322 324
      Parent::nextRed(static_cast<Node&>(node));
323 325
    }
324 326

	
325 327
    int id(const Red& node) const {
326 328
      return Parent::redId(node);
327 329
    }
328 330

	
329 331
    class Blue : public Node {
330 332
      friend class BidirBpGraphExtender;
331 333
    public:
332 334
      Blue() {}
333 335
      Blue(const Node& node) : Node(node) {
334 336
        LEMON_ASSERT(Parent::blue(node) || node == INVALID,
335 337
                     typename Parent::NodeSetError());
336 338
      }
337 339
      Blue& operator=(const Node& node) {
338 340
        LEMON_ASSERT(Parent::blue(node) || node == INVALID,
339 341
                     typename Parent::NodeSetError());
340 342
        Node::operator=(node);
341 343
        return *this;
342 344
      }
343 345
      Blue(Invalid) : Node(INVALID) {}
344 346
      Blue& operator=(Invalid) {
345 347
        Node::operator=(INVALID);
346 348
        return *this;
347 349
      }
348 350
    };
349 351

	
350 352
    void first(Blue& node) const {
351 353
      Parent::firstBlue(static_cast<Node&>(node));
352 354
    }
353 355
    void next(Blue& node) const {
354 356
      Parent::nextBlue(static_cast<Node&>(node));
355 357
    }
356 358

	
357 359
    int id(const Blue& node) const {
358 360
      return Parent::redId(node);
359 361
    }
360 362

	
361 363
    Node source(const Edge& arc) const {
362 364
      return red(arc);
363 365
    }
364 366
    Node target(const Edge& arc) const {
365 367
      return blue(arc);
366 368
    }
367 369

	
368 370
    void firstInc(Edge& arc, bool& dir, const Node& node) const {
369 371
      if (Parent::red(node)) {
370 372
        Parent::firstFromRed(arc, node);
371 373
        dir = true;
372 374
      } else {
373 375
        Parent::firstFromBlue(arc, node);
374 376
        dir = static_cast<Edge&>(arc) == INVALID;
375 377
      }
376 378
    }
377 379
    void nextInc(Edge& arc, bool& dir) const {
378 380
      if (dir) {
379 381
        Parent::nextFromRed(arc);
380 382
      } else {
381 383
        Parent::nextFromBlue(arc);
382 384
        if (arc == INVALID) dir = true;
383 385
      }
384 386
    }
385 387

	
386 388
    class Arc : public Edge {
387 389
      friend class BidirBpGraphExtender;
388 390
    protected:
389 391
      bool forward;
390 392

	
391 393
      Arc(const Edge& arc, bool _forward)
392 394
        : Edge(arc), forward(_forward) {}
393 395

	
394 396
    public:
395 397
      Arc() {}
396 398
      Arc (Invalid) : Edge(INVALID), forward(true) {}
397 399
      bool operator==(const Arc& i) const {
398 400
        return Edge::operator==(i) && forward == i.forward;
399 401
      }
400 402
      bool operator!=(const Arc& i) const {
401 403
        return Edge::operator!=(i) || forward != i.forward;
402 404
      }
403 405
      bool operator<(const Arc& i) const {
404 406
        return Edge::operator<(i) ||
405 407
          (!(i.forward<forward) && Edge(*this)<Edge(i));
406 408
      }
407 409
    };
408 410

	
409 411
    void first(Arc& arc) const {
410 412
      Parent::first(static_cast<Edge&>(arc));
411 413
      arc.forward = true;
412 414
    }
413 415

	
414 416
    void next(Arc& arc) const {
415 417
      if (!arc.forward) {
416 418
        Parent::next(static_cast<Edge&>(arc));
417 419
      }
418 420
      arc.forward = !arc.forward;
419 421
    }
420 422

	
421 423
    void firstOut(Arc& arc, const Node& node) const {
422 424
      if (Parent::red(node)) {
423 425
        Parent::firstFromRed(arc, node);
424 426
        arc.forward = true;
Show white space 384 line context
... ...
@@ -1019,384 +1019,389 @@
1019 1019
    template<class T>
1020 1020
    struct SetReachedMapBase : public Base {
1021 1021
      typedef T ReachedMap;
1022 1022
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1023 1023
      SetReachedMapBase(const TR &b) : TR(b) {}
1024 1024
    };
1025 1025
    ///\brief \ref named-templ-param "Named parameter"
1026 1026
    ///for setting \ref ReachedMap object.
1027 1027
    ///
1028 1028
    /// \ref named-templ-param "Named parameter"
1029 1029
    ///for setting \ref ReachedMap object.
1030 1030
    template<class T>
1031 1031
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1032 1032
    {
1033 1033
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1034 1034
      return DfsWizard<SetReachedMapBase<T> >(*this);
1035 1035
    }
1036 1036

	
1037 1037
    template<class T>
1038 1038
    struct SetProcessedMapBase : public Base {
1039 1039
      typedef T ProcessedMap;
1040 1040
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1041 1041
      SetProcessedMapBase(const TR &b) : TR(b) {}
1042 1042
    };
1043 1043
    ///\brief \ref named-templ-param "Named parameter"
1044 1044
    ///for setting \ref ProcessedMap object.
1045 1045
    ///
1046 1046
    /// \ref named-templ-param "Named parameter"
1047 1047
    ///for setting \ref ProcessedMap object.
1048 1048
    template<class T>
1049 1049
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1050 1050
    {
1051 1051
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1052 1052
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1053 1053
    }
1054 1054

	
1055 1055
    template<class T>
1056 1056
    struct SetDistMapBase : public Base {
1057 1057
      typedef T DistMap;
1058 1058
      static DistMap *createDistMap(const Digraph &) { return 0; };
1059 1059
      SetDistMapBase(const TR &b) : TR(b) {}
1060 1060
    };
1061 1061
    ///\brief \ref named-templ-param "Named parameter"
1062 1062
    ///for setting \ref DistMap object.
1063 1063
    ///
1064 1064
    ///\ref named-templ-param "Named parameter"
1065 1065
    ///for setting \ref DistMap object.
1066 1066
    template<class T>
1067 1067
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1068 1068
    {
1069 1069
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1070 1070
      return DfsWizard<SetDistMapBase<T> >(*this);
1071 1071
    }
1072 1072

	
1073 1073
  };
1074 1074

	
1075 1075
  ///Function type interface for Dfs algorithm.
1076 1076

	
1077 1077
  ///\ingroup search
1078 1078
  ///Function type interface for Dfs algorithm.
1079 1079
  ///
1080 1080
  ///This function also has several
1081 1081
  ///\ref named-templ-func-param "named parameters",
1082 1082
  ///they are declared as the members of class \ref DfsWizard.
1083 1083
  ///The following
1084 1084
  ///example shows how to use these parameters.
1085 1085
  ///\code
1086 1086
  ///  dfs(g,source).predMap(preds).run();
1087 1087
  ///\endcode
1088 1088
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1089 1089
  ///to the end of the parameter list.
1090 1090
  ///\sa DfsWizard
1091 1091
  ///\sa Dfs
1092 1092
  template<class GR>
1093 1093
  DfsWizard<DfsWizardBase<GR> >
1094 1094
  dfs(const GR &g,typename GR::Node s=INVALID)
1095 1095
  {
1096 1096
    return DfsWizard<DfsWizardBase<GR> >(g,s);
1097 1097
  }
1098 1098

	
1099 1099
#ifdef DOXYGEN
1100 1100
  /// \brief Visitor class for DFS.
1101 1101
  ///
1102 1102
  /// This class defines the interface of the DfsVisit events, and
1103 1103
  /// it could be the base of a real visitor class.
1104 1104
  template <typename _Digraph>
1105 1105
  struct DfsVisitor {
1106 1106
    typedef _Digraph Digraph;
1107 1107
    typedef typename Digraph::Arc Arc;
1108 1108
    typedef typename Digraph::Node Node;
1109 1109
    /// \brief Called for the source node of the DFS.
1110 1110
    ///
1111 1111
    /// This function is called for the source node of the DFS.
1112 1112
    void start(const Node& node) {}
1113 1113
    /// \brief Called when the source node is leaved.
1114 1114
    ///
1115 1115
    /// This function is called when the source node is leaved.
1116 1116
    void stop(const Node& node) {}
1117 1117
    /// \brief Called when a node is reached first time.
1118 1118
    ///
1119 1119
    /// This function is called when a node is reached first time.
1120 1120
    void reach(const Node& node) {}
1121 1121
    /// \brief Called when an arc reaches a new node.
1122 1122
    ///
1123 1123
    /// This function is called when the DFS finds an arc whose target node
1124 1124
    /// is not reached yet.
1125 1125
    void discover(const Arc& arc) {}
1126 1126
    /// \brief Called when an arc is examined but its target node is
1127 1127
    /// already discovered.
1128 1128
    ///
1129 1129
    /// This function is called when an arc is examined but its target node is
1130 1130
    /// already discovered.
1131 1131
    void examine(const Arc& arc) {}
1132 1132
    /// \brief Called when the DFS steps back from a node.
1133 1133
    ///
1134 1134
    /// This function is called when the DFS steps back from a node.
1135 1135
    void leave(const Node& node) {}
1136 1136
    /// \brief Called when the DFS steps back on an arc.
1137 1137
    ///
1138 1138
    /// This function is called when the DFS steps back on an arc.
1139 1139
    void backtrack(const Arc& arc) {}
1140 1140
  };
1141 1141
#else
1142 1142
  template <typename _Digraph>
1143 1143
  struct DfsVisitor {
1144 1144
    typedef _Digraph Digraph;
1145 1145
    typedef typename Digraph::Arc Arc;
1146 1146
    typedef typename Digraph::Node Node;
1147 1147
    void start(const Node&) {}
1148 1148
    void stop(const Node&) {}
1149 1149
    void reach(const Node&) {}
1150 1150
    void discover(const Arc&) {}
1151 1151
    void examine(const Arc&) {}
1152 1152
    void leave(const Node&) {}
1153 1153
    void backtrack(const Arc&) {}
1154 1154

	
1155 1155
    template <typename _Visitor>
1156 1156
    struct Constraints {
1157 1157
      void constraints() {
1158 1158
        Arc arc;
1159 1159
        Node node;
1160 1160
        visitor.start(node);
1161 1161
        visitor.stop(arc);
1162 1162
        visitor.reach(node);
1163 1163
        visitor.discover(arc);
1164 1164
        visitor.examine(arc);
1165 1165
        visitor.leave(node);
1166 1166
        visitor.backtrack(arc);
1167 1167
      }
1168 1168
      _Visitor& visitor;
1169 1169
    };
1170 1170
  };
1171 1171
#endif
1172 1172

	
1173 1173
  /// \brief Default traits class of DfsVisit class.
1174 1174
  ///
1175 1175
  /// Default traits class of DfsVisit class.
1176 1176
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1177 1177
  template<class _Digraph>
1178 1178
  struct DfsVisitDefaultTraits {
1179 1179

	
1180 1180
    /// \brief The type of the digraph the algorithm runs on.
1181 1181
    typedef _Digraph Digraph;
1182 1182

	
1183 1183
    /// \brief The type of the map that indicates which nodes are reached.
1184 1184
    ///
1185 1185
    /// The type of the map that indicates which nodes are reached.
1186 1186
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1187 1187
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1188 1188

	
1189 1189
    /// \brief Instantiates a \ref ReachedMap.
1190 1190
    ///
1191 1191
    /// This function instantiates a \ref ReachedMap.
1192 1192
    /// \param digraph is the digraph, to which
1193 1193
    /// we would like to define the \ref ReachedMap.
1194 1194
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1195 1195
      return new ReachedMap(digraph);
1196 1196
    }
1197 1197

	
1198 1198
  };
1199 1199

	
1200 1200
  /// \ingroup search
1201 1201
  ///
1202 1202
  /// \brief %DFS algorithm class with visitor interface.
1203 1203
  ///
1204 1204
  /// This class provides an efficient implementation of the %DFS algorithm
1205 1205
  /// with visitor interface.
1206 1206
  ///
1207 1207
  /// The %DfsVisit class provides an alternative interface to the Dfs
1208 1208
  /// class. It works with callback mechanism, the DfsVisit object calls
1209 1209
  /// the member functions of the \c Visitor class on every DFS event.
1210 1210
  ///
1211
  /// This interface of the DFS algorithm should be used in special cases
1212
  /// when extra actions have to be performed in connection with certain
1213
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1214
  /// instead.
1215
  ///
1211 1216
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1212 1217
  /// The default value is
1213 1218
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1214 1219
  /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1215 1220
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1216 1221
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
1217 1222
  /// does not observe the DFS events. If you want to observe the DFS
1218 1223
  /// events, you should implement your own visitor class.
1219 1224
  /// \tparam _Traits Traits class to set various data types used by the
1220 1225
  /// algorithm. The default traits class is
1221 1226
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1222 1227
  /// See \ref DfsVisitDefaultTraits for the documentation of
1223 1228
  /// a DFS visit traits class.
1224 1229
#ifdef DOXYGEN
1225 1230
  template <typename _Digraph, typename _Visitor, typename _Traits>
1226 1231
#else
1227 1232
  template <typename _Digraph = ListDigraph,
1228 1233
            typename _Visitor = DfsVisitor<_Digraph>,
1229 1234
            typename _Traits = DfsDefaultTraits<_Digraph> >
1230 1235
#endif
1231 1236
  class DfsVisit {
1232 1237
  public:
1233 1238

	
1234 1239
    /// \brief \ref Exception for uninitialized parameters.
1235 1240
    ///
1236 1241
    /// This error represents problems in the initialization
1237 1242
    /// of the parameters of the algorithm.
1238 1243
    class UninitializedParameter : public lemon::UninitializedParameter {
1239 1244
    public:
1240 1245
      virtual const char* what() const throw()
1241 1246
      {
1242 1247
        return "lemon::DfsVisit::UninitializedParameter";
1243 1248
      }
1244 1249
    };
1245 1250

	
1246 1251
    ///The traits class.
1247 1252
    typedef _Traits Traits;
1248 1253

	
1249 1254
    ///The type of the digraph the algorithm runs on.
1250 1255
    typedef typename Traits::Digraph Digraph;
1251 1256

	
1252 1257
    ///The visitor type used by the algorithm.
1253 1258
    typedef _Visitor Visitor;
1254 1259

	
1255 1260
    ///The type of the map that indicates which nodes are reached.
1256 1261
    typedef typename Traits::ReachedMap ReachedMap;
1257 1262

	
1258 1263
  private:
1259 1264

	
1260 1265
    typedef typename Digraph::Node Node;
1261 1266
    typedef typename Digraph::NodeIt NodeIt;
1262 1267
    typedef typename Digraph::Arc Arc;
1263 1268
    typedef typename Digraph::OutArcIt OutArcIt;
1264 1269

	
1265 1270
    //Pointer to the underlying digraph.
1266 1271
    const Digraph *_digraph;
1267 1272
    //Pointer to the visitor object.
1268 1273
    Visitor *_visitor;
1269 1274
    //Pointer to the map of reached status of the nodes.
1270 1275
    ReachedMap *_reached;
1271 1276
    //Indicates if _reached is locally allocated (true) or not.
1272 1277
    bool local_reached;
1273 1278

	
1274 1279
    std::vector<typename Digraph::Arc> _stack;
1275 1280
    int _stack_head;
1276 1281

	
1277 1282
    ///Creates the maps if necessary.
1278 1283
    ///\todo Better memory allocation (instead of new).
1279 1284
    void create_maps() {
1280 1285
      if(!_reached) {
1281 1286
        local_reached = true;
1282 1287
        _reached = Traits::createReachedMap(*_digraph);
1283 1288
      }
1284 1289
    }
1285 1290

	
1286 1291
  protected:
1287 1292

	
1288 1293
    DfsVisit() {}
1289 1294

	
1290 1295
  public:
1291 1296

	
1292 1297
    typedef DfsVisit Create;
1293 1298

	
1294 1299
    /// \name Named template parameters
1295 1300

	
1296 1301
    ///@{
1297 1302
    template <class T>
1298 1303
    struct SetReachedMapTraits : public Traits {
1299 1304
      typedef T ReachedMap;
1300 1305
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1301 1306
        throw UninitializedParameter();
1302 1307
      }
1303 1308
    };
1304 1309
    /// \brief \ref named-templ-param "Named parameter" for setting
1305 1310
    /// ReachedMap type.
1306 1311
    ///
1307 1312
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1308 1313
    template <class T>
1309 1314
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1310 1315
                                            SetReachedMapTraits<T> > {
1311 1316
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1312 1317
    };
1313 1318
    ///@}
1314 1319

	
1315 1320
  public:
1316 1321

	
1317 1322
    /// \brief Constructor.
1318 1323
    ///
1319 1324
    /// Constructor.
1320 1325
    ///
1321 1326
    /// \param digraph The digraph the algorithm runs on.
1322 1327
    /// \param visitor The visitor object of the algorithm.
1323 1328
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1324 1329
      : _digraph(&digraph), _visitor(&visitor),
1325 1330
        _reached(0), local_reached(false) {}
1326 1331

	
1327 1332
    /// \brief Destructor.
1328 1333
    ~DfsVisit() {
1329 1334
      if(local_reached) delete _reached;
1330 1335
    }
1331 1336

	
1332 1337
    /// \brief Sets the map that indicates which nodes are reached.
1333 1338
    ///
1334 1339
    /// Sets the map that indicates which nodes are reached.
1335 1340
    /// If you don't use this function before calling \ref run(),
1336 1341
    /// it will allocate one. The destructor deallocates this
1337 1342
    /// automatically allocated map, of course.
1338 1343
    /// \return <tt> (*this) </tt>
1339 1344
    DfsVisit &reachedMap(ReachedMap &m) {
1340 1345
      if(local_reached) {
1341 1346
        delete _reached;
1342 1347
        local_reached=false;
1343 1348
      }
1344 1349
      _reached = &m;
1345 1350
      return *this;
1346 1351
    }
1347 1352

	
1348 1353
  public:
1349 1354

	
1350 1355
    /// \name Execution control
1351 1356
    /// The simplest way to execute the algorithm is to use
1352 1357
    /// one of the member functions called \ref lemon::DfsVisit::run()
1353 1358
    /// "run()".
1354 1359
    /// \n
1355 1360
    /// If you need more control on the execution, first you must call
1356 1361
    /// \ref lemon::DfsVisit::init() "init()", then you can add several
1357 1362
    /// source nodes with \ref lemon::DfsVisit::addSource() "addSource()".
1358 1363
    /// Finally \ref lemon::DfsVisit::start() "start()" will perform the
1359 1364
    /// actual path computation.
1360 1365

	
1361 1366
    /// @{
1362 1367

	
1363 1368
    /// \brief Initializes the internal data structures.
1364 1369
    ///
1365 1370
    /// Initializes the internal data structures.
1366 1371
    void init() {
1367 1372
      create_maps();
1368 1373
      _stack.resize(countNodes(*_digraph));
1369 1374
      _stack_head = -1;
1370 1375
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1371 1376
        _reached->set(u, false);
1372 1377
      }
1373 1378
    }
1374 1379

	
1375 1380
    ///Adds a new source node.
1376 1381

	
1377 1382
    ///Adds a new source node to the set of nodes to be processed.
1378 1383
    ///
1379 1384
    ///\pre The stack must be empty. (Otherwise the algorithm gives
1380 1385
    ///false results.)
1381 1386
    ///
1382 1387
    ///\warning Distances will be wrong (or at least strange) in case of
1383 1388
    ///multiple sources.
1384 1389
    void addSource(Node s)
1385 1390
    {
1386 1391
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1387 1392
      if(!(*_reached)[s]) {
1388 1393
          _reached->set(s,true);
1389 1394
          _visitor->start(s);
1390 1395
          _visitor->reach(s);
1391 1396
          Arc e;
1392 1397
          _digraph->firstOut(e, s);
1393 1398
          if (e != INVALID) {
1394 1399
            _stack[++_stack_head] = e;
1395 1400
          } else {
1396 1401
            _visitor->leave(s);
1397 1402
          }
1398 1403
        }
1399 1404
    }
1400 1405

	
1401 1406
    /// \brief Processes the next arc.
1402 1407
    ///
Show white space 384 line context
... ...
@@ -878,405 +878,411 @@
878 878
    ///\brief Returns a const reference to the node map that stores the
879 879
    ///distances of the nodes.
880 880
    ///
881 881
    ///Returns a const reference to the node map that stores the distances
882 882
    ///of the nodes calculated by the algorithm.
883 883
    ///
884 884
    ///\pre Either \ref run() or \ref init()
885 885
    ///must be called before using this function.
886 886
    const DistMap &distMap() const { return *_dist;}
887 887

	
888 888
    ///\brief Returns a const reference to the node map that stores the
889 889
    ///predecessor arcs.
890 890
    ///
891 891
    ///Returns a const reference to the node map that stores the predecessor
892 892
    ///arcs, which form the shortest path tree.
893 893
    ///
894 894
    ///\pre Either \ref run() or \ref init()
895 895
    ///must be called before using this function.
896 896
    const PredMap &predMap() const { return *_pred;}
897 897

	
898 898
    ///Checks if a node is reachable from the root(s).
899 899

	
900 900
    ///Returns \c true if \c v is reachable from the root(s).
901 901
    ///\pre Either \ref run() or \ref start()
902 902
    ///must be called before using this function.
903 903
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
904 904
                                        Heap::PRE_HEAP; }
905 905

	
906 906
    ///Checks if a node is processed.
907 907

	
908 908
    ///Returns \c true if \c v is processed, i.e. the shortest
909 909
    ///path to \c v has already found.
910 910
    ///\pre Either \ref run() or \ref start()
911 911
    ///must be called before using this function.
912 912
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
913 913
                                          Heap::POST_HEAP; }
914 914

	
915 915
    ///The current distance of a node from the root(s).
916 916

	
917 917
    ///Returns the current distance of a node from the root(s).
918 918
    ///It may be decreased in the following processes.
919 919
    ///\pre \c v should be reached but not processed.
920 920
    Value currentDist(Node v) const { return (*_heap)[v]; }
921 921

	
922 922
    ///@}
923 923
  };
924 924

	
925 925

	
926 926
  ///Default traits class of dijkstra() function.
927 927

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

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

	
944 944
    /// Operation traits for Dijkstra algorithm.
945 945

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

	
950 950
    /// The cross reference type used by the heap.
951 951

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

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

	
966 966
    ///The heap type used by the Dijkstra algorithm.
967 967

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

	
975 975
    ///Instantiates a \ref Heap.
976 976

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

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

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

	
1006 1006
    ///The type of the map that indicates which nodes are processed.
1007 1007

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

	
1017 1017
    ///This function instantiates a \ref ProcessedMap.
1018 1018
    ///\param g is the digraph, to which
1019 1019
    ///we would like to define the \ref ProcessedMap.
1020 1020
#ifdef DOXYGEN
1021 1021
    static ProcessedMap *createProcessedMap(const Digraph &g)
1022 1022
#else
1023 1023
    static ProcessedMap *createProcessedMap(const Digraph &)
1024 1024
#endif
1025 1025
    {
1026 1026
      return new ProcessedMap();
1027 1027
    }
1028 1028

	
1029 1029
    ///The type of the map that stores the distances of the nodes.
1030 1030

	
1031 1031
    ///The type of the map that stores the distances of the nodes.
1032 1032
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1033 1033
    typedef NullMap<typename Digraph::Node,Value> DistMap;
1034 1034
    ///Instantiates a \ref DistMap.
1035 1035

	
1036 1036
    ///This function instantiates a \ref DistMap.
1037 1037
    ///\param g is the digraph, to which we would like to define
1038 1038
    ///the \ref DistMap
1039 1039
#ifdef DOXYGEN
1040 1040
    static DistMap *createDistMap(const Digraph &g)
1041 1041
#else
1042 1042
    static DistMap *createDistMap(const Digraph &)
1043 1043
#endif
1044 1044
    {
1045 1045
      return new DistMap();
1046 1046
    }
1047 1047
  };
1048 1048

	
1049 1049
  /// Default traits class used by \ref DijkstraWizard
1050 1050

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

	
1066 1066
    //Pointer to the digraph the algorithm runs on.
1067 1067
    void *_g;
1068 1068
    //Pointer to the length map
1069 1069
    void *_length;
1070
    //Pointer to the map of processed nodes.
1071
    void *_processed;
1070 1072
    //Pointer to the map of predecessors arcs.
1071 1073
    void *_pred;
1072 1074
    //Pointer to the map of distances.
1073 1075
    void *_dist;
1074 1076
    //Pointer to the source node.
1075 1077
    Node _source;
1076 1078

	
1077 1079
  public:
1078 1080
    /// Constructor.
1079 1081

	
1080 1082
    /// This constructor does not require parameters, therefore it initiates
1081 1083
    /// all of the attributes to default values (0, INVALID).
1082
    DijkstraWizardBase() : _g(0), _length(0), _pred(0),
1084
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1083 1085
                           _dist(0), _source(INVALID) {}
1084 1086

	
1085 1087
    /// Constructor.
1086 1088

	
1087 1089
    /// This constructor requires some parameters,
1088 1090
    /// listed in the parameters list.
1089 1091
    /// Others are initiated to 0.
1090 1092
    /// \param g The digraph the algorithm runs on.
1091 1093
    /// \param l The length map.
1092 1094
    /// \param s The source node.
1093 1095
    DijkstraWizardBase(const GR &g,const LM &l, Node s=INVALID) :
1094 1096
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1095 1097
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1096
      _pred(0), _dist(0), _source(s) {}
1098
      _processed(0), _pred(0), _dist(0), _source(s) {}
1097 1099

	
1098 1100
  };
1099 1101

	
1100 1102
  /// Auxiliary class for the function type interface of Dijkstra algorithm.
1101 1103

	
1102 1104
  /// This auxiliary class is created to implement the function type
1103 1105
  /// interface of \ref Dijkstra algorithm. It uses the functions and features
1104 1106
  /// of the plain \ref Dijkstra, but it is much simpler to use it.
1105 1107
  /// It should only be used through the \ref dijkstra() function, which makes
1106 1108
  /// it easier to use the algorithm.
1107 1109
  ///
1108 1110
  /// Simplicity means that the way to change the types defined
1109 1111
  /// in the traits class is based on functions that returns the new class
1110 1112
  /// and not on templatable built-in classes.
1111 1113
  /// When using the plain \ref Dijkstra
1112 1114
  /// the new class with the modified type comes from
1113 1115
  /// the original class by using the ::
1114 1116
  /// operator. In the case of \ref DijkstraWizard only
1115 1117
  /// a function have to be called, and it will
1116 1118
  /// return the needed class.
1117 1119
  ///
1118 1120
  /// It does not have own \ref run() method. When its \ref run() method
1119 1121
  /// is called, it initiates a plain \ref Dijkstra object, and calls the
1120 1122
  /// \ref Dijkstra::run() method of it.
1121 1123
  template<class TR>
1122 1124
  class DijkstraWizard : public TR
1123 1125
  {
1124 1126
    typedef TR Base;
1125 1127

	
1126 1128
    ///The type of the digraph the algorithm runs on.
1127 1129
    typedef typename TR::Digraph Digraph;
1128 1130

	
1129 1131
    typedef typename Digraph::Node Node;
1130 1132
    typedef typename Digraph::NodeIt NodeIt;
1131 1133
    typedef typename Digraph::Arc Arc;
1132 1134
    typedef typename Digraph::OutArcIt OutArcIt;
1133 1135

	
1134 1136
    ///The type of the map that stores the arc lengths.
1135 1137
    typedef typename TR::LengthMap LengthMap;
1136 1138
    ///The type of the length of the arcs.
1137 1139
    typedef typename LengthMap::Value Value;
1138 1140
    ///\brief The type of the map that stores the predecessor
1139 1141
    ///arcs of the shortest paths.
1140 1142
    typedef typename TR::PredMap PredMap;
1141 1143
    ///The type of the map that stores the distances of the nodes.
1142 1144
    typedef typename TR::DistMap DistMap;
1143 1145
    ///The type of the map that indicates which nodes are processed.
1144 1146
    typedef typename TR::ProcessedMap ProcessedMap;
1145 1147
    ///The heap type used by the dijkstra algorithm.
1146 1148
    typedef typename TR::Heap Heap;
1147 1149

	
1148 1150
  public:
1149 1151

	
1150 1152
    /// Constructor.
1151 1153
    DijkstraWizard() : TR() {}
1152 1154

	
1153 1155
    /// Constructor that requires parameters.
1154 1156

	
1155 1157
    /// Constructor that requires parameters.
1156 1158
    /// These parameters will be the default values for the traits class.
1157 1159
    DijkstraWizard(const Digraph &g,const LengthMap &l, Node s=INVALID) :
1158 1160
      TR(g,l,s) {}
1159 1161

	
1160 1162
    ///Copy constructor
1161 1163
    DijkstraWizard(const TR &b) : TR(b) {}
1162 1164

	
1163 1165
    ~DijkstraWizard() {}
1164 1166

	
1165 1167
    ///Runs Dijkstra algorithm from a source node.
1166 1168

	
1167 1169
    ///Runs Dijkstra algorithm from a source node.
1168 1170
    ///The node can be given with the \ref source() function.
1169 1171
    void run()
1170 1172
    {
1171 1173
      if(Base::_source==INVALID) throw UninitializedParameter();
1172 1174
      Dijkstra<Digraph,LengthMap,TR>
1173 1175
        dij(*reinterpret_cast<const Digraph*>(Base::_g),
1174 1176
            *reinterpret_cast<const LengthMap*>(Base::_length));
1175
      if(Base::_pred) dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1176
      if(Base::_dist) dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1177
      if(Base::_processed)
1178
        dij.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1179
      if(Base::_pred)
1180
        dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1181
      if(Base::_dist)
1182
        dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1177 1183
      dij.run(Base::_source);
1178 1184
    }
1179 1185

	
1180 1186
    ///Runs Dijkstra algorithm from the given node.
1181 1187

	
1182 1188
    ///Runs Dijkstra algorithm from the given node.
1183 1189
    ///\param s is the given source.
1184 1190
    void run(Node s)
1185 1191
    {
1186 1192
      Base::_source=s;
1187 1193
      run();
1188 1194
    }
1189 1195

	
1190 1196
    /// Sets the source node, from which the Dijkstra algorithm runs.
1191 1197

	
1192 1198
    /// Sets the source node, from which the Dijkstra algorithm runs.
1193 1199
    /// \param s is the source node.
1194 1200
    DijkstraWizard<TR> &source(Node s)
1195 1201
    {
1196 1202
      Base::_source=s;
1197 1203
      return *this;
1198 1204
    }
1199 1205

	
1200 1206
    template<class T>
1201 1207
    struct SetPredMapBase : public Base {
1202 1208
      typedef T PredMap;
1203 1209
      static PredMap *createPredMap(const Digraph &) { return 0; };
1204 1210
      SetPredMapBase(const TR &b) : TR(b) {}
1205 1211
    };
1206 1212
    ///\brief \ref named-templ-param "Named parameter"
1207 1213
    ///for setting \ref PredMap object.
1208 1214
    ///
1209 1215
    ///\ref named-templ-param "Named parameter"
1210 1216
    ///for setting \ref PredMap object.
1211 1217
    template<class T>
1212 1218
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1213 1219
    {
1214 1220
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1215 1221
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1216 1222
    }
1217 1223

	
1218 1224
    template<class T>
1219 1225
    struct SetProcessedMapBase : public Base {
1220 1226
      typedef T ProcessedMap;
1221 1227
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1222 1228
      SetProcessedMapBase(const TR &b) : TR(b) {}
1223 1229
    };
1224 1230
    ///\brief \ref named-templ-param "Named parameter"
1225 1231
    ///for setting \ref ProcessedMap object.
1226 1232
    ///
1227 1233
    /// \ref named-templ-param "Named parameter"
1228 1234
    ///for setting \ref ProcessedMap object.
1229 1235
    template<class T>
1230 1236
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1231 1237
    {
1232 1238
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1233 1239
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1234 1240
    }
1235 1241

	
1236 1242
    template<class T>
1237 1243
    struct SetDistMapBase : public Base {
1238 1244
      typedef T DistMap;
1239 1245
      static DistMap *createDistMap(const Digraph &) { return 0; };
1240 1246
      SetDistMapBase(const TR &b) : TR(b) {}
1241 1247
    };
1242 1248
    ///\brief \ref named-templ-param "Named parameter"
1243 1249
    ///for setting \ref DistMap object.
1244 1250
    ///
1245 1251
    ///\ref named-templ-param "Named parameter"
1246 1252
    ///for setting \ref DistMap object.
1247 1253
    template<class T>
1248 1254
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1249 1255
    {
1250 1256
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1251 1257
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1252 1258
    }
1253 1259

	
1254 1260
  };
1255 1261

	
1256 1262
  ///Function type interface for Dijkstra algorithm.
1257 1263

	
1258 1264
  /// \ingroup shortest_path
1259 1265
  ///Function type interface for Dijkstra algorithm.
1260 1266
  ///
1261 1267
  ///This function also has several
1262 1268
  ///\ref named-templ-func-param "named parameters",
1263 1269
  ///they are declared as the members of class \ref DijkstraWizard.
1264 1270
  ///The following
1265 1271
  ///example shows how to use these parameters.
1266 1272
  ///\code
1267 1273
  ///  dijkstra(g,length,source).predMap(preds).run();
1268 1274
  ///\endcode
1269 1275
  ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()"
1270 1276
  ///to the end of the parameter list.
1271 1277
  ///\sa DijkstraWizard
1272 1278
  ///\sa Dijkstra
1273 1279
  template<class GR, class LM>
1274 1280
  DijkstraWizard<DijkstraWizardBase<GR,LM> >
1275 1281
  dijkstra(const GR &g,const LM &l,typename GR::Node s=INVALID)
1276 1282
  {
1277 1283
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(g,l,s);
1278 1284
  }
1279 1285

	
1280 1286
} //END OF NAMESPACE LEMON
1281 1287

	
1282 1288
#endif
Show 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 23

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

	
36 35
namespace lemon {
37 36

	
38 37
  ///Tools for handling two dimensional coordinates
39 38

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

	
44 43
  /// \addtogroup misc
45 44
  /// @{
46 45

	
47
  /// A simple two dimensional vector (plain vector) implementation
46
  /// Two dimensional vector (plain vector)
48 47

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

	
54 53
    public:
55 54

	
56 55
      typedef T Value;
57 56

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

	
63 62
      ///Default constructor
64 63
      Point() {}
65 64

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

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

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

	
75 74
      ///Subscripting operator
76 75

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

	
81 80
      ///Const subscripting operator
82 81

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
169 168
    };
170 169

	
171 170
  ///Return a Point
172 171

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

	
180 179
  ///Return a vector multiplied by a scalar
181 180

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

	
188 187
  ///Read a plain vector from a stream
189 188

	
190 189
  ///Read a plain vector from a stream.
191 190
  ///\relates Point
192 191
  ///
193 192
  template<typename T>
194 193
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
195 194
    char c;
196 195
    if (is >> c) {
197 196
      if (c != '(') is.putback(c);
198 197
    } else {
199 198
      is.clear();
200 199
    }
201 200
    if (!(is >> z.x)) return is;
202 201
    if (is >> c) {
203 202
      if (c != ',') is.putback(c);
204 203
    } else {
205 204
      is.clear();
206 205
    }
207 206
    if (!(is >> z.y)) return is;
208 207
    if (is >> c) {
209 208
      if (c != ')') is.putback(c);
210 209
    } else {
211 210
      is.clear();
212 211
    }
213 212
    return is;
214 213
  }
215 214

	
216 215
  ///Write a plain vector to a stream
217 216

	
218 217
  ///Write a plain vector to a stream.
219 218
  ///\relates Point
220 219
  ///
221 220
  template<typename T>
222 221
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
223 222
  {
224 223
    os << "(" << z.x << ", " << z.y << ")";
225 224
    return os;
226 225
  }
227 226

	
228 227
  ///Rotate by 90 degrees
229 228

	
230 229
  ///Returns the parameter rotated by 90 degrees in positive direction.
231 230
  ///\relates Point
232 231
  ///
233 232
  template<typename T>
234 233
  inline Point<T> rot90(const Point<T> &z)
235 234
  {
236 235
    return Point<T>(-z.y,z.x);
237 236
  }
238 237

	
239 238
  ///Rotate by 180 degrees
240 239

	
241 240
  ///Returns the parameter rotated by 180 degrees.
242 241
  ///\relates Point
243 242
  ///
244 243
  template<typename T>
245 244
  inline Point<T> rot180(const Point<T> &z)
246 245
  {
247 246
    return Point<T>(-z.x,-z.y);
248 247
  }
249 248

	
250 249
  ///Rotate by 270 degrees
251 250

	
252 251
  ///Returns the parameter rotated by 90 degrees in negative direction.
253 252
  ///\relates Point
254 253
  ///
255 254
  template<typename T>
256 255
  inline Point<T> rot270(const Point<T> &z)
257 256
  {
258 257
    return Point<T>(z.y,-z.x);
259 258
  }
260 259

	
261 260

	
262 261

	
263
    /// A class to calculate or store the bounding box of plain vectors.
262
  /// Bounding box of plain vectors (\ref Point points).
264 263

	
265
    /// A class to calculate or store the bounding box of plain vectors.
266
    ///
264
  /// A class to calculate or store the bounding box of plain vectors
265
  /// (\ref Point points).
267 266
    template<typename T>
268
    class BoundingBox {
267
  class Box {
269 268
      Point<T> _bottom_left, _top_right;
270 269
      bool _empty;
271 270
    public:
272 271

	
273
      ///Default constructor: creates an empty bounding box
274
      BoundingBox() { _empty = true; }
272
      ///Default constructor: creates an empty box
273
      Box() { _empty = true; }
275 274

	
276
      ///Construct an instance from one point
277
      BoundingBox(Point<T> a) {
275
      ///Construct a box from one point
276
      Box(Point<T> a) {
278 277
        _bottom_left = _top_right = a;
279 278
        _empty = false;
280 279
      }
281 280

	
282
      ///Construct an instance from two points
281
      ///Construct a box from two points
283 282

	
284
      ///Construct an instance from two points.
283
      ///Construct a box from two points.
285 284
      ///\param a The bottom left corner.
286 285
      ///\param b The top right corner.
287 286
      ///\warning The coordinates of the bottom left corner must be no more
288 287
      ///than those of the top right one.
289
      BoundingBox(Point<T> a,Point<T> b)
288
      Box(Point<T> a,Point<T> b)
290 289
      {
291 290
        _bottom_left = a;
292 291
        _top_right = b;
293 292
        _empty = false;
294 293
      }
295 294

	
296
      ///Construct an instance from four numbers
295
      ///Construct a box from four numbers
297 296

	
298
      ///Construct an instance from four numbers.
297
      ///Construct a box from four numbers.
299 298
      ///\param l The left side of the box.
300 299
      ///\param b The bottom of the box.
301 300
      ///\param r The right side of the box.
302 301
      ///\param t The top of the box.
303 302
      ///\warning The left side must be no more than the right side and
304 303
      ///bottom must be no more than the top.
305
      BoundingBox(T l,T b,T r,T t)
304
      Box(T l,T b,T r,T t)
306 305
      {
307 306
        _bottom_left=Point<T>(l,b);
308 307
        _top_right=Point<T>(r,t);
309 308
        _empty = false;
310 309
      }
311 310

	
312
      ///Return \c true if the bounding box is empty.
311
      ///Return \c true if the box is empty.
313 312

	
314
      ///Return \c true if the bounding box is empty (i.e. return \c false
313
      ///Return \c true if the box is empty (i.e. return \c false
315 314
      ///if at least one point was added to the box or the coordinates of
316 315
      ///the box were set).
317 316
      ///
318
      ///The coordinates of an empty bounding box are not defined.
317
      ///The coordinates of an empty box are not defined.
319 318
      bool empty() const {
320 319
        return _empty;
321 320
      }
322 321

	
323
      ///Make the BoundingBox empty
322
      ///Make the box empty
324 323
      void clear() {
325 324
        _empty = true;
326 325
      }
327 326

	
328 327
      ///Give back the bottom left corner of the box
329 328

	
330 329
      ///Give back the bottom left corner of the box.
331
      ///If the bounding box is empty, then the return value is not defined.
330
      ///If the box is empty, then the return value is not defined.
332 331
      Point<T> bottomLeft() const {
333 332
        return _bottom_left;
334 333
      }
335 334

	
336 335
      ///Set the bottom left corner of the box
337 336

	
338 337
      ///Set the bottom left corner of the box.
339 338
      ///\pre The box must not be empty.
340 339
      void bottomLeft(Point<T> p) {
341 340
        _bottom_left = p;
342 341
      }
343 342

	
344 343
      ///Give back the top right corner of the box
345 344

	
346 345
      ///Give back the top right corner of the box.
347
      ///If the bounding box is empty, then the return value is not defined.
346
      ///If the box is empty, then the return value is not defined.
348 347
      Point<T> topRight() const {
349 348
        return _top_right;
350 349
      }
351 350

	
352 351
      ///Set the top right corner of the box
353 352

	
354 353
      ///Set the top right corner of the box.
355 354
      ///\pre The box must not be empty.
356 355
      void topRight(Point<T> p) {
357 356
        _top_right = p;
358 357
      }
359 358

	
360 359
      ///Give back the bottom right corner of the box
361 360

	
362 361
      ///Give back the bottom right corner of the box.
363
      ///If the bounding box is empty, then the return value is not defined.
362
      ///If the box is empty, then the return value is not defined.
364 363
      Point<T> bottomRight() const {
365 364
        return Point<T>(_top_right.x,_bottom_left.y);
366 365
      }
367 366

	
368 367
      ///Set the bottom right corner of the box
369 368

	
370 369
      ///Set the bottom right corner of the box.
371 370
      ///\pre The box must not be empty.
372 371
      void bottomRight(Point<T> p) {
373 372
        _top_right.x = p.x;
374 373
        _bottom_left.y = p.y;
375 374
      }
376 375

	
377 376
      ///Give back the top left corner of the box
378 377

	
379 378
      ///Give back the top left corner of the box.
380
      ///If the bounding box is empty, then the return value is not defined.
379
      ///If the box is empty, then the return value is not defined.
381 380
      Point<T> topLeft() const {
382 381
        return Point<T>(_bottom_left.x,_top_right.y);
383 382
      }
384 383

	
385 384
      ///Set the top left corner of the box
386 385

	
387 386
      ///Set the top left corner of the box.
388 387
      ///\pre The box must not be empty.
389 388
      void topLeft(Point<T> p) {
390 389
        _top_right.y = p.y;
391 390
        _bottom_left.x = p.x;
392 391
      }
393 392

	
394 393
      ///Give back the bottom of the box
395 394

	
396 395
      ///Give back the bottom of the box.
397
      ///If the bounding box is empty, then the return value is not defined.
396
      ///If the box is empty, then the return value is not defined.
398 397
      T bottom() const {
399 398
        return _bottom_left.y;
400 399
      }
401 400

	
402 401
      ///Set the bottom of the box
403 402

	
404 403
      ///Set the bottom of the box.
405 404
      ///\pre The box must not be empty.
406 405
      void bottom(T t) {
407 406
        _bottom_left.y = t;
408 407
      }
409 408

	
410 409
      ///Give back the top of the box
411 410

	
412 411
      ///Give back the top of the box.
413
      ///If the bounding box is empty, then the return value is not defined.
412
      ///If the box is empty, then the return value is not defined.
414 413
      T top() const {
415 414
        return _top_right.y;
416 415
      }
417 416

	
418 417
      ///Set the top of the box
419 418

	
420 419
      ///Set the top of the box.
421 420
      ///\pre The box must not be empty.
422 421
      void top(T t) {
423 422
        _top_right.y = t;
424 423
      }
425 424

	
426 425
      ///Give back the left side of the box
427 426

	
428 427
      ///Give back the left side of the box.
429
      ///If the bounding box is empty, then the return value is not defined.
428
      ///If the box is empty, then the return value is not defined.
430 429
      T left() const {
431 430
        return _bottom_left.x;
432 431
      }
433 432

	
434 433
      ///Set the left side of the box
435 434

	
436 435
      ///Set the left side of the box.
437 436
      ///\pre The box must not be empty.
438 437
      void left(T t) {
439 438
        _bottom_left.x = t;
440 439
      }
441 440

	
442 441
      /// Give back the right side of the box
443 442

	
444 443
      /// Give back the right side of the box.
445
      ///If the bounding box is empty, then the return value is not defined.
444
      ///If the box is empty, then the return value is not defined.
446 445
      T right() const {
447 446
        return _top_right.x;
448 447
      }
449 448

	
450 449
      ///Set the right side of the box
451 450

	
452 451
      ///Set the right side of the box.
453 452
      ///\pre The box must not be empty.
454 453
      void right(T t) {
455 454
        _top_right.x = t;
456 455
      }
457 456

	
458 457
      ///Give back the height of the box
459 458

	
460 459
      ///Give back the height of the box.
461
      ///If the bounding box is empty, then the return value is not defined.
460
      ///If the box is empty, then the return value is not defined.
462 461
      T height() const {
463 462
        return _top_right.y-_bottom_left.y;
464 463
      }
465 464

	
466 465
      ///Give back the width of the box
467 466

	
468 467
      ///Give back the width of the box.
469
      ///If the bounding box is empty, then the return value is not defined.
468
      ///If the box is empty, then the return value is not defined.
470 469
      T width() const {
471 470
        return _top_right.x-_bottom_left.x;
472 471
      }
473 472

	
474
      ///Checks whether a point is inside a bounding box
473
      ///Checks whether a point is inside the box
475 474
      bool inside(const Point<T>& u) const {
476 475
        if (_empty)
477 476
          return false;
478 477
        else {
479 478
          return ( (u.x-_bottom_left.x)*(_top_right.x-u.x) >= 0 &&
480 479
                   (u.y-_bottom_left.y)*(_top_right.y-u.y) >= 0 );
481 480
        }
482 481
      }
483 482

	
484
      ///Increments a bounding box with a point
483
      ///Increments the box with a point
485 484

	
486
      ///Increments a bounding box with a point.
485
      ///Increments the box with a point.
487 486
      ///
488
      BoundingBox& add(const Point<T>& u){
487
      Box& add(const Point<T>& u){
489 488
        if (_empty) {
490 489
          _bottom_left = _top_right = u;
491 490
          _empty = false;
492 491
        }
493 492
        else {
494 493
          if (_bottom_left.x > u.x) _bottom_left.x = u.x;
495 494
          if (_bottom_left.y > u.y) _bottom_left.y = u.y;
496 495
          if (_top_right.x < u.x) _top_right.x = u.x;
497 496
          if (_top_right.y < u.y) _top_right.y = u.y;
498 497
        }
499 498
        return *this;
500 499
      }
501 500

	
502
      ///Increments a bounding box to contain another bounding box
501
      ///Increments the box to contain another box
503 502

	
504
      ///Increments a bounding box to contain another bounding box.
503
      ///Increments the box to contain another box.
505 504
      ///
506
      BoundingBox& add(const BoundingBox &u){
505
      Box& add(const Box &u){
507 506
        if ( !u.empty() ){
508 507
          add(u._bottom_left);
509 508
          add(u._top_right);
510 509
        }
511 510
        return *this;
512 511
      }
513 512

	
514
      ///Intersection of two bounding boxes
513
      ///Intersection of two boxes
515 514

	
516
      ///Intersection of two bounding boxes.
515
      ///Intersection of two boxes.
517 516
      ///
518
      BoundingBox operator&(const BoundingBox& u) const {
519
        BoundingBox b;
517
      Box operator&(const Box& u) const {
518
        Box b;
520 519
        if (_empty || u._empty) {
521 520
          b._empty = true;
522 521
        } else {
523 522
          b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x);
524 523
          b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y);
525 524
          b._top_right.x = std::min(_top_right.x, u._top_right.x);
526 525
          b._top_right.y = std::min(_top_right.y, u._top_right.y);
527 526
          b._empty = b._bottom_left.x > b._top_right.x ||
528 527
                     b._bottom_left.y > b._top_right.y;
529 528
        }
530 529
        return b;
531 530
      }
532 531

	
533
    };//class Boundingbox
532
  };//class Box
534 533

	
535 534

	
535
  ///Read a box from a stream
536

	
537
  ///Read a box from a stream.
538
  ///\relates Box
539
  template<typename T>
540
  inline std::istream& operator>>(std::istream &is, Box<T>& b) {
541
    char c;
542
    Point<T> p;
543
    if (is >> c) {
544
      if (c != '(') is.putback(c);
545
    } else {
546
      is.clear();
547
    }
548
    if (!(is >> p)) return is;
549
    b.bottomLeft(p);
550
    if (is >> c) {
551
      if (c != ',') is.putback(c);
552
    } else {
553
      is.clear();
554
    }
555
    if (!(is >> p)) return is;
556
    b.topRight(p);
557
    if (is >> c) {
558
      if (c != ')') is.putback(c);
559
    } else {
560
      is.clear();
561
    }
562
    return is;
563
  }
564

	
565
  ///Write a box to a stream
566

	
567
  ///Write a box to a stream.
568
  ///\relates Box
569
  template<typename T>
570
  inline std::ostream& operator<<(std::ostream &os, const Box<T>& b)
571
  {
572
    os << "(" << b.bottomLeft() << "," << b.topRight() << ")";
573
    return os;
574
  }
575

	
536 576
  ///Map of x-coordinates of a \ref Point "Point"-map
537 577

	
538 578
  ///\ingroup maps
539 579
  ///Map of x-coordinates of a \ref Point "Point"-map.
540 580
  ///
541 581
  template<class M>
542 582
  class XMap
543 583
  {
544 584
    M& _map;
545 585
  public:
546 586

	
547 587
    typedef typename M::Value::Value Value;
548 588
    typedef typename M::Key Key;
549 589
    ///\e
550 590
    XMap(M& map) : _map(map) {}
551 591
    Value operator[](Key k) const {return _map[k].x;}
552 592
    void set(Key k,Value v) {_map.set(k,typename M::Value(v,_map[k].y));}
553 593
  };
554 594

	
555 595
  ///Returns an \ref XMap class
556 596

	
557 597
  ///This function just returns an \ref XMap class.
558 598
  ///
559 599
  ///\ingroup maps
560 600
  ///\relates XMap
561 601
  template<class M>
562 602
  inline XMap<M> xMap(M &m)
563 603
  {
564 604
    return XMap<M>(m);
565 605
  }
566 606

	
567 607
  template<class M>
568 608
  inline XMap<M> xMap(const M &m)
569 609
  {
570 610
    return XMap<M>(m);
571 611
  }
572 612

	
573 613
  ///Constant (read only) version of \ref XMap
574 614

	
575 615
  ///\ingroup maps
576 616
  ///Constant (read only) version of \ref XMap
577 617
  ///
578 618
  template<class M>
579 619
  class ConstXMap
580 620
  {
581 621
    const M& _map;
582 622
  public:
583 623

	
584 624
    typedef typename M::Value::Value Value;
585 625
    typedef typename M::Key Key;
586 626
    ///\e
587 627
    ConstXMap(const M &map) : _map(map) {}
588 628
    Value operator[](Key k) const {return _map[k].x;}
589 629
  };
590 630

	
591 631
  ///Returns a \ref ConstXMap class
592 632

	
593 633
  ///This function just returns a \ref ConstXMap class.
594 634
  ///
595 635
  ///\ingroup maps
596 636
  ///\relates ConstXMap
597 637
  template<class M>
598 638
  inline ConstXMap<M> xMap(const M &m)
599 639
  {
600 640
    return ConstXMap<M>(m);
601 641
  }
602 642

	
603 643
  ///Map of y-coordinates of a \ref Point "Point"-map
604 644

	
605 645
  ///\ingroup maps
606 646
  ///Map of y-coordinates of a \ref Point "Point"-map.
607 647
  ///
608 648
  template<class M>
609 649
  class YMap
610 650
  {
611 651
    M& _map;
612 652
  public:
613 653

	
614 654
    typedef typename M::Value::Value Value;
615 655
    typedef typename M::Key Key;
616 656
    ///\e
617 657
    YMap(M& map) : _map(map) {}
618 658
    Value operator[](Key k) const {return _map[k].y;}
619 659
    void set(Key k,Value v) {_map.set(k,typename M::Value(_map[k].x,v));}
620 660
  };
621 661

	
622 662
  ///Returns a \ref YMap class
623 663

	
624 664
  ///This function just returns a \ref YMap class.
625 665
  ///
626 666
  ///\ingroup maps
627 667
  ///\relates YMap
628 668
  template<class M>
629 669
  inline YMap<M> yMap(M &m)
630 670
  {
631 671
    return YMap<M>(m);
632 672
  }
633 673

	
634 674
  template<class M>
635 675
  inline YMap<M> yMap(const M &m)
636 676
  {
637 677
    return YMap<M>(m);
638 678
  }
639 679

	
640 680
  ///Constant (read only) version of \ref YMap
641 681

	
642 682
  ///\ingroup maps
643 683
  ///Constant (read only) version of \ref YMap
644 684
  ///
645 685
  template<class M>
646 686
  class ConstYMap
647 687
  {
648 688
    const M& _map;
649 689
  public:
650 690

	
651 691
    typedef typename M::Value::Value Value;
652 692
    typedef typename M::Key Key;
653 693
    ///\e
654 694
    ConstYMap(const M &map) : _map(map) {}
655 695
    Value operator[](Key k) const {return _map[k].y;}
656 696
  };
657 697

	
658 698
  ///Returns a \ref ConstYMap class
659 699

	
660 700
  ///This function just returns a \ref ConstYMap class.
661 701
  ///
662 702
  ///\ingroup maps
663 703
  ///\relates ConstYMap
664 704
  template<class M>
665 705
  inline ConstYMap<M> yMap(const M &m)
666 706
  {
667 707
    return ConstYMap<M>(m);
668 708
  }
669 709

	
670 710

	
671 711
  ///\brief Map of the \ref Point::normSquare() "normSquare()"
672 712
  ///of a \ref Point "Point"-map
673 713
  ///
674 714
  ///Map of the \ref Point::normSquare() "normSquare()"
675 715
  ///of a \ref Point "Point"-map.
676 716
  ///\ingroup maps
677 717
  template<class M>
678 718
  class NormSquareMap
679 719
  {
680 720
    const M& _map;
681 721
  public:
682 722

	
683 723
    typedef typename M::Value::Value Value;
684 724
    typedef typename M::Key Key;
685 725
    ///\e
686 726
    NormSquareMap(const M &map) : _map(map) {}
687 727
    Value operator[](Key k) const {return _map[k].normSquare();}
688 728
  };
689 729

	
690 730
  ///Returns a \ref NormSquareMap class
691 731

	
692 732
  ///This function just returns a \ref NormSquareMap class.
693 733
  ///
694 734
  ///\ingroup maps
695 735
  ///\relates NormSquareMap
696 736
  template<class M>
697 737
  inline NormSquareMap<M> normSquareMap(const M &m)
698 738
  {
699 739
    return NormSquareMap<M>(m);
700 740
  }
701 741

	
702 742
  /// @}
703 743

	
704 744
  } //namespce dim2
705 745

	
706 746
} //namespace lemon
707 747

	
708 748
#endif //LEMON_DIM2_H
Show white space 384 line context
... ...
@@ -536,418 +536,418 @@
536 536
  /// If both arcWidths() and autoArcWidthScale() are used, then the
537 537
  /// arc withs will be scaled in such a way that the greatest width will be
538 538
  /// equal to \c d.
539 539
  GraphToEps<T> &arcWidthScale(double d=.003) {_arcWidthScale=d;return *this;}
540 540
  ///Turns on/off the automatic arc width scaling.
541 541

	
542 542
  ///Turns on/off the automatic arc width scaling.
543 543
  ///
544 544
  ///\sa arcWidthScale()
545 545
  ///
546 546
  GraphToEps<T> &autoArcWidthScale(bool b=true) {
547 547
    _autoArcWidthScale=b;return *this;
548 548
  }
549 549
  ///Turns on/off the absolutematic arc width scaling.
550 550

	
551 551
  ///Turns on/off the absolutematic arc width scaling.
552 552
  ///
553 553
  ///\sa arcWidthScale()
554 554
  ///
555 555
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
556 556
    _absoluteArcWidths=b;return *this;
557 557
  }
558 558
  ///Sets a global scale factor for the whole picture
559 559
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
560 560
  ///Sets the width of the border around the picture
561 561
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
562 562
  ///Sets the width of the border around the picture
563 563
  GraphToEps<T> &border(double x, double y) {
564 564
    _xBorder=x;_yBorder=y;return *this;
565 565
  }
566 566
  ///Sets whether to draw arrows
567 567
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
568 568
  ///Sets the length of the arrowheads
569 569
  GraphToEps<T> &arrowLength(double d=1.0) {_arrowLength*=d;return *this;}
570 570
  ///Sets the width of the arrowheads
571 571
  GraphToEps<T> &arrowWidth(double d=.3) {_arrowWidth*=d;return *this;}
572 572

	
573 573
  ///Scales the drawing to fit to A4 page
574 574
  GraphToEps<T> &scaleToA4() {_scaleToA4=true;return *this;}
575 575

	
576 576
  ///Enables parallel arcs
577 577
  GraphToEps<T> &enableParallel(bool b=true) {_enableParallel=b;return *this;}
578 578

	
579 579
  ///Sets the distance between parallel arcs
580 580
  GraphToEps<T> &parArcDist(double d) {_parArcDist*=d;return *this;}
581 581

	
582 582
  ///Hides the arcs
583 583
  GraphToEps<T> &hideArcs(bool b=true) {_showArcs=!b;return *this;}
584 584
  ///Hides the nodes
585 585
  GraphToEps<T> &hideNodes(bool b=true) {_showNodes=!b;return *this;}
586 586

	
587 587
  ///Sets the size of the node texts
588 588
  GraphToEps<T> &nodeTextSize(double d) {_nodeTextSize=d;return *this;}
589 589

	
590 590
  ///Sets the color of the node texts to be different from the node color
591 591

	
592 592
  ///Sets the color of the node texts to be as different from the node color
593 593
  ///as it is possible.
594 594
  GraphToEps<T> &distantColorNodeTexts()
595 595
  {_nodeTextColorType=DIST_COL;return *this;}
596 596
  ///Sets the color of the node texts to be black or white and always visible.
597 597

	
598 598
  ///Sets the color of the node texts to be black or white according to
599 599
  ///which is more different from the node color.
600 600
  GraphToEps<T> &distantBWNodeTexts()
601 601
  {_nodeTextColorType=DIST_BW;return *this;}
602 602

	
603 603
  ///Gives a preamble block for node Postscript block.
604 604

	
605 605
  ///Gives a preamble block for node Postscript block.
606 606
  ///
607 607
  ///\sa nodePsTexts()
608 608
  GraphToEps<T> & nodePsTextsPreamble(const char *str) {
609 609
    _nodePsTextsPreamble=str ;return *this;
610 610
  }
611 611
  ///Sets whether the graph is undirected
612 612

	
613 613
  ///Sets whether the graph is undirected.
614 614
  ///
615 615
  ///This setting is the default for undirected graphs.
616 616
  ///
617 617
  ///\sa directed()
618 618
   GraphToEps<T> &undirected(bool b=true) {_undirected=b;return *this;}
619 619

	
620 620
  ///Sets whether the graph is directed
621 621

	
622 622
  ///Sets whether the graph is directed.
623 623
  ///Use it to show the edges as a pair of directed ones.
624 624
  ///
625 625
  ///This setting is the default for digraphs.
626 626
  ///
627 627
  ///\sa undirected()
628 628
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
629 629

	
630 630
  ///Sets the title.
631 631

	
632 632
  ///Sets the title of the generated image,
633 633
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
634 634
  ///the EPS file.
635 635
  GraphToEps<T> &title(const std::string &t) {_title=t;return *this;}
636 636
  ///Sets the copyright statement.
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 669
    //\todo better 'epsilon' would be nice here.
670 670
    const double EPSILON=1e-9;
671 671
    if(dontPrint) return;
672 672

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

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

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

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

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

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

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

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

	
739
    dim2::BoundingBox<double> bb;
739
    dim2::Box<double> bb;
740 740
    for(NodeIt n(g);n!=INVALID;++n) {
741 741
      double ns=_nodeSizes[n]*_nodeScale;
742 742
      dim2::Point<double> p(ns,ns);
743 743
      switch(_nodeShapes[n]) {
744 744
      case CIRCLE:
745 745
      case SQUARE:
746 746
      case DIAMOND:
747 747
        bb.add(p+mycoords[n]);
748 748
        bb.add(-p+mycoords[n]);
749 749
        break;
750 750
      case MALE:
751 751
        bb.add(-p+mycoords[n]);
752 752
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
753 753
        break;
754 754
      case FEMALE:
755 755
        bb.add(p+mycoords[n]);
756 756
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
757 757
        break;
758 758
      }
759 759
    }
760 760
    if (bb.empty()) {
761
      bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
761
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
762 762
    }
763 763

	
764 764
    if(_scaleToA4)
765 765
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
766 766
    else {
767 767
      if(_preScale) {
768 768
        //Rescale so that BoundingBox won't be neither to big nor too small.
769 769
        while(bb.height()*_scale>1000||bb.width()*_scale>1000) _scale/=10;
770 770
        while(bb.height()*_scale<100||bb.width()*_scale<100) _scale*=10;
771 771
      }
772 772

	
773 773
      os << "%%BoundingBox: "
774 774
         << int(floor(bb.left()   * _scale - _xBorder)) << ' '
775 775
         << int(floor(bb.bottom() * _scale - _yBorder)) << ' '
776 776
         << int(ceil(bb.right()  * _scale + _xBorder)) << ' '
777 777
         << int(ceil(bb.top()    * _scale + _yBorder)) << '\n';
778 778
    }
779 779

	
780 780
    os << "%%EndComments\n";
781 781

	
782 782
    //x1 y1 x2 y2 x3 y3 cr cg cb w
783 783
    os << "/lb { setlinewidth setrgbcolor newpath moveto\n"
784 784
       << "      4 2 roll 1 index 1 index curveto stroke } bind def\n";
785 785
    os << "/l { setlinewidth setrgbcolor newpath moveto lineto stroke }"
786 786
       << " bind def\n";
787 787
    //x y r
788 788
    os << "/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath }"
789 789
       << " bind def\n";
790 790
    //x y r
791 791
    os << "/sq { newpath 2 index 1 index add 2 index 2 index add moveto\n"
792 792
       << "      2 index 1 index sub 2 index 2 index add lineto\n"
793 793
       << "      2 index 1 index sub 2 index 2 index sub lineto\n"
794 794
       << "      2 index 1 index add 2 index 2 index sub lineto\n"
795 795
       << "      closepath pop pop pop} bind def\n";
796 796
    //x y r
797 797
    os << "/di { newpath 2 index 1 index add 2 index moveto\n"
798 798
       << "      2 index             2 index 2 index add lineto\n"
799 799
       << "      2 index 1 index sub 2 index             lineto\n"
800 800
       << "      2 index             2 index 2 index sub lineto\n"
801 801
       << "      closepath pop pop pop} bind def\n";
802 802
    // x y r cr cg cb
803 803
    os << "/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill\n"
804 804
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
805 805
       << "   } bind def\n";
806 806
    os << "/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill\n"
807 807
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div sq fill\n"
808 808
       << "   } bind def\n";
809 809
    os << "/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill\n"
810 810
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div di fill\n"
811 811
       << "   } bind def\n";
812 812
    os << "/nfemale { 0 0 0 setrgbcolor 3 index "
813 813
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
814 814
       << " 1.5 mul mul setlinewidth\n"
815 815
       << "  newpath 5 index 5 index moveto "
816 816
       << "5 index 5 index 5 index 3.01 mul sub\n"
817 817
       << "  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub"
818 818
       << " moveto\n"
819 819
       << "  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto "
820 820
       << "stroke\n"
821 821
       << "  5 index 5 index 5 index c fill\n"
822 822
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
823 823
       << "  } bind def\n";
824 824
    os << "/nmale {\n"
825 825
       << "  0 0 0 setrgbcolor 3 index "
826 826
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
827 827
       <<" 1.5 mul mul setlinewidth\n"
828 828
       << "  newpath 5 index 5 index moveto\n"
829 829
       << "  5 index 4 index 1 mul 1.5 mul add\n"
830 830
       << "  5 index 5 index 3 sqrt 1.5 mul mul add\n"
831 831
       << "  1 index 1 index lineto\n"
832 832
       << "  1 index 1 index 7 index sub moveto\n"
833 833
       << "  1 index 1 index lineto\n"
834 834
       << "  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub"
835 835
       << " lineto\n"
836 836
       << "  stroke\n"
837 837
       << "  5 index 5 index 5 index c fill\n"
838 838
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
839 839
       << "  } bind def\n";
840 840

	
841 841

	
842 842
    os << "/arrl " << _arrowLength << " def\n";
843 843
    os << "/arrw " << _arrowWidth << " def\n";
844 844
    // l dx_norm dy_norm
845 845
    os << "/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def\n";
846 846
    //len w dx_norm dy_norm x1 y1 cr cg cb
847 847
    os << "/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx "
848 848
       << "exch def\n"
849 849
       << "       /w exch def /len exch def\n"
850 850
      //<< "0.1 setlinewidth x1 y1 moveto dx len mul dy len mul rlineto stroke"
851 851
       << "       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto\n"
852 852
       << "       len w sub arrl sub dx dy lrl\n"
853 853
       << "       arrw dy dx neg lrl\n"
854 854
       << "       dx arrl w add mul dy w 2 div arrw add mul sub\n"
855 855
       << "       dy arrl w add mul dx w 2 div arrw add mul add rlineto\n"
856 856
       << "       dx arrl w add mul neg dy w 2 div arrw add mul sub\n"
857 857
       << "       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto\n"
858 858
       << "       arrw dy dx neg lrl\n"
859 859
       << "       len w sub arrl sub neg dx dy lrl\n"
860 860
       << "       closepath fill } bind def\n";
861 861
    os << "/cshow { 2 index 2 index moveto dup stringwidth pop\n"
862 862
       << "         neg 2 div fosi .35 mul neg rmoveto show pop pop} def\n";
863 863

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

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

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

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

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

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

	
922 922
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e) {
923 923
            sw+=_arcWidths[*e]*_arcWidthScale/2.0;
924 924
            dim2::Point<double> mm=m+rot90(d)*sw/.75;
925 925
            if(_drawArrows) {
926 926
              int node_shape;
927 927
              dim2::Point<double> s=mycoords[g.source(*e)];
928 928
              dim2::Point<double> t=mycoords[g.target(*e)];
929 929
              double rn=_nodeSizes[g.target(*e)]*_nodeScale;
930 930
              node_shape=_nodeShapes[g.target(*e)];
931 931
              dim2::Bezier3 bez(s,mm,mm,t);
932 932
              double t1=0,t2=1;
933 933
              for(int ii=0;ii<INTERPOL_PREC;++ii)
934 934
                if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape)) t2=(t1+t2)/2;
935 935
                else t1=(t1+t2)/2;
936 936
              dim2::Point<double> apoint=bez((t1+t2)/2);
937 937
              rn = _arrowLength+_arcWidths[*e]*_arcWidthScale;
938 938
              rn*=rn;
939 939
              t2=(t1+t2)/2;t1=0;
940 940
              for(int ii=0;ii<INTERPOL_PREC;++ii)
941 941
                if((bez((t1+t2)/2)-apoint).normSquare()>rn) t1=(t1+t2)/2;
942 942
                else t2=(t1+t2)/2;
943 943
              dim2::Point<double> linend=bez((t1+t2)/2);
944 944
              bez=bez.before((t1+t2)/2);
945 945
//               rn=_nodeSizes[g.source(*e)]*_nodeScale;
946 946
//               node_shape=_nodeShapes[g.source(*e)];
947 947
//               t1=0;t2=1;
948 948
//               for(int i=0;i<INTERPOL_PREC;++i)
949 949
//                 if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape))
950 950
//                   t1=(t1+t2)/2;
951 951
//                 else t2=(t1+t2)/2;
952 952
//               bez=bez.after((t1+t2)/2);
953 953
              os << _arcWidths[*e]*_arcWidthScale << " setlinewidth "
Show 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
#include <lemon/dim2.h>
20 20
#include <iostream>
21 21
#include "test_tools.h"
22 22

	
23 23
using namespace std;
24 24
using namespace lemon;
25 25

	
26 26
int main()
27 27
{
28 28
  typedef dim2::Point<int> Point;
29 29

	
30 30
  Point p;
31 31
  check(p.size()==2, "Wrong dim2::Point initialization.");
32 32

	
33 33
  Point a(1,2);
34 34
  Point b(3,4);
35 35
  check(a[0]==1 && a[1]==2, "Wrong dim2::Point initialization.");
36 36

	
37 37
  p = a+b;
38 38
  check(p.x==4 && p.y==6, "Wrong dim2::Point addition.");
39 39

	
40 40
  p = a-b;
41 41
  check(p.x==-2 && p.y==-2, "Wrong dim2::Point subtraction.");
42 42

	
43 43
  check(a.normSquare()==5,"Wrong dim2::Point norm calculation.");
44 44
  check(a*b==11, "Wrong dim2::Point scalar product.");
45 45

	
46 46
  int l=2;
47 47
  p = a*l;
48 48
  check(p.x==2 && p.y==4, "Wrong dim2::Point multiplication by a scalar.");
49 49

	
50 50
  p = b/l;
51 51
  check(p.x==1 && p.y==2, "Wrong dim2::Point division by a scalar.");
52 52

	
53
  typedef dim2::BoundingBox<int> BB;
54
  BB box1;
55
  check(box1.empty(), "Wrong empty() in dim2::BoundingBox.");
53
  typedef dim2::Box<int> Box;
54
  Box box1;
55
  check(box1.empty(), "Wrong empty() in dim2::Box.");
56 56

	
57 57
  box1.add(a);
58
  check(!box1.empty(), "Wrong empty() in dim2::BoundingBox.");
58
  check(!box1.empty(), "Wrong empty() in dim2::Box.");
59 59
  box1.add(b);
60 60

	
61 61
  check(box1.left()==1 && box1.bottom()==2 &&
62 62
        box1.right()==3 && box1.top()==4,
63
        "Wrong addition of points to dim2::BoundingBox.");
63
        "Wrong addition of points to dim2::Box.");
64 64

	
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::BoundingBox.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::BoundingBox.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::BoundingBox.");
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::Box.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::Box.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::Box.");
68 68

	
69
  BB box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::BoundingBox.");
69
  Box box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::Box.");
71 71
  
72 72
  box2.bottomLeft(Point(2,0));
73 73
  box2.topRight(Point(5,3));
74
  BB box3 = box1 & box2;
74
  Box box3 = box1 & box2;
75 75
  check(!box3.empty() &&
76 76
        box3.left()==2 && box3.bottom()==2 && 
77 77
        box3.right()==3 && box3.top()==3,
78
        "Wrong intersection of two dim2::BoundingBox objects.");
78
        "Wrong intersection of two dim2::Box objects.");
79 79
  
80 80
  box1.add(box2);
81 81
  check(!box1.empty() &&
82 82
        box1.left()==1 && box1.bottom()==0 &&
83 83
        box1.right()==5 && box1.top()==4,
84
        "Wrong addition of two dim2::BoundingBox objects.");
84
        "Wrong addition of two dim2::Box objects.");
85 85

	
86 86
  return 0;
87 87
}
0 comments (0 inline)