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

	
19
namespace lemon {
20
/*!
21

	
22
\page migration Migration from the 0.x Series
23

	
24
This guide gives an in depth description on what has changed compared
25
to the 0.x release series.
26

	
27
Many of these changes adjusted automatically by the
28
<tt>script/lemon-0.x-to-1.x.sh</tt> tool. Those requiring manual
29
update are typeset <b>boldface</b>.
30

	
31
\section migration-graph Graph Related Name Changes
32

	
33
- \ref concepts::Digraph "Directed graphs" are called \c Digraph and
34
  they have <tt>Arc</tt>s (instead of <tt>Edge</tt>s), while
35
  \ref concepts::Graph "undirected graphs" are called \c Graph
36
  (instead of \c UGraph) and they have <tt>Edge</tt>s (instead of
37
  <tt>UEdge</tt>s). These changes reflected thoroughly everywhere in
38
  the library. Namely,
39
  - \c Graph -> \c Digraph
40
    - \c %ListGraph -> \c ListDigraph, \c %SmartGraph -> \c SmartDigraph etc.
41
  - \c UGraph -> \c Graph
42
    - \c ListUGraph -> \c ListGraph, \c SmartUGraph -> \c SmartGraph etc.
43
  - \c Edge -> \c Arc, \c UEdge -> \c Edge
44
  - \c EdgeMap -> \c ArcMap, \c UEdgeMap -> \c EdgeMap
45
  - \c EdgeIt -> \c ArcIt, \c UEdgeIt -> \c EdgeIt
46
  - Class names and function names containing the words \c graph,
47
    \c ugraph, \e edge or \e arc should also be updated.
48
- <b>The two endpoints of an (\e undirected) \c Edge can be obtained by the
49
  <tt>u()</tt> and <tt>v()</tt> member function of the graph
50
  (instead of <tt>source()</tt> and <tt>target()</tt>). This change
51
  must be done by hand.</b>
52
  \n Of course, you can still use <tt>source()</tt> and <tt>target()</tt>
53
  for <tt>Arc</tt>s (directed edges).
54

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

	
60
\section migration-lgf LGF tools
61
 - The \ref lgf-format "LGF file format" has changed,
62
   <tt>\@nodeset</tt> has changed to <tt>\@nodes</tt>,
63
   <tt>\@edgeset</tt> and <tt>\@uedgeset</tt> to <tt>\@arcs</tt> or
64
   <tt>\@edges</tt>, which become completely equivalents. The
65
   <tt>\@nodes</tt>, <tt>\@edges</tt> and <tt>\@uedges</tt> sections are
66
   removed from the format, the content of them should be
67
   the part of <tt>\@attributes</tt> section. The data fields in
68
   the sections must follow a strict format, they must be either character
69
   sequences without whitespaces or quoted strings.
70
 - The <tt>LemonReader</tt> and <tt>LemonWriter</tt> core interfaces
71
   are no longer available.
72
 - The implementation of the general section readers and writers has changed
73
   they are simple functors now. Beside the old
74
   stream based section handling, currently line oriented section
75
   reading and writing are also supported. In the
76
   section readers the lines must be counted manually. The sections
77
   should be read and written with the SectionWriter and SectionReader
78
   classes.
79
 - Instead of the item readers and writers, item converters should be
80
   used. The converters are functors, which map the type to
81
   std::string or std::string to the type. The converters for standard
82
   containers hasn't yet been implemented in the new LEMON. The converters
83
   can return strings in any format, because if it is necessary, the LGF
84
   writer and reader will quote and unquote the given value.
85
 - The DigraphReader and DigraphWriter can used similarly to the
86
   0.x series, however the <tt>read</tt> or <tt>write</tt> prefix of
87
   the member functions are removed.
88
 - The new LEMON supports the function like interface, the \c
89
   digraphReader and \c digraphWriter functions are more convenient than
90
   using the classes directly.
91

	
92
\section migration-search BFS, DFS and Dijkstra
93
- <b>Using the function interface of BFS, DFS and %Dijkstra both source and
94
  target nodes can be given as parameters of the <tt>run()</tt> function
95
  (instead of \c bfs(), \c dfs() or \c dijkstra() itself).</b>
96
- \ref named-templ-param "Named class template parameters" of \c Bfs,
97
  \c Dfs, \c Dijkstra, \c BfsVisit, \c DfsVisit are renamed to start
98
  with "Set" instead of "Def". Namely,
99
  - \c DefPredMap -> \c SetPredMap
100
  - \c DefDistMap -> \c SetDistMap
101
  - \c DefReachedMap -> \c SetReachedMap
102
  - \c DefProcessedMap -> \c SetProcessedMap
103
  - \c DefHeap -> \c SetHeap
104
  - \c DefStandardHeap -> \c SetStandardHeap
105
  - \c DefOperationTraits -> \c SetOperationTraits
106
  - \c DefProcessedMapToBeDefaultMap -> \c SetStandardProcessedMap
107

	
108
\section migration-error Exceptions and Debug tools
109

	
110
<b>The class hierarchy of exceptions has largely been simplified. Now,
111
only the i/o related tools may throw exceptions. All other exceptions
112
have been replaced with either the \c LEMON_ASSERT or the \c LEMON_DEBUG
113
macros.</b>
114

	
115
<b>On the other hand, the parameter order of constructors of the
116
exceptions has been changed. See \ref IoError and \ref FormatError for
117
more details.</b>
118

	
119
\section migration-other Others
120
- <b>The contents of <tt>graph_utils.h</tt> are moved to <tt>core.h</tt>
121
  and <tt>maps.h</tt>. <tt>core.h</tt> is included by all graph types,
122
  therefore it usually do not have to be included directly.</b>
123
- <b><tt>path_utils.h</tt> is merged to \c path.h.</b>
124
- <b>The semantic of the assignment operations and copy constructors of maps
125
  are still under discussion. So, you must copy them by hand (i.e. copy
126
  each entry one-by-one)</b>
127
- <b>The parameters of the graph copying tools (i.e. \c GraphCopy,
128
  \c DigraphCopy) have to be given in the from-to order.</b>
129
- \c copyDigraph() and \c copyGraph() are renamed to \c digraphCopy()
130
  and \c graphCopy(), respectively.
131
- <b>The interface of \ref DynArcLookUp has changed. It is now the same as
132
  of \ref ArcLookUp and \ref AllArcLookUp</b>
133
- Some map types should also been renamed. Namely,
134
  - \c IntegerMap -> \c RangeMap
135
  - \c StdMap -> \c SparseMap
136
  - \c FunctorMap -> \c FunctorToMap
137
  - \c MapFunctor -> \c MapToFunctor
138
  - \c ForkWriteMap -> \c ForkMap
139
  - \c StoreBoolMap -> \c LoggerBoolMap
140
- \c dim2::BoundingBox -> \c dim2::Box
141

	
142
*/
143
}
Ignore white space 6 line context
1 1
ACLOCAL_AMFLAGS = -I m4
2 2

	
3 3
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)
4 4
LDADD = $(top_builddir)/lemon/libemon.la
5 5

	
6 6
EXTRA_DIST = \
7 7
	LICENSE \
8 8
	m4/lx_check_cplex.m4 \
9 9
	m4/lx_check_glpk.m4 \
10 10
	m4/lx_check_soplex.m4 \
11 11
	CMakeLists.txt \
12 12
	cmake
13 13

	
14 14
pkgconfigdir = $(libdir)/pkgconfig
15 15
lemondir = $(pkgincludedir)
16 16
bitsdir = $(lemondir)/bits
17 17
conceptdir = $(lemondir)/concepts
18 18
pkgconfig_DATA =
19 19
lib_LTLIBRARIES =
20 20
lemon_HEADERS =
21 21
bits_HEADERS =
22 22
concept_HEADERS =
23 23
noinst_HEADERS =
24 24
noinst_PROGRAMS =
25 25
bin_PROGRAMS =
26 26
check_PROGRAMS =
27
dist_bin_SCRIPTS =
27 28
TESTS =
28 29
XFAIL_TESTS =
29 30

	
30 31
include lemon/Makefile.am
31 32
include test/Makefile.am
32 33
include doc/Makefile.am
33 34
include demo/Makefile.am
34
include benchmark/Makefile.am
35 35
include tools/Makefile.am
36 36

	
37 37
MRPROPERFILES = \
38 38
	aclocal.m4 \
39 39
	config.h.in \
40 40
	config.h.in~ \
41 41
	configure \
42 42
	Makefile.in \
43 43
	build-aux/config.guess \
44 44
	build-aux/config.sub \
45 45
	build-aux/depcomp \
46 46
	build-aux/install-sh \
47 47
	build-aux/ltmain.sh \
48 48
	build-aux/missing \
49 49
	doc/doxygen.log
50 50

	
51 51
mrproper:
52 52
	$(MAKE) $(AM_MAKEFLAGS) maintainer-clean
53 53
	-rm -f $(MRPROPERFILES)
54 54

	
55 55
dist-bz2: dist
56 56
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
57 57
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
58 58

	
59 59
distcheck-bz2: distcheck
60 60
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
61 61
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
62 62

	
63 63
.PHONY: mrproper dist-bz2 distcheck-bz2
Ignore white space 6 line context
1 1
==================================================================
2 2
LEMON - a Library of Efficient Models and Optimization in Networks
3 3
==================================================================
4 4

	
5 5
LEMON is an open source library written in C++. It provides
6 6
easy-to-use implementations of common data structures and algorithms
7 7
in the area of optimization and helps implementing new ones. The main
8 8
focus is on graphs and graph algorithms, thus it is especially
9 9
suitable for solving design and optimization problems of
10 10
telecommunication networks. To achieve wide usability its data
11 11
structures and algorithms provide generic interfaces.
12 12

	
13 13
Contents
14 14
========
15 15

	
16 16
LICENSE
17 17

	
18 18
   Copying, distribution and modification conditions and terms.
19 19

	
20 20
INSTALL
21 21

	
22 22
   General building and installation instructions.
23 23

	
24 24
lemon/
25 25

	
26 26
   Source code of LEMON library.
27 27

	
28 28
doc/
29 29

	
30 30
   Documentation of LEMON. The starting page is doc/html/index.html.
31 31

	
32 32
demo/
33 33

	
34 34
   Some example programs to make you easier to get familiar with LEMON.
35 35

	
36 36
test/
37 37

	
38 38
   Contains programs to check the integrity and correctness of LEMON.
39 39

	
40
benchmark/
41
  
42
   Contains programs for measuring the performance of algorithms.
43

	
44 40
tools/
45 41

	
46 42
   Various utilities related to LEMON.
Ignore white space 6 line context
... ...
@@ -36,112 +36,98 @@
36 36

	
37 37
dnl Detect Intel compiler.
38 38
AC_MSG_CHECKING([whether we are using the Intel C++ compiler])
39 39
AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER
40 40
choke me
41 41
#endif], [ICC=[yes]], [ICC=[no]])
42 42
if test x"$ICC" = x"yes"; then
43 43
  AC_MSG_RESULT([yes])
44 44
else
45 45
  AC_MSG_RESULT([no])
46 46
fi
47 47

	
48 48
dnl Set custom compiler flags when using g++.
49 49
if test x"$lx_cmdline_cxxflags_set" != x"set" -a "$GXX" = yes -a "$ICC" = no; then
50 50
  CXXFLAGS="$CXXFLAGS -Wall -W -Wall -W -Wunused -Wformat=2 -Wctor-dtor-privacy -Wnon-virtual-dtor -Wno-char-subscripts -Wwrite-strings -Wno-char-subscripts -Wreturn-type -Wcast-qual -Wcast-align -Wsign-promo -Woverloaded-virtual -Woverloaded-virtual -ansi -fno-strict-aliasing -Wold-style-cast -Wno-unknown-pragmas"
51 51
fi
52 52

	
53 53
dnl Checks for libraries.
54 54
#LX_CHECK_GLPK
55 55
#LX_CHECK_CPLEX
56 56
#LX_CHECK_SOPLEX
57 57

	
58 58
dnl Disable/enable building the demo programs.
59 59
AC_ARG_ENABLE([demo],
60 60
AS_HELP_STRING([--enable-demo], [build the demo programs])
61 61
AS_HELP_STRING([--disable-demo], [do not build the demo programs @<:@default@:>@]),
62 62
              [], [enable_demo=no])
63 63
AC_MSG_CHECKING([whether to build the demo programs])
64 64
if test x"$enable_demo" != x"no"; then
65 65
  AC_MSG_RESULT([yes])
66 66
else
67 67
  AC_MSG_RESULT([no])
68 68
fi
69 69
AM_CONDITIONAL([WANT_DEMO], [test x"$enable_demo" != x"no"])
70 70

	
71 71
dnl Disable/enable building the binary tools.
72 72
AC_ARG_ENABLE([tools],
73 73
AS_HELP_STRING([--enable-tools], [build additional tools @<:@default@:>@])
74 74
AS_HELP_STRING([--disable-tools], [do not build additional tools]),
75 75
              [], [enable_tools=yes])
76 76
AC_MSG_CHECKING([whether to build the additional tools])
77 77
if test x"$enable_tools" != x"no"; then
78 78
  AC_MSG_RESULT([yes])
79 79
else
80 80
  AC_MSG_RESULT([no])
81 81
fi
82 82
AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])
83 83

	
84
dnl Disable/enable building the benchmarks.
85
AC_ARG_ENABLE([benchmark],
86
AS_HELP_STRING([--enable-benchmark], [build the benchmarks])
87
AS_HELP_STRING([--disable-benchmark], [do not build the benchmarks @<:@default@:>@]),
88
              [], [enable_benchmark=no])
89
AC_MSG_CHECKING([whether to build the benchmarks])
90
if test x"$enable_benchmark" != x"no"; then
91
  AC_MSG_RESULT([yes])
92
else
93
  AC_MSG_RESULT([no])
94
fi
95
AM_CONDITIONAL([WANT_BENCHMARK], [test x"$enable_benchmark" != x"no"])
96

	
97 84
dnl Checks for header files.
98 85
AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)
99 86

	
100 87
dnl Checks for typedefs, structures, and compiler characteristics.
101 88
AC_C_CONST
102 89
AC_C_INLINE
103 90
AC_TYPE_SIZE_T
104 91
AC_HEADER_TIME
105 92
AC_STRUCT_TM
106 93

	
107 94
dnl Checks for library functions.
108 95
AC_HEADER_STDC
109 96
AC_CHECK_FUNCS(gettimeofday times ctime_r)
110 97

	
111 98
dnl Add dependencies on files generated by configure.
112 99
AC_SUBST([CONFIG_STATUS_DEPENDENCIES],
113 100
  ['$(top_srcdir)/doc/Doxyfile.in $(top_srcdir)/lemon/lemon.pc.in'])
