gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Various doc improvements (#248) - Rename all the ugly template parameters (too long and/or starting with an underscore). - Rename function parameters starting with an underscore. - Extend the doc for many classes. - Use LaTeX-style O(...) expressions only for the complicated ones. - A lot of small unification changes. - Small fixes. - Some other improvements.
0 33 0
default
33 files changed:
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -11,25 +11,25 @@
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
namespace lemon {
20 20

	
21 21
/**
22 22
@defgroup datas Data Structures
23
This group describes the several data structures implemented in LEMON.
23
This group contains the several data structures implemented in LEMON.
24 24
*/
25 25

	
26 26
/**
27 27
@defgroup graphs Graph Structures
28 28
@ingroup datas
29 29
\brief Graph structures implemented in LEMON.
30 30

	
31 31
The implementation of combinatorial algorithms heavily relies on
32 32
efficient graph implementations. LEMON offers data structures which are
33 33
planned to be easily used in an experimental phase of implementation studies,
34 34
and thereafter the program code can be made efficient by small modifications.
35 35

	
... ...
@@ -133,60 +133,60 @@
133 133
int algorithm1(const ListDigraph& g) {
134 134
  ReverseDigraph<const ListDigraph> rg(g);
135 135
  return algorithm2(rg);
136 136
}
137 137
\endcode
138 138
*/
139 139

	
140 140
/**
141 141
@defgroup semi_adaptors Semi-Adaptor Classes for Graphs
142 142
@ingroup graphs
143 143
\brief Graph types between real graphs and graph adaptors.
144 144

	
145
This group describes some graph types between real graphs and graph adaptors.
145
This group contains some graph types between real graphs and graph adaptors.
146 146
These classes wrap graphs to give new functionality as the adaptors do it.
147 147
On the other hand they are not light-weight structures as the adaptors.
148 148
*/
149 149

	
150 150
/**
151 151
@defgroup maps Maps
152 152
@ingroup datas
153 153
\brief Map structures implemented in LEMON.
154 154

	
155
This group describes the map structures implemented in LEMON.
155
This group contains the map structures implemented in LEMON.
156 156

	
157 157
LEMON provides several special purpose maps and map adaptors that e.g. combine
158 158
new maps from existing ones.
159 159

	
160 160
<b>See also:</b> \ref map_concepts "Map Concepts".
161 161
*/
162 162

	
163 163
/**
164 164
@defgroup graph_maps Graph Maps
165 165
@ingroup maps
166 166
\brief Special graph-related maps.
167 167

	
168
This group describes maps that are specifically designed to assign
168
This group contains maps that are specifically designed to assign
169 169
values to the nodes and arcs/edges of graphs.
170 170

	
171 171
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
172 172
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
173 173
*/
174 174

	
175 175
/**
176 176
\defgroup map_adaptors Map Adaptors
177 177
\ingroup maps
178 178
\brief Tools to create new maps from existing ones
179 179

	
180
This group describes map adaptors that are used to create "implicit"
180
This group contains map adaptors that are used to create "implicit"
181 181
maps from other maps.
182 182

	
183 183
Most of them are \ref concepts::ReadMap "read-only maps".
184 184
They can make arithmetic and logical operations between one or two maps
185 185
(negation, shifting, addition, multiplication, logical 'and', 'or',
186 186
'not' etc.) or e.g. convert a map to another one of different Value type.
187 187

	
188 188
The typical usage of this classes is passing implicit maps to
189 189
algorithms.  If a function type algorithm is called then the function
190 190
type map adaptors can be used comfortable. For example let's see the
191 191
usage of map adaptors with the \c graphToEps() function.
192 192
\code
... ...
@@ -231,97 +231,97 @@
231 231
We have a length map and a maximum speed map on the arcs of a digraph.
232 232
The minimum time to pass the arc can be calculated as the division of
233 233
the two maps which can be done implicitly with the \c DivMap template
234 234
class. We use the implicit minimum time map as the length map of the
235 235
\c Dijkstra algorithm.
236 236
*/
237 237

	
238 238
/**
239 239
@defgroup matrices Matrices
240 240
@ingroup datas
241 241
\brief Two dimensional data storages implemented in LEMON.
242 242

	
243
This group describes two dimensional data storages implemented in LEMON.
243
This group contains two dimensional data storages implemented in LEMON.
244 244
*/
245 245

	
246 246
/**
247 247
@defgroup paths Path Structures
248 248
@ingroup datas
249 249
\brief %Path structures implemented in LEMON.
250 250

	
251
This group describes the path structures implemented in LEMON.
251
This group contains the path structures implemented in LEMON.
252 252

	
253 253
LEMON provides flexible data structures to work with paths.
254 254
All of them have similar interfaces and they can be copied easily with
255 255
assignment operators and copy constructors. This makes it easy and
256 256
efficient to have e.g. the Dijkstra algorithm to store its result in
257 257
any kind of path structure.
258 258

	
259 259
\sa lemon::concepts::Path
260 260
*/
261 261

	
262 262
/**
263 263
@defgroup auxdat Auxiliary Data Structures
264 264
@ingroup datas
265 265
\brief Auxiliary data structures implemented in LEMON.
266 266

	
267
This group describes some data structures implemented in LEMON in
267
This group contains some data structures implemented in LEMON in
268 268
order to make it easier to implement combinatorial algorithms.
269 269
*/
270 270

	
271 271
/**
272 272
@defgroup algs Algorithms
273
\brief This group describes the several algorithms
273
\brief This group contains the several algorithms
274 274
implemented in LEMON.
275 275

	
276
This group describes the several algorithms
276
This group contains the several algorithms
277 277
implemented in LEMON.
278 278
*/
279 279

	
280 280
/**
281 281
@defgroup search Graph Search
282 282
@ingroup algs
283 283
\brief Common graph search algorithms.
284 284

	
285
This group describes the common graph search algorithms, namely
285
This group contains the common graph search algorithms, namely
286 286
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
287 287
*/
288 288

	
289 289
/**
290 290
@defgroup shortest_path Shortest Path Algorithms
291 291
@ingroup algs
292 292
\brief Algorithms for finding shortest paths.
293 293

	
294
This group describes the algorithms for finding shortest paths in digraphs.
294
This group contains the algorithms for finding shortest paths in digraphs.
295 295

	
296 296
 - \ref Dijkstra algorithm for finding shortest paths from a source node
297 297
   when all arc lengths are non-negative.
298 298
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
299 299
   from a source node when arc lenghts can be either positive or negative,
300 300
   but the digraph should not contain directed cycles with negative total
301 301
   length.
302 302
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
303 303
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
304 304
   lenghts can be either positive or negative, but the digraph should
305 305
   not contain directed cycles with negative total length.
306 306
 - \ref Suurballe A successive shortest path algorithm for finding
307 307
   arc-disjoint paths between two nodes having minimum total length.
308 308
*/
309 309

	
310 310
/**
311 311
@defgroup max_flow Maximum Flow Algorithms
312 312
@ingroup algs
313 313
\brief Algorithms for finding maximum flows.
314 314

	
315
This group describes the algorithms for finding maximum flows and
315
This group contains the algorithms for finding maximum flows and
316 316
feasible circulations.
317 317

	
318 318
The \e maximum \e flow \e problem is to find a flow of maximum value between
319 319
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
320 320
digraph, a \f$cap:A\rightarrow\mathbf{R}^+_0\f$ capacity function and
321 321
\f$s, t \in V\f$ source and target nodes.
322 322
A maximum flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of the
323 323
following optimization problem.
324 324

	
325 325
\f[ \max\sum_{a\in\delta_{out}(s)}f(a) - \sum_{a\in\delta_{in}(s)}f(a) \f]
326 326
\f[ \sum_{a\in\delta_{out}(v)} f(a) = \sum_{a\in\delta_{in}(v)} f(a)
327 327
    \qquad \forall v\in V\setminus\{s,t\} \f]
... ...
@@ -336,25 +336,25 @@
336 336
In most cases the \ref Preflow "Preflow" algorithm provides the
337 337
fastest method for computing a maximum flow. All implementations
338 338
provides functions to also query the minimum cut, which is the dual
339 339
problem of the maximum flow.
340 340
*/
341 341

	
342 342
/**
343 343
@defgroup min_cost_flow Minimum Cost Flow Algorithms
344 344
@ingroup algs
345 345

	
346 346
\brief Algorithms for finding minimum cost flows and circulations.
347 347

	
348
This group describes the algorithms for finding minimum cost flows and
348
This group contains the algorithms for finding minimum cost flows and
349 349
circulations.
350 350

	
351 351
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
352 352
minimum total cost from a set of supply nodes to a set of demand nodes
353 353
in a network with capacity constraints and arc costs.
354 354
Formally, let \f$G=(V,A)\f$ be a digraph,
355 355
\f$lower, upper: A\rightarrow\mathbf{Z}^+_0\f$ denote the lower and
356 356
upper bounds for the flow values on the arcs,
357 357
\f$cost: A\rightarrow\mathbf{Z}^+_0\f$ denotes the cost per unit flow
358 358
on the arcs, and
359 359
\f$supply: V\rightarrow\mathbf{Z}\f$ denotes the supply/demand values
360 360
of the nodes.
... ...
@@ -373,66 +373,66 @@
373 373
 - \ref CostScaling Push-relabel and augment-relabel algorithms based on
374 374
   cost scaling.
375 375
 - \ref NetworkSimplex Primal network simplex algorithm with various
376 376
   pivot strategies.
377 377
*/
378 378

	
379 379
/**
380 380
@defgroup min_cut Minimum Cut Algorithms
381 381
@ingroup algs
382 382

	
383 383
\brief Algorithms for finding minimum cut in graphs.
384 384

	
385
This group describes the algorithms for finding minimum cut in graphs.
385
This group contains the algorithms for finding minimum cut in graphs.
386 386

	
387 387
The \e minimum \e cut \e problem is to find a non-empty and non-complete
388 388
\f$X\f$ subset of the nodes with minimum overall capacity on
389 389
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
390 390
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
391 391
cut is the \f$X\f$ solution of the next optimization problem:
392 392

	
393 393
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
394 394
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
395 395

	
396 396
LEMON contains several algorithms related to minimum cut problems:
397 397

	
398 398
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
399 399
  in directed graphs.
400 400
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
401 401
  calculating minimum cut in undirected graphs.
402
- \ref GomoryHuTree "Gomory-Hu tree computation" for calculating
402
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
403 403
  all-pairs minimum cut in undirected graphs.
404 404

	
405 405
If you want to find minimum cut just between two distinict nodes,
406 406
see the \ref max_flow "maximum flow problem".
407 407
*/
408 408

	
409 409
/**
410 410
@defgroup graph_prop Connectivity and Other Graph Properties
411 411
@ingroup algs
412 412
\brief Algorithms for discovering the graph properties
413 413

	
414
This group describes the algorithms for discovering the graph properties
414
This group contains the algorithms for discovering the graph properties
415 415
like connectivity, bipartiteness, euler property, simplicity etc.
416 416

	
417 417
\image html edge_biconnected_components.png
418 418
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
419 419
*/
420 420

	
421 421
/**
422 422
@defgroup planar Planarity Embedding and Drawing
423 423
@ingroup algs
424 424
\brief Algorithms for planarity checking, embedding and drawing
425 425

	
426
This group describes the algorithms for planarity checking,
426
This group contains the algorithms for planarity checking,
427 427
embedding and drawing.
428 428

	
429 429
\image html planar.png
430 430
\image latex planar.eps "Plane graph" width=\textwidth
431 431
*/
432 432

	
433 433
/**
434 434
@defgroup matching Matching Algorithms
435 435
@ingroup algs
436 436
\brief Algorithms for finding matchings in graphs and bipartite graphs.
437 437

	
438 438
This group contains algorithm objects and functions to calculate
... ...
@@ -465,172 +465,172 @@
465 465
  Edmond's blossom shrinking algorithm for calculating maximum weighted
466 466
  perfect matching in general graphs.
467 467

	
468 468
\image html bipartite_matching.png
469 469
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
470 470
*/
471 471

	
472 472
/**
473 473
@defgroup spantree Minimum Spanning Tree Algorithms
474 474
@ingroup algs
475 475
\brief Algorithms for finding a minimum cost spanning tree in a graph.
476 476

	
477
This group describes the algorithms for finding a minimum cost spanning
477
This group contains the algorithms for finding a minimum cost spanning
478 478
tree in a graph.
479 479
*/
480 480

	
481 481
/**
482 482
@defgroup auxalg Auxiliary Algorithms
483 483
@ingroup algs
484 484
\brief Auxiliary algorithms implemented in LEMON.
485 485

	
486
This group describes some algorithms implemented in LEMON
486
This group contains some algorithms implemented in LEMON
487 487
in order to make it easier to implement complex algorithms.
488 488
*/
489 489

	
490 490
/**
491 491
@defgroup approx Approximation Algorithms
492 492
@ingroup algs
493 493
\brief Approximation algorithms.
494 494

	
495
This group describes the approximation and heuristic algorithms
495
This group contains the approximation and heuristic algorithms
496 496
implemented in LEMON.
497 497
*/
498 498

	
499 499
/**
500 500
@defgroup gen_opt_group General Optimization Tools
501
\brief This group describes some general optimization frameworks
501
\brief This group contains some general optimization frameworks
502 502
implemented in LEMON.
503 503

	
504
This group describes some general optimization frameworks
504
This group contains some general optimization frameworks
505 505
implemented in LEMON.
506 506
*/
507 507

	
508 508
/**
509 509
@defgroup lp_group Lp and Mip Solvers
510 510
@ingroup gen_opt_group
511 511
\brief Lp and Mip solver interfaces for LEMON.
512 512

	
513
This group describes Lp and Mip solver interfaces for LEMON. The
513
This group contains Lp and Mip solver interfaces for LEMON. The
514 514
various LP solvers could be used in the same manner with this
515 515
interface.
516 516
*/
517 517

	
518 518
/**
519 519
@defgroup lp_utils Tools for Lp and Mip Solvers
520 520
@ingroup lp_group
521 521
\brief Helper tools to the Lp and Mip solvers.
522 522

	
523 523
This group adds some helper tools to general optimization framework
524 524
implemented in LEMON.
525 525
*/
526 526

	
527 527
/**
528 528
@defgroup metah Metaheuristics
529 529
@ingroup gen_opt_group
530 530
\brief Metaheuristics for LEMON library.
531 531

	
532
This group describes some metaheuristic optimization tools.
532
This group contains some metaheuristic optimization tools.
533 533
*/
534 534

	
535 535
/**
536 536
@defgroup utils Tools and Utilities
537 537
\brief Tools and utilities for programming in LEMON
538 538

	
539 539
Tools and utilities for programming in LEMON.
540 540
*/
541 541

	
542 542
/**
543 543
@defgroup gutils Basic Graph Utilities
544 544
@ingroup utils
545 545
\brief Simple basic graph utilities.
546 546

	
547
This group describes some simple basic graph utilities.
547
This group contains some simple basic graph utilities.
548 548
*/
549 549

	
550 550
/**
551 551
@defgroup misc Miscellaneous Tools
552 552
@ingroup utils
553 553
\brief Tools for development, debugging and testing.
554 554

	
555
This group describes several useful tools for development,
555
This group contains several useful tools for development,
556 556
debugging and testing.
557 557
*/
558 558

	
559 559
/**
560 560
@defgroup timecount Time Measuring and Counting
561 561
@ingroup misc
562 562
\brief Simple tools for measuring the performance of algorithms.
563 563

	
564
This group describes simple tools for measuring the performance
564
This group contains simple tools for measuring the performance
565 565
of algorithms.
566 566
*/
567 567

	
568 568
/**
569 569
@defgroup exceptions Exceptions
570 570
@ingroup utils
571 571
\brief Exceptions defined in LEMON.
572 572

	
573
This group describes the exceptions defined in LEMON.
573
This group contains the exceptions defined in LEMON.
574 574
*/
575 575

	
576 576
/**
577 577
@defgroup io_group Input-Output
578 578
\brief Graph Input-Output methods
579 579

	
580
This group describes the tools for importing and exporting graphs
580
This group contains the tools for importing and exporting graphs
581 581
and graph related data. Now it supports the \ref lgf-format
582 582
"LEMON Graph Format", the \c DIMACS format and the encapsulated
583 583
postscript (EPS) format.
584 584
*/
585 585

	
586 586
/**
587 587
@defgroup lemon_io LEMON Graph Format
588 588
@ingroup io_group
589 589
\brief Reading and writing LEMON Graph Format.
590 590

	
591
This group describes methods for reading and writing
591
This group contains methods for reading and writing
592 592
\ref lgf-format "LEMON Graph Format".
593 593
*/
594 594

	
595 595
/**
596 596
@defgroup eps_io Postscript Exporting
597 597
@ingroup io_group
598 598
\brief General \c EPS drawer and graph exporter
599 599

	
600
This group describes general \c EPS drawing methods and special
600
This group contains general \c EPS drawing methods and special
601 601
graph exporting tools.
602 602
*/
603 603

	
604 604
/**
605 605
@defgroup dimacs_group DIMACS format
606 606
@ingroup io_group
607 607
\brief Read and write files in DIMACS format
608 608

	
609 609
Tools to read a digraph from or write it to a file in DIMACS format data.
610 610
*/
611 611

	
612 612
/**
613 613
@defgroup nauty_group NAUTY Format
614 614
@ingroup io_group
615 615
\brief Read \e Nauty format
616 616

	
617 617
Tool to read graphs from \e Nauty format data.
618 618
*/
619 619

	
620 620
/**
621 621
@defgroup concept Concepts
622 622
\brief Skeleton classes and concept checking classes
623 623

	
624
This group describes the data/algorithm skeletons and concept checking
624
This group contains the data/algorithm skeletons and concept checking
625 625
classes implemented in LEMON.
626 626

	
627 627
The purpose of the classes in this group is fourfold.
628 628

	
629 629
- These classes contain the documentations of the %concepts. In order
630 630
  to avoid document multiplications, an implementation of a concept
631 631
  simply refers to the corresponding concept class.
632 632

	
633 633
- These classes declare every functions, <tt>typedef</tt>s etc. an
634 634
  implementation of the %concepts should provide, however completely
635 635
  without implementations and real data structures behind the
636 636
  interface. On the other hand they should provide nothing else. All
... ...
@@ -642,34 +642,34 @@
642 642
- The concept descriptor classes also provide a <em>checker class</em>
643 643
  that makes it possible to check whether a certain implementation of a
644 644
  concept indeed provides all the required features.
645 645

	
646 646
- Finally, They can serve as a skeleton of a new implementation of a concept.
647 647
*/
648 648

	
649 649
/**
650 650
@defgroup graph_concepts Graph Structure Concepts
651 651
@ingroup concept
652 652
\brief Skeleton and concept checking classes for graph structures
653 653

	
654
This group describes the skeletons and concept checking classes of LEMON's
654
This group contains the skeletons and concept checking classes of LEMON's
655 655
graph structures and helper classes used to implement these.
656 656
*/
657 657

	
658 658
/**
659 659
@defgroup map_concepts Map Concepts
660 660
@ingroup concept
661 661
\brief Skeleton and concept checking classes for maps
662 662

	
663
This group describes the skeletons and concept checking classes of maps.
663
This group contains the skeletons and concept checking classes of maps.
664 664
*/
665 665

	
666 666
/**
667 667
\anchor demoprograms
668 668

	
669 669
@defgroup demos Demo Programs
670 670

	
671 671
Some demo programs are listed here. Their full source codes can be found in
672 672
the \c demo subdirectory of the source tree.
673 673

	
674 674
It order to compile them, use <tt>--enable-demo</tt> configure option when
675 675
build the library.
Ignore white space 24 line context
... ...
@@ -36,26 +36,21 @@
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
If you already feel like using our library, see the page that tells you
49
\ref getstart "How to start using LEMON".
50

	
51
If you
52
want to see how LEMON works, see
53
some \ref demoprograms "demo programs".
48
If you already feel like using our library, see the
49
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
54 50

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

	
59 54
If you are a user of the old (0.x) series of LEMON, please check out the
60 55
\ref migration "Migration Guide" for the backward incompatibilities.
61 56
*/
Ignore white space 24 line context
... ...
@@ -2245,44 +2245,45 @@
2245 2245

	
2246 2246
    /// \brief Constructor
2247 2247
    ///
2248 2248
    /// Creates an undirected graph from the given digraph.
2249 2249
    Undirector(DGR& digraph) {
2250 2250
      initialize(digraph);
2251 2251
    }
2252 2252

	
2253 2253
    /// \brief Arc map combined from two original arc maps
2254 2254
    ///
2255 2255
    /// This map adaptor class adapts two arc maps of the underlying
2256 2256
    /// digraph to get an arc map of the undirected graph.
2257
    /// Its value type is inherited from the first arc map type
2258
    /// (\c %ForwardMap).
2259
    template <typename ForwardMap, typename BackwardMap>
2257
    /// Its value type is inherited from the first arc map type (\c FW).
2258
    /// \tparam FW The type of the "foward" arc map.
2259
    /// \tparam BK The type of the "backward" arc map.
2260
    template <typename FW, typename BK>
2260 2261
    class CombinedArcMap {
2261 2262
    public:
2262 2263

	
2263 2264
      /// The key type of the map
2264 2265
      typedef typename Parent::Arc Key;
2265 2266
      /// The value type of the map
2266
      typedef typename ForwardMap::Value Value;
2267

	
2268
      typedef typename MapTraits<ForwardMap>::ReferenceMapTag ReferenceMapTag;
2269

	
2270
      typedef typename MapTraits<ForwardMap>::ReturnValue ReturnValue;
2271
      typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReturnValue;
2272
      typedef typename MapTraits<ForwardMap>::ReturnValue Reference;
2273
      typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReference;
2267
      typedef typename FW::Value Value;
2268

	
2269
      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2270

	
2271
      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2272
      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2273
      typedef typename MapTraits<FW>::ReturnValue Reference;
2274
      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2274 2275

	
2275 2276
      /// Constructor
2276
      CombinedArcMap(ForwardMap& forward, BackwardMap& backward)
2277
      CombinedArcMap(FW& forward, BK& backward)
2277 2278
        : _forward(&forward), _backward(&backward) {}
2278 2279

	
2279 2280
      /// Sets the value associated with the given key.
2280 2281
      void set(const Key& e, const Value& a) {
2281 2282
        if (Parent::direction(e)) {
2282 2283
          _forward->set(e, a);
2283 2284
        } else {
2284 2285
          _backward->set(e, a);
2285 2286
        }
2286 2287
      }
2287 2288

	
2288 2289
      /// Returns the value associated with the given key.
... ...
@@ -2296,57 +2297,54 @@
2296 2297

	
2297 2298
      /// Returns a reference to the value associated with the given key.
2298 2299
      ReturnValue operator[](const Key& e) {
2299 2300
        if (Parent::direction(e)) {
2300 2301
          return (*_forward)[e];
2301 2302
        } else {
2302 2303
          return (*_backward)[e];
2303 2304
        }
2304 2305
      }
2305 2306

	
2306 2307
    protected:
2307 2308

	
2308
      ForwardMap* _forward;
2309
      BackwardMap* _backward;
2309
      FW* _forward;
2310
      BK* _backward;
2310 2311

	
2311 2312
    };
2312 2313

	
2313 2314
    /// \brief Returns a combined arc map
2314 2315
    ///
2315 2316
    /// This function just returns a combined arc map.
2316
    template <typename ForwardMap, typename BackwardMap>
2317
    static CombinedArcMap<ForwardMap, BackwardMap>
2318
    combinedArcMap(ForwardMap& forward, BackwardMap& backward) {
2319
      return CombinedArcMap<ForwardMap, BackwardMap>(forward, backward);
2317
    template <typename FW, typename BK>
2318
    static CombinedArcMap<FW, BK>
2319
    combinedArcMap(FW& forward, BK& backward) {
2320
      return CombinedArcMap<FW, BK>(forward, backward);
2320 2321
    }
2321 2322

	
2322
    template <typename ForwardMap, typename BackwardMap>
2323
    static CombinedArcMap<const ForwardMap, BackwardMap>
2324
    combinedArcMap(const ForwardMap& forward, BackwardMap& backward) {
2325
      return CombinedArcMap<const ForwardMap,
2326
        BackwardMap>(forward, backward);
2323
    template <typename FW, typename BK>
2324
    static CombinedArcMap<const FW, BK>
2325
    combinedArcMap(const FW& forward, BK& backward) {
2326
      return CombinedArcMap<const FW, BK>(forward, backward);
2327 2327
    }
2328 2328

	
2329
    template <typename ForwardMap, typename BackwardMap>
2330
    static CombinedArcMap<ForwardMap, const BackwardMap>
2331
    combinedArcMap(ForwardMap& forward, const BackwardMap& backward) {
2332
      return CombinedArcMap<ForwardMap,
2333
        const BackwardMap>(forward, backward);
2329
    template <typename FW, typename BK>
2330
    static CombinedArcMap<FW, const BK>
2331
    combinedArcMap(FW& forward, const BK& backward) {
2332
      return CombinedArcMap<FW, const BK>(forward, backward);
2334 2333
    }
2335 2334

	
2336
    template <typename ForwardMap, typename BackwardMap>
2337
    static CombinedArcMap<const ForwardMap, const BackwardMap>
2338
    combinedArcMap(const ForwardMap& forward, const BackwardMap& backward) {
2339
      return CombinedArcMap<const ForwardMap,
2340
        const BackwardMap>(forward, backward);
2335
    template <typename FW, typename BK>
2336
    static CombinedArcMap<const FW, const BK>
2337
    combinedArcMap(const FW& forward, const BK& backward) {
2338
      return CombinedArcMap<const FW, const BK>(forward, backward);
2341 2339
    }
2342 2340

	
2343 2341
  };
2344 2342

	
2345 2343
  /// \brief Returns a read-only Undirector adaptor
2346 2344
  ///
2347 2345
  /// This function just returns a read-only \ref Undirector adaptor.
2348 2346
  /// \ingroup graph_adaptors
2349 2347
  /// \relates Undirector
2350 2348
  template<typename DGR>
2351 2349
  Undirector<const DGR> undirector(const DGR& digraph) {
2352 2350
    return Undirector<const DGR>(digraph);
... ...
@@ -3397,43 +3395,44 @@
3397 3395
    /// \brief Returns the arc that corresponds to the given original arc.
3398 3396
    ///
3399 3397
    /// Returns the arc in the adaptor that corresponds to the given
3400 3398
    /// original arc.
3401 3399
    static Arc arc(const DigraphArc& a) {
3402 3400
      return Parent::arc(a);
3403 3401
    }
3404 3402

	
3405 3403
    /// \brief Node map combined from two original node maps
3406 3404
    ///
3407 3405
    /// This map adaptor class adapts two node maps of the original digraph
3408 3406
    /// to get a node map of the split digraph.
3409
    /// Its value type is inherited from the first node map type
3410
    /// (\c InNodeMap).
3411
    template <typename InNodeMap, typename OutNodeMap>
3407
    /// Its value type is inherited from the first node map type (\c IN).
3408
    /// \tparam IN The type of the node map for the in-nodes. 
3409
    /// \tparam OUT The type of the node map for the out-nodes.
3410
    template <typename IN, typename OUT>
3412 3411
    class CombinedNodeMap {
3413 3412
    public:
3414 3413

	
3415 3414
      /// The key type of the map
3416 3415
      typedef Node Key;
3417 3416
      /// The value type of the map
3418
      typedef typename InNodeMap::Value Value;
3419

	
3420
      typedef typename MapTraits<InNodeMap>::ReferenceMapTag ReferenceMapTag;
3421
      typedef typename MapTraits<InNodeMap>::ReturnValue ReturnValue;
3422
      typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReturnValue;
3423
      typedef typename MapTraits<InNodeMap>::ReturnValue Reference;
3424
      typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReference;
3417
      typedef typename IN::Value Value;
3418

	
3419
      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3420
      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3421
      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3422
      typedef typename MapTraits<IN>::ReturnValue Reference;
3423
      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3425 3424

	
3426 3425
      /// Constructor
3427
      CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
3426
      CombinedNodeMap(IN& in_map, OUT& out_map)
3428 3427
        : _in_map(in_map), _out_map(out_map) {}
3429 3428

	
3430 3429
      /// Returns the value associated with the given key.
3431 3430
      Value operator[](const Key& key) const {
3432 3431
        if (SplitNodesBase<const DGR>::inNode(key)) {
3433 3432
          return _in_map[key];
3434 3433
        } else {
3435 3434
          return _out_map[key];
3436 3435
        }
3437 3436
      }
3438 3437

	
3439 3438
      /// Returns a reference to the value associated with the given key.
... ...
@@ -3447,82 +3446,82 @@
3447 3446

	
3448 3447
      /// Sets the value associated with the given key.
3449 3448
      void set(const Key& key, const Value& value) {
3450 3449
        if (SplitNodesBase<const DGR>::inNode(key)) {
3451 3450
          _in_map.set(key, value);
3452 3451
        } else {
3453 3452
          _out_map.set(key, value);
3454 3453
        }
3455 3454
      }
3456 3455

	
3457 3456
    private:
3458 3457

	
3459
      InNodeMap& _in_map;
3460
      OutNodeMap& _out_map;
3458
      IN& _in_map;
3459
      OUT& _out_map;
3461 3460

	
3462 3461
    };
3463 3462

	
3464 3463

	
3465 3464
    /// \brief Returns a combined node map
3466 3465
    ///
3467 3466
    /// This function just returns a combined node map.
3468
    template <typename InNodeMap, typename OutNodeMap>
3469
    static CombinedNodeMap<InNodeMap, OutNodeMap>
3470
    combinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) {
3471
      return CombinedNodeMap<InNodeMap, OutNodeMap>(in_map, out_map);
3467
    template <typename IN, typename OUT>
3468
    static CombinedNodeMap<IN, OUT>
3469
    combinedNodeMap(IN& in_map, OUT& out_map) {
3470
      return CombinedNodeMap<IN, OUT>(in_map, out_map);
3472 3471
    }
3473 3472

	
3474
    template <typename InNodeMap, typename OutNodeMap>
3475
    static CombinedNodeMap<const InNodeMap, OutNodeMap>
3476
    combinedNodeMap(const InNodeMap& in_map, OutNodeMap& out_map) {
3477
      return CombinedNodeMap<const InNodeMap, OutNodeMap>(in_map, out_map);
3473
    template <typename IN, typename OUT>
3474
    static CombinedNodeMap<const IN, OUT>
3475
    combinedNodeMap(const IN& in_map, OUT& out_map) {
3476
      return CombinedNodeMap<const IN, OUT>(in_map, out_map);
3478 3477
    }
3479 3478

	
3480
    template <typename InNodeMap, typename OutNodeMap>
3481
    static CombinedNodeMap<InNodeMap, const OutNodeMap>
3482
    combinedNodeMap(InNodeMap& in_map, const OutNodeMap& out_map) {
3483
      return CombinedNodeMap<InNodeMap, const OutNodeMap>(in_map, out_map);
3479
    template <typename IN, typename OUT>
3480
    static CombinedNodeMap<IN, const OUT>
3481
    combinedNodeMap(IN& in_map, const OUT& out_map) {
3482
      return CombinedNodeMap<IN, const OUT>(in_map, out_map);
3484 3483
    }
3485 3484

	
3486
    template <typename InNodeMap, typename OutNodeMap>
3487
    static CombinedNodeMap<const InNodeMap, const OutNodeMap>
3488
    combinedNodeMap(const InNodeMap& in_map, const OutNodeMap& out_map) {
3489
      return CombinedNodeMap<const InNodeMap,
3490
        const OutNodeMap>(in_map, out_map);
3485
    template <typename IN, typename OUT>
3486
    static CombinedNodeMap<const IN, const OUT>
3487
    combinedNodeMap(const IN& in_map, const OUT& out_map) {
3488
      return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
3491 3489
    }
3492 3490

	
3493 3491
    /// \brief Arc map combined from an arc map and a node map of the
3494 3492
    /// original digraph.
3495 3493
    ///
3496 3494
    /// This map adaptor class adapts an arc map and a node map of the
3497 3495
    /// original digraph to get an arc map of the split digraph.
3498
    /// Its value type is inherited from the original arc map type
3499
    /// (\c ArcMap).
3500
    template <typename ArcMap, typename NodeMap>
3496
    /// Its value type is inherited from the original arc map type (\c AM).
3497
    /// \tparam AM The type of the arc map.
3498
    /// \tparam NM the type of the node map.
3499
    template <typename AM, typename NM>
3501 3500
    class CombinedArcMap {
3502 3501
    public:
3503 3502

	
3504 3503
      /// The key type of the map
3505 3504
      typedef Arc Key;
3506 3505
      /// The value type of the map
3507
      typedef typename ArcMap::Value Value;
3508

	
3509
      typedef typename MapTraits<ArcMap>::ReferenceMapTag ReferenceMapTag;
3510
      typedef typename MapTraits<ArcMap>::ReturnValue ReturnValue;
3511
      typedef typename MapTraits<ArcMap>::ConstReturnValue ConstReturnValue;
3512
      typedef typename MapTraits<ArcMap>::ReturnValue Reference;
3513
      typedef typename MapTraits<ArcMap>::ConstReturnValue ConstReference;
3506
      typedef typename AM::Value Value;
3507

	
3508
      typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
3509
      typedef typename MapTraits<AM>::ReturnValue ReturnValue;
3510
      typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
3511
      typedef typename MapTraits<AM>::ReturnValue Reference;
3512
      typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
3514 3513

	
3515 3514
      /// Constructor
3516
      CombinedArcMap(ArcMap& arc_map, NodeMap& node_map)
3515
      CombinedArcMap(AM& arc_map, NM& node_map)
3517 3516
        : _arc_map(arc_map), _node_map(node_map) {}
3518 3517

	
3519 3518
      /// Returns the value associated with the given key.
3520 3519
      Value operator[](const Key& arc) const {
3521 3520
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3522 3521
          return _arc_map[arc];
3523 3522
        } else {
3524 3523
          return _node_map[arc];
3525 3524
        }
3526 3525
      }
3527 3526

	
3528 3527
      /// Returns a reference to the value associated with the given key.
... ...
@@ -3535,26 +3534,28 @@
3535 3534
      }
3536 3535

	
3537 3536
      /// Sets the value associated with the given key.
3538 3537
      void set(const Arc& arc, const Value& val) {
3539 3538
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3540 3539
          _arc_map.set(arc, val);
3541 3540
        } else {
3542 3541
          _node_map.set(arc, val);
3543 3542
        }
3544 3543
      }
3545 3544

	
3546 3545
    private:
3547
      ArcMap& _arc_map;
3548
      NodeMap& _node_map;
3546

	
3547
      AM& _arc_map;
3548
      NM& _node_map;
3549

	
3549 3550
    };
3550 3551

	
3551 3552
    /// \brief Returns a combined arc map
3552 3553
    ///
3553 3554
    /// This function just returns a combined arc map.
3554 3555
    template <typename ArcMap, typename NodeMap>
3555 3556
    static CombinedArcMap<ArcMap, NodeMap>
3556 3557
    combinedArcMap(ArcMap& arc_map, NodeMap& node_map) {
3557 3558
      return CombinedArcMap<ArcMap, NodeMap>(arc_map, node_map);
3558 3559
    }
3559 3560

	
3560 3561
    template <typename ArcMap, typename NodeMap>
Ignore white space 24 line context
... ...
@@ -24,323 +24,324 @@
24 24
///\brief Binary Heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32 32
  ///\ingroup auxdat
33 33
  ///
34 34
  ///\brief A Binary Heap implementation.
35 35
  ///
36
  ///This class implements the \e binary \e heap data structure. A \e heap
37
  ///is a data structure for storing items with specified values called \e
38
  ///priorities in such a way that finding the item with minimum priority is
39
  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
40
  ///one can change the priority of an item, add or erase an item, etc.
36
  ///This class implements the \e binary \e heap data structure. 
37
  /// 
38
  ///A \e heap is a data structure for storing items with specified values
39
  ///called \e priorities in such a way that finding the item with minimum
40
  ///priority is efficient. \c Comp specifies the ordering of the priorities.
41
  ///In a heap one can change the priority of an item, add or erase an
42
  ///item, etc.
41 43
  ///
42
  ///\tparam _Prio Type of the priority of the items.
43
  ///\tparam _ItemIntMap A read and writable Item int map, used internally
44
  ///\tparam PR Type of the priority of the items.
45
  ///\tparam IM A read and writable item map with int values, used internally
44 46
  ///to handle the cross references.
45
  ///\tparam _Compare A class for the ordering of the priorities. The
46
  ///default is \c std::less<_Prio>.
47
  ///\tparam Comp A functor class for the ordering of the priorities.
48
  ///The default is \c std::less<PR>.
47 49
  ///
48 50
  ///\sa FibHeap
49 51
  ///\sa Dijkstra
50
  template <typename _Prio, typename _ItemIntMap,
51
            typename _Compare = std::less<_Prio> >
52
  template <typename PR, typename IM, typename Comp = std::less<PR> >
52 53
  class BinHeap {
53 54

	
54 55
  public:
55 56
    ///\e
56
    typedef _ItemIntMap ItemIntMap;
57
    typedef IM ItemIntMap;
57 58
    ///\e
58
    typedef _Prio Prio;
59
    typedef PR Prio;
59 60
    ///\e
60 61
    typedef typename ItemIntMap::Key Item;
61 62
    ///\e
62 63
    typedef std::pair<Item,Prio> Pair;
63 64
    ///\e
64
    typedef _Compare Compare;
65
    typedef Comp Compare;
65 66

	
66 67
    /// \brief Type to represent the items states.
67 68
    ///
68 69
    /// Each Item element have a state associated to it. It may be "in heap",
69 70
    /// "pre heap" or "post heap". The latter two are indifferent from the
70 71
    /// heap's point of view, but may be useful to the user.
71 72
    ///
72
    /// The ItemIntMap \e should be initialized in such way that it maps
73
    /// PRE_HEAP (-1) to any element to be put in the heap...
73
    /// The item-int map must be initialized in such way that it assigns
74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
74 75
    enum State {
75
      IN_HEAP = 0,
76
      PRE_HEAP = -1,
77
      POST_HEAP = -2
76
      IN_HEAP = 0,    ///< \e
77
      PRE_HEAP = -1,  ///< \e
78
      POST_HEAP = -2  ///< \e
78 79
    };
79 80

	
80 81
  private:
81
    std::vector<Pair> data;
82
    Compare comp;
83
    ItemIntMap &iim;
82
    std::vector<Pair> _data;
83
    Compare _comp;
84
    ItemIntMap &_iim;
84 85

	
85 86
  public:
86 87
    /// \brief The constructor.
87 88
    ///
88 89
    /// The constructor.
89
    /// \param _iim should be given to the constructor, since it is used
90
    /// \param map should be given to the constructor, since it is used
90 91
    /// internally to handle the cross references. The value of the map
91
    /// should be PRE_HEAP (-1) for each element.
92
    explicit BinHeap(ItemIntMap &_iim) : iim(_iim) {}
92
    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
93
    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
93 94

	
94 95
    /// \brief The constructor.
95 96
    ///
96 97
    /// The constructor.
97
    /// \param _iim should be given to the constructor, since it is used
98
    /// \param map should be given to the constructor, since it is used
98 99
    /// internally to handle the cross references. The value of the map
99 100
    /// should be PRE_HEAP (-1) for each element.
100 101
    ///
101
    /// \param _comp The comparator function object.
102
    BinHeap(ItemIntMap &_iim, const Compare &_comp)
103
      : iim(_iim), comp(_comp) {}
102
    /// \param comp The comparator function object.
103
    BinHeap(ItemIntMap &map, const Compare &comp)
104
      : _iim(map), _comp(comp) {}
104 105

	
105 106

	
106 107
    /// The number of items stored in the heap.
107 108
    ///
108 109
    /// \brief Returns the number of items stored in the heap.
109
    int size() const { return data.size(); }
110
    int size() const { return _data.size(); }
110 111

	
111 112
    /// \brief Checks if the heap stores no items.
112 113
    ///
113 114
    /// Returns \c true if and only if the heap stores no items.
114
    bool empty() const { return data.empty(); }
115
    bool empty() const { return _data.empty(); }
115 116

	
116 117
    /// \brief Make empty this heap.
117 118
    ///
118 119
    /// Make empty this heap. It does not change the cross reference map.
119 120
    /// If you want to reuse what is not surely empty you should first clear
120 121
    /// the heap and after that you should set the cross reference map for
121 122
    /// each item to \c PRE_HEAP.
122 123
    void clear() {
123
      data.clear();
124
      _data.clear();
124 125
    }
125 126

	
126 127
  private:
127 128
    static int parent(int i) { return (i-1)/2; }
128 129

	
129 130
    static int second_child(int i) { return 2*i+2; }
130 131
    bool less(const Pair &p1, const Pair &p2) const {
131
      return comp(p1.second, p2.second);
132
      return _comp(p1.second, p2.second);
132 133
    }
133 134

	
134 135
    int bubble_up(int hole, Pair p) {
135 136
      int par = parent(hole);
136
      while( hole>0 && less(p,data[par]) ) {
137
        move(data[par],hole);
137
      while( hole>0 && less(p,_data[par]) ) {
138
        move(_data[par],hole);
138 139
        hole = par;
139 140
        par = parent(hole);
140 141
      }
141 142
      move(p, hole);
142 143
      return hole;
143 144
    }
144 145

	
145 146
    int bubble_down(int hole, Pair p, int length) {
146 147
      int child = second_child(hole);
147 148
      while(child < length) {
148
        if( less(data[child-1], data[child]) ) {
149
        if( less(_data[child-1], _data[child]) ) {
149 150
          --child;
150 151
        }
151
        if( !less(data[child], p) )
152
        if( !less(_data[child], p) )
152 153
          goto ok;
153
        move(data[child], hole);
154
        move(_data[child], hole);
154 155
        hole = child;
155 156
        child = second_child(hole);
156 157
      }
157 158
      child--;
158
      if( child<length && less(data[child], p) ) {
159
        move(data[child], hole);
159
      if( child<length && less(_data[child], p) ) {
160
        move(_data[child], hole);
160 161
        hole=child;
161 162
      }
162 163
    ok:
163 164
      move(p, hole);
164 165
      return hole;
165 166
    }
166 167

	
167 168
    void move(const Pair &p, int i) {
168
      data[i] = p;
169
      iim.set(p.first, i);
169
      _data[i] = p;
170
      _iim.set(p.first, i);
170 171
    }
171 172

	
172 173
  public:
173 174
    /// \brief Insert a pair of item and priority into the heap.
174 175
    ///
175 176
    /// Adds \c p.first to the heap with priority \c p.second.
176 177
    /// \param p The pair to insert.
177 178
    void push(const Pair &p) {
178
      int n = data.size();
179
      data.resize(n+1);
179
      int n = _data.size();
180
      _data.resize(n+1);
180 181
      bubble_up(n, p);
181 182
    }
182 183

	
183 184
    /// \brief Insert an item into the heap with the given heap.
184 185
    ///
185 186
    /// Adds \c i to the heap with priority \c p.
186 187
    /// \param i The item to insert.
187 188
    /// \param p The priority of the item.
188 189
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
189 190

	
190 191
    /// \brief Returns the item with minimum priority relative to \c Compare.
191 192
    ///
192 193
    /// This method returns the item with minimum priority relative to \c
193 194
    /// Compare.
194 195
    /// \pre The heap must be nonempty.
195 196
    Item top() const {
196
      return data[0].first;
197
      return _data[0].first;
197 198
    }
198 199

	
199 200
    /// \brief Returns the minimum priority relative to \c Compare.
200 201
    ///
201 202
    /// It returns the minimum priority relative to \c Compare.
202 203
    /// \pre The heap must be nonempty.
203 204
    Prio prio() const {
204
      return data[0].second;
205
      return _data[0].second;
205 206
    }
206 207

	
207 208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
208 209
    ///
209 210
    /// This method deletes the item with minimum priority relative to \c
210 211
    /// Compare from the heap.
211 212
    /// \pre The heap must be non-empty.
212 213
    void pop() {
213
      int n = data.size()-1;
214
      iim.set(data[0].first, POST_HEAP);
214
      int n = _data.size()-1;
215
      _iim.set(_data[0].first, POST_HEAP);
215 216
      if (n > 0) {
216
        bubble_down(0, data[n], n);
217
        bubble_down(0, _data[n], n);
217 218
      }
218
      data.pop_back();
219
      _data.pop_back();
219 220
    }
220 221

	
221 222
    /// \brief Deletes \c i from the heap.
222 223
    ///
223 224
    /// This method deletes item \c i from the heap.
224 225
    /// \param i The item to erase.
225 226
    /// \pre The item should be in the heap.
226 227
    void erase(const Item &i) {
227
      int h = iim[i];
228
      int n = data.size()-1;
229
      iim.set(data[h].first, POST_HEAP);
228
      int h = _iim[i];
229
      int n = _data.size()-1;
230
      _iim.set(_data[h].first, POST_HEAP);
230 231
      if( h < n ) {
231
        if ( bubble_up(h, data[n]) == h) {
232
          bubble_down(h, data[n], n);
232
        if ( bubble_up(h, _data[n]) == h) {
233
          bubble_down(h, _data[n], n);
233 234
        }
234 235
      }
235
      data.pop_back();
236
      _data.pop_back();
236 237
    }
237 238

	
238 239

	
239 240
    /// \brief Returns the priority of \c i.
240 241
    ///
241 242
    /// This function returns the priority of item \c i.
243
    /// \param i The item.
242 244
    /// \pre \c i must be in the heap.
243
    /// \param i The item.
244 245
    Prio operator[](const Item &i) const {
245
      int idx = iim[i];
246
      return data[idx].second;
246
      int idx = _iim[i];
247
      return _data[idx].second;
247 248
    }
248 249

	
249 250
    /// \brief \c i gets to the heap with priority \c p independently
250 251
    /// if \c i was already there.
251 252
    ///
252 253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
253 254
    /// in the heap and sets the priority of \c i to \c p otherwise.
254 255
    /// \param i The item.
255 256
    /// \param p The priority.
256 257
    void set(const Item &i, const Prio &p) {
257
      int idx = iim[i];
258
      int idx = _iim[i];
258 259
      if( idx < 0 ) {
259 260
        push(i,p);
260 261
      }
261
      else if( comp(p, data[idx].second) ) {
262
      else if( _comp(p, _data[idx].second) ) {
262 263
        bubble_up(idx, Pair(i,p));
263 264
      }
264 265
      else {
265
        bubble_down(idx, Pair(i,p), data.size());
266
        bubble_down(idx, Pair(i,p), _data.size());
266 267
      }
267 268
    }
268 269

	
269 270
    /// \brief Decreases the priority of \c i to \c p.
270 271
    ///
271 272
    /// This method decreases the priority of item \c i to \c p.
273
    /// \param i The item.
274
    /// \param p The priority.
272 275
    /// \pre \c i must be stored in the heap with priority at least \c
273 276
    /// p relative to \c Compare.
274
    /// \param i The item.
275
    /// \param p The priority.
276 277
    void decrease(const Item &i, const Prio &p) {
277
      int idx = iim[i];
278
      int idx = _iim[i];
278 279
      bubble_up(idx, Pair(i,p));
279 280
    }
280 281

	
281 282
    /// \brief Increases the priority of \c i to \c p.
282 283
    ///
283 284
    /// This method sets the priority of item \c i to \c p.
285
    /// \param i The item.
286
    /// \param p The priority.
284 287
    /// \pre \c i must be stored in the heap with priority at most \c
285 288
    /// p relative to \c Compare.
286
    /// \param i The item.
287
    /// \param p The priority.
288 289
    void increase(const Item &i, const Prio &p) {
289
      int idx = iim[i];
290
      bubble_down(idx, Pair(i,p), data.size());
290
      int idx = _iim[i];
291
      bubble_down(idx, Pair(i,p), _data.size());
291 292
    }
292 293

	
293 294
    /// \brief Returns if \c item is in, has already been in, or has
294 295
    /// never been in the heap.
295 296
    ///
296 297
    /// This method returns PRE_HEAP if \c item has never been in the
297 298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
298 299
    /// otherwise. In the latter case it is possible that \c item will
299 300
    /// get back to the heap again.
300 301
    /// \param i The item.
301 302
    State state(const Item &i) const {
302
      int s = iim[i];
303
      int s = _iim[i];
303 304
      if( s>=0 )
304 305
        s=0;
305 306
      return State(s);
306 307
    }
307 308

	
308 309
    /// \brief Sets the state of the \c item in the heap.
309 310
    ///
310 311
    /// Sets the state of the \c item in the heap. It can be used to
311 312
    /// manually clear the heap when it is important to achive the
312 313
    /// better time complexity.
313 314
    /// \param i The item.
314 315
    /// \param st The state. It should not be \c IN_HEAP.
315 316
    void state(const Item& i, State st) {
316 317
      switch (st) {
317 318
      case POST_HEAP:
318 319
      case PRE_HEAP:
319 320
        if (state(i) == IN_HEAP) {
320 321
          erase(i);
321 322
        }
322
        iim[i] = st;
323
        _iim[i] = st;
323 324
        break;
324 325
      case IN_HEAP:
325 326
        break;
326 327
      }
327 328
    }
328 329

	
329 330
    /// \brief Replaces an item in the heap.
330 331
    ///
331 332
    /// The \c i item is replaced with \c j item. The \c i item should
332 333
    /// be in the heap, while the \c j should be out of the heap. The
333 334
    /// \c i item will out of the heap and \c j will be in the heap
334 335
    /// with the same prioriority as prevoiusly the \c i item.
335 336
    void replace(const Item& i, const Item& j) {
336
      int idx = iim[i];
337
      iim.set(i, iim[j]);
338
      iim.set(j, idx);
339
      data[idx].first = j;
337
      int idx = _iim[i];
338
      _iim.set(i, _iim[j]);
339
      _iim.set(j, idx);
340
      _data[idx].first = j;
340 341
    }
341 342

	
342 343
  }; // class BinHeap
343 344

	
344 345
} // namespace lemon
345 346

	
346 347
#endif // LEMON_BIN_HEAP_H
Ignore white space 24 line context
... ...
@@ -15,32 +15,32 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_EDGE_SET_EXTENDER_H
20 20
#define LEMON_BITS_EDGE_SET_EXTENDER_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/error.h>
24 24
#include <lemon/bits/default_map.h>
25 25
#include <lemon/bits/map_extender.h>
26 26

	
27
///\ingroup digraphbits
28
///\file
29
///\brief Extenders for the arc set types
27
//\ingroup digraphbits
28
//\file
29
//\brief Extenders for the arc set types
30 30
namespace lemon {
31 31

	
32
  /// \ingroup digraphbits
33
  ///
34
  /// \brief Extender for the ArcSets
32
  // \ingroup digraphbits
33
  //
34
  // \brief Extender for the ArcSets
35 35
  template <typename Base>
36 36
  class ArcSetExtender : public Base {
37 37
  public:
38 38

	
39 39
    typedef Base Parent;
40 40
    typedef ArcSetExtender Digraph;
41 41

	
42 42
    // Base extensions
43 43

	
44 44
    typedef typename Parent::Node Node;
45 45
    typedef typename Parent::Arc Arc;
46 46

	
... ...
@@ -63,38 +63,36 @@
63 63
    Node oppositeNode(const Node &n, const Arc &e) const {
64 64
      if (n == Parent::source(e))
65 65
	return Parent::target(e);
66 66
      else if(n==Parent::target(e))
67 67
	return Parent::source(e);
68 68
      else
69 69
	return INVALID;
70 70
    }
71 71

	
72 72

	
73 73
    // Alteration notifier extensions
74 74

	
75
    /// The arc observer registry.
75
    // The arc observer registry.
76 76
    typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;
77 77

	
78 78
  protected:
79 79

	
80 80
    mutable ArcNotifier arc_notifier;
81 81

	
82 82
  public:
83 83

	
84 84
    using Parent::notifier;
85 85

	
86
    /// \brief Gives back the arc alteration notifier.
87
    ///
88
    /// Gives back the arc alteration notifier.
86
    // Gives back the arc alteration notifier.
89 87
    ArcNotifier& notifier(Arc) const {
90 88
      return arc_notifier;
91 89
    }
92 90

	
93 91
    // Iterable extensions
94 92

	
95 93
    class NodeIt : public Node { 
96 94
      const Digraph* digraph;
97 95
    public:
98 96

	
99 97
      NodeIt() {}
100 98

	
... ...
@@ -176,48 +174,48 @@
176 174
      }
177 175

	
178 176
      InArcIt(const Digraph& _graph, const Arc& arc) : 
179 177
	Arc(arc), digraph(&_graph) {}
180 178

	
181 179
      InArcIt& operator++() { 
182 180
	digraph->nextIn(*this);
183 181
	return *this; 
184 182
      }
185 183

	
186 184
    };
187 185

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

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

	
216 214
    using Parent::first;
217 215

	
218 216
    // Mappable extension
219 217
    
220 218
    template <typename _Value>
221 219
    class ArcMap 
222 220
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
223 221
    public:
... ...
@@ -262,27 +260,27 @@
262 260

	
263 261
    ArcSetExtender() {
264 262
      arc_notifier.setContainer(*this);
265 263
    }
266 264

	
267 265
    ~ArcSetExtender() {
268 266
      arc_notifier.clear();
269 267
    }
270 268

	
271 269
  };
272 270

	
273 271

	
274
  /// \ingroup digraphbits
275
  ///
276
  /// \brief Extender for the EdgeSets
272
  // \ingroup digraphbits
273
  //
274
  // \brief Extender for the EdgeSets
277 275
  template <typename Base>
278 276
  class EdgeSetExtender : public Base {
279 277

	
280 278
  public:
281 279

	
282 280
    typedef Base Parent;
283 281
    typedef EdgeSetExtender Digraph;
284 282

	
285 283
    typedef typename Parent::Node Node;
286 284
    typedef typename Parent::Arc Arc;
287 285
    typedef typename Parent::Edge Edge;
288 286

	
... ...
@@ -483,61 +481,61 @@
483 481

	
484 482
      IncEdgeIt(const Digraph& _graph, const Edge &ue, const Node &n)
485 483
	: digraph(&_graph), Edge(ue) {
486 484
	direction = (_graph.source(ue) == n);
487 485
      }
488 486

	
489 487
      IncEdgeIt& operator++() {
490 488
	digraph->nextInc(*this, direction);
491 489
	return *this; 
492 490
      }
493 491
    };
494 492

	
495
    /// \brief Base node of the iterator
496
    ///
497
    /// Returns the base node (ie. the source in this case) of the iterator
493
    // \brief Base node of the iterator
494
    //
495
    // Returns the base node (ie. the source in this case) of the iterator
498 496
    Node baseNode(const OutArcIt &e) const {
499 497
      return Parent::source(static_cast<const Arc&>(e));
500 498
    }
501
    /// \brief Running node of the iterator
502
    ///
503
    /// Returns the running node (ie. the target in this case) of the
504
    /// iterator
499
    // \brief Running node of the iterator
500
    //
501
    // Returns the running node (ie. the target in this case) of the
502
    // iterator
505 503
    Node runningNode(const OutArcIt &e) const {
506 504
      return Parent::target(static_cast<const Arc&>(e));
507 505
    }
508 506

	
509
    /// \brief Base node of the iterator
510
    ///
511
    /// Returns the base node (ie. the target in this case) of the iterator
507
    // \brief Base node of the iterator
508
    //
509
    // Returns the base node (ie. the target in this case) of the iterator
512 510
    Node baseNode(const InArcIt &e) const {
513 511
      return Parent::target(static_cast<const Arc&>(e));
514 512
    }
515
    /// \brief Running node of the iterator
516
    ///
517
    /// Returns the running node (ie. the source in this case) of the
518
    /// iterator
513
    // \brief Running node of the iterator
514
    //
515
    // Returns the running node (ie. the source in this case) of the
516
    // iterator
519 517
    Node runningNode(const InArcIt &e) const {
520 518
      return Parent::source(static_cast<const Arc&>(e));
521 519
    }
522 520

	
523
    /// Base node of the iterator
524
    ///
525
    /// Returns the base node of the iterator
521
    // Base node of the iterator
522
    //
523
    // Returns the base node of the iterator
526 524
    Node baseNode(const IncEdgeIt &e) const {
527 525
      return e.direction ? u(e) : v(e);
528 526
    }
529
    /// Running node of the iterator
530
    ///
531
    /// Returns the running node of the iterator
527
    // Running node of the iterator
528
    //
529
    // Returns the running node of the iterator
532 530
    Node runningNode(const IncEdgeIt &e) const {
533 531
      return e.direction ? v(e) : u(e);
534 532
    }
535 533

	
536 534

	
537 535
    template <typename _Value>
538 536
    class ArcMap 
539 537
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
540 538
    public:
541 539
      typedef EdgeSetExtender Digraph;
542 540
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
543 541

	
Ignore white space 24 line context
... ...
@@ -206,98 +206,98 @@
206 206

	
207 207
    Tolerance _tol;
208 208
    int _el;
209 209

	
210 210
  public:
211 211

	
212 212
    typedef Circulation Create;
213 213

	
214 214
    ///\name Named Template Parameters
215 215

	
216 216
    ///@{
217 217

	
218
    template <typename _FlowMap>
218
    template <typename T>
219 219
    struct SetFlowMapTraits : public Traits {
220
      typedef _FlowMap FlowMap;
220
      typedef T FlowMap;
221 221
      static FlowMap *createFlowMap(const Digraph&) {
222 222
        LEMON_ASSERT(false, "FlowMap is not initialized");
223 223
        return 0; // ignore warnings
224 224
      }
225 225
    };
226 226

	
227 227
    /// \brief \ref named-templ-param "Named parameter" for setting
228 228
    /// FlowMap type
229 229
    ///
230 230
    /// \ref named-templ-param "Named parameter" for setting FlowMap
231 231
    /// type.
232
    template <typename _FlowMap>
232
    template <typename T>
233 233
    struct SetFlowMap
234 234
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
235
                           SetFlowMapTraits<_FlowMap> > {
235
                           SetFlowMapTraits<T> > {
236 236
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
237
                          SetFlowMapTraits<_FlowMap> > Create;
237
                          SetFlowMapTraits<T> > Create;
238 238
    };
239 239

	
240
    template <typename _Elevator>
240
    template <typename T>
241 241
    struct SetElevatorTraits : public Traits {
242
      typedef _Elevator Elevator;
242
      typedef T Elevator;
243 243
      static Elevator *createElevator(const Digraph&, int) {
244 244
        LEMON_ASSERT(false, "Elevator is not initialized");
245 245
        return 0; // ignore warnings
246 246
      }
247 247
    };
248 248

	
249 249
    /// \brief \ref named-templ-param "Named parameter" for setting
250 250
    /// Elevator type
251 251
    ///
252 252
    /// \ref named-templ-param "Named parameter" for setting Elevator
253 253
    /// type. If this named parameter is used, then an external
254 254
    /// elevator object must be passed to the algorithm using the
255 255
    /// \ref elevator(Elevator&) "elevator()" function before calling
256 256
    /// \ref run() or \ref init().
257 257
    /// \sa SetStandardElevator
258
    template <typename _Elevator>
258
    template <typename T>
259 259
    struct SetElevator
260 260
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
261
                           SetElevatorTraits<_Elevator> > {
261
                           SetElevatorTraits<T> > {
262 262
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
263
                          SetElevatorTraits<_Elevator> > Create;
263
                          SetElevatorTraits<T> > Create;
264 264
    };
265 265

	
266
    template <typename _Elevator>
266
    template <typename T>
267 267
    struct SetStandardElevatorTraits : public Traits {
268
      typedef _Elevator Elevator;
268
      typedef T Elevator;
269 269
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
270 270
        return new Elevator(digraph, max_level);
271 271
      }
272 272
    };
273 273

	
274 274
    /// \brief \ref named-templ-param "Named parameter" for setting
275 275
    /// Elevator type with automatic allocation
276 276
    ///
277 277
    /// \ref named-templ-param "Named parameter" for setting Elevator
278 278
    /// type with automatic allocation.
279 279
    /// The Elevator should have standard constructor interface to be
280 280
    /// able to automatically created by the algorithm (i.e. the
281 281
    /// digraph and the maximum level should be passed to it).
282 282
    /// However an external elevator object could also be passed to the
283 283
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
284 284
    /// before calling \ref run() or \ref init().
285 285
    /// \sa SetElevator
286
    template <typename _Elevator>
286
    template <typename T>
287 287
    struct SetStandardElevator
288 288
      : public Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
289
                       SetStandardElevatorTraits<_Elevator> > {
289
                       SetStandardElevatorTraits<T> > {
290 290
      typedef Circulation<Digraph, LCapMap, UCapMap, DeltaMap,
291
                      SetStandardElevatorTraits<_Elevator> > Create;
291
                      SetStandardElevatorTraits<T> > Create;
292 292
    };
293 293

	
294 294
    /// @}
295 295

	
296 296
  protected:
297 297

	
298 298
    Circulation() {}
299 299

	
300 300
  public:
301 301

	
302 302
    /// The constructor of the class.
303 303

	
... ...
@@ -673,25 +673,25 @@
673 673
    }
674 674

	
675 675
    /// \brief Gives back a barrier.
676 676
    ///
677 677
    /// This function sets \c bar to the characteristic vector of the
678 678
    /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
679 679
    /// node map with \c bool (or convertible) value type.
680 680
    ///
681 681
    /// If a feasible circulation is found, the function gives back an
682 682
    /// empty set, so \c bar[v] will be \c false for all nodes \c v.
683 683
    ///
684 684
    /// \note This function calls \ref barrier() for each node,
685
    /// so it runs in \f$O(n)\f$ time.
685
    /// so it runs in O(n) time.
686 686
    ///
687 687
    /// \pre Either \ref run() or \ref init() must be called before
688 688
    /// using this function.
689 689
    ///
690 690
    /// \sa barrier()
691 691
    /// \sa checkBarrier()
692 692
    template<class BarrierMap>
693 693
    void barrierMap(BarrierMap &bar) const
694 694
    {
695 695
      for(NodeIt n(_g);n!=INVALID;++n)
696 696
        bar.set(n, (*_level)[n] >= _el);
697 697
    }
Ignore white space 24 line context
... ...
@@ -592,41 +592,53 @@
592 592
      ///
593 593
      /// Returns whether the given directed arc is same orientation as
594 594
      /// the corresponding edge's default orientation.
595 595
      bool direction(Arc) const { return true; }
596 596

	
597 597
      /// \brief Returns the opposite directed arc.
598 598
      ///
599 599
      /// Returns the opposite directed arc.
600 600
      Arc oppositeArc(Arc) const { return INVALID; }
601 601

	
602 602
      /// \brief Opposite node on an arc
603 603
      ///
604
      /// \return the opposite of the given Node on the given Edge
604
      /// \return The opposite of the given node on the given edge.
605 605
      Node oppositeNode(Node, Edge) const { return INVALID; }
606 606

	
607 607
      /// \brief First node of the edge.
608 608
      ///
609
      /// \return the first node of the given Edge.
609
      /// \return The first node of the given edge.
610 610
      ///
611 611
      /// Naturally edges don't have direction and thus
612
      /// don't have source and target node. But we use these two methods
613
      /// to query the two nodes of the arc. The direction of the arc
614
      /// which arises this way is called the inherent direction of the
612
      /// don't have source and target node. However we use \c u() and \c v()
613
      /// methods to query the two nodes of the arc. The direction of the
614
      /// arc which arises this way is called the inherent direction of the
615 615
      /// edge, and is used to define the "default" direction
616 616
      /// of the directed versions of the arcs.
617
      /// \sa direction
617
      /// \sa v()
618
      /// \sa direction()
618 619
      Node u(Edge) const { return INVALID; }
619 620

	
620 621
      /// \brief Second node of the edge.
622
      ///
623
      /// \return The second node of the given edge.
624
      ///
625
      /// Naturally edges don't have direction and thus
626
      /// don't have source and target node. However we use \c u() and \c v()
627
      /// methods to query the two nodes of the arc. The direction of the
628
      /// arc which arises this way is called the inherent direction of the
629
      /// edge, and is used to define the "default" direction
630
      /// of the directed versions of the arcs.
631
      /// \sa u()
632
      /// \sa direction()
621 633
      Node v(Edge) const { return INVALID; }
622 634

	
623 635
      /// \brief Source node of the directed arc.
624 636
      Node source(Arc) const { return INVALID; }
625 637

	
626 638
      /// \brief Target node of the directed arc.
627 639
      Node target(Arc) const { return INVALID; }
628 640

	
629 641
      /// \brief Returns the id of the node.
630 642
      int id(Node) const { return -1; }
631 643

	
632 644
      /// \brief Returns the id of the edge.
Ignore white space 24 line context
... ...
@@ -11,49 +11,48 @@
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

	
23

	
24 23
#ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
25 24
#define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
26 25

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

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

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

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

	
46 45
#ifndef DOXYGEN
47
    template <char _selector = '0'>
46
    template <char sel = '0'>
48 47
#endif
49 48
    class GraphItem {
50 49
    public:
51 50
      /// \brief Default constructor.
52 51
      ///
53 52
      /// \warning The default constructor is not required to set
54 53
      /// the item to some well-defined value. So you should consider it
55 54
      /// as uninitialized.
56 55
      GraphItem() {}
57 56
      /// \brief Copy constructor.
58 57
      ///
59 58
      /// Copy constructor.
... ...
@@ -287,29 +286,29 @@
287 286

	
288 287
        const _Graph& graph;
289 288
      };
290 289

	
291 290
    };
292 291

	
293 292
    /// \brief An empty idable base digraph class.
294 293
    ///
295 294
    /// This class provides beside the core digraph features
296 295
    /// core id functions for the digraph structure.
297 296
    /// The most of the base digraphs should conform to this concept.
298 297
    /// The id's are unique and immutable.
299
    template <typename _Base = BaseDigraphComponent>
300
    class IDableDigraphComponent : public _Base {
298
    template <typename BAS = BaseDigraphComponent>
299
    class IDableDigraphComponent : public BAS {
301 300
    public:
302 301

	
303
      typedef _Base Base;
302
      typedef BAS Base;
304 303
      typedef typename Base::Node Node;
305 304
      typedef typename Base::Arc Arc;
306 305

	
307 306
      /// \brief Gives back an unique integer id for the Node.
308 307
      ///
309 308
      /// Gives back an unique integer id for the Node.
310 309
      ///
311 310
      int id(const Node&) const { return -1;}
312 311

	
313 312
      /// \brief Gives back the node by the unique id.
314 313
      ///
315 314
      /// Gives back the node by the unique id.
... ...
@@ -365,32 +364,32 @@
365 364
        }
366 365

	
367 366
        const _Digraph& digraph;
368 367
      };
369 368
    };
370 369

	
371 370
    /// \brief An empty idable base undirected graph class.
372 371
    ///
373 372
    /// This class provides beside the core undirected graph features
374 373
    /// core id functions for the undirected graph structure.  The
375 374
    /// most of the base undirected graphs should conform to this
376 375
    /// concept.  The id's are unique and immutable.
377
    template <typename _Base = BaseGraphComponent>
378
    class IDableGraphComponent : public IDableDigraphComponent<_Base> {
376
    template <typename BAS = BaseGraphComponent>
377
    class IDableGraphComponent : public IDableDigraphComponent<BAS> {
379 378
    public:
380 379

	
381
      typedef _Base Base;
380
      typedef BAS Base;
382 381
      typedef typename Base::Edge Edge;
383 382

	
384
      using IDableDigraphComponent<_Base>::id;
383
      using IDableDigraphComponent<Base>::id;
385 384

	
386 385
      /// \brief Gives back an unique integer id for the Edge.
387 386
      ///
388 387
      /// Gives back an unique integer id for the Edge.
389 388
      ///
390 389
      int id(const Edge&) const { return -1;}
391 390

	
392 391
      /// \brief Gives back the edge by the unique id.
393 392
      ///
394 393
      /// Gives back the edge by the unique id.  If the
395 394
      /// graph does not contain arc with the given id then the
396 395
      /// result of the function is undetermined.
... ...
@@ -416,42 +415,42 @@
416 415
          ueid = graph.maxEdgeId();
417 416
          ignore_unused_variable_warning(ueid);
418 417
        }
419 418

	
420 419
        const _Graph& graph;
421 420
      };
422 421
    };
423 422

	
424 423
    /// \brief Skeleton class for graph NodeIt and ArcIt
425 424
    ///
426 425
    /// Skeleton class for graph NodeIt and ArcIt.
427 426
    ///
428
    template <typename _Graph, typename _Item>
429
    class GraphItemIt : public _Item {
427
    template <typename GR, typename Item>
428
    class GraphItemIt : public Item {
430 429
    public:
431 430
      /// \brief Default constructor.
432 431
      ///
433 432
      /// @warning The default constructor sets the iterator
434 433
      /// to an undefined value.
435 434
      GraphItemIt() {}
436 435
      /// \brief Copy constructor.
437 436
      ///
438 437
      /// Copy constructor.
439 438
      ///
440 439
      GraphItemIt(const GraphItemIt& ) {}
441 440
      /// \brief Sets the iterator to the first item.
442 441
      ///
443 442
      /// Sets the iterator to the first item of \c the graph.
444 443
      ///
445
      explicit GraphItemIt(const _Graph&) {}
444
      explicit GraphItemIt(const GR&) {}
446 445
      /// \brief Invalid constructor \& conversion.
447 446
      ///
448 447
      /// This constructor initializes the item to be invalid.
449 448
      /// \sa Invalid for more details.
450 449
      GraphItemIt(Invalid) {}
451 450
      /// \brief Assign operator for items.
452 451
      ///
453 452
      /// The items are assignable.
454 453
      ///
455 454
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
456 455
      /// \brief Next item.
457 456
      ///
... ...
@@ -470,60 +469,60 @@
470 469
      bool operator!=(const GraphItemIt&) const { return true;}
471 470

	
472 471
      template<typename _GraphItemIt>
473 472
      struct Constraints {
474 473
        void constraints() {
475 474
          _GraphItemIt it1(g);
476 475
          _GraphItemIt it2;
477 476

	
478 477
          it2 = ++it1;
479 478
          ++it2 = it1;
480 479
          ++(++it1);
481 480

	
482
          _Item bi = it1;
481
          Item bi = it1;
483 482
          bi = it2;
484 483
        }
485
        _Graph& g;
484
        GR& g;
486 485
      };
487 486
    };
488 487

	
489 488
    /// \brief Skeleton class for graph InArcIt and OutArcIt
490 489
    ///
491 490
    /// \note Because InArcIt and OutArcIt may not inherit from the same
492
    /// base class, the _selector is a additional template parameter. For
493
    /// InArcIt you should instantiate it with character 'i' and for
491
    /// base class, the \c sel is a additional template parameter (selector).
492
    /// For InArcIt you should instantiate it with character 'i' and for
494 493
    /// OutArcIt with 'o'.
495
    template <typename _Graph,
496
              typename _Item = typename _Graph::Arc,
497
              typename _Base = typename _Graph::Node,
498
              char _selector = '0'>
499
    class GraphIncIt : public _Item {
494
    template <typename GR,
495
              typename Item = typename GR::Arc,
496
              typename Base = typename GR::Node,
497
              char sel = '0'>
498
    class GraphIncIt : public Item {
500 499
    public:
501 500
      /// \brief Default constructor.
502 501
      ///
503 502
      /// @warning The default constructor sets the iterator
504 503
      /// to an undefined value.
505 504
      GraphIncIt() {}
506 505
      /// \brief Copy constructor.
507 506
      ///
508 507
      /// Copy constructor.
509 508
      ///
510
      GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
509
      GraphIncIt(GraphIncIt const& gi) : Item(gi) {}
511 510
      /// \brief Sets the iterator to the first arc incoming into or outgoing
512 511
      /// from the node.
513 512
      ///
514 513
      /// Sets the iterator to the first arc incoming into or outgoing
515 514
      /// from the node.
516 515
      ///
517
      explicit GraphIncIt(const _Graph&, const _Base&) {}
516
      explicit GraphIncIt(const GR&, const Base&) {}
518 517
      /// \brief Invalid constructor \& conversion.
519 518
      ///
520 519
      /// This constructor initializes the item to be invalid.
521 520
      /// \sa Invalid for more details.
522 521
      GraphIncIt(Invalid) {}
523 522
      /// \brief Assign operator for iterators.
524 523
      ///
525 524
      /// The iterators are assignable.
526 525
      ///
527 526
      GraphIncIt& operator=(GraphIncIt const&) { return *this; }
528 527
      /// \brief Next item.
529 528
      ///
... ...
@@ -537,55 +536,55 @@
537 536
      /// same object or both are invalid.
538 537
      bool operator==(const GraphIncIt&) const { return true;}
539 538

	
540 539
      /// \brief Inequality operator
541 540
      ///
542 541
      /// \sa operator==(Node n)
543 542
      ///
544 543
      bool operator!=(const GraphIncIt&) const { return true;}
545 544

	
546 545
      template <typename _GraphIncIt>
547 546
      struct Constraints {
548 547
        void constraints() {
549
          checkConcept<GraphItem<_selector>, _GraphIncIt>();
548
          checkConcept<GraphItem<sel>, _GraphIncIt>();
550 549
          _GraphIncIt it1(graph, node);
551 550
          _GraphIncIt it2;
552 551

	
553 552
          it2 = ++it1;
554 553
          ++it2 = it1;
555 554
          ++(++it1);
556
          _Item e = it1;
555
          Item e = it1;
557 556
          e = it2;
558 557

	
559 558
        }
560 559

	
561
        _Item arc;
562
        _Base node;
563
        _Graph graph;
560
        Item arc;
561
        Base node;
562
        GR graph;
564 563
        _GraphIncIt it;
565 564
      };
566 565
    };
567 566

	
568 567

	
569 568
    /// \brief An empty iterable digraph class.
570 569
    ///
571 570
    /// This class provides beside the core digraph features
572 571
    /// iterator based iterable interface for the digraph structure.
573 572
    /// This concept is part of the Digraph concept.
574
    template <typename _Base = BaseDigraphComponent>
575
    class IterableDigraphComponent : public _Base {
573
    template <typename BAS = BaseDigraphComponent>
574
    class IterableDigraphComponent : public BAS {
576 575

	
577 576
    public:
578 577

	
579
      typedef _Base Base;
578
      typedef BAS Base;
580 579
      typedef typename Base::Node Node;
581 580
      typedef typename Base::Arc Arc;
582 581

	
583 582
      typedef IterableDigraphComponent Digraph;
584 583

	
585 584
      /// \name Base iteration
586 585
      ///
587 586
      /// This interface provides functions for iteration on digraph items
588 587
      ///
589 588
      /// @{
590 589

	
591 590
      /// \brief Gives back the first node in the iterating order.
... ...
@@ -747,43 +746,43 @@
747 746
        }
748 747

	
749 748
        const _Digraph& digraph;
750 749

	
751 750
      };
752 751
    };
753 752

	
754 753
    /// \brief An empty iterable undirected graph class.
755 754
    ///
756 755
    /// This class provides beside the core graph features iterator
757 756
    /// based iterable interface for the undirected graph structure.
758 757
    /// This concept is part of the Graph concept.
759
    template <typename _Base = BaseGraphComponent>
760
    class IterableGraphComponent : public IterableDigraphComponent<_Base> {
758
    template <typename BAS = BaseGraphComponent>
759
    class IterableGraphComponent : public IterableDigraphComponent<BAS> {
761 760
    public:
762 761

	
763
      typedef _Base Base;
762
      typedef BAS Base;
764 763
      typedef typename Base::Node Node;
765 764
      typedef typename Base::Arc Arc;
766 765
      typedef typename Base::Edge Edge;
767 766

	
768 767

	
769 768
      typedef IterableGraphComponent Graph;
770 769

	
771 770
      /// \name Base iteration
772 771
      ///
773 772
      /// This interface provides functions for iteration on graph items
774 773
      /// @{
775 774

	
776
      using IterableDigraphComponent<_Base>::first;
777
      using IterableDigraphComponent<_Base>::next;
775
      using IterableDigraphComponent<Base>::first;
776
      using IterableDigraphComponent<Base>::next;
778 777

	
779 778
      /// \brief Gives back the first edge in the iterating
780 779
      /// order.
781 780
      ///
782 781
      /// Gives back the first edge in the iterating order.
783 782
      ///
784 783
      void first(Edge&) const {}
785 784

	
786 785
      /// \brief Gives back the next edge in the iterating
787 786
      /// order.
788 787
      ///
789 788
      /// Gives back the next edge in the iterating order.
... ...
@@ -799,26 +798,26 @@
799 798
      /// gives a good direction of the edge so the source of the
800 799
      /// directed arc is the given node.
801 800
      void firstInc(Edge&, bool&, const Node&) const {}
802 801

	
803 802
      /// \brief Gives back the next of the edges from the
804 803
      /// given node.
805 804
      ///
806 805
      /// Gives back the next of the edges from the given
807 806
      /// node. The bool parameter should be used as the \c firstInc()
808 807
      /// use it.
809 808
      void nextInc(Edge&, bool&) const {}
810 809

	
811
      using IterableDigraphComponent<_Base>::baseNode;
812
      using IterableDigraphComponent<_Base>::runningNode;
810
      using IterableDigraphComponent<Base>::baseNode;
811
      using IterableDigraphComponent<Base>::runningNode;
813 812

	
814 813
      /// @}
815 814

	
816 815
      /// \name Class based iteration
817 816
      ///
818 817
      /// This interface provides functions for iteration on graph items
819 818
      ///
820 819
      /// @{
821 820

	
822 821
      /// \brief This iterator goes through each node.
823 822
      ///
824 823
      /// This iterator goes through each node.
... ...
@@ -866,41 +865,40 @@
866 865
              typename _Graph::EdgeIt >();
867 866
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
868 867
              typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
869 868

	
870 869
            typename _Graph::Node n;
871 870
            typename _Graph::IncEdgeIt ueit(INVALID);
872 871
            n = graph.baseNode(ueit);
873 872
            n = graph.runningNode(ueit);
874 873
          }
875 874
        }
876 875

	
877 876
        const _Graph& graph;
878

	
879 877
      };
880 878
    };
881 879

	
882 880
    /// \brief An empty alteration notifier digraph class.
883 881
    ///
884 882
    /// This class provides beside the core digraph features alteration
885 883
    /// notifier interface for the digraph structure.  This implements
886 884
    /// an observer-notifier pattern for each digraph item. More
887 885
    /// obsevers can be registered into the notifier and whenever an
888 886
    /// alteration occured in the digraph all the observers will
889 887
    /// notified about it.
890
    template <typename _Base = BaseDigraphComponent>
891
    class AlterableDigraphComponent : public _Base {
888
    template <typename BAS = BaseDigraphComponent>
889
    class AlterableDigraphComponent : public BAS {
892 890
    public:
893 891

	
894
      typedef _Base Base;
892
      typedef BAS Base;
895 893
      typedef typename Base::Node Node;
896 894
      typedef typename Base::Arc Arc;
897 895

	
898 896

	
899 897
      /// The node observer registry.
900 898
      typedef AlterationNotifier<AlterableDigraphComponent, Node>
901 899
      NodeNotifier;
902 900
      /// The arc observer registry.
903 901
      typedef AlterationNotifier<AlterableDigraphComponent, Arc>
904 902
      ArcNotifier;
905 903

	
906 904
      /// \brief Gives back the node alteration notifier.
... ...
@@ -936,75 +934,73 @@
936 934
      };
937 935

	
938 936
    };
939 937

	
940 938
    /// \brief An empty alteration notifier undirected graph class.
941 939
    ///
942 940
    /// This class provides beside the core graph features alteration
943 941
    /// notifier interface for the graph structure.  This implements
944 942
    /// an observer-notifier pattern for each graph item. More
945 943
    /// obsevers can be registered into the notifier and whenever an
946 944
    /// alteration occured in the graph all the observers will
947 945
    /// notified about it.
948
    template <typename _Base = BaseGraphComponent>
949
    class AlterableGraphComponent : public AlterableDigraphComponent<_Base> {
946
    template <typename BAS = BaseGraphComponent>
947
    class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
950 948
    public:
951 949

	
952
      typedef _Base Base;
950
      typedef BAS Base;
953 951
      typedef typename Base::Edge Edge;
954 952

	
955 953

	
956 954
      /// The arc observer registry.
957 955
      typedef AlterationNotifier<AlterableGraphComponent, Edge>
958 956
      EdgeNotifier;
959 957

	
960 958
      /// \brief Gives back the arc alteration notifier.
961 959
      ///
962 960
      /// Gives back the arc alteration notifier.
963 961
      EdgeNotifier& notifier(Edge) const {
964 962
        return EdgeNotifier();
965 963
      }
966 964

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

	
976 974
        const _Graph& graph;
977

	
978 975
      };
979

	
980 976
    };
981 977

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

	
991
      typedef ReadWriteMap<_Item, _Value> Parent;
987
      typedef ReadWriteMap<K, V> Parent;
992 988

	
993 989
      /// The graph type of the map.
994
      typedef _Graph Graph;
990
      typedef GR Graph;
995 991
      /// The key type of the map.
996
      typedef _Item Key;
992
      typedef K Key;
997 993
      /// The value type of the map.
998
      typedef _Value Value;
994
      typedef V Value;
999 995

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

	
1009 1005
    private:
1010 1006
      /// \brief Copy constructor.
... ...
@@ -1046,105 +1042,105 @@
1046 1042
        const _Map &c;
1047 1043
        const Graph &g;
1048 1044
        const typename GraphMap::Value &t;
1049 1045
      };
1050 1046

	
1051 1047
    };
1052 1048

	
1053 1049
    /// \brief An empty mappable digraph class.
1054 1050
    ///
1055 1051
    /// This class provides beside the core digraph features
1056 1052
    /// map interface for the digraph structure.
1057 1053
    /// This concept is part of the Digraph concept.
1058
    template <typename _Base = BaseDigraphComponent>
1059
    class MappableDigraphComponent : public _Base  {
1054
    template <typename BAS = BaseDigraphComponent>
1055
    class MappableDigraphComponent : public BAS  {
1060 1056
    public:
1061 1057

	
1062
      typedef _Base Base;
1058
      typedef BAS Base;
1063 1059
      typedef typename Base::Node Node;
1064 1060
      typedef typename Base::Arc Arc;
1065 1061

	
1066 1062
      typedef MappableDigraphComponent Digraph;
1067 1063

	
1068 1064
      /// \brief ReadWrite map of the nodes.
1069 1065
      ///
1070 1066
      /// ReadWrite map of the nodes.
1071 1067
      ///
1072
      template <typename _Value>
1073
      class NodeMap : public GraphMap<Digraph, Node, _Value> {
1068
      template <typename V>
1069
      class NodeMap : public GraphMap<Digraph, Node, V> {
1074 1070
      public:
1075
        typedef GraphMap<MappableDigraphComponent, Node, _Value> Parent;
1071
        typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
1076 1072

	
1077 1073
        /// \brief Construct a new map.
1078 1074
        ///
1079 1075
        /// Construct a new map for the digraph.
1080 1076
        explicit NodeMap(const MappableDigraphComponent& digraph)
1081 1077
          : Parent(digraph) {}
1082 1078

	
1083 1079
        /// \brief Construct a new map with default value.
1084 1080
        ///
1085 1081
        /// Construct a new map for the digraph and initalise the values.
1086
        NodeMap(const MappableDigraphComponent& digraph, const _Value& value)
1082
        NodeMap(const MappableDigraphComponent& digraph, const V& value)
1087 1083
          : Parent(digraph, value) {}
1088 1084

	
1089 1085
      private:
1090 1086
        /// \brief Copy constructor.
1091 1087
        ///
1092 1088
        /// Copy Constructor.
1093 1089
        NodeMap(const NodeMap& nm) : Parent(nm) {}
1094 1090

	
1095 1091
        /// \brief Assign operator.
1096 1092
        ///
1097 1093
        /// Assign operator.
1098 1094
        template <typename CMap>
1099 1095
        NodeMap& operator=(const CMap&) {
1100
          checkConcept<ReadMap<Node, _Value>, CMap>();
1096
          checkConcept<ReadMap<Node, V>, CMap>();
1101 1097
          return *this;
1102 1098
        }
1103 1099

	
1104 1100
      };
1105 1101

	
1106 1102
      /// \brief ReadWrite map of the arcs.
1107 1103
      ///
1108 1104
      /// ReadWrite map of the arcs.
1109 1105
      ///
1110
      template <typename _Value>
1111
      class ArcMap : public GraphMap<Digraph, Arc, _Value> {
1106
      template <typename V>
1107
      class ArcMap : public GraphMap<Digraph, Arc, V> {
1112 1108
      public:
1113
        typedef GraphMap<MappableDigraphComponent, Arc, _Value> Parent;
1109
        typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
1114 1110

	
1115 1111
        /// \brief Construct a new map.
1116 1112
        ///
1117 1113
        /// Construct a new map for the digraph.
1118 1114
        explicit ArcMap(const MappableDigraphComponent& digraph)
1119 1115
          : Parent(digraph) {}
1120 1116

	
1121 1117
        /// \brief Construct a new map with default value.
1122 1118
        ///
1123 1119
        /// Construct a new map for the digraph and initalise the values.
1124
        ArcMap(const MappableDigraphComponent& digraph, const _Value& value)
1120
        ArcMap(const MappableDigraphComponent& digraph, const V& value)
1125 1121
          : Parent(digraph, value) {}
1126 1122

	
1127 1123
      private:
1128 1124
        /// \brief Copy constructor.
1129 1125
        ///
1130 1126
        /// Copy Constructor.
1131 1127
        ArcMap(const ArcMap& nm) : Parent(nm) {}
1132 1128

	
1133 1129
        /// \brief Assign operator.
1134 1130
        ///
1135 1131
        /// Assign operator.
1136 1132
        template <typename CMap>
1137 1133
        ArcMap& operator=(const CMap&) {
1138
          checkConcept<ReadMap<Arc, _Value>, CMap>();
1134
          checkConcept<ReadMap<Arc, V>, CMap>();
1139 1135
          return *this;
1140 1136
        }
1141 1137

	
1142 1138
      };
1143 1139

	
1144 1140

	
1145 1141
      template <typename _Digraph>
1146 1142
      struct Constraints {
1147 1143

	
1148 1144
        struct Dummy {
1149 1145
          int value;
1150 1146
          Dummy() : value(0) {}
... ...
@@ -1182,66 +1178,66 @@
1182 1178
          }
1183 1179
        }
1184 1180

	
1185 1181
        _Digraph& digraph;
1186 1182
      };
1187 1183
    };
1188 1184

	
1189 1185
    /// \brief An empty mappable base bipartite graph class.
1190 1186
    ///
1191 1187
    /// This class provides beside the core graph features
1192 1188
    /// map interface for the graph structure.
1193 1189
    /// This concept is part of the Graph concept.
1194
    template <typename _Base = BaseGraphComponent>
1195
    class MappableGraphComponent : public MappableDigraphComponent<_Base>  {
1190
    template <typename BAS = BaseGraphComponent>
1191
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1196 1192
    public:
1197 1193

	
1198
      typedef _Base Base;
1194
      typedef BAS Base;
1199 1195
      typedef typename Base::Edge Edge;
1200 1196

	
1201 1197
      typedef MappableGraphComponent Graph;
1202 1198

	
1203 1199
      /// \brief ReadWrite map of the edges.
1204 1200
      ///
1205 1201
      /// ReadWrite map of the edges.
1206 1202
      ///
1207
      template <typename _Value>
1208
      class EdgeMap : public GraphMap<Graph, Edge, _Value> {
1203
      template <typename V>
1204
      class EdgeMap : public GraphMap<Graph, Edge, V> {
1209 1205
      public:
1210
        typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
1206
        typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
1211 1207

	
1212 1208
        /// \brief Construct a new map.
1213 1209
        ///
1214 1210
        /// Construct a new map for the graph.
1215 1211
        explicit EdgeMap(const MappableGraphComponent& graph)
1216 1212
          : Parent(graph) {}
1217 1213

	
1218 1214
        /// \brief Construct a new map with default value.
1219 1215
        ///
1220 1216
        /// Construct a new map for the graph and initalise the values.
1221
        EdgeMap(const MappableGraphComponent& graph, const _Value& value)
1217
        EdgeMap(const MappableGraphComponent& graph, const V& value)
1222 1218
          : Parent(graph, value) {}
1223 1219

	
1224 1220
      private:
1225 1221
        /// \brief Copy constructor.
1226 1222
        ///
1227 1223
        /// Copy Constructor.
1228 1224
        EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1229 1225

	
1230 1226
        /// \brief Assign operator.
1231 1227
        ///
1232 1228
        /// Assign operator.
1233 1229
        template <typename CMap>
1234 1230
        EdgeMap& operator=(const CMap&) {
1235
          checkConcept<ReadMap<Edge, _Value>, CMap>();
1231
          checkConcept<ReadMap<Edge, V>, CMap>();
1236 1232
          return *this;
1237 1233
        }
1238 1234

	
1239 1235
      };
1240 1236

	
1241 1237

	
1242 1238
      template <typename _Graph>
1243 1239
      struct Constraints {
1244 1240

	
1245 1241
        struct Dummy {
1246 1242
          int value;
1247 1243
          Dummy() : value(0) {}
... ...
@@ -1267,31 +1263,31 @@
1267 1263
        }
1268 1264

	
1269 1265
        _Graph& graph;
1270 1266
      };
1271 1267
    };
1272 1268

	
1273 1269
    /// \brief An empty extendable digraph class.
1274 1270
    ///
1275 1271
    /// This class provides beside the core digraph features digraph
1276 1272
    /// extendable interface for the digraph structure.  The main
1277 1273
    /// difference between the base and this interface is that the
1278 1274
    /// digraph alterations should handled already on this level.
1279
    template <typename _Base = BaseDigraphComponent>
1280
    class ExtendableDigraphComponent : public _Base {
1275
    template <typename BAS = BaseDigraphComponent>
1276
    class ExtendableDigraphComponent : public BAS {
1281 1277
    public:
1282
      typedef _Base Base;
1278
      typedef BAS Base;
1283 1279

	
1284
      typedef typename _Base::Node Node;
1285
      typedef typename _Base::Arc Arc;
1280
      typedef typename Base::Node Node;
1281
      typedef typename Base::Arc Arc;
1286 1282

	
1287 1283
      /// \brief Adds a new node to the digraph.
1288 1284
      ///
1289 1285
      /// Adds a new node to the digraph.
1290 1286
      ///
1291 1287
      Node addNode() {
1292 1288
        return INVALID;
1293 1289
      }
1294 1290

	
1295 1291
      /// \brief Adds a new arc connects the given two nodes.
1296 1292
      ///
1297 1293
      /// Adds a new arc connects the the given two nodes.
... ...
@@ -1312,31 +1308,31 @@
1312 1308

	
1313 1309
        _Digraph& digraph;
1314 1310
      };
1315 1311
    };
1316 1312

	
1317 1313
    /// \brief An empty extendable base undirected graph class.
1318 1314
    ///
1319 1315
    /// This class provides beside the core undirected graph features
1320 1316
    /// core undircted graph extend interface for the graph structure.
1321 1317
    /// The main difference between the base and this interface is
1322 1318
    /// that the graph alterations should handled already on this
1323 1319
    /// level.
1324
    template <typename _Base = BaseGraphComponent>
1325
    class ExtendableGraphComponent : public _Base {
1320
    template <typename BAS = BaseGraphComponent>
1321
    class ExtendableGraphComponent : public BAS {
1326 1322
    public:
1327 1323

	
1328
      typedef _Base Base;
1329
      typedef typename _Base::Node Node;
1330
      typedef typename _Base::Edge Edge;
1324
      typedef BAS Base;
1325
      typedef typename Base::Node Node;
1326
      typedef typename Base::Edge Edge;
1331 1327

	
1332 1328
      /// \brief Adds a new node to the graph.
1333 1329
      ///
1334 1330
      /// Adds a new node to the graph.
1335 1331
      ///
1336 1332
      Node addNode() {
1337 1333
        return INVALID;
1338 1334
      }
1339 1335

	
1340 1336
      /// \brief Adds a new arc connects the given two nodes.
1341 1337
      ///
1342 1338
      /// Adds a new arc connects the the given two nodes.
... ...
@@ -1356,29 +1352,29 @@
1356 1352
        }
1357 1353

	
1358 1354
        _Graph& graph;
1359 1355
      };
1360 1356
    };
1361 1357

	
1362 1358
    /// \brief An empty erasable digraph class.
1363 1359
    ///
1364 1360
    /// This class provides beside the core digraph features core erase
1365 1361
    /// functions for the digraph structure. The main difference between
1366 1362
    /// the base and this interface is that the digraph alterations
1367 1363
    /// should handled already on this level.
1368
    template <typename _Base = BaseDigraphComponent>
1369
    class ErasableDigraphComponent : public _Base {
1364
    template <typename BAS = BaseDigraphComponent>
1365
    class ErasableDigraphComponent : public BAS {
1370 1366
    public:
1371 1367

	
1372
      typedef _Base Base;
1368
      typedef BAS Base;
1373 1369
      typedef typename Base::Node Node;
1374 1370
      typedef typename Base::Arc Arc;
1375 1371

	
1376 1372
      /// \brief Erase a node from the digraph.
1377 1373
      ///
1378 1374
      /// Erase a node from the digraph. This function should
1379 1375
      /// erase all arcs connecting to the node.
1380 1376
      void erase(const Node&) {}
1381 1377

	
1382 1378
      /// \brief Erase an arc from the digraph.
1383 1379
      ///
1384 1380
      /// Erase an arc from the digraph.
... ...
@@ -1396,29 +1392,29 @@
1396 1392
        }
1397 1393

	
1398 1394
        _Digraph& digraph;
1399 1395
      };
1400 1396
    };
1401 1397

	
1402 1398
    /// \brief An empty erasable base undirected graph class.
1403 1399
    ///
1404 1400
    /// This class provides beside the core undirected graph features
1405 1401
    /// core erase functions for the undirceted graph structure. The
1406 1402
    /// main difference between the base and this interface is that
1407 1403
    /// the graph alterations should handled already on this level.
1408
    template <typename _Base = BaseGraphComponent>
1409
    class ErasableGraphComponent : public _Base {
1404
    template <typename BAS = BaseGraphComponent>
1405
    class ErasableGraphComponent : public BAS {
1410 1406
    public:
1411 1407

	
1412
      typedef _Base Base;
1408
      typedef BAS Base;
1413 1409
      typedef typename Base::Node Node;
1414 1410
      typedef typename Base::Edge Edge;
1415 1411

	
1416 1412
      /// \brief Erase a node from the graph.
1417 1413
      ///
1418 1414
      /// Erase a node from the graph. This function should erase
1419 1415
      /// arcs connecting to the node.
1420 1416
      void erase(const Node&) {}
1421 1417

	
1422 1418
      /// \brief Erase an arc from the graph.
1423 1419
      ///
1424 1420
      /// Erase an arc from the graph.
... ...
@@ -1436,58 +1432,58 @@
1436 1432
        }
1437 1433

	
1438 1434
        _Graph& graph;
1439 1435
      };
1440 1436
    };
1441 1437

	
1442 1438
    /// \brief An empty clearable base digraph class.
1443 1439
    ///
1444 1440
    /// This class provides beside the core digraph features core clear
1445 1441
    /// functions for the digraph structure. The main difference between
1446 1442
    /// the base and this interface is that the digraph alterations
1447 1443
    /// should handled already on this level.
1448
    template <typename _Base = BaseDigraphComponent>
1449
    class ClearableDigraphComponent : public _Base {
1444
    template <typename BAS = BaseDigraphComponent>
1445
    class ClearableDigraphComponent : public BAS {
1450 1446
    public:
1451 1447

	
1452
      typedef _Base Base;
1448
      typedef BAS Base;
1453 1449

	
1454 1450
      /// \brief Erase all nodes and arcs from the digraph.
1455 1451
      ///
1456 1452
      /// Erase all nodes and arcs from the digraph.
1457 1453
      ///
1458 1454
      void clear() {}
1459 1455

	
1460 1456
      template <typename _Digraph>
1461 1457
      struct Constraints {
1462 1458
        void constraints() {
1463 1459
          checkConcept<Base, _Digraph>();
1464 1460
          digraph.clear();
1465 1461
        }
1466 1462

	
1467 1463
        _Digraph digraph;
1468 1464
      };
1469 1465
    };
1470 1466

	
1471 1467
    /// \brief An empty clearable base undirected graph class.
1472 1468
    ///
1473 1469
    /// This class provides beside the core undirected graph features
1474 1470
    /// core clear functions for the undirected graph structure. The
1475 1471
    /// main difference between the base and this interface is that
1476 1472
    /// the graph alterations should handled already on this level.
1477
    template <typename _Base = BaseGraphComponent>
1478
    class ClearableGraphComponent : public ClearableDigraphComponent<_Base> {
1473
    template <typename BAS = BaseGraphComponent>
1474
    class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
1479 1475
    public:
1480 1476

	
1481
      typedef _Base Base;
1477
      typedef BAS Base;
1482 1478

	
1483 1479
      template <typename _Graph>
1484 1480
      struct Constraints {
1485 1481
        void constraints() {
1486 1482
          checkConcept<ClearableGraphComponent<Base>, _Graph>();
1487 1483
        }
1488 1484

	
1489 1485
        _Graph graph;
1490 1486
      };
1491 1487
    };
1492 1488

	
1493 1489
  }
Ignore white space 24 line context
... ...
@@ -26,48 +26,63 @@
26 26
#include <lemon/core.h>
27 27
#include <lemon/concept_check.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// \brief The heap concept.
37 37
    ///
38
    /// Concept class describing the main interface of heaps.
39
    template <typename Priority, typename ItemIntMap>
38
    /// Concept class describing the main interface of heaps. A \e heap
39
    /// is a data structure for storing items with specified values called
40
    /// \e priorities in such a way that finding the item with minimum
41
    /// priority is efficient. In a heap one can change the priority of an
42
    /// item, add or erase an item, etc.
43
    ///
44
    /// \tparam PR Type of the priority of the items.
45
    /// \tparam IM A read and writable item map with int values, used
46
    /// internally to handle the cross references.
47
    /// \tparam Comp A functor class for the ordering of the priorities.
48
    /// The default is \c std::less<PR>.
49
#ifdef DOXYGEN
50
    template <typename PR, typename IM, typename Comp = std::less<PR> >
51
#else
52
    template <typename PR, typename IM>
53
#endif
40 54
    class Heap {
41 55
    public:
42 56

	
57
      /// Type of the item-int map.
58
      typedef IM ItemIntMap;
59
      /// Type of the priorities.
60
      typedef PR Prio;
43 61
      /// Type of the items stored in the heap.
44 62
      typedef typename ItemIntMap::Key Item;
45 63

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

	
49 64
      /// \brief Type to represent the states of the items.
50 65
      ///
51 66
      /// Each item has a state associated to it. It can be "in heap",
52 67
      /// "pre heap" or "post heap". The later two are indifferent
53 68
      /// from the point of view of the heap, but may be useful for
54 69
      /// the user.
55 70
      ///
56
      /// The \c ItemIntMap must be initialized in such a way, that it
57
      /// assigns \c PRE_HEAP (<tt>-1</tt>) to every item.
71
      /// The item-int map must be initialized in such way that it assigns
72
      /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
58 73
      enum State {
59
        IN_HEAP = 0,
60
        PRE_HEAP = -1,
61
        POST_HEAP = -2
74
        IN_HEAP = 0,    ///< The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< The "pre heap" state constant.
76
        POST_HEAP = -2  ///< The "post heap" state constant.
62 77
      };
63 78

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

	
73 88
      /// \brief The number of items stored in the heap.
... ...
@@ -110,53 +125,53 @@
110 125
      /// \pre The heap must be non-empty.
111 126
      void pop() {}
112 127

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

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

	
126 141
      /// \brief Sets the priority of an item or inserts it, if it is
127 142
      /// not stored in the heap.
128 143
      ///
129 144
      /// This method sets the priority of the given item if it is
130 145
      /// already stored in the heap.
131 146
      /// Otherwise it inserts the given item with the given priority.
132 147
      ///
133 148
      /// \param i The item.
134 149
      /// \param p The priority.
135 150
      void set(const Item &i, const Prio &p) {}
136 151

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

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

	
153 168
      /// \brief Returns if an item is in, has already been in, or has
154 169
      /// never been in the heap.
155 170
      ///
156 171
      /// This method returns \c PRE_HEAP if the given item has never
157 172
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
158 173
      /// and \c POST_HEAP otherwise.
159 174
      /// In the latter case it is possible that the item will get back
160 175
      /// to the heap again.
161 176
      /// \param i The item.
162 177
      State state(const Item &i) const {}
Ignore white space 24 line context
... ...
@@ -29,37 +29,37 @@
29 29

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

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

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

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

	
57 57
      class ArcIt;
58 58

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

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

	
... ...
@@ -196,36 +196,35 @@
196 196
    /// enumerate the arcs of the path wheter in forward or in
197 197
    /// backward order.  In most time these classes are not used
198 198
    /// directly rather it used to assign a dumped class to a real
199 199
    /// path type.
200 200
    ///
201 201
    /// The main purpose of this concept is that the shortest path
202 202
    /// algorithms can enumerate easily the arcs in reverse order.
203 203
    /// If we would like to give back a real path from these
204 204
    /// algorithms then we should create a temporarly path object. In
205 205
    /// LEMON such algorithms gives back a path dumper what can
206 206
    /// assigned to a real path and the dumpers can be implemented as
207 207
    /// an adaptor class to the predecessor map.
208

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

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

	
223 222
      /// Length of the path ie. the number of arcs in the path.
224 223
      int length() const { return 0;}
225 224

	
226 225
      /// Returns whether the path is empty.
227 226
      bool empty() const { return true;}
228 227

	
229 228
      /// \brief Forward or reverse dumping
230 229
      ///
231 230
      /// If the RevPathTag is defined and true then reverse dumping
Ignore white space 24 line context
... ...
@@ -37,25 +37,25 @@
37 37
/// \brief Connectivity algorithms
38 38
///
39 39
/// Connectivity algorithms
40 40

	
41 41
namespace lemon {
42 42

	
43 43
  /// \ingroup connectivity
44 44
  ///
45 45
  /// \brief Check whether the given undirected graph is connected.
46 46
  ///
47 47
  /// Check whether the given undirected graph is connected.
48 48
  /// \param graph The undirected graph.
49
  /// \return %True when there is path between any two nodes in the graph.
49
  /// \return \c true when there is path between any two nodes in the graph.
50 50
  /// \note By definition, the empty graph is connected.
51 51
  template <typename Graph>
52 52
  bool connected(const Graph& graph) {
53 53
    checkConcept<concepts::Graph, Graph>();
54 54
    typedef typename Graph::NodeIt NodeIt;
55 55
    if (NodeIt(graph) == INVALID) return true;
56 56
    Dfs<Graph> dfs(graph);
57 57
    dfs.run(NodeIt(graph));
58 58
    for (NodeIt it(graph); it != INVALID; ++it) {
59 59
      if (!dfs.reached(it)) {
60 60
        return false;
61 61
      }
... ...
@@ -225,25 +225,25 @@
225 225
    };
226 226

	
227 227
  }
228 228

	
229 229

	
230 230
  /// \ingroup connectivity
231 231
  ///
232 232
  /// \brief Check whether the given directed graph is strongly connected.
233 233
  ///
234 234
  /// Check whether the given directed graph is strongly connected. The
235 235
  /// graph is strongly connected when any two nodes of the graph are
236 236
  /// connected with directed paths in both direction.
237
  /// \return %False when the graph is not strongly connected.
237
  /// \return \c false when the graph is not strongly connected.
238 238
  /// \see connected
239 239
  ///
240 240
  /// \note By definition, the empty graph is strongly connected.
241 241
  template <typename Digraph>
242 242
  bool stronglyConnected(const Digraph& digraph) {
243 243
    checkConcept<concepts::Digraph, Digraph>();
244 244

	
245 245
    typedef typename Digraph::Node Node;
246 246
    typedef typename Digraph::NodeIt NodeIt;
247 247

	
248 248
    typename Digraph::Node source = NodeIt(digraph);
249 249
    if (source == INVALID) return true;
... ...
@@ -700,25 +700,25 @@
700 700
  template <typename Graph>
701 701
  int countBiNodeConnectedComponents(const Graph& graph);
702 702

	
703 703
  /// \ingroup connectivity
704 704
  ///
705 705
  /// \brief Checks the graph is bi-node-connected.
706 706
  ///
707 707
  /// This function checks that the undirected graph is bi-node-connected
708 708
  /// graph. The graph is bi-node-connected if any two undirected edge is
709 709
  /// on same circle.
710 710
  ///
711 711
  /// \param graph The graph.
712
  /// \return %True when the graph bi-node-connected.
712
  /// \return \c true when the graph bi-node-connected.
713 713
  template <typename Graph>
714 714
  bool biNodeConnected(const Graph& graph) {
715 715
    return countBiNodeConnectedComponents(graph) <= 1;
716 716
  }
717 717

	
718 718
  /// \ingroup connectivity
719 719
  ///
720 720
  /// \brief Count the biconnected components.
721 721
  ///
722 722
  /// This function finds the bi-node-connected components in an undirected
723 723
  /// graph. The biconnected components are the classes of an equivalence
724 724
  /// relation on the undirected edges. Two undirected edge is in relationship
... ...
@@ -1221,25 +1221,25 @@
1221 1221
  /// \ingroup connectivity
1222 1222
  ///
1223 1223
  /// \brief Sort the nodes of a DAG into topolgical order.
1224 1224
  ///
1225 1225
  /// Sort the nodes of a DAG into topolgical order. It also checks
1226 1226
  /// that the given graph is DAG.
1227 1227
  ///
1228 1228
  /// \param digraph The graph. It must be directed and acyclic.
1229 1229
  /// \retval order A readable - writable node map. The values will be set
1230 1230
  /// from 0 to the number of the nodes in the graph minus one. Each values
1231 1231
  /// of the map will be set exactly once, the values will be set descending
1232 1232
  /// order.
1233
  /// \return %False when the graph is not DAG.
1233
  /// \return \c false when the graph is not DAG.
1234 1234
  ///
1235 1235
  /// \see topologicalSort
1236 1236
  /// \see dag
1237 1237
  template <typename Digraph, typename NodeMap>
1238 1238
  bool checkedTopologicalSort(const Digraph& digraph, NodeMap& order) {
1239 1239
    using namespace _connectivity_bits;
1240 1240

	
1241 1241
    checkConcept<concepts::Digraph, Digraph>();
1242 1242
    checkConcept<concepts::ReadWriteMap<typename Digraph::Node, int>,
1243 1243
      NodeMap>();
1244 1244

	
1245 1245
    typedef typename Digraph::Node Node;
... ...
@@ -1270,25 +1270,25 @@
1270 1270
         }
1271 1271
      }
1272 1272
    }
1273 1273
    return true;
1274 1274
  }
1275 1275

	
1276 1276
  /// \ingroup connectivity
1277 1277
  ///
1278 1278
  /// \brief Check that the given directed graph is a DAG.
1279 1279
  ///
1280 1280
  /// Check that the given directed graph is a DAG. The DAG is
1281 1281
  /// an Directed Acyclic Digraph.
1282
  /// \return %False when the graph is not DAG.
1282
  /// \return \c false when the graph is not DAG.
1283 1283
  /// \see acyclic
1284 1284
  template <typename Digraph>
1285 1285
  bool dag(const Digraph& digraph) {
1286 1286

	
1287 1287
    checkConcept<concepts::Digraph, Digraph>();
1288 1288

	
1289 1289
    typedef typename Digraph::Node Node;
1290 1290
    typedef typename Digraph::NodeIt NodeIt;
1291 1291
    typedef typename Digraph::Arc Arc;
1292 1292

	
1293 1293
    typedef typename Digraph::template NodeMap<bool> ProcessedMap;
1294 1294

	
... ...
@@ -1312,25 +1312,25 @@
1312 1312
        }
1313 1313
      }
1314 1314
    }
1315 1315
    return true;
1316 1316
  }
1317 1317

	
1318 1318
  /// \ingroup connectivity
1319 1319
  ///
1320 1320
  /// \brief Check that the given undirected graph is acyclic.
1321 1321
  ///
1322 1322
  /// Check that the given undirected graph acyclic.
1323 1323
  /// \param graph The undirected graph.
1324
  /// \return %True when there is no circle in the graph.
1324
  /// \return \c true when there is no circle in the graph.
1325 1325
  /// \see dag
1326 1326
  template <typename Graph>
1327 1327
  bool acyclic(const Graph& graph) {
1328 1328
    checkConcept<concepts::Graph, Graph>();
1329 1329
    typedef typename Graph::Node Node;
1330 1330
    typedef typename Graph::NodeIt NodeIt;
1331 1331
    typedef typename Graph::Arc Arc;
1332 1332
    Dfs<Graph> dfs(graph);
1333 1333
    dfs.init();
1334 1334
    for (NodeIt it(graph); it != INVALID; ++it) {
1335 1335
      if (!dfs.reached(it)) {
1336 1336
        dfs.addSource(it);
... ...
@@ -1346,25 +1346,25 @@
1346 1346
        }
1347 1347
      }
1348 1348
    }
1349 1349
    return true;
1350 1350
  }
