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

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

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

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

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

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

	
52 52
  Node n1=g.addNode();
53 53
  Node n2=g.addNode();
Ignore white space 6 line context
... ...
@@ -33,531 +33,518 @@
33 33

	
34 34
The most efficient implementation of diverse applications require the
35 35
usage of different physical graph implementations. These differences
36 36
appear in the size of graph we require to handle, memory or time usage
37 37
limitations or in the set of operations through which the graph can be
38 38
accessed.  LEMON provides several physical graph structures to meet
39 39
the diverging requirements of the possible users.  In order to save on
40 40
running time or on memory usage, some structures may fail to provide
41 41
some graph features like arc/edge or node deletion.
42 42

	
43 43
Alteration of standard containers need a very limited number of
44 44
operations, these together satisfy the everyday requirements.
45 45
In the case of graph structures, different operations are needed which do
46 46
not alter the physical graph, but gives another view. If some nodes or
47 47
arcs have to be hidden or the reverse oriented graph have to be used, then
48 48
this is the case. It also may happen that in a flow implementation
49 49
the residual graph can be accessed by another algorithm, or a node-set
50 50
is to be shrunk for another algorithm.
51 51
LEMON also provides a variety of graphs for these requirements called
52 52
\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
53 53
in conjunction with other graph representations.
54 54

	
55 55
You are free to use the graph structure that fit your requirements
56 56
the best, most graph algorithms and auxiliary data structures can be used
57
with any graph structures.
57
with any graph structure.
58

	
59
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
58 60
*/
59 61

	
60 62
/**
61 63
@defgroup semi_adaptors Semi-Adaptor Classes for Graphs
62 64
@ingroup graphs
63 65
\brief Graph types between real graphs and graph adaptors.
64 66

	
65 67
This group describes some graph types between real graphs and graph adaptors.
66 68
These classes wrap graphs to give new functionality as the adaptors do it.
67 69
On the other hand they are not light-weight structures as the adaptors.
68 70
*/
69 71

	
70 72
/**
71 73
@defgroup maps Maps
72 74
@ingroup datas
73 75
\brief Map structures implemented in LEMON.
74 76

	
75 77
This group describes the map structures implemented in LEMON.
76 78

	
77
LEMON provides several special purpose maps that e.g. combine
79
LEMON provides several special purpose maps and map adaptors that e.g. combine
78 80
new maps from existing ones.
81

	
82
<b>See also:</b> \ref map_concepts "Map Concepts".
79 83
*/
80 84

	
81 85
/**
82 86
@defgroup graph_maps Graph Maps
83 87
@ingroup maps
84 88
\brief Special graph-related maps.
85 89

	
86 90
This group describes maps that are specifically designed to assign
87 91
values to the nodes and arcs of graphs.
88 92
*/
89 93

	
90

	
91 94
/**
92 95
\defgroup map_adaptors Map Adaptors
93 96
\ingroup maps
94 97
\brief Tools to create new maps from existing ones
95 98

	
96 99
This group describes map adaptors that are used to create "implicit"
97 100
maps from other maps.
98 101

	
99 102
Most of them are \ref lemon::concepts::ReadMap "read-only maps".
100 103
They can make arithmetic and logical operations between one or two maps
101 104
(negation, shifting, addition, multiplication, logical 'and', 'or',
102 105
'not' etc.) or e.g. convert a map to another one of different Value type.
103 106

	
104 107
The typical usage of this classes is passing implicit maps to
105 108
algorithms.  If a function type algorithm is called then the function
106 109
type map adaptors can be used comfortable. For example let's see the
107
usage of map adaptors with the \c digraphToEps() function.
110
usage of map adaptors with the \c graphToEps() function.
108 111
\code
109 112
  Color nodeColor(int deg) {
110 113
    if (deg >= 2) {
111 114
      return Color(0.5, 0.0, 0.5);
112 115
    } else if (deg == 1) {
113 116
      return Color(1.0, 0.5, 1.0);
114 117
    } else {
115 118
      return Color(0.0, 0.0, 0.0);
116 119
    }
117 120
  }
118 121

	
119 122
  Digraph::NodeMap<int> degree_map(graph);
120 123

	
121
  digraphToEps(graph, "graph.eps")
124
  graphToEps(graph, "graph.eps")
122 125
    .coords(coords).scaleToA4().undirected()
123 126
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
124 127
    .run();
125 128
\endcode
126 129
The \c functorToMap() function makes an \c int to \c Color map from the
127
\e nodeColor() function. The \c composeMap() compose the \e degree_map
130
\c nodeColor() function. The \c composeMap() compose the \c degree_map
128 131
and the previously created map. The composed map is a proper function to
129 132
get the color of each node.
130 133

	
131 134
The usage with class type algorithms is little bit harder. In this
132 135
case the function type map adaptors can not be used, because the
133 136
function map adaptors give back temporary objects.
134 137
\code
135 138
  Digraph graph;
136 139

	
137 140
  typedef Digraph::ArcMap<double> DoubleArcMap;
138 141
  DoubleArcMap length(graph);
139 142
  DoubleArcMap speed(graph);
140 143

	
141 144
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
142 145
  TimeMap time(length, speed);
143 146

	
144 147
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
145 148
  dijkstra.run(source, target);
146 149
\endcode
147 150
We have a length map and a maximum speed map on the arcs of a digraph.
148 151
The minimum time to pass the arc can be calculated as the division of
149 152
the two maps which can be done implicitly with the \c DivMap template
150 153
class. We use the implicit minimum time map as the length map of the
151 154
\c Dijkstra algorithm.
152 155
*/
153 156

	
154 157
/**
155 158
@defgroup matrices Matrices
156 159
@ingroup datas
157 160
\brief Two dimensional data storages implemented in LEMON.
158 161

	
159 162
This group describes two dimensional data storages implemented in LEMON.
160 163
*/
161 164

	
162 165
/**
163 166
@defgroup paths Path Structures
164 167
@ingroup datas
165 168
\brief Path structures implemented in LEMON.
166 169

	
167 170
This group describes the path structures implemented in LEMON.
168 171

	
169 172
LEMON provides flexible data structures to work with paths.
170 173
All of them have similar interfaces and they can be copied easily with
171 174
assignment operators and copy constructors. This makes it easy and
172 175
efficient to have e.g. the Dijkstra algorithm to store its result in
173 176
any kind of path structure.
174 177

	
175 178
\sa lemon::concepts::Path
176

	
177 179
*/
178 180

	
179 181
/**
180 182
@defgroup auxdat Auxiliary Data Structures
181 183
@ingroup datas
182 184
\brief Auxiliary data structures implemented in LEMON.
183 185

	
184 186
This group describes some data structures implemented in LEMON in
185 187
order to make it easier to implement combinatorial algorithms.
186 188
*/
187 189

	
188

	
189 190
/**
190 191
@defgroup algs Algorithms
191 192
\brief This group describes the several algorithms
192 193
implemented in LEMON.
193 194

	
194 195
This group describes the several algorithms
195 196
implemented in LEMON.
196 197
*/
197 198

	
198 199
/**
199 200
@defgroup search Graph Search
200 201
@ingroup algs
201 202
\brief Common graph search algorithms.
202 203

	
203 204
This group describes the common graph search algorithms like
204
Breadth-first search (Bfs) and Depth-first search (Dfs).
205
Breadth-First Search (BFS) and Depth-First Search (DFS).
205 206
*/
206 207

	
207 208
/**
208
@defgroup shortest_path Shortest Path algorithms
209
@defgroup shortest_path Shortest Path Algorithms
209 210
@ingroup algs
210 211
\brief Algorithms for finding shortest paths.
211 212

	
212 213
This group describes the algorithms for finding shortest paths in graphs.
213 214
*/
214 215

	
215 216
/**
216
@defgroup max_flow Maximum Flow algorithms
217
@defgroup max_flow Maximum Flow Algorithms
217 218
@ingroup algs
218 219
\brief Algorithms for finding maximum flows.
219 220

	
220 221
This group describes the algorithms for finding maximum flows and
221 222
feasible circulations.
222 223

	
223 224
The maximum flow problem is to find a flow between a single source and
224 225
a single target that is maximum. Formally, there is a \f$G=(V,A)\f$
225 226
directed graph, an \f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity
226 227
function and given \f$s, t \in V\f$ source and target node. The
227 228
maximum flow is the \f$f_a\f$ solution of the next optimization problem:
228 229

	
229 230
\f[ 0 \le f_a \le c_a \f]
230 231
\f[ \sum_{v\in\delta^{-}(u)}f_{vu}=\sum_{v\in\delta^{+}(u)}f_{uv}
231 232
\qquad \forall u \in V \setminus \{s,t\}\f]
232 233
\f[ \max \sum_{v\in\delta^{+}(s)}f_{uv} - \sum_{v\in\delta^{-}(s)}f_{vu}\f]
233 234

	
234 235
LEMON contains several algorithms for solving maximum flow problems:
235 236
- \ref lemon::EdmondsKarp "Edmonds-Karp"
236 237
- \ref lemon::Preflow "Goldberg's Preflow algorithm"
237 238
- \ref lemon::DinitzSleatorTarjan "Dinitz's blocking flow algorithm with dynamic trees"
238 239
- \ref lemon::GoldbergTarjan "Preflow algorithm with dynamic trees"
239 240

	
240 241
In most cases the \ref lemon::Preflow "Preflow" algorithm provides the
241 242
fastest method to compute the maximum flow. All impelementations
242 243
provides functions to query the minimum cut, which is the dual linear
243 244
programming problem of the maximum flow.
244

	
245 245
*/
246 246

	
247 247
/**
248
@defgroup min_cost_flow Minimum Cost Flow algorithms
248
@defgroup min_cost_flow Minimum Cost Flow Algorithms
249 249
@ingroup algs
250 250

	
251 251
\brief Algorithms for finding minimum cost flows and circulations.
252 252

	
253 253
This group describes the algorithms for finding minimum cost flows and
254 254
circulations.
255 255
*/
256 256

	
257 257
/**
258
@defgroup min_cut Minimum Cut algorithms
258
@defgroup min_cut Minimum Cut Algorithms
259 259
@ingroup algs
260 260

	
261 261
\brief Algorithms for finding minimum cut in graphs.
262 262

	
263 263
This group describes the algorithms for finding minimum cut in graphs.
264 264

	
265 265
The minimum cut problem is to find a non-empty and non-complete
266 266
\f$X\f$ subset of the vertices with minimum overall capacity on
267 267
outgoing arcs. Formally, there is \f$G=(V,A)\f$ directed graph, an
268 268
\f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
269 269
cut is the \f$X\f$ solution of the next optimization problem:
270 270

	
271 271
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
272 272
\sum_{uv\in A, u\in X, v\not\in X}c_{uv}\f]
273 273

	
274 274
LEMON contains several algorithms related to minimum cut problems:
275 275

	
276 276
- \ref lemon::HaoOrlin "Hao-Orlin algorithm" to calculate minimum cut
277 277
  in directed graphs
278 278
- \ref lemon::NagamochiIbaraki "Nagamochi-Ibaraki algorithm" to
279 279
  calculate minimum cut in undirected graphs
280 280
- \ref lemon::GomoryHuTree "Gomory-Hu tree computation" to calculate all
281 281
  pairs minimum cut in undirected graphs
282 282

	
283 283
If you want to find minimum cut just between two distinict nodes,
284 284
please see the \ref max_flow "Maximum Flow page".
285

	
286 285
*/
287 286

	
288 287
/**
289
@defgroup graph_prop Connectivity and other graph properties
288
@defgroup graph_prop Connectivity and Other Graph Properties
290 289
@ingroup algs
291 290
\brief Algorithms for discovering the graph properties
292 291

	
293 292
This group describes the algorithms for discovering the graph properties
294 293
like connectivity, bipartiteness, euler property, simplicity etc.
295 294

	
296 295
\image html edge_biconnected_components.png
297 296
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
298 297
*/
299 298

	
300 299
/**
301
@defgroup planar Planarity embedding and drawing
300
@defgroup planar Planarity Embedding and Drawing
302 301
@ingroup algs
303 302
\brief Algorithms for planarity checking, embedding and drawing
304 303

	
305 304
This group describes the algorithms for planarity checking,
306 305
embedding and drawing.
307 306

	
308 307
\image html planar.png
309 308
\image latex planar.eps "Plane graph" width=\textwidth
310 309
*/
311 310

	
312 311
/**
313
@defgroup matching Matching algorithms
312
@defgroup matching Matching Algorithms
314 313
@ingroup algs
315 314
\brief Algorithms for finding matchings in graphs and bipartite graphs.
316 315

	
317 316
This group contains algorithm objects and functions to calculate
318 317
matchings in graphs and bipartite graphs. The general matching problem is
319 318
finding a subset of the arcs which does not shares common endpoints.
320 319

	
321 320
There are several different algorithms for calculate matchings in
322 321
graphs.  The matching problems in bipartite graphs are generally
323 322
easier than in general graphs. The goal of the matching optimization
324 323
can be the finding maximum cardinality, maximum weight or minimum cost
325 324
matching. The search can be constrained to find perfect or
326 325
maximum cardinality matching.
327 326

	
328 327
LEMON contains the next algorithms:
329 328
- \ref lemon::MaxBipartiteMatching "MaxBipartiteMatching" Hopcroft-Karp
330 329
  augmenting path algorithm for calculate maximum cardinality matching in
331 330
  bipartite graphs
332 331
- \ref lemon::PrBipartiteMatching "PrBipartiteMatching" Push-Relabel
333 332
  algorithm for calculate maximum cardinality matching in bipartite graphs
334 333
- \ref lemon::MaxWeightedBipartiteMatching "MaxWeightedBipartiteMatching"
335 334
  Successive shortest path algorithm for calculate maximum weighted matching
336 335
  and maximum weighted bipartite matching in bipartite graph
337 336
- \ref lemon::MinCostMaxBipartiteMatching "MinCostMaxBipartiteMatching"
338 337
  Successive shortest path algorithm for calculate minimum cost maximum
339 338
  matching in bipartite graph
340 339
- \ref lemon::MaxMatching "MaxMatching" Edmond's blossom shrinking algorithm
341 340
  for calculate maximum cardinality matching in general graph
342 341
- \ref lemon::MaxWeightedMatching "MaxWeightedMatching" Edmond's blossom
343 342
  shrinking algorithm for calculate maximum weighted matching in general
344 343
  graph
345 344
- \ref lemon::MaxWeightedPerfectMatching "MaxWeightedPerfectMatching"
346 345
  Edmond's blossom shrinking algorithm for calculate maximum weighted
347 346
  perfect matching in general graph
348 347

	
349 348
\image html bipartite_matching.png
350 349
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
351

	
352 350
*/
353 351

	
354 352
/**
355
@defgroup spantree Minimum Spanning Tree algorithms
353
@defgroup spantree Minimum Spanning Tree Algorithms
356 354
@ingroup algs
357 355
\brief Algorithms for finding a minimum cost spanning tree in a graph.
358 356

	
359 357
This group describes the algorithms for finding a minimum cost spanning
360 358
tree in a graph
361 359
*/
362 360

	
363

	
364 361
/**
365
@defgroup auxalg Auxiliary algorithms
362
@defgroup auxalg Auxiliary Algorithms
366 363
@ingroup algs
367 364
\brief Auxiliary algorithms implemented in LEMON.
368 365

	
369 366
This group describes some algorithms implemented in LEMON
370 367
in order to make it easier to implement complex algorithms.
371 368
*/
372 369

	
373 370
/**
374
@defgroup approx Approximation algorithms
371
@defgroup approx Approximation Algorithms
372
@ingroup algs
375 373
\brief Approximation algorithms.
376 374

	
377 375
This group describes the approximation and heuristic algorithms
378 376
implemented in LEMON.
379 377
*/
380 378

	
381 379
/**
382 380
@defgroup gen_opt_group General Optimization Tools
383 381
\brief This group describes some general optimization frameworks
384 382
implemented in LEMON.
385 383

	
386 384
This group describes some general optimization frameworks
387 385
implemented in LEMON.
388

	
389 386
*/
390 387

	
391 388
/**
392
@defgroup lp_group Lp and Mip solvers
389
@defgroup lp_group Lp and Mip Solvers
393 390
@ingroup gen_opt_group
394 391
\brief Lp and Mip solver interfaces for LEMON.
395 392

	
396 393
This group describes Lp and Mip solver interfaces for LEMON. The
397 394
various LP solvers could be used in the same manner with this
398 395
interface.
399

	
400 396
*/
401 397

	
402 398
/**
403
@defgroup lp_utils Tools for Lp and Mip solvers
399
@defgroup lp_utils Tools for Lp and Mip Solvers
404 400
@ingroup lp_group
405 401
\brief Helper tools to the Lp and Mip solvers.
406 402

	
407 403
This group adds some helper tools to general optimization framework
408 404
implemented in LEMON.
409 405
*/
410 406

	
411 407
/**
412 408
@defgroup metah Metaheuristics
413 409
@ingroup gen_opt_group
414 410
\brief Metaheuristics for LEMON library.
415 411

	
416 412
This group describes some metaheuristic optimization tools.
417 413
*/
418 414

	
419 415
/**
420 416
@defgroup utils Tools and Utilities
421 417
\brief Tools and utilities for programming in LEMON
422 418

	
423 419
Tools and utilities for programming in LEMON.
424 420
*/
425 421

	
426 422
/**
427 423
@defgroup gutils Basic Graph Utilities
428 424
@ingroup utils
429 425
\brief Simple basic graph utilities.
430 426

	
431 427
This group describes some simple basic graph utilities.
432 428
*/
433 429

	
434 430
/**
435 431
@defgroup misc Miscellaneous Tools
436 432
@ingroup utils
437 433
\brief Tools for development, debugging and testing.
438 434

	
439 435
This group describes several useful tools for development,
440 436
debugging and testing.
441 437
*/
442 438

	
443 439
/**
444
@defgroup timecount Time measuring and Counting
440
@defgroup timecount Time Measuring and Counting
445 441
@ingroup misc
446 442
\brief Simple tools for measuring the performance of algorithms.
447 443

	
448 444
This group describes simple tools for measuring the performance
449 445
of algorithms.
450 446
*/
451 447

	
452 448
/**
453
@defgroup graphbits Tools for Graph Implementation
454
@ingroup utils
455
\brief Tools to make it easier to create graphs.
456

	
457
This group describes the tools that makes it easier to create graphs and
458
the maps that dynamically update with the graph changes.
459
*/
460

	
461
/**
462 449
@defgroup exceptions Exceptions
463 450
@ingroup utils
464 451
\brief Exceptions defined in LEMON.
465 452

	
466 453
This group describes the exceptions defined in LEMON.
467 454
*/
468 455

	
469 456
/**
470 457
@defgroup io_group Input-Output
471 458
\brief Graph Input-Output methods
472 459

	
473 460
This group describes the tools for importing and exporting graphs
474
and graph related data. Now it supports the LEMON format, the
475
\c DIMACS format and the encapsulated postscript (EPS) format.
461
and graph related data. Now it supports the \ref lgf-format
462
"LEMON Graph Format", the \c DIMACS format and the encapsulated
463
postscript (EPS) format.
476 464
*/
477 465

	
478 466
/**
479 467
@defgroup lemon_io LEMON Input-Output
480 468
@ingroup io_group
481
\brief Reading and writing \ref lgf-format "LEMON Graph Format".
469
\brief Reading and writing LEMON Graph Format.
482 470

	
483 471
This group describes methods for reading and writing
484 472
\ref lgf-format "LEMON Graph Format".
485 473
*/
486 474

	
487 475
/**
488
@defgroup eps_io Postscript exporting
476
@defgroup eps_io Postscript Exporting
489 477
@ingroup io_group
490 478
\brief General \c EPS drawer and graph exporter
491 479

	
492 480
This group describes general \c EPS drawing methods and special
493 481
graph exporting tools.
494 482
*/
495 483

	
496

	
497 484
/**
498 485
@defgroup concept Concepts
499 486
\brief Skeleton classes and concept checking classes
500 487

	
501 488
This group describes the data/algorithm skeletons and concept checking
502 489
classes implemented in LEMON.
503 490

	
504 491
The purpose of the classes in this group is fourfold.
505 492

	
506 493
- These classes contain the documentations of the concepts. In order
507 494
  to avoid document multiplications, an implementation of a concept
508 495
  simply refers to the corresponding concept class.
509 496

	
510 497
- These classes declare every functions, <tt>typedef</tt>s etc. an
511 498
  implementation of the concepts should provide, however completely
512 499
  without implementations and real data structures behind the
513 500
  interface. On the other hand they should provide nothing else. All
514 501
  the algorithms working on a data structure meeting a certain concept
515 502
  should compile with these classes. (Though it will not run properly,
516 503
  of course.) In this way it is easily to check if an algorithm
517 504
  doesn't use any extra feature of a certain implementation.
518 505

	
519 506
- The concept descriptor classes also provide a <em>checker class</em>
520 507
  that makes it possible to check whether a certain implementation of a
521 508
  concept indeed provides all the required features.
522 509

	
523 510
- Finally, They can serve as a skeleton of a new implementation of a concept.
524

	
525 511
*/
526 512

	
527

	
528 513
/**
529 514
@defgroup graph_concepts Graph Structure Concepts
530 515
@ingroup concept
531 516
\brief Skeleton and concept checking classes for graph structures
532 517

	
533 518
This group describes the skeletons and concept checking classes of LEMON's
534 519
graph structures and helper classes used to implement these.
535 520
*/
536 521

	
537
/* --- Unused group
538
@defgroup experimental Experimental Structures and Algorithms
539
This group describes some Experimental structures and algorithms.
540
The stuff here is subject to change.
522
/**
523
@defgroup map_concepts Map Concepts
524
@ingroup concept
525
\brief Skeleton and concept checking classes for maps
526

	
527
This group describes the skeletons and concept checking classes of maps.
541 528
*/
542 529

	
543 530
/**
544 531
\anchor demoprograms
545 532

	
546 533
@defgroup demos Demo programs
547 534

	
548 535
Some demo programs are listed here. Their full source codes can be found in
549 536
the \c demo subdirectory of the source tree.
550 537

	
551 538
It order to compile them, use <tt>--enable-demo</tt> configure option when
552 539
build the library.
553 540
*/
554 541

	
555 542
/**
556 543
@defgroup tools Standalone utility applications
557 544

	
558 545
Some utility applications are listed here.
559 546

	
560 547
The standard compilation procedure (<tt>./configure;make</tt>) will compile
561 548
them, as well.
562 549
*/
563 550

	
Ignore white space 6 line context
... ...
@@ -57,49 +57,49 @@
57 57

	
58 58
\code
59 59
 @nodes