114 101

	
115 102
AC_CONFIG_FILES([
116 103
Makefile
117 104
doc/Doxyfile
118 105
lemon/lemon.pc
119 106
])
120 107

	
121 108
AC_OUTPUT
122 109

	
123 110
echo
124 111
echo '****************************** SUMMARY ******************************'
125 112
echo
126 113
echo Package version............... : $PACKAGE-$VERSION
127 114
echo
128 115
echo C++ compiler.................. : $CXX
129 116
echo C++ compiles flags............ : $CXXFLAGS
130 117
echo
131 118
#echo GLPK support.................. : $lx_glpk_found
132 119
#echo CPLEX support................. : $lx_cplex_found
133 120
#echo SOPLEX support................ : $lx_soplex_found
134 121
#echo
135
echo Build benchmarks.............. : $enable_benchmark
136 122
echo Build demo programs........... : $enable_demo
137 123
echo Build additional tools........ : $enable_tools
138 124
echo
139 125
echo The packace will be installed in
140 126
echo -n '  '
141 127
echo $prefix.
142 128
echo
143 129
echo '*********************************************************************'
144 130

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

	
19 19
///\ingroup demos
20 20
///\file
21 21
///\brief Argument parser demo
22 22
///
23 23
/// This example shows how the argument parser can be used.
24 24
///
25 25
/// \include arg_parser_demo.cc
26 26

	
27 27
#include <lemon/arg_parser.h>
28 28

	
29 29
using namespace lemon;
30
int main(int argc, const char **argv)
30
int main(int argc, char **argv)
31 31
{
32 32
  // Initialize the argument parser
33 33
  ArgParser ap(argc, argv);
34 34
  int i;
35 35
  std::string s;
36 36
  double d = 1.0;
37 37
  bool b, nh;
38 38
  bool g1, g2, g3;
39 39

	
40 40
  // Add a mandatory integer option with storage reference
41 41
  ap.refOption("n", "An integer input.", i, true);
42 42
  // Add a double option with storage reference (the default value is 1.0)
43 43
  ap.refOption("val", "A double input.", d);
44 44
  // Add a double option without storage reference (the default value is 3.14)
45 45
  ap.doubleOption("val2", "A double input.", 3.14);
46 46
  // Set synonym for -val option
47 47
  ap.synonym("vals", "val");
48 48
  // Add a string option
49 49
  ap.refOption("name", "A string input.", s);
50 50
  // Add bool options
51 51
  ap.refOption("f", "A switch.", b)
52 52
    .refOption("nohelp", "", nh)
53 53
    .refOption("gra", "Choice A", g1)
54 54
    .refOption("grb", "Choice B", g2)
55 55
    .refOption("grc", "Choice C", g3);
56 56
  // Bundle -gr* options into a group
57 57
  ap.optionGroup("gr", "gra")
58 58
    .optionGroup("gr", "grb")
59 59
    .optionGroup("gr", "grc");
60 60
  // Set the group mandatory
61 61
  ap.mandatoryGroup("gr");
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

	
68 68
  // Perform the parsing process
69 69
  // (in case of any error it terminates the program)
70 70
  ap.parse();
71 71

	
72 72
  // Check each option if it has been given and print its value
73 73
  std::cout << "Parameters of '" << ap.commandName() << "':\n";
74 74

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

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

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

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

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

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

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

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

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

	
71 71
  Arc a;
72 72

	
73 73
  a=g.addArc(n1,n2); acolors[a]=0; widths[a]=1;
74 74
  a=g.addArc(n2,n3); acolors[a]=0; widths[a]=1;
75 75
  a=g.addArc(n3,n5); acolors[a]=0; widths[a]=3;
76 76
  a=g.addArc(n5,n4); acolors[a]=0; widths[a]=1;
77 77
  a=g.addArc(n4,n1); acolors[a]=0; widths[a]=1;
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	doc/Doxyfile.in \
3 3
	doc/coding_style.dox \
4 4
	doc/dirs.dox \
5 5
	doc/groups.dox \
6 6
	doc/lgf.dox \
7 7
	doc/license.dox \
8 8
	doc/mainpage.dox \
9
	doc/migration.dox \
9 10
	doc/named-param.dox \
10 11
	doc/namespaces.dox \
11 12
	doc/html \
12 13
	doc/CMakeLists.txt
13 14

	
14 15
DOC_EPS_IMAGES18 = \
15 16
	nodeshape_0.eps \
16 17
	nodeshape_1.eps \
17 18
	nodeshape_2.eps \
18 19
	nodeshape_3.eps \
19 20
	nodeshape_4.eps
20 21

	
21 22
DOC_EPS_IMAGES = \
22 23
	$(DOC_EPS_IMAGES18)
23 24

	
24 25
DOC_PNG_IMAGES = \
25 26
	$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
26 27

	
27 28
EXTRA_DIST += $(DOC_EPS_IMAGES:%=doc/images/%)
28 29

	
29 30
doc/html:
30 31
	$(MAKE) $(AM_MAKEFLAGS) html
31 32

	
32 33
GS_COMMAND=gs -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4
33 34

	
34 35
$(DOC_EPS_IMAGES18:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
35 36
	-mkdir doc/gen-images
36 37
	if test ${gs_found} = yes; then \
37 38
	  $(GS_COMMAND) -sDEVICE=pngalpha -r18 -sOutputFile=$@ $<; \
38 39
	else \
39 40
	  echo; \
40 41
	  echo "Ghostscript not found."; \
41 42
	  echo; \
42 43
	  exit 1; \
43 44
	fi
44 45

	
45 46
html-local: $(DOC_PNG_IMAGES)
46 47
	if test ${doxygen_found} = yes; then \
47 48
	  cd doc; \
48 49
	  doxygen Doxyfile; \
49 50
	  cd ..; \
50 51
	else \
51 52
	  echo; \
52 53
	  echo "Doxygen not found."; \
53 54
	  echo; \
54 55
	  exit 1; \
55 56
	fi
56 57

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

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

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

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

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

	
43 43
You are free to use the graph structure that fit your requirements
44 44
the best, most graph algorithms and auxiliary data structures can be used
45
with any graph structures.
45
with any graph structure.
46

	
47
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
46 48
*/
47 49

	
48 50
/**
49 51
@defgroup maps Maps
50 52
@ingroup datas
51 53
\brief Map structures implemented in LEMON.
52 54

	
53 55
This group describes the map structures implemented in LEMON.
54 56

	
55
LEMON provides several special purpose maps that e.g. combine
57
LEMON provides several special purpose maps and map adaptors that e.g. combine
56 58
new maps from existing ones.
59

	
60
<b>See also:</b> \ref map_concepts "Map Concepts".
57 61
*/
58 62

	
59 63
/**
60 64
@defgroup graph_maps Graph Maps
61 65
@ingroup maps
62 66
\brief Special graph-related maps.
63 67

	
64 68
This group describes maps that are specifically designed to assign
65 69
values to the nodes and arcs of graphs.
66 70
*/
67 71

	
68

	
69 72
/**
70 73
\defgroup map_adaptors Map Adaptors
71 74
\ingroup maps
72 75
\brief Tools to create new maps from existing ones
73 76

	
74 77
This group describes map adaptors that are used to create "implicit"
75 78
maps from other maps.
76 79

	
77 80
Most of them are \ref lemon::concepts::ReadMap "read-only maps".
78 81
They can make arithmetic and logical operations between one or two maps
79 82
(negation, shifting, addition, multiplication, logical 'and', 'or',
80 83
'not' etc.) or e.g. convert a map to another one of different Value type.
81 84

	
82 85
The typical usage of this classes is passing implicit maps to
83 86
algorithms.  If a function type algorithm is called then the function
84 87
type map adaptors can be used comfortable. For example let's see the
85
usage of map adaptors with the \c digraphToEps() function.
88
usage of map adaptors with the \c graphToEps() function.
86 89
\code
87 90
  Color nodeColor(int deg) {
88 91
    if (deg >= 2) {
89 92
      return Color(0.5, 0.0, 0.5);
90 93
    } else if (deg == 1) {
91 94
      return Color(1.0, 0.5, 1.0);
92 95
    } else {
93 96
      return Color(0.0, 0.0, 0.0);
94 97
    }
95 98
  }
96 99

	
97 100
  Digraph::NodeMap<int> degree_map(graph);
98 101

	
99
  digraphToEps(graph, "graph.eps")
102
  graphToEps(graph, "graph.eps")
100 103
    .coords(coords).scaleToA4().undirected()
101 104
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
102 105
    .run();
103 106
\endcode
104 107
The \c functorToMap() function makes an \c int to \c Color map from the
105
\e nodeColor() function. The \c composeMap() compose the \e degree_map
108
\c nodeColor() function. The \c composeMap() compose the \c degree_map
106 109
and the previously created map. The composed map is a proper function to
107 110
get the color of each node.
108 111

	
109 112
The usage with class type algorithms is little bit harder. In this
110 113
case the function type map adaptors can not be used, because the
111 114
function map adaptors give back temporary objects.
112 115
\code
113 116
  Digraph graph;
114 117

	
115 118
  typedef Digraph::ArcMap<double> DoubleArcMap;
116 119
  DoubleArcMap length(graph);
117 120
  DoubleArcMap speed(graph);
118 121

	
119 122
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
120 123
  TimeMap time(length, speed);
121 124

	
122 125
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
123 126
  dijkstra.run(source, target);
124 127
\endcode
125 128
We have a length map and a maximum speed map on the arcs of a digraph.
126 129
The minimum time to pass the arc can be calculated as the division of
127 130
the two maps which can be done implicitly with the \c DivMap template
128 131
class. We use the implicit minimum time map as the length map of the
129 132
\c Dijkstra algorithm.
130 133
*/
131 134

	
132 135
/**
133 136
@defgroup paths Path Structures
134 137
@ingroup datas
135 138
\brief Path structures implemented in LEMON.
136 139

	
137 140
This group describes the path structures implemented in LEMON.
138 141

	
139 142
LEMON provides flexible data structures to work with paths.
140 143
All of them have similar interfaces and they can be copied easily with
141 144
assignment operators and copy constructors. This makes it easy and
142 145
efficient to have e.g. the Dijkstra algorithm to store its result in
143 146
any kind of path structure.
144 147

	
145 148
\sa lemon::concepts::Path
146

	
147 149
*/
148 150

	
149 151
/**
150 152
@defgroup auxdat Auxiliary Data Structures
151 153
@ingroup datas
152 154
\brief Auxiliary data structures implemented in LEMON.
153 155

	
154 156
This group describes some data structures implemented in LEMON in
155 157
order to make it easier to implement combinatorial algorithms.
156 158
*/
157 159

	
158

	
159 160
/**
160 161
@defgroup algs Algorithms
161 162
\brief This group describes the several algorithms
162 163
implemented in LEMON.
163 164

	
164 165
This group describes the several algorithms
165 166
implemented in LEMON.
166 167
*/
167 168

	
168 169
/**
169 170
@defgroup search Graph Search
170 171
@ingroup algs
171 172
\brief Common graph search algorithms.
172 173

	
173 174
This group describes the common graph search algorithms like
174
Breadth-first search (Bfs) and Depth-first search (Dfs).
175
Breadth-First Search (BFS) and Depth-First Search (DFS).
175 176
*/
176 177

	
177 178
/**
178
@defgroup shortest_path Shortest Path algorithms
179
@defgroup shortest_path Shortest Path Algorithms
179 180
@ingroup algs
180 181
\brief Algorithms for finding shortest paths.
181 182

	
182 183
This group describes the algorithms for finding shortest paths in graphs.
183 184
*/
184 185

	
185 186
/**
186
@defgroup spantree Minimum Spanning Tree algorithms
187
@defgroup spantree Minimum Spanning Tree Algorithms
187 188
@ingroup algs
188 189
\brief Algorithms for finding a minimum cost spanning tree in a graph.
189 190

	
190 191
This group describes the algorithms for finding a minimum cost spanning
191 192
tree in a graph
192 193
*/
193 194

	
195
@ingroup algs
194 196
/**
195 197
@defgroup utils Tools and Utilities
196 198
\brief Tools and utilities for programming in LEMON
197 199

	
198 200
Tools and utilities for programming in LEMON.
199 201
*/
200 202

	
201 203
/**
202 204
@defgroup gutils Basic Graph Utilities
203 205
@ingroup utils
204 206
\brief Simple basic graph utilities.
205 207

	
206 208
This group describes some simple basic graph utilities.
207 209
*/
208 210

	
209 211
/**
210 212
@defgroup misc Miscellaneous Tools
211 213
@ingroup utils
212 214
\brief Tools for development, debugging and testing.
213 215

	
214 216
This group describes several useful tools for development,
215 217
debugging and testing.
216 218
*/
217 219

	
218 220
/**
219
@defgroup timecount Time measuring and Counting
221
@defgroup timecount Time Measuring and Counting
220 222
@ingroup misc
221 223
\brief Simple tools for measuring the performance of algorithms.
222 224

	
223 225
This group describes simple tools for measuring the performance
224 226
of algorithms.
225 227
*/
226 228

	
227 229
/**
228 230
@defgroup exceptions Exceptions
229 231
@ingroup utils
230 232
\brief Exceptions defined in LEMON.
231 233

	
232 234
This group describes the exceptions defined in LEMON.
233 235
*/
234 236

	
235 237
/**
236 238
@defgroup io_group Input-Output
237 239
\brief Graph Input-Output methods
238 240

	
239 241
This group describes the tools for importing and exporting graphs
240 242
and graph related data. Now it supports the LEMON format
241 243
and the encapsulated postscript (EPS) format.
244
postscript (EPS) format.
242 245
*/
243 246

	
244 247
/**
245 248
@defgroup lemon_io LEMON Input-Output
246 249
@ingroup io_group
247
\brief Reading and writing \ref lgf-format "LEMON Graph Format".
250
\brief Reading and writing LEMON Graph Format.
248 251

	
249 252
This group describes methods for reading and writing
250 253
\ref lgf-format "LEMON Graph Format".
251 254
*/
252 255

	
253 256
/**
254
@defgroup eps_io Postscript exporting
257
@defgroup eps_io Postscript Exporting
255 258
@ingroup io_group
256 259
\brief General \c EPS drawer and graph exporter
257 260

	
258 261
This group describes general \c EPS drawing methods and special
259 262
graph exporting tools.
260 263
*/
261 264

	
262

	
263 265
/**
264 266
@defgroup concept Concepts
265 267
\brief Skeleton classes and concept checking classes
266 268

	
267 269
This group describes the data/algorithm skeletons and concept checking
268 270
classes implemented in LEMON.
269 271

	
270 272
The purpose of the classes in this group is fourfold.
271 273

	
272 274
- These classes contain the documentations of the concepts. In order
273 275
  to avoid document multiplications, an implementation of a concept
274 276
  simply refers to the corresponding concept class.
275 277

	
276 278
- These classes declare every functions, <tt>typedef</tt>s etc. an
277 279
  implementation of the concepts should provide, however completely
278 280
  without implementations and real data structures behind the
279 281
  interface. On the other hand they should provide nothing else. All
280 282
  the algorithms working on a data structure meeting a certain concept
281 283
  should compile with these classes. (Though it will not run properly,
282 284
  of course.) In this way it is easily to check if an algorithm
283 285
  doesn't use any extra feature of a certain implementation.
284 286

	
285 287
- The concept descriptor classes also provide a <em>checker class</em>
286 288
  that makes it possible to check whether a certain implementation of a
287 289
  concept indeed provides all the required features.
288 290

	
289 291
- Finally, They can serve as a skeleton of a new implementation of a concept.
290

	
291 292
*/
292 293

	
293

	
294 294
/**
295 295
@defgroup graph_concepts Graph Structure Concepts
296 296
@ingroup concept
297 297
\brief Skeleton and concept checking classes for graph structures
298 298

	
299 299
This group describes the skeletons and concept checking classes of LEMON's
300 300
graph structures and helper classes used to implement these.
301 301
*/
302 302

	
303

	
304
This group describes the skeletons and concept checking classes of maps.
303 305
/**
304 306
\anchor demoprograms
305 307

	
306 308
@defgroup demos Demo programs
307 309

	
308 310
Some demo programs are listed here. Their full source codes can be found in
309 311
the \c demo subdirectory of the source tree.
310 312

	
311 313
It order to compile them, use <tt>--enable-demo</tt> configure option when
312 314
build the library.
313 315
*/
Ignore white space 6 line context
... ...
@@ -33,75 +33,75 @@
33 33
Otherwise the file consists of sections starting with
34 34
a header line. The header lines starts with an \c '@' character followed by the
35 35
type of section. The standard section types are \c \@nodes, \c
36 36
\@arcs and \c \@edges
37 37
and \@attributes. Each header line may also have an optional
38 38
\e name, which can be use to distinguish the sections of the same
39 39
type.
40 40

	
41 41
The standard sections are column oriented, each line consists of
42 42
<em>token</em>s separated by whitespaces. A token can be \e plain or
43 43
\e quoted. A plain token is just a sequence of non-whitespace characters,
44 44
while a quoted token is a
45 45
character sequence surrounded by double quotes, and it can also
46 46
contain whitespaces and escape sequences.
47 47

	
48 48
The \c \@nodes section describes a set of nodes and associated
49 49
maps. The first is a header line, its columns are the names of the
50 50
maps appearing in the following lines.
51 51
One of the maps must be called \c
52 52
"label", which plays special role in the file.
53 53
The following
54 54
non-empty lines until the next section describes nodes of the
55 55
graph. Each line contains the values of the node maps
56 56
associated to the current node.
57 57

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

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

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

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

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

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

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

	
104 104
*/
105 105
}
106 106

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

	
19 19
/**
20 20
\mainpage LEMON Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24 24
\subsection whatis What is LEMON
25 25

	
26 26
LEMON stands for
27 27
<b>L</b>ibrary of <b>E</b>fficient <b>M</b>odels
28 28
and <b>O</b>ptimization in <b>N</b>etworks.
29 29
It is a C++ template
30 30
library aimed at combinatorial optimization tasks which
31 31
often involve in working
32 32
with graphs.
33 33

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

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

	
44 44
If you
45 45
want to see how LEMON works, see
46
some \ref demoprograms "demo programs"!
46
some \ref demoprograms "demo programs".
47 47

	
48 48
If you know what you are looking for then try to find it under the
49 49
<a class="el" href="modules.html">Modules</a>
50 50
section.
51 51

	
52

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

	
19 19
#include <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

	
23 23
  void ArgParser::_showHelp(void *p)
24 24
  {
25 25
    (static_cast<ArgParser*>(p))->showHelp();
26 26
    exit(1);
27 27
  }
28 28

	
29
  ArgParser::ArgParser(int argc, const char **argv) :_argc(argc), _argv(argv),
30
                                                     _command_name(argv[0]) {
29
  ArgParser::ArgParser(int argc, const char * const *argv)
30
    :_argc(argc), _argv(argv), _command_name(argv[0]) {
31 31
    funcOption("-help","Print a short help message",_showHelp,this);
32 32
    synonym("help","-help");
33 33
    synonym("h","-help");
34

	
35 34
  }
36 35

	
37 36
  ArgParser::~ArgParser()
38 37
  {
39 38
    for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
40 39
      if(i->second.self_delete)
41 40
        switch(i->second.type) {
42 41
        case BOOL:
43 42
          delete i->second.bool_p;
44 43
          break;
45 44
        case STRING:
46 45
          delete i->second.string_p;
47 46
          break;
48 47
        case DOUBLE:
49 48
          delete i->second.double_p;
50 49
          break;
51 50
        case INTEGER:
52 51
          delete i->second.int_p;
53 52
          break;
54 53
        case UNKNOWN:
55 54
          break;
56 55
        case FUNC:
57 56
          break;
58 57
        }
59 58
  }
60 59

	
61 60

	
62 61
  ArgParser &ArgParser::intOption(const std::string &name,
63 62
                               const std::string &help,
64 63
                               int value, bool obl)
65 64
  {
66 65
    ParData p;
67 66
    p.int_p=new int(value);
68 67
    p.self_delete=true;
69 68
    p.help=help;
70 69
    p.type=INTEGER;
71 70
    p.mandatory=obl;
72 71
    _opts[name]=p;
73 72
    return *this;
74 73
  }
75 74

	
76 75
  ArgParser &ArgParser::doubleOption(const std::string &name,
77 76
                               const std::string &help,
78 77
                               double value, bool obl)
79 78
  {
80 79
    ParData p;
81 80
    p.double_p=new double(value);
82 81
    p.self_delete=true;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ARG_PARSER_H
20 20
#define LEMON_ARG_PARSER_H
21 21

	
22 22
#include <vector>
23 23
#include <map>
24 24
#include <list>
25 25
#include <string>
26 26
#include <iostream>
27 27
#include <sstream>
28 28
#include <algorithm>
29 29
#include <lemon/assert.h>
30 30

	
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Command line arguments parser
38 38

	
39 39
  ///\ingroup misc
40 40
  ///Command line arguments parser.
41 41
  ///
42 42
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
43 43
  class ArgParser {
44 44

	
45 45
    static void _showHelp(void *p);
46 46
  protected:
47 47

	
48 48
    int _argc;
49
    const char **_argv;
49
    const char * const *_argv;
50 50

	
51 51
    enum OptType { UNKNOWN=0, BOOL=1, STRING=2, DOUBLE=3, INTEGER=4, FUNC=5 };
52 52

	
53 53
    class ParData {
54 54
    public:
55 55
      union {
56 56
        bool *bool_p;
57 57
        int *int_p;
58 58
        double *double_p;
59 59
        std::string *string_p;
60 60
        struct {
61 61
          void (*p)(void *);
62 62
          void *data;
63 63
        } func_p;
64 64

	
65 65
      };
66 66
      std::string help;
67 67
      bool mandatory;
68 68
      OptType type;
69 69
      bool set;
70 70
      bool ingroup;
71 71
      bool has_syn;
72 72
      bool syn;
73 73
      bool self_delete;
74 74
      ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false),
75 75
                  has_syn(false), syn(false), self_delete(false) {}
76 76
    };
77 77

	
78 78
    typedef std::map<std::string,ParData> Opts;
79 79
    Opts _opts;
80 80

	
81 81
    class GroupData
82 82
    {
83 83
    public:
84 84
      typedef std::list<std::string> Opts;
85 85
      Opts opts;
86 86
      bool only_one;
87 87
      bool mandatory;
88 88
      GroupData() :only_one(false), mandatory(false) {}
89 89
    };
90 90

	
91 91
    typedef std::map<std::string,GroupData> Groups;
92 92
    Groups _groups;
93 93

	
94 94
    struct OtherArg
95 95
    {
96 96
      std::string name;
97 97
      std::string help;
98 98
      OtherArg(std::string n, std::string h) :name(n), help(h) {}
99 99

	
100 100
    };
101 101

	
102 102
    std::vector<OtherArg> _others_help;
103 103
    std::vector<std::string> _file_args;
104 104
    std::string _command_name;
105 105

	
106 106

	
107 107
  private:
108 108
    //Bind a function to an option.
109 109

	
110 110
    //\param name The name of the option. The leading '-' must be omitted.
111 111
    //\param help A help string.
112 112
    //\retval func The function to be called when the option is given. It
113 113
    //  must be of type "void f(void *)"
114 114
    //\param data Data to be passed to \c func
115 115
    ArgParser &funcOption(const std::string &name,
116 116
                    const std::string &help,
117 117
                    void (*func)(void *),void *data);
118 118

	
119 119
  public:
120 120

	
121 121
    ///Constructor
122
    ArgParser(int argc, const char **argv);
122
    ArgParser(int argc, const char * const *argv);
123 123

	
124 124
    ~ArgParser();
125 125

	
126 126
    ///\name Options
127 127
    ///
128 128

	
129 129
    ///@{
130 130

	
131 131
    ///Add a new integer type option
132 132

	
133 133
    ///Add a new integer type option.
134 134
    ///\param name The name of the option. The leading '-' must be omitted.
135 135
    ///\param help A help string.
136 136
    ///\param value A default value for the option.
137 137
    ///\param obl Indicate if the option is mandatory.
138 138
    ArgParser &intOption(const std::string &name,
139 139
                    const std::string &help,
140 140
                    int value=0, bool obl=false);
141 141

	
142 142
    ///Add a new floating point type option
143 143

	
144 144
    ///Add a new floating point type option.
145 145
    ///\param name The name of the option. The leading '-' must be omitted.
146 146
    ///\param help A help string.
147 147
    ///\param value A default value for the option.
148 148
    ///\param obl Indicate if the option is mandatory.
149 149
    ArgParser &doubleOption(const std::string &name,
150 150
                      const std::string &help,
151 151
                      double value=0, bool obl=false);
152 152

	
153 153
    ///Add a new bool type option
154 154

	
155 155
    ///Add a new bool type option.
156 156
    ///\param name The name of the option. The leading '-' must be omitted.
157 157
    ///\param help A help string.
158 158
    ///\param value A default value for the option.
159 159
    ///\param obl Indicate if the option is mandatory.
160 160
    ///\note A mandatory bool obtion is of very little use.
161 161
    ArgParser &boolOption(const std::string &name,
162 162
                      const std::string &help,
163 163
                      bool value=false, bool obl=false);
164 164

	
165 165
    ///Add a new string type option
166 166

	
167 167
    ///Add a new string type option.
168 168
    ///\param name The name of the option. The leading '-' must be omitted.
169 169
    ///\param help A help string.
170 170
    ///\param value A default value for the option.
Ignore white space 6 line context
... ...
@@ -4,150 +4,150 @@
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

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

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

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

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

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

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

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

	
112 112
  ///%BFS algorithm class.
113 113

	
114 114
  ///\ingroup search
115 115
  ///This class provides an efficient implementation of the %BFS algorithm.
116 116
  ///
117 117
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 118
  ///algorithm, which is convenient in the simplier cases and it can be
119 119
  ///used easier.
120 120
  ///
121 121
  ///\tparam GR The type of the digraph the algorithm runs on.
122 122
  ///The default value is \ref ListDigraph. The value of GR is not used
123 123
  ///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits.
124 124
  ///\tparam TR Traits class to set various data types used by the algorithm.
125 125
  ///The default traits class is
126 126
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
127 127
  ///See \ref BfsDefaultTraits for the documentation of
128 128
  ///a Bfs traits class.
129 129
#ifdef DOXYGEN
130 130
  template <typename GR,
131 131
            typename TR>
132 132
#else
133 133
  template <typename GR=ListDigraph,
134 134
            typename TR=BfsDefaultTraits<GR> >
135 135
#endif
136 136
  class Bfs {
137 137
  public:
138 138

	
139 139
    ///The type of the digraph the algorithm runs on.
140 140
    typedef typename TR::Digraph Digraph;
141 141

	
142 142
    ///\brief The type of the map that stores the predecessor arcs of the
143 143
    ///shortest paths.
144 144
    typedef typename TR::PredMap PredMap;
145 145
    ///The type of the map that stores the distances of the nodes.
146 146
    typedef typename TR::DistMap DistMap;
147 147
    ///The type of the map that indicates which nodes are reached.
148 148
    typedef typename TR::ReachedMap ReachedMap;
149 149
    ///The type of the map that indicates which nodes are processed.
150 150
    typedef typename TR::ProcessedMap ProcessedMap;
151 151
    ///The type of the paths.
152 152
    typedef PredMapPath<Digraph, PredMap> Path;
153 153

	
... ...
@@ -182,175 +182,175 @@
182 182

	
183 183
    std::vector<typename Digraph::Node> _queue;
184 184
    int _queue_head,_queue_tail,_queue_next_dist;
185 185
    int _curr_dist;
186 186

	
187 187
    //Creates the maps if necessary.
188 188
    void create_maps()
189 189
    {
190 190
      if(!_pred) {
191 191
        local_pred = true;
192 192
        _pred = Traits::createPredMap(*G);
193 193
      }
194 194
      if(!_dist) {
195 195
        local_dist = true;
196 196
        _dist = Traits::createDistMap(*G);
197 197
      }
198 198
      if(!_reached) {
199 199
        local_reached = true;
200 200
        _reached = Traits::createReachedMap(*G);
201 201
      }
202 202
      if(!_processed) {
203 203
        local_processed = true;
204 204
        _processed = Traits::createProcessedMap(*G);
205 205
      }
206 206
    }
207 207

	
208 208
  protected:
209 209

	
210 210
    Bfs() {}
211 211

	
212 212
  public:
213 213

	
214 214
    typedef Bfs Create;
215 215

	
216 216
    ///\name Named template parameters
217 217

	
218 218
    ///@{
219 219

	
220 220
    template <class T>
221 221
    struct SetPredMapTraits : public Traits {
222 222
      typedef T PredMap;
223 223
      static PredMap *createPredMap(const Digraph &)
224 224
      {
225 225
        LEMON_ASSERT(false, "PredMap is not initialized");
226 226
        return 0; // ignore warnings
227 227
      }
228 228
    };
229 229
    ///\brief \ref named-templ-param "Named parameter" for setting
230
    ///\ref PredMap type.
230
    ///PredMap type.
231 231
    ///
232 232
    ///\ref named-templ-param "Named parameter" for setting
233
    ///\ref PredMap type.
233
    ///PredMap type.
234 234
    template <class T>
235 235
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
236 236
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
237 237
    };
238 238

	
239 239
    template <class T>
240 240
    struct SetDistMapTraits : public Traits {
241 241
      typedef T DistMap;
242 242
      static DistMap *createDistMap(const Digraph &)
243 243
      {
244 244
        LEMON_ASSERT(false, "DistMap is not initialized");
245 245
        return 0; // ignore warnings
246 246
      }
247 247
    };
248 248
    ///\brief \ref named-templ-param "Named parameter" for setting
249
    ///\ref DistMap type.
249
    ///DistMap type.
250 250
    ///
251 251
    ///\ref named-templ-param "Named parameter" for setting
252
    ///\ref DistMap type.
252
    ///DistMap type.
253 253
    template <class T>
254 254
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
255 255
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
256 256
    };
257 257

	
258 258
    template <class T>
259 259
    struct SetReachedMapTraits : public Traits {
260 260
      typedef T ReachedMap;
261 261
      static ReachedMap *createReachedMap(const Digraph &)
262 262
      {
263 263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264 264
        return 0; // ignore warnings
265 265
      }
266 266
    };
267 267
    ///\brief \ref named-templ-param "Named parameter" for setting
268
    ///\ref ReachedMap type.
268
    ///ReachedMap type.
269 269
    ///
270 270
    ///\ref named-templ-param "Named parameter" for setting
271
    ///\ref ReachedMap type.
271
    ///ReachedMap type.
272 272
    template <class T>
273 273
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
274 274
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
275 275
    };
276 276

	
277 277
    template <class T>
278 278
    struct SetProcessedMapTraits : public Traits {
279 279
      typedef T ProcessedMap;
280 280
      static ProcessedMap *createProcessedMap(const Digraph &)
281 281
      {
282 282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283 283
        return 0; // ignore warnings
284 284
      }
285 285
    };
286 286
    ///\brief \ref named-templ-param "Named parameter" for setting
287
    ///\ref ProcessedMap type.
287
    ///ProcessedMap type.
288 288
    ///
289 289
    ///\ref named-templ-param "Named parameter" for setting
290
    ///\ref ProcessedMap type.
290
    ///ProcessedMap type.
291 291
    template <class T>
292 292
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
293 293
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
294 294
    };
295 295

	
296 296
    struct SetStandardProcessedMapTraits : public Traits {
297 297
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
298 298
      static ProcessedMap *createProcessedMap(const Digraph &g)
299 299
      {
300 300
        return new ProcessedMap(g);
301 301
        return 0; // ignore warnings
302 302
      }
303 303
    };
304 304
    ///\brief \ref named-templ-param "Named parameter" for setting
305
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
306 306
    ///
307 307
    ///\ref named-templ-param "Named parameter" for setting
308
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
308
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
309 309
    ///If you don't set it explicitly, it will be automatically allocated.
310 310
    struct SetStandardProcessedMap :
311 311
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
312 312
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
313 313
    };
314 314

	
315 315
    ///@}
316 316

	
317 317
  public:
318 318

	
319 319
    ///Constructor.
320 320

	
321 321
    ///Constructor.
322 322
    ///\param g The digraph the algorithm runs on.
323 323
    Bfs(const Digraph &g) :
324 324
      G(&g),
325 325
      _pred(NULL), local_pred(false),
326 326
      _dist(NULL), local_dist(false),
327 327
      _reached(NULL), local_reached(false),
328 328
      _processed(NULL), local_processed(false)
329 329
    { }
330 330

	
331 331
    ///Destructor.
332 332
    ~Bfs()
333 333
    {
334 334
      if(local_pred) delete _pred;
335 335
      if(local_dist) delete _dist;
336 336
      if(local_reached) delete _reached;
337 337
      if(local_processed) delete _processed;
338 338
    }
339 339

	
340 340
    ///Sets the map that stores the predecessor arcs.
341 341

	
342 342
    ///Sets the map that stores the predecessor arcs.
343 343
    ///If you don't use this function before calling \ref run(),
344 344
    ///it will allocate one. The destructor deallocates this
345 345
    ///automatically allocated map, of course.
346 346
    ///\return <tt> (*this) </tt>
347 347
    Bfs &predMap(PredMap &m)
348 348
    {
349 349
      if(local_pred) {
350 350
        delete _pred;
351 351
        local_pred=false;
352 352
      }
353 353
      _pred = &m;
354 354
      return *this;
355 355
    }
356 356

	
... ...
@@ -790,164 +790,164 @@
790 790

	
791 791
    ///\brief Returns a const reference to the node map that stores the
792 792
    /// distances of the nodes.
793 793
    ///
794 794
    ///Returns a const reference to the node map that stores the distances
795 795
    ///of the nodes calculated by the algorithm.
796 796
    ///
797 797
    ///\pre Either \ref run() or \ref init()
798 798
    ///must be called before using this function.
799 799
    const DistMap &distMap() const { return *_dist;}
800 800

	
801 801
    ///\brief Returns a const reference to the node map that stores the
802 802
    ///predecessor arcs.
803 803
    ///
804 804
    ///Returns a const reference to the node map that stores the predecessor
805 805
    ///arcs, which form the shortest path tree.
806 806
    ///
807 807
    ///\pre Either \ref run() or \ref init()
808 808
    ///must be called before using this function.
809 809
    const PredMap &predMap() const { return *_pred;}
810 810

	
811 811
    ///Checks if a node is reachable from the root(s).
812 812

	
813 813
    ///Returns \c true if \c v is reachable from the root(s).
814 814
    ///\pre Either \ref run() or \ref start()
815 815
    ///must be called before using this function.
816 816
    bool reached(Node v) const { return (*_reached)[v]; }
817 817

	
818 818
    ///@}
819 819
  };
820 820

	
821 821
  ///Default traits class of bfs() function.
822 822

	
823 823
  ///Default traits class of bfs() function.
824 824
  ///\tparam GR Digraph type.
825 825
  template<class GR>
826 826
  struct BfsWizardDefaultTraits
827 827
  {
828 828
    ///The type of the digraph the algorithm runs on.
829 829
    typedef GR Digraph;
830 830

	
831 831
    ///\brief The type of the map that stores the predecessor
832 832
    ///arcs of the shortest paths.
833 833
    ///
834 834
    ///The type of the map that stores the predecessor
835 835
    ///arcs of the shortest paths.
836 836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
837 837
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838
    ///Instantiates a \ref PredMap.
838
    ///Instantiates a PredMap.
839 839

	
840
    ///This function instantiates a \ref PredMap.
840
    ///This function instantiates a PredMap.
841 841
    ///\param g is the digraph, to which we would like to define the
842
    ///\ref PredMap.
842
    ///PredMap.
843 843
    static PredMap *createPredMap(const Digraph &g)
844 844
    {
845 845
      return new PredMap(g);
846 846
    }
847 847

	
848 848
    ///The type of the map that indicates which nodes are processed.
849 849

	
850 850
    ///The type of the map that indicates which nodes are processed.
851 851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852 852
    ///By default it is a NullMap.
853 853
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854
    ///Instantiates a \ref ProcessedMap.
854
    ///Instantiates a ProcessedMap.
855 855

	
856
    ///This function instantiates a \ref ProcessedMap.
856
    ///This function instantiates a ProcessedMap.
857 857
    ///\param g is the digraph, to which
858
    ///we would like to define the \ref ProcessedMap.
858
    ///we would like to define the ProcessedMap.
859 859
#ifdef DOXYGEN
860 860
    static ProcessedMap *createProcessedMap(const Digraph &g)
861 861
#else
862 862
    static ProcessedMap *createProcessedMap(const Digraph &)
863 863
#endif
864 864
    {
865 865
      return new ProcessedMap();
866 866
    }
867 867

	
868 868
    ///The type of the map that indicates which nodes are reached.
869 869

	
870 870
    ///The type of the map that indicates which nodes are reached.
871 871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 872
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873
    ///Instantiates a \ref ReachedMap.
873
    ///Instantiates a ReachedMap.
874 874

	
875
    ///This function instantiates a \ref ReachedMap.
875
    ///This function instantiates a ReachedMap.
876 876
    ///\param g is the digraph, to which
877
    ///we would like to define the \ref ReachedMap.
877
    ///we would like to define the ReachedMap.
878 878
    static ReachedMap *createReachedMap(const Digraph &g)
879 879
    {
880 880
      return new ReachedMap(g);
881 881
    }
882 882

	
883 883
    ///The type of the map that stores the distances of the nodes.
884 884

	
885 885
    ///The type of the map that stores the distances of the nodes.
886 886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
887 887
    typedef typename Digraph::template NodeMap<int> DistMap;
888
    ///Instantiates a \ref DistMap.
888
    ///Instantiates a DistMap.
889 889

	
890
    ///This function instantiates a \ref DistMap.
890
    ///This function instantiates a DistMap.
891 891
    ///\param g is the digraph, to which we would like to define
892
    ///the \ref DistMap
892
    ///the DistMap
893 893
    static DistMap *createDistMap(const Digraph &g)
894 894
    {
895 895
      return new DistMap(g);
896 896
    }
897 897

	
898 898
    ///The type of the shortest paths.
899 899

	
900 900
    ///The type of the shortest paths.
901 901
    ///It must meet the \ref concepts::Path "Path" concept.
902 902
    typedef lemon::Path<Digraph> Path;
903 903
  };
904 904

	
905
  /// Default traits class used by \ref BfsWizard
905
  /// Default traits class used by BfsWizard
906 906

	
907 907
  /// To make it easier to use Bfs algorithm
908 908
  /// we have created a wizard class.
909 909
  /// This \ref BfsWizard class needs default traits,
910 910
  /// as well as the \ref Bfs class.
911 911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912 912
  /// \ref BfsWizard class.
913 913
  template<class GR>
914 914
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 915
  {
916 916

	
917 917
    typedef BfsWizardDefaultTraits<GR> Base;
918 918
  protected:
919 919
    //The type of the nodes in the digraph.
920 920
    typedef typename Base::Digraph::Node Node;
921 921

	
922 922
    //Pointer to the digraph the algorithm runs on.
923 923
    void *_g;
924 924
    //Pointer to the map of reached nodes.
925 925
    void *_reached;
926 926
    //Pointer to the map of processed nodes.
927 927
    void *_processed;
928 928
    //Pointer to the map of predecessors arcs.
929 929
    void *_pred;
930 930
    //Pointer to the map of distances.
931 931
    void *_dist;
932 932
    //Pointer to the shortest path to the target node.
933 933
    void *_path;
934 934
    //Pointer to the distance of the target node.
935 935
    int *_di;
936 936

	
937 937
    public:
938 938
    /// Constructor.
939 939

	
940 940
    /// This constructor does not require parameters, therefore it initiates
941 941
    /// all of the attributes to \c 0.
942 942
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 943
                      _dist(0), _path(0), _di(0) {}
944 944

	
945 945
    /// Constructor.
946 946

	
947 947
    /// This constructor requires one parameter,
948 948
    /// others are initiated to \c 0.
949 949
    /// \param g The digraph the algorithm runs on.
950 950
    BfsWizardBase(const GR &g) :
951 951
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 952
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 953

	
... ...
@@ -1023,154 +1023,154 @@
1023 1023
      if (s!=INVALID)
1024 1024
        alg.run(s);
1025 1025
      else
1026 1026
        alg.run();
1027 1027
    }
1028 1028

	
1029 1029
    ///Finds the shortest path between \c s and \c t.
1030 1030

	
1031 1031
    ///This method runs BFS algorithm from node \c s
1032 1032
    ///in order to compute the shortest path to node \c t
1033 1033
    ///(it stops searching when \c t is processed).
1034 1034
    ///
1035 1035
    ///\return \c true if \c t is reachable form \c s.
1036 1036
    bool run(Node s, Node t)
1037 1037
    {
1038 1038
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 1039
      if (Base::_pred)
1040 1040
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1041
      if (Base::_dist)
1042 1042
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1043
      if (Base::_reached)
1044 1044
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 1045
      if (Base::_processed)
1046 1046
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1047 1047
      alg.run(s,t);
1048 1048
      if (Base::_path)
1049 1049
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1050
      if (Base::_di)
1051 1051
        *Base::_di = alg.dist(t);
1052 1052
      return alg.reached(t);
1053 1053
    }
1054 1054

	
1055 1055
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1056

	
1057 1057
    ///This method runs BFS algorithm in order to compute
1058 1058
    ///the shortest path to each node.
1059 1059
    void run()
1060 1060
    {
1061 1061
      run(INVALID);
1062 1062
    }
1063 1063

	
1064 1064
    template<class T>
1065 1065
    struct SetPredMapBase : public Base {
1066 1066
      typedef T PredMap;
1067 1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1068
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1069
    };
1070 1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting \ref PredMap object.
1071
    ///for setting PredMap object.
1072 1072
    ///
1073 1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting \ref PredMap object.
1074
    ///for setting PredMap object.
1075 1075
    template<class T>
1076 1076
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1077
    {
1078 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1080
    }
1081 1081

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

	
1100 1100
    template<class T>
1101 1101
    struct SetDistMapBase : public Base {
1102 1102
      typedef T DistMap;
1103 1103
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1104
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1105
    };
1106 1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting \ref DistMap object.
1107
    ///for setting DistMap object.
1108 1108
    ///
1109 1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting \ref DistMap object.
1110
    ///for setting DistMap object.
1111 1111
    template<class T>
1112 1112
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1113
    {
1114 1114
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1115
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1116
    }
1117 1117

	
1118 1118
    template<class T>
1119 1119
    struct SetProcessedMapBase : public Base {
1120 1120
      typedef T ProcessedMap;
1121 1121
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1122
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1123
    };
1124 1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting \ref ProcessedMap object.
1125
    ///for setting ProcessedMap object.
1126 1126
    ///
1127 1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting \ref ProcessedMap object.
1128
    ///for setting ProcessedMap object.
1129 1129
    template<class T>
1130 1130
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1131
    {
1132 1132
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1133
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1134
    }
1135 1135

	
1136 1136
    template<class T>
1137 1137
    struct SetPathBase : public Base {
1138 1138
      typedef T Path;
1139 1139
      SetPathBase(const TR &b) : TR(b) {}
1140 1140
    };
1141 1141
    ///\brief \ref named-func-param "Named parameter"
1142 1142
    ///for getting the shortest path to the target node.
1143 1143
    ///
1144 1144
    ///\ref named-func-param "Named parameter"
1145 1145
    ///for getting the shortest path to the target node.
1146 1146
    template<class T>
1147 1147
    BfsWizard<SetPathBase<T> > path(const T &t)
1148 1148
    {
1149 1149
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 1150
      return BfsWizard<SetPathBase<T> >(*this);
1151 1151
    }
1152 1152

	
1153 1153
    ///\brief \ref named-func-param "Named parameter"
1154 1154
    ///for getting the distance of the target node.
1155 1155
    ///
1156 1156
    ///\ref named-func-param "Named parameter"
1157 1157
    ///for getting the distance of the target node.
1158 1158
    BfsWizard dist(const int &d)
1159 1159
    {
1160 1160
      Base::_di=const_cast<int*>(&d);
1161 1161
      return *this;
1162 1162
    }
1163 1163

	
1164 1164
  };
1165 1165

	
1166 1166
  ///Function-type interface for BFS algorithm.
1167 1167

	
1168 1168
  /// \ingroup search
1169 1169
  ///Function-type interface for BFS algorithm.
1170 1170
  ///
1171 1171
  ///This function also has several \ref named-func-param "named parameters",
1172 1172
  ///they are declared as the members of class \ref BfsWizard.
1173 1173
  ///The following examples show how to use these parameters.
1174 1174
  ///\code
1175 1175
  ///  // Compute shortest path from node s to each node
1176 1176
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
... ...
@@ -1222,101 +1222,101 @@
1222 1222
    /// This function is called when an arc is examined but its target node is
1223 1223
    /// already discovered.
1224 1224
    void examine(const Arc& arc) {}
1225 1225
  };
1226 1226
#else
1227 1227
  template <typename _Digraph>
1228 1228
  struct BfsVisitor {
1229 1229
    typedef _Digraph Digraph;
1230 1230
    typedef typename Digraph::Arc Arc;
1231 1231
    typedef typename Digraph::Node Node;
1232 1232
    void start(const Node&) {}
1233 1233
    void reach(const Node&) {}
1234 1234
    void process(const Node&) {}
1235 1235
    void discover(const Arc&) {}
1236 1236
    void examine(const Arc&) {}
1237 1237

	
1238 1238
    template <typename _Visitor>
1239 1239
    struct Constraints {
1240 1240
      void constraints() {
1241 1241
        Arc arc;
1242 1242
        Node node;
1243 1243
        visitor.start(node);
1244 1244
        visitor.reach(node);
1245 1245
        visitor.process(node);
1246 1246
        visitor.discover(arc);
1247 1247
        visitor.examine(arc);
1248 1248
      }
1249 1249
      _Visitor& visitor;
1250 1250
    };
1251 1251
  };
1252 1252
#endif
1253 1253

	
1254 1254
  /// \brief Default traits class of BfsVisit class.
1255 1255
  ///
1256 1256
  /// Default traits class of BfsVisit class.
1257 1257
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1258 1258
  template<class _Digraph>
1259 1259
  struct BfsVisitDefaultTraits {
1260 1260

	
1261 1261
    /// \brief The type of the digraph the algorithm runs on.
1262 1262
    typedef _Digraph Digraph;
1263 1263

	
1264 1264
    /// \brief The type of the map that indicates which nodes are reached.
1265 1265
    ///
1266 1266
    /// The type of the map that indicates which nodes are reached.
1267 1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1268
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1269

	
1270
    /// \brief Instantiates a \ref ReachedMap.
1270
    /// \brief Instantiates a ReachedMap.
1271 1271
    ///
1272
    /// This function instantiates a \ref ReachedMap.
1272
    /// This function instantiates a ReachedMap.
1273 1273
    /// \param digraph is the digraph, to which
1274
    /// we would like to define the \ref ReachedMap.
1274
    /// we would like to define the ReachedMap.
1275 1275
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 1276
      return new ReachedMap(digraph);
1277 1277
    }
1278 1278

	
1279 1279
  };
1280 1280

	
1281 1281
  /// \ingroup search
1282 1282
  ///
1283 1283
  /// \brief %BFS algorithm class with visitor interface.
1284 1284
  ///
1285 1285
  /// This class provides an efficient implementation of the %BFS algorithm
1286 1286
  /// with visitor interface.
1287 1287
  ///
1288 1288
  /// The %BfsVisit class provides an alternative interface to the Bfs
1289 1289
  /// class. It works with callback mechanism, the BfsVisit object calls
1290 1290
  /// the member functions of the \c Visitor class on every BFS event.
1291 1291
  ///
1292 1292
  /// This interface of the BFS algorithm should be used in special cases
1293 1293
  /// when extra actions have to be performed in connection with certain
1294 1294
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1295 1295
  /// instead.
1296 1296
  ///
1297 1297
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1298 1298
  /// The default value is
1299 1299
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1300 1300
  /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1301 1301
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1302 1302
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1303 1303
  /// does not observe the BFS events. If you want to observe the BFS
1304 1304
  /// events, you should implement your own visitor class.
1305 1305
  /// \tparam _Traits Traits class to set various data types used by the
1306 1306
  /// algorithm. The default traits class is
1307 1307
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1308 1308
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309 1309
  /// a BFS visit traits class.
1310 1310
#ifdef DOXYGEN
1311 1311
  template <typename _Digraph, typename _Visitor, typename _Traits>
1312 1312
#else
1313 1313
  template <typename _Digraph = ListDigraph,
1314 1314
            typename _Visitor = BfsVisitor<_Digraph>,
1315 1315
            typename _Traits = BfsVisitDefaultTraits<_Digraph> >
1316 1316
#endif
1317 1317
  class BfsVisit {
1318 1318
  public:
1319 1319

	
1320 1320
    ///The traits class.
1321 1321
    typedef _Traits Traits;
1322 1322

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

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

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

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

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

	
31 31
namespace lemon {
32 32

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

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

	
102 101
    typedef True Notifier;
103 102

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

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

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

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

	
136 134
      friend class AlterationNotifier;
137 135

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

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

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

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

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

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

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

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

	
195 189
    private:
196 190

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

	
199 193
    protected:
200 194

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

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

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

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

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

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

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

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

	
253 246
    };
254 247

	
255 248
  protected:
256 249

	
257 250
    const Container* container;
258 251

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

	
262 255

	
263 256
  public:
264 257

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

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

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

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

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

	
304 296
  protected:
305 297

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

	
308 300
  public:
309 301

	
310

	
311

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

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

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

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

	
342 332
  protected:
343 333

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

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

	
355 345
  public:
356 346

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

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

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

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

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

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

	
479 465
}
480 466

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

	
19 19
#ifndef LEMON_BITS_ARRAY_MAP_H
20 20
#define LEMON_BITS_ARRAY_MAP_H
21 21

	
22 22
#include <memory>
23 23

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

	
76 76
  public:
77 77

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

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

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

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

	
136 136

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

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

	
165 165
  protected:
166 166

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

	
171 171
  public:
172 172

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

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

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

	
199 199
  protected:
200 200

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

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

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

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

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

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

	
324 324
  private:
325 325

	
326 326
    void allocate_memory() {
327 327
      int max_id = Parent::notifier()->maxId();
328 328
      if (max_id == -1) {
329 329
        capacity = 0;
330 330
        values = 0;
331 331
        return;
332 332
      }
333 333
      capacity = 1;
334 334
      while (capacity <= max_id) {
335 335
        capacity <<= 1;
336 336
      }
337 337
      values = allocator.allocate(capacity);
338 338
    }
339 339

	
340 340
    int capacity;
341 341
    Value* values;
342 342
    Allocator allocator;
343 343

	
344 344
  };
345 345

	
346 346
}
347 347

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

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

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

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

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

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

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

	
42 42
  public:
43 43

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

	
48 48
    typedef True UndirectedTag;
49 49

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

	
53 53
    protected:
54 54
      bool forward;
55 55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
48 48
  Point operator()(double t) const
49 49
  {
50 50
    //    return conv(conv(p1,p2,t),conv(p2,p3,t),t);
51 51
    return conv(p1,p2,t);
52 52
  }
53 53
  Bezier1 before(double t) const
54 54
  {
55 55
    return Bezier1(p1,conv(p1,p2,t));
56 56
  }
57 57

	
58 58
  Bezier1 after(double t) const
59 59
  {
60 60
    return Bezier1(conv(p1,p2,t),p2);
61 61
  }
62 62

	
63 63
  Bezier1 revert() const { return Bezier1(p2,p1);}
64 64
  Bezier1 operator()(double a,double b) const { return before(b).after(a/b); }
65 65
  Point grad() const { return p2-p1; }
66 66
  Point norm() const { return rot90(p2-p1); }
67 67
  Point grad(double) const { return grad(); }
68 68
  Point norm(double t) const { return rot90(grad(t)); }
69 69
};
70 70

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

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

	
22

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

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

	
31 30
namespace lemon {
32 31

	
33 32

	
34 33
  //#ifndef LEMON_USE_DEBUG_MAP
35 34

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

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

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

	
53 52
  template <typename _Graph, typename _Item>
54 53
  struct DefaultMapSelector<_Graph, _Item, signed char> {
55 54
    typedef VectorMap<_Graph, _Item, signed char> Map;
56 55
  };
57 56

	
58 57
  template <typename _Graph, typename _Item>
59 58
  struct DefaultMapSelector<_Graph, _Item, unsigned char> {
60 59
    typedef VectorMap<_Graph, _Item, unsigned char> Map;
61 60
  };
62 61

	
63 62

	
64 63
  // int
65 64
  template <typename _Graph, typename _Item>
66 65
  struct DefaultMapSelector<_Graph, _Item, signed int> {
67 66
    typedef VectorMap<_Graph, _Item, signed int> Map;
68 67
  };
69 68

	
70 69
  template <typename _Graph, typename _Item>
71 70
  struct DefaultMapSelector<_Graph, _Item, unsigned int> {
72 71
    typedef VectorMap<_Graph, _Item, unsigned int> Map;
73 72
  };
74 73

	
75 74

	
76 75
  // short
77 76
  template <typename _Graph, typename _Item>
... ...
@@ -104,78 +103,78 @@
104 103
  struct DefaultMapSelector<_Graph, _Item, signed long long> {
105 104
    typedef VectorMap<_Graph, _Item, signed long long> Map;
106 105
  };
107 106

	
108 107
  template <typename _Graph, typename _Item>
109 108
  struct DefaultMapSelector<_Graph, _Item, unsigned long long> {
110 109
    typedef VectorMap<_Graph, _Item, unsigned long long> Map;
111 110
  };
112 111

	
113 112
#endif
114 113

	
115 114

	
116 115
  // float
117 116
  template <typename _Graph, typename _Item>
118 117
  struct DefaultMapSelector<_Graph, _Item, float> {
119 118
    typedef VectorMap<_Graph, _Item, float> Map;
120 119
  };
121 120

	
122 121

	
123 122
  // double
124 123
  template <typename _Graph, typename _Item>
125 124
  struct DefaultMapSelector<_Graph, _Item, double> {
126 125
    typedef VectorMap<_Graph, _Item,  double> Map;
127 126
  };
128 127

	
129 128

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

	
136 135

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

	
143 142
// #else
144 143

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

	
150 149
// #endif
151 150

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

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

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

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

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

	
177 176
  };
178 177

	
179 178
}
180 179

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

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

	
22 22
// Boost enable_if library
23 23

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

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

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

	
34 34

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

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

	
41 41
namespace lemon
42 42
{
43 43

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

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

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

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

	
64 64

	
65 65

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

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

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

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

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

	
83 83

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

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

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

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

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

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

	
106 106

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

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

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

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

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

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

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

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

	
45 45
    // Base extensions
46 46

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

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

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

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

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

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

	
75 75
    // Alterable extension
76 76

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

	
80 80

	
81 81
  protected:
82 82

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

	
... ...
@@ -141,120 +141,120 @@
141 141

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

	
146 146
      OutArcIt() { }
147 147

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

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

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

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

	
163 163
    };
164 164

	
165 165

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

	
170 170
      InArcIt() { }
171 171

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

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

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

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

	
187 187
    };
188 188

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

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

	
217 217

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

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

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

	
235 235
      template <typename CMap>
236 236
      NodeMap& operator=(const CMap& cmap) {
237 237
        Parent::operator=(cmap);
238 238
        return *this;
239 239
      }
240 240

	
241 241
    };
242 242

	
243 243
    template <typename _Value>
244 244
    class ArcMap
245 245
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
246 246
    public:
247 247
      typedef DigraphExtender Digraph;
248 248
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
249 249

	
250 250
      explicit ArcMap(const Digraph& digraph)
251 251
        : Parent(digraph) {}
252 252
      ArcMap(const Digraph& digraph, const _Value& value)
253 253
        : Parent(digraph, value) {}
254 254

	
255 255
    private:
256 256
      ArcMap& operator=(const ArcMap& cmap) {
257 257
        return operator=<ArcMap>(cmap);
258 258
      }
259 259

	
260 260
      template <typename CMap>
... ...
@@ -280,99 +280,99 @@
280 280
    void clear() {
281 281
      notifier(Arc()).clear();
282 282
      notifier(Node()).clear();
283 283
      Parent::clear();
284 284
    }
285 285

	
286 286
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
287 287
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
288 288
      Parent::build(digraph, nodeRef, arcRef);
289 289
      notifier(Node()).build();
290 290
      notifier(Arc()).build();
291 291
    }
292 292

	
293 293
    void erase(const Node& node) {
294 294
      Arc arc;
295 295
      Parent::firstOut(arc, node);
296 296
      while (arc != INVALID ) {
297 297
        erase(arc);
298 298
        Parent::firstOut(arc, node);
299 299
      }
300 300

	
301 301
      Parent::firstIn(arc, node);
302 302
      while (arc != INVALID ) {
303 303
        erase(arc);
304 304
        Parent::firstIn(arc, node);
305 305
      }
306 306

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

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

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

	
321 321

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

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

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

	
338 338
    typedef True UndirectedTag;
339 339

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

	
344 344
    // Graph extension
345 345

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

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

	
354 354
    int maxId(Edge) const {
355 355
      return Parent::maxEdgeId();
356 356
    }
357 357

	
358 358
    Node fromId(int id, Node) const {
359 359
      return Parent::nodeFromId(id);
360 360
    }
361 361

	
362 362
    Arc fromId(int id, Arc) const {
363 363
      return Parent::arcFromId(id);
364 364
    }
365 365

	
366 366
    Edge fromId(int id, Edge) const {
367 367
      return Parent::edgeFromId(id);
368 368
    }
369 369

	
370 370
    Node oppositeNode(const Node &n, const Edge &e) const {
371 371
      if( n == Parent::u(e))
372 372
        return Parent::v(e);
373 373
      else if( n == Parent::v(e))
374 374
        return Parent::u(e);
375 375
      else
376 376
        return INVALID;
377 377
    }
378 378

	
... ...
@@ -510,133 +510,133 @@
510 510

	
511 511
    class EdgeIt : public Parent::Edge {
512 512
      const Graph* _graph;
513 513
    public:
514 514

	
515 515
      EdgeIt() { }
516 516

	
517 517
      EdgeIt(Invalid i) : Edge(i) { }
518 518

	
519 519
      explicit EdgeIt(const Graph& graph) : _graph(&graph) {
520 520
        _graph->first(static_cast<Edge&>(*this));
521 521
      }
522 522

	
523 523
      EdgeIt(const Graph& graph, const Edge& edge) :
524 524
        Edge(edge), _graph(&graph) { }
525 525

	
526 526
      EdgeIt& operator++() {
527 527
        _graph->next(*this);
528 528
        return *this;
529 529
      }
530 530

	
531 531
    };
532 532

	
533 533
    class IncEdgeIt : public Parent::Edge {
534 534
      friend class GraphExtender;
535 535
      const Graph* _graph;
536 536
      bool _direction;
537 537
    public:
538 538

	
539 539
      IncEdgeIt() { }
540 540

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

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

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

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

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

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

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

	
599 599
    // Mappable extension
600 600

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

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

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

	
618 618
      template <typename CMap>
619 619
      NodeMap& operator=(const CMap& cmap) {
620 620
        Parent::operator=(cmap);
621 621
        return *this;
622 622
      }
623 623

	
624 624
    };
625 625

	
626 626
    template <typename _Value>
627 627
    class ArcMap
628 628
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
629 629
    public:
630 630
      typedef GraphExtender Graph;
631 631
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
632 632

	
633 633
      ArcMap(const Graph& graph)
634 634
        : Parent(graph) {}
635 635
      ArcMap(const Graph& graph, const _Value& value)
636 636
        : Parent(graph, value) {}
637 637

	
638 638
    private:
639 639
      ArcMap& operator=(const ArcMap& cmap) {
640 640
        return operator=<ArcMap>(cmap);
641 641
      }
642 642

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

	
19 19
#ifndef LEMON_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

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

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

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

	
32 32
namespace lemon {
33 33

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

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

	
44 44

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

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

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

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

	
57 57
  public:
58 58

	
59 59
    MapExtender(const Graph& graph)
60 60
      : Parent(graph) {}
61 61

	
62 62
    MapExtender(const Graph& graph, const Value& value)
63 63
      : Parent(graph, value) {}
64 64

	
65 65
  private:
66 66
    MapExtender& operator=(const MapExtender& cmap) {
67 67
      return operator=<MapExtender>(cmap);
68 68
    }
69 69

	
70 70
    template <typename CMap>
71 71
    MapExtender& operator=(const CMap& cmap) {
72 72
      Parent::operator=(cmap);
73 73
      return *this;
74 74
    }
75 75

	
76 76
  public:
77 77
    class MapIt : public Item {
78 78
    public:
79 79

	
80 80
      typedef Item Parent;
81 81
      typedef typename Map::Value Value;
82 82

	
83 83
      MapIt() {}
84 84

	
... ...
@@ -126,99 +126,99 @@
126 126

	
127 127
      explicit ConstMapIt(Map& _map) : map(_map) {
128 128
        map.notifier()->first(*this);
129 129
      }
130 130

	
131 131
      ConstMapIt(const Map& _map, const Item& item)
132 132
        : Parent(item), map(_map) {}
133 133

	
134 134
      ConstMapIt& operator++() {
135 135
        map.notifier()->next(*this);
136 136
        return *this;
137 137
      }
138 138

	
139 139
      typename MapTraits<Map>::ConstReturnValue operator*() const {
140 140
        return map[*this];
141 141
      }
142 142

	
143 143
    protected:
144 144
      const Map& map;
145 145
    };
146 146

	
147 147
    class ItemIt : public Item {
148 148
    public:
149 149

	
150 150
      typedef Item Parent;
151 151

	
152 152
      ItemIt() {}
153 153

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

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

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

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

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

	
171 171
    };
172 172
  };
173 173

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

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

	
184 184
    typedef _Graph Graph;
185 185

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

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

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

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

	
197 197
  public:
198 198

	
199 199
    SubMapExtender(const Graph& _graph)
200 200
      : Parent(_graph), graph(_graph) {}
201 201

	
202 202
    SubMapExtender(const Graph& _graph, const Value& _value)
203 203
      : Parent(_graph, _value), graph(_graph) {}
204 204

	
205 205
  private:
206 206
    SubMapExtender& operator=(const SubMapExtender& cmap) {
207 207
      return operator=<MapExtender>(cmap);
208 208
    }
209 209

	
210 210
    template <typename CMap>
211 211
    SubMapExtender& operator=(const CMap& cmap) {
212 212
      checkConcept<concepts::ReadMap<Key, Value>, CMap>();
213 213
      Item it;
214 214
      for (graph.first(it); it != INVALID; graph.next(it)) {
215 215
        Parent::set(it, cmap[it]);
216 216
      }
217 217
      return *this;
218 218
    }
219 219

	
220 220
  public:
221 221
    class MapIt : public Item {
222 222
    public:
223 223

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

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

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

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

	
28 28
namespace lemon {
29 29

	
30 30
  struct InvalidType {};
31 31

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

	
35 35

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

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

	
52 52
    typedef _Graph Graph;
53 53

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

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

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

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

	
70 70
     };
71 71

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

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

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

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

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

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

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

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

	
56 56
  public:
57 57

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

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

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

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

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

	
83 83

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

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

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

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

	
124 124

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

	
142 142
  public:
143 143

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

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

	
160 160

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

	
168 168
  protected:
169 169

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

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

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

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

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

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

	
232 232
  private:
233 233

	
234 234
    Container container;
235 235

	
236 236
  };
237 237

	
238 238
}
239 239

	
240 240
#endif
Ignore white space 6 line context
... ...
@@ -47,97 +47,97 @@
47 47
    Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
48 48
    ///Set the red component
49 49
    double & red() {return _r;}
50 50
    ///Return the red component
51 51
    const double & red() const {return _r;}
52 52
    ///Set the green component
53 53
    double & green() {return _g;}
54 54
    ///Return the green component
55 55
    const double & green() const {return _g;}
56 56
    ///Set the blue component
57 57
    double & blue() {return _b;}
58 58
    ///Return the blue component
59 59
    const double & blue() const {return _b;}
60 60
    ///Set the color components
61 61
    void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
62 62
  };
63 63

	
64 64
  /// White color constant
65 65
  extern const Color WHITE;
66 66
  /// Black color constant
67 67
  extern const Color BLACK;
68 68
  /// Red color constant
69 69
  extern const Color RED;
70 70
  /// Green color constant
71 71
  extern const Color GREEN;
72 72
  /// Blue color constant
73 73
  extern const Color BLUE;
74 74
  /// Yellow color constant
75 75
  extern const Color YELLOW;
76 76
  /// Magenta color constant
77 77
  extern const Color MAGENTA;
78 78
  /// Cyan color constant
79 79
  extern const Color CYAN;
80 80
  /// Grey color constant
81 81
  extern const Color GREY;
82 82
  /// Dark red color constant
83 83
  extern const Color DARK_RED;
84 84
  /// Dark green color constant
85 85
  extern const Color DARK_GREEN;
86 86
  /// Drak blue color constant
87 87
  extern const Color DARK_BLUE;
88 88
  /// Dark yellow color constant
89 89
  extern const Color DARK_YELLOW;
90 90
  /// Dark magenta color constant
91 91
  extern const Color DARK_MAGENTA;
92 92
  /// Dark cyan color constant
93 93
  extern const Color DARK_CYAN;
94 94

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

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

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

	
111 111
    ///Constructor.
112 112
    ///\param have_white Indicates whether white is among the
113 113
    ///provided initial colors (\c true) or not (\c false). If it is true,
114 114
    ///white will be assigned to \c 0.
115 115
    ///\param num The number of the allocated colors. If it is \c -1,
116 116
    ///the default color configuration is set up (26 color plus optionaly the
117 117
    ///white).  If \c num is less then 26/27 then the default color
118 118
    ///list is cut. Otherwise the color list is filled repeatedly with
119 119
    ///the default color list.  (The colors can be changed later on.)
120 120
    Palette(bool have_white=false,int num=-1)
121 121
    {
122 122
      if (num==0) return;
123 123
      do {
124 124
        if(have_white) colors.push_back(Color(1,1,1));
125 125

	
126 126
        colors.push_back(Color(0,0,0));
127 127
        colors.push_back(Color(1,0,0));
128 128
        colors.push_back(Color(0,1,0));
129 129
        colors.push_back(Color(0,0,1));
130 130
        colors.push_back(Color(1,1,0));
131 131
        colors.push_back(Color(1,0,1));
132 132
        colors.push_back(Color(0,1,1));
133 133

	
134 134
        colors.push_back(Color(.5,0,0));
135 135
        colors.push_back(Color(0,.5,0));
136 136
        colors.push_back(Color(0,0,.5));
137 137
        colors.push_back(Color(.5,.5,0));
138 138
        colors.push_back(Color(.5,0,.5));
139 139
        colors.push_back(Color(0,.5,.5));
140 140

	
141 141
        colors.push_back(Color(.5,.5,.5));
142 142
        colors.push_back(Color(1,.5,.5));
143 143
        colors.push_back(Color(.5,1,.5));
Ignore white space 6 line context
... ...
@@ -937,97 +937,97 @@
937 937

	
938 938
    };
939 939

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

	
952 952
      typedef _Base Base;
953 953
      typedef typename Base::Edge Edge;
954 954

	
955 955

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

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

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

	
976 976
        const _Graph& graph;
977 977

	
978 978
      };
979 979

	
980 980
    };
981 981

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

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

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

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

	
1009 1009
    private:
1010 1010
      /// \brief Copy constructor.
1011 1011
      ///
1012 1012
      /// Copy Constructor.
1013 1013
      GraphMap(const GraphMap&) : Parent() {}
1014 1014

	
1015 1015
      /// \brief Assign operator.
1016 1016
      ///
1017 1017
      /// Assign operator. It does not mofify the underlying graph,
1018 1018
      /// it just iterates on the current item set and set the  map
1019 1019
      /// with the value returned by the assigned map.
1020 1020
      template <typename CMap>
1021 1021
      GraphMap& operator=(const CMap&) {
1022 1022
        checkConcept<ReadMap<Key, Value>, CMap>();
1023 1023
        return *this;
1024 1024
      }
1025 1025

	
1026 1026
    public:
1027 1027
      template<typename _Map>
1028 1028
      struct Constraints {
1029 1029
        void constraints() {
1030 1030
          checkConcept<ReadWriteMap<Key, Value>, _Map >();
1031 1031
          // Construction with a graph parameter
1032 1032
          _Map a(g);
1033 1033
          // Constructor with a graph and a default value parameter
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

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

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

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// Readable map concept
37 37

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

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

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

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

	
73 73
    };
74 74

	
75 75

	
76 76
    /// Writable map concept
77 77

	
78 78
    /// Writable map concept.
79 79
    ///
80 80
    template<typename K, typename T>
81 81
    class WriteMap
Ignore white space 6 line context
... ...
@@ -13,173 +13,173 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CORE_H
20 20
#define LEMON_CORE_H
21 21

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

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

	
28 28
///\file
29 29
///\brief LEMON core utilities.
30 30
///
31 31
///This header file contains core utilities for LEMON.
32 32
///It is automatically included by all graph types, therefore it usually
33 33
///do not have to be included directly.
34 34

	
35 35
namespace lemon {
36 36

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

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

	
58 58
  /// \addtogroup gutils
59 59
  /// @{
60 60

	
61
  ///Create convenient typedefs for the digraph types and iterators
61
  ///Create convenience typedefs for the digraph types and iterators
62 62

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

	
85
  ///Create convenient typedefs for the digraph types and iterators
85
  ///Create convenience typedefs for the digraph types and iterators
86 86

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

	
105
  ///Create convenient typedefs for the graph types and iterators
105
  ///Create convenience typedefs for the graph types and iterators
106 106

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

	
124
  ///Create convenient typedefs for the graph types and iterators
124
  ///Create convenience typedefs for the graph types and iterators
125 125

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

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

	
154 154
  // Node counting:
155 155

	
156 156
  namespace _core_bits {
157 157

	
158 158
    template <typename Graph, typename Enable = void>
159 159
    struct CountNodesSelector {
160 160
      static int count(const Graph &g) {
161 161
        return countItems<Graph, typename Graph::Node>(g);
162 162
      }
163 163
    };
164 164

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

	
176 176
  /// \brief Function to count the nodes in the graph.
177 177
  ///
178 178
  /// This function counts the nodes in the graph.
179 179
  /// The complexity of the function is <em>O</em>(<em>n</em>), but for some
180 180
  /// graph structures it is specialized to run in <em>O</em>(1).
181 181
  ///
182 182
  /// \note If the graph contains a \c nodeNum() member function and a
183 183
  /// \c NodeNumTag tag then this function calls directly the member
184 184
  /// function to query the cardinality of the node set.
185 185
  template <typename Graph>
... ...
@@ -1509,97 +1509,97 @@
1509 1509
          }
1510 1510
        } else {
1511 1511
          if (_parent[_parent[v]] == INVALID) {
1512 1512
            zag(v);
1513 1513
          } else {
1514 1514
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1515 1515
              zag(v);
1516 1516
              zig(v);
1517 1517
            } else {
1518 1518
              zag(_parent[v]);
1519 1519
              zag(v);
1520 1520
            }
1521 1521
          }
1522 1522
        }
1523 1523
      }
1524 1524
      _head[_g.source(v)] = v;
1525 1525
    }
1526 1526

	
1527 1527

	
1528 1528
  public:
1529 1529

	
1530 1530
    ///Find an arc between two nodes.
1531 1531

	
1532 1532
    ///Find an arc between two nodes.
1533 1533
    ///\param s The source node.
1534 1534
    ///\param t The target node.
1535 1535
    ///\param p The previous arc between \c s and \c t. It it is INVALID or
1536 1536
    ///not given, the operator finds the first appropriate arc.
1537 1537
    ///\return An arc from \c s to \c t after \c p or
1538 1538
    ///\ref INVALID if there is no more.
1539 1539
    ///
1540 1540
    ///For example, you can count the number of arcs from \c u to \c v in the
1541 1541
    ///following way.
1542 1542
    ///\code
1543 1543
    ///DynArcLookUp<ListDigraph> ae(g);
1544 1544
    ///...
1545 1545
    ///int n = 0;
1546 1546
    ///for(Arc a = ae(u,v); a != INVALID; a = ae(u,v,a)) n++;
1547 1547
    ///\endcode
1548 1548
    ///
1549 1549
    ///Finding the arcs take at most <em>O</em>(log<em>d</em>)
1550 1550
    ///amortized time, specifically, the time complexity of the lookups
1551 1551
    ///is equal to the optimal search tree implementation for the
1552 1552
    ///current query distribution in a constant factor.
1553 1553
    ///
1554 1554
    ///\note This is a dynamic data structure, therefore the data
1555 1555
    ///structure is updated after each graph alteration. Thus although
1556 1556
    ///this data structure is theoretically faster than \ref ArcLookUp
1557
    ///and \ref AllArcLookup, it often provides worse performance than
1557
    ///and \ref AllArcLookUp, it often provides worse performance than
1558 1558
    ///them.
1559 1559
    Arc operator()(Node s, Node t, Arc p = INVALID) const  {
1560 1560
      if (p == INVALID) {
1561 1561
        Arc a = _head[s];
1562 1562
        if (a == INVALID) return INVALID;
1563 1563
        Arc r = INVALID;
1564 1564
        while (true) {
1565 1565
          if (_g.target(a) < t) {
1566 1566
            if (_right[a] == INVALID) {
1567 1567
              const_cast<DynArcLookUp&>(*this).splay(a);
1568 1568
              return r;
1569 1569
            } else {
1570 1570
              a = _right[a];
1571 1571
            }
1572 1572
          } else {
1573 1573
            if (_g.target(a) == t) {
1574 1574
              r = a;
1575 1575
            }
1576 1576
            if (_left[a] == INVALID) {
1577 1577
              const_cast<DynArcLookUp&>(*this).splay(a);
1578 1578
              return r;
1579 1579
            } else {
1580 1580
              a = _left[a];
1581 1581
            }
1582 1582
          }
1583 1583
        }
1584 1584
      } else {
1585 1585
        Arc a = p;
1586 1586
        if (_right[a] != INVALID) {
1587 1587
          a = _right[a];
1588 1588
          while (_left[a] != INVALID) {
1589 1589
            a = _left[a];
1590 1590
          }
1591 1591
          const_cast<DynArcLookUp&>(*this).splay(a);
1592 1592
        } else {
1593 1593
          while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
1594 1594
            a = _parent[a];
1595 1595
          }
1596 1596
          if (_parent[a] == INVALID) {
1597 1597
            return INVALID;
1598 1598
          } else {
1599 1599
            a = _parent[a];
1600 1600
            const_cast<DynArcLookUp&>(*this).splay(a);
1601 1601
          }
1602 1602
        }
1603 1603
        if (_g.target(a) == t) return a;
1604 1604
        else return INVALID;
1605 1605
      }
... ...
@@ -1654,98 +1654,98 @@
1654 1654

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

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

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

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

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

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

	
1721 1721
  };
1722 1722

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

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

	
1746 1746
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1747 1747
    typedef G Digraph;
1748 1748

	
1749 1749
    typename Digraph::template ArcMap<Arc> _next;
1750 1750

	
1751 1751
    Arc refreshNext(Arc head,Arc next=INVALID)
... ...
@@ -1772,73 +1772,73 @@
1772 1772
    ///It builds up the search database, which remains valid until the digraph
1773 1773
    ///changes.
1774 1774
    AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
1775 1775

	
1776 1776
    ///Refresh the data structure at a node.
1777 1777

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

	
1788 1788
    ///Refresh the full data structure.
1789 1789

	
1790 1790
    ///Build up the full search database. In fact, it simply calls
1791 1791
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1792 1792
    ///
1793 1793
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
1794 1794
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
1795 1795
    ///out-degree of the digraph.
1796 1796
    void refresh()
1797 1797
    {
1798 1798
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
1799 1799
    }
1800 1800

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

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

	
1838 1838
  };
1839 1839

	
1840 1840
  /// @}
1841 1841

	
1842 1842
} //namespace lemon
1843 1843

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

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

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

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

	
34 34
namespace lemon {
35 35

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

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

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

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

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

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

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

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

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

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

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

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

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

	
113 113
  ///%DFS algorithm class.
114 114

	
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %DFS algorithm.
117 117
  ///
118 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
119 119
  ///algorithm, which is convenient in the simplier cases and it can be
120 120
  ///used easier.
121 121
  ///
122 122
  ///\tparam GR The type of the digraph the algorithm runs on.
123 123
  ///The default value is \ref ListDigraph. The value of GR is not used
124 124
  ///directly by \ref Dfs, it is only passed to \ref DfsDefaultTraits.
125 125
  ///\tparam TR Traits class to set various data types used by the algorithm.
126 126
  ///The default traits class is
127 127
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
128 128
  ///See \ref DfsDefaultTraits for the documentation of
129 129
  ///a Dfs traits class.
130 130
#ifdef DOXYGEN
131 131
  template <typename GR,
132 132
            typename TR>
133 133
#else
134 134
  template <typename GR=ListDigraph,
135 135
            typename TR=DfsDefaultTraits<GR> >
136 136
#endif
137 137
  class Dfs {
138 138
  public:
139 139

	
140 140
    ///The type of the digraph the algorithm runs on.
141 141
    typedef typename TR::Digraph Digraph;
142 142

	
143 143
    ///\brief The type of the map that stores the predecessor arcs of the
144 144
    ///DFS paths.
145 145
    typedef typename TR::PredMap PredMap;
146 146
    ///The type of the map that stores the distances of the nodes.
147 147
    typedef typename TR::DistMap DistMap;
148 148
    ///The type of the map that indicates which nodes are reached.
149 149
    typedef typename TR::ReachedMap ReachedMap;
150 150
    ///The type of the map that indicates which nodes are processed.
151 151
    typedef typename TR::ProcessedMap ProcessedMap;
152 152
    ///The type of the paths.
153 153
    typedef PredMapPath<Digraph, PredMap> Path;
154 154

	
... ...
@@ -182,174 +182,174 @@
182 182
    bool local_processed;
183 183

	
184 184
    std::vector<typename Digraph::OutArcIt> _stack;
185 185
    int _stack_head;
186 186

	
187 187
    //Creates the maps if necessary.
188 188
    void create_maps()
189 189
    {
190 190
      if(!_pred) {
191 191
        local_pred = true;
192 192
        _pred = Traits::createPredMap(*G);
193 193
      }
194 194
      if(!_dist) {
195 195
        local_dist = true;
196 196
        _dist = Traits::createDistMap(*G);
197 197
      }
198 198
      if(!_reached) {
199 199
        local_reached = true;
200 200
        _reached = Traits::createReachedMap(*G);
201 201
      }
202 202
      if(!_processed) {
203 203
        local_processed = true;
204 204
        _processed = Traits::createProcessedMap(*G);
205 205
      }
206 206
    }
207 207

	
208 208
  protected:
209 209

	
210 210
    Dfs() {}
211 211

	
212 212
  public:
213 213

	
214 214
    typedef Dfs Create;
215 215

	
216 216
    ///\name Named template parameters
217 217

	
218 218
    ///@{
219 219

	
220 220
    template <class T>
221 221
    struct SetPredMapTraits : public Traits {
222 222
      typedef T PredMap;
223 223
      static PredMap *createPredMap(const Digraph &)
224 224
      {
225 225
        LEMON_ASSERT(false, "PredMap is not initialized");
226 226
        return 0; // ignore warnings
227 227
      }
228 228
    };
229 229
    ///\brief \ref named-templ-param "Named parameter" for setting
230
    ///\ref PredMap type.
230
    ///PredMap type.
231 231
    ///
232 232
    ///\ref named-templ-param "Named parameter" for setting
233
    ///\ref PredMap type.
233
    ///PredMap type.
234 234
    template <class T>
235 235
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
236 236
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
237 237
    };
238 238

	
239 239
    template <class T>
240 240
    struct SetDistMapTraits : public Traits {
241 241
      typedef T DistMap;
242 242
      static DistMap *createDistMap(const Digraph &)
243 243
      {
244 244
        LEMON_ASSERT(false, "DistMap is not initialized");
245 245
        return 0; // ignore warnings
246 246
      }
247 247
    };
248 248
    ///\brief \ref named-templ-param "Named parameter" for setting
249
    ///\ref DistMap type.
249
    ///DistMap type.
250 250
    ///
251 251
    ///\ref named-templ-param "Named parameter" for setting
252
    ///\ref DistMap type.
252
    ///DistMap type.
253 253
    template <class T>
254 254
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
255 255
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
256 256
    };
257 257

	
258 258
    template <class T>
259 259
    struct SetReachedMapTraits : public Traits {
260 260
      typedef T ReachedMap;
261 261
      static ReachedMap *createReachedMap(const Digraph &)
262 262
      {
263 263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264 264
        return 0; // ignore warnings
265 265
      }
266 266
    };
267 267
    ///\brief \ref named-templ-param "Named parameter" for setting
268
    ///\ref ReachedMap type.
268
    ///ReachedMap type.
269 269
    ///
270 270
    ///\ref named-templ-param "Named parameter" for setting
271
    ///\ref ReachedMap type.
271
    ///ReachedMap type.
272 272
    template <class T>
273 273
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
274 274
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
275 275
    };
276 276

	
277 277
    template <class T>
278 278
    struct SetProcessedMapTraits : public Traits {
279 279
      typedef T ProcessedMap;
280 280
      static ProcessedMap *createProcessedMap(const Digraph &)
281 281
      {
282 282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283 283
        return 0; // ignore warnings
284 284
      }
285 285
    };
286 286
    ///\brief \ref named-templ-param "Named parameter" for setting
287
    ///\ref ProcessedMap type.
287
    ///ProcessedMap type.
288 288
    ///
289 289
    ///\ref named-templ-param "Named parameter" for setting
290
    ///\ref ProcessedMap type.
290
    ///ProcessedMap type.
291 291
    template <class T>
292 292
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
293 293
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
294 294
    };
295 295

	
296 296
    struct SetStandardProcessedMapTraits : public Traits {
297 297
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
298 298
      static ProcessedMap *createProcessedMap(const Digraph &g)
299 299
      {
300 300
        return new ProcessedMap(g);
301 301
      }
302 302
    };
303 303
    ///\brief \ref named-templ-param "Named parameter" for setting
304
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 305
    ///
306 306
    ///\ref named-templ-param "Named parameter" for setting
307
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
308 308
    ///If you don't set it explicitly, it will be automatically allocated.
309 309
    struct SetStandardProcessedMap :
310 310
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
311 311
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
312 312
    };
313 313

	
314 314
    ///@}
315 315

	
316 316
  public:
317 317

	
318 318
    ///Constructor.
319 319

	
320 320
    ///Constructor.
321 321
    ///\param g The digraph the algorithm runs on.
322 322
    Dfs(const Digraph &g) :
323 323
      G(&g),
324 324
      _pred(NULL), local_pred(false),
325 325
      _dist(NULL), local_dist(false),
326 326
      _reached(NULL), local_reached(false),
327 327
      _processed(NULL), local_processed(false)
328 328
    { }
329 329

	
330 330
    ///Destructor.
331 331
    ~Dfs()
332 332
    {
333 333
      if(local_pred) delete _pred;
334 334
      if(local_dist) delete _dist;
335 335
      if(local_reached) delete _reached;
336 336
      if(local_processed) delete _processed;
337 337
    }
338 338

	
339 339
    ///Sets the map that stores the predecessor arcs.
340 340

	
341 341
    ///Sets the map that stores the predecessor arcs.
342 342
    ///If you don't use this function before calling \ref run(),
343 343
    ///it will allocate one. The destructor deallocates this
344 344
    ///automatically allocated map, of course.
345 345
    ///\return <tt> (*this) </tt>
346 346
    Dfs &predMap(PredMap &m)
347 347
    {
348 348
      if(local_pred) {
349 349
        delete _pred;
350 350
        local_pred=false;
351 351
      }
352 352
      _pred = &m;
353 353
      return *this;
354 354
    }
355 355

	
... ...
@@ -723,164 +723,164 @@
723 723

	
724 724
    ///\brief Returns a const reference to the node map that stores the
725 725
    ///distances of the nodes.
726 726
    ///
727 727
    ///Returns a const reference to the node map that stores the
728 728
    ///distances of the nodes calculated by the algorithm.
729 729
    ///
730 730
    ///\pre Either \ref run() or \ref init()
731 731
    ///must be called before using this function.
732 732
    const DistMap &distMap() const { return *_dist;}
733 733

	
734 734
    ///\brief Returns a const reference to the node map that stores the
735 735
    ///predecessor arcs.
736 736
    ///
737 737
    ///Returns a const reference to the node map that stores the predecessor
738 738
    ///arcs, which form the DFS tree.
739 739
    ///
740 740
    ///\pre Either \ref run() or \ref init()
741 741
    ///must be called before using this function.
742 742
    const PredMap &predMap() const { return *_pred;}
743 743

	
744 744
    ///Checks if a node is reachable from the root(s).
745 745

	
746 746
    ///Returns \c true if \c v is reachable from the root(s).
747 747
    ///\pre Either \ref run() or \ref start()
748 748
    ///must be called before using this function.
749 749
    bool reached(Node v) const { return (*_reached)[v]; }
750 750

	
751 751
    ///@}
752 752
  };
753 753

	
754 754
  ///Default traits class of dfs() function.
755 755

	
756 756
  ///Default traits class of dfs() function.
757 757
  ///\tparam GR Digraph type.
758 758
  template<class GR>
759 759
  struct DfsWizardDefaultTraits
760 760
  {
761 761
    ///The type of the digraph the algorithm runs on.
762 762
    typedef GR Digraph;
763 763

	
764 764
    ///\brief The type of the map that stores the predecessor
765 765
    ///arcs of the %DFS paths.
766 766
    ///
767 767
    ///The type of the map that stores the predecessor
768 768
    ///arcs of the %DFS paths.
769 769
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
770 770
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
771
    ///Instantiates a \ref PredMap.
771
    ///Instantiates a PredMap.
772 772

	
773
    ///This function instantiates a \ref PredMap.
773
    ///This function instantiates a PredMap.
774 774
    ///\param g is the digraph, to which we would like to define the
775
    ///\ref PredMap.
775
    ///PredMap.
776 776
    static PredMap *createPredMap(const Digraph &g)
777 777
    {
778 778
      return new PredMap(g);
779 779
    }
780 780

	
781 781
    ///The type of the map that indicates which nodes are processed.
782 782

	
783 783
    ///The type of the map that indicates which nodes are processed.
784 784
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
785 785
    ///By default it is a NullMap.
786 786
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
787
    ///Instantiates a \ref ProcessedMap.
787
    ///Instantiates a ProcessedMap.
788 788

	
789
    ///This function instantiates a \ref ProcessedMap.
789
    ///This function instantiates a ProcessedMap.
790 790
    ///\param g is the digraph, to which
791
    ///we would like to define the \ref ProcessedMap.
791
    ///we would like to define the ProcessedMap.
792 792
#ifdef DOXYGEN
793 793
    static ProcessedMap *createProcessedMap(const Digraph &g)
794 794
#else
795 795
    static ProcessedMap *createProcessedMap(const Digraph &)
796 796
#endif
797 797
    {
798 798
      return new ProcessedMap();
799 799
    }
800 800

	
801 801
    ///The type of the map that indicates which nodes are reached.
802 802

	
803 803
    ///The type of the map that indicates which nodes are reached.
804 804
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
805 805
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
806
    ///Instantiates a \ref ReachedMap.
806
    ///Instantiates a ReachedMap.
807 807

	
808
    ///This function instantiates a \ref ReachedMap.
808
    ///This function instantiates a ReachedMap.
809 809
    ///\param g is the digraph, to which
810
    ///we would like to define the \ref ReachedMap.
810
    ///we would like to define the ReachedMap.
811 811
    static ReachedMap *createReachedMap(const Digraph &g)
812 812
    {
813 813
      return new ReachedMap(g);
814 814
    }
815 815

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

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

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

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

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

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

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

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

	
855 855
    //Pointer to the digraph the algorithm runs on.
856 856
    void *_g;
857 857
    //Pointer to the map of reached nodes.
858 858
    void *_reached;
859 859
    //Pointer to the map of processed nodes.
860 860
    void *_processed;
861 861
    //Pointer to the map of predecessors arcs.
862 862
    void *_pred;
863 863
    //Pointer to the map of distances.
864 864
    void *_dist;
865 865
    //Pointer to the DFS path to the target node.
866 866
    void *_path;
867 867
    //Pointer to the distance of the target node.
868 868
    int *_di;
869 869

	
870 870
    public:
871 871
    /// Constructor.
872 872

	
873 873
    /// This constructor does not require parameters, therefore it initiates
874 874
    /// all of the attributes to \c 0.
875 875
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
876 876
                      _dist(0), _path(0), _di(0) {}
877 877

	
878 878
    /// Constructor.
879 879

	
880 880
    /// This constructor requires one parameter,
881 881
    /// others are initiated to \c 0.
882 882
    /// \param g The digraph the algorithm runs on.
883 883
    DfsWizardBase(const GR &g) :
884 884
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
885 885
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
886 886

	
... ...
@@ -956,154 +956,154 @@
956 956
      if (s!=INVALID)
957 957
        alg.run(s);
958 958
      else
959 959
        alg.run();
960 960
    }
961 961

	
962 962
    ///Finds the DFS path between \c s and \c t.
963 963

	
964 964
    ///This method runs DFS algorithm from node \c s
965 965
    ///in order to compute the DFS path to node \c t
966 966
    ///(it stops searching when \c t is processed).
967 967
    ///
968 968
    ///\return \c true if \c t is reachable form \c s.
969 969
    bool run(Node s, Node t)
970 970
    {
971 971
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
972 972
      if (Base::_pred)
973 973
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
974 974
      if (Base::_dist)
975 975
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
976 976
      if (Base::_reached)
977 977
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
978 978
      if (Base::_processed)
979 979
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
980 980
      alg.run(s,t);
981 981
      if (Base::_path)
982 982
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
983 983
      if (Base::_di)
984 984
        *Base::_di = alg.dist(t);
985 985
      return alg.reached(t);
986 986
      }
987 987

	
988 988
    ///Runs DFS algorithm to visit all nodes in the digraph.
989 989

	
990 990
    ///This method runs DFS algorithm in order to compute
991 991
    ///the DFS path to each node.
992 992
    void run()
993 993
    {
994 994
      run(INVALID);
995 995
    }
996 996

	
997 997
    template<class T>
998 998
    struct SetPredMapBase : public Base {
999 999
      typedef T PredMap;
1000 1000
      static PredMap *createPredMap(const Digraph &) { return 0; };
1001 1001
      SetPredMapBase(const TR &b) : TR(b) {}
1002 1002
    };
1003 1003
    ///\brief \ref named-func-param "Named parameter"
1004
    ///for setting \ref PredMap object.
1004
    ///for setting PredMap object.
1005 1005
    ///
1006 1006
    ///\ref named-func-param "Named parameter"
1007
    ///for setting \ref PredMap object.
1007
    ///for setting PredMap object.
1008 1008
    template<class T>
1009 1009
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1010 1010
    {
1011 1011
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1012 1012
      return DfsWizard<SetPredMapBase<T> >(*this);
1013 1013
    }
1014 1014

	
1015 1015
    template<class T>
1016 1016
    struct SetReachedMapBase : public Base {
1017 1017
      typedef T ReachedMap;
1018 1018
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1019 1019
      SetReachedMapBase(const TR &b) : TR(b) {}
1020 1020
    };
1021 1021
    ///\brief \ref named-func-param "Named parameter"
1022
    ///for setting \ref ReachedMap object.
1022
    ///for setting ReachedMap object.
1023 1023
    ///
1024 1024
    /// \ref named-func-param "Named parameter"
1025
    ///for setting \ref ReachedMap object.
1025
    ///for setting ReachedMap object.
1026 1026
    template<class T>
1027 1027
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1028 1028
    {
1029 1029
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1030 1030
      return DfsWizard<SetReachedMapBase<T> >(*this);
1031 1031
    }
1032 1032

	
1033 1033
    template<class T>
1034 1034
    struct SetDistMapBase : public Base {
1035 1035
      typedef T DistMap;
1036 1036
      static DistMap *createDistMap(const Digraph &) { return 0; };
1037 1037
      SetDistMapBase(const TR &b) : TR(b) {}
1038 1038
    };
1039 1039
    ///\brief \ref named-func-param "Named parameter"
1040
    ///for setting \ref DistMap object.
1040
    ///for setting DistMap object.
1041 1041
    ///
1042 1042
    /// \ref named-func-param "Named parameter"
1043
    ///for setting \ref DistMap object.
1043
    ///for setting DistMap object.
1044 1044
    template<class T>
1045 1045
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1046 1046
    {
1047 1047
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1048 1048
      return DfsWizard<SetDistMapBase<T> >(*this);
1049 1049
    }
1050 1050

	
1051 1051
    template<class T>
1052 1052
    struct SetProcessedMapBase : public Base {
1053 1053
      typedef T ProcessedMap;
1054 1054
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1055 1055
      SetProcessedMapBase(const TR &b) : TR(b) {}
1056 1056
    };
1057 1057
    ///\brief \ref named-func-param "Named parameter"
1058
    ///for setting \ref ProcessedMap object.
1058
    ///for setting ProcessedMap object.
1059 1059
    ///
1060 1060
    /// \ref named-func-param "Named parameter"
1061
    ///for setting \ref ProcessedMap object.
1061
    ///for setting ProcessedMap object.
1062 1062
    template<class T>
1063 1063
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1064 1064
    {
1065 1065
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1066 1066
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1067 1067
    }
1068 1068

	
1069 1069
    template<class T>
1070 1070
    struct SetPathBase : public Base {
1071 1071
      typedef T Path;
1072 1072
      SetPathBase(const TR &b) : TR(b) {}
1073 1073
    };
1074 1074
    ///\brief \ref named-func-param "Named parameter"
1075 1075
    ///for getting the DFS path to the target node.
1076 1076
    ///
1077 1077
    ///\ref named-func-param "Named parameter"
1078 1078
    ///for getting the DFS path to the target node.
1079 1079
    template<class T>
1080 1080
    DfsWizard<SetPathBase<T> > path(const T &t)
1081 1081
    {
1082 1082
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1083 1083
      return DfsWizard<SetPathBase<T> >(*this);
1084 1084
    }
1085 1085

	
1086 1086
    ///\brief \ref named-func-param "Named parameter"
1087 1087
    ///for getting the distance of the target node.
1088 1088
    ///
1089 1089
    ///\ref named-func-param "Named parameter"
1090 1090
    ///for getting the distance of the target node.
1091 1091
    DfsWizard dist(const int &d)
1092 1092
    {
1093 1093
      Base::_di=const_cast<int*>(&d);
1094 1094
      return *this;
1095 1095
    }
1096 1096

	
1097 1097
  };
1098 1098

	
1099 1099
  ///Function-type interface for DFS algorithm.
1100 1100

	
1101 1101
  ///\ingroup search
1102 1102
  ///Function-type interface for DFS algorithm.
1103 1103
  ///
1104 1104
  ///This function also has several \ref named-func-param "named parameters",
1105 1105
  ///they are declared as the members of class \ref DfsWizard.
1106 1106
  ///The following examples show how to use these parameters.
1107 1107
  ///\code
1108 1108
  ///  // Compute the DFS tree
1109 1109
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
... ...
@@ -1168,101 +1168,101 @@
1168 1168
#else
1169 1169
  template <typename _Digraph>
1170 1170
  struct DfsVisitor {
1171 1171
    typedef _Digraph Digraph;
1172 1172
    typedef typename Digraph::Arc Arc;
1173 1173
    typedef typename Digraph::Node Node;
1174 1174
    void start(const Node&) {}
1175 1175
    void stop(const Node&) {}
1176 1176
    void reach(const Node&) {}
1177 1177
    void discover(const Arc&) {}
1178 1178
    void examine(const Arc&) {}
1179 1179
    void leave(const Node&) {}
1180 1180
    void backtrack(const Arc&) {}
1181 1181

	
1182 1182
    template <typename _Visitor>
1183 1183
    struct Constraints {
1184 1184
      void constraints() {
1185 1185
        Arc arc;
1186 1186
        Node node;
1187 1187
        visitor.start(node);
1188 1188
        visitor.stop(arc);
1189 1189
        visitor.reach(node);
1190 1190
        visitor.discover(arc);
1191 1191
        visitor.examine(arc);
1192 1192
        visitor.leave(node);
1193 1193
        visitor.backtrack(arc);
1194 1194
      }
1195 1195
      _Visitor& visitor;
1196 1196
    };
1197 1197
  };
1198 1198
#endif
1199 1199

	
1200 1200
  /// \brief Default traits class of DfsVisit class.
1201 1201
  ///
1202 1202
  /// Default traits class of DfsVisit class.
1203 1203
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1204 1204
  template<class _Digraph>
1205 1205
  struct DfsVisitDefaultTraits {
1206 1206

	
1207 1207
    /// \brief The type of the digraph the algorithm runs on.
1208 1208
    typedef _Digraph Digraph;
1209 1209

	
1210 1210
    /// \brief The type of the map that indicates which nodes are reached.
1211 1211
    ///
1212 1212
    /// The type of the map that indicates which nodes are reached.
1213 1213
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1214 1214
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1215 1215

	
1216
    /// \brief Instantiates a \ref ReachedMap.
1216
    /// \brief Instantiates a ReachedMap.
1217 1217
    ///
1218
    /// This function instantiates a \ref ReachedMap.
1218
    /// This function instantiates a ReachedMap.
1219 1219
    /// \param digraph is the digraph, to which
1220
    /// we would like to define the \ref ReachedMap.
1220
    /// we would like to define the ReachedMap.
1221 1221
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1222 1222
      return new ReachedMap(digraph);
1223 1223
    }
1224 1224

	
1225 1225
  };
1226 1226

	
1227 1227
  /// \ingroup search
1228 1228
  ///
1229 1229
  /// \brief %DFS algorithm class with visitor interface.
1230 1230
  ///
1231 1231
  /// This class provides an efficient implementation of the %DFS algorithm
1232 1232
  /// with visitor interface.
1233 1233
  ///
1234 1234
  /// The %DfsVisit class provides an alternative interface to the Dfs
1235 1235
  /// class. It works with callback mechanism, the DfsVisit object calls
1236 1236
  /// the member functions of the \c Visitor class on every DFS event.
1237 1237
  ///
1238 1238
  /// This interface of the DFS algorithm should be used in special cases
1239 1239
  /// when extra actions have to be performed in connection with certain
1240 1240
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1241 1241
  /// instead.
1242 1242
  ///
1243 1243
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1244 1244
  /// The default value is
1245 1245
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1246 1246
  /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1247 1247
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1248 1248
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
1249 1249
  /// does not observe the DFS events. If you want to observe the DFS
1250 1250
  /// events, you should implement your own visitor class.
1251 1251
  /// \tparam _Traits Traits class to set various data types used by the
1252 1252
  /// algorithm. The default traits class is
1253 1253
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1254 1254
  /// See \ref DfsVisitDefaultTraits for the documentation of
1255 1255
  /// a DFS visit traits class.
1256 1256
#ifdef DOXYGEN
1257 1257
  template <typename _Digraph, typename _Visitor, typename _Traits>
1258 1258
#else
1259 1259
  template <typename _Digraph = ListDigraph,
1260 1260
            typename _Visitor = DfsVisitor<_Digraph>,
1261 1261
            typename _Traits = DfsVisitDefaultTraits<_Digraph> >
1262 1262
#endif
1263 1263
  class DfsVisit {
1264 1264
  public:
1265 1265

	
1266 1266
    ///The traits class.
1267 1267
    typedef _Traits Traits;
1268 1268

	
Ignore white space 96 line context
... ...
@@ -94,136 +94,136 @@
94 94
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
95 95
    typedef LM LengthMap;
96 96
    ///The type of the length of the arcs.
97 97
    typedef typename LM::Value Value;
98 98

	
99 99
    /// Operation traits for Dijkstra algorithm.
100 100

	
101 101
    /// This class defines the operations that are used in the algorithm.
102 102
    /// \see DijkstraDefaultOperationTraits
103 103
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
104 104

	
105 105
    /// The cross reference type used by the heap.
106 106

	
107 107
    /// The cross reference type used by the heap.
108 108
    /// Usually it is \c Digraph::NodeMap<int>.
109 109
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
110 110
    ///Instantiates a \ref HeapCrossRef.
111 111

	
112 112
    ///This function instantiates a \ref HeapCrossRef.
113 113
    /// \param g is the digraph, to which we would like to define the
114 114
    /// \ref HeapCrossRef.
115 115
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
116 116
    {
117 117
      return new HeapCrossRef(g);
118 118
    }
119 119

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

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

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

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

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

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

	
154 154
    ///The type of the map that indicates which nodes are processed.
155 155
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
156 156
    ///By default it is a NullMap.
157 157
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
158
    ///Instantiates a \ref ProcessedMap.
158
    ///Instantiates a ProcessedMap.
159 159

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

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

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

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

	
188 188
  ///%Dijkstra algorithm class.
189 189

	
190 190
  /// \ingroup shortest_path
191 191
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
192 192
  ///
193 193
  ///The arc lengths are passed to the algorithm using a
194 194
  ///\ref concepts::ReadMap "ReadMap",
195 195
  ///so it is easy to change it to any kind of length.
196 196
  ///The type of the length is determined by the
197 197
  ///\ref concepts::ReadMap::Value "Value" of the length map.
198 198
  ///It is also possible to change the underlying priority heap.
199 199
  ///
200 200
  ///There is also a \ref dijkstra() "function-type interface" for the
201 201
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
202 202
  ///it can be used easier.
203 203
  ///
204 204
  ///\tparam GR The type of the digraph the algorithm runs on.
205 205
  ///The default value is \ref ListDigraph.
206 206
  ///The value of GR is not used directly by \ref Dijkstra, it is only
207 207
  ///passed to \ref DijkstraDefaultTraits.
208 208
  ///\tparam LM A readable arc map that determines the lengths of the
209 209
  ///arcs. It is read once for each arc, so the map may involve in
210 210
  ///relatively time consuming process to compute the arc lengths if
211 211
  ///it is necessary. The default map type is \ref
212 212
  ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
213 213
  ///The value of LM is not used directly by \ref Dijkstra, it is only
214 214
  ///passed to \ref DijkstraDefaultTraits.
215 215
  ///\tparam TR Traits class to set various data types used by the algorithm.
216 216
  ///The default traits class is \ref DijkstraDefaultTraits
217 217
  ///"DijkstraDefaultTraits<GR,LM>". See \ref DijkstraDefaultTraits
218 218
  ///for the documentation of a Dijkstra traits class.
219 219
#ifdef DOXYGEN
220 220
  template <typename GR, typename LM, typename TR>
221 221
#else
222 222
  template <typename GR=ListDigraph,
223 223
            typename LM=typename GR::template ArcMap<int>,
224 224
            typename TR=DijkstraDefaultTraits<GR,LM> >
225 225
#endif
226 226
  class Dijkstra {
227 227
  public:
228 228

	
229 229
    ///The type of the digraph the algorithm runs on.
... ...
@@ -282,223 +282,223 @@
282 282
    //Pointer to the heap.
283 283
    Heap *_heap;
284 284
    //Indicates if _heap is locally allocated (true) or not.
285 285
    bool local_heap;
286 286

	
287 287
    //Creates the maps if necessary.
288 288
    void create_maps()
289 289
    {
290 290
      if(!_pred) {
291 291
        local_pred = true;
292 292
        _pred = Traits::createPredMap(*G);
293 293
      }
294 294
      if(!_dist) {
295 295
        local_dist = true;
296 296
        _dist = Traits::createDistMap(*G);
297 297
      }
298 298
      if(!_processed) {
299 299
        local_processed = true;
300 300
        _processed = Traits::createProcessedMap(*G);
301 301
      }
302 302
      if (!_heap_cross_ref) {
303 303
        local_heap_cross_ref = true;
304 304
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
305 305
      }
306 306
      if (!_heap) {
307 307
        local_heap = true;
308 308
        _heap = Traits::createHeap(*_heap_cross_ref);
309 309
      }
310 310
    }
311 311

	
312 312
  public:
313 313

	
314 314
    typedef Dijkstra Create;
315 315

	
316 316
    ///\name Named template parameters
317 317

	
318 318
    ///@{
319 319

	
320 320
    template <class T>
321 321
    struct SetPredMapTraits : public Traits {
322 322
      typedef T PredMap;
323 323
      static PredMap *createPredMap(const Digraph &)
324 324
      {
325 325
        LEMON_ASSERT(false, "PredMap is not initialized");
326 326
        return 0; // ignore warnings
327 327
      }
328 328
    };
329 329
    ///\brief \ref named-templ-param "Named parameter" for setting
330
    ///\ref PredMap type.
330
    ///PredMap type.
331 331
    ///
332 332
    ///\ref named-templ-param "Named parameter" for setting
333
    ///\ref PredMap type.
333
    ///PredMap type.
334 334
    template <class T>
335 335
    struct SetPredMap
336 336
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
337 337
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
338 338
    };
339 339

	
340 340
    template <class T>
341 341
    struct SetDistMapTraits : public Traits {
342 342
      typedef T DistMap;
343 343
      static DistMap *createDistMap(const Digraph &)
344 344
      {
345 345
        LEMON_ASSERT(false, "DistMap is not initialized");
346 346
        return 0; // ignore warnings
347 347
      }
348 348
    };
349 349
    ///\brief \ref named-templ-param "Named parameter" for setting
350
    ///\ref DistMap type.
350
    ///DistMap type.
351 351
    ///
352 352
    ///\ref named-templ-param "Named parameter" for setting
353
    ///\ref DistMap type.
353
    ///DistMap type.
354 354
    template <class T>
355 355
    struct SetDistMap
356 356
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
357 357
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
358 358
    };
359 359

	
360 360
    template <class T>
361 361
    struct SetProcessedMapTraits : public Traits {
362 362
      typedef T ProcessedMap;
363 363
      static ProcessedMap *createProcessedMap(const Digraph &)
364 364
      {
365 365
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
366 366
        return 0; // ignore warnings
367 367
      }
368 368
    };
369 369
    ///\brief \ref named-templ-param "Named parameter" for setting
370
    ///\ref ProcessedMap type.
370
    ///ProcessedMap type.
371 371
    ///
372 372
    ///\ref named-templ-param "Named parameter" for setting
373
    ///\ref ProcessedMap type.
373
    ///ProcessedMap type.
374 374
    template <class T>
375 375
    struct SetProcessedMap
376 376
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
377 377
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
378 378
    };
379 379

	
380 380
    struct SetStandardProcessedMapTraits : public Traits {
381 381
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
382 382
      static ProcessedMap *createProcessedMap(const Digraph &g)
383 383
      {
384 384
        return new ProcessedMap(g);
385 385
      }
386 386
    };
387 387
    ///\brief \ref named-templ-param "Named parameter" for setting
388
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
388
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
389 389
    ///
390 390
    ///\ref named-templ-param "Named parameter" for setting
391
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
391
    ///ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
392 392
    ///If you don't set it explicitly, it will be automatically allocated.
393 393
    struct SetStandardProcessedMap
394 394
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
395 395
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
396 396
      Create;
397 397
    };
398 398

	
399 399
    template <class H, class CR>
400 400
    struct SetHeapTraits : public Traits {
401 401
      typedef CR HeapCrossRef;
402 402
      typedef H Heap;
403 403
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
404 404
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
405 405
        return 0; // ignore warnings
406 406
      }
407 407
      static Heap *createHeap(HeapCrossRef &)
408 408
      {
409 409
        LEMON_ASSERT(false, "Heap is not initialized");
410 410
        return 0; // ignore warnings
411 411
      }
412 412
    };
413 413
    ///\brief \ref named-templ-param "Named parameter" for setting
414 414
    ///heap and cross reference type
415 415
    ///
416 416
    ///\ref named-templ-param "Named parameter" for setting heap and cross
417 417
    ///reference type.
418 418
    template <class H, class CR = typename Digraph::template NodeMap<int> >
419 419
    struct SetHeap
420 420
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
421 421
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
422 422
    };
423 423

	
424 424
    template <class H, class CR>
425 425
    struct SetStandardHeapTraits : public Traits {
426 426
      typedef CR HeapCrossRef;
427 427
      typedef H Heap;
428 428
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
429 429
        return new HeapCrossRef(G);
430 430
      }
431 431
      static Heap *createHeap(HeapCrossRef &R)
432 432
      {
433 433
        return new Heap(R);
434 434
      }
435 435
    };
436 436
    ///\brief \ref named-templ-param "Named parameter" for setting
437 437
    ///heap and cross reference type with automatic allocation
438 438
    ///
439 439
    ///\ref named-templ-param "Named parameter" for setting heap and cross
440 440
    ///reference type. It can allocate the heap and the cross reference
441 441
    ///object if the cross reference's constructor waits for the digraph as
442 442
    ///parameter and the heap's constructor waits for the cross reference.
443 443
    template <class H, class CR = typename Digraph::template NodeMap<int> >
444 444
    struct SetStandardHeap
445 445
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
446 446
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
447 447
      Create;
448 448
    };
449 449

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

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

	
467 467
    ///@}
468 468

	
469 469
  protected:
470 470

	
471 471
    Dijkstra() {}
472 472

	
473 473
  public:
474 474

	
475 475
    ///Constructor.
476 476

	
477 477
    ///Constructor.
478 478
    ///\param _g The digraph the algorithm runs on.
479 479
    ///\param _length The length map used by the algorithm.
480 480
    Dijkstra(const Digraph& _g, const LengthMap& _length) :
481 481
      G(&_g), length(&_length),
482 482
      _pred(NULL), local_pred(false),
483 483
      _dist(NULL), local_dist(false),
484 484
      _processed(NULL), local_processed(false),
485 485
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
486 486
      _heap(NULL), local_heap(false)
487 487
    { }
488 488

	
489 489
    ///Destructor.
490 490
    ~Dijkstra()
491 491
    {
492 492
      if(local_pred) delete _pred;
493 493
      if(local_dist) delete _dist;
494 494
      if(local_processed) delete _processed;
495 495
      if(local_heap_cross_ref) delete _heap_cross_ref;
496 496
      if(local_heap) delete _heap;
497 497
    }
498 498

	
499 499
    ///Sets the length map.
500 500

	
501 501
    ///Sets the length map.
502 502
    ///\return <tt> (*this) </tt>
503 503
    Dijkstra &lengthMap(const LengthMap &m)
504 504
    {
... ...
@@ -941,149 +941,149 @@
941 941
    typedef typename LM::Value Value;
942 942

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

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

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

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

	
956 956
    ///This function instantiates a \ref HeapCrossRef.
957 957
    /// \param g is the digraph, to which we would like to define the
958 958
    /// HeapCrossRef.
959 959
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
960 960
    {
961 961
      return new HeapCrossRef(g);
962 962
    }
963 963

	
964 964
    ///The heap type used by the Dijkstra algorithm.
965 965

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

	
973 973
    ///Instantiates a \ref Heap.
974 974

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

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

	
991
    ///This function instantiates a \ref PredMap.
991
    ///This function instantiates a PredMap.
992 992
    ///\param g is the digraph, to which we would like to define the
993
    ///\ref PredMap.
993
    ///PredMap.
994 994
    static PredMap *createPredMap(const Digraph &g)
995 995
    {
996 996
      return new PredMap(g);
997 997
    }
998 998

	
999 999
    ///The type of the map that indicates which nodes are processed.
1000 1000

	
1001 1001
    ///The type of the map that indicates which nodes are processed.
1002 1002
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1003 1003
    ///By default it is a NullMap.
1004 1004
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1005
    ///Instantiates a \ref ProcessedMap.
1005
    ///Instantiates a ProcessedMap.
1006 1006

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

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

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

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

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

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

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

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

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

	
1072 1072
  public:
1073 1073
    /// Constructor.
1074 1074

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

	
1080 1080
    /// Constructor.
1081 1081

	
1082 1082
    /// This constructor requires two parameters,
1083 1083
    /// others are initiated to \c 0.
1084 1084
    /// \param g The digraph the algorithm runs on.
1085 1085
    /// \param l The length map.
1086 1086
    DijkstraWizardBase(const GR &g,const LM &l) :
1087 1087
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1088 1088
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1089 1089
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
... ...
@@ -1153,136 +1153,136 @@
1153 1153
    ///in order to compute the shortest path to each node.
1154 1154
    void run(Node s)
1155 1155
    {
1156 1156
      Dijkstra<Digraph,LengthMap,TR>
1157 1157
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1158 1158
             *reinterpret_cast<const LengthMap*>(Base::_length));
1159 1159
      if (Base::_pred)
1160 1160
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1161 1161
      if (Base::_dist)
1162 1162
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1163 1163
      if (Base::_processed)
1164 1164
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1165 1165
      dijk.run(s);
1166 1166
    }
1167 1167

	
1168 1168
    ///Finds the shortest path between \c s and \c t.
1169 1169

	
1170 1170
    ///This method runs the %Dijkstra algorithm from node \c s
1171 1171
    ///in order to compute the shortest path to node \c t
1172 1172
    ///(it stops searching when \c t is processed).
1173 1173
    ///
1174 1174
    ///\return \c true if \c t is reachable form \c s.
1175 1175
    bool run(Node s, Node t)
1176 1176
    {
1177 1177
      Dijkstra<Digraph,LengthMap,TR>
1178 1178
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1179 1179
             *reinterpret_cast<const LengthMap*>(Base::_length));
1180 1180
      if (Base::_pred)
1181 1181
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1182 1182
      if (Base::_dist)
1183 1183
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1184 1184
      if (Base::_processed)
1185 1185
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1186 1186
      dijk.run(s,t);
1187 1187
      if (Base::_path)
1188 1188
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1189 1189
      if (Base::_di)
1190 1190
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1191 1191
      return dijk.reached(t);
1192 1192
    }
1193 1193

	
1194 1194
    template<class T>
1195 1195
    struct SetPredMapBase : public Base {
1196 1196
      typedef T PredMap;
1197 1197
      static PredMap *createPredMap(const Digraph &) { return 0; };
1198 1198
      SetPredMapBase(const TR &b) : TR(b) {}
1199 1199
    };
1200 1200
    ///\brief \ref named-func-param "Named parameter"
1201
    ///for setting \ref PredMap object.
1201
    ///for setting PredMap object.
1202 1202
    ///
1203 1203
    ///\ref named-func-param "Named parameter"
1204
    ///for setting \ref PredMap object.
1204
    ///for setting PredMap object.
1205 1205
    template<class T>
1206 1206
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1207 1207
    {
1208 1208
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1209 1209
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1210 1210
    }
1211 1211

	
1212 1212
    template<class T>
1213 1213
    struct SetDistMapBase : public Base {
1214 1214
      typedef T DistMap;
1215 1215
      static DistMap *createDistMap(const Digraph &) { return 0; };
1216 1216
      SetDistMapBase(const TR &b) : TR(b) {}
1217 1217
    };
1218 1218
    ///\brief \ref named-func-param "Named parameter"
1219
    ///for setting \ref DistMap object.
1219
    ///for setting DistMap object.
1220 1220
    ///
1221 1221
    ///\ref named-func-param "Named parameter"
1222
    ///for setting \ref DistMap object.
1222
    ///for setting DistMap object.
1223 1223
    template<class T>
1224 1224
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1225 1225
    {
1226 1226
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1227 1227
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1228 1228
    }
1229 1229

	
1230 1230
    template<class T>
1231 1231
    struct SetProcessedMapBase : public Base {
1232 1232
      typedef T ProcessedMap;
1233 1233
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1234 1234
      SetProcessedMapBase(const TR &b) : TR(b) {}
1235 1235
    };
1236 1236
    ///\brief \ref named-func-param "Named parameter"
1237
    ///for setting \ref ProcessedMap object.
1237
    ///for setting ProcessedMap object.
1238 1238
    ///
1239 1239
    /// \ref named-func-param "Named parameter"
1240
    ///for setting \ref ProcessedMap object.
1240
    ///for setting ProcessedMap object.
1241 1241
    template<class T>
1242 1242
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1243 1243
    {
1244 1244
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1245 1245
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1246 1246
    }
1247 1247

	
1248 1248
    template<class T>
1249 1249
    struct SetPathBase : public Base {
1250 1250
      typedef T Path;
1251 1251
      SetPathBase(const TR &b) : TR(b) {}
1252 1252
    };
1253 1253
    ///\brief \ref named-func-param "Named parameter"
1254 1254
    ///for getting the shortest path to the target node.
1255 1255
    ///
1256 1256
    ///\ref named-func-param "Named parameter"
1257 1257
    ///for getting the shortest path to the target node.
1258 1258
    template<class T>
1259 1259
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1260 1260
    {
1261 1261
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1262 1262
      return DijkstraWizard<SetPathBase<T> >(*this);
1263 1263
    }
1264 1264

	
1265 1265
    ///\brief \ref named-func-param "Named parameter"
1266 1266
    ///for getting the distance of the target node.
1267 1267
    ///
1268 1268
    ///\ref named-func-param "Named parameter"
1269 1269
    ///for getting the distance of the target node.
1270 1270
    DijkstraWizard dist(const Value &d)
1271 1271
    {
1272 1272
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1273 1273
      return *this;
1274 1274
    }
1275 1275

	
1276 1276
  };
1277 1277

	
1278 1278
  ///Function-type interface for Dijkstra algorithm.
1279 1279

	
1280 1280
  /// \ingroup shortest_path
1281 1281
  ///Function-type interface for Dijkstra algorithm.
1282 1282
  ///
1283 1283
  ///This function also has several \ref named-func-param "named parameters",
1284 1284
  ///they are declared as the members of class \ref DijkstraWizard.
1285 1285
  ///The following examples show how to use these parameters.
1286 1286
  ///\code
1287 1287
  ///  // Compute shortest path from node s to each node
1288 1288
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
Ignore white space 6 line context
... ...
@@ -214,100 +214,100 @@
214 214

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

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

	
227 227
  ///Rotate by 90 degrees
228 228

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

	
238 238
  ///Rotate by 180 degrees
239 239

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

	
249 249
  ///Rotate by 270 degrees
250 250

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

	
260 260

	
261 261

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

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

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

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

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

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

	
295 295
      ///Construct a box from four numbers
296 296

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

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

	
313 313
      ///Return \c true if the box is empty (i.e. return \c false
... ...
@@ -528,221 +528,205 @@
528 528
        }
529 529
        return b;
530 530
      }
531 531

	
532 532
  };//class Box
533 533

	
534 534

	
535 535
  ///Read a box from a stream
536 536

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
710 698

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

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

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

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

	
742 726
  /// @}
743 727

	
744 728
  } //namespce dim2
745 729

	
746 730
} //namespace lemon
747 731

	
748 732
#endif //LEMON_DIM2_H
Ignore white space 6 line context
... ...
@@ -17,97 +17,97 @@
17 17
 */
18 18

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

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

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

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

	
45 45

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

	
50 50
namespace lemon {
51 51

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

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

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

	
81 81

	
82 82
  const Graph &g;
83 83

	
84 84
  std::ostream& os;
85 85

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

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

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

	
96 96
  double _arcWidthScale;
97 97

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

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

	
106 106
  bool _showNodes, _showArcs;
107 107

	
108 108
  bool _enableParallel;
109 109
  double _parArcDist;
110 110

	
111 111
  bool _showNodeText;
112 112
  ConstMap<typename Graph::Node,bool > _nodeTexts;
113 113
  double _nodeTextSize;
Ignore white space 6 line context
... ...
@@ -346,105 +346,127 @@
346 346
          } else if (c == '#') {
347 347
            getline(is, line);
348 348
            ++line_num;
349 349
          } else if (!isWhiteSpace(c)) {
350 350
            is.putback(c);
351 351
            getline(is, line);
352 352
            _functor(line);
353 353
            ++line_num;
354 354
          }
355 355
        }