1351 1351

	
1352 1352
  /// \ingroup connectivity
1353 1353
  ///
1354 1354
  /// \brief Check that the given undirected graph is tree.
1355 1355
  ///
1356 1356
  /// Check that the given undirected graph is tree.
1357 1357
  /// \param graph The undirected graph.
1358
  /// \return %True when the graph is acyclic and connected.
1358
  /// \return \c true when the graph is acyclic and connected.
1359 1359
  template <typename Graph>
1360 1360
  bool tree(const Graph& graph) {
1361 1361
    checkConcept<concepts::Graph, Graph>();
1362 1362
    typedef typename Graph::Node Node;
1363 1363
    typedef typename Graph::NodeIt NodeIt;
1364 1364
    typedef typename Graph::Arc Arc;
1365 1365
    Dfs<Graph> dfs(graph);
1366 1366
    dfs.init();
1367 1367
    dfs.addSource(NodeIt(graph));
1368 1368
    while (!dfs.emptyQueue()) {
1369 1369
      Arc edge = dfs.nextArc();
1370 1370
      Node source = graph.source(edge);
... ...
@@ -1439,25 +1439,25 @@
1439 1439
      PartMap& _part;
1440 1440
      bool& _bipartite;
1441 1441
    };
1442 1442
  }
1443 1443

	
1444 1444
  /// \ingroup connectivity