60 60
 label  coordinates  size    title
61 61
 1      (10,20)      10      "First node"
62 62
 2      (80,80)      8       "Second node"
63 63
 3      (40,10)      10      "Third node"
64 64
\endcode
65 65

	
66 66
The \c \@arcs section is very similar to the \c \@nodes section,
67 67
it again starts with a header line describing the names of the maps,
68 68
but the \c "label" map is not obligatory here. The following lines
69 69
describe the arcs. The first two tokens of each line are
70 70
the source and the target node of the arc, respectively, then come the map
71 71
values. The source and target tokens must be node labels.
72 72

	
73 73
\code
74 74
 @arcs
75 75
         capacity
76 76
 1   2   16
77 77
 1   3   12
78 78
 2   3   18
79 79
\endcode
80 80

	
81
The \c \@edges is just a synonym of \c \@arcs. The @arcs section can
81
The \c \@edges is just a synonym of \c \@arcs. The \@arcs section can
82 82
also store the edge set of an undirected graph. In such case there is
83 83
a conventional method for store arc maps in the file, if two columns
84 84
has the same caption with \c '+' and \c '-' prefix, then these columns
85 85
can be regarded as the values of an arc map.
86 86

	
87 87
The \c \@attributes section contains key-value pairs, each line
88 88
consists of two tokens, an attribute name, and then an attribute
89 89
value. The value of the attribute could be also a label value of a
90 90
node or an edge, or even an edge label prefixed with \c '+' or \c '-',
91 91
which regards to the forward or backward directed arc of the
92 92
corresponding edge.
93 93

	
94 94
\code
95 95
 @attributes
96 96
 source 1
97 97
 target 3
98 98
 caption "LEMON test digraph"
99 99
\endcode
100 100

	
101 101
The \e LGF can contain extra sections, but there is no restriction on
102 102
the format of such sections.
103 103

	
104 104
*/
105 105
}
Ignore white space 6 line context
... ...
@@ -29,32 +29,33 @@
29 29
It is a C++ template
30 30
library aimed at combinatorial optimization tasks which
31 31
often involve in working
32 32
with graphs.
33 33

	
34 34
<b>
35 35
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
36 36
project.
37 37
You are free to use it in your commercial or
38 38
non-commercial applications under very permissive
39 39
\ref license "license terms".
40 40
</b>
41 41

	
42 42
\subsection howtoread How to read the documentation
43 43

	
44 44
If you want to get a quick start and see the most important features then
45 45
take a look at our \ref quicktour
46 46
"Quick Tour to LEMON" which will guide you along.
47 47

	
48 48
If you already feel like using our library, see the page that tells you
49 49
\ref getstart "How to start using LEMON".
50 50

	
51 51
If you
52 52
want to see how LEMON works, see
53
some \ref demoprograms "demo programs"!
53
some \ref demoprograms "demo programs".
54 54

	
55 55
If you know what you are looking for then try to find it under the
56 56
<a class="el" href="modules.html">Modules</a>
57 57
section.
58 58

	
59
If you are a user of the old (0.x) series of LEMON, please check out the \ref migration "Migration Guide" for the backward incompatibilities.
59
If you are a user of the old (0.x) series of LEMON, please check out the
60
\ref migration "Migration Guide" for the backward incompatibilities.
60 61
*/
Ignore white space 6 line context
... ...
@@ -36,49 +36,49 @@
36 36
  (instead of \c UGraph) and they have <tt>Edge</tt>s (instead of
37 37
  <tt>UEdge</tt>s). These changes reflected thoroughly everywhere in
38 38
  the library. Namely,
39 39
  - \c Graph -> \c Digraph
40 40
    - \c %ListGraph -> \c ListDigraph, \c %SmartGraph -> \c SmartDigraph etc.
41 41
  - \c UGraph -> \c Graph
42 42
    - \c ListUGraph -> \c ListGraph, \c SmartUGraph -> \c SmartGraph etc.
43 43
  - \c Edge -> \c Arc, \c UEdge -> \c Edge
44 44
  - \c EdgeMap -> \c ArcMap, \c UEdgeMap -> \c EdgeMap
45 45
  - \c EdgeIt -> \c ArcIt, \c UEdgeIt -> \c EdgeIt
46 46
  - Class names and function names containing the words \c graph,
47 47
    \c ugraph, \e edge or \e arc should also be updated.
48 48
- <b>The two endpoints of an (\e undirected) \c Edge can be obtained by the
49 49
  <tt>u()</tt> and <tt>v()</tt> member function of the graph
50 50
  (instead of <tt>source()</tt> and <tt>target()</tt>). This change
51 51
  must be done by hand.</b>
52 52
  \n Of course, you can still use <tt>source()</tt> and <tt>target()</tt>
53 53
  for <tt>Arc</tt>s (directed edges).
54 54

	
55 55
\warning
56 56
<b>The <tt>script/lemon-0.x-to-1.x.sh</tt> tool replaces all instances of
57 57
the words \c graph, \c digraph, \c edge and \c arc, so it replaces them
58 58
in strings, comments etc. as well as in all identifiers.</b>
59 59

	
60
\section migration-lgf LGF tools 
60
\section migration-lgf LGF tools
61 61
 - The \ref lgf-format "LGF file format" has changed,
62 62
   <tt>\@nodeset</tt> has changed to <tt>\@nodes</tt>,
63 63
   <tt>\@edgeset</tt> and <tt>\@uedgeset</tt> to <tt>\@arcs</tt> or
64 64
   <tt>\@edges</tt>, which become completely equivalents. The
65 65
   <tt>\@nodes</tt>, <tt>\@edges</tt> and <tt>\@uedges</tt> sections are
66 66
   removed from the format, the content of them should be
67 67
   the part of <tt>\@attributes</tt> section. The data fields in
68 68
   the sections must follow a strict format, they must be either character
69 69
   sequences without whitespaces or quoted strings.
70 70
 - The <tt>LemonReader</tt> and <tt>LemonWriter</tt> core interfaces
71 71
   are no longer available.
72 72
 - The implementation of the general section readers and writers has changed
73 73
   they are simple functors now. Beside the old
74 74
   stream based section handling, currently line oriented section
75 75
   reading and writing are also supported. In the
76 76
   section readers the lines must be counted manually. The sections
77 77
   should be read and written with the SectionWriter and SectionReader
78 78
   classes.
79 79
 - Instead of the item readers and writers, item converters should be
80 80
   used. The converters are functors, which map the type to
81 81
   std::string or std::string to the type. The converters for standard
82 82
   containers hasn't yet been implemented in the new LEMON. The converters
83 83
   can return strings in any format, because if it is necessary, the LGF
84 84
   writer and reader will quote and unquote the given value.
Ignore white space 6 line context
... ...
@@ -3,479 +3,465 @@
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

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

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

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

	
31 31
namespace lemon {
32 32

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

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

	
102 101
    typedef True Notifier;
103 102

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

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

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

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

	
136 134
      friend class AlterationNotifier;
137 135

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

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

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

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

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

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

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

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

	
195 189
    private:
196 190

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

	
199 193
    protected:
200 194

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

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

	
212
      /// \brief The member function to notificate the observer about
213
      /// more item is added to the container.
214
      ///
215
      /// The add() member function notificates the observer about more item
216
      /// is added to the container. It have to be overrided in the
217
      /// subclasses.
206
      // \brief The member function to notificate the observer about
207
      // more item is added to the container.
208
      //
209
      // The add() member function notificates the observer about more item
210
      // is added to the container. It have to be overrided in the
211
      // subclasses.
218 212
      virtual void add(const std::vector<Item>& items) = 0;
219 213

	
220
      /// \brief The member function to notificate the observer about an
221
      /// item is erased from the container.
222
      ///
223
      /// The erase() member function notificates the observer about an
224
      /// item is erased from the container. It have to be overrided in
225
      /// the subclasses.
214
      // \brief The member function to notificate the observer about an
215
      // item is erased from the container.
216
      //
217
      // The erase() member function notificates the observer about an
218
      // item is erased from the container. It have to be overrided in
219
      // the subclasses.
226 220
      virtual void erase(const Item&) = 0;
227 221

	
228
      /// \brief The member function to notificate the observer about
229
      /// more item is erased from the container.
230
      ///
231
      /// The erase() member function notificates the observer about more item
232
      /// is erased from the container. It have to be overrided in the
233
      /// subclasses.
222
      // \brief The member function to notificate the observer about
223
      // more item is erased from the container.
224
      //
225
      // The erase() member function notificates the observer about more item
226
      // is erased from the container. It have to be overrided in the
227
      // subclasses.
234 228
      virtual void erase(const std::vector<Item>& items) = 0;
235 229

	
236
      /// \brief The member function to notificate the observer about the
237
      /// container is built.
238
      ///
239
      /// The build() member function notificates the observer about the
240
      /// container is built from an empty container. It have to be
241
      /// overrided in the subclasses.
242

	
230
      // \brief The member function to notificate the observer about the
231
      // container is built.
232
      //
233
      // The build() member function notificates the observer about the
234
      // container is built from an empty container. It have to be
235
      // overrided in the subclasses.
243 236
      virtual void build() = 0;
244 237

	
245
      /// \brief The member function to notificate the observer about all
246
      /// items are erased from the container.
247
      ///
248
      /// The clear() member function notificates the observer about all
249
      /// items are erased from the container. It have to be overrided in
250
      /// the subclasses.
238
      // \brief The member function to notificate the observer about all
239
      // items are erased from the container.
240
      //
241
      // The clear() member function notificates the observer about all
242
      // items are erased from the container. It have to be overrided in
243
      // the subclasses.
251 244
      virtual void clear() = 0;
252 245

	
253 246
    };