356 356
        if (is) is.putback(c);
357 357
        else if (is.eof()) is.clear();
358 358
      }
359 359
    };
360 360

	
361 361
    template <typename Functor>
362 362
    class StreamSection : public Section {
363 363
    private:
364 364

	
365 365
      Functor _functor;
366 366

	
367 367
    public:
368 368

	
369 369
      StreamSection(const Functor& functor) : _functor(functor) {}
370 370
      virtual ~StreamSection() {}
371 371

	
372 372
      virtual void process(std::istream& is, int& line_num) {
373 373
        _functor(is, line_num);
374 374
        char c;
375 375
        std::string line;
376 376
        while (is.get(c) && c != '@') {
377 377
          if (c == '\n') {
378 378
            ++line_num;
379 379
          } else if (!isWhiteSpace(c)) {
380 380
            getline(is, line);
381 381
            ++line_num;
382 382
          }
383 383
        }
384 384
        if (is) is.putback(c);
385 385
        else if (is.eof()) is.clear();
386 386
      }
387 387
    };
388 388

	
389 389
  }
390 390

	
391 391
  template <typename Digraph>
392 392
  class DigraphReader;
393 393

	
394
  /// \brief Return a \ref DigraphReader class
395
  ///
396
  /// This function just returns a \ref DigraphReader class.