1445 1445
  ///
1446 1446
  /// \brief Check if the given undirected graph is bipartite or not
1447 1447
  ///
1448 1448
  /// The function checks if the given undirected \c graph graph is bipartite
1449 1449
  /// or not. The \ref Bfs algorithm is used to calculate the result.
1450 1450
  /// \param graph The undirected graph.
1451
  /// \return %True if \c graph is bipartite, %false otherwise.
1451
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1452 1452
  /// \sa bipartitePartitions
1453 1453
  template<typename Graph>
1454 1454
  inline bool bipartite(const Graph &graph){
1455 1455
    using namespace _connectivity_bits;
1456 1456

	
1457 1457
    checkConcept<concepts::Graph, Graph>();
1458 1458

	
1459 1459
    typedef typename Graph::NodeIt NodeIt;
1460 1460
    typedef typename Graph::ArcIt ArcIt;
1461 1461

	
1462 1462
    bool bipartite = true;
1463 1463

	
... ...
@@ -1480,25 +1480,25 @@
1480 1480

	
1481 1481
  /// \ingroup connectivity
1482 1482
  ///
1483 1483
  /// \brief Check if the given undirected graph is bipartite or not
1484 1484
  ///
1485 1485
  /// The function checks if the given undirected graph is bipartite
1486 1486
  /// or not. The  \ref  Bfs  algorithm  is   used  to  calculate the result.
1487 1487
  /// During the execution, the \c partMap will be set as the two
1488 1488
  /// partitions of the graph.
1489 1489
  /// \param graph The undirected graph.
1490 1490
  /// \retval partMap A writable bool map of nodes. It will be set as the
1491 1491
  /// two partitions of the graph.
1492
  /// \return %True if \c graph is bipartite, %false otherwise.
1492
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1493 1493
  template<typename Graph, typename NodeMap>
1494 1494
  inline bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1495 1495
    using namespace _connectivity_bits;
1496 1496

	
1497 1497
    checkConcept<concepts::Graph, Graph>();
1498 1498

	
1499 1499
    typedef typename Graph::Node Node;
1500 1500
    typedef typename Graph::NodeIt NodeIt;
1501 1501
    typedef typename Graph::ArcIt ArcIt;
1502 1502

	
1503 1503
    bool bipartite = true;
1504 1504

	
Ignore white space 24 line context
... ...
@@ -1025,29 +1025,29 @@
1025 1025
  ///
1026 1026
  /// Iterator for iterating on parallel arcs connecting the same nodes. It is
1027 1027
  /// a higher level interface for the \ref findArc() function. You can
1028 1028
  /// use it the following way:
1029 1029
  ///\code
1030 1030
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
1031 1031
  ///   ...
1032 1032
  /// }
1033 1033
  ///\endcode
1034 1034
  ///
1035 1035
  ///\sa findArc()
1036 1036
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
1037
  template <typename _Graph>
1038
  class ConArcIt : public _Graph::Arc {
1037
  template <typename GR>
1038
  class ConArcIt : public GR::Arc {
1039 1039
  public:
1040 1040

	
1041
    typedef _Graph Graph;
1041
    typedef GR Graph;
1042 1042
    typedef typename Graph::Arc Parent;
1043 1043

	
1044 1044
    typedef typename Graph::Arc Arc;
1045 1045
    typedef typename Graph::Node Node;
1046 1046

	
1047 1047
    /// \brief Constructor.
1048 1048
    ///
1049 1049
    /// Construct a new ConArcIt iterating on the arcs that
1050 1050
    /// connects nodes \c u and \c v.
1051 1051
    ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
1052 1052
      Parent::operator=(findArc(_graph, u, v));
1053 1053
    }
... ...
@@ -1148,29 +1148,29 @@
1148 1148
  /// \brief Iterator for iterating on parallel edges connecting the same nodes.
1149 1149
  ///
1150 1150
  /// Iterator for iterating on parallel edges connecting the same nodes.
1151 1151
  /// It is a higher level interface for the findEdge() function. You can
1152 1152
  /// use it the following way:
1153 1153
  ///\code
1154 1154
  /// for (ConEdgeIt<Graph> it(g, u, v); it != INVALID; ++it) {
1155 1155
  ///   ...
1156 1156
  /// }
1157 1157
  ///\endcode
1158 1158
  ///
1159 1159
  ///\sa findEdge()
1160
  template <typename _Graph>
1161
  class ConEdgeIt : public _Graph::Edge {
1160
  template <typename GR>
1161
  class ConEdgeIt : public GR::Edge {
1162 1162
  public:
1163 1163

	
1164
    typedef _Graph Graph;
1164
    typedef GR Graph;
1165 1165
    typedef typename Graph::Edge Parent;
1166 1166

	
1167 1167
    typedef typename Graph::Edge Edge;
1168 1168
    typedef typename Graph::Node Node;
1169 1169

	
1170 1170
    /// \brief Constructor.
1171 1171
    ///
1172 1172
    /// Construct a new ConEdgeIt iterating on the edges that
1173 1173
    /// connects nodes \c u and \c v.
1174 1174
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g), _u(u), _v(v) {
1175 1175
      Parent::operator=(findEdge(_graph, _u, _v));
1176 1176
    }
... ...
@@ -1202,47 +1202,47 @@
1202 1202
  ///It is possible to find \e all parallel arcs between two nodes with
1203 1203
  ///the \c operator() member.
1204 1204
  ///
1205 1205
  ///This is a dynamic data structure. Consider to use \ref ArcLookUp or
1206 1206
  ///\ref AllArcLookUp if your digraph is not changed so frequently.
1207 1207
  ///
1208 1208
  ///This class uses a self-adjusting binary search tree, the Splay tree
1209 1209
  ///of Sleator and Tarjan to guarantee the logarithmic amortized
1210 1210
  ///time bound for arc look-ups. This class also guarantees the
1211 1211
  ///optimal time bound in a constant factor for any distribution of
1212 1212
  ///queries.
1213 1213
  ///
1214
  ///\tparam G The type of the underlying digraph.
1214
  ///\tparam GR The type of the underlying digraph.
1215 1215
  ///
1216 1216
  ///\sa ArcLookUp
1217 1217
  ///\sa AllArcLookUp
1218
  template<class G>
1218
  template <typename GR>
1219 1219
  class DynArcLookUp
1220
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
1220
    : protected ItemSetTraits<GR, typename GR::Arc>::ItemNotifier::ObserverBase
1221 1221
  {
1222 1222
  public:
1223
    typedef typename ItemSetTraits<G, typename G::Arc>
1223
    typedef typename ItemSetTraits<GR, typename GR::Arc>
1224 1224
    ::ItemNotifier::ObserverBase Parent;
1225 1225

	
1226
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1227
    typedef G Digraph;
1226
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1227
    typedef GR Digraph;
1228 1228

	
1229 1229
  protected:
1230 1230

	
1231
    class AutoNodeMap : public ItemSetTraits<G, Node>::template Map<Arc>::Type {
1231
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
1232 1232
    public:
1233 1233

	
1234
      typedef typename ItemSetTraits<G, Node>::template Map<Arc>::Type Parent;
1234
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
1235 1235

	
1236
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
1236
      AutoNodeMap(const GR& digraph) : Parent(digraph, INVALID) {}
1237 1237

	
1238 1238
      virtual void add(const Node& node) {
1239 1239
        Parent::add(node);
1240 1240
        Parent::set(node, INVALID);
1241 1241
      }
1242 1242

	
1243 1243
      virtual void add(const std::vector<Node>& nodes) {
1244 1244
        Parent::add(nodes);
1245 1245
        for (int i = 0; i < int(nodes.size()); ++i) {
1246 1246
          Parent::set(nodes[i], INVALID);
1247 1247
        }
1248 1248
      }
... ...
@@ -1614,34 +1614,34 @@
1614 1614
  ///Using this class, you can find an arc in a digraph from a given
1615 1615
  ///source to a given target in time <em>O</em>(log<em>d</em>),
1616 1616
  ///where <em>d</em> is the out-degree of the source node.
1617 1617
  ///
1618 1618
  ///It is not possible to find \e all parallel arcs between two nodes.
1619 1619
  ///Use \ref AllArcLookUp for this purpose.
1620 1620
  ///
1621 1621
  ///\warning This class is static, so you should call refresh() (or at
1622 1622
  ///least refresh(Node)) to refresh this data structure whenever the
1623 1623
  ///digraph changes. This is a time consuming (superlinearly proportional
1624 1624
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
1625 1625
  ///
1626
  ///\tparam G The type of the underlying digraph.
1626
  ///\tparam GR The type of the underlying digraph.
1627 1627
  ///
1628 1628
  ///\sa DynArcLookUp
1629 1629
  ///\sa AllArcLookUp
1630
  template<class G>
1630
  template<class GR>
1631 1631
  class ArcLookUp
1632 1632
  {
1633 1633
  public:
1634
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1635
    typedef G Digraph;
1634
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1635
    typedef GR Digraph;
1636 1636

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

	
1643 1643
    class ArcLess {
1644 1644
      const Digraph &g;
1645 1645
    public:
1646 1646
      ArcLess(const Digraph &_g) : g(_g) {}
1647 1647
      bool operator()(Arc a,Arc b) const
... ...
@@ -1724,38 +1724,38 @@
1724 1724

	
1725 1725
  ///Fast look-up of all arcs between given endpoints.
1726 1726

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

	
1748
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1749
    typedef G Digraph;
1748
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1749
    typedef GR Digraph;
1750 1750

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

	
1753 1753
    Arc refreshNext(Arc head,Arc next=INVALID)
1754 1754
    {
1755 1755
      if(head==INVALID) return next;
1756 1756
      else {
1757 1757
        next=refreshNext(_right[head],next);
1758 1758
        _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
1759 1759
          ? next : INVALID;
1760 1760
        return refreshNext(_left[head],head);
1761 1761
      }
... ...
@@ -1764,35 +1764,35 @@
1764 1764
    void refreshNext()
1765 1765
    {
1766 1766
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
1767 1767
    }
1768 1768

	
1769 1769
  public:
1770 1770
    ///Constructor
1771 1771

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

	
1778 1778
    ///Refresh the data structure at a node.
1779 1779

	
1780 1780
    ///Build up the search database of node \c n.
1781 1781
    ///
1782 1782
    ///It runs in time <em>O</em>(<em>d</em> log<em>d</em>), where <em>d</em> is
1783 1783
    ///the number of the outgoing arcs of \c n.
1784 1784
    void refresh(Node n)
1785 1785
    {
1786
      ArcLookUp<G>::refresh(n);
1786
      ArcLookUp<GR>::refresh(n);
1787 1787
      refreshNext(_head[n]);
1788 1788
    }
1789 1789

	
1790 1790
    ///Refresh the full data structure.
1791 1791

	
1792 1792
    ///Build up the full search database. In fact, it simply calls
1793 1793
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1794 1794
    ///
1795 1795
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
1796 1796
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
1797 1797
    ///out-degree of the digraph.
1798 1798
    void refresh()
... ...
@@ -1821,25 +1821,25 @@
1821 1821
    ///
1822 1822
    ///Finding the first arc take <em>O</em>(log<em>d</em>) time,
1823 1823
    ///where <em>d</em> is the number of outgoing arcs of \c s. Then the
1824 1824
    ///consecutive arcs are found in constant time.
1825 1825
    ///
1826 1826
    ///\warning If you change the digraph, refresh() must be called before using
1827 1827
    ///this operator. If you change the outgoing arcs of
1828 1828
    ///a single node \c n, then \ref refresh(Node) "refresh(n)" is enough.
1829 1829
    ///
1830 1830
#ifdef DOXYGEN
1831 1831
    Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
1832 1832
#else
1833
    using ArcLookUp<G>::operator() ;
1833
    using ArcLookUp<GR>::operator() ;
1834 1834
    Arc operator()(Node s, Node t, Arc prev) const
1835 1835
    {
1836 1836
      return prev==INVALID?(*this)(s,t):_next[prev];
1837 1837
    }
1838 1838
#endif
1839 1839

	
1840 1840
  };
1841 1841

	
1842 1842
  /// @}
1843 1843

	
1844 1844
} //namespace lemon
1845 1845

	
Ignore white space 24 line context
... ...
@@ -29,58 +29,60 @@
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

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

	
57 59
  ///Default traits class of Dijkstra class.
58 60

	
59 61
  ///Default traits class of Dijkstra class.
60 62
  ///\tparam GR The type of the digraph.
61
  ///\tparam LM The type of the length map.
62
  template<class GR, class LM>
63
  ///\tparam LEN The type of the length map.
64
  template<typename GR, typename LEN>
63 65
  struct DijkstraDefaultTraits
64 66
  {
65 67
    ///The type of the digraph the algorithm runs on.
66 68
    typedef GR Digraph;
67 69

	
68 70
    ///The type of the map that stores the arc lengths.
69 71

	
70 72
    ///The type of the map that stores the arc lengths.
71 73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
72
    typedef LM LengthMap;
74
    typedef LEN LengthMap;
73 75
    ///The type of the length of the arcs.
74
    typedef typename LM::Value Value;
76
    typedef typename LEN::Value Value;
75 77

	
76 78
    /// Operation traits for %Dijkstra algorithm.
77 79

	
78 80
    /// This class defines the operations that are used in the algorithm.
79 81
    /// \see DijkstraDefaultOperationTraits
80 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
81 83

	
82 84
    /// The cross reference type used by the heap.
83 85

	
84 86
    /// The cross reference type used by the heap.
85 87
    /// Usually it is \c Digraph::NodeMap<int>.
86 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
... ...
@@ -91,25 +93,25 @@
91 93
    /// \ref HeapCrossRef.
92 94
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
93 95
    {
94 96
      return new HeapCrossRef(g);
95 97
    }
96 98

	
97 99
    ///The heap type used by the %Dijkstra algorithm.
98 100

	
99 101
    ///The heap type used by the Dijkstra algorithm.
100 102
    ///
101 103
    ///\sa BinHeap
102 104
    ///\sa Dijkstra
103
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
104 106
    ///Instantiates a \c Heap.
105 107

	
106 108
    ///This function instantiates a \ref Heap.
107 109
    static Heap *createHeap(HeapCrossRef& r)
108 110
    {
109 111
      return new Heap(r);
110 112
    }
111 113

	
112 114
    ///\brief The type of the map that stores the predecessor
113 115
    ///arcs of the shortest paths.
114 116
    ///
115 117
    ///The type of the map that stores the predecessor
... ...
@@ -141,25 +143,25 @@
141 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
142 144
#else
143 145
    static ProcessedMap *createProcessedMap(const Digraph &)
144 146
#endif
145 147
    {
146 148
      return new ProcessedMap();
147 149
    }
148 150

	
149 151
    ///The type of the map that stores the distances of the nodes.
150 152

	
151 153
    ///The type of the map that stores the distances of the nodes.
152 154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
153
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
154 156
    ///Instantiates a \c DistMap.
155 157

	
156 158
    ///This function instantiates a \ref DistMap.
157 159
    ///\param g is the digraph, to which we would like to define
158 160
    ///the \ref DistMap.
159 161
    static DistMap *createDistMap(const Digraph &g)
160 162
    {
161 163
      return new DistMap(g);
162 164
    }
163 165
  };
164 166

	
165 167
  ///%Dijkstra algorithm class.
... ...
@@ -171,36 +173,36 @@
171 173
  ///\ref concepts::ReadMap "ReadMap",
172 174
  ///so it is easy to change it to any kind of length.
173 175
  ///The type of the length is determined by the
174 176
  ///\ref concepts::ReadMap::Value "Value" of the length map.
175 177
  ///It is also possible to change the underlying priority heap.
176 178
  ///
177 179
  ///There is also a \ref dijkstra() "function-type interface" for the
178 180
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
179 181
  ///it can be used easier.
180 182
  ///
181 183
  ///\tparam GR The type of the digraph the algorithm runs on.
182 184
  ///The default type is \ref ListDigraph.
183
  ///\tparam LM A \ref concepts::ReadMap "readable" arc map that specifies
185
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
184 186
  ///the lengths of the arcs.
185 187
  ///It is read once for each arc, so the map may involve in
186 188
  ///relatively time consuming process to compute the arc lengths if
187 189
  ///it is necessary. The default map type is \ref
188 190
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
189 191
#ifdef DOXYGEN
190
  template <typename GR, typename LM, typename TR>
192
  template <typename GR, typename LEN, typename TR>
191 193
#else
192 194
  template <typename GR=ListDigraph,
193
            typename LM=typename GR::template ArcMap<int>,
194
            typename TR=DijkstraDefaultTraits<GR,LM> >
195
            typename LEN=typename GR::template ArcMap<int>,
196
            typename TR=DijkstraDefaultTraits<GR,LEN> >
195 197
#endif
196 198
  class Dijkstra {
197 199
  public:
198 200

	
199 201
    ///The type of the digraph the algorithm runs on.
200 202
    typedef typename TR::Digraph Digraph;
201 203

	
202 204
    ///The type of the length of the arcs.
203 205
    typedef typename TR::LengthMap::Value Value;
204 206
    ///The type of the map that stores the arc lengths.
205 207
    typedef typename TR::LengthMap LengthMap;
206 208
    ///\brief The type of the map that stores the predecessor arcs of the
... ...
@@ -904,37 +906,37 @@
904 906
    Value currentDist(Node v) const {
905 907
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
906 908
    }
907 909

	
908 910
    ///@}
909 911
  };
910 912

	
911 913

	
912 914
  ///Default traits class of dijkstra() function.
913 915

	
914 916
  ///Default traits class of dijkstra() function.
915 917
  ///\tparam GR The type of the digraph.
916
  ///\tparam LM The type of the length map.
917
  template<class GR, class LM>
918
  ///\tparam LEN The type of the length map.
919
  template<class GR, class LEN>
918 920
  struct DijkstraWizardDefaultTraits
919 921
  {
920 922
    ///The type of the digraph the algorithm runs on.
921 923
    typedef GR Digraph;
922 924
    ///The type of the map that stores the arc lengths.
923 925

	
924 926
    ///The type of the map that stores the arc lengths.
925 927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
926
    typedef LM LengthMap;
928
    typedef LEN LengthMap;
927 929
    ///The type of the length of the arcs.
928
    typedef typename LM::Value Value;
930
    typedef typename LEN::Value Value;
929 931

	
930 932
    /// Operation traits for Dijkstra algorithm.
931 933

	
932 934
    /// This class defines the operations that are used in the algorithm.
933 935
    /// \see DijkstraDefaultOperationTraits
934 936
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
935 937

	
936 938
    /// The cross reference type used by the heap.
937 939

	
938 940
    /// The cross reference type used by the heap.
939 941
    /// Usually it is \c Digraph::NodeMap<int>.
940 942
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
... ...
@@ -998,25 +1000,25 @@
998 1000
    static ProcessedMap *createProcessedMap(const Digraph &g)
999 1001
#else
1000 1002
    static ProcessedMap *createProcessedMap(const Digraph &)
1001 1003
#endif
1002 1004
    {
1003 1005
      return new ProcessedMap();
1004 1006
    }
1005 1007

	
1006 1008
    ///The type of the map that stores the distances of the nodes.
1007 1009

	
1008 1010
    ///The type of the map that stores the distances of the nodes.
1009 1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1010
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
1012
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1011 1013
    ///Instantiates a DistMap.
1012 1014

	
1013 1015
    ///This function instantiates a DistMap.
1014 1016
    ///\param g is the digraph, to which we would like to define
1015 1017
    ///the DistMap
1016 1018
    static DistMap *createDistMap(const Digraph &g)
1017 1019
    {
1018 1020
      return new DistMap(g);
1019 1021
    }
1020 1022

	
1021 1023
    ///The type of the shortest paths.
1022 1024

	
... ...
@@ -1024,28 +1026,28 @@
1024 1026
    ///It must meet the \ref concepts::Path "Path" concept.
1025 1027
    typedef lemon::Path<Digraph> Path;
1026 1028
  };
1027 1029

	
1028 1030
  /// Default traits class used by DijkstraWizard
1029 1031

	
1030 1032
  /// To make it easier to use Dijkstra algorithm
1031 1033
  /// we have created a wizard class.
1032 1034
  /// This \ref DijkstraWizard class needs default traits,
1033 1035
  /// as well as the \ref Dijkstra class.
1034 1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1035 1037
  /// \ref DijkstraWizard class.
1036
  template<class GR,class LM>
1037
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
1038
  template<typename GR, typename LEN>
1039
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1038 1040
  {
1039
    typedef DijkstraWizardDefaultTraits<GR,LM> Base;
1041
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1040 1042
  protected:
1041 1043
    //The type of the nodes in the digraph.
1042 1044
    typedef typename Base::Digraph::Node Node;
1043 1045

	
1044 1046
    //Pointer to the digraph the algorithm runs on.
1045 1047
    void *_g;
1046 1048
    //Pointer to the length map.
1047 1049
    void *_length;
1048 1050
    //Pointer to the map of processed nodes.
1049 1051
    void *_processed;
1050 1052
    //Pointer to the map of predecessors arcs.
1051 1053
    void *_pred;
... ...
@@ -1061,27 +1063,27 @@
1061 1063

	
1062 1064
    /// This constructor does not require parameters, therefore it initiates
1063 1065
    /// all of the attributes to \c 0.
1064 1066
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1065 1067
                           _dist(0), _path(0), _di(0) {}
1066 1068

	
1067 1069
    /// Constructor.
1068 1070

	
1069 1071
    /// This constructor requires two parameters,
1070 1072
    /// others are initiated to \c 0.
1071 1073
    /// \param g The digraph the algorithm runs on.
1072 1074
    /// \param l The length map.
1073
    DijkstraWizardBase(const GR &g,const LM &l) :
1075
    DijkstraWizardBase(const GR &g,const LEN &l) :
1074 1076
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1075
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1077
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&l))),
1076 1078
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1077 1079

	
1078 1080
  };
1079 1081

	
1080 1082
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1081 1083

	
1082 1084
  /// This auxiliary class is created to implement the
1083 1085
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1084 1086
  /// It does not have own \ref run(Node) "run()" method, it uses the
1085 1087
  /// functions and features of the plain \ref Dijkstra.
1086 1088
  ///
1087 1089
  /// This class should only be used through the \ref dijkstra() function,
... ...
@@ -1272,22 +1274,22 @@
1272 1274
  ///The following examples show how to use these parameters.
1273 1275
  ///\code
1274 1276
  ///  // Compute shortest path from node s to each node
1275 1277
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1276 1278
  ///
1277 1279
  ///  // Compute shortest path from s to t
1278 1280
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1279 1281
  ///\endcode
1280 1282
  ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()"
1281 1283
  ///to the end of the parameter list.
1282 1284
  ///\sa DijkstraWizard
1283 1285
  ///\sa Dijkstra
1284
  template<class GR, class LM>
1285
  DijkstraWizard<DijkstraWizardBase<GR,LM> >
1286
  dijkstra(const GR &digraph, const LM &length)
1286
  template<typename GR, typename LEN>
1287
  DijkstraWizard<DijkstraWizardBase<GR,LEN> >
1288
  dijkstra(const GR &digraph, const LEN &length)
1287 1289
  {
1288
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(digraph,length);
1290
    return DijkstraWizard<DijkstraWizardBase<GR,LEN> >(digraph,length);
1289 1291
  }
1290 1292

	
1291 1293
} //END OF NAMESPACE LEMON
1292 1294

	
1293 1295
#endif
Ignore white space 24 line context
... ...
@@ -246,25 +246,25 @@
246 246
  ///
247 247
  /// This implementation is based on doubly-linked lists, from each
248 248
  /// node the outgoing and the incoming arcs make up lists, therefore
249 249
  /// one arc can be erased in constant time. It also makes possible,
250 250
  /// that node can be removed from the underlying graph, in this case
251 251
  /// all arcs incident to the given node is erased from the arc set.
252 252
  ///
253 253
  /// \param GR The type of the graph which shares its node set with
254 254
  /// this class. Its interface must conform to the
255 255
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
256 256
  /// concept.
257 257
  ///
258
  /// This class is fully conform to the \ref concepts::Digraph
258
  /// This class fully conforms to the \ref concepts::Digraph
259 259
  /// "Digraph" concept.
260 260
  template <typename GR>
261 261
  class ListArcSet : public ArcSetExtender<ListArcSetBase<GR> > {
262 262

	
263 263
  public:
264 264

	
265 265
    typedef ArcSetExtender<ListArcSetBase<GR> > Parent;
266 266

	
267 267
    typedef typename Parent::Node Node;
268 268
    typedef typename Parent::Arc Arc;
269 269

	
270 270
    typedef GR Graph;
... ...
@@ -327,25 +327,25 @@
327 327

	
328 328
    /// \brief Constructor of the ArcSet.
329 329
    ///
330 330
    /// Constructor of the ArcSet.
331 331
    ListArcSet(const GR& graph) : _nodes(graph, *this) {
332 332
      Parent::initalize(graph, _nodes);
333 333
    }
334 334

	
335 335
    /// \brief Add a new arc to the digraph.
336 336
    ///
337 337
    /// Add a new arc to the digraph with source node \c s
338 338
    /// and target node \c t.
339
    /// \return the new arc.
339
    /// \return The new arc.
340 340
    Arc addArc(const Node& s, const Node& t) {
341 341
      return Parent::addArc(s, t);
342 342
    }
343 343

	
344 344
    /// \brief Erase an arc from the digraph.
345 345
    ///
346 346
    /// Erase an arc \c a from the digraph.
347 347
    void erase(const Arc& a) {
348 348
      return Parent::erase(a);
349 349
    }
350 350

	
351 351
  };
... ...
@@ -675,25 +675,25 @@
675 675
  ///
676 676
  /// This implementation is based on doubly-linked lists, from each
677 677
  /// node the incident edges make up lists, therefore one edge can be
678 678
  /// erased in constant time. It also makes possible, that node can
679 679
  /// be removed from the underlying graph, in this case all edges
680 680
  /// incident to the given node is erased from the arc set.
681 681
  ///
682 682
  /// \param GR The type of the graph which shares its node set
683 683
  /// with this class. Its interface must conform to the
684 684
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
685 685
  /// concept.
686 686
  ///
687
  /// This class is fully conform to the \ref concepts::Graph "Graph"
687
  /// This class fully conforms to the \ref concepts::Graph "Graph"
688 688
  /// concept.
689 689
  template <typename GR>
690 690
  class ListEdgeSet : public EdgeSetExtender<ListEdgeSetBase<GR> > {
691 691

	
692 692
  public:
693 693

	
694 694
    typedef EdgeSetExtender<ListEdgeSetBase<GR> > Parent;
695 695

	
696 696
    typedef typename Parent::Node Node;
697 697
    typedef typename Parent::Arc Arc;
698 698
    typedef typename Parent::Edge Edge;
699 699

	
... ...
@@ -752,25 +752,25 @@
752 752

	
753 753
    /// \brief Constructor of the EdgeSet.
754 754
    ///
755 755
    /// Constructor of the EdgeSet.
756 756
    ListEdgeSet(const GR& graph) : _nodes(graph, *this) {
757 757
      Parent::initalize(graph, _nodes);
758 758
    }
759 759

	
760 760
    /// \brief Add a new edge to the graph.
761 761
    ///
762 762
    /// Add a new edge to the graph with node \c u
763 763
    /// and node \c v endpoints.
764
    /// \return the new edge.
764
    /// \return The new edge.
765 765
    Edge addEdge(const Node& u, const Node& v) {
766 766
      return Parent::addEdge(u, v);
767 767
    }
768 768

	
769 769
    /// \brief Erase an edge from the graph.
770 770
    ///
771 771
    /// Erase the edge \c e from the graph.
772 772
    void erase(const Edge& e) {
773 773
      return Parent::erase(e);
774 774
    }
775 775

	
776 776
  };
... ...
@@ -943,25 +943,25 @@
943 943
  /// concept.
944 944
  ///
945 945
  /// This implementation is slightly faster than the \c ListArcSet,
946 946
  /// because it uses continuous storage for arcs and it uses just
947 947
  /// single-linked lists for enumerate outgoing and incoming
948 948
  /// arcs. Therefore the arcs cannot be erased from the arc sets.
949 949
  ///
950 950
  /// \warning If a node is erased from the underlying graph and this
951 951
  /// node is the source or target of one arc in the arc set, then
952 952
  /// the arc set is invalidated, and it cannot be used anymore. The
953 953
  /// validity can be checked with the \c valid() member function.
954 954
  ///
955
  /// This class is fully conform to the \ref concepts::Digraph
955
  /// This class fully conforms to the \ref concepts::Digraph
956 956
  /// "Digraph" concept.
957 957
  template <typename GR>
958 958
  class SmartArcSet : public ArcSetExtender<SmartArcSetBase<GR> > {
959 959

	
960 960
  public:
961 961

	
962 962
    typedef ArcSetExtender<SmartArcSetBase<GR> > Parent;
963 963

	
964 964
    typedef typename Parent::Node Node;
965 965
    typedef typename Parent::Arc Arc;
966 966

	
967 967
    typedef GR Graph;
... ...
@@ -1032,25 +1032,25 @@
1032 1032

	
1033 1033
    /// \brief Constructor of the ArcSet.
1034 1034
    ///
1035 1035
    /// Constructor of the ArcSet.
1036 1036
    SmartArcSet(const GR& graph) : _nodes(graph, *this) {
1037 1037
      Parent::initalize(graph, _nodes);
1038 1038
    }
1039 1039

	
1040 1040
    /// \brief Add a new arc to the digraph.
1041 1041
    ///
1042 1042
    /// Add a new arc to the digraph with source node \c s
1043 1043
    /// and target node \c t.
1044
    /// \return the new arc.
1044
    /// \return The new arc.
1045 1045
    Arc addArc(const Node& s, const Node& t) {
1046 1046
      return Parent::addArc(s, t);
1047 1047
    }
1048 1048

	
1049 1049
    /// \brief Validity check
1050 1050
    ///
1051 1051
    /// This functions gives back false if the ArcSet is
1052 1052
    /// invalidated. It occurs when a node in the underlying graph is
1053 1053
    /// erased and it is not isolated in the ArcSet.
1054 1054
    bool valid() const {
1055 1055
      return _nodes.attached();
1056 1056
    }
... ...
@@ -1291,25 +1291,25 @@
1291 1291
  ///  concept.
1292 1292
  ///
1293 1293
  /// This implementation is slightly faster than the \c ListEdgeSet,
1294 1294
  /// because it uses continuous storage for edges and it uses just
1295 1295
  /// single-linked lists for enumerate incident edges. Therefore the
1296 1296
  /// edges cannot be erased from the edge sets.
1297 1297
  ///
1298 1298
  /// \warning If a node is erased from the underlying graph and this
1299 1299
  /// node is incident to one edge in the edge set, then the edge set
1300 1300
  /// is invalidated, and it cannot be used anymore. The validity can
1301 1301
  /// be checked with the \c valid() member function.
1302 1302
  ///
1303
  /// This class is fully conform to the \ref concepts::Graph
1303
  /// This class fully conforms to the \ref concepts::Graph
1304 1304
  /// "Graph" concept.
1305 1305
  template <typename GR>
1306 1306
  class SmartEdgeSet : public EdgeSetExtender<SmartEdgeSetBase<GR> > {
1307 1307

	
1308 1308
  public:
1309 1309

	
1310 1310
    typedef EdgeSetExtender<SmartEdgeSetBase<GR> > Parent;
1311 1311

	
1312 1312
    typedef typename Parent::Node Node;
1313 1313
    typedef typename Parent::Arc Arc;
1314 1314
    typedef typename Parent::Edge Edge;
1315 1315

	
... ...
@@ -1380,25 +1380,25 @@
1380 1380

	
1381 1381
    /// \brief Constructor of the EdgeSet.
1382 1382
    ///
1383 1383
    /// Constructor of the EdgeSet.
1384 1384
    SmartEdgeSet(const GR& graph) : _nodes(graph, *this) {
1385 1385
      Parent::initalize(graph, _nodes);
1386 1386
    }
1387 1387

	
1388 1388
    /// \brief Add a new edge to the graph.
1389 1389
    ///
1390 1390
    /// Add a new edge to the graph with node \c u
1391 1391
    /// and node \c v endpoints.
1392
    /// \return the new edge.
1392
    /// \return The new edge.
1393 1393
    Edge addEdge(const Node& u, const Node& v) {
1394 1394
      return Parent::addEdge(u, v);
1395 1395
    }
1396 1396

	
1397 1397
    /// \brief Validity check
1398 1398
    ///
1399 1399
    /// This functions gives back false if the EdgeSet is
1400 1400
    /// invalidated. It occurs when a node in the underlying graph is
1401 1401
    /// erased and it is not isolated in the EdgeSet.
1402 1402
    bool valid() const {
1403 1403
      return _nodes.attached();
1404 1404
    }
Ignore white space 24 line context
... ...
@@ -37,42 +37,42 @@
37 37
  ///A class for handling "labels" in push-relabel type algorithms.
38 38
  ///
39 39
  ///\ingroup auxdat
40 40
  ///Using this class you can assign "labels" (nonnegative integer numbers)
41 41
  ///to the edges or nodes of a graph, manipulate and query them through
42 42
  ///operations typically arising in "push-relabel" type algorithms.
43 43
  ///
44 44
  ///Each item is either \em active or not, and you can also choose a
45 45
  ///highest level active item.
46 46
  ///
47 47
  ///\sa LinkedElevator
48 48
  ///
49
  ///\param Graph Type of the underlying graph.
50
  ///\param Item Type of the items the data is assigned to (Graph::Node,
51
  ///Graph::Arc, Graph::Edge).
52
  template<class Graph, class Item>
49
  ///\param GR Type of the underlying graph.
50
  ///\param Item Type of the items the data is assigned to (\c GR::Node,
51
  ///\c GR::Arc or \c GR::Edge).
52
  template<class GR, class Item>
53 53
  class Elevator
54 54
  {
55 55
  public:
56 56

	
57 57
    typedef Item Key;
58 58
    typedef int Value;
59 59

	
60 60
  private:
61 61

	
62 62
    typedef Item *Vit;
63
    typedef typename ItemSetTraits<Graph,Item>::template Map<Vit>::Type VitMap;
64
    typedef typename ItemSetTraits<Graph,Item>::template Map<int>::Type IntMap;
63
    typedef typename ItemSetTraits<GR,Item>::template Map<Vit>::Type VitMap;
64
    typedef typename ItemSetTraits<GR,Item>::template Map<int>::Type IntMap;
65 65

	
66
    const Graph &_g;
66
    const GR &_g;
67 67
    int _max_level;
68 68
    int _item_num;
69 69
    VitMap _where;
70 70
    IntMap _level;
71 71
    std::vector<Item> _items;
72 72
    std::vector<Vit> _first;
73 73
    std::vector<Vit> _last_active;
74 74

	
75 75
    int _highest_active;
76 76

	
77 77
    void copy(Item i, Vit p)
78 78
    {
... ...
@@ -96,44 +96,44 @@
96 96
      *j=ti;
97 97
    }
98 98

	
99 99
  public:
100 100

	
101 101
    ///Constructor with given maximum level.
102 102

	
103 103
    ///Constructor with given maximum level.
104 104
    ///
105 105
    ///\param graph The underlying graph.
106 106
    ///\param max_level The maximum allowed level.
107 107
    ///Set the range of the possible labels to <tt>[0..max_level]</tt>.
108
    Elevator(const Graph &graph,int max_level) :
108
    Elevator(const GR &graph,int max_level) :
109 109
      _g(graph),
110 110
      _max_level(max_level),
111 111
      _item_num(_max_level),
112 112
      _where(graph),
113 113
      _level(graph,0),
114 114
      _items(_max_level),
115 115
      _first(_max_level+2),
116 116
      _last_active(_max_level+2),
117 117
      _highest_active(-1) {}
118 118
    ///Constructor.
119 119

	
120 120
    ///Constructor.
121 121
    ///
122 122
    ///\param graph The underlying graph.
123 123
    ///Set the range of the possible labels to <tt>[0..max_level]</tt>,
124 124
    ///where \c max_level is equal to the number of labeled items in the graph.
125
    Elevator(const Graph &graph) :
125
    Elevator(const GR &graph) :
126 126
      _g(graph),
127
      _max_level(countItems<Graph, Item>(graph)),
127
      _max_level(countItems<GR, Item>(graph)),
128 128
      _item_num(_max_level),
129 129
      _where(graph),
130 130
      _level(graph,0),
131 131
      _items(_max_level),
132 132
      _first(_max_level+2),
133 133
      _last_active(_max_level+2),
134 134
      _highest_active(-1)
135 135
    {
136 136
    }
137 137

	
138 138
    ///Activate item \c i.
139 139

	
... ...
@@ -421,25 +421,25 @@
421 421
    ///Finally \c initFinish() must be called.
422 422
    ///The items not listed are put on the highest level.
423 423
    ///@{
424 424

	
425 425
    ///Start the initialization process.
426 426
    void initStart()
427 427
    {
428 428
      _init_lev=0;
429 429
      _init_num=&_items[0];
430 430
      _first[0]=&_items[0];
431 431
      _last_active[0]=&_items[0]-1;
432 432
      Vit n=&_items[0];
433
      for(typename ItemSetTraits<Graph,Item>::ItemIt i(_g);i!=INVALID;++i)
433
      for(typename ItemSetTraits<GR,Item>::ItemIt i(_g);i!=INVALID;++i)
434 434
        {
435 435
          *n=i;
436 436
          _where.set(i,n);
437 437
          _level.set(i,_max_level);
438 438
          ++n;
439 439
        }
440 440
    }
441 441

	
442 442
    ///Add an item to the current level.
443 443
    void initAddItem(Item i)
444 444
    {
445 445
      swap(_where[i],_init_num);
... ...
@@ -480,75 +480,75 @@
480 480
  ///A class for handling "labels" in push-relabel type algorithms.
481 481
  ///
482 482
  ///\ingroup auxdat
483 483
  ///Using this class you can assign "labels" (nonnegative integer numbers)
484 484
  ///to the edges or nodes of a graph, manipulate and query them through
485 485
  ///operations typically arising in "push-relabel" type algorithms.
486 486
  ///
487 487
  ///Each item is either \em active or not, and you can also choose a
488 488
  ///highest level active item.
489 489
  ///
490 490
  ///\sa Elevator
491 491
  ///
492
  ///\param Graph Type of the underlying graph.
493
  ///\param Item Type of the items the data is assigned to (Graph::Node,
494
  ///Graph::Arc, Graph::Edge).
495
  template <class Graph, class Item>
492
  ///\param GR Type of the underlying graph.
493
  ///\param Item Type of the items the data is assigned to (\c GR::Node,
494
  ///\c GR::Arc or \c GR::Edge).
495
  template <class GR, class Item>
496 496
  class LinkedElevator {
497 497
  public:
498 498

	
499 499
    typedef Item Key;
500 500
    typedef int Value;
501 501

	
502 502
  private:
503 503

	
504
    typedef typename ItemSetTraits<Graph,Item>::
504
    typedef typename ItemSetTraits<GR,Item>::
505 505
    template Map<Item>::Type ItemMap;
506
    typedef typename ItemSetTraits<Graph,Item>::
506
    typedef typename ItemSetTraits<GR,Item>::
507 507
    template Map<int>::Type IntMap;
508
    typedef typename ItemSetTraits<Graph,Item>::
508
    typedef typename ItemSetTraits<GR,Item>::
509 509
    template Map<bool>::Type BoolMap;
510 510

	
511
    const Graph &_graph;
511
    const GR &_graph;
512 512
    int _max_level;
513 513
    int _item_num;
514 514
    std::vector<Item> _first, _last;
515 515
    ItemMap _prev, _next;
516 516
    int _highest_active;
517 517
    IntMap _level;
518 518
    BoolMap _active;
519 519

	
520 520
  public:
521 521
    ///Constructor with given maximum level.
522 522

	
523 523
    ///Constructor with given maximum level.
524 524
    ///
525 525
    ///\param graph The underlying graph.
526 526
    ///\param max_level The maximum allowed level.
527 527
    ///Set the range of the possible labels to <tt>[0..max_level]</tt>.
528
    LinkedElevator(const Graph& graph, int max_level)
528
    LinkedElevator(const GR& graph, int max_level)
529 529
      : _graph(graph), _max_level(max_level), _item_num(_max_level),
530 530
        _first(_max_level + 1), _last(_max_level + 1),
531 531
        _prev(graph), _next(graph),
532 532
        _highest_active(-1), _level(graph), _active(graph) {}
533 533

	
534 534
    ///Constructor.
535 535

	
536 536
    ///Constructor.
537 537
    ///
538 538
    ///\param graph The underlying graph.
539 539
    ///Set the range of the possible labels to <tt>[0..max_level]</tt>,
540 540
    ///where \c max_level is equal to the number of labeled items in the graph.
541
    LinkedElevator(const Graph& graph)
542
      : _graph(graph), _max_level(countItems<Graph, Item>(graph)),
541
    LinkedElevator(const GR& graph)
542
      : _graph(graph), _max_level(countItems<GR, Item>(graph)),
543 543
        _item_num(_max_level),
544 544
        _first(_max_level + 1), _last(_max_level + 1),
545 545
        _prev(graph, INVALID), _next(graph, INVALID),
546 546
        _highest_active(-1), _level(graph), _active(graph) {}
547 547

	
548 548

	
549 549
    ///Activate item \c i.
550 550

	
551 551
    ///Activate item \c i.
552 552
    ///\pre Item \c i shouldn't be active before.
553 553
    void activate(Item i) {
554 554
      _active.set(i, true);
... ...
@@ -926,25 +926,25 @@
926 926
    ///lowest one (level 0) using \c initAddItem() and \c initNewLevel().
927 927
    ///Finally \c initFinish() must be called.
928 928
    ///The items not listed are put on the highest level.
929 929
    ///@{
930 930

	
931 931
    ///Start the initialization process.
932 932
    void initStart() {
933 933

	
934 934
      for (int i = 0; i <= _max_level; ++i) {
935 935
        _first[i] = _last[i] = INVALID;
936 936
      }
937 937
      _init_level = 0;
938
      for(typename ItemSetTraits<Graph,Item>::ItemIt i(_graph);
938
      for(typename ItemSetTraits<GR,Item>::ItemIt i(_graph);
939 939
          i != INVALID; ++i) {
940 940
        _level.set(i, _max_level);
941 941
        _active.set(i, false);
942 942
      }
943 943
    }
944 944

	
945 945
    ///Add an item to the current level.
946 946
    void initAddItem(Item i) {
947 947
      _level.set(i, _init_level);
948 948
      if (_last[_init_level] == INVALID) {
949 949
        _first[_init_level] = i;
950 950
        _last[_init_level] = i;
Ignore white space 24 line context
... ...
@@ -45,47 +45,47 @@
45 45
  ///if the given digraph is Euler (i.e it has only one nontrivial component
46 46
  ///and the in-degree is equal to the out-degree for all nodes),
47 47
  ///the following code will put the arcs of \c g
48 48
  ///to the vector \c et according to an
49 49
  ///Euler tour of \c g.
50 50
  ///\code
51 51
  ///  std::vector<ListDigraph::Arc> et;
52 52
  ///  for(DiEulerIt<ListDigraph> e(g),e!=INVALID;++e)
53 53
  ///    et.push_back(e);
54 54
  ///\endcode
55 55
  ///If \c g is not Euler then the resulted tour will not be full or closed.
56 56
  ///\sa EulerIt
57
  template<class Digraph>
57
  template<typename GR>
58 58
  class DiEulerIt
59 59
  {
60
    typedef typename Digraph::Node Node;
61
    typedef typename Digraph::NodeIt NodeIt;
62
    typedef typename Digraph::Arc Arc;
63
    typedef typename Digraph::ArcIt ArcIt;
64
    typedef typename Digraph::OutArcIt OutArcIt;
65
    typedef typename Digraph::InArcIt InArcIt;
60
    typedef typename GR::Node Node;
61
    typedef typename GR::NodeIt NodeIt;
62
    typedef typename GR::Arc Arc;
63
    typedef typename GR::ArcIt ArcIt;
64
    typedef typename GR::OutArcIt OutArcIt;
65
    typedef typename GR::InArcIt InArcIt;
66 66

	
67
    const Digraph &g;
68
    typename Digraph::template NodeMap<OutArcIt> nedge;
67
    const GR &g;
68
    typename GR::template NodeMap<OutArcIt> nedge;
69 69
    std::list<Arc> euler;
70 70

	
71 71
  public:
72 72

	
73 73
    ///Constructor
74 74

	
75
    ///\param _g A digraph.
75
    ///\param gr A digraph.
76 76
    ///\param start The starting point of the tour. If it is not given
77 77
    ///       the tour will start from the first node.
78
    DiEulerIt(const Digraph &_g,typename Digraph::Node start=INVALID)
79
      : g(_g), nedge(g)
78
    DiEulerIt(const GR &gr, typename GR::Node start = INVALID)
79
      : g(gr), nedge(g)
80 80
    {
81 81
      if(start==INVALID) start=NodeIt(g);
82 82
      for(NodeIt n(g);n!=INVALID;++n) nedge[n]=OutArcIt(g,n);
83 83
      while(nedge[start]!=INVALID) {
84 84
        euler.push_back(nedge[start]);
85 85
        Node next=g.target(nedge[start]);
86 86
        ++nedge[start];
87 87
        start=next;
88 88
      }
89 89
    }
90 90

	
91 91
    ///Arc Conversion
... ...
@@ -136,49 +136,49 @@
136 136
  ///Euler tour of \c g.
137 137
  ///\code
138 138
  ///  for(EulerIt<ListGraph> e(g),e!=INVALID;++e) {
139 139
  ///    std::cout << g.id(Edge(e)) << std::eol;
140 140
  ///  }
141 141
  ///\endcode
142 142
  ///Although the iterator provides an Euler tour of an graph,
143 143
  ///it still returns Arcs in order to indicate the direction of the tour.
144 144
  ///(But Arc will convert to Edges, of course).
145 145
  ///
146 146
  ///If \c g is not Euler then the resulted tour will not be full or closed.
147 147
  ///\sa EulerIt
148
  template<class Digraph>
148
  template<typename GR>
149 149
  class EulerIt
150 150
  {
151
    typedef typename Digraph::Node Node;
152
    typedef typename Digraph::NodeIt NodeIt;
153
    typedef typename Digraph::Arc Arc;
154
    typedef typename Digraph::Edge Edge;
155
    typedef typename Digraph::ArcIt ArcIt;
156
    typedef typename Digraph::OutArcIt OutArcIt;
157
    typedef typename Digraph::InArcIt InArcIt;
151
    typedef typename GR::Node Node;
152
    typedef typename GR::NodeIt NodeIt;
153
    typedef typename GR::Arc Arc;
154
    typedef typename GR::Edge Edge;
155
    typedef typename GR::ArcIt ArcIt;
156
    typedef typename GR::OutArcIt OutArcIt;
157
    typedef typename GR::InArcIt InArcIt;
158 158

	
159
    const Digraph &g;
160
    typename Digraph::template NodeMap<OutArcIt> nedge;
161
    typename Digraph::template EdgeMap<bool> visited;
159
    const GR &g;
160
    typename GR::template NodeMap<OutArcIt> nedge;
161
    typename GR::template EdgeMap<bool> visited;
162 162
    std::list<Arc> euler;
163 163

	
164 164
  public:
165 165

	
166 166
    ///Constructor
167 167

	
168
    ///\param _g An graph.
168
    ///\param gr An graph.
169 169
    ///\param start The starting point of the tour. If it is not given
170 170
    ///       the tour will start from the first node.
171
    EulerIt(const Digraph &_g,typename Digraph::Node start=INVALID)
172
      : g(_g), nedge(g), visited(g,false)
171
    EulerIt(const GR &gr, typename GR::Node start = INVALID)
172
      : g(gr), nedge(g), visited(g, false)
173 173
    {
174 174
      if(start==INVALID) start=NodeIt(g);
175 175
      for(NodeIt n(g);n!=INVALID;++n) nedge[n]=OutArcIt(g,n);
176 176
      while(nedge[start]!=INVALID) {
177 177
        euler.push_back(nedge[start]);
178 178
        visited[nedge[start]]=true;
179 179
        Node next=g.target(nedge[start]);
180 180
        ++nedge[start];
181 181
        start=next;
182 182
        while(nedge[start]!=INVALID && visited[nedge[start]]) ++nedge[start];
183 183
      }
184 184
    }
... ...
@@ -229,36 +229,36 @@
229 229
  ///Checks if the graph is Eulerian
230 230

	
231 231
  /// \ingroup graph_prop
232 232
  ///Checks if the graph is Eulerian. It works for both directed and undirected
233 233
  ///graphs.
234 234
  ///\note By definition, a digraph is called \e Eulerian if
235 235
  ///and only if it is connected and the number of its incoming and outgoing
236 236
  ///arcs are the same for each node.
237 237
  ///Similarly, an undirected graph is called \e Eulerian if
238 238
  ///and only if it is connected and the number of incident arcs is even
239 239
  ///for each node. <em>Therefore, there are digraphs which are not Eulerian,
240 240
  ///but still have an Euler tour</em>.
241
  template<class Digraph>
241
  template<typename GR>
242 242
#ifdef DOXYGEN
243 243
  bool
244 244
#else
245
  typename enable_if<UndirectedTagIndicator<Digraph>,bool>::type
246
  eulerian(const Digraph &g)
245
  typename enable_if<UndirectedTagIndicator<GR>,bool>::type
246
  eulerian(const GR &g)
247 247
  {
248
    for(typename Digraph::NodeIt n(g);n!=INVALID;++n)
248
    for(typename GR::NodeIt n(g);n!=INVALID;++n)
249 249
      if(countIncEdges(g,n)%2) return false;
250 250
    return connected(g);
251 251
  }
252
  template<class Digraph>
253
  typename disable_if<UndirectedTagIndicator<Digraph>,bool>::type
252
  template<class GR>
253
  typename disable_if<UndirectedTagIndicator<GR>,bool>::type
254 254
#endif
255
  eulerian(const Digraph &g)
255
  eulerian(const GR &g)
256 256
  {
257
    for(typename Digraph::NodeIt n(g);n!=INVALID;++n)
257
    for(typename GR::NodeIt n(g);n!=INVALID;++n)
258 258
      if(countInArcs(g,n)!=countOutArcs(g,n)) return false;
259
    return connected(Undirector<const Digraph>(g));
259
    return connected(Undirector<const GR>(g));
260 260
  }
261 261

	
262 262
}
263 263

	
264 264
#endif
Ignore white space 24 line context
... ...
@@ -55,29 +55,29 @@
55 55
      typedef typename MT::Value Value;
56 56
      const MT &map;
57 57
      int yscale;
58 58
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
59 59
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
60 60
    };
61 61
  }
62 62

	
63 63
///Default traits class of GraphToEps
64 64

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

	
79 79

	
80 80
  const Graph &g;
81 81

	
82 82
  std::ostream& os;
83 83

	
... ...
@@ -130,45 +130,44 @@
130 130
  bool _autoNodeScale;
131 131
  bool _autoArcWidthScale;
132 132

	
133 133
  bool _absoluteNodeSizes;
134 134
  bool _absoluteArcWidths;
135 135

	
136 136
  bool _negY;
137 137

	
138 138
  bool _preScale;
139 139
  ///Constructor
140 140

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

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

	
... ...
@@ -1125,66 +1124,66 @@
1125 1124
///example shows how to use these parameters.
1126 1125
///\code
1127 1126
/// graphToEps(g,os).scale(10).coords(coords)
1128 1127
///              .nodeScale(2).nodeSizes(sizes)
1129 1128
///              .arcWidthScale(.4).run();
1130 1129
///\endcode
1131 1130
///
1132 1131
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1133 1132
///
1134 1133
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1135 1134
///to the end of the parameter list.
1136 1135
///\sa GraphToEps
1137
///\sa graphToEps(G &g, const char *file_name)
1138
template<class G>
1139
GraphToEps<DefaultGraphToEpsTraits<G> >
1140
graphToEps(G &g, std::ostream& os=std::cout)
1136
///\sa graphToEps(GR &g, const char *file_name)
1137
template<class GR>
1138
GraphToEps<DefaultGraphToEpsTraits<GR> >
1139
graphToEps(GR &g, std::ostream& os=std::cout)
1141 1140
{
1142 1141
  return
1143
    GraphToEps<DefaultGraphToEpsTraits<G> >(DefaultGraphToEpsTraits<G>(g,os));
1142
    GraphToEps<DefaultGraphToEpsTraits<GR> >(DefaultGraphToEpsTraits<GR>(g,os));
1144 1143
}
1145 1144

	
1146 1145
///Generates an EPS file from a graph
1147 1146

	
1148 1147
///\ingroup eps_io
1149 1148
///This function does the same as
1150
///\ref graphToEps(G &g,std::ostream& os)
1149
///\ref graphToEps(GR &g,std::ostream& os)
1151 1150
///but it writes its output into the file \c file_name
1152 1151
///instead of a stream.
1153
///\sa graphToEps(G &g, std::ostream& os)
1154
template<class G>
1155
GraphToEps<DefaultGraphToEpsTraits<G> >
1156
graphToEps(G &g,const char *file_name)
1152
///\sa graphToEps(GR &g, std::ostream& os)
1153
template<class GR>
1154
GraphToEps<DefaultGraphToEpsTraits<GR> >
1155
graphToEps(GR &g,const char *file_name)
1157 1156
{
1158 1157
  std::ostream* os = new std::ofstream(file_name);
1159 1158
  if (!(*os)) {
1160 1159
    delete os;
1161 1160
    throw IoError("Cannot write file", file_name);
1162 1161
  }
1163
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1164
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1162
  return GraphToEps<DefaultGraphToEpsTraits<GR> >
1163
    (DefaultGraphToEpsTraits<GR>(g,*os,true));
1165 1164
}
1166 1165

	
1167 1166
///Generates an EPS file from a graph
1168 1167

	
1169 1168
///\ingroup eps_io
1170 1169
///This function does the same as
1171
///\ref graphToEps(G &g,std::ostream& os)
1170
///\ref graphToEps(GR &g,std::ostream& os)
1172 1171
///but it writes its output into the file \c file_name
1173 1172
///instead of a stream.
1174
///\sa graphToEps(G &g, std::ostream& os)
1175
template<class G>
1176
GraphToEps<DefaultGraphToEpsTraits<G> >
1177
graphToEps(G &g,const std::string& file_name)
1173
///\sa graphToEps(GR &g, std::ostream& os)
1174
template<class GR>
1175
GraphToEps<DefaultGraphToEpsTraits<GR> >
1176
graphToEps(GR &g,const std::string& file_name)
1178 1177
{
1179 1178
  std::ostream* os = new std::ofstream(file_name.c_str());
1180 1179
  if (!(*os)) {
1181 1180
    delete os;
1182 1181
    throw IoError("Cannot write file", file_name);
1183 1182
  }
1184
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1185
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1183
  return GraphToEps<DefaultGraphToEpsTraits<GR> >
1184
    (DefaultGraphToEpsTraits<GR>(g,*os,true));
1186 1185
}
1187 1186

	
1188 1187
} //END OF NAMESPACE LEMON
1189 1188

	
1190 1189
#endif // LEMON_GRAPH_TO_EPS_H
Ignore white space 24 line context
... ...
@@ -487,25 +487,25 @@
487 487
  ///
488 488
  /// A short example about the basic usage:
489 489
  ///\code
490 490
  /// GridGraph graph(rows, cols);
491 491
  /// GridGraph::NodeMap<int> val(graph);
492 492
  /// for (int i = 0; i < graph.width(); ++i) {
493 493
  ///   for (int j = 0; j < graph.height(); ++j) {
494 494
  ///     val[graph(i, j)] = i + j;
495 495
  ///   }
496 496
  /// }
497 497
  ///\endcode
498 498
  ///
499
  /// This graph type is fully conform to the \ref concepts::Graph
499
  /// This graph type fully conforms to the \ref concepts::Graph
500 500
  /// "Graph" concept, and it also has an important extra feature
501 501
  /// that its maps are real \ref concepts::ReferenceMap
502 502
  /// "reference map"s.
503 503
  class GridGraph : public ExtendedGridGraphBase {
504 504
  public:
505 505

	
506 506
    typedef ExtendedGridGraphBase Parent;
507 507

	
508 508
    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
509 509
    ///
510 510
    /// Map to get the indices of the nodes as dim2::Point<int>.
511 511
    class IndexMap {
Ignore white space 24 line context
... ...
@@ -48,45 +48,45 @@
48 48
  /// out-degree) and in the second phase it determines a minimum cut
49 49
  /// with \f$ source \f$ on the sink-side (i.e. a set
50 50
  /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal
51 51
  /// out-degree). Obviously, the smaller of these two cuts will be a
52 52
  /// minimum cut of \f$ D \f$. The algorithm is a modified
53 53
  /// push-relabel preflow algorithm and our implementation calculates
54 54
  /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the
55 55
  /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The
56 56
  /// purpose of such algorithm is testing network reliability. For an
57 57
  /// undirected graph you can run just the first phase of the
58 58
  /// algorithm or you can use the algorithm of Nagamochi and Ibaraki
59 59
  /// which solves the undirected problem in
60
  /// \f$ O(nm + n^2 \log(n)) \f$ time: it is implemented in the
60
  /// \f$ O(nm + n^2 \log n) \f$ time: it is implemented in the
61 61
  /// NagamochiIbaraki algorithm class.
62 62
  ///
63
  /// \param _Digraph is the graph type of the algorithm.
64
  /// \param _CapacityMap is an edge map of capacities which should
65
  /// be any numreric type. The default type is _Digraph::ArcMap<int>.
66
  /// \param _Tolerance is the handler of the inexact computation. The
67
  /// default type for this is Tolerance<CapacityMap::Value>.
63
  /// \param GR The digraph class the algorithm runs on.
64
  /// \param CAP An arc map of capacities which can be any numreric type.
65
  /// The default type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
66
  /// \param TOL Tolerance class for handling inexact computations. The
67
  /// default tolerance type is \ref Tolerance "Tolerance<CAP::Value>".
68 68
#ifdef DOXYGEN
69
  template <typename _Digraph, typename _CapacityMap, typename _Tolerance>
69
  template <typename GR, typename CAP, typename TOL>
70 70
#else
71
  template <typename _Digraph,
72
            typename _CapacityMap = typename _Digraph::template ArcMap<int>,
73
            typename _Tolerance = Tolerance<typename _CapacityMap::Value> >
71
  template <typename GR,
72
            typename CAP = typename GR::template ArcMap<int>,
73
            typename TOL = Tolerance<typename CAP::Value> >
74 74
#endif
75 75
  class HaoOrlin {
76 76
  private:
77 77

	
78
    typedef _Digraph Digraph;
79
    typedef _CapacityMap CapacityMap;
80
    typedef _Tolerance Tolerance;
78
    typedef GR Digraph;
79
    typedef CAP CapacityMap;
80
    typedef TOL Tolerance;
81 81

	
82 82
    typedef typename CapacityMap::Value Value;
83 83

	
84 84
    TEMPLATE_GRAPH_TYPEDEFS(Digraph);
85 85

	
86 86
    const Digraph& _graph;
87 87
    const CapacityMap* _capacity;
88 88

	
89 89
    typedef typename Digraph::template ArcMap<Value> FlowMap;
90 90
    FlowMap* _flow;
91 91

	
92 92
    Node _source;
... ...
@@ -808,25 +808,25 @@
808 808
          while (_highest != _sets.back().end() &&
809 809
                 !(*_active)[_first[*_highest]]) {
810 810
            ++_highest;
811 811
          }
812 812
        }
813 813
      }
814 814
    }
815 815

	
816 816
  public:
817 817

	
818 818
    /// \name Execution control
819 819
    /// The simplest way to execute the algorithm is to use
820
    /// one of the member functions called \c run(...).
820
    /// one of the member functions called \ref run().
821 821
    /// \n
822 822
    /// If you need more control on the execution,
823 823
    /// first you must call \ref init(), then the \ref calculateIn() or
824 824
    /// \ref calculateOut() functions.
825 825

	
826 826
    /// @{
827 827

	
828 828
    /// \brief Initializes the internal data structures.
829 829
    ///
830 830
    /// Initializes the internal data structures. It creates
831 831
    /// the maps, residual graph adaptors and some bucket structures
832 832
    /// for the algorithm.
Ignore white space 24 line context
... ...
@@ -282,25 +282,25 @@
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285 285
  /// This class implements a special graph type. The nodes of the graph
286 286
  /// are indiced with integers with at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289 289
  ///
290 290
  /// \note The type of the indices is chosen to \c int for efficiency
291 291
  /// reasons. Thus the maximum dimension of this implementation is 26
292 292
  /// (assuming that the size of \c int is 32 bit).
293 293
  ///
294
  /// This graph type is fully conform to the \ref concepts::Graph
294
  /// This graph type fully conforms to the \ref concepts::Graph
295 295
  /// "Graph" concept, and it also has an important extra feature
296 296
  /// that its maps are real \ref concepts::ReferenceMap
297 297
  /// "reference map"s.
298 298
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
299 299
  public:
300 300

	
301 301
    typedef ExtendedHypercubeGraphBase Parent;
302 302

	
303 303
    /// \brief Constructs a hypercube graph with \c dim dimensions.
304 304
    ///
305 305
    /// Constructs a hypercube graph with \c dim dimensions.
306 306
    HypercubeGraph(int dim) { construct(dim); }
Ignore white space 24 line context
... ...
@@ -439,34 +439,34 @@
439 439
  /// are given as a parameter of these functions. An
440 440
  /// application of these functions is multipass reading, which is
441 441
  /// important if two \c \@arcs sections must be read from the
442 442
  /// file. In this case the first phase would read the node set and one
443 443
  /// of the arc sets, while the second phase would read the second arc
444 444
  /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet).
445 445
  /// The previously read label node map should be passed to the \c
446 446
  /// useNodes() functions. Another application of multipass reading when
447 447
  /// paths are given as a node map or an arc map.
448 448
  /// It is impossible to read this in
449 449
  /// a single pass, because the arcs are not constructed when the node
450 450
  /// maps are read.
451
  template <typename _Digraph>
451
  template <typename GR>
452 452
  class DigraphReader {
453 453
  public:
454 454

	
455
    typedef _Digraph Digraph;
455
    typedef GR Digraph;
456

	
457
  private:
458

	
456 459
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
457 460

	
458
  private:
459

	
460

	
461 461
    std::istream* _is;
462 462
    bool local_is;
463 463
    std::string _filename;
464 464

	
465 465
    Digraph& _digraph;
466 466

	
467 467
    std::string _nodes_caption;
468 468
    std::string _arcs_caption;
469 469
    std::string _attributes_caption;
470 470

	
471 471
    typedef std::map<std::string, Node> NodeIndex;
472 472
    NodeIndex _node_index;
... ...
@@ -1237,33 +1237,34 @@
1237 1237
  ///
1238 1238
  /// This utility reads an \ref lgf-format "LGF" file.
1239 1239
  ///
1240 1240
  /// It can be used almost the same way as \c DigraphReader.
1241 1241
  /// The only difference is that this class can handle edges and
1242 1242
  /// edge maps as well as arcs and arc maps.
1243 1243
  ///
1244 1244
  /// The columns in the \c \@edges (or \c \@arcs) section are the
1245 1245
  /// edge maps. However, if there are two maps with the same name
1246 1246
  /// prefixed with \c '+' and \c '-', then these can be read into an
1247 1247
  /// arc map.  Similarly, an attribute can be read into an arc, if
1248 1248
  /// it's value is an edge label prefixed with \c '+' or \c '-'.
1249
  template <typename _Graph>
1249
  template <typename GR>
1250 1250
  class GraphReader {
1251 1251
  public:
1252 1252

	
1253
    typedef _Graph Graph;
1253
    typedef GR Graph;
1254

	
1255
  private:
1256

	
1254 1257
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1255 1258

	
1256
  private:
1257

	
1258 1259
    std::istream* _is;
1259 1260
    bool local_is;
1260 1261
    std::string _filename;
1261 1262

	
1262 1263
    Graph& _graph;
1263 1264

	
1264 1265
    std::string _nodes_caption;
1265 1266
    std::string _edges_caption;
1266 1267
    std::string _attributes_caption;
1267 1268

	
1268 1269
    typedef std::map<std::string, Node> NodeIndex;
1269 1270
    NodeIndex _node_index;
... ...
@@ -1347,30 +1348,30 @@
1347 1348
      for (typename Attributes::iterator it = _attributes.begin();
1348 1349
           it != _attributes.end(); ++it) {
1349 1350
        delete it->second;
1350 1351
      }
1351 1352

	
1352 1353
      if (local_is) {
1353 1354
        delete _is;
1354 1355
      }
1355 1356

	
1356 1357
    }
1357 1358

	
1358 1359
  private:
1359
    template <typename GR>
1360
    friend GraphReader<GR> graphReader(GR& graph, std::istream& is);
1361
    template <typename GR>
1362
    friend GraphReader<GR> graphReader(GR& graph, const std::string& fn); 
1363
    template <typename GR>
1364
    friend GraphReader<GR> graphReader(GR& graph, const char *fn);
1360
    template <typename Graph>
1361
    friend GraphReader<Graph> graphReader(Graph& graph, std::istream& is);
1362
    template <typename Graph>
1363
    friend GraphReader<Graph> graphReader(Graph& graph, const std::string& fn); 
1364
    template <typename Graph>
1365
    friend GraphReader<Graph> graphReader(Graph& graph, const char *fn);
1365 1366

	
1366 1367
    GraphReader(GraphReader& other)
1367 1368
      : _is(other._is), local_is(other.local_is), _graph(other._graph),
1368 1369
        _use_nodes(other._use_nodes), _use_edges(other._use_edges),
1369 1370
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1370 1371

	
1371 1372
      other._is = 0;
1372 1373
      other.local_is = false;
1373 1374

	
1374 1375
      _node_index.swap(other._node_index);
1375 1376
      _edge_index.swap(other._edge_index);
1376 1377

	
Ignore white space 24 line context
... ...
@@ -397,29 +397,29 @@
397 397
  /// sections, but they can be give as an optional parameter of
398 398
  /// the \c nodes(), \c arcs() or \c
399 399
  /// attributes() functions.
400 400
  ///
401 401
  /// The \c skipNodes() and \c skipArcs() functions forbid the
402 402
  /// writing of the sections. If two arc sections should be written
403 403
  /// to the output, it can be done in two passes, the first pass
404 404
  /// writes the node section and the first arc section, then the
405 405
  /// second pass skips the node section and writes just the arc
406 406
  /// section to the stream. The output stream can be retrieved with
407 407
  /// the \c ostream() function, hence the second pass can append its
408 408
  /// output to the output of the first pass.
409
  template <typename _Digraph>
409
  template <typename GR>
410 410
  class DigraphWriter {
411 411
  public:
412 412

	
413
    typedef _Digraph Digraph;
413
    typedef GR Digraph;
414 414
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
415 415

	
416 416
  private:
417 417

	
418 418

	
419 419
    std::ostream* _os;
420 420
    bool local_os;
421 421

	
422 422
    const Digraph& _digraph;
423 423

	
424 424
    std::string _nodes_caption;
425 425
    std::string _arcs_caption;
... ...
@@ -965,29 +965,29 @@
965 965
  ///
966 966
  /// This utility writes an \ref lgf-format "LGF" file.
967 967
  ///
968 968
  /// It can be used almost the same way as \c DigraphWriter.
969 969
  /// The only difference is that this class can handle edges and
970 970
  /// edge maps as well as arcs and arc maps.
971 971
  ///
972 972
  /// The arc maps are written into the file as two columns, the
973 973
  /// caption of the columns are the name of the map prefixed with \c
974 974
  /// '+' and \c '-'. The arcs are written into the \c \@attributes
975 975
  /// section as a \c '+' or a \c '-' prefix (depends on the direction
976 976
  /// of the arc) and the label of corresponding edge.
977
  template <typename _Graph>
977
  template <typename GR>
978 978
  class GraphWriter {
979 979
  public:
980 980

	
981
    typedef _Graph Graph;
981
    typedef GR Graph;
982 982
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
983 983

	
984 984
  private:
985 985

	
986 986

	
987 987
    std::ostream* _os;
988 988
    bool local_os;
989 989

	
990 990
    const Graph& _graph;
991 991

	
992 992
    std::string _nodes_caption;
993 993
    std::string _edges_caption;
... ...
@@ -1064,33 +1064,33 @@
1064 1064
      for (typename Attributes::iterator it = _attributes.begin();
1065 1065
           it != _attributes.end(); ++it) {
1066 1066
        delete it->second;
1067 1067
      }
1068 1068

	
1069 1069
      if (local_os) {
1070 1070
        delete _os;
1071 1071
      }
1072 1072
    }
1073 1073

	
1074 1074
  private:
1075 1075

	
1076
    template <typename GR>
1077
    friend GraphWriter<GR> graphWriter(const GR& graph,
1078
                                       std::ostream& os);
1079
    template <typename GR>
1080
    friend GraphWriter<GR> graphWriter(const GR& graph,
1081
                                       const std::string& fn);
1082
    template <typename GR>
1083
    friend GraphWriter<GR> graphWriter(const GR& graph,
1084
                                       const char *fn);
1076
    template <typename Graph>
1077
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1078
                                          std::ostream& os);
1079
    template <typename Graph>
1080
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1081
                                          const std::string& fn);
1082
    template <typename Graph>
1083
    friend GraphWriter<Graph> graphWriter(const Graph& graph,
1084
                                          const char *fn);
1085 1085
    
1086 1086
    GraphWriter(GraphWriter& other)
1087 1087
      : _os(other._os), local_os(other.local_os), _graph(other._graph),
1088 1088
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1089 1089

	
1090 1090
      other._os = 0;
1091 1091
      other.local_os = false;
1092 1092

	
1093 1093
      _node_index.swap(other._node_index);
1094 1094
      _edge_index.swap(other._edge_index);
1095 1095

	
1096 1096
      _node_maps.swap(other._node_maps);
Ignore white space 24 line context
... ...
@@ -342,32 +342,32 @@
342 342

	
343 343
    typedef ExtendedListDigraphBase Parent;
344 344

	
345 345
    /// Constructor
346 346

	
347 347
    /// Constructor.
348 348
    ///
349 349
    ListDigraph() {}
350 350

	
351 351
    ///Add a new node to the digraph.
352 352

	
353 353
    ///Add a new node to the digraph.
354
    ///\return the new node.
354
    ///\return The new node.
355 355
    Node addNode() { return Parent::addNode(); }
356 356

	
357 357
    ///Add a new arc to the digraph.
358 358

	
359 359
    ///Add a new arc to the digraph with source node \c s
360 360
    ///and target node \c t.
361
    ///\return the new arc.
361
    ///\return The new arc.
362 362
    Arc addArc(const Node& s, const Node& t) {
363 363
      return Parent::addArc(s, t);
364 364
    }
365 365

	
366 366
    ///\brief Erase a node from the digraph.
367 367
    ///
368 368
    ///Erase a node from the digraph.
369 369
    ///
370 370
    void erase(const Node& n) { Parent::erase(n); }
371 371

	
372 372
    ///\brief Erase an arc from the digraph.
373 373
    ///
... ...
@@ -1199,32 +1199,32 @@
1199 1199

	
1200 1200
    /// Constructor.
1201 1201
    ///
1202 1202
    ListGraph() {}
1203 1203

	
1204 1204
    typedef ExtendedListGraphBase Parent;
1205 1205

	
1206 1206
    typedef Parent::OutArcIt IncEdgeIt;
1207 1207

	
1208 1208
    /// \brief Add a new node to the graph.
1209 1209
    ///
1210 1210
    /// Add a new node to the graph.
1211
    /// \return the new node.
1211
    /// \return The new node.
1212 1212
    Node addNode() { return Parent::addNode(); }
1213 1213

	
1214 1214
    /// \brief Add a new edge to the graph.
1215 1215
    ///
1216 1216
    /// Add a new edge to the graph with source node \c s
1217 1217
    /// and target node \c t.
1218
    /// \return the new edge.
1218
    /// \return The new edge.
1219 1219
    Edge addEdge(const Node& s, const Node& t) {
1220 1220
      return Parent::addEdge(s, t);
1221 1221
    }
1222 1222

	
1223 1223
    /// \brief Erase a node from the graph.
1224 1224
    ///
1225 1225
    /// Erase a node from the graph.
1226 1226
    ///
1227 1227
    void erase(const Node& n) { Parent::erase(n); }
1228 1228

	
1229 1229
    /// \brief Erase an edge from the graph.
1230 1230
    ///
Ignore white space 24 line context
... ...
@@ -54,27 +54,28 @@
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
    typedef MapBase<K, V> Parent;
67
    typedef typename Parent::Key Key;
68
    typedef typename Parent::Value Value;
66
    ///\e
67
    typedef K Key;
68
    ///\e
69
    typedef V Value;
69 70

	
70 71
    /// Gives back a default constructed element.
71 72
    Value operator[](const Key&) const { return Value(); }
72 73
    /// Absorbs the value.
73 74
    void set(const Key&, const Value&) {}
74 75
  };
75 76

	
76 77
  /// Returns a \c NullMap class
77 78

	
78 79
  /// This function just returns a \c NullMap class.
79 80
  /// \relates NullMap
80 81
  template <typename K, typename V>
... ...
@@ -93,27 +94,28 @@
93 94
  /// concept, but it absorbs the data written to it.
94 95
  ///
95 96
  /// The simplest way of using this map is through the constMap()
96 97
  /// function.
97 98
  ///
98 99
  /// \sa NullMap
99 100
  /// \sa IdentityMap
100 101
  template<typename K, typename V>
101 102
  class ConstMap : public MapBase<K, V> {
102 103
  private:
103 104
    V _value;
104 105
  public:
105
    typedef MapBase<K, V> Parent;
106
    typedef typename Parent::Key Key;
107
    typedef typename Parent::Value Value;
106
    ///\e
107
    typedef K Key;
108
    ///\e
109
    typedef V Value;
108 110

	
109 111
    /// Default constructor
110 112

	
111 113
    /// Default constructor.
112 114
    /// The value of the map will be default constructed.
113 115
    ConstMap() {}
114 116

	
115 117
    /// Constructor with specified initial value
116 118

	
117 119
    /// Constructor with specified initial value.
118 120
    /// \param v The initial value of the map.
119 121
    ConstMap(const Value &v) : _value(v) {}
... ...
@@ -159,27 +161,28 @@
159 161
  /// In other aspects it is equivalent to \c NullMap.
160 162
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
161 163
  /// concept, but it absorbs the data written to it.
162 164
  ///
163 165
  /// The simplest way of using this map is through the constMap()
164 166
  /// function.
165 167
  ///
166 168
  /// \sa NullMap
167 169
  /// \sa IdentityMap
168 170
  template<typename K, typename V, V v>
169 171
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
170 172
  public:
171
    typedef MapBase<K, V> Parent;
172
    typedef typename Parent::Key Key;
173
    typedef typename Parent::Value Value;
173
    ///\e
174
    typedef K Key;
175
    ///\e
176
    typedef V Value;
174 177

	
175 178
    /// Constructor.
176 179
    ConstMap() {}
177 180

	
178 181
    /// Gives back the specified value.
179 182
    Value operator[](const Key&) const { return v; }
180 183

	
181 184
    /// Absorbs the value.
182 185
    void set(const Key&, const Value&) {}
183 186
  };
184 187

	
185 188
  /// Returns a \c ConstMap class with inlined constant value
... ...
@@ -193,27 +196,28 @@
193 196
  }
194 197

	
195 198

	
196 199
  /// Identity map.
197 200

	
198 201
  /// This \ref concepts::ReadMap "read-only map" gives back the given
199 202
  /// key as value without any modification.
200 203
  ///
201 204
  /// \sa ConstMap
202 205
  template <typename T>
203 206
  class IdentityMap : public MapBase<T, T> {
204 207
  public:
205
    typedef MapBase<T, T> Parent;
206
    typedef typename Parent::Key Key;
207
    typedef typename Parent::Value Value;
208
    ///\e
209
    typedef T Key;
210
    ///\e
211
    typedef T Value;
208 212

	
209 213
    /// Gives back the given value without any modification.
210 214
    Value operator[](const Key &k) const {
211 215
      return k;
212 216
    }
213 217
  };
214 218

	
215 219
  /// Returns an \c IdentityMap class
216 220

	
217 221
  /// This function just returns an \c IdentityMap class.
218 222
  /// \relates IdentityMap
219 223
  template<typename T>
... ...
@@ -236,29 +240,28 @@
236 240
  /// function.
237 241
  template <typename V>
238 242
  class RangeMap : public MapBase<int, V> {
239 243
    template <typename V1>
240 244
    friend class RangeMap;
241 245
  private:
242 246

	
243 247
    typedef std::vector<V> Vector;
244 248
    Vector _vector;
245 249

	
246 250
  public:
247 251

	
248
    typedef MapBase<int, V> Parent;
249 252
    /// Key type
250
    typedef typename Parent::Key Key;
253
    typedef int Key;
251 254
    /// Value type
252
    typedef typename Parent::Value Value;
255
    typedef V Value;
253 256
    /// Reference type
254 257
    typedef typename Vector::reference Reference;
255 258
    /// Const reference type
256 259
    typedef typename Vector::const_reference ConstReference;
257 260

	
258 261
    typedef True ReferenceMapTag;
259 262

	
260 263
  public:
261 264

	
262 265
    /// Constructor with specified default value.
263 266
    RangeMap(int size = 0, const Value &value = Value())
264 267
      : _vector(size, value) {}
... ...
@@ -344,45 +347,44 @@
344 347
  /// This map is useful if a default value should be assigned to most of
345 348
  /// the keys and different values should be assigned only to a few
346 349
  /// keys (i.e. the map is "sparse").
347 350
  /// The name of this type also refers to this important usage.
348 351
  ///
349 352
  /// Apart form that this map can be used in many other cases since it
350 353
  /// is based on \c std::map, which is a general associative container.
351 354
  /// However keep in mind that it is usually not as efficient as other
352 355
  /// maps.
353 356
  ///
354 357
  /// The simplest way of using this map is through the sparseMap()
355 358
  /// function.
356
  template <typename K, typename V, typename Compare = std::less<K> >
359
  template <typename K, typename V, typename Comp = std::less<K> >
357 360
  class SparseMap : public MapBase<K, V> {
358 361
    template <typename K1, typename V1, typename C1>
359 362
    friend class SparseMap;
360 363
  public:
361 364

	
362
    typedef MapBase<K, V> Parent;
363 365
    /// Key type
364
    typedef typename Parent::Key Key;
366
    typedef K Key;
365 367
    /// Value type
366
    typedef typename Parent::Value Value;
368
    typedef V Value;
367 369
    /// Reference type
368 370
    typedef Value& Reference;
369 371
    /// Const reference type
370 372
    typedef const Value& ConstReference;
371 373

	
372 374
    typedef True ReferenceMapTag;
373 375

	
374 376
  private:
375 377

	
376
    typedef std::map<K, V, Compare> Map;
378
    typedef std::map<K, V, Comp> Map;
377 379
    Map _map;
378 380
    Value _value;
379 381

	
380 382
  public:
381 383

	
382 384
    /// \brief Constructor with specified default value.
383 385
    SparseMap(const Value &value = Value()) : _value(value) {}
384 386
    /// \brief Constructs the map from an appropriate \c std::map, and
385 387
    /// explicitly specifies a default value.
386 388
    template <typename V1, typename Comp1>
387 389
    SparseMap(const std::map<Key, V1, Comp1> &map,
388 390
              const Value &value = Value())
... ...
@@ -480,32 +482,33 @@
480 482
  /// \c Value type is from \c M1.
481 483
  /// \c M2::Value must be convertible to \c M1::Key.
482 484
  ///
483 485
  /// The simplest way of using this map is through the composeMap()
484 486
  /// function.
485 487
  ///
486 488
  /// \sa CombineMap
487 489
  template <typename M1, typename M2>
488 490
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
489 491
    const M1 &_m1;
490 492
    const M2 &_m2;
491 493
  public:
492
    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
493
    typedef typename Parent::Key Key;
494
    typedef typename Parent::Value Value;
494
    ///\e
495
    typedef typename M2::Key Key;
496
    ///\e
497
    typedef typename M1::Value Value;
495 498

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

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

	
504 507
  /// Returns a \c ComposeMap class
505 508

	
506 509
  /// This function just returns a \c ComposeMap class.
507 510
  ///
508 511
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
509 512
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
510 513
  /// will be equal to <tt>m1[m2[x]]</tt>.
511 514
  ///
... ...
@@ -536,32 +539,33 @@
536 539
  ///
537 540
  /// The simplest way of using this map is through the combineMap()
538 541
  /// function.
539 542
  ///
540 543
  /// \sa ComposeMap
541 544
  template<typename M1, typename M2, typename F,
542 545
           typename V = typename F::result_type>
543 546
  class CombineMap : public MapBase<typename M1::Key, V> {
544 547
    const M1 &_m1;
545 548
    const M2 &_m2;
546 549
    F _f;
547 550
  public:
548
    typedef MapBase<typename M1::Key, V> Parent;
549
    typedef typename Parent::Key Key;
550
    typedef typename Parent::Value Value;
551
    ///\e
552
    typedef typename M1::Key Key;
553
    ///\e
554
    typedef V Value;
551 555

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

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

	
561 565
  /// This function just returns a \c CombineMap class.
562 566
  ///
563 567
  /// For example, if \c m1 and \c m2 are both maps with \c double
564 568
  /// values, then
565 569
  /// \code
566 570
  ///   combineMap(m1,m2,std::plus<double>())
567 571
  /// \endcode
... ...
@@ -606,31 +610,32 @@
606 610
  /// Parameter \c F is the type of the used functor.
607 611
  ///
608 612
  /// The simplest way of using this map is through the functorToMap()
609 613
  /// function.
610 614
  ///
611 615
  /// \sa MapToFunctor
612 616
  template<typename F,
613 617
           typename K = typename F::argument_type,
614 618
           typename V = typename F::result_type>
615 619
  class FunctorToMap : public MapBase<K, V> {
616 620
    F _f;
617 621
  public:
618
    typedef MapBase<K, V> Parent;
619
    typedef typename Parent::Key Key;
620
    typedef typename Parent::Value Value;
622
    ///\e
623
    typedef K Key;
624
    ///\e
625
    typedef V Value;
621 626

	
622 627
    /// Constructor
623 628
    FunctorToMap(const F &f = F()) : _f(f) {}
624
    /// \e
629
    ///\e
625 630
    Value operator[](const Key &k) const { return _f(k); }
626 631
  };
627 632

	
628 633
  /// Returns a \c FunctorToMap class
629 634

	
630 635
  /// This function just returns a \c FunctorToMap class.
631 636
  ///
632 637
  /// This function is specialized for adaptable binary function
633 638
  /// classes and C++ functions.
634 639
  ///
635 640
  /// \relates FunctorToMap
636 641
  template<typename K, typename V, typename F>
... ...
@@ -660,36 +665,37 @@
660 665
  /// For the sake of convenience it also works as a usual
661 666
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
662 667
  /// and the \c Key and \c Value typedefs also exist.
663 668
  ///
664 669
  /// The simplest way of using this map is through the mapToFunctor()
665 670
  /// function.
666 671
  ///
667 672
  ///\sa FunctorToMap
668 673
  template <typename M>
669 674
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
670 675
    const M &_m;
671 676
  public:
672
    typedef MapBase<typename M::Key, typename M::Value> Parent;
673
    typedef typename Parent::Key Key;
674
    typedef typename Parent::Value Value;
675

	
676
    typedef typename Parent::Key argument_type;
677
    typedef typename Parent::Value result_type;
677
    ///\e
678
    typedef typename M::Key Key;
679
    ///\e
680
    typedef typename M::Value Value;
681

	
682
    typedef typename M::Key argument_type;
683
    typedef typename M::Value result_type;
678 684

	
679 685
    /// Constructor
680 686
    MapToFunctor(const M &m) : _m(m) {}
681
    /// \e
687
    ///\e
682 688
    Value operator()(const Key &k) const { return _m[k]; }
683
    /// \e
689
    ///\e
684 690
    Value operator[](const Key &k) const { return _m[k]; }
685 691
  };
686 692

	
687 693
  /// Returns a \c MapToFunctor class
688 694

	
689 695
  /// This function just returns a \c MapToFunctor class.
690 696
  /// \relates MapToFunctor
691 697
  template<typename M>
692 698
  inline MapToFunctor<M> mapToFunctor(const M &m) {
693 699
    return MapToFunctor<M>(m);
694 700
  }
695 701

	
... ...
@@ -700,35 +706,36 @@
700 706
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
701 707
  /// "readable map" to another type using the default conversion.
702 708
  /// The \c Key type of it is inherited from \c M and the \c Value
703 709
  /// type is \c V.
704 710
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
705 711
  ///
706 712
  /// The simplest way of using this map is through the convertMap()
707 713
  /// function.
708 714
  template <typename M, typename V>
709 715
  class ConvertMap : public MapBase<typename M::Key, V> {
710 716
    const M &_m;
711 717
  public:
712
    typedef MapBase<typename M::Key, V> Parent;
713
    typedef typename Parent::Key Key;
714
    typedef typename Parent::Value Value;
718
    ///\e
719
    typedef typename M::Key Key;
720
    ///\e
721
    typedef V Value;
715 722

	
716 723
    /// Constructor
717 724

	
718 725
    /// Constructor.
719 726
    /// \param m The underlying map.
720 727
    ConvertMap(const M &m) : _m(m) {}
721 728

	
722
    /// \e
729
    ///\e
723 730
    Value operator[](const Key &k) const { return _m[k]; }
724 731
  };
725 732

	
726 733
  /// Returns a \c ConvertMap class
727 734

	
728 735
  /// This function just returns a \c ConvertMap class.
729 736
  /// \relates ConvertMap
730 737
  template<typename V, typename M>
731 738
  inline ConvertMap<M, V> convertMap(const M &map) {
732 739
    return ConvertMap<M, V>(map);
733 740
  }
734 741

	
... ...
@@ -742,27 +749,28 @@
742 749
  ///
743 750
  /// The \c Key and \c Value types are inherited from \c M1.
744 751
  /// The \c Key and \c Value of \c M2 must be convertible from those
745 752
  /// of \c M1.
746 753
  ///
747 754
  /// The simplest way of using this map is through the forkMap()
748 755
  /// function.
749 756
  template<typename  M1, typename M2>
750 757
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
751 758
    M1 &_m1;
752 759
    M2 &_m2;
753 760
  public:
754
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
755
    typedef typename Parent::Key Key;
756
    typedef typename Parent::Value Value;
761
    ///\e
762
    typedef typename M1::Key Key;
763
    ///\e
764
    typedef typename M1::Value Value;
757 765

	
758 766
    /// Constructor
759 767
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
760 768
    /// Returns the value associated with the given key in the first map.
761 769
    Value operator[](const Key &k) const { return _m1[k]; }
762 770
    /// Sets the value associated with the given key in both maps.
763 771
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
764 772
  };
765 773

	
766 774
  /// Returns a \c ForkMap class
767 775

	
768 776
  /// This function just returns a \c ForkMap class.
... ...
@@ -788,31 +796,32 @@
788 796
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
789 797
  ///
790 798
  /// The simplest way of using this map is through the addMap()
791 799
  /// function.
792 800
  ///
793 801
  /// \sa SubMap, MulMap, DivMap
794 802
  /// \sa ShiftMap, ShiftWriteMap
795 803
  template<typename M1, typename M2>
796 804
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
797 805
    const M1 &_m1;
798 806
    const M2 &_m2;
799 807
  public:
800
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
801
    typedef typename Parent::Key Key;
802
    typedef typename Parent::Value Value;
808
    ///\e
809
    typedef typename M1::Key Key;
810
    ///\e
811
    typedef typename M1::Value Value;
803 812

	
804 813
    /// Constructor
805 814
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
806
    /// \e
815
    ///\e
807 816
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
808 817
  };
809 818

	
810 819
  /// Returns an \c AddMap class
811 820

	
812 821
  /// This function just returns an \c AddMap class.
813 822
  ///
814 823
  /// For example, if \c m1 and \c m2 are both maps with \c double
815 824
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
816 825
  /// <tt>m1[x]+m2[x]</tt>.
817 826
  ///
818 827
  /// \relates AddMap
... ...
@@ -836,31 +845,32 @@
836 845
  /// \endcode
837 846
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
838 847
  ///
839 848
  /// The simplest way of using this map is through the subMap()
840 849
  /// function.
841 850
  ///
842 851
  /// \sa AddMap, MulMap, DivMap
843 852
  template<typename M1, typename M2>
844 853
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
845 854
    const M1 &_m1;
846 855
    const M2 &_m2;
847 856
  public:
848
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
849
    typedef typename Parent::Key Key;
850
    typedef typename Parent::Value Value;
857
    ///\e
858
    typedef typename M1::Key Key;
859
    ///\e
860
    typedef typename M1::Value Value;
851 861

	
852 862
    /// Constructor
853 863
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
854
    /// \e
864
    ///\e
855 865
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
856 866
  };
857 867

	
858 868
  /// Returns a \c SubMap class
859 869

	
860 870
  /// This function just returns a \c SubMap class.
861 871
  ///
862 872
  /// For example, if \c m1 and \c m2 are both maps with \c double
863 873
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
864 874
  /// <tt>m1[x]-m2[x]</tt>.
865 875
  ///
866 876
  /// \relates SubMap
... ...
@@ -885,31 +895,32 @@
885 895
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
886 896
  ///
887 897
  /// The simplest way of using this map is through the mulMap()
888 898
  /// function.
889 899
  ///
890 900
  /// \sa AddMap, SubMap, DivMap
891 901
  /// \sa ScaleMap, ScaleWriteMap
892 902
  template<typename M1, typename M2>
893 903
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
894 904
    const M1 &_m1;
895 905
    const M2 &_m2;
896 906
  public:
897
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
898
    typedef typename Parent::Key Key;
899
    typedef typename Parent::Value Value;
907
    ///\e
908
    typedef typename M1::Key Key;
909
    ///\e
910
    typedef typename M1::Value Value;
900 911

	
901 912
    /// Constructor
902 913
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
903
    /// \e
914
    ///\e
904 915
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
905 916
  };
906 917

	
907 918
  /// Returns a \c MulMap class
908 919

	
909 920
  /// This function just returns a \c MulMap class.
910 921
  ///
911 922
  /// For example, if \c m1 and \c m2 are both maps with \c double
912 923
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
913 924
  /// <tt>m1[x]*m2[x]</tt>.
914 925
  ///
915 926
  /// \relates MulMap
... ...
@@ -933,31 +944,32 @@
933 944
  /// \endcode
934 945
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
935 946
  ///
936 947
  /// The simplest way of using this map is through the divMap()
937 948
  /// function.
938 949
  ///
939 950
  /// \sa AddMap, SubMap, MulMap
940 951
  template<typename M1, typename M2>
941 952
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
942 953
    const M1 &_m1;
943 954
    const M2 &_m2;
944 955
  public:
945
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
946
    typedef typename Parent::Key Key;
947
    typedef typename Parent::Value Value;
956
    ///\e
957
    typedef typename M1::Key Key;
958
    ///\e
959
    typedef typename M1::Value Value;
948 960

	
949 961
    /// Constructor
950 962
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
951
    /// \e
963
    ///\e
952 964
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
953 965
  };
954 966

	
955 967
  /// Returns a \c DivMap class
956 968

	
957 969
  /// This function just returns a \c DivMap class.
958 970
  ///
959 971
  /// For example, if \c m1 and \c m2 are both maps with \c double
960 972
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
961 973
  /// <tt>m1[x]/m2[x]</tt>.
962 974
  ///
963 975
  /// \relates DivMap
... ...
@@ -983,67 +995,69 @@
983 995
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
984 996
  /// \endcode
985 997
  ///
986 998
  /// The simplest way of using this map is through the shiftMap()
987 999
  /// function.
988 1000
  ///
989 1001
  /// \sa ShiftWriteMap
990 1002
  template<typename M, typename C = typename M::Value>
991 1003
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
992 1004
    const M &_m;
993 1005
    C _v;
994 1006
  public:
995
    typedef MapBase<typename M::Key, typename M::Value> Parent;
996
    typedef typename Parent::Key Key;
997
    typedef typename Parent::Value Value;
1007
    ///\e
1008
    typedef typename M::Key Key;
1009
    ///\e
1010
    typedef typename M::Value Value;
998 1011

	
999 1012
    /// Constructor
1000 1013

	
1001 1014
    /// Constructor.
1002 1015
    /// \param m The undelying map.
1003 1016
    /// \param v The constant value.
1004 1017
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1005
    /// \e
1018
    ///\e
1006 1019
    Value operator[](const Key &k) const { return _m[k]+_v; }
1007 1020
  };
1008 1021

	
1009 1022
  /// Shifts a map with a constant (read-write version).
1010 1023

	
1011 1024
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1012 1025
  /// of the given map and a constant value (i.e. it shifts the map with
1013 1026
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1014 1027
  /// It makes also possible to write the map.
1015 1028
  ///
1016 1029
  /// The simplest way of using this map is through the shiftWriteMap()
1017 1030
  /// function.
1018 1031
  ///
1019 1032
  /// \sa ShiftMap
1020 1033
  template<typename M, typename C = typename M::Value>
1021 1034
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1022 1035
    M &_m;
1023 1036
    C _v;
1024 1037
  public:
1025
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1026
    typedef typename Parent::Key Key;
1027
    typedef typename Parent::Value Value;
1038
    ///\e
1039
    typedef typename M::Key Key;
1040
    ///\e
1041
    typedef typename M::Value Value;
1028 1042

	
1029 1043
    /// Constructor
1030 1044

	
1031 1045
    /// Constructor.
1032 1046
    /// \param m The undelying map.
1033 1047
    /// \param v The constant value.
1034 1048
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1035
    /// \e
1049
    ///\e
1036 1050
    Value operator[](const Key &k) const { return _m[k]+_v; }
1037
    /// \e
1051
    ///\e
1038 1052
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1039 1053
  };
1040 1054

	
1041 1055
  /// Returns a \c ShiftMap class
1042 1056

	
1043 1057
  /// This function just returns a \c ShiftMap class.
1044 1058
  ///
1045 1059
  /// For example, if \c m is a map with \c double values and \c v is
1046 1060
  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1047 1061
  /// <tt>m[x]+v</tt>.
1048 1062
  ///
1049 1063
  /// \relates ShiftMap
... ...
@@ -1084,68 +1098,70 @@
1084 1098
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1085 1099
  /// \endcode
1086 1100
  ///
1087 1101
  /// The simplest way of using this map is through the scaleMap()
1088 1102
  /// function.
1089 1103
  ///
1090 1104
  /// \sa ScaleWriteMap
1091 1105
  template<typename M, typename C = typename M::Value>
1092 1106
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1093 1107
    const M &_m;
1094 1108
    C _v;
1095 1109
  public:
1096
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1097
    typedef typename Parent::Key Key;
1098
    typedef typename Parent::Value Value;
1110
    ///\e
1111
    typedef typename M::Key Key;
1112
    ///\e
1113
    typedef typename M::Value Value;
1099 1114

	
1100 1115
    /// Constructor
1101 1116

	
1102 1117
    /// Constructor.
1103 1118
    /// \param m The undelying map.
1104 1119
    /// \param v The constant value.
1105 1120
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1106
    /// \e
1121
    ///\e
1107 1122
    Value operator[](const Key &k) const { return _v*_m[k]; }
1108 1123
  };