254 247

	
255 248
  protected:
256 249

	
257 250
    const Container* container;
258 251

	
259 252
    typedef std::list<ObserverBase*> Observers;
260 253
    Observers _observers;
261 254

	
262 255

	
263 256
  public:
264 257

	
265
    /// \brief Default constructor.
266
    ///
267
    /// The default constructor of the AlterationNotifier.
268
    /// It creates an empty notifier.
258
    // \brief Default constructor.
259
    //
260
    // The default constructor of the AlterationNotifier.
261
    // It creates an empty notifier.
269 262
    AlterationNotifier()
270 263
      : container(0) {}
271 264

	
272
    /// \brief Constructor.
273
    ///
274
    /// Constructor with the observed container parameter.
265
    // \brief Constructor.
266
    //
267
    // Constructor with the observed container parameter.
275 268
    AlterationNotifier(const Container& _container)
276 269
      : container(&_container) {}
277 270

	
278
    /// \brief Copy Constructor of the AlterationNotifier.
279
    ///
280
    /// Copy constructor of the AlterationNotifier.
281
    /// It creates only an empty notifier because the copiable
282
    /// notifier's observers have to be registered still into that notifier.
271
    // \brief Copy Constructor of the AlterationNotifier.
272
    //
273
    // Copy constructor of the AlterationNotifier.
274
    // It creates only an empty notifier because the copiable
275
    // notifier's observers have to be registered still into that notifier.
283 276
    AlterationNotifier(const AlterationNotifier& _notifier)
284 277
      : container(_notifier.container) {}
285 278

	
286
    /// \brief Destructor.
287
    ///
288
    /// Destructor of the AlterationNotifier.
289
    ///
279
    // \brief Destructor.
280
    //
281
    // Destructor of the AlterationNotifier.
290 282
    ~AlterationNotifier() {
291 283
      typename Observers::iterator it;
292 284
      for (it = _observers.begin(); it != _observers.end(); ++it) {
293 285
        (*it)->_notifier = 0;
294 286
      }
295 287
    }
296 288

	
297
    /// \brief Sets the container.
298
    ///
299
    /// Sets the container.
289
    // \brief Sets the container.
290
    //
291
    // Sets the container.
300 292
    void setContainer(const Container& _container) {
301 293
      container = &_container;
302 294
    }
303 295

	
304 296
  protected:
305 297

	
306 298
    AlterationNotifier& operator=(const AlterationNotifier&);
307 299

	
308 300
  public:
309 301

	
310

	
311

	
312
    /// \brief First item in the container.
313
    ///
314
    /// Returns the first item in the container. It is
315
    /// for start the iteration on the container.
302
    // \brief First item in the container.
303
    //
304
    // Returns the first item in the container. It is
305
    // for start the iteration on the container.
316 306
    void first(Item& item) const {
317 307
      container->first(item);
318 308
    }
319 309

	
320
    /// \brief Next item in the container.
321
    ///
322
    /// Returns the next item in the container. It is
323
    /// for iterate on the container.
310
    // \brief Next item in the container.
311
    //
312
    // Returns the next item in the container. It is
313
    // for iterate on the container.
324 314
    void next(Item& item) const {
325 315
      container->next(item);
326 316
    }
327 317

	
328
    /// \brief Returns the id of the item.
329
    ///
330
    /// Returns the id of the item provided by the container.
318
    // \brief Returns the id of the item.
319
    //
320
    // Returns the id of the item provided by the container.
331 321
    int id(const Item& item) const {
332 322
      return container->id(item);
333 323
    }
334 324

	
335
    /// \brief Returns the maximum id of the container.
336
    ///
337
    /// Returns the maximum id of the container.
325
    // \brief Returns the maximum id of the container.
326
    //
327
    // Returns the maximum id of the container.
338 328
    int maxId() const {
339 329
      return container->maxId(Item());
340 330
    }
341 331

	
342 332
  protected:
343 333

	
344 334
    void attach(ObserverBase& observer) {
345 335
      observer._index = _observers.insert(_observers.begin(), &observer);
346 336
      observer._notifier = this;
347 337
    }
348 338

	
349 339
    void detach(ObserverBase& observer) {
350 340
      _observers.erase(observer._index);
351 341
      observer._index = _observers.end();
352 342
      observer._notifier = 0;
353 343
    }
354 344

	
355 345
  public:
356 346

	
357
    /// \brief Notifies all the registed observers about an item added to
358
    /// the container.
359
    ///
360
    /// It notifies all the registed observers about an item added to
361
    /// the container.
362
    ///
347
    // \brief Notifies all the registed observers about an item added to
348
    // the container.
349
    //
350
    // It notifies all the registed observers about an item added to
351
    // the container.
363 352
    void add(const Item& item) {
364 353
      typename Observers::reverse_iterator it;
365 354
      try {
366 355
        for (it = _observers.rbegin(); it != _observers.rend(); ++it) {
367 356
          (*it)->add(item);
368 357
        }
369 358
      } catch (...) {
370 359
        typename Observers::iterator jt;
371 360
        for (jt = it.base(); jt != _observers.end(); ++jt) {
372 361
          (*jt)->erase(item);
373 362
        }
374 363
        throw;
375 364
      }
376 365
    }
377 366

	
378
    /// \brief Notifies all the registed observers about more item added to
379
    /// the container.
380
    ///
381
    /// It notifies all the registed observers about more item added to
382
    /// the container.
383
    ///
367
    // \brief Notifies all the registed observers about more item added to
368
    // the container.
369
    //
370
    // It notifies all the registed observers about more item added to
371
    // the container.
384 372
    void add(const std::vector<Item>& items) {
385 373
      typename Observers::reverse_iterator it;
386 374
      try {
387 375
        for (it = _observers.rbegin(); it != _observers.rend(); ++it) {
388 376
          (*it)->add(items);
389 377
        }
390 378
      } catch (...) {
391 379
        typename Observers::iterator jt;
392 380
        for (jt = it.base(); jt != _observers.end(); ++jt) {
393 381
          (*jt)->erase(items);
394 382
        }
395 383
        throw;
396 384
      }
397 385
    }
398 386

	
399
    /// \brief Notifies all the registed observers about an item erased from
400
    /// the container.
401
    ///
402
    /// It notifies all the registed observers about an item erased from
403
    /// the container.
404
    ///
387
    // \brief Notifies all the registed observers about an item erased from
388
    // the container.
389
    //
390
    // It notifies all the registed observers about an item erased from
391
    // the container.
405 392
    void erase(const Item& item) throw() {
406 393
      typename Observers::iterator it = _observers.begin();
407 394
      while (it != _observers.end()) {
408 395
        try {
409 396
          (*it)->erase(item);
410 397
          ++it;
411 398
        } catch (const ImmediateDetach&) {
412 399
          (*it)->_index = _observers.end();
413 400
          (*it)->_notifier = 0;
414 401
          it = _observers.erase(it);
415 402
        }
416 403
      }
417 404
    }
418 405

	
419
    /// \brief Notifies all the registed observers about more item erased
420
    /// from the container.
421
    ///
422
    /// It notifies all the registed observers about more item erased from
423
    /// the container.
424
    ///
406
    // \brief Notifies all the registed observers about more item erased
407
    // from the container.
408
    //
409
    // It notifies all the registed observers about more item erased from
410
    // the container.
425 411
    void erase(const std::vector<Item>& items) {
426 412
      typename Observers::iterator it = _observers.begin();
427 413
      while (it != _observers.end()) {
428 414
        try {
429 415
          (*it)->erase(items);
430 416
          ++it;
431 417
        } catch (const ImmediateDetach&) {
432 418
          (*it)->_index = _observers.end();
433 419
          (*it)->_notifier = 0;
434 420
          it = _observers.erase(it);
435 421
        }
436 422
      }
437 423
    }
438 424

	
439
    /// \brief Notifies all the registed observers about the container is
440
    /// built.
441
    ///
442
    /// Notifies all the registed observers about the container is built
443
    /// from an empty container.
425
    // \brief Notifies all the registed observers about the container is
426
    // built.
427
    //
428
    // Notifies all the registed observers about the container is built
429
    // from an empty container.
444 430
    void build() {
445 431
      typename Observers::reverse_iterator it;
446 432
      try {
447 433
        for (it = _observers.rbegin(); it != _observers.rend(); ++it) {
448 434
          (*it)->build();
449 435
        }
450 436
      } catch (...) {
451 437
        typename Observers::iterator jt;
452 438
        for (jt = it.base(); jt != _observers.end(); ++jt) {
453 439
          (*jt)->clear();
454 440
        }
455 441
        throw;
456 442
      }
457 443
    }
458 444

	
459
    /// \brief Notifies all the registed observers about all items are
460
    /// erased.
461
    ///
462
    /// Notifies all the registed observers about all items are erased
463
    /// from the container.
445
    // \brief Notifies all the registed observers about all items are
446
    // erased.
447
    //
448
    // Notifies all the registed observers about all items are erased
449
    // from the container.
464 450
    void clear() {
465 451
      typename Observers::iterator it = _observers.begin();
466 452
      while (it != _observers.end()) {
467 453
        try {
468 454
          (*it)->clear();
469 455
          ++it;
470 456
        } catch (const ImmediateDetach&) {
471 457
          (*it)->_index = _observers.end();
472 458
          (*it)->_notifier = 0;
473 459
          it = _observers.erase(it);
474 460
        }
475 461
      }
476 462
    }
477 463
  };