397
  /// \relates DigraphReader
394 398
  template <typename Digraph>
395 399
  DigraphReader<Digraph> digraphReader(Digraph& digraph,
396
                                       std::istream& is = std::cin);
397

	
400
                                       std::istream& is = std::cin) {
401
    DigraphReader<Digraph> tmp(digraph, is);
402
    return tmp;
403
  }
404

	
405
  /// \brief Return a \ref DigraphReader class
406
  ///
407
  /// This function just returns a \ref DigraphReader class.
408
  /// \relates DigraphReader
398 409
  template <typename Digraph>
399
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const std::string& fn);
400

	
410
  DigraphReader<Digraph> digraphReader(Digraph& digraph,
411
                                       const std::string& fn) {
412
    DigraphReader<Digraph> tmp(digraph, fn);
413
    return tmp;
414
  }
415

	
416
  /// \brief Return a \ref DigraphReader class
417
  ///
418
  /// This function just returns a \ref DigraphReader class.
419
  /// \relates DigraphReader
401 420
  template <typename Digraph>
402
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const char *fn);
421
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) {
422
    DigraphReader<Digraph> tmp(digraph, fn);
423
    return tmp;
424
  }
403 425

	
404 426
  /// \ingroup lemon_io
405 427
  ///
406 428
  /// \brief \ref lgf-format "LGF" reader for directed graphs