1109 1124

	
1110 1125
  /// Scales a map with a constant (read-write version).
1111 1126

	
1112 1127
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1113 1128
  /// the given map multiplied from the left side with a constant value.
1114 1129
  /// Its \c Key and \c Value are inherited from \c M.
1115 1130
  /// It can also be used as write map if the \c / operator is defined
1116 1131
  /// between \c Value and \c C and the given multiplier is not zero.
1117 1132
  ///
1118 1133
  /// The simplest way of using this map is through the scaleWriteMap()
1119 1134
  /// function.
1120 1135
  ///
1121 1136
  /// \sa ScaleMap
1122 1137
  template<typename M, typename C = typename M::Value>
1123 1138
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1124 1139
    M &_m;
1125 1140
    C _v;
1126 1141
  public:
1127
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1128
    typedef typename Parent::Key Key;
1129
    typedef typename Parent::Value Value;
1142
    ///\e
1143
    typedef typename M::Key Key;
1144
    ///\e
1145
    typedef typename M::Value Value;
1130 1146

	
1131 1147
    /// Constructor
1132 1148

	
1133 1149
    /// Constructor.
1134 1150
    /// \param m The undelying map.
1135 1151
    /// \param v The constant value.
1136 1152
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1137
    /// \e
1153
    ///\e