478 464

	
479 465
}
480 466

	
481 467
#endif
Ignore white space 6 line context
... ...
@@ -5,330 +5,330 @@
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_ARRAY_MAP_H
20 20
#define LEMON_BITS_ARRAY_MAP_H
21 21

	
22 22
#include <memory>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25
#include <lemon/bits/alteration_notifier.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29
/// \ingroup graphbits
30
/// \file
31
/// \brief Graph map based on the array storage.
29
// \ingroup graphbits
30
// \file
31
// \brief Graph map based on the array storage.
32 32

	
33 33
namespace lemon {
34 34

	
35
  /// \ingroup graphbits
36
  ///
37
  /// \brief Graph map based on the array storage.
38
  ///
39
  /// The ArrayMap template class is graph map structure what
40
  /// automatically updates the map when a key is added to or erased from
41
  /// the map. This map uses the allocators to implement
42
  /// the container functionality.
43
  ///
44
  /// The template parameters are the Graph the current Item type and
45
  /// the Value type of the map.
35
  // \ingroup graphbits
36
  //
37
  // \brief Graph map based on the array storage.
38
  //
39
  // The ArrayMap template class is graph map structure what
40
  // automatically updates the map when a key is added to or erased from
41
  // the map. This map uses the allocators to implement
42
  // the container functionality.
43
  //
44
  // The template parameters are the Graph the current Item type and
45
  // the Value type of the map.
46 46
  template <typename _Graph, typename _Item, typename _Value>
47 47
  class ArrayMap
48 48
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
49 49
  public:
50
    /// The graph type of the maps.
50
    // The graph type of the maps.
51 51
    typedef _Graph Graph;
52
    /// The item type of the map.
52
    // The item type of the map.
53 53
    typedef _Item Item;
54
    /// The reference map tag.
54
    // The reference map tag.
55 55
    typedef True ReferenceMapTag;
56 56

	
57
    /// The key type of the maps.
57
    // The key type of the maps.
58 58
    typedef _Item Key;
59
    /// The value type of the map.
59
    // The value type of the map.
60 60
    typedef _Value Value;
61 61

	
62
    /// The const reference type of the map.
62
    // The const reference type of the map.
63 63
    typedef const _Value& ConstReference;
64
    /// The reference type of the map.
64
    // The reference type of the map.
65 65
    typedef _Value& Reference;
66 66

	
67
    /// The notifier type.
67
    // The notifier type.
68 68
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
69 69

	
70
    /// The MapBase of the Map which imlements the core regisitry function.
70
    // The MapBase of the Map which imlements the core regisitry function.
71 71
    typedef typename Notifier::ObserverBase Parent;
72 72

	
73 73
  private:
74 74
    typedef std::allocator<Value> Allocator;
75 75

	
76 76
  public:
77 77

	
78
    /// \brief Graph initialized map constructor.
79
    ///
80
    /// Graph initialized map constructor.
78
    // \brief Graph initialized map constructor.
79
    //
80
    // Graph initialized map constructor.
81 81
    explicit ArrayMap(const Graph& graph) {
82 82
      Parent::attach(graph.notifier(Item()));
83 83
      allocate_memory();
84 84
      Notifier* nf = Parent::notifier();
85 85
      Item it;
86 86
      for (nf->first(it); it != INVALID; nf->next(it)) {
87 87
        int id = nf->id(it);;
88 88
        allocator.construct(&(values[id]), Value());
89 89
      }
90 90
    }
91 91

	
92
    /// \brief Constructor to use default value to initialize the map.
93
    ///
94
    /// It constructs a map and initialize all of the the map.
92
    // \brief Constructor to use default value to initialize the map.
93
    //
94
    // It constructs a map and initialize all of the the map.
95 95
    ArrayMap(const Graph& graph, const Value& value) {
96 96
      Parent::attach(graph.notifier(Item()));
97 97
      allocate_memory();
98 98
      Notifier* nf = Parent::notifier();
99 99
      Item it;
100 100
      for (nf->first(it); it != INVALID; nf->next(it)) {
101 101
        int id = nf->id(it);;
102 102
        allocator.construct(&(values[id]), value);
103 103
      }
104 104
    }
105 105

	
106 106
  private:
107
    /// \brief Constructor to copy a map of the same map type.
108
    ///
109
    /// Constructor to copy a map of the same map type.
107
    // \brief Constructor to copy a map of the same map type.
108
    //
109
    // Constructor to copy a map of the same map type.
110 110
    ArrayMap(const ArrayMap& copy) : Parent() {
111 111
      if (copy.attached()) {
112 112
        attach(*copy.notifier());
113 113
      }
114 114
      capacity = copy.capacity;
115 115
      if (capacity == 0) return;
116 116
      values = allocator.allocate(capacity);
117 117
      Notifier* nf = Parent::notifier();
118 118
      Item it;
119 119
      for (nf->first(it); it != INVALID; nf->next(it)) {
120 120
        int id = nf->id(it);;
121 121
        allocator.construct(&(values[id]), copy.values[id]);
122 122
      }
123 123
    }
124 124

	
125
    /// \brief Assign operator.
126
    ///
127
    /// This operator assigns for each item in the map the
128
    /// value mapped to the same item in the copied map.
129
    /// The parameter map should be indiced with the same
130
    /// itemset because this assign operator does not change
131
    /// the container of the map.
125
    // \brief Assign operator.
126
    //
127
    // This operator assigns for each item in the map the
128
    // value mapped to the same item in the copied map.
129
    // The parameter map should be indiced with the same
130
    // itemset because this assign operator does not change
131
    // the container of the map.
132 132
    ArrayMap& operator=(const ArrayMap& cmap) {
133 133
      return operator=<ArrayMap>(cmap);
134 134
    }
135 135

	
136 136

	
137
    /// \brief Template assign operator.
138
    ///
139
    /// The given parameter should be conform to the ReadMap
140
    /// concecpt and could be indiced by the current item set of
141
    /// the NodeMap. In this case the value for each item
142
    /// is assigned by the value of the given ReadMap.
137
    // \brief Template assign operator.
138
    //
139
    // The given parameter should be conform to the ReadMap
140
    // concecpt and could be indiced by the current item set of
141
    // the NodeMap. In this case the value for each item
142
    // is assigned by the value of the given ReadMap.
143 143
    template <typename CMap>
144 144
    ArrayMap& operator=(const CMap& cmap) {
145 145
      checkConcept<concepts::ReadMap<Key, _Value>, CMap>();
146 146
      const typename Parent::Notifier* nf = Parent::notifier();
147 147
      Item it;
148 148
      for (nf->first(it); it != INVALID; nf->next(it)) {
149 149
        set(it, cmap[it]);
150 150
      }
151 151
      return *this;
152 152
    }
153 153

	
154 154
  public:
155
    /// \brief The destructor of the map.
156
    ///
157
    /// The destructor of the map.
155
    // \brief The destructor of the map.
156
    //
157
    // The destructor of the map.
158 158
    virtual ~ArrayMap() {
159 159
      if (attached()) {
160 160
        clear();
161 161
        detach();
162 162
      }
163 163
    }
164 164

	
165 165
  protected:
166 166

	
167 167
    using Parent::attach;
168 168
    using Parent::detach;
169 169
    using Parent::attached;
170 170

	
171 171
  public:
172 172

	
173
    /// \brief The subscript operator.
174
    ///
175
    /// The subscript operator. The map can be subscripted by the
176
    /// actual keys of the graph.
173
    // \brief The subscript operator.
174
    //
175
    // The subscript operator. The map can be subscripted by the
176
    // actual keys of the graph.
177 177
    Value& operator[](const Key& key) {
178 178
      int id = Parent::notifier()->id(key);
179 179
      return values[id];
180 180
    }
181 181

	
182
    /// \brief The const subscript operator.
183
    ///
184
    /// The const subscript operator. The map can be subscripted by the
185
    /// actual keys of the graph.
182
    // \brief The const subscript operator.
183
    //
184
    // The const subscript operator. The map can be subscripted by the
185
    // actual keys of the graph.
186 186
    const Value& operator[](const Key& key) const {
187 187
      int id = Parent::notifier()->id(key);
188 188
      return values[id];
189 189
    }
190 190

	
191
    /// \brief Setter function of the map.
192
    ///
193
    /// Setter function of the map. Equivalent with map[key] = val.
194
    /// This is a compatibility feature with the not dereferable maps.
191
    // \brief Setter function of the map.
192
    //
193
    // Setter function of the map. Equivalent with map[key] = val.
194
    // This is a compatibility feature with the not dereferable maps.
195 195
    void set(const Key& key, const Value& val) {
196 196
      (*this)[key] = val;
197 197
    }
198 198

	
199 199
  protected:
200 200

	
201
    /// \brief Adds a new key to the map.
202
    ///
203
    /// It adds a new key to the map. It called by the observer notifier
204
    /// and it overrides the add() member function of the observer base.
201
    // \brief Adds a new key to the map.
202
    //
203
    // It adds a new key to the map. It called by the observer notifier
204
    // and it overrides the add() member function of the observer base.
205 205
    virtual void add(const Key& key) {
206 206
      Notifier* nf = Parent::notifier();
207 207
      int id = nf->id(key);
208 208
      if (id >= capacity) {
209 209
        int new_capacity = (capacity == 0 ? 1 : capacity);
210 210
        while (new_capacity <= id) {
211 211
          new_capacity <<= 1;
212 212
        }
213 213
        Value* new_values = allocator.allocate(new_capacity);
214 214
        Item it;
215 215
        for (nf->first(it); it != INVALID; nf->next(it)) {
216 216
          int jd = nf->id(it);;
217 217
          if (id != jd) {
218 218
            allocator.construct(&(new_values[jd]), values[jd]);
219 219
            allocator.destroy(&(values[jd]));
220 220
          }
221 221
        }
222 222
        if (capacity != 0) allocator.deallocate(values, capacity);
223 223
        values = new_values;
224 224
        capacity = new_capacity;
225 225
      }
226 226
      allocator.construct(&(values[id]), Value());
227 227
    }
228 228

	
229
    /// \brief Adds more new keys to the map.
230
    ///
231
    /// It adds more new keys to the map. It called by the observer notifier
232
    /// and it overrides the add() member function of the observer base.
229
    // \brief Adds more new keys to the map.
230
    //
231
    // It adds more new keys to the map. It called by the observer notifier
232
    // and it overrides the add() member function of the observer base.
233 233
    virtual void add(const std::vector<Key>& keys) {
234 234
      Notifier* nf = Parent::notifier();
235 235
      int max_id = -1;
236 236
      for (int i = 0; i < int(keys.size()); ++i) {
237 237
        int id = nf->id(keys[i]);
238 238
        if (id > max_id) {
239 239
          max_id = id;
240 240
        }
241 241
      }
242 242
      if (max_id >= capacity) {
243 243
        int new_capacity = (capacity == 0 ? 1 : capacity);
244 244
        while (new_capacity <= max_id) {
245 245
          new_capacity <<= 1;
246 246
        }
247 247
        Value* new_values = allocator.allocate(new_capacity);
248 248
        Item it;
249 249
        for (nf->first(it); it != INVALID; nf->next(it)) {
250 250
          int id = nf->id(it);
251 251
          bool found = false;
252 252
          for (int i = 0; i < int(keys.size()); ++i) {
253 253
            int jd = nf->id(keys[i]);
254 254
            if (id == jd) {
255 255
              found = true;
256 256
              break;
257 257
            }
258 258
          }
259 259
          if (found) continue;
260 260
          allocator.construct(&(new_values[id]), values[id]);
261 261
          allocator.destroy(&(values[id]));
262 262
        }
263 263
        if (capacity != 0) allocator.deallocate(values, capacity);
264 264
        values = new_values;
265 265
        capacity = new_capacity;
266 266
      }
267 267
      for (int i = 0; i < int(keys.size()); ++i) {
268 268
        int id = nf->id(keys[i]);
269 269
        allocator.construct(&(values[id]), Value());
270 270
      }
271 271
    }
272 272

	
273
    /// \brief Erase a key from the map.
274
    ///
275
    /// Erase a key from the map. It called by the observer notifier
276
    /// and it overrides the erase() member function of the observer base.
273
    // \brief Erase a key from the map.
274
    //
275
    // Erase a key from the map. It called by the observer notifier
276
    // and it overrides the erase() member function of the observer base.
277 277
    virtual void erase(const Key& key) {
278 278
      int id = Parent::notifier()->id(key);
279 279
      allocator.destroy(&(values[id]));
280 280
    }
281 281

	
282
    /// \brief Erase more keys from the map.
283
    ///
284
    /// Erase more keys from the map. It called by the observer notifier
285
    /// and it overrides the erase() member function of the observer base.
282
    // \brief Erase more keys from the map.
283
    //
284
    // Erase more keys from the map. It called by the observer notifier
285
    // and it overrides the erase() member function of the observer base.
286 286
    virtual void erase(const std::vector<Key>& keys) {
287 287
      for (int i = 0; i < int(keys.size()); ++i) {
288 288
        int id = Parent::notifier()->id(keys[i]);
289 289
        allocator.destroy(&(values[id]));
290 290
      }
291 291
    }
292 292

	
293
    /// \brief Buildes the map.
294
    ///
295
    /// It buildes the map. It called by the observer notifier
296
    /// and it overrides the build() member function of the observer base.
293
    // \brief Buildes the map.
294
    //
295
    // It buildes the map. It called by the observer notifier
296
    // and it overrides the build() member function of the observer base.
297 297
    virtual void build() {
298 298
      Notifier* nf = Parent::notifier();
299 299
      allocate_memory();
300 300
      Item it;
301 301
      for (nf->first(it); it != INVALID; nf->next(it)) {
302 302
        int id = nf->id(it);;
303 303
        allocator.construct(&(values[id]), Value());
304 304
      }
305 305
    }
306 306

	
307
    /// \brief Clear the map.
308
    ///
309
    /// It erase all items from the map. It called by the observer notifier
310
    /// and it overrides the clear() member function of the observer base.
307
    // \brief Clear the map.
308
    //
309
    // It erase all items from the map. It called by the observer notifier
310
    // and it overrides the clear() member function of the observer base.
311 311
    virtual void clear() {
312 312
      Notifier* nf = Parent::notifier();
313 313
      if (capacity != 0) {
314 314
        Item it;
315 315
        for (nf->first(it); it != INVALID; nf->next(it)) {
316 316
          int id = nf->id(it);
317 317
          allocator.destroy(&(values[id]));
318 318
        }
319 319
        allocator.deallocate(values, capacity);
320 320
        capacity = 0;
321 321
      }
322 322
    }
323 323

	
324 324
  private:
325 325

	
326 326
    void allocate_memory() {
327 327
      int max_id = Parent::notifier()->maxId();
328 328
      if (max_id == -1) {
329 329
        capacity = 0;
330 330
        values = 0;
331 331
        return;
332 332
      }
333 333
      capacity = 1;
334 334
      while (capacity <= max_id) {
Ignore white space 6 line context
... ...
@@ -7,125 +7,125 @@
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
///\ingroup digraphbits
32
///\file
33
///\brief Extenders for the digraph types
31
//\ingroup digraphbits
32
//\file
33
//\brief Extenders for the digraph types
34 34
namespace lemon {
35 35

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

	
42 42
  public:
43 43

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

	
48 48
    typedef True UndirectedTag;
49 49

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

	
53 53
    protected:
54 54
      bool forward;
55 55

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

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

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

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

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

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

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

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

	
97
    /// \brief Directed arc from an edge.
98
    ///
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.
97
    // \brief Directed arc from an edge.
98
    //
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 102
    static Arc direct(const Edge &e, bool d) {
103 103
      return Arc(e, d);
104 104
    }
105 105

	
106
    /// Returns whether the given directed arc has the same orientation
107
    /// as the corresponding edge.
106
    // Returns whether the given directed arc has the same orientation
107
    // as the corresponding edge.
108 108
    static bool direction(const Arc &a) { return a.forward; }
109 109

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

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

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

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

	
19 19
#ifndef LEMON_BEZIER_H
20 20
#define LEMON_BEZIER_H
21 21

	
22
///\ingroup misc
23
///\file
24
///\brief Classes to compute with Bezier curves.
25
///
26
///Up to now this file is used internally by \ref graph_to_eps.h
22
//\ingroup misc
23
//\file
24
//\brief Classes to compute with Bezier curves.
25
//
26
//Up to now this file is used internally by \ref graph_to_eps.h
27 27

	
28 28
#include<lemon/dim2.h>
29 29

	
30 30
namespace lemon {
31 31
  namespace dim2 {
32 32

	
33 33
class BezierBase {
34 34
public:
35 35
  typedef lemon::dim2::Point<double> Point;
36 36
protected:
37 37
  static Point conv(Point x,Point y,double t) {return (1-t)*x+t*y;}
38 38
};
39 39

	
40 40
class Bezier1 : public BezierBase
41 41
{
42 42
public:
43 43
  Point p1,p2;
44 44

	
45 45
  Bezier1() {}
46 46
  Bezier1(Point _p1, Point _p2) :p1(_p1), p2(_p2) {}
47 47

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

	
19 19
#ifndef LEMON_BITS_DEFAULT_MAP_H
20 20
#define LEMON_BITS_DEFAULT_MAP_H
21 21

	
22

	
23 22
#include <lemon/bits/array_map.h>
24 23
#include <lemon/bits/vector_map.h>
25 24
//#include <lemon/bits/debug_map.h>
26 25

	
27
///\ingroup graphbits
28
///\file
29
///\brief Graph maps that construct and destruct their elements dynamically.
26
//\ingroup graphbits
27
//\file
28
//\brief Graph maps that construct and destruct their elements dynamically.
30 29

	
31 30
namespace lemon {
32 31

	
33 32

	
34 33
  //#ifndef LEMON_USE_DEBUG_MAP
35 34

	
36 35
  template <typename _Graph, typename _Item, typename _Value>
37 36
  struct DefaultMapSelector {
38 37
    typedef ArrayMap<_Graph, _Item, _Value> Map;
39 38
  };
40 39

	
41 40
  // bool
42 41
  template <typename _Graph, typename _Item>
43 42
  struct DefaultMapSelector<_Graph, _Item, bool> {
44 43
    typedef VectorMap<_Graph, _Item, bool> Map;
45 44
  };
46 45

	
47 46
  // char
48 47
  template <typename _Graph, typename _Item>
49 48
  struct DefaultMapSelector<_Graph, _Item, char> {
50 49
    typedef VectorMap<_Graph, _Item, char> Map;
51 50
  };
52 51

	
53 52
  template <typename _Graph, typename _Item>
... ...
@@ -128,49 +127,49 @@
128 127

	
129 128

	
130 129
  // long double
131 130
  template <typename _Graph, typename _Item>
132 131
  struct DefaultMapSelector<_Graph, _Item, long double> {
133 132
    typedef VectorMap<_Graph, _Item, long double> Map;
134 133
  };
135 134

	
136 135

	
137 136
  // pointer
138 137
  template <typename _Graph, typename _Item, typename _Ptr>
139 138
  struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
140 139
    typedef VectorMap<_Graph, _Item, _Ptr*> Map;
141 140
  };
142 141

	
143 142
// #else
144 143

	
145 144
//   template <typename _Graph, typename _Item, typename _Value>
146 145
//   struct DefaultMapSelector {
147 146
//     typedef DebugMap<_Graph, _Item, _Value> Map;
148 147
//   };
149 148

	
150 149
// #endif
151 150

	
152
  /// \e
151
  // DefaultMap class
153 152
  template <typename _Graph, typename _Item, typename _Value>
154 153
  class DefaultMap
155 154
    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
156 155
  public:
157 156
    typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
158 157
    typedef DefaultMap<_Graph, _Item, _Value> Map;
159 158

	
160 159
    typedef typename Parent::Graph Graph;
161 160
    typedef typename Parent::Value Value;
162 161

	
163 162
    explicit DefaultMap(const Graph& graph) : Parent(graph) {}
164 163
    DefaultMap(const Graph& graph, const Value& value)
165 164
      : Parent(graph, value) {}
166 165

	
167 166
    DefaultMap& operator=(const DefaultMap& cmap) {
168 167
      return operator=<DefaultMap>(cmap);
169 168
    }
170 169

	
171 170
    template <typename CMap>
172 171
    DefaultMap& operator=(const CMap& cmap) {
173 172
      Parent::operator=(cmap);
174 173
      return *this;
175 174
    }
176 175

	
Ignore white space 6 line context
... ...
@@ -14,71 +14,71 @@
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
// This file contains a modified version of the enable_if library from BOOST.
20 20
// See the appropriate copyright notice below.
21 21

	
22 22
// Boost enable_if library
23 23

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

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

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

	
34 34

	
35 35
#ifndef LEMON_BITS_ENABLE_IF_H
36 36
#define LEMON_BITS_ENABLE_IF_H
37 37

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

	
41 41
namespace lemon
42 42
{
43 43

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

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

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

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

	
64 64

	
65 65

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

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

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

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

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

	
83 83

	
84 84
  template <bool B, class T = void>
Ignore white space 6 line context
... ...
@@ -6,56 +6,56 @@
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

	
22 22
#include <lemon/core.h>
23 23

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

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

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

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

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

	
45 45
    // Base extensions
46 46

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

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

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

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

	
... ...
@@ -165,72 +165,72 @@
165 165

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

	
170 170
      InArcIt() { }
171 171

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

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

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

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

	
187 187
    };
188 188

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

	
203
    /// \brief Base node of the iterator
204
    ///
205
    /// Returns the base node (i.e. the target in this case) of the iterator
203
    // \brief Base node of the iterator
204
    //
205
    // Returns the base node (i.e. the target in this case) of the iterator
206 206
    Node baseNode(const InArcIt &arc) const {
207 207
      return Parent::target(arc);
208 208
    }
209
    /// \brief Running node of the iterator
210
    ///
211
    /// Returns the running node (i.e. the source in this case) of the
212
    /// iterator
209
    // \brief Running node of the iterator
210
    //
211
    // Returns the running node (i.e. the source in this case) of the
212
    // iterator
213 213
    Node runningNode(const InArcIt &arc) const {
214 214
      return Parent::source(arc);
215 215
    }
216 216

	
217 217

	
218 218
    template <typename _Value>
219 219
    class NodeMap
220 220
      : public MapExtender<DefaultMap<Digraph, Node, _Value> > {
221 221
    public:
222 222
      typedef DigraphExtender Digraph;
223 223
      typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent;
224 224

	
225 225
      explicit NodeMap(const Digraph& digraph)
226 226
        : Parent(digraph) {}
227 227
      NodeMap(const Digraph& digraph, const _Value& value)
228 228
        : Parent(digraph, value) {}
229 229

	
230 230
    private:
231 231
      NodeMap& operator=(const NodeMap& cmap) {
232 232
        return operator=<NodeMap>(cmap);
233 233
      }
234 234

	
235 235
      template <typename CMap>
236 236
      NodeMap& operator=(const CMap& cmap) {
... ...
@@ -304,51 +304,51 @@
304 304
        Parent::firstIn(arc, node);
305 305
      }
306 306

	
307 307
      notifier(Node()).erase(node);
308 308
      Parent::erase(node);
309 309
    }
310 310

	
311 311
    void erase(const Arc& arc) {
312 312
      notifier(Arc()).erase(arc);
313 313
      Parent::erase(arc);
314 314
    }
315 315

	
316 316
    DigraphExtender() {
317 317
      node_notifier.setContainer(*this);
318 318
      arc_notifier.setContainer(*this);
319 319
    }
320 320

	
321 321

	
322 322
    ~DigraphExtender() {
323 323
      arc_notifier.clear();
324 324
      node_notifier.clear();
325 325
    }
326 326
  };
327 327

	
328
  /// \ingroup _graphbits
329
  ///
330
  /// \brief Extender for the Graphs
328
  // \ingroup _graphbits
329
  //
330
  // \brief Extender for the Graphs
331 331
  template <typename Base>
332 332
  class GraphExtender : public Base {
333 333
  public:
334 334

	
335 335
    typedef Base Parent;
336 336
    typedef GraphExtender Graph;
337 337

	
338 338
    typedef True UndirectedTag;
339 339

	
340 340
    typedef typename Parent::Node Node;
341 341
    typedef typename Parent::Arc Arc;
342 342
    typedef typename Parent::Edge Edge;
343 343

	
344 344
    // Graph extension
345 345

	
346 346
    int maxId(Node) const {
347 347
      return Parent::maxNodeId();
348 348
    }
349 349

	
350 350
    int maxId(Arc) const {
351 351
      return Parent::maxArcId();
352 352
    }
353 353

	
354 354
    int maxId(Edge) const {
... ...
@@ -534,85 +534,85 @@
534 534
      friend class GraphExtender;
535 535
      const Graph* _graph;
536 536
      bool _direction;
537 537
    public:
538 538

	
539 539
      IncEdgeIt() { }
540 540

	
541 541
      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
542 542

	
543 543
      IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) {
544 544
        _graph->firstInc(*this, _direction, node);
545 545
      }
546 546

	
547 547
      IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node)
548 548
        : _graph(&graph), Edge(edge) {
549 549
        _direction = (_graph->source(edge) == node);
550 550
      }
551 551

	
552 552
      IncEdgeIt& operator++() {
553 553
        _graph->nextInc(*this, _direction);
554 554
        return *this;
555 555
      }
556 556
    };
557 557

	
558
    /// \brief Base node of the iterator
559
    ///
560
    /// Returns the base node (ie. the source in this case) of the iterator
558
    // \brief Base node of the iterator
559
    //
560
    // Returns the base node (ie. the source in this case) of the iterator
561 561
    Node baseNode(const OutArcIt &arc) const {
562 562
      return Parent::source(static_cast<const Arc&>(arc));
563 563
    }
564
    /// \brief Running node of the iterator
565
    ///
566
    /// Returns the running node (ie. the target in this case) of the
567
    /// iterator
564
    // \brief Running node of the iterator
565
    //
566
    // Returns the running node (ie. the target in this case) of the
567
    // iterator
568 568
    Node runningNode(const OutArcIt &arc) const {
569 569
      return Parent::target(static_cast<const Arc&>(arc));
570 570
    }
571 571

	
572
    /// \brief Base node of the iterator
573
    ///
574
    /// Returns the base node (ie. the target in this case) of the iterator
572
    // \brief Base node of the iterator
573
    //
574
    // Returns the base node (ie. the target in this case) of the iterator
575 575
    Node baseNode(const InArcIt &arc) const {
576 576
      return Parent::target(static_cast<const Arc&>(arc));
577 577
    }
578
    /// \brief Running node of the iterator
579
    ///
580
    /// Returns the running node (ie. the source in this case) of the
581
    /// iterator
578
    // \brief Running node of the iterator
579
    //
580
    // Returns the running node (ie. the source in this case) of the
581
    // iterator
582 582
    Node runningNode(const InArcIt &arc) const {
583 583
      return Parent::source(static_cast<const Arc&>(arc));
584 584
    }
585 585

	
586
    /// Base node of the iterator
587
    ///
588
    /// Returns the base node of the iterator
586
    // Base node of the iterator
587
    //
588
    // Returns the base node of the iterator
589 589
    Node baseNode(const IncEdgeIt &edge) const {
590 590
      return edge._direction ? u(edge) : v(edge);
591 591
    }
592
    /// Running node of the iterator
593
    ///
594
    /// Returns the running node of the iterator
592
    // Running node of the iterator
593
    //
594
    // Returns the running node of the iterator
595 595
    Node runningNode(const IncEdgeIt &edge) const {
596 596
      return edge._direction ? v(edge) : u(edge);
597 597
    }
598 598

	
599 599
    // Mappable extension
600 600

	
601 601
    template <typename _Value>
602 602
    class NodeMap
603 603
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
604 604
    public:
605 605
      typedef GraphExtender Graph;
606 606
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
607 607

	
608 608
      NodeMap(const Graph& graph)
609 609
        : Parent(graph) {}
610 610
      NodeMap(const Graph& graph, const _Value& value)
611 611
        : Parent(graph, value) {}
612 612

	
613 613
    private:
614 614
      NodeMap& operator=(const NodeMap& cmap) {
615 615
        return operator=<NodeMap>(cmap);
616 616
      }
617 617

	
618 618
      template <typename CMap>
Ignore white space 48 line context
... ...
@@ -5,56 +5,56 @@
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_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25

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

	
29
///\file
30
///\brief Extenders for iterable maps.
29
//\file
30
//\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34
  /// \ingroup graphbits
35
  ///
36
  /// \brief Extender for maps
34
  // \ingroup graphbits
35
  //
36
  // \brief Extender for maps
37 37
  template <typename _Map>
38 38
  class MapExtender : public _Map {
39 39
  public:
40 40

	
41 41
    typedef _Map Parent;
42 42
    typedef MapExtender Map;
43 43

	
44 44

	
45 45
    typedef typename Parent::Graph Graph;
46 46
    typedef typename Parent::Key Item;
47 47

	
48 48
    typedef typename Parent::Key Key;
49 49
    typedef typename Parent::Value Value;
50 50

	
51 51
    class MapIt;
52 52
    class ConstMapIt;
53 53

	
54 54
    friend class MapIt;
55 55
    friend class ConstMapIt;
56 56

	
57 57
  public:
58 58

	
59 59
    MapExtender(const Graph& graph)
60 60
      : Parent(graph) {}
... ...
@@ -150,51 +150,51 @@
150 150
      typedef Item Parent;
151 151

	
152 152
      ItemIt() {}
153 153

	
154 154
      ItemIt(Invalid i) : Parent(i) { }
155 155

	
156 156
      explicit ItemIt(Map& _map) : map(_map) {
157 157
        map.notifier()->first(*this);
158 158
      }
159 159

	
160 160
      ItemIt(const Map& _map, const Item& item)
161 161
        : Parent(item), map(_map) {}
162 162

	
163 163
      ItemIt& operator++() {
164 164
        map.notifier()->next(*this);
165 165
        return *this;
166 166
      }
167 167

	
168 168
    protected:
169 169
      const Map& map;
170 170

	
171 171
    };
172 172
  };
173 173

	
174
  /// \ingroup graphbits
175
  ///
176
  /// \brief Extender for maps which use a subset of the items.
174
  // \ingroup graphbits
175
  //
176
  // \brief Extender for maps which use a subset of the items.
177 177
  template <typename _Graph, typename _Map>
178 178
  class SubMapExtender : public _Map {
179 179
  public:
180 180

	
181 181
    typedef _Map Parent;
182 182
    typedef SubMapExtender Map;
183 183

	
184 184
    typedef _Graph Graph;
185 185

	
186 186
    typedef typename Parent::Key Item;
187 187

	
188 188
    typedef typename Parent::Key Key;
189 189
    typedef typename Parent::Value Value;
190 190

	
191 191
    class MapIt;
192 192
    class ConstMapIt;
193 193

	
194 194
    friend class MapIt;
195 195
    friend class ConstMapIt;
196 196

	
197 197
  public:
198 198

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

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

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

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

	
28 28
namespace lemon {
29 29

	
30 30
  struct InvalidType {};
31 31

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

	
35 35

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

	
48 48
  template <typename _Graph>
Ignore white space 6 line context
... ...
@@ -7,234 +7,234 @@
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

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

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

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

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

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

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

	
56 56
  public:
57 57

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

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

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

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

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

	
83 83

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

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

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

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

	
124 124

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

	
142 142
  public:
143 143

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

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

	
160 160

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

	
168 168
  protected:
169 169

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

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

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

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

	
214
    /// \brief Buildes the map.
215
    ///
216
    /// It buildes the map. It called by the observer notifier
217
    /// and it overrides the build() member function of the observer base.
214
    // \brief Buildes the map.
215
    //
216
    // It buildes the map. It called by the observer notifier
217
    // and it overrides the build() member function of the observer base.
218 218
    virtual void build() {
219 219
      int size = Parent::notifier()->maxId() + 1;
220 220
      container.reserve(size);
221 221
      container.resize(size);
222 222
    }
223 223

	
224
    /// \brief Clear the map.
225
    ///
226
    /// It erase all items from the map. It called by the observer notifier
227
    /// and it overrides the clear() member function of the observer base.
224
    // \brief Clear the map.
225
    //
226
    // It erase all items from the map. It called by the observer notifier
227
    // and it overrides the clear() member function of the observer base.
228 228
    virtual void clear() {
229 229
      container.clear();
230 230
    }
231 231

	
232 232
  private:
233 233

	
234 234
    Container container;
235 235

	
236 236
  };
237 237

	
238 238
}
239 239

	
240 240
#endif
Ignore white space 6 line context
... ...
@@ -71,49 +71,49 @@
71 71
  extern const Color GREEN;
72 72
  /// Blue color constant
73 73
  extern const Color BLUE;
74 74
  /// Yellow color constant
75 75
  extern const Color YELLOW;
76 76
  /// Magenta color constant
77 77
  extern const Color MAGENTA;
78 78
  /// Cyan color constant
79 79
  extern const Color CYAN;
80 80
  /// Grey color constant
81 81
  extern const Color GREY;
82 82
  /// Dark red color constant
83 83
  extern const Color DARK_RED;
84 84
  /// Dark green color constant
85 85
  extern const Color DARK_GREEN;
86 86
  /// Drak blue color constant
87 87
  extern const Color DARK_BLUE;
88 88
  /// Dark yellow color constant
89 89
  extern const Color DARK_YELLOW;
90 90
  /// Dark magenta color constant
91 91
  extern const Color DARK_MAGENTA;
92 92
  /// Dark cyan color constant
93 93
  extern const Color DARK_CYAN;
94 94

	
95
  ///Map <tt>int</tt>s to different \ref Color "Color"s
95
  ///Map <tt>int</tt>s to different <tt>Color</tt>s
96 96

	
97 97
  ///This map assigns one of the predefined \ref Color "Color"s to
98 98
  ///each <tt>int</tt>. It is possible to change the colors as well as
99 99
  ///their number. The integer range is cyclically mapped to the
100 100
  ///provided set of colors.
101 101
  ///
102 102
  ///This is a true \ref concepts::ReferenceMap "reference map", so
103 103
  ///you can also change the actual colors.
104 104

	
105 105
  class Palette : public MapBase<int,Color>
106 106
  {
107 107
    std::vector<Color> colors;
108 108
  public:
109 109
    ///Constructor
110 110

	
111 111
    ///Constructor.
112 112
    ///\param have_white Indicates whether white is among the
113 113
    ///provided initial colors (\c true) or not (\c false). If it is true,
114 114
    ///white will be assigned to \c 0.
115 115
    ///\param num The number of the allocated colors. If it is \c -1,
116 116
    ///the default color configuration is set up (26 color plus optionaly the
117 117
    ///white).  If \c num is less then 26/27 then the default color
118 118
    ///list is cut. Otherwise the color list is filled repeatedly with
119 119
    ///the default color list.  (The colors can be changed later on.)
Ignore white space 6 line context
... ...
@@ -961,49 +961,49 @@
961 961
      ///
962 962
      /// Gives back the arc alteration notifier.
963 963
      EdgeNotifier& notifier(Edge) const {
964 964
        return EdgeNotifier();
965 965
      }
966 966

	
967 967
      template <typename _Graph>
968 968
      struct Constraints {
969 969
        void constraints() {
970 970
          checkConcept<AlterableGraphComponent<Base>, _Graph>();
971 971
          typename _Graph::EdgeNotifier& uen
972 972
            = graph.notifier(typename _Graph::Edge());
973 973
          ignore_unused_variable_warning(uen);
974 974
        }
975 975

	
976 976
        const _Graph& graph;
977 977

	
978 978
      };
979 979

	
980 980
    };
981 981

	
982 982
    /// \brief Class describing the concept of graph maps
983 983
    ///
984 984
    /// This class describes the common interface of the graph maps
985
    /// (NodeMap, ArcMap), that is \ref maps-page "maps" which can be used to
985
    /// (NodeMap, ArcMap), that is maps that can be used to
986 986
    /// associate data to graph descriptors (nodes or arcs).
987 987
    template <typename _Graph, typename _Item, typename _Value>
988 988
    class GraphMap : public ReadWriteMap<_Item, _Value> {
989 989
    public:
990 990

	
991 991
      typedef ReadWriteMap<_Item, _Value> Parent;
992 992

	
993 993
      /// The graph type of the map.
994 994
      typedef _Graph Graph;
995 995
      /// The key type of the map.
996 996
      typedef _Item Key;
997 997
      /// The value type of the map.
998 998
      typedef _Value Value;
999 999

	
1000 1000
      /// \brief Construct a new map.
1001 1001
      ///
1002 1002
      /// Construct a new map for the graph.
1003 1003
      explicit GraphMap(const Graph&) {}
1004 1004
      /// \brief Construct a new map with default value.
1005 1005
      ///
1006 1006
      /// Construct a new map for the graph and initalise the values.
1007 1007
      GraphMap(const Graph&, const Value&) {}
1008 1008

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

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

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

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

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// Readable map concept
37 37

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

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

	
55 55
      template<typename _ReadMap>
56 56
      struct Constraints {
57 57
        void constraints() {
Ignore white space 6 line context
... ...
@@ -1533,49 +1533,49 @@
1533 1533
    ///\param s The source node.
1534 1534
    ///\param t The target node.
1535 1535
    ///\param p The previous arc between \c s and \c t. It it is INVALID or
1536 1536
    ///not given, the operator finds the first appropriate arc.
1537 1537
    ///\return An arc from \c s to \c t after \c p or
1538 1538
    ///\ref INVALID if there is no more.
1539 1539
    ///
1540 1540
    ///For example, you can count the number of arcs from \c u to \c v in the
1541 1541
    ///following way.
1542 1542
    ///\code
1543 1543
    ///DynArcLookUp<ListDigraph> ae(g);
1544 1544
    ///...
1545 1545
    ///int n = 0;
1546 1546
    ///for(Arc a = ae(u,v); a != INVALID; a = ae(u,v,a)) n++;
1547 1547
    ///\endcode
1548 1548
    ///
1549 1549
    ///Finding the arcs take at most <em>O</em>(log<em>d</em>)
1550 1550
    ///amortized time, specifically, the time complexity of the lookups
1551 1551
    ///is equal to the optimal search tree implementation for the
1552 1552
    ///current query distribution in a constant factor.
1553 1553
    ///
1554 1554
    ///\note This is a dynamic data structure, therefore the data
1555 1555
    ///structure is updated after each graph alteration. Thus although
1556 1556
    ///this data structure is theoretically faster than \ref ArcLookUp
1557
    ///and \ref AllArcLookup, it often provides worse performance than
1557
    ///and \ref AllArcLookUp, it often provides worse performance than
1558 1558
    ///them.
1559 1559
    Arc operator()(Node s, Node t, Arc p = INVALID) const  {
1560 1560
      if (p == INVALID) {
1561 1561
        Arc a = _head[s];
1562 1562
        if (a == INVALID) return INVALID;
1563 1563
        Arc r = INVALID;
1564 1564
        while (true) {
1565 1565
          if (_g.target(a) < t) {
1566 1566
            if (_right[a] == INVALID) {
1567 1567
              const_cast<DynArcLookUp&>(*this).splay(a);
1568 1568
              return r;
1569 1569
            } else {
1570 1570
              a = _right[a];
1571 1571
            }
1572 1572
          } else {
1573 1573
            if (_g.target(a) == t) {
1574 1574
              r = a;
1575 1575
            }
1576 1576
            if (_left[a] == INVALID) {
1577 1577
              const_cast<DynArcLookUp&>(*this).splay(a);
1578 1578
              return r;
1579 1579
            } else {
1580 1580
              a = _left[a];
1581 1581
            }
... ...
@@ -1678,50 +1678,50 @@
1678 1678
    {
1679 1679
      std::vector<Arc> v;
1680 1680
      for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
1681 1681
      if(v.size()) {
1682 1682
        std::sort(v.begin(),v.end(),ArcLess(_g));
1683 1683
        _head[n]=refreshRec(v,0,v.size()-1);
1684 1684
      }
1685 1685
      else _head[n]=INVALID;
1686 1686
    }
1687 1687
    ///Refresh the full data structure.
1688 1688

	
1689 1689
    ///Build up the full search database. In fact, it simply calls
1690 1690
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1691 1691
    ///
1692 1692
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
1693 1693
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
1694 1694
    ///out-degree of the digraph.
1695 1695
    void refresh()
1696 1696
    {
1697 1697
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
1698 1698
    }
1699 1699

	
1700 1700
    ///Find an arc between two nodes.
1701 1701

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

	
1721 1721
  };
1722 1722

	
1723 1723
  ///Fast look-up of all arcs between given endpoints.
1724 1724

	
1725 1725
  ///This class is the same as \ref ArcLookUp, with the addition
1726 1726
  ///that it makes it possible to find all parallel arcs between given
1727 1727
  ///endpoints.
... ...
@@ -1796,49 +1796,49 @@
1796 1796
    void refresh()
1797 1797
    {
1798 1798
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
1799 1799
    }
1800 1800

	
1801 1801
    ///Find an arc between two nodes.
1802 1802

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

	
1838 1838
  };
1839 1839

	
1840 1840
  /// @}
1841 1841

	
1842 1842
} //namespace lemon
1843 1843

	
1844 1844
#endif
Ignore white space 6 line context
... ...
@@ -814,49 +814,49 @@
814 814
    }
815 815

	
816 816
    ///The type of the map that stores the distances of the nodes.
817 817

	
818 818
    ///The type of the map that stores the distances of the nodes.
819 819
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
820 820
    typedef typename Digraph::template NodeMap<int> DistMap;
821 821
    ///Instantiates a DistMap.
822 822

	
823 823
    ///This function instantiates a DistMap.
824 824
    ///\param g is the digraph, to which we would like to define
825 825
    ///the DistMap
826 826
    static DistMap *createDistMap(const Digraph &g)
827 827
    {
828 828
      return new DistMap(g);
829 829
    }
830 830

	
831 831
    ///The type of the DFS paths.
832 832

	
833 833
    ///The type of the DFS paths.
834 834
    ///It must meet the \ref concepts::Path "Path" concept.
835 835
    typedef lemon::Path<Digraph> Path;
836 836
  };
837 837

	
838
  /// Default traits class used by \ref DfsWizard
838
  /// Default traits class used by DfsWizard
839 839

	
840 840
  /// To make it easier to use Dfs algorithm
841 841
  /// we have created a wizard class.
842 842
  /// This \ref DfsWizard class needs default traits,
843 843
  /// as well as the \ref Dfs class.
844 844
  /// The \ref DfsWizardBase is a class to be the default traits of the
845 845
  /// \ref DfsWizard class.
846 846
  template<class GR>
847 847
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
848 848
  {
849 849

	
850 850
    typedef DfsWizardDefaultTraits<GR> Base;
851 851
  protected:
852 852
    //The type of the nodes in the digraph.
853 853
    typedef typename Base::Digraph::Node Node;
854 854

	
855 855
    //Pointer to the digraph the algorithm runs on.
856 856
    void *_g;
857 857
    //Pointer to the map of reached nodes.
858 858
    void *_reached;
859 859
    //Pointer to the map of processed nodes.
860 860
    void *_processed;
861 861
    //Pointer to the map of predecessors arcs.
862 862
    void *_pred;
Ignore white space 6 line context
... ...
@@ -432,49 +432,49 @@
432 432
      {
433 433
        return new Heap(R);
434 434
      }
435 435
    };
436 436
    ///\brief \ref named-templ-param "Named parameter" for setting
437 437
    ///heap and cross reference type with automatic allocation
438 438
    ///
439 439
    ///\ref named-templ-param "Named parameter" for setting heap and cross
440 440
    ///reference type. It can allocate the heap and the cross reference
441 441
    ///object if the cross reference's constructor waits for the digraph as
442 442
    ///parameter and the heap's constructor waits for the cross reference.
443 443
    template <class H, class CR = typename Digraph::template NodeMap<int> >
444 444
    struct SetStandardHeap
445 445
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
446 446
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
447 447
      Create;
448 448
    };
449 449

	
450 450
    template <class T>
451 451
    struct SetOperationTraitsTraits : public Traits {
452 452
      typedef T OperationTraits;
453 453
    };
454 454

	
455 455
    /// \brief \ref named-templ-param "Named parameter" for setting
456
    ///\ref OperationTraits type
456
    ///\c OperationTraits type
457 457
    ///
458 458
    ///\ref named-templ-param "Named parameter" for setting
459 459
    ///\ref OperationTraits type.
460 460
    template <class T>
461 461
    struct SetOperationTraits
462 462
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
463 463
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
464 464
      Create;
465 465
    };
466 466

	
467 467
    ///@}
468 468

	
469 469
  protected:
470 470

	
471 471
    Dijkstra() {}
472 472

	
473 473
  public:
474 474

	
475 475
    ///Constructor.
476 476

	
477 477
    ///Constructor.
478 478
    ///\param _g The digraph the algorithm runs on.
479 479
    ///\param _length The length map used by the algorithm.
480 480
    Dijkstra(const Digraph& _g, const LengthMap& _length) :
... ...
@@ -1017,49 +1017,49 @@
1017 1017
    }
1018 1018

	
1019 1019
    ///The type of the map that stores the distances of the nodes.
1020 1020

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

	
1026 1026
    ///This function instantiates a DistMap.
1027 1027
    ///\param g is the digraph, to which we would like to define
1028 1028
    ///the DistMap
1029 1029
    static DistMap *createDistMap(const Digraph &g)
1030 1030
    {
1031 1031
      return new DistMap(g);
1032 1032
    }
1033 1033

	
1034 1034
    ///The type of the shortest paths.
1035 1035

	
1036 1036
    ///The type of the shortest paths.
1037 1037
    ///It must meet the \ref concepts::Path "Path" concept.
1038 1038
    typedef lemon::Path<Digraph> Path;
1039 1039
  };
1040 1040

	
1041
  /// Default traits class used by \ref DijkstraWizard
1041
  /// Default traits class used by DijkstraWizard
1042 1042

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

	
1057 1057
    //Pointer to the digraph the algorithm runs on.
1058 1058
    void *_g;
1059 1059
    //Pointer to the length map.
1060 1060
    void *_length;
1061 1061
    //Pointer to the map of processed nodes.
1062 1062
    void *_processed;
1063 1063
    //Pointer to the map of predecessors arcs.
1064 1064
    void *_pred;
1065 1065
    //Pointer to the map of distances.
Ignore white space 6 line context
... ...
@@ -238,52 +238,52 @@
238 238
  ///Rotate by 180 degrees
239 239

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

	
249 249
  ///Rotate by 270 degrees
250 250

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

	
260 260

	
261 261

	
262
  /// Bounding box of plain vectors (\ref Point points).
262
  /// Bounding box of plain vectors (points).
263 263

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

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

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

	
281 281
      ///Construct a box from two points
282 282

	
283 283
      ///Construct a box from two points.
284 284
      ///\param a The bottom left corner.
285 285
      ///\param b The top right corner.
286 286
      ///\warning The coordinates of the bottom left corner must be no more
287 287
      ///than those of the top right one.
288 288
      Box(Point<T> a,Point<T> b)
289 289
      {
... ...
@@ -552,197 +552,181 @@
552 552
    } else {
553 553
      is.clear();
554 554
    }
555 555
    if (!(is >> p)) return is;
556 556
    b.topRight(p);
557 557
    if (is >> c) {
558 558
      if (c != ')') is.putback(c);
559 559
    } else {
560 560
      is.clear();
561 561
    }
562 562
    return is;
563 563
  }
564 564

	
565 565
  ///Write a box to a stream
566 566

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

	
576
  ///Map of x-coordinates of a \ref Point "Point"-map
576
  ///Map of x-coordinates of a <tt>Point</tt>-map
577 577

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

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

	
595
  ///Returns an \ref XMap class
594
  ///Returns an XMap class
596 595

	
597
  ///This function just returns an \ref XMap class.
598
  ///
599
  ///\ingroup maps
596
  ///This function just returns an XMap class.
600 597
  ///\relates XMap
601 598
  template<class M>
602 599
  inline XMap<M> xMap(M &m)
603 600
  {
604 601
    return XMap<M>(m);
605 602
  }
606 603

	
607 604
  template<class M>
608 605
  inline XMap<M> xMap(const M &m)
609 606
  {
610 607
    return XMap<M>(m);
611 608
  }
612 609

	
613
  ///Constant (read only) version of \ref XMap
610
  ///Constant (read only) version of XMap
614 611

	
615
  ///\ingroup maps
616
  ///Constant (read only) version of \ref XMap
612
  ///Constant (read only) version of XMap.
617 613
  ///
618 614
  template<class M>
619 615
  class ConstXMap
620 616
  {
621 617
    const M& _map;
622 618
  public:
623 619

	
624 620
    typedef typename M::Value::Value Value;
625 621
    typedef typename M::Key Key;
626 622
    ///\e
627 623
    ConstXMap(const M &map) : _map(map) {}
628 624
    Value operator[](Key k) const {return _map[k].x;}
629 625
  };
630 626

	
631
  ///Returns a \ref ConstXMap class
627
  ///Returns a ConstXMap class
632 628

	
633
  ///This function just returns a \ref ConstXMap class.
634
  ///
635
  ///\ingroup maps
629
  ///This function just returns a ConstXMap class.
636 630
  ///\relates ConstXMap
637 631
  template<class M>
638 632
  inline ConstXMap<M> xMap(const M &m)
639 633
  {
640 634
    return ConstXMap<M>(m);
641 635
  }
642 636

	
643
  ///Map of y-coordinates of a \ref Point "Point"-map
637
  ///Map of y-coordinates of a <tt>Point</tt>-map
644 638

	
645
  ///\ingroup maps
646 639
  ///Map of y-coordinates of a \ref Point "Point"-map.
647 640
  ///
648 641
  template<class M>
649 642
  class YMap
650 643
  {
651 644
    M& _map;
652 645
  public:
653 646

	
654 647
    typedef typename M::Value::Value Value;
655 648
    typedef typename M::Key Key;
656 649
    ///\e
657 650
    YMap(M& map) : _map(map) {}
658 651
    Value operator[](Key k) const {return _map[k].y;}
659 652
    void set(Key k,Value v) {_map.set(k,typename M::Value(_map[k].x,v));}
660 653
  };
661 654

	
662
  ///Returns a \ref YMap class
655
  ///Returns a YMap class
663 656

	
664
  ///This function just returns a \ref YMap class.
665
  ///
666
  ///\ingroup maps
657
  ///This function just returns a YMap class.
667 658
  ///\relates YMap
668 659
  template<class M>
669 660
  inline YMap<M> yMap(M &m)
670 661
  {
671 662
    return YMap<M>(m);
672 663
  }
673 664

	
674 665
  template<class M>
675 666
  inline YMap<M> yMap(const M &m)
676 667
  {
677 668
    return YMap<M>(m);
678 669
  }
679 670

	
680
  ///Constant (read only) version of \ref YMap
671
  ///Constant (read only) version of YMap
681 672

	
682
  ///\ingroup maps
683
  ///Constant (read only) version of \ref YMap
673
  ///Constant (read only) version of YMap.
684 674
  ///
685 675
  template<class M>
686 676
  class ConstYMap
687 677
  {
688 678
    const M& _map;
689 679
  public:
690 680

	
691 681
    typedef typename M::Value::Value Value;
692 682
    typedef typename M::Key Key;
693 683
    ///\e
694 684
    ConstYMap(const M &map) : _map(map) {}
695 685
    Value operator[](Key k) const {return _map[k].y;}
696 686
  };
697 687

	
698
  ///Returns a \ref ConstYMap class
688
  ///Returns a ConstYMap class
699 689

	
700
  ///This function just returns a \ref ConstYMap class.
701
  ///
702
  ///\ingroup maps
690
  ///This function just returns a ConstYMap class.
703 691
  ///\relates ConstYMap
704 692
  template<class M>
705 693
  inline ConstYMap<M> yMap(const M &m)
706 694
  {
707 695
    return ConstYMap<M>(m);
708 696
  }
709 697

	
710 698

	
711
  ///\brief Map of the \ref Point::normSquare() "normSquare()"
712
  ///of a \ref Point "Point"-map
699
  ///\brief Map of the normSquare() of a <tt>Point</tt>-map
713 700
  ///
714 701
  ///Map of the \ref Point::normSquare() "normSquare()"
715 702
  ///of a \ref Point "Point"-map.
716
  ///\ingroup maps
717 703
  template<class M>
718 704
  class NormSquareMap
719 705
  {
720 706
    const M& _map;
721 707
  public:
722 708

	
723 709
    typedef typename M::Value::Value Value;
724 710
    typedef typename M::Key Key;
725 711
    ///\e
726 712
    NormSquareMap(const M &map) : _map(map) {}
727 713
    Value operator[](Key k) const {return _map[k].normSquare();}
728 714
  };
729 715

	
730
  ///Returns a \ref NormSquareMap class
716
  ///Returns a NormSquareMap class
731 717

	
732
  ///This function just returns a \ref NormSquareMap class.
733
  ///
734
  ///\ingroup maps
718
  ///This function just returns a NormSquareMap class.
735 719
  ///\relates NormSquareMap
736 720
  template<class M>
737 721
  inline NormSquareMap<M> normSquareMap(const M &m)
738 722
  {
739 723
    return NormSquareMap<M>(m);
740 724
  }
741 725

	
742 726
  /// @}
743 727

	
744 728
  } //namespce dim2