407 429
  ///
408 430
  /// This utility reads an \ref lgf-format "LGF" file.
409 431
  ///
410 432
  /// The reading method does a batch processing. The user creates a
411 433
  /// reader object, then various reading rules can be added to the
412 434
  /// reader, and eventually the reading is executed with the \c run()
413 435
  /// member function. A map reading rule can be added to the reader
414 436
  /// with the \c nodeMap() or \c arcMap() members. An optional
415 437
  /// converter parameter can also be added as a standard functor
416 438
  /// converting from \c std::string to the value type of the map. If it
417 439
  /// is set, it will determine how the tokens in the file should be
418 440
  /// converted to the value type of the map. If the functor is not set,
419 441
  /// then a default conversion will be used. One map can be read into
420 442
  /// multiple map objects at the same time. The \c attribute(), \c
421 443
  /// node() and \c arc() functions are used to add attribute reading
422 444
  /// rules.
423 445
  ///
424 446
  ///\code
425 447
  /// DigraphReader<Digraph>(digraph, std::cin).
426 448
  ///   nodeMap("coordinates", coord_map).
427 449
  ///   arcMap("capacity", cap_map).
428 450
  ///   node("source", src).
429 451
  ///   node("target", trg).
430 452
  ///   attribute("caption", caption).
431 453
  ///   run();