1138 1154
    Value operator[](const Key &k) const { return _v*_m[k]; }
1139
    /// \e
1155
    ///\e
1140 1156
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1141 1157
  };
1142 1158

	
1143 1159
  /// Returns a \c ScaleMap class
1144 1160

	
1145 1161
  /// This function just returns a \c ScaleMap class.
1146 1162
  ///
1147 1163
  /// For example, if \c m is a map with \c double values and \c v is
1148 1164
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1149 1165
  /// <tt>v*m[x]</tt>.
1150 1166
  ///
1151 1167
  /// \relates ScaleMap
... ...
@@ -1184,31 +1200,32 @@
1184 1200
  /// \code
1185 1201
  ///   ScaleMap<M> neg(m,-1);
1186 1202
  /// \endcode
1187 1203
  ///
1188 1204
  /// The simplest way of using this map is through the negMap()
1189 1205
  /// function.
1190 1206
  ///
1191 1207
  /// \sa NegWriteMap
1192 1208
  template<typename M>
1193 1209
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1194 1210
    const M& _m;
1195 1211
  public:
1196
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1197
    typedef typename Parent::Key Key;
1198
    typedef typename Parent::Value Value;
1212
    ///\e
1213
    typedef typename M::Key Key;
1214
    ///\e
1215
    typedef typename M::Value Value;