745 729

	
746 730
} //namespace lemon
747 731

	
748 732
#endif //LEMON_DIM2_H
Ignore white space 6 line context
... ...
@@ -41,49 +41,49 @@
41 41
#include<lemon/color.h>
42 42
#include<lemon/bits/bezier.h>
43 43
#include<lemon/error.h>
44 44

	
45 45

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

	
50 50
namespace lemon {
51 51

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

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

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

	
81 81

	
82 82
  const Graph &g;
83 83

	
84 84
  std::ostream& os;
85 85

	
86 86
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
87 87
  CoordsMapType _coords;
88 88
  ConstMap<typename Graph::Node,double > _nodeSizes;
89 89
  ConstMap<typename Graph::Node,int > _nodeShapes;
Ignore white space 6 line context
... ...
@@ -392,49 +392,49 @@
392 392
    ///
393 393
    /// \warning An Arc pointing to a removed item
394 394
    /// could become valid again later if new nodes are
395 395
    /// added to the graph.
396 396
    bool valid(Arc a) const { return Parent::valid(a); }
397 397

	
398 398
    /// Change the target of \c a to \c n
399 399

	
400 400
    /// Change the target of \c a to \c n
401 401
    ///
402 402
    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
403 403
    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
404 404
    ///invalidated.
405 405
    ///
406 406
    ///\warning This functionality cannot be used together with the Snapshot
407 407
    ///feature.
408 408
    void changeTarget(Arc a, Node n) {
409 409
      Parent::changeTarget(a,n);
410 410
    }
411 411
    /// Change the source of \c a to \c n
412 412

	
413 413
    /// Change the source of \c a to \c n
414 414
    ///
415 415
    ///\note The <tt>InArcIt</tt>s referencing the changed arc remain
416
    ///valid. However the <tt>ArcIt<tt>s and <tt>OutArcIt</tt>s are
416
    ///valid. However the <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s are
417 417
    ///invalidated.
418 418
    ///
419 419
    ///\warning This functionality cannot be used together with the Snapshot
420 420
    ///feature.
421 421
    void changeSource(Arc a, Node n) {
422 422
      Parent::changeSource(a,n);
423 423
    }
424 424

	
425 425
    /// Invert the direction of an arc.
426 426

	
427 427
    ///\note The <tt>ArcIt</tt>s referencing the changed arc remain
428 428
    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
429 429
    ///invalidated.
430 430
    ///
431 431
    ///\warning This functionality cannot be used together with the Snapshot
432 432
    ///feature.
433 433
    void reverseArc(Arc e) {
434 434
      Node t=target(e);
435 435
      changeTarget(e,source(e));
436 436
      changeSource(e,t);
437 437
    }
438 438

	
439 439
    /// Reserve memory for nodes.
440 440

	
Ignore white space 6 line context
... ...
@@ -22,49 +22,49 @@
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25 25

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

	
28 28
///\file
29 29
///\ingroup maps
30 30
///\brief Miscellaneous property maps
31 31

	
32 32
#include <map>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup maps
37 37
  /// @{
38 38

	
39 39
  /// Base class of maps.
40 40

	
41 41
  /// Base class of maps. It provides the necessary type definitions
42 42
  /// required by the map %concepts.
43 43
  template<typename K, typename V>
44 44
  class MapBase {
45 45
  public:
46
    /// \biref The key type of the map.
46
    /// \brief The key type of the map.
47 47
    typedef K Key;
48 48
    /// \brief The value type of the map.
49 49
    /// (The type of objects associated with the keys).
50 50
    typedef V Value;
51 51
  };
52 52

	
53 53

	
54 54
  /// Null map. (a.k.a. DoNothingMap)
55 55

	
56 56
  /// This map can be used if you have to provide a map only for
57 57
  /// its type definitions, or if you have to provide a writable map,
58 58
  /// but data written to it is not required (i.e. it will be sent to
59 59
  /// <tt>/dev/null</tt>).
60 60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 61
  ///
62 62
  /// \sa ConstMap
63 63
  template<typename K, typename V>
64 64
  class NullMap : public MapBase<K, V> {
65 65
  public:
66 66
    typedef MapBase<K, V> Parent;
67 67
    typedef typename Parent::Key Key;
68 68
    typedef typename Parent::Value Value;
69 69

	
70 70
    /// Gives back a default constructed element.
... ...
@@ -1662,48 +1662,53 @@
1662 1662
  /// <tt>m1[x]<m2[x]</tt>.
1663 1663
  ///
1664 1664
  /// \relates LessMap
1665 1665
  template<typename M1, typename M2>
1666 1666
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1667 1667
    return LessMap<M1, M2>(m1,m2);
1668 1668
  }
1669 1669

	
1670 1670
  namespace _maps_bits {
1671 1671

	
1672 1672
    template <typename _Iterator, typename Enable = void>
1673 1673
    struct IteratorTraits {
1674 1674
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1675 1675
    };
1676 1676

	
1677 1677
    template <typename _Iterator>
1678 1678
    struct IteratorTraits<_Iterator,
1679 1679
      typename exists<typename _Iterator::container_type>::type>
1680 1680
    {
1681 1681
      typedef typename _Iterator::container_type::value_type Value;
1682 1682
    };
1683 1683

	
1684 1684
  }
1685 1685

	
1686
  /// @}
1687

	
1688
  /// \addtogroup maps
1689
  /// @{
1690

	
1686 1691
  /// \brief Writable bool map for logging each \c true assigned element
1687 1692
  ///
1688 1693
  /// A \ref concepts::WriteMap "writable" bool map for logging
1689 1694
  /// each \c true assigned element, i.e it copies subsequently each
1690 1695
  /// keys set to \c true to the given iterator.
1691 1696
  /// The most important usage of it is storing certain nodes or arcs
1692 1697
  /// that were marked \c true by an algorithm.
1693 1698
  ///
1694 1699
  /// There are several algorithms that provide solutions through bool
1695 1700
  /// maps and most of them assign \c true at most once for each key.
1696 1701
  /// In these cases it is a natural request to store each \c true
1697 1702
  /// assigned elements (in order of the assignment), which can be
1698 1703
  /// easily done with LoggerBoolMap.
1699 1704
  ///
1700 1705
  /// The simplest way of using this map is through the loggerBoolMap()
1701 1706
  /// function.
1702 1707
  ///
1703 1708
  /// \tparam It The type of the iterator.
1704 1709
  /// \tparam Ke The key type of the map. The default value set
1705 1710
  /// according to the iterator type should work in most cases.
1706 1711
  ///
1707 1712
  /// \note The container of the iterator must contain enough space
1708 1713
  /// for the elements or the iterator should be an inserter iterator.
1709 1714
#ifdef DOXYGEN
... ...
@@ -1754,48 +1759,53 @@
1754 1759
  /// For example it makes easier to store the nodes in the processing
1755 1760
  /// order of Dfs algorithm, as the following examples show.
1756 1761
  /// \code
1757 1762
  ///   std::vector<Node> v;
1758 1763
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1759 1764
  /// \endcode
1760 1765
  /// \code
1761 1766
  ///   std::vector<Node> v(countNodes(g));
1762 1767
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1763 1768
  /// \endcode
1764 1769
  ///
1765 1770
  /// \note The container of the iterator must contain enough space
1766 1771
  /// for the elements or the iterator should be an inserter iterator.
1767 1772
  ///
1768 1773
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1769 1774
  /// it cannot be used when a readable map is needed, for example as
1770 1775
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1771 1776
  ///
1772 1777
  /// \relates LoggerBoolMap
1773 1778
  template<typename Iterator>
1774 1779
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1775 1780
    return LoggerBoolMap<Iterator>(it);
1776 1781
  }