432 454
  ///\endcode
433 455
  ///
434 456
  /// By default the reader uses the first section in the file of the
435 457
  /// proper type. If a section has an optional name, then it can be
436 458
  /// selected for reading by giving an optional name parameter to the
437 459
  /// \c nodes(), \c arcs() or \c attributes() functions.
438 460
  ///
439 461
  /// The \c useNodes() and \c useArcs() functions are used to tell the reader
440 462
  /// that the nodes or arcs should not be constructed (added to the
441 463
  /// graph) during the reading, but instead the label map of the items
442 464
  /// are given as a parameter of these functions. An
443 465
  /// application of these functions is multipass reading, which is
444 466
  /// important if two \c \@arcs sections must be read from the
445 467
  /// file. In this case the first phase would read the node set and one
446 468
  /// of the arc sets, while the second phase would read the second arc
447 469
  /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet).
448 470
  /// The previously read label node map should be passed to the \c
449 471
  /// useNodes() functions. Another application of multipass reading when
450 472
  /// paths are given as a node map or an arc map.
... ...
@@ -1144,141 +1166,129 @@
1144 1166
          if (line >> c)
1145 1167
            throw FormatError("Extra character at the end of line");
1146 1168

	
1147 1169
          if (section == "nodes" && !nodes_done) {
1148 1170
            if (_nodes_caption.empty() || _nodes_caption == caption) {
1149 1171
              readNodes();
1150 1172
              nodes_done = true;
1151 1173
            }
1152 1174
          } else if ((section == "arcs" || section == "edges") &&
1153 1175
                     !arcs_done) {
1154 1176
            if (_arcs_caption.empty() || _arcs_caption == caption) {
1155 1177
              readArcs();
1156 1178
              arcs_done = true;
1157 1179
            }
1158 1180
          } else if (section == "attributes" && !attributes_done) {
1159 1181
            if (_attributes_caption.empty() || _attributes_caption == caption) {
1160 1182
              readAttributes();
1161 1183
              attributes_done = true;
1162 1184
            }
1163 1185
          } else {
1164 1186
            readLine();
1165 1187
            skipSection();
1166 1188
          }