1199 1216

	
1200 1217
    /// Constructor
1201 1218
    NegMap(const M &m) : _m(m) {}
1202
    /// \e
1219
    ///\e
1203 1220
    Value operator[](const Key &k) const { return -_m[k]; }
1204 1221
  };
1205 1222

	
1206 1223
  /// Negative of a map (read-write version)
1207 1224

	
1208 1225
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1209 1226
  /// negative of the values of the given map (using the unary \c -
1210 1227
  /// operator).
1211 1228
  /// Its \c Key and \c Value are inherited from \c M.
1212 1229
  /// It makes also possible to write the map.
1213 1230
  ///
1214 1231
  /// If M::Value is \c int, \c double etc., then
... ...
@@ -1219,33 +1236,34 @@
1219 1236
  /// \code
1220 1237
  ///   ScaleWriteMap<M> neg(m,-1);
1221 1238
  /// \endcode
1222 1239
  ///
1223 1240
  /// The simplest way of using this map is through the negWriteMap()
1224 1241
  /// function.
1225 1242
  ///
1226 1243
  /// \sa NegMap
1227 1244
  template<typename M>
1228 1245
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1229 1246
    M &_m;
1230 1247
  public:
1231
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1232
    typedef typename Parent::Key Key;
1233
    typedef typename Parent::Value Value;
1248
    ///\e
1249
    typedef typename M::Key Key;
1250
    ///\e
1251
    typedef typename M::Value Value;
1234 1252

	
1235 1253
    /// Constructor
1236 1254
    NegWriteMap(M &m) : _m(m) {}
1237
    /// \e
1255
    ///\e
1238 1256
    Value operator[](const Key &k) const { return -_m[k]; }
1239
    /// \e
1257
    ///\e
1240 1258
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1241 1259
  };
1242 1260

	
1243 1261
  /// Returns a \c NegMap class
1244 1262

	
1245 1263
  /// This function just returns a \c NegMap class.
1246 1264
  ///
1247 1265
  /// For example, if \c m is a map with \c double values, then
1248 1266
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1249 1267
  ///
1250 1268
  /// \relates NegMap
1251 1269
  template <typename M>
... ...
@@ -1273,31 +1291,32 @@
1273 1291
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1274 1292
  /// value of the values of the given map.
1275 1293
  /// Its \c Key and \c Value are inherited from \c M.
1276 1294
  /// \c Value must be comparable to \c 0 and the unary \c -
1277 1295
  /// operator must be defined for it, of course.
1278 1296
  ///
1279 1297
  /// The simplest way of using this map is through the absMap()
1280 1298
  /// function.
1281 1299
  template<typename M>
1282 1300
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1283 1301
    const M &_m;
1284 1302
  public:
1285
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1286
    typedef typename Parent::Key Key;
1287
    typedef typename Parent::Value Value;
1303
    ///\e
1304
    typedef typename M::Key Key;
1305
    ///\e
1306
    typedef typename M::Value Value;
1288 1307

	
1289 1308
    /// Constructor
1290 1309
    AbsMap(const M &m) : _m(m) {}
1291
    /// \e
1310
    ///\e
1292 1311
    Value operator[](const Key &k) const {
1293 1312
      Value tmp = _m[k];
1294 1313
      return tmp >= 0 ? tmp : -tmp;
1295 1314
    }
1296 1315

	
1297 1316
  };