1777 1782

	
1783
  /// @}
1784

	
1785
  /// \addtogroup graph_maps
1786
  /// @{
1787

	
1778 1788
  /// Provides an immutable and unique id for each item in the graph.
1779 1789

	
1780 1790
  /// The IdMap class provides a unique and immutable id for each item of the
1781 1791
  /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1782 1792
  /// different items (nodes) get different ids <li>\b immutable: the id of an
1783 1793
  /// item (node) does not change (even if you delete other nodes).  </ul>
1784 1794
  /// Through this map you get access (i.e. can read) the inner id values of
1785 1795
  /// the items stored in the graph. This map can be inverted with its member
1786 1796
  /// class \c InverseMap or with the \c operator() member.
1787 1797
  ///
1788 1798
  template <typename _Graph, typename _Item>
1789 1799
  class IdMap {
1790 1800
  public:
1791 1801
    typedef _Graph Graph;
1792 1802
    typedef int Value;
1793 1803
    typedef _Item Item;
1794 1804
    typedef _Item Key;
1795 1805

	
1796 1806
    /// \brief Constructor.
1797 1807
    ///
1798 1808
    /// Constructor of the map.
1799 1809
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1800 1810

	
1801 1811
    /// \brief Gives back the \e id of the item.
... ...
@@ -1861,50 +1871,48 @@
1861 1871
  /// \tparam _Graph The graph type.
1862 1872
  /// \tparam _Item The item type of the graph.
1863 1873
  /// \tparam _Value The value type of the map.
1864 1874
  ///
1865 1875
  /// \see IterableValueMap
1866 1876
  template <typename _Graph, typename _Item, typename _Value>
1867 1877
  class InvertableMap
1868 1878
    : protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
1869 1879
  private:
1870 1880

	
1871 1881
    typedef typename ItemSetTraits<_Graph, _Item>::
1872 1882
    template Map<_Value>::Type Map;
1873 1883
    typedef _Graph Graph;
1874 1884

	
1875 1885
    typedef std::map<_Value, _Item> Container;
1876 1886
    Container _inv_map;
1877 1887

	
1878 1888
  public:
1879 1889

	
1880 1890
    /// The key type of InvertableMap (Node, Arc, Edge).
1881 1891
    typedef typename Map::Key Key;
1882 1892
    /// The value type of the InvertableMap.
1883 1893
    typedef typename Map::Value Value;
1884 1894

	
1885

	
1886

	
1887 1895
    /// \brief Constructor.
1888 1896
    ///
1889 1897
    /// Construct a new InvertableMap for the graph.
1890 1898
    ///
1891 1899
    explicit InvertableMap(const Graph& graph) : Map(graph) {}
1892 1900

	
1893 1901
    /// \brief Forward iterator for values.
1894 1902
    ///
1895 1903
    /// This iterator is an stl compatible forward
1896 1904
    /// iterator on the values of the map. The values can
1897 1905
    /// be accessed in the [beginValue, endValue) range.
1898 1906
    ///
1899 1907
    class ValueIterator
1900 1908
      : public std::iterator<std::forward_iterator_tag, Value> {
1901 1909
      friend class InvertableMap;
1902 1910
    private:
1903 1911
      ValueIterator(typename Container::const_iterator _it)
1904 1912
        : it(_it) {}
1905 1913
    public:
1906 1914

	
1907 1915
      ValueIterator() {}
1908 1916

	
1909 1917
      ValueIterator& operator++() { ++it; return *this; }
1910 1918
      ValueIterator operator++(int) {
... ...
@@ -2028,50 +2036,48 @@
2028 2036
      /// The value type of the InverseMap.
2029 2037
      typedef typename InvertableMap::Key Value;
2030 2038
      /// The key type of the InverseMap.
2031 2039
      typedef typename InvertableMap::Value Key;
2032 2040

	
2033 2041
      /// \brief Subscript operator.
2034 2042
      ///
2035 2043
      /// Subscript operator. It gives back always the item
2036 2044
      /// what was last assigned to the value.
2037 2045
      Value operator[](const Key& key) const {
2038 2046
        return _inverted(key);
2039 2047
      }
2040 2048

	
2041 2049
    private:
2042 2050
      const InvertableMap& _inverted;
2043 2051
    };
2044 2052

	
2045 2053
    /// \brief It gives back the just readable inverse map.
2046 2054
    ///
2047 2055
    /// It gives back the just readable inverse map.
2048 2056
    InverseMap inverse() const {
2049 2057
      return InverseMap(*this);
2050 2058
    }
2051 2059

	
2052

	
2053

	
2054 2060
  };
2055 2061

	
2056 2062
  /// \brief Provides a mutable, continuous and unique descriptor for each
2057 2063
  /// item in the graph.
2058 2064
  ///
2059 2065
  /// The DescriptorMap class provides a unique and continuous (but mutable)
2060 2066
  /// descriptor (id) for each item of the same type (e.g. node) in the
2061 2067
  /// graph. This id is <ul><li>\b unique: different items (nodes) get
2062 2068
  /// different ids <li>\b continuous: the range of the ids is the set of
2063 2069
  /// integers between 0 and \c n-1, where \c n is the number of the items of
2064 2070
  /// this type (e.g. nodes) (so the id of a node can change if you delete an
2065 2071
  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
2066 2072
  /// with its member class \c InverseMap, or with the \c operator() member.
2067 2073
  ///
2068 2074
  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
2069 2075
  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
2070 2076
  /// Edge.
2071 2077
  template <typename _Graph, typename _Item>
2072 2078
  class DescriptorMap
2073 2079
    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
2074 2080

	
2075 2081
    typedef _Item Item;
2076 2082
    typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map;
2077 2083

	
... ...
@@ -2245,166 +2251,166 @@
2245 2251
    };