1167 1189
        } catch (FormatError& error) {
1168 1190
          error.line(line_num);
1169 1191
          error.file(_filename);
1170 1192
          throw;
1171 1193
        }
1172 1194
      }
1173 1195

	
1174 1196
      if (!nodes_done) {
1175 1197
        throw FormatError("Section @nodes not found");
1176 1198
      }
1177 1199

	
1178 1200
      if (!arcs_done) {
1179 1201
        throw FormatError("Section @arcs not found");
1180 1202
      }
1181 1203

	
1182 1204
      if (!attributes_done && !_attributes.empty()) {
1183 1205
        throw FormatError("Section @attributes not found");
1184 1206
      }
1185 1207

	
1186 1208
    }
1187 1209

	
1188 1210
    /// @}
1189 1211

	
1190 1212
  };
1191 1213

	
1192
  /// \brief Return a \ref DigraphReader class
1214
  template <typename Graph>
1215
  class GraphReader;
1216

	
1217
  /// \brief Return a \ref GraphReader class
1193 1218
  ///
1194
  /// This function just returns a \ref DigraphReader class.
1195
  /// \relates DigraphReader
1196
  template <typename Digraph>
1197
  DigraphReader<Digraph> digraphReader(Digraph& digraph,
1198
                                       std::istream& is = std::cin) {
1199
    DigraphReader<Digraph> tmp(digraph, is);
1219
  /// This function just returns a \ref GraphReader class.
1220
  /// \relates GraphReader
1221
  template <typename Graph>
1222
  GraphReader<Graph> graphReader(Graph& graph, std::istream& is = std::cin) {
1223
    GraphReader<Graph> tmp(graph, is);
1200 1224
    return tmp;
1201 1225
  }
1202 1226

	
1203
  /// \brief Return a \ref DigraphReader class
1227
  /// \brief Return a \ref GraphReader class
1204 1228
  ///
1205
  /// This function just returns a \ref DigraphReader class.
1206
  /// \relates DigraphReader
1207
  template <typename Digraph>
1208
  DigraphReader<Digraph> digraphReader(Digraph& digraph,
1209
                                       const std::string& fn) {
1210
    DigraphReader<Digraph> tmp(digraph, fn);
1229
  /// This function just returns a \ref GraphReader class.
1230
  /// \relates GraphReader
1231
  template <typename Graph>
1232
  GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) {
1233
    GraphReader<Graph> tmp(graph, fn);
1211 1234
    return tmp;
1212 1235
  }
1213 1236

	
1214
  /// \brief Return a \ref DigraphReader class
1237
  /// \brief Return a \ref GraphReader class
1215 1238
  ///
1216
  /// This function just returns a \ref DigraphReader class.
1217
  /// \relates DigraphReader
1218
  template <typename Digraph>
1219
  DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) {
1220
    DigraphReader<Digraph> tmp(digraph, fn);
1239
  /// This function just returns a \ref GraphReader class.
1240
  /// \relates GraphReader
1241
  template <typename Graph>
1242
  GraphReader<Graph> graphReader(Graph& graph, const char* fn) {
1243
    GraphReader<Graph> tmp(graph, fn);
1221 1244
    return tmp;
1222 1245
  }
1223 1246

	
1224
  template <typename Graph>
1225
  class GraphReader;
1226

	
1227
  template <typename Graph>
1228
  GraphReader<Graph> graphReader(Graph& graph,
1229
                                 std::istream& is = std::cin);
1230

	
1231
  template <typename Graph>
1232
  GraphReader<Graph> graphReader(Graph& graph, const std::string& fn);
1233

	
1234
  template <typename Graph>
1235
  GraphReader<Graph> graphReader(Graph& graph, const char *fn);
1236

	
1237 1247
  /// \ingroup lemon_io
1238 1248
  ///
1239 1249
  /// \brief \ref lgf-format "LGF" reader for undirected graphs
1240 1250
  ///
1241 1251
  /// This utility reads an \ref lgf-format "LGF" file.
1242 1252
  ///
1243 1253
  /// It can be used almost the same way as \c DigraphReader.
1244 1254
  /// The only difference is that this class can handle edges and
1245 1255
  /// edge maps as well as arcs and arc maps.
1246 1256
  ///
1247 1257
  /// The columns in the \c \@edges (or \c \@arcs) section are the
1248 1258
  /// edge maps. However, if there are two maps with the same name
1249 1259
  /// prefixed with \c '+' and \c '-', then these can be read into an
1250 1260
  /// arc map.  Similarly, an attribute can be read into an arc, if
1251 1261
  /// it's value is an edge label prefixed with \c '+' or \c '-'.
1252 1262
  template <typename _Graph>
1253 1263
  class GraphReader {
1254 1264
  public:
1255 1265

	
1256 1266
    typedef _Graph Graph;
1257 1267
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1258 1268

	
1259 1269
  private:
1260 1270

	
1261 1271
    std::istream* _is;
1262 1272
    bool local_is;
1263 1273
    std::string _filename;
1264 1274

	
1265 1275
    Graph& _graph;
1266 1276

	
1267 1277
    std::string _nodes_caption;
1268 1278
    std::string _edges_caption;
1269 1279
    std::string _attributes_caption;
1270 1280

	
1271 1281
    typedef std::map<std::string, Node> NodeIndex;
1272 1282
    NodeIndex _node_index;
1273 1283
    typedef std::map<std::string, Edge> EdgeIndex;
1274 1284
    EdgeIndex _edge_index;
1275 1285

	
1276 1286
    typedef std::vector<std::pair<std::string,
1277 1287
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;
1278 1288
    NodeMaps _node_maps;
1279 1289

	
1280 1290
    typedef std::vector<std::pair<std::string,
1281 1291
      _reader_bits::MapStorageBase<Edge>*> > EdgeMaps;
1282 1292
    EdgeMaps _edge_maps;
1283 1293

	
1284 1294
    typedef std::multimap<std::string, _reader_bits::ValueStorageBase*>
... ...
@@ -1986,126 +1996,96 @@
1986 1996
          if (line >> c)
1987 1997
            throw FormatError("Extra character at the end of line");
1988 1998

	
1989 1999
          if (section == "nodes" && !nodes_done) {
1990 2000
            if (_nodes_caption.empty() || _nodes_caption == caption) {
1991 2001
              readNodes();
1992 2002
              nodes_done = true;
1993 2003
            }
1994 2004
          } else if ((section == "edges" || section == "arcs") &&
1995 2005
                     !edges_done) {
1996 2006
            if (_edges_caption.empty() || _edges_caption == caption) {
1997 2007
              readEdges();
1998 2008
              edges_done = true;
1999 2009
            }
2000 2010
          } else if (section == "attributes" && !attributes_done) {
2001 2011
            if (_attributes_caption.empty() || _attributes_caption == caption) {
2002 2012
              readAttributes();
2003 2013
              attributes_done = true;
2004 2014
            }
2005 2015
          } else {
2006 2016
            readLine();
2007 2017
            skipSection();
2008 2018
          }
2009 2019
        } catch (FormatError& error) {
2010 2020
          error.line(line_num);
2011 2021
          error.file(_filename);
2012 2022
          throw;
2013 2023
        }
2014 2024
      }