1298 1317

	
1299 1318
  /// Returns an \c AbsMap class
1300 1319

	
1301 1320
  /// This function just returns an \c AbsMap class.
1302 1321
  ///
1303 1322
  /// For example, if \c m is a map with \c double values, then
... ...
@@ -1328,27 +1347,28 @@
1328 1347
  ///   TrueMap<K> tm;
1329 1348
  /// \endcode
1330 1349
  /// is equivalent to
1331 1350
  /// \code
1332 1351
  ///   ConstMap<K,bool> tm(true);
1333 1352
  /// \endcode
1334 1353
  ///
1335 1354
  /// \sa FalseMap
1336 1355
  /// \sa ConstMap
1337 1356
  template <typename K>
1338 1357
  class TrueMap : public MapBase<K, bool> {
1339 1358
  public:
1340
    typedef MapBase<K, bool> Parent;
1341
    typedef typename Parent::Key Key;
1342
    typedef typename Parent::Value Value;
1359
    ///\e
1360
    typedef K Key;
1361
    ///\e
1362
    typedef bool Value;
1343 1363

	
1344 1364
    /// Gives back \c true.
1345 1365
    Value operator[](const Key&) const { return true; }
1346 1366
  };
1347 1367

	
1348 1368
  /// Returns a \c TrueMap class
1349 1369

	
1350 1370
  /// This function just returns a \c TrueMap class.
1351 1371
  /// \relates TrueMap
1352 1372
  template<typename K>
1353 1373
  inline TrueMap<K> trueMap() {
1354 1374
    return TrueMap<K>();
... ...
@@ -1365,27 +1385,28 @@
1365 1385
  ///   FalseMap<K> fm;
1366 1386
  /// \endcode
1367 1387
  /// is equivalent to
1368 1388
  /// \code
1369 1389
  ///   ConstMap<K,bool> fm(false);
1370 1390
  /// \endcode
1371 1391
  ///
1372 1392
  /// \sa TrueMap
1373 1393
  /// \sa ConstMap
1374 1394
  template <typename K>
1375 1395
  class FalseMap : public MapBase<K, bool> {
1376 1396
  public:
1377
    typedef MapBase<K, bool> Parent;
1378
    typedef typename Parent::Key Key;
1379
    typedef typename Parent::Value Value;
1397
    ///\e
1398
    typedef K Key;
1399
    ///\e
1400
    typedef bool Value;
1380 1401

	
1381 1402
    /// Gives back \c false.
1382 1403
    Value operator[](const Key&) const { return false; }
1383 1404
  };
1384 1405

	
1385 1406
  /// Returns a \c FalseMap class
1386 1407

	
1387 1408
  /// This function just returns a \c FalseMap class.
1388 1409
  /// \relates FalseMap
1389 1410
  template<typename K>
1390 1411
  inline FalseMap<K> falseMap() {
1391 1412
    return FalseMap<K>();
... ...
@@ -1410,31 +1431,32 @@
1410 1431
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1411 1432
  ///
1412 1433
  /// The simplest way of using this map is through the andMap()
1413 1434
  /// function.
1414 1435
  ///
1415 1436
  /// \sa OrMap
1416 1437
  /// \sa NotMap, NotWriteMap
1417 1438
  template<typename M1, typename M2>
1418 1439
  class AndMap : public MapBase<typename M1::Key, bool> {
1419 1440
    const M1 &_m1;
1420 1441
    const M2 &_m2;
1421 1442
  public:
1422
    typedef MapBase<typename M1::Key, bool> Parent;
1423
    typedef typename Parent::Key Key;
1424
    typedef typename Parent::Value Value;
1443
    ///\e
1444
    typedef typename M1::Key Key;
1445
    ///\e
1446
    typedef bool Value;
1425 1447

	
1426 1448
    /// Constructor
1427 1449
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1428
    /// \e
1450
    ///\e
1429 1451
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1430 1452
  };
1431 1453

	
1432 1454
  /// Returns an \c AndMap class
1433 1455

	
1434 1456
  /// This function just returns an \c AndMap class.
1435 1457
  ///
1436 1458
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1437 1459
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1438 1460
  /// <tt>m1[x]&&m2[x]</tt>.
1439 1461
  ///
1440 1462
  /// \relates AndMap
... ...
@@ -1458,31 +1480,32 @@
1458 1480
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1459 1481
  ///
1460 1482
  /// The simplest way of using this map is through the orMap()
1461 1483
  /// function.
1462 1484
  ///
1463 1485
  /// \sa AndMap
1464 1486
  /// \sa NotMap, NotWriteMap
1465 1487
  template<typename M1, typename M2>
1466 1488
  class OrMap : public MapBase<typename M1::Key, bool> {
1467 1489
    const M1 &_m1;
1468 1490
    const M2 &_m2;
1469 1491
  public:
1470
    typedef MapBase<typename M1::Key, bool> Parent;
1471
    typedef typename Parent::Key Key;
1472
    typedef typename Parent::Value Value;
1492
    ///\e
1493
    typedef typename M1::Key Key;
1494
    ///\e
1495
    typedef bool Value;
1473 1496

	
1474 1497
    /// Constructor
1475 1498
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1476
    /// \e
1499
    ///\e
1477 1500
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1478 1501
  };
1479 1502

	
1480 1503
  /// Returns an \c OrMap class
1481 1504

	
1482 1505
  /// This function just returns an \c OrMap class.
1483 1506
  ///
1484 1507
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1485 1508
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1486 1509
  /// <tt>m1[x]||m2[x]</tt>.
1487 1510
  ///
1488 1511
  /// \relates OrMap
... ...
@@ -1497,59 +1520,61 @@
1497 1520
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1498 1521
  /// negation of the values of the given map.
1499 1522
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1500 1523
  ///
1501 1524
  /// The simplest way of using this map is through the notMap()
1502 1525
  /// function.
1503 1526
  ///
1504 1527
  /// \sa NotWriteMap
1505 1528
  template <typename M>
1506 1529
  class NotMap : public MapBase<typename M::Key, bool> {
1507 1530
    const M &_m;
1508 1531
  public:
1509
    typedef MapBase<typename M::Key, bool> Parent;
1510
    typedef typename Parent::Key Key;
1511
    typedef typename Parent::Value Value;
1532
    ///\e
1533
    typedef typename M::Key Key;
1534
    ///\e
1535
    typedef bool Value;
1512 1536

	
1513 1537
    /// Constructor
1514 1538
    NotMap(const M &m) : _m(m) {}
1515
    /// \e
1539
    ///\e
1516 1540
    Value operator[](const Key &k) const { return !_m[k]; }
1517 1541
  };
1518 1542

	
1519 1543
  /// Logical 'not' of a map (read-write version)
1520 1544

	
1521 1545
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1522 1546
  /// logical negation of the values of the given map.
1523 1547
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1524 1548
  /// It makes also possible to write the map. When a value is set,
1525 1549
  /// the opposite value is set to the original map.
1526 1550
  ///
1527 1551
  /// The simplest way of using this map is through the notWriteMap()
1528 1552
  /// function.
1529 1553
  ///
1530 1554
  /// \sa NotMap
1531 1555
  template <typename M>
1532 1556
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1533 1557
    M &_m;
1534 1558
  public:
1535
    typedef MapBase<typename M::Key, bool> Parent;
1536
    typedef typename Parent::Key Key;
1537
    typedef typename Parent::Value Value;
1559
    ///\e
1560
    typedef typename M::Key Key;
1561
    ///\e
1562
    typedef bool Value;
1538 1563

	
1539 1564
    /// Constructor
1540 1565
    NotWriteMap(M &m) : _m(m) {}
1541
    /// \e
1566
    ///\e
1542 1567
    Value operator[](const Key &k) const { return !_m[k]; }
1543
    /// \e
1568
    ///\e
1544 1569
    void set(const Key &k, bool v) { _m.set(k, !v); }
1545 1570
  };
1546 1571

	
1547 1572
  /// Returns a \c NotMap class
1548 1573

	
1549 1574
  /// This function just returns a \c NotMap class.
1550 1575
  ///
1551 1576
  /// For example, if \c m is a map with \c bool values, then
1552 1577
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1553 1578
  ///
1554 1579
  /// \relates NotMap
1555 1580
  template <typename M>
... ...
@@ -1586,31 +1611,32 @@
1586 1611
  /// \endcode
1587 1612
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1588 1613
  ///
1589 1614
  /// The simplest way of using this map is through the equalMap()
1590 1615
  /// function.
1591 1616
  ///
1592 1617
  /// \sa LessMap
1593 1618
  template<typename M1, typename M2>
1594 1619
  class EqualMap : public MapBase<typename M1::Key, bool> {
1595 1620
    const M1 &_m1;
1596 1621
    const M2 &_m2;
1597 1622
  public:
1598
    typedef MapBase<typename M1::Key, bool> Parent;
1599
    typedef typename Parent::Key Key;
1600
    typedef typename Parent::Value Value;
1623
    ///\e
1624
    typedef typename M1::Key Key;
1625
    ///\e
1626
    typedef bool Value;
1601 1627

	
1602 1628
    /// Constructor
1603 1629
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1604
    /// \e
1630
    ///\e
1605 1631
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1606 1632
  };
1607 1633

	
1608 1634
  /// Returns an \c EqualMap class
1609 1635

	
1610 1636
  /// This function just returns an \c EqualMap class.
1611 1637
  ///
1612 1638
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1613 1639
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1614 1640
  /// <tt>m1[x]==m2[x]</tt>.
1615 1641
  ///
1616 1642
  /// \relates EqualMap
... ...
@@ -1634,31 +1660,32 @@
1634 1660
  /// \endcode
1635 1661
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1636 1662
  ///
1637 1663
  /// The simplest way of using this map is through the lessMap()
1638 1664
  /// function.
1639 1665
  ///
1640 1666
  /// \sa EqualMap
1641 1667
  template<typename M1, typename M2>
1642 1668
  class LessMap : public MapBase<typename M1::Key, bool> {
1643 1669
    const M1 &_m1;
1644 1670
    const M2 &_m2;
1645 1671
  public:
1646
    typedef MapBase<typename M1::Key, bool> Parent;
1647
    typedef typename Parent::Key Key;
1648
    typedef typename Parent::Value Value;
1672
    ///\e
1673
    typedef typename M1::Key Key;
1674
    ///\e
1675
    typedef bool Value;
1649 1676

	
1650 1677
    /// Constructor
1651 1678
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1652
    /// \e
1679
    ///\e
1653 1680
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1654 1681
  };
1655 1682

	
1656 1683
  /// Returns an \c LessMap class
1657 1684

	
1658 1685
  /// This function just returns an \c LessMap class.
1659 1686
  ///
1660 1687
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1661 1688
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1662 1689
  /// <tt>m1[x]<m2[x]</tt>.
1663 1690
  ///
1664 1691
  /// \relates LessMap
... ...
@@ -1696,42 +1723,45 @@
1696 1723
  /// The most important usage of it is storing certain nodes or arcs
1697 1724
  /// that were marked \c true by an algorithm.
1698 1725
  ///
1699 1726
  /// There are several algorithms that provide solutions through bool
1700 1727
  /// maps and most of them assign \c true at most once for each key.
1701 1728
  /// In these cases it is a natural request to store each \c true
1702 1729
  /// assigned elements (in order of the assignment), which can be
1703 1730
  /// easily done with LoggerBoolMap.
1704 1731
  ///
1705 1732
  /// The simplest way of using this map is through the loggerBoolMap()
1706 1733
  /// function.
1707 1734
  ///
1708
  /// \tparam It The type of the iterator.
1709
  /// \tparam Ke The key type of the map. The default value set
1735
  /// \tparam IT The type of the iterator.
1736
  /// \tparam KEY The key type of the map. The default value set
1710 1737
  /// according to the iterator type should work in most cases.
1711 1738
  ///
1712 1739
  /// \note The container of the iterator must contain enough space
1713 1740
  /// for the elements or the iterator should be an inserter iterator.
1714 1741
#ifdef DOXYGEN
1715
  template <typename It, typename Ke>
1742
  template <typename IT, typename KEY>
1716 1743
#else
1717
  template <typename It,
1718
            typename Ke=typename _maps_bits::IteratorTraits<It>::Value>
1744
  template <typename IT,
1745
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1719 1746
#endif
1720
  class LoggerBoolMap {
1747
  class LoggerBoolMap : public MapBase<KEY, bool> {
1721 1748
  public:
1722
    typedef It Iterator;
1723

	
1724
    typedef Ke Key;
1749

	
1750
    ///\e
1751
    typedef KEY Key;
1752
    ///\e
1725 1753
    typedef bool Value;
1754
    ///\e
1755
    typedef IT Iterator;
1726 1756

	
1727 1757
    /// Constructor
1728 1758
    LoggerBoolMap(Iterator it)
1729 1759
      : _begin(it), _end(it) {}
1730 1760

	
1731 1761
    /// Gives back the given iterator set for the first key
1732 1762
    Iterator begin() const {
1733 1763
      return _begin;
1734 1764
    }
1735 1765

	
1736 1766
    /// Gives back the the 'after the last' iterator
1737 1767
    Iterator end() const {
... ...
@@ -1776,143 +1806,155 @@
1776 1806
  ///
1777 1807
  /// \relates LoggerBoolMap
1778 1808
  template<typename Iterator>
1779 1809
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1780 1810
    return LoggerBoolMap<Iterator>(it);
1781 1811
  }
1782 1812

	
1783 1813
  /// @}
1784 1814

	
1785 1815
  /// \addtogroup graph_maps
1786 1816
  /// @{
1787 1817

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

	
1790
  /// The IdMap class provides a unique and immutable id for each item of the
1791
  /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1792
  /// different items (nodes) get different ids <li>\b immutable: the id of an
1793
  /// item (node) does not change (even if you delete other nodes).  </ul>
1794
  /// Through this map you get access (i.e. can read) the inner id values of
1795
  /// the items stored in the graph. This map can be inverted with its member
1818
  /// \brief Provides an immutable and unique id for each item in a graph.
1819
  ///
1820
  /// IdMap provides a unique and immutable id for each item of the
1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1822
  ///  - \b unique: different items get different ids,
1823
  ///  - \b immutable: the id of an item does not change (even if you
1824
  ///    delete other nodes).
1825
  ///
1826
  /// Using this map you get access (i.e. can read) the inner id values of
1827
  /// the items stored in the graph, which is returned by the \c id()
1828
  /// function of the graph. This map can be inverted with its member
1796 1829
  /// class \c InverseMap or with the \c operator() member.
1797 1830
  ///
1798
  template <typename _Graph, typename _Item>
1799
  class IdMap {
1831
  /// \tparam GR The graph type.
1832
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833
  /// \c GR::Edge).
1834
  ///
1835
  /// \see DescriptorMap
1836
  template <typename GR, typename K>
1837
  class IdMap : public MapBase<K, int> {
1800 1838
  public:
1801
    typedef _Graph Graph;
1839
    /// The graph type of IdMap.
1840
    typedef GR Graph;
1841
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1842
    typedef K Item;
1843
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1844
    typedef K Key;
1845
    /// The value type of IdMap.
1802 1846
    typedef int Value;
1803
    typedef _Item Item;
1804
    typedef _Item Key;
1805 1847

	
1806 1848
    /// \brief Constructor.
1807 1849
    ///
1808 1850
    /// Constructor of the map.
1809 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1810 1852

	
1811 1853
    /// \brief Gives back the \e id of the item.
1812 1854
    ///
1813 1855
    /// Gives back the immutable and unique \e id of the item.
1814 1856
    int operator[](const Item& item) const { return _graph->id(item);}
1815 1857

	
1816
    /// \brief Gives back the item by its id.
1858
    /// \brief Gives back the \e item by its id.
1817 1859
    ///
1818
    /// Gives back the item by its id.
1860
    /// Gives back the \e item by its id.
1819 1861
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1820 1862

	
1821 1863
  private:
1822 1864
    const Graph* _graph;
1823 1865

	
1824 1866
  public:
1825 1867

	
1826
    /// \brief The class represents the inverse of its owner (IdMap).
1868
    /// \brief This class represents the inverse of its owner (IdMap).
1827 1869
    ///
1828
    /// The class represents the inverse of its owner (IdMap).
1870
    /// This class represents the inverse of its owner (IdMap).
1829 1871
    /// \see inverse()
1830 1872
    class InverseMap {
1831 1873
    public:
1832 1874

	
1833 1875
      /// \brief Constructor.
1834 1876
      ///
1835 1877
      /// Constructor for creating an id-to-item map.
1836 1878
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1837 1879

	
1838 1880
      /// \brief Constructor.
1839 1881
      ///
1840 1882
      /// Constructor for creating an id-to-item map.
1841 1883
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1842 1884

	
1843 1885
      /// \brief Gives back the given item from its id.
1844 1886
      ///
1845 1887
      /// Gives back the given item from its id.
1846
      ///
1847 1888
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1848 1889

	
1849 1890
    private:
1850 1891
      const Graph* _graph;
1851 1892
    };
1852 1893

	
1853 1894
    /// \brief Gives back the inverse of the map.
1854 1895
    ///
1855 1896
    /// Gives back the inverse of the IdMap.
1856 1897
    InverseMap inverse() const { return InverseMap(*_graph);}
1857

	
1858 1898
  };
1859 1899

	
1860 1900

	
1861
  /// \brief General invertable graph-map type.
1862

	
1863
  /// This type provides simple invertable graph-maps.
1864
  /// The InvertableMap wraps an arbitrary ReadWriteMap
1901
  /// \brief General invertable graph map type.
1902

	
1903
  /// This class provides simple invertable graph maps.
1904
  /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
1865 1905
  /// and if a key is set to a new value then store it
1866 1906
  /// in the inverse map.
1867 1907
  ///
1868 1908
  /// The values of the map can be accessed
1869 1909
  /// with stl compatible forward iterator.
1870 1910
  ///
1871
  /// \tparam _Graph The graph type.
1872
  /// \tparam _Item The item type of the graph.
1873
  /// \tparam _Value The value type of the map.
1911
  /// \tparam GR The graph type.
1912
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1913
  /// \c GR::Edge).
1914
  /// \tparam V The value type of the map.
1874 1915
  ///
1875 1916
  /// \see IterableValueMap
1876
  template <typename _Graph, typename _Item, typename _Value>
1917
  template <typename GR, typename K, typename V>
1877 1918
  class InvertableMap
1878
    : protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
1919
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1879 1920
  private:
1880 1921

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

	
1885
    typedef std::map<_Value, _Item> Container;
1922
    typedef typename ItemSetTraits<GR, K>::
1923
      template Map<V>::Type Map;
1924

	
1925
    typedef std::map<V, K> Container;
1886 1926
    Container _inv_map;
1887 1927

	
1888 1928
  public:
1889 1929

	
1890
    /// The key type of InvertableMap (Node, Arc, Edge).
1891
    typedef typename Map::Key Key;
1892
    /// The value type of the InvertableMap.
1893
    typedef typename Map::Value Value;
1930
    /// The graph type of InvertableMap.
1931
    typedef GR Graph;
1932
    /// The key type of InvertableMap (\c Node, \c Arc or \c Edge).
1933
    typedef K Item;
1934
    /// The key type of InvertableMap (\c Node, \c Arc or \c Edge).
1935
    typedef K Key;
1936
    /// The value type of InvertableMap.
1937
    typedef V Value;
1894 1938

	
1895 1939
    /// \brief Constructor.
1896 1940
    ///
1897
    /// Construct a new InvertableMap for the graph.
1898
    ///
1941
    /// Construct a new InvertableMap for the given graph.
1899 1942
    explicit InvertableMap(const Graph& graph) : Map(graph) {}
1900 1943

	
1901 1944
    /// \brief Forward iterator for values.
1902 1945
    ///
1903 1946
    /// This iterator is an stl compatible forward
1904 1947
    /// iterator on the values of the map. The values can
1905
    /// be accessed in the [beginValue, endValue) range.
1906
    ///
1948
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1907 1949
    class ValueIterator
1908 1950
      : public std::iterator<std::forward_iterator_tag, Value> {
1909 1951
      friend class InvertableMap;
1910 1952
    private:
1911 1953
      ValueIterator(typename Container::const_iterator _it)
1912 1954
        : it(_it) {}
1913 1955
    public:
1914 1956

	
1915 1957
      ValueIterator() {}
1916 1958

	
1917 1959
      ValueIterator& operator++() { ++it; return *this; }
1918 1960
      ValueIterator operator++(int) {
... ...
@@ -1926,194 +1968,202 @@
1926 1968

	
1927 1969
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1928 1970
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1929 1971

	
1930 1972
    private:
1931 1973
      typename Container::const_iterator it;
1932 1974
    };
1933 1975

	
1934 1976
    /// \brief Returns an iterator to the first value.
1935 1977
    ///
1936 1978
    /// Returns an stl compatible iterator to the
1937 1979
    /// first value of the map. The values of the
1938
    /// map can be accessed in the [beginValue, endValue)
1980
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1939 1981
    /// range.
1940 1982
    ValueIterator beginValue() const {
1941 1983
      return ValueIterator(_inv_map.begin());
1942 1984
    }
1943 1985

	
1944 1986
    /// \brief Returns an iterator after the last value.
1945 1987
    ///
1946 1988
    /// Returns an stl compatible iterator after the
1947 1989
    /// last value of the map. The values of the
1948
    /// map can be accessed in the [beginValue, endValue)
1990
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1949 1991
    /// range.
1950 1992
    ValueIterator endValue() const {
1951 1993
      return ValueIterator(_inv_map.end());
1952 1994
    }
1953 1995

	
1954
    /// \brief The setter function of the map.
1996
    /// \brief Sets the value associated with the given key.
1955 1997
    ///
1956
    /// Sets the mapped value.
1998
    /// Sets the value associated with the given key.
1957 1999
    void set(const Key& key, const Value& val) {
1958 2000
      Value oldval = Map::operator[](key);
1959 2001
      typename Container::iterator it = _inv_map.find(oldval);
1960 2002
      if (it != _inv_map.end() && it->second == key) {
1961 2003
        _inv_map.erase(it);
1962 2004
      }
1963 2005
      _inv_map.insert(make_pair(val, key));
1964 2006
      Map::set(key, val);
1965 2007
    }
1966 2008

	
1967
    /// \brief The getter function of the map.
2009
    /// \brief Returns the value associated with the given key.
1968 2010
    ///
1969
    /// It gives back the value associated with the key.
2011
    /// Returns the value associated with the given key.
1970 2012
    typename MapTraits<Map>::ConstReturnValue
1971 2013
    operator[](const Key& key) const {
1972 2014
      return Map::operator[](key);
1973 2015
    }
1974 2016

	
1975 2017
    /// \brief Gives back the item by its value.
1976 2018
    ///
1977 2019
    /// Gives back the item by its value.
1978 2020
    Key operator()(const Value& key) const {
1979 2021
      typename Container::const_iterator it = _inv_map.find(key);
1980 2022
      return it != _inv_map.end() ? it->second : INVALID;
1981 2023
    }
1982 2024

	
1983 2025
  protected:
1984 2026

	
1985
    /// \brief Erase the key from the map.
2027
    /// \brief Erase the key from the map and the inverse map.
1986 2028
    ///
1987
    /// Erase the key to the map. It is called by the
2029
    /// Erase the key from the map and the inverse map. It is called by the
1988 2030
    /// \c AlterationNotifier.
1989 2031
    virtual void erase(const Key& key) {
1990 2032
      Value val = Map::operator[](key);
1991 2033
      typename Container::iterator it = _inv_map.find(val);
1992 2034
      if (it != _inv_map.end() && it->second == key) {
1993 2035
        _inv_map.erase(it);
1994 2036
      }
1995 2037
      Map::erase(key);
1996 2038
    }
1997 2039

	
1998
    /// \brief Erase more keys from the map.
2040
    /// \brief Erase more keys from the map and the inverse map.
1999 2041
    ///
2000
    /// Erase more keys from the map. It is called by the
2042
    /// Erase more keys from the map and the inverse map. It is called by the
2001 2043
    /// \c AlterationNotifier.
2002 2044
    virtual void erase(const std::vector<Key>& keys) {
2003 2045
      for (int i = 0; i < int(keys.size()); ++i) {
2004 2046
        Value val = Map::operator[](keys[i]);
2005 2047
        typename Container::iterator it = _inv_map.find(val);
2006 2048
        if (it != _inv_map.end() && it->second == keys[i]) {
2007 2049
          _inv_map.erase(it);
2008 2050
        }
2009 2051
      }
2010 2052
      Map::erase(keys);
2011 2053
    }
2012 2054

	
2013
    /// \brief Clear the keys from the map and inverse map.
2055
    /// \brief Clear the keys from the map and the inverse map.
2014 2056
    ///
2015
    /// Clear the keys from the map and inverse map. It is called by the
2057
    /// Clear the keys from the map and the inverse map. It is called by the
2016 2058
    /// \c AlterationNotifier.
2017 2059
    virtual void clear() {
2018 2060
      _inv_map.clear();
2019 2061
      Map::clear();
2020 2062
    }
2021 2063

	
2022 2064
  public:
2023 2065

	
2024 2066
    /// \brief The inverse map type.
2025 2067
    ///
2026 2068
    /// The inverse of this map. The subscript operator of the map
2027
    /// gives back always the item what was last assigned to the value.
2069
    /// gives back the item that was last assigned to the value.
2028 2070
    class InverseMap {
2029 2071
    public:
2030
      /// \brief Constructor of the InverseMap.
2072
      /// \brief Constructor
2031 2073
      ///
2032 2074
      /// Constructor of the InverseMap.
2033 2075
      explicit InverseMap(const InvertableMap& inverted)
2034 2076
        : _inverted(inverted) {}
2035 2077

	
2036 2078
      /// The value type of the InverseMap.
2037 2079
      typedef typename InvertableMap::Key Value;
2038 2080
      /// The key type of the InverseMap.
2039 2081
      typedef typename InvertableMap::Value Key;
2040 2082

	
2041 2083
      /// \brief Subscript operator.
2042 2084
      ///
2043
      /// Subscript operator. It gives back always the item
2044
      /// what was last assigned to the value.
2085
      /// Subscript operator. It gives back the item
2086
      /// that was last assigned to the given value.
2045 2087
      Value operator[](const Key& key) const {
2046 2088
        return _inverted(key);
2047 2089
      }
2048 2090

	
2049 2091
    private:
2050 2092
      const InvertableMap& _inverted;
2051 2093
    };
2052 2094

	
2053
    /// \brief It gives back the just readable inverse map.
2095
    /// \brief It gives back the read-only inverse map.
2054 2096
    ///
2055
    /// It gives back the just readable inverse map.
2097
    /// It gives back the read-only inverse map.
2056 2098
    InverseMap inverse() const {
2057 2099
      return InverseMap(*this);
2058 2100
    }
2059 2101

	
2060 2102
  };
2061 2103

	
2062 2104
  /// \brief Provides a mutable, continuous and unique descriptor for each
2063
  /// item in the graph.
2105
  /// item in a graph.
2064 2106
  ///
2065
  /// The DescriptorMap class provides a unique and continuous (but mutable)
2066
  /// descriptor (id) for each item of the same type (e.g. node) in the
2067
  /// graph. This id is <ul><li>\b unique: different items (nodes) get
2068
  /// different ids <li>\b continuous: the range of the ids is the set of
2069
  /// integers between 0 and \c n-1, where \c n is the number of the items of
2070
  /// this type (e.g. nodes) (so the id of a node can change if you delete an
2071
  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
2072
  /// with its member class \c InverseMap, or with the \c operator() member.
2107
  /// DescriptorMap provides a unique and continuous (but mutable)
2108
  /// descriptor (id) for each item of the same type (\c Node, \c Arc or
2109
  /// \c Edge) in a graph. This id is
2110
  ///  - \b unique: different items get different ids,
2111
  ///  - \b continuous: the range of the ids is the set of integers
2112
  ///    between 0 and \c n-1, where \c n is the number of the items of
2113
  ///    this type (\c Node, \c Arc or \c Edge). So the id of an item can
2114
  ///    change if you delete an other item of the same type, i.e. this
2115
  ///    id is mutable.
2073 2116
  ///
2074
  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
2075
  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
2076
  /// Edge.
2077
  template <typename _Graph, typename _Item>
2117
  /// Thus this id is not (necessarily) the same as what can get using
2118
  /// the \c id() function of the graph or \ref IdMap.
2119
  /// This map can be inverted with its member class \c InverseMap,
2120
  /// or with the \c operator() member.
2121
  ///
2122
  /// \tparam GR The graph type.
2123
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2124
  /// \c GR::Edge).
2125
  ///
2126
  /// \see IdMap
2127
  template <typename GR, typename K>
2078 2128
  class DescriptorMap
2079
    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
2080

	
2081
    typedef _Item Item;
2082
    typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map;
2129
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2130

	
2131
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2083 2132

	
2084 2133
  public:
2085
    /// The graph class of DescriptorMap.
2086
    typedef _Graph Graph;
2087

	
2088
    /// The key type of DescriptorMap (Node, Arc, Edge).
2089
    typedef typename Map::Key Key;
2134
    /// The graph type of DescriptorMap.
2135
    typedef GR Graph;
2136
    /// The key type of DescriptorMap (\c Node, \c Arc or \c Edge).
2137
    typedef K Item;
2138
    /// The key type of DescriptorMap (\c Node, \c Arc or \c Edge).
2139
    typedef K Key;
2090 2140
    /// The value type of DescriptorMap.
2091
    typedef typename Map::Value Value;
2141
    typedef int Value;
2092 2142

	
2093 2143
    /// \brief Constructor.
2094 2144
    ///
2095 2145
    /// Constructor for descriptor map.
2096
    explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
2146
    explicit DescriptorMap(const Graph& gr) : Map(gr) {
2097 2147
      Item it;
2098 2148
      const typename Map::Notifier* nf = Map::notifier();
2099 2149
      for (nf->first(it); it != INVALID; nf->next(it)) {
2100 2150
        Map::set(it, _inv_map.size());
2101 2151
        _inv_map.push_back(it);
2102 2152
      }
2103 2153
    }
2104 2154

	
2105 2155
  protected:
2106 2156

	
2107
    /// \brief Add a new key to the map.
2157
    /// \brief Adds a new key to the map.
2108 2158
    ///
2109 2159
    /// Add a new key to the map. It is called by the
2110 2160
    /// \c AlterationNotifier.
2111 2161
    virtual void add(const Item& item) {
2112 2162
      Map::add(item);
2113 2163
      Map::set(item, _inv_map.size());
2114 2164
      _inv_map.push_back(item);
2115 2165
    }
2116 2166

	
2117 2167
    /// \brief Add more new keys to the map.
2118 2168
    ///
2119 2169
    /// Add more new keys to the map. It is called by the
... ...
@@ -2205,292 +2255,261 @@
2205 2255
    ///
2206 2256
    /// Gives back th item by its descriptor.
2207 2257
    Item operator()(int id) const {
2208 2258
      return _inv_map[id];
2209 2259
    }
2210 2260

	
2211 2261
  private:
2212 2262

	
2213 2263
    typedef std::vector<Item> Container;
2214 2264
    Container _inv_map;
2215 2265

	
2216 2266
  public:
2267

	
2217 2268
    /// \brief The inverse map type of DescriptorMap.
2218 2269
    ///
2219 2270
    /// The inverse map type of DescriptorMap.
2220 2271
    class InverseMap {
2221 2272
    public:
2222
      /// \brief Constructor of the InverseMap.
2273
      /// \brief Constructor
2223 2274
      ///
2224 2275
      /// Constructor of the InverseMap.
2225 2276
      explicit InverseMap(const DescriptorMap& inverted)
2226 2277
        : _inverted(inverted) {}
2227 2278

	
2228 2279

	
2229 2280
      /// The value type of the InverseMap.
2230 2281
      typedef typename DescriptorMap::Key Value;
2231 2282
      /// The key type of the InverseMap.
2232 2283
      typedef typename DescriptorMap::Value Key;
2233 2284

	
2234 2285
      /// \brief Subscript operator.
2235 2286
      ///
2236 2287
      /// Subscript operator. It gives back the item
2237
      /// that the descriptor belongs to currently.
2288
      /// that the descriptor currently belongs to.
2238 2289
      Value operator[](const Key& key) const {
2239 2290
        return _inverted(key);
2240 2291
      }
2241 2292

	
2242 2293
      /// \brief Size of the map.
2243 2294
      ///
2244 2295
      /// Returns the size of the map.
2245 2296
      unsigned int size() const {
2246 2297
        return _inverted.size();
2247 2298
      }
2248 2299

	
2249 2300
    private:
2250 2301
      const DescriptorMap& _inverted;
2251 2302
    };
2252 2303

	
2253 2304
    /// \brief Gives back the inverse of the map.
2254 2305
    ///
2255 2306
    /// Gives back the inverse of the map.
2256 2307
    const InverseMap inverse() const {
2257 2308
      return InverseMap(*this);
2258 2309
    }
2259 2310
  };
2260 2311

	
2261
  /// \brief Returns the source of the given arc.
2312
  /// \brief Map of the source nodes of arcs in a digraph.
2262 2313
  ///
2263
  /// The SourceMap gives back the source Node of the given arc.
2314
  /// SourceMap provides access for the source node of each arc in a digraph,
2315
  /// which is returned by the \c source() function of the digraph.
2316
  /// \tparam GR The digraph type.
2264 2317
  /// \see TargetMap
2265
  template <typename Digraph>
2318
  template <typename GR>
2266 2319
  class SourceMap {
2267 2320
  public:
2268 2321

	
2269
    typedef typename Digraph::Node Value;
2270
    typedef typename Digraph::Arc Key;
2322
    ///\e
2323
    typedef typename GR::Arc Key;
2324
    ///\e
2325
    typedef typename GR::Node Value;
2271 2326

	
2272 2327
    /// \brief Constructor
2273 2328
    ///
2274
    /// Constructor
2329
    /// Constructor.
2275 2330
    /// \param digraph The digraph that the map belongs to.
2276
    explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
2277

	
2278
    /// \brief The subscript operator.
2331
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
2332

	
2333
    /// \brief Returns the source node of the given arc.
2279 2334
    ///
2280
    /// The subscript operator.
2281
    /// \param arc The arc
2282
    /// \return The source of the arc
2335
    /// Returns the source node of the given arc.
2283 2336
    Value operator[](const Key& arc) const {
2284
      return _digraph.source(arc);
2337
      return _graph.source(arc);
2285 2338
    }
2286 2339

	
2287 2340
  private:
2288
    const Digraph& _digraph;
2341
    const GR& _graph;
2289 2342
  };
2290 2343

	
2291 2344
  /// \brief Returns a \c SourceMap class.
2292 2345
  ///
2293 2346
  /// This function just returns an \c SourceMap class.
2294 2347
  /// \relates SourceMap
2295
  template <typename Digraph>
2296
  inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
2297
    return SourceMap<Digraph>(digraph);
2348
  template <typename GR>
2349
  inline SourceMap<GR> sourceMap(const GR& graph) {
2350
    return SourceMap<GR>(graph);
2298 2351
  }
2299 2352

	
2300
  /// \brief Returns the target of the given arc.
2353
  /// \brief Map of the target nodes of arcs in a digraph.
2301 2354
  ///
2302
  /// The TargetMap gives back the target Node of the given arc.
2355
  /// TargetMap provides access for the target node of each arc in a digraph,
2356
  /// which is returned by the \c target() function of the digraph.
2357
  /// \tparam GR The digraph type.
2303 2358
  /// \see SourceMap
2304
  template <typename Digraph>
2359
  template <typename GR>
2305 2360
  class TargetMap {
2306 2361
  public:
2307 2362

	
2308
    typedef typename Digraph::Node Value;
2309
    typedef typename Digraph::Arc Key;
2363
    ///\e
2364
    typedef typename GR::Arc Key;
2365
    ///\e
2366
    typedef typename GR::Node Value;
2310 2367

	
2311 2368
    /// \brief Constructor
2312 2369
    ///
2313
    /// Constructor
2370
    /// Constructor.
2314 2371
    /// \param digraph The digraph that the map belongs to.
2315
    explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
2316

	
2317
    /// \brief The subscript operator.
2372
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
2373

	
2374
    /// \brief Returns the target node of the given arc.
2318 2375
    ///
2319
    /// The subscript operator.
2320
    /// \param e The arc
2321
    /// \return The target of the arc
2376
    /// Returns the target node of the given arc.
2322 2377
    Value operator[](const Key& e) const {
2323
      return _digraph.target(e);
2378
      return _graph.target(e);
2324 2379
    }
2325 2380

	
2326 2381
  private:
2327
    const Digraph& _digraph;
2382
    const GR& _graph;
2328 2383
  };
2329 2384

	
2330 2385
  /// \brief Returns a \c TargetMap class.
2331 2386
  ///
2332 2387
  /// This function just returns a \c TargetMap class.
2333 2388
  /// \relates TargetMap
2334
  template <typename Digraph>
2335
  inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
2336
    return TargetMap<Digraph>(digraph);
2389
  template <typename GR>
2390
  inline TargetMap<GR> targetMap(const GR& graph) {
2391
    return TargetMap<GR>(graph);
2337 2392
  }
2338 2393

	
2339
  /// \brief Returns the "forward" directed arc view of an edge.
2394
  /// \brief Map of the "forward" directed arc view of edges in a graph.
2340 2395
  ///
2341
  /// Returns the "forward" directed arc view of an edge.
2396
  /// ForwardMap provides access for the "forward" directed arc view of
2397
  /// each edge in a graph, which is returned by the \c direct() function
2398
  /// of the graph with \c true parameter.
2399
  /// \tparam GR The graph type.
2342 2400
  /// \see BackwardMap
2343
  template <typename Graph>
2401
  template <typename GR>
2344 2402
  class ForwardMap {
2345 2403
  public:
2346 2404

	
2347
    typedef typename Graph::Arc Value;
2348
    typedef typename Graph::Edge Key;
2405
    typedef typename GR::Arc Value;
2406
    typedef typename GR::Edge Key;
2349 2407

	
2350 2408
    /// \brief Constructor
2351 2409
    ///
2352
    /// Constructor
2410
    /// Constructor.
2353 2411
    /// \param graph The graph that the map belongs to.
2354
    explicit ForwardMap(const Graph& graph) : _graph(graph) {}
2355

	
2356
    /// \brief The subscript operator.
2412
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
2413

	
2414
    /// \brief Returns the "forward" directed arc view of the given edge.
2357 2415
    ///
2358
    /// The subscript operator.
2359
    /// \param key An edge
2360
    /// \return The "forward" directed arc view of edge
2416
    /// Returns the "forward" directed arc view of the given edge.
2361 2417
    Value operator[](const Key& key) const {
2362 2418
      return _graph.direct(key, true);
2363 2419
    }
2364 2420

	
2365 2421
  private:
2366
    const Graph& _graph;
2422
    const GR& _graph;
2367 2423
  };
2368 2424

	
2369 2425
  /// \brief Returns a \c ForwardMap class.
2370 2426
  ///
2371 2427
  /// This function just returns an \c ForwardMap class.
2372 2428
  /// \relates ForwardMap
2373
  template <typename Graph>
2374
  inline ForwardMap<Graph> forwardMap(const Graph& graph) {
2375
    return ForwardMap<Graph>(graph);
2429
  template <typename GR>
2430
  inline ForwardMap<GR> forwardMap(const GR& graph) {
2431
    return ForwardMap<GR>(graph);
2376 2432
  }
2377 2433

	
2378
  /// \brief Returns the "backward" directed arc view of an edge.
2434
  /// \brief Map of the "backward" directed arc view of edges in a graph.
2379 2435
  ///
2380
  /// Returns the "backward" directed arc view of an edge.
2436
  /// BackwardMap provides access for the "backward" directed arc view of
2437
  /// each edge in a graph, which is returned by the \c direct() function
2438
  /// of the graph with \c false parameter.
2439
  /// \tparam GR The graph type.
2381 2440
  /// \see ForwardMap
2382
  template <typename Graph>
2441
  template <typename GR>
2383 2442
  class BackwardMap {
2384 2443
  public:
2385 2444

	
2386
    typedef typename Graph::Arc Value;
2387
    typedef typename Graph::Edge Key;
2445
    typedef typename GR::Arc Value;
2446
    typedef typename GR::Edge Key;
2388 2447

	
2389 2448
    /// \brief Constructor
2390 2449
    ///
2391
    /// Constructor
2450
    /// Constructor.
2392 2451
    /// \param graph The graph that the map belongs to.
2393
    explicit BackwardMap(const Graph& graph) : _graph(graph) {}
2394

	
2395
    /// \brief The subscript operator.
2452
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
2453

	
2454
    /// \brief Returns the "backward" directed arc view of the given edge.
2396 2455
    ///
2397
    /// The subscript operator.
2398
    /// \param key An edge
2399
    /// \return The "backward" directed arc view of edge
2456
    /// Returns the "backward" directed arc view of the given edge.
2400 2457
    Value operator[](const Key& key) const {
2401 2458
      return _graph.direct(key, false);
2402 2459
    }
2403 2460

	
2404 2461
  private:
2405
    const Graph& _graph;
2462
    const GR& _graph;
2406 2463
  };
2407 2464

	
2408 2465
  /// \brief Returns a \c BackwardMap class
2409 2466

	
2410 2467
  /// This function just returns a \c BackwardMap class.
2411 2468
  /// \relates BackwardMap
2412
  template <typename Graph>
2413
  inline BackwardMap<Graph> backwardMap(const Graph& graph) {
2414
    return BackwardMap<Graph>(graph);
2469
  template <typename GR>
2470
  inline BackwardMap<GR> backwardMap(const GR& graph) {
2471
    return BackwardMap<GR>(graph);
2415 2472
  }
2416 2473

	
2417
  /// \brief Potential difference map
2418
  ///
2419
  /// If there is an potential map on the nodes then we
2420
  /// can get an arc map as we get the substraction of the
2421
  /// values of the target and source.
2422
  template <typename Digraph, typename NodeMap>
2423
  class PotentialDifferenceMap {
2424
  public:
2425
    typedef typename Digraph::Arc Key;
2426
    typedef typename NodeMap::Value Value;
2427

	
2428
    /// \brief Constructor
2429
    ///
2430
    /// Contructor of the map
2431
    explicit PotentialDifferenceMap(const Digraph& digraph,
2432
                                    const NodeMap& potential)
2433
      : _digraph(digraph), _potential(potential) {}
2434

	
2435
    /// \brief Const subscription operator
2436
    ///
2437
    /// Const subscription operator
2438
    Value operator[](const Key& arc) const {
2439
      return _potential[_digraph.target(arc)] -
2440
        _potential[_digraph.source(arc)];
2441
    }
2442

	
2443
  private:
2444
    const Digraph& _digraph;
2445
    const NodeMap& _potential;
2446
  };
2447

	
2448
  /// \brief Returns a PotentialDifferenceMap.
2449
  ///
2450
  /// This function just returns a PotentialDifferenceMap.
2451
  /// \relates PotentialDifferenceMap
2452
  template <typename Digraph, typename NodeMap>
2453
  PotentialDifferenceMap<Digraph, NodeMap>
2454
  potentialDifferenceMap(const Digraph& digraph, const NodeMap& potential) {
2455
    return PotentialDifferenceMap<Digraph, NodeMap>(digraph, potential);
2456
  }
2457

	
2458
  /// \brief Map of the node in-degrees.
2474
  /// \brief Map of the in-degrees of nodes in a digraph.
2459 2475
  ///
2460 2476
  /// This map returns the in-degree of a node. Once it is constructed,
2461
  /// the degrees are stored in a standard NodeMap, so each query is done
2477
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2462 2478
  /// in constant time. On the other hand, the values are updated automatically
2463 2479
  /// whenever the digraph changes.
2464 2480
  ///
2465
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
2466
  /// alternative ways to modify the digraph. The correct behavior of InDegMap
2467
  /// is not guarantied if these additional features are used. For example
2468
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
2481
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2482
  /// may provide alternative ways to modify the digraph.
2483
  /// The correct behavior of InDegMap is not guarantied if these additional
2484
  /// features are used. For example the functions
2485
  /// \ref ListDigraph::changeSource() "changeSource()",
2469 2486
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2470 2487
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2471 2488
  /// of \ref ListDigraph will \e not update the degree values correctly.
2472 2489
  ///
2473 2490
  /// \sa OutDegMap
2474

	
2475
  template <typename _Digraph>
2491
  template <typename GR>
2476 2492
  class InDegMap
2477
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
2493
    : protected ItemSetTraits<GR, typename GR::Arc>
2478 2494
      ::ItemNotifier::ObserverBase {
2479 2495

	
2480 2496
  public:
2481

	
2482
    typedef _Digraph Digraph;
2497
    
2498
    /// The digraph type
2499
    typedef GR Digraph;
2500
    /// The key type
2501
    typedef typename Digraph::Node Key;
2502
    /// The value type
2483 2503
    typedef int Value;
2484
    typedef typename Digraph::Node Key;
2485 2504

	
2486 2505
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2487 2506
    ::ItemNotifier::ObserverBase Parent;
2488 2507

	
2489 2508
  private:
2490 2509

	
2491 2510
    class AutoNodeMap
2492 2511
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2493 2512
    public:
2494 2513

	
2495 2514
      typedef typename ItemSetTraits<Digraph, Key>::
2496 2515
      template Map<int>::Type Parent;
... ...
@@ -2514,34 +2533,36 @@
2514 2533
        Key it;
2515 2534
        typename Parent::Notifier* nf = Parent::notifier();
2516 2535
        for (nf->first(it); it != INVALID; nf->next(it)) {
2517 2536
          Parent::set(it, 0);
2518 2537
        }
2519 2538
      }
2520 2539
    };
2521 2540

	
2522 2541
  public:
2523 2542

	
2524 2543
    /// \brief Constructor.
2525 2544
    ///
2526
    /// Constructor for creating in-degree map.
2527
    explicit InDegMap(const Digraph& digraph)
2528
      : _digraph(digraph), _deg(digraph) {
2545
    /// Constructor for creating an in-degree map.
2546
    explicit InDegMap(const Digraph& graph)
2547
      : _digraph(graph), _deg(graph) {
2529 2548
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2530 2549

	
2531 2550
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2532 2551
        _deg[it] = countInArcs(_digraph, it);
2533 2552
      }
2534 2553
    }
2535 2554

	
2555
    /// \brief Gives back the in-degree of a Node.
2556
    ///
2536 2557
    /// Gives back the in-degree of a Node.
2537 2558
    int operator[](const Key& key) const {
2538 2559
      return _deg[key];
2539 2560
    }
2540 2561

	
2541 2562
  protected:
2542 2563

	
2543 2564
    typedef typename Digraph::Arc Arc;
2544 2565

	
2545 2566
    virtual void add(const Arc& arc) {
2546 2567
      ++_deg[_digraph.target(arc)];
2547 2568
    }
... ...
@@ -2570,51 +2591,54 @@
2570 2591

	
2571 2592
    virtual void clear() {
2572 2593
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2573 2594
        _deg[it] = 0;
2574 2595
      }
2575 2596
    }
2576 2597
  private:
2577 2598

	
2578 2599
    const Digraph& _digraph;
2579 2600
    AutoNodeMap _deg;
2580 2601
  };
2581 2602

	
2582
  /// \brief Map of the node out-degrees.
2603
  /// \brief Map of the out-degrees of nodes in a digraph.
2583 2604
  ///
2584 2605
  /// This map returns the out-degree of a node. Once it is constructed,
2585
  /// the degrees are stored in a standard NodeMap, so each query is done
2606
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2586 2607
  /// in constant time. On the other hand, the values are updated automatically
2587 2608
  /// whenever the digraph changes.
2588 2609
  ///
2589
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
2590
  /// alternative ways to modify the digraph. The correct behavior of OutDegMap
2591
  /// is not guarantied if these additional features are used. For example
2592
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
2610
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2611
  /// may provide alternative ways to modify the digraph.
2612
  /// The correct behavior of OutDegMap is not guarantied if these additional
2613
  /// features are used. For example the functions
2614
  /// \ref ListDigraph::changeSource() "changeSource()",
2593 2615
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2594 2616
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2595 2617
  /// of \ref ListDigraph will \e not update the degree values correctly.
2596 2618
  ///
2597 2619
  /// \sa InDegMap
2598

	
2599
  template <typename _Digraph>
2620
  template <typename GR>
2600 2621
  class OutDegMap
2601
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
2622
    : protected ItemSetTraits<GR, typename GR::Arc>
2602 2623
      ::ItemNotifier::ObserverBase {
2603 2624

	
2604 2625
  public:
2605 2626

	
2606
    typedef _Digraph Digraph;
2627
    /// The digraph type
2628
    typedef GR Digraph;
2629
    /// The key type
2630
    typedef typename Digraph::Node Key;
2631
    /// The value type
2607 2632
    typedef int Value;
2608
    typedef typename Digraph::Node Key;
2609 2633

	
2610 2634
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2611 2635
    ::ItemNotifier::ObserverBase Parent;
2612 2636

	
2613 2637
  private:
2614 2638

	
2615 2639
    class AutoNodeMap
2616 2640
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2617 2641
    public:
2618 2642

	
2619 2643
      typedef typename ItemSetTraits<Digraph, Key>::
2620 2644
      template Map<int>::Type Parent;
... ...
@@ -2636,34 +2660,36 @@
2636 2660
        Key it;
2637 2661
        typename Parent::Notifier* nf = Parent::notifier();
2638 2662
        for (nf->first(it); it != INVALID; nf->next(it)) {
2639 2663
          Parent::set(it, 0);
2640 2664
        }
2641 2665
      }
2642 2666
    };
2643 2667

	
2644 2668
  public:
2645 2669

	
2646 2670
    /// \brief Constructor.
2647 2671
    ///
2648
    /// Constructor for creating out-degree map.
2649
    explicit OutDegMap(const Digraph& digraph)
2650
      : _digraph(digraph), _deg(digraph) {
2672
    /// Constructor for creating an out-degree map.
2673
    explicit OutDegMap(const Digraph& graph)
2674
      : _digraph(graph), _deg(graph) {
2651 2675
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2652 2676

	
2653 2677
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2654 2678
        _deg[it] = countOutArcs(_digraph, it);
2655 2679
      }
2656 2680
    }
2657 2681

	
2682
    /// \brief Gives back the out-degree of a Node.
2683
    ///
2658 2684
    /// Gives back the out-degree of a Node.
2659 2685
    int operator[](const Key& key) const {
2660 2686
      return _deg[key];
2661 2687
    }
2662 2688

	
2663 2689
  protected:
2664 2690

	
2665 2691
    typedef typename Digraph::Arc Arc;
2666 2692

	
2667 2693
    virtual void add(const Arc& arc) {
2668 2694
      ++_deg[_digraph.source(arc)];
2669 2695
    }
... ...
@@ -2692,16 +2718,66 @@
2692 2718

	
2693 2719
    virtual void clear() {
2694 2720
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2695 2721
        _deg[it] = 0;
2696 2722
      }
2697 2723
    }