2246 2252

	
2247 2253
    /// \brief Gives back the inverse of the map.
2248 2254
    ///
2249 2255
    /// Gives back the inverse of the map.
2250 2256
    const InverseMap inverse() const {
2251 2257
      return InverseMap(*this);
2252 2258
    }
2253 2259
  };
2254 2260

	
2255 2261
  /// \brief Returns the source of the given arc.
2256 2262
  ///
2257 2263
  /// The SourceMap gives back the source Node of the given arc.
2258 2264
  /// \see TargetMap
2259 2265
  template <typename Digraph>
2260 2266
  class SourceMap {
2261 2267
  public:
2262 2268

	
2263 2269
    typedef typename Digraph::Node Value;
2264 2270
    typedef typename Digraph::Arc Key;
2265 2271

	
2266 2272
    /// \brief Constructor
2267 2273
    ///
2268 2274
    /// Constructor
2269
    /// \param _digraph The digraph that the map belongs to.
2275
    /// \param digraph The digraph that the map belongs to.
2270 2276
    explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
2271 2277

	
2272 2278
    /// \brief The subscript operator.
2273 2279
    ///
2274 2280
    /// The subscript operator.
2275 2281
    /// \param arc The arc
2276 2282
    /// \return The source of the arc
2277 2283
    Value operator[](const Key& arc) const {
2278 2284
      return _digraph.source(arc);
2279 2285
    }
2280 2286

	
2281 2287
  private:
2282 2288
    const Digraph& _digraph;
2283 2289
  };