2015 2025

	
2016 2026
      if (!nodes_done) {
2017 2027
        throw FormatError("Section @nodes not found");
2018 2028
      }
2019 2029

	
2020 2030
      if (!edges_done) {
2021 2031
        throw FormatError("Section @edges not found");
2022 2032
      }
2023 2033

	
2024 2034
      if (!attributes_done && !_attributes.empty()) {
2025 2035
        throw FormatError("Section @attributes not found");
2026 2036
      }
2027 2037

	
2028 2038
    }
2029 2039

	
2030 2040
    /// @}
2031 2041

	
2032 2042
  };
2033 2043

	
2034
  /// \brief Return a \ref GraphReader class
2035
  ///
2036
  /// This function just returns a \ref GraphReader class.
2037
  /// \relates GraphReader
2038
  template <typename Graph>
2039
  GraphReader<Graph> graphReader(Graph& graph, std::istream& is = std::cin) {
2040
    GraphReader<Graph> tmp(graph, is);
2041
    return tmp;
2042
  }
2043

	
2044
  /// \brief Return a \ref GraphReader class
2045
  ///
2046
  /// This function just returns a \ref GraphReader class.
2047
  /// \relates GraphReader
2048
  template <typename Graph>
2049
  GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) {
2050
    GraphReader<Graph> tmp(graph, fn);
2051
    return tmp;
2052
  }
2053

	
2054
  /// \brief Return a \ref GraphReader class
2055
  ///
2056
  /// This function just returns a \ref GraphReader class.
2057
  /// \relates GraphReader
2058
  template <typename Graph>
2059
  GraphReader<Graph> graphReader(Graph& graph, const char* fn) {
2060
    GraphReader<Graph> tmp(graph, fn);
2061
    return tmp;
2062
  }
2063

	
2064 2044
  class SectionReader;
2065 2045

	
2066 2046
  SectionReader sectionReader(std::istream& is);
2067 2047
  SectionReader sectionReader(const std::string& fn);
2068 2048
  SectionReader sectionReader(const char* fn);
2069 2049

	
2070 2050
  /// \ingroup lemon_io
2071 2051
  ///
2072 2052
  /// \brief Section reader class
2073 2053
  ///
2074 2054
  /// In the \ref lgf-format "LGF" file extra sections can be placed,
2075 2055
  /// which contain any data in arbitrary format. Such sections can be
2076 2056
  /// read with this class. A reading rule can be added to the class
2077 2057
  /// with two different functions. With the \c sectionLines() function a
2078 2058
  /// functor can process the section line-by-line, while with the \c
2079 2059
  /// sectionStream() member the section can be read from an input
2080 2060
  /// stream.
2081 2061
  class SectionReader {
2082 2062
  private:
2083 2063

	
2084 2064
    std::istream* _is;
2085 2065
    bool local_is;
2086 2066
    std::string _filename;
2087 2067

	
2088 2068
    typedef std::map<std::string, _reader_bits::Section*> Sections;
2089 2069
    Sections _sections;
2090 2070

	
2091 2071
    int line_num;
2092 2072
    std::istringstream line;
2093 2073

	
2094 2074
  public:
2095 2075

	
2096 2076
    /// \brief Constructor
2097 2077
    ///
2098 2078
    /// Construct a section reader, which reads from the given input
2099 2079
    /// stream.
2100 2080
    SectionReader(std::istream& is)
2101 2081
      : _is(&is), local_is(false) {}
2102 2082

	
2103 2083
    /// \brief Constructor
2104 2084
    ///
2105 2085
    /// Construct a section reader, which reads from the given file.
2106 2086
    SectionReader(const std::string& fn)
2107 2087
      : _is(new std::ifstream(fn.c_str())), local_is(true),
2108 2088
        _filename(fn) {
2109 2089
      if (!(*_is)) {
2110 2090
        delete _is;
2111 2091
        throw IoError("Cannot open file", fn);
Ignore white space 6 line context
1
if WANT_BENCHMARK
2

	
3
noinst_HEADERS +=
4

	
5
noinst_PROGRAMS +=
6

	
7
endif WANT_BENCHMARK

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

0 comments (0 inline)