2698 2724
  private:
2699 2725

	
2700 2726
    const Digraph& _digraph;
2701 2727
    AutoNodeMap _deg;
2702 2728
  };
2703 2729

	
2730
  /// \brief Potential difference map
2731
  ///
2732
  /// PotentialMap returns the difference between the potentials of the
2733
  /// source and target nodes of each arc in a digraph, i.e. it returns
2734
  /// \code
2735
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2736
  /// \endcode
2737
  /// \tparam GR The digraph type.
2738
  /// \tparam POT A node map storing the potentials.
2739
  template <typename GR, typename POT>
2740
  class PotentialDifferenceMap {
2741
  public:
2742
    /// Key type
2743
    typedef typename GR::Arc Key;
2744
    /// Value type
2745
    typedef typename POT::Value Value;
2746

	
2747
    /// \brief Constructor
2748
    ///
2749
    /// Contructor of the map.
2750
    explicit PotentialDifferenceMap(const GR& gr,
2751
                                    const POT& potential)
2752
      : _digraph(gr), _potential(potential) {}
2753

	
2754
    /// \brief Returns the potential difference for the given arc.
2755
    ///
2756
    /// Returns the potential difference for the given arc, i.e.
2757
    /// \code
2758
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2759
    /// \endcode
2760
    Value operator[](const Key& arc) const {
2761
      return _potential[_digraph.target(arc)] -
2762
        _potential[_digraph.source(arc)];
2763
    }
2764

	
2765
  private:
2766
    const GR& _digraph;
2767
    const POT& _potential;
2768
  };
2769

	
2770
  /// \brief Returns a PotentialDifferenceMap.
2771
  ///
2772
  /// This function just returns a PotentialDifferenceMap.
2773
  /// \relates PotentialDifferenceMap
2774
  template <typename GR, typename POT>
2775
  PotentialDifferenceMap<GR, POT>
2776
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2777
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2778
  }
2779

	
2704 2780
  /// @}
2705 2781
}
2706 2782

	
2707 2783
#endif // LEMON_MAPS_H
Ignore white space 24 line context
... ...
@@ -46,30 +46,30 @@
46 46
  /// The dual solution of the problem is a map of the nodes to
47 47
  /// MaxMatching::Status, having values \c EVEN/D, \c ODD/A and \c
48 48
  /// MATCHED/C showing the Gallai-Edmonds decomposition of the
49 49
  /// graph. The nodes in \c EVEN/D induce a graph with
50 50
  /// factor-critical components, the nodes in \c ODD/A form the
51 51
  /// barrier, and the nodes in \c MATCHED/C induce a graph having a
52 52
  /// perfect matching. The number of the factor-critical components
53 53
  /// minus the number of barrier nodes is a lower bound on the
54 54
  /// unmatched nodes, and the matching is optimal if and only if this bound is
55 55
  /// tight. This decomposition can be attained by calling \c
56 56
  /// decomposition() after running the algorithm.
57 57
  ///
58
  /// \param _Graph The graph type the algorithm runs on.
59
  template <typename _Graph>
58
  /// \param GR The graph type the algorithm runs on.
59
  template <typename GR>
60 60
  class MaxMatching {
61 61
  public:
62 62

	
63
    typedef _Graph Graph;
63
    typedef GR Graph;
64 64
    typedef typename Graph::template NodeMap<typename Graph::Arc>
65 65
    MatchingMap;
66 66

	
67 67
    ///\brief Indicates the Gallai-Edmonds decomposition of the graph.
68 68
    ///
69 69
    ///Indicates the Gallai-Edmonds decomposition of the graph. The
70 70
    ///nodes with Status \c EVEN/D induce a graph with factor-critical
71 71
    ///components, the nodes in \c ODD/A form the canonical barrier,
72 72
    ///and the nodes in \c MATCHED/C induce a graph having a perfect
73 73
    ///matching.
74 74
    enum Status {
75 75
      EVEN = 1, D = 1, MATCHED = 0, C = 0, ODD = -1, A = -1, UNMATCHED = -2
... ...
@@ -454,25 +454,25 @@
454 454
            }
455 455
          }
456 456
        }
457 457
      }
458 458
    }
459 459

	
460 460

	
461 461
    /// \brief Initialize the matching from a map containing.
462 462
    ///
463 463
    /// Initialize the matching from a \c bool valued \c Edge map. This
464 464
    /// map must have the property that there are no two incident edges
465 465
    /// with true value, ie. it contains a matching.
466
    /// \return %True if the map contains a matching.
466
    /// \return \c true if the map contains a matching.
467 467
    template <typename MatchingMap>
468 468
    bool matchingInit(const MatchingMap& matching) {
469 469
      createStructures();
470 470

	
471 471
      for (NodeIt n(_graph); n != INVALID; ++n) {
472 472
        _matching->set(n, INVALID);
473 473
        _status->set(n, UNMATCHED);
474 474
      }
475 475
      for(EdgeIt e(_graph); e!=INVALID; ++e) {
476 476
        if (matching[e]) {
477 477

	
478 478
          Node u = _graph.u(e);
... ...
@@ -604,25 +604,25 @@
604 604

	
605 605
    /// @}
606 606

	
607 607
  };
608 608

	
609 609
  /// \ingroup matching
610 610
  ///
611 611
  /// \brief Weighted matching in general graphs
612 612
  ///
613 613
  /// This class provides an efficient implementation of Edmond's
614 614
  /// maximum weighted matching algorithm. The implementation is based
615 615
  /// on extensive use of priority queues and provides
616
  /// \f$O(nm\log(n))\f$ time complexity.
616
  /// \f$O(nm\log n)\f$ time complexity.
617 617
  ///
618 618
  /// The maximum weighted matching problem is to find undirected
619 619
  /// edges in the graph with maximum overall weight and no two of
620 620
  /// them shares their ends. The problem can be formulated with the
621 621
  /// following linear program.
622 622
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
623 623
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
624 624
      \quad \forall B\in\mathcal{O}\f] */
625 625
  /// \f[x_e \ge 0\quad \forall e\in E\f]
626 626
  /// \f[\max \sum_{e\in E}x_ew_e\f]
627 627
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
628 628
  /// \f$X\f$, \f$\gamma(X)\f$ is the set of edges with both ends in
... ...
@@ -638,31 +638,34 @@
638 638
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
639 639
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
640 640
      \frac{\vert B \vert - 1}{2}z_B\f] */
641 641
  ///
642 642
  /// The algorithm can be executed with \c run() or the \c init() and
643 643
  /// then the \c start() member functions. After it the matching can
644 644
  /// be asked with \c matching() or mate() functions. The dual
645 645
  /// solution can be get with \c nodeValue(), \c blossomNum() and \c
646 646
  /// blossomValue() members and \ref MaxWeightedMatching::BlossomIt
647 647
  /// "BlossomIt" nested class, which is able to iterate on the nodes
648 648
  /// of a blossom. If the value type is integral then the dual
649 649
  /// solution is multiplied by \ref MaxWeightedMatching::dualScale "4".
650
  template <typename _Graph,
651
            typename _WeightMap = typename _Graph::template EdgeMap<int> >
650
  template <typename GR,
651
            typename WM = typename GR::template EdgeMap<int> >
652 652
  class MaxWeightedMatching {
653 653
  public:
654 654

	
655
    typedef _Graph Graph;
656
    typedef _WeightMap WeightMap;
655
    ///\e
656
    typedef GR Graph;
657
    ///\e
658
    typedef WM WeightMap;
659
    ///\e
657 660
    typedef typename WeightMap::Value Value;
658 661

	
659 662
    /// \brief Scaling factor for dual solution
660 663
    ///
661 664
    /// Scaling factor for dual solution, it is equal to 4 or 1
662 665
    /// according to the value type.
663 666
    static const int dualScale =
664 667
      std::numeric_limits<Value>::is_integer ? 4 : 1;
665 668

	
666 669
    typedef typename Graph::template NodeMap<typename Graph::Arc>
667 670
    MatchingMap;
668 671

	
... ...
@@ -1948,25 +1951,25 @@
1948 1951

	
1949 1952
    /// @}
1950 1953

	
1951 1954
  };
1952 1955

	
1953 1956
  /// \ingroup matching
1954 1957
  ///
1955 1958
  /// \brief Weighted perfect matching in general graphs
1956 1959
  ///
1957 1960
  /// This class provides an efficient implementation of Edmond's
1958 1961
  /// maximum weighted perfect matching algorithm. The implementation
1959 1962
  /// is based on extensive use of priority queues and provides
1960
  /// \f$O(nm\log(n))\f$ time complexity.
1963
  /// \f$O(nm\log n)\f$ time complexity.
1961 1964
  ///
1962 1965
  /// The maximum weighted matching problem is to find undirected
1963 1966
  /// edges in the graph with maximum overall weight and no two of
1964 1967
  /// them shares their ends and covers all nodes. The problem can be
1965 1968
  /// formulated with the following linear program.
1966 1969
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
1967 1970
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
1968 1971
      \quad \forall B\in\mathcal{O}\f] */
1969 1972
  /// \f[x_e \ge 0\quad \forall e\in E\f]
1970 1973
  /// \f[\max \sum_{e\in E}x_ew_e\f]
1971 1974
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
1972 1975
  /// \f$X\f$, \f$\gamma(X)\f$ is the set of edges with both ends in
... ...
@@ -1981,31 +1984,31 @@
1981 1984
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
1982 1985
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
1983 1986
      \frac{\vert B \vert - 1}{2}z_B\f] */
1984 1987
  ///
1985 1988
  /// The algorithm can be executed with \c run() or the \c init() and
1986 1989
  /// then the \c start() member functions. After it the matching can
1987 1990
  /// be asked with \c matching() or mate() functions. The dual
1988 1991
  /// solution can be get with \c nodeValue(), \c blossomNum() and \c
1989 1992
  /// blossomValue() members and \ref MaxWeightedMatching::BlossomIt
1990 1993
  /// "BlossomIt" nested class which is able to iterate on the nodes
1991 1994
  /// of a blossom. If the value type is integral then the dual
1992 1995
  /// solution is multiplied by \ref MaxWeightedMatching::dualScale "4".
1993
  template <typename _Graph,
1994
            typename _WeightMap = typename _Graph::template EdgeMap<int> >
1996
  template <typename GR,
1997
            typename WM = typename GR::template EdgeMap<int> >
1995 1998
  class MaxWeightedPerfectMatching {
1996 1999
  public:
1997 2000

	
1998
    typedef _Graph Graph;
1999
    typedef _WeightMap WeightMap;
2001
    typedef GR Graph;
2002
    typedef WM WeightMap;
2000 2003
    typedef typename WeightMap::Value Value;
2001 2004

	
2002 2005
    /// \brief Scaling factor for dual solution
2003 2006
    ///
2004 2007
    /// Scaling factor for dual solution, it is equal to 4 or 1
2005 2008
    /// according to the value type.
2006 2009
    static const int dualScale =
2007 2010
      std::numeric_limits<Value>::is_integer ? 4 : 1;
2008 2011

	
2009 2012
    typedef typename Graph::template NodeMap<typename Graph::Arc>
2010 2013
    MatchingMap;
2011 2014

	
Ignore white space 24 line context
... ...
@@ -26,120 +26,118 @@
26 26
#include <vector>
27 27

	
28 28
#include <lemon/list_graph.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/assert.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34

	
35 35
  /// \brief Default traits class for MinCostArborescence class.
36 36
  ///
37 37
  /// Default traits class for MinCostArborescence class.
38
  /// \param _Digraph Digraph type.
39
  /// \param _CostMap Type of cost map.
40
  template <class _Digraph, class _CostMap>
38
  /// \param GR Digraph type.
39
  /// \param CM Type of cost map.
40
  template <class GR, class CM>
41 41
  struct MinCostArborescenceDefaultTraits{
42 42

	
43 43
    /// \brief The digraph type the algorithm runs on.
44
    typedef _Digraph Digraph;
44
    typedef GR Digraph;
45 45

	
46 46
    /// \brief The type of the map that stores the arc costs.
47 47
    ///
48 48
    /// The type of the map that stores the arc costs.
49 49
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
50
    typedef _CostMap CostMap;
50
    typedef CM CostMap;
51 51

	
52 52
    /// \brief The value type of the costs.
53 53
    ///
54 54
    /// The value type of the costs.
55 55
    typedef typename CostMap::Value Value;
56 56

	
57 57
    /// \brief The type of the map that stores which arcs are in the
58 58
    /// arborescence.
59 59
    ///
60 60
    /// The type of the map that stores which arcs are in the
61 61
    /// arborescence.  It must meet the \ref concepts::WriteMap
62 62
    /// "WriteMap" concept.  Initially it will be set to false on each
63 63
    /// arc. After it will set all arborescence arcs once.
64 64
    typedef typename Digraph::template ArcMap<bool> ArborescenceMap;
65 65

	
66
    /// \brief Instantiates a ArborescenceMap.
66
    /// \brief Instantiates a \c ArborescenceMap.
67 67
    ///
68
    /// This function instantiates a \ref ArborescenceMap.
68
    /// This function instantiates a \c ArborescenceMap.
69 69
    /// \param digraph is the graph, to which we would like to
70
    /// calculate the ArborescenceMap.
70
    /// calculate the \c ArborescenceMap.
71 71
    static ArborescenceMap *createArborescenceMap(const Digraph &digraph){
72 72
      return new ArborescenceMap(digraph);
73 73
    }
74 74

	
75
    /// \brief The type of the PredMap
75
    /// \brief The type of the \c PredMap
76 76
    ///
77
    /// The type of the PredMap. It is a node map with an arc value type.
77
    /// The type of the \c PredMap. It is a node map with an arc value type.
78 78
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
79 79

	
80
    /// \brief Instantiates a PredMap.
80
    /// \brief Instantiates a \c PredMap.
81 81
    ///
82
    /// This function instantiates a \ref PredMap.
83
    /// \param _digraph is the digraph, to which we would like to define the
84
    /// PredMap.
82
    /// This function instantiates a \c PredMap.
83
    /// \param digraph The digraph to which we would like to define the
84
    /// \c PredMap.
85 85
    static PredMap *createPredMap(const Digraph &digraph){
86 86
      return new PredMap(digraph);
87 87
    }
88 88

	
89 89
  };
90 90

	
91 91
  /// \ingroup spantree
92 92
  ///
93 93
  /// \brief %MinCostArborescence algorithm class.
94 94
  ///
95 95
  /// This class provides an efficient implementation of
96 96
  /// %MinCostArborescence algorithm. The arborescence is a tree
97 97
  /// which is directed from a given source node of the digraph. One or
98 98
  /// more sources should be given for the algorithm and it will calculate
99 99
  /// the minimum cost subgraph which are union of arborescences with the
100 100
  /// given sources and spans all the nodes which are reachable from the
101
  /// sources. The time complexity of the algorithm is \f$ O(n^2+e) \f$.
101
  /// sources. The time complexity of the algorithm is O(n<sup>2</sup>+e).
102 102
  ///
103 103
  /// The algorithm provides also an optimal dual solution, therefore
104 104
  /// the optimality of the solution can be checked.
105 105
  ///
106
  /// \param _Digraph The digraph type the algorithm runs on. The default value
106
  /// \param GR The digraph type the algorithm runs on. The default value
107 107
  /// is \ref ListDigraph.
108
  /// \param _CostMap This read-only ArcMap determines the costs of the
108
  /// \param CM This read-only ArcMap determines the costs of the
109 109
  /// arcs. It is read once for each arc, so the map may involve in
110 110
  /// relatively time consuming process to compute the arc cost if
111 111
  /// it is necessary. The default map type is \ref
112 112
  /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
113
  /// \param _Traits Traits class to set various data types used
113
  /// \param TR Traits class to set various data types used
114 114
  /// by the algorithm. The default traits class is
115 115
  /// \ref MinCostArborescenceDefaultTraits
116
  /// "MinCostArborescenceDefaultTraits<_Digraph, _CostMap>".  See \ref
116
  /// "MinCostArborescenceDefaultTraits<GR, CM>".  See \ref
117 117
  /// MinCostArborescenceDefaultTraits for the documentation of a
118 118
  /// MinCostArborescence traits class.
119
  ///
120
  /// \author Balazs Dezso
121 119
#ifndef DOXYGEN
122
  template <typename _Digraph = ListDigraph,
123
            typename _CostMap = typename _Digraph::template ArcMap<int>,
124
            typename _Traits =
125
            MinCostArborescenceDefaultTraits<_Digraph, _CostMap> >
120
  template <typename GR = ListDigraph,
121
            typename CM = typename GR::template ArcMap<int>,
122
            typename TR =
123
              MinCostArborescenceDefaultTraits<GR, CM> >
126 124
#else
127
  template <typename _Digraph, typename _CostMap, typedef _Traits>
125
  template <typename GR, typename CM, typedef TR>
128 126
#endif
129 127
  class MinCostArborescence {
130 128
  public:
131 129

	
132 130
    /// The traits.
133
    typedef _Traits Traits;
131
    typedef TR Traits;
134 132
    /// The type of the underlying digraph.
135 133
    typedef typename Traits::Digraph Digraph;
136 134
    /// The type of the map that stores the arc costs.
137 135
    typedef typename Traits::CostMap CostMap;
138 136
    ///The type of the costs of the arcs.
139 137
    typedef typename Traits::Value Value;
140 138
    ///The type of the predecessor map.
141 139
    typedef typename Traits::PredMap PredMap;
142 140
    ///The type of the map that stores which arcs are in the arborescence.
143 141
    typedef typename Traits::ArborescenceMap ArborescenceMap;
144 142

	
145 143
    typedef MinCostArborescence Create;
... ...
@@ -431,54 +429,54 @@
431 429
    ///
432 430
    /// \ref named-templ-param "Named parameter" for setting
433 431
    /// PredMap type
434 432
    template <class T>
435 433
    struct DefPredMap
436 434
      : public MinCostArborescence<Digraph, CostMap, DefPredMapTraits<T> > {
437 435
    };
438 436

	
439 437
    /// @}
440 438

	
441 439
    /// \brief Constructor.
442 440
    ///
443
    /// \param _digraph The digraph the algorithm will run on.
444
    /// \param _cost The cost map used by the algorithm.
441
    /// \param digraph The digraph the algorithm will run on.
442
    /// \param cost The cost map used by the algorithm.
445 443
    MinCostArborescence(const Digraph& digraph, const CostMap& cost)
446 444
      : _digraph(&digraph), _cost(&cost), _pred(0), local_pred(false),
447 445
        _arborescence(0), local_arborescence(false),
448 446
        _arc_order(0), _node_order(0), _cost_arcs(0),
449 447
        _heap_cross_ref(0), _heap(0) {}
450 448

	
451 449
    /// \brief Destructor.
452 450
    ~MinCostArborescence() {
453 451
      destroyStructures();
454 452
    }
455 453

	
456 454
    /// \brief Sets the arborescence map.
457 455
    ///
458 456
    /// Sets the arborescence map.
459
    /// \return \c (*this)
457
    /// \return <tt>(*this)</tt>
460 458
    MinCostArborescence& arborescenceMap(ArborescenceMap& m) {
461 459
      if (local_arborescence) {
462 460
        delete _arborescence;
463 461
      }
464 462
      local_arborescence = false;
465 463
      _arborescence = &m;
466 464
      return *this;
467 465
    }
468 466

	
469 467
    /// \brief Sets the arborescence map.
470 468
    ///
471 469
    /// Sets the arborescence map.
472
    /// \return \c (*this)
470
    /// \return <tt>(*this)</tt>
473 471
    MinCostArborescence& predMap(PredMap& m) {
474 472
      if (local_pred) {
475 473
        delete _pred;
476 474
      }
477 475
      local_pred = false;
478 476
      _pred = &m;
479 477
      return *this;
480 478
    }
481 479

	
482 480
    /// \name Query Functions
483 481
    /// The result of the %MinCostArborescence algorithm can be obtained
484 482
    /// using these functions.\n

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

0 comments (0 inline)