2284 2290

	
2285 2291
  /// \brief Returns a \c SourceMap class.
2286 2292
  ///
2287 2293
  /// This function just returns an \c SourceMap class.
2288 2294
  /// \relates SourceMap
2289 2295
  template <typename Digraph>
2290 2296
  inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
2291 2297
    return SourceMap<Digraph>(digraph);
2292 2298
  }
2293 2299

	
2294 2300
  /// \brief Returns the target of the given arc.
2295 2301
  ///
2296 2302
  /// The TargetMap gives back the target Node of the given arc.
2297 2303
  /// \see SourceMap
2298 2304
  template <typename Digraph>
2299 2305
  class TargetMap {
2300 2306
  public:
2301 2307

	
2302 2308
    typedef typename Digraph::Node Value;
2303 2309
    typedef typename Digraph::Arc Key;
2304 2310

	
2305 2311
    /// \brief Constructor
2306 2312
    ///
2307 2313
    /// Constructor
2308
    /// \param _digraph The digraph that the map belongs to.
2314
    /// \param digraph The digraph that the map belongs to.
2309 2315
    explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
2310 2316

	
2311 2317
    /// \brief The subscript operator.
2312 2318
    ///
2313 2319
    /// The subscript operator.
2314 2320
    /// \param e The arc
2315 2321
    /// \return The target of the arc
2316 2322
    Value operator[](const Key& e) const {
2317 2323
      return _digraph.target(e);
2318 2324
    }
2319 2325

	
2320 2326
  private:
2321 2327
    const Digraph& _digraph;
2322 2328
  };
2323 2329

	
2324 2330
  /// \brief Returns a \c TargetMap class.
2325 2331
  ///
2326 2332
  /// This function just returns a \c TargetMap class.
2327 2333
  /// \relates TargetMap
2328 2334
  template <typename Digraph>
2329 2335
  inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
2330 2336
    return TargetMap<Digraph>(digraph);
2331 2337
  }
2332 2338

	
2333 2339
  /// \brief Returns the "forward" directed arc view of an edge.
2334 2340
  ///
2335 2341
  /// Returns the "forward" directed arc view of an edge.
2336 2342
  /// \see BackwardMap
2337 2343
  template <typename Graph>
2338 2344
  class ForwardMap {
2339 2345
  public:
2340 2346

	
2341 2347
    typedef typename Graph::Arc Value;
2342 2348
    typedef typename Graph::Edge Key;
2343 2349

	
2344 2350
    /// \brief Constructor
2345 2351
    ///
2346 2352
    /// Constructor
2347
    /// \param _graph The graph that the map belongs to.
2353
    /// \param graph The graph that the map belongs to.
2348 2354
    explicit ForwardMap(const Graph& graph) : _graph(graph) {}
2349 2355

	
2350 2356
    /// \brief The subscript operator.
2351 2357
    ///
2352 2358
    /// The subscript operator.
2353 2359
    /// \param key An edge
2354 2360
    /// \return The "forward" directed arc view of edge
2355 2361
    Value operator[](const Key& key) const {
2356 2362
      return _graph.direct(key, true);
2357 2363
    }
2358 2364

	
2359 2365
  private:
2360 2366
    const Graph& _graph;
2361 2367
  };
2362 2368

	
2363 2369
  /// \brief Returns a \c ForwardMap class.
2364 2370
  ///
2365 2371
  /// This function just returns an \c ForwardMap class.
2366 2372
  /// \relates ForwardMap
2367 2373
  template <typename Graph>
2368 2374
  inline ForwardMap<Graph> forwardMap(const Graph& graph) {
2369 2375
    return ForwardMap<Graph>(graph);
2370 2376
  }
2371 2377

	
2372 2378
  /// \brief Returns the "backward" directed arc view of an edge.
2373 2379
  ///
2374 2380
  /// Returns the "backward" directed arc view of an edge.
2375 2381
  /// \see ForwardMap
2376 2382
  template <typename Graph>
2377 2383
  class BackwardMap {
2378 2384
  public:
2379 2385

	
2380 2386
    typedef typename Graph::Arc Value;
2381 2387
    typedef typename Graph::Edge Key;
2382 2388

	
2383 2389
    /// \brief Constructor
2384 2390
    ///
2385 2391
    /// Constructor
2386
    /// \param _graph The graph that the map belongs to.
2392
    /// \param graph The graph that the map belongs to.
2387 2393
    explicit BackwardMap(const Graph& graph) : _graph(graph) {}
2388 2394

	
2389 2395
    /// \brief The subscript operator.
2390 2396
    ///
2391 2397
    /// The subscript operator.
2392 2398
    /// \param key An edge
2393 2399
    /// \return The "backward" directed arc view of edge
2394 2400
    Value operator[](const Key& key) const {
2395 2401
      return _graph.direct(key, false);
2396 2402
    }
2397 2403

	
2398 2404
  private:
2399 2405
    const Graph& _graph;
2400 2406
  };
2401 2407

	
2402 2408
  /// \brief Returns a \c BackwardMap class
2403 2409

	
2404 2410
  /// This function just returns a \c BackwardMap class.
2405 2411
  /// \relates BackwardMap
2406 2412
  template <typename Graph>
2407 2413
  inline BackwardMap<Graph> backwardMap(const Graph& graph) {
2408 2414
    return BackwardMap<Graph>(graph);
2409 2415
  }
2410 2416

	
Ignore white space 6 line context
... ...
@@ -828,49 +828,49 @@
828 828

	
829 829
    private:
830 830
      const StaticPath *path;
831 831
      int idx;
832 832
    };
833 833

	
834 834
    /// \brief The nth arc.
835 835
    ///
836 836
    /// \pre n is in the [0..length() - 1] range
837 837
    const Arc& nth(int n) const {
838 838
      return arcs[n];
839 839
    }
840 840

	
841 841
    /// \brief The arc iterator pointing to the nth arc.
842 842
    ArcIt nthIt(int n) const {
843 843
      return ArcIt(*this, n);
844 844
    }
845 845

	
846 846
    /// \brief The length of the path.
847 847
    int length() const { return len; }
848 848

	
849 849
    /// \brief Return true when the path is empty.
850 850
    int empty() const { return len == 0; }
851 851

	
852
    /// \break Erase all arcs in the digraph.
852
    /// \brief Erase all arcs in the digraph.
853 853
    void clear() {
854 854
      len = 0;
855 855
      if (arcs) delete[] arcs;
856 856
      arcs = 0;
857 857
    }
858 858

	
859 859
    /// \brief The first arc of the path.
860 860
    const Arc& front() const {
861 861
      return arcs[0];
862 862
    }
863 863

	
864 864
    /// \brief The last arc of the path.
865 865
    const Arc& back() const {
866 866
      return arcs[len - 1];
867 867
    }
868 868

	
869 869

	
870 870
    typedef True BuildTag;
871 871

	
872 872
    template <typename CPath>
873 873
    void build(const CPath& path) {
874 874
      len = path.length();
875 875
      arcs = new Arc[len];
876 876
      int index = 0;
Ignore white space 6 line context
... ...
@@ -344,61 +344,61 @@
344 344
    ///a later state, in other word you cannot add again the arcs deleted
345 345
    ///by restore() using another one Snapshot instance.
346 346
    ///
347 347
    ///\warning If you do not use correctly the snapshot that can cause
348 348
    ///either broken program, invalid state of the digraph, valid but
349 349
    ///not the restored digraph or no change. Because the runtime performance
350 350
    ///the validity of the snapshot is not stored.
351 351
    class Snapshot
352 352
    {
353 353
      SmartDigraph *_graph;
354 354
    protected:
355 355
      friend class SmartDigraph;
356 356
      unsigned int node_num;
357 357
      unsigned int arc_num;
358 358
    public:
359 359
      ///Default constructor.
360 360

	
361 361
      ///Default constructor.
362 362
      ///To actually make a snapshot you must call save().
363 363
      ///
364 364
      Snapshot() : _graph(0) {}
365 365
      ///Constructor that immediately makes a snapshot
366 366

	
367 367
      ///This constructor immediately makes a snapshot of the digraph.
368
      ///\param _g The digraph we make a snapshot of.
368
      ///\param graph The digraph we make a snapshot of.
369 369
      Snapshot(SmartDigraph &graph) : _graph(&graph) {
370 370
        node_num=_graph->nodes.size();
371 371
        arc_num=_graph->arcs.size();
372 372
      }
373 373

	
374 374
      ///Make a snapshot.
375 375

	
376 376
      ///Make a snapshot of the digraph.
377 377
      ///
378 378
      ///This function can be called more than once. In case of a repeated
379 379
      ///call, the previous snapshot gets lost.
380
      ///\param _g The digraph we make the snapshot of.
380
      ///\param graph The digraph we make the snapshot of.
381 381
      void save(SmartDigraph &graph)
382 382
      {
383 383
        _graph=&graph;
384 384
        node_num=_graph->nodes.size();
385 385
        arc_num=_graph->arcs.size();
386 386
      }
387 387

	
388 388
      ///Undo the changes until a snapshot.
389 389

	
390 390
      ///Undo the changes until a snapshot created by save().
391 391
      ///
392 392
      ///\note After you restored a state, you cannot restore
393 393
      ///a later state, in other word you cannot add again the arcs deleted
394 394
      ///by restore().
395 395
      void restore()
396 396
      {
397 397
        _graph->restoreSnapshot(*this);
398 398
      }
399 399
    };
400 400
  };
401 401

	
402 402

	
403 403
  class SmartGraphBase {
404 404

	
... ...
@@ -754,59 +754,59 @@
754 754
    ///a later state, in other word you cannot add again the arcs deleted
755 755
    ///by restore() using another one Snapshot instance.
756 756
    ///
757 757
    ///\warning If you do not use correctly the snapshot that can cause
758 758
    ///either broken program, invalid state of the digraph, valid but
759 759
    ///not the restored digraph or no change. Because the runtime performance
760 760
    ///the validity of the snapshot is not stored.
761 761
    class Snapshot
762 762
    {
763 763
      SmartGraph *_graph;
764 764
    protected:
765 765
      friend class SmartGraph;
766 766
      unsigned int node_num;
767 767
      unsigned int arc_num;
768 768
    public:
769 769
      ///Default constructor.
770 770

	
771 771
      ///Default constructor.
772 772
      ///To actually make a snapshot you must call save().
773 773
      ///
774 774
      Snapshot() : _graph(0) {}
775 775
      ///Constructor that immediately makes a snapshot
776 776

	
777 777
      ///This constructor immediately makes a snapshot of the digraph.
778
      ///\param g The digraph we make a snapshot of.
778
      ///\param graph The digraph we make a snapshot of.
779 779
      Snapshot(SmartGraph &graph) {
780 780
        graph.saveSnapshot(*this);
781 781
      }
782 782

	
783 783
      ///Make a snapshot.
784 784

	
785 785
      ///Make a snapshot of the graph.
786 786
      ///
787 787
      ///This function can be called more than once. In case of a repeated
788 788
      ///call, the previous snapshot gets lost.
789
      ///\param g The digraph we make the snapshot of.
789
      ///\param graph The digraph we make the snapshot of.
790 790
      void save(SmartGraph &graph)
791 791
      {
792 792
        graph.saveSnapshot(*this);
793 793
      }
794 794

	
795 795
      ///Undo the changes until a snapshot.
796 796

	
797 797
      ///Undo the changes until a snapshot created by save().
798 798
      ///
799 799
      ///\note After you restored a state, you cannot restore
800 800
      ///a later state, in other word you cannot add again the arcs deleted
801 801
      ///by restore().
802 802
      void restore()
803 803
      {
804 804
        _graph->restoreSnapshot(*this);
805 805
      }
806 806
    };
807 807
  };
808 808

	
809 809
} //namespace lemon
810 810

	
811 811

	
812 812
#endif //LEMON_SMART_GRAPH_H
Ignore white space 6 line context
... ...
@@ -290,54 +290,53 @@
290 290
  ///distorted results.
291 291
  ///
292 292
  ///\note If you want to measure the running time of the execution of a certain
293 293
  ///function, consider the usage of \ref TimeReport instead.
294 294
  ///
295 295
  ///\sa TimeReport
296 296
  class Timer
297 297
  {
298 298
    int _running; //Timer is running iff _running>0; (_running>=0 always holds)
299 299
    TimeStamp start_time; //This is the relativ start-time if the timer
300 300
                          //is _running, the collected _running time otherwise.
301 301

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

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

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

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

	
321 320
    ///@{
322 321

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

	
325 324
    ///This function resets and stops the time counters
326 325
    ///\sa restart()
327 326
    void reset()
328 327
    {
329 328
      _running=0;
330 329
      _reset();
331 330
    }
332 331

	
333 332
    ///Start the time counters
334 333

	
335 334
    ///This function starts the time counters.
336 335
    ///
337 336
    ///If the timer is started more than ones, it will remain running
338 337
    ///until the same amount of \ref stop() is called.
339 338
    ///\sa stop()
340 339
    void start()
341 340
    {
342 341
      if(_running) _running++;
343 342
      else {
... ...
@@ -451,83 +450,83 @@
451 450
    double realTime() const
452 451
    {
453 452
      return operator TimeStamp().realTime();
454 453
    }
455 454
    ///Computes the ellapsed time
456 455

	
457 456
    ///This conversion computes the ellapsed time, therefore you can print
458 457
    ///the ellapsed time like this.
459 458
    ///\code
460 459
    ///  Timer t;
461 460
    ///  doSomething();
462 461
    ///  std::cout << t << '\n';
463 462
    ///\endcode
464 463
    operator TimeStamp () const
465 464
    {
466 465
      TimeStamp t;
467 466
      t.stamp();
468 467
      return _running?t-start_time:start_time;
469 468
    }
470 469

	
471 470

	
472 471
    ///@}
473 472
  };
474 473

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

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

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

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

	
509
  ///'Do nothing' version of \ref TimeReport
508
  ///'Do nothing' version of TimeReport
510 509

	
511 510
  ///\sa TimeReport
512 511
  ///
513 512
  class NoTimeReport
514 513
  {
515 514
  public:
516 515
    ///\e
517 516
    NoTimeReport(std::string,std::ostream &,bool) {}
518 517
    ///\e
519 518
    NoTimeReport(std::string,std::ostream &) {}
520 519
    ///\e
521 520
    NoTimeReport(std::string) {}
522 521
    ///\e Do nothing.
523 522
    ~NoTimeReport() {}
524 523

	
525 524
    operator TimeStamp () const { return TimeStamp(); }
526 525
    void reset() {}
527 526
    void start() {}
528 527
    void stop() {}
529 528
    void halt() {}
530 529
    int running() { return 0; }
531 530
    void restart() {}
532 531
    double userTime() const { return 0; }
533 532
    double systemTime() const { return 0; }
0 comments (0 inline)