↑ Collapse diff ↑
Ignore white space 6 line context
1 1
LEMON code without an explicit copyright is covered by the following
2 2
copyright/license.
3 3

	
4
Copyright (C) 2003-2008 Egervary Jeno Kombinatorikus Optimalizalasi
4
Copyright (C) 2003-2009 Egervary Jeno Kombinatorikus Optimalizalasi
5 5
Kutatocsoport (Egervary Combinatorial Optimization Research Group,
6 6
EGRES).
7 7

	
8 8
Permission is hereby granted, free of charge, to any person or organization
9 9
obtaining a copy of the software and accompanying documentation covered by
10 10
this license (the "Software") to use, reproduce, display, distribute,
11 11
execute, and transmit the Software, and to prepare derivative works of the
12 12
Software, and to permit third-parties to whom the Software is furnished to
13 13
do so, all subject to the following:
14 14

	
15 15
The copyright notices in the Software and this entire statement, including
16 16
the above license grant, this restriction and the following disclaimer,
17 17
must be included in all copies of the Software, in whole or in part, and
18 18
all derivative works of the Software, unless such copies or derivative
19 19
works are solely in the form of machine-executable object code generated by
20 20
a source language processor.
21 21

	
22 22
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 23
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 24
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
25 25
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
26 26
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
27 27
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 28
DEALINGS IN THE SOFTWARE.
29 29

	
30 30
===========================================================================
31 31
This license is a verbatim copy of the Boost Software License, Version 1.0.
32 32

	
33 33

	
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 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"];
79 79
    std::cout << "  Value of -val2: " << d << std::endl;
80 80
  }
81 81
  if(ap.given("name")) std::cout << "  Value of -name: " << s << std::endl;
82 82
  if(ap.given("f")) std::cout << "  -f is given\n";
83 83
  if(ap.given("nohelp")) std::cout << "  Value of -nohelp: " << nh << std::endl;
84 84
  if(ap.given("gra")) std::cout << "  -gra is given\n";
85 85
  if(ap.given("grb")) std::cout << "  -grb is given\n";
86 86
  if(ap.given("grc")) std::cout << "  -grc is given\n";
87 87

	
88 88
  switch(ap.files().size()) {
89 89
  case 0:
90 90
    std::cout << "  No file argument was given.\n";
91 91
    break;
92 92
  case 1:
93 93
    std::cout << "  1 file argument was given. It is:\n";
94 94
    break;
95 95
  default:
96 96
    std::cout << "  "
97 97
              << ap.files().size() << " file arguments were given. They are:\n";
98 98
  }
99 99
  for(unsigned int i=0;i<ap.files().size();++i)
100 100
    std::cout << "    '" << ap.files()[i] << "'\n";
101 101

	
102 102
  return 0;
103 103
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 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;
78 78
  a=g.addArc(n2,n4); acolors[a]=1; widths[a]=2;
79 79
  a=g.addArc(n3,n4); acolors[a]=2; widths[a]=1;
80 80

	
81 81
  IdMap<ListDigraph,Node> id(g);
82 82

	
83 83
  // Create .eps files showing the digraph with different options
84 84
  cout << "Create 'graph_to_eps_demo_out_1_pure.eps'" << endl;
85 85
  graphToEps(g,"graph_to_eps_demo_out_1_pure.eps").
86 86
    coords(coords).
87 87
    title("Sample .eps figure").
88
    copyright("(C) 2003-2008 LEMON Project").
88
    copyright("(C) 2003-2009 LEMON Project").
89 89
    run();
90 90

	
91 91
  cout << "Create 'graph_to_eps_demo_out_2.eps'" << endl;
92 92
  graphToEps(g,"graph_to_eps_demo_out_2.eps").
93 93
    coords(coords).
94 94
    title("Sample .eps figure").
95
    copyright("(C) 2003-2008 LEMON Project").
95
    copyright("(C) 2003-2009 LEMON Project").
96 96
    absoluteNodeSizes().absoluteArcWidths().
97 97
    nodeScale(2).nodeSizes(sizes).
98 98
    nodeShapes(shapes).
99 99
    nodeColors(composeMap(palette,colors)).
100 100
    arcColors(composeMap(palette,acolors)).
101 101
    arcWidthScale(.4).arcWidths(widths).
102 102
    nodeTexts(id).nodeTextSize(3).
103 103
    run();
104 104

	
105 105
  cout << "Create 'graph_to_eps_demo_out_3_arr.eps'" << endl;
106 106
  graphToEps(g,"graph_to_eps_demo_out_3_arr.eps").
107 107
    title("Sample .eps figure (with arrowheads)").
108
    copyright("(C) 2003-2008 LEMON Project").
108
    copyright("(C) 2003-2009 LEMON Project").
109 109
    absoluteNodeSizes().absoluteArcWidths().
110 110
    nodeColors(composeMap(palette,colors)).
111 111
    coords(coords).
112 112
    nodeScale(2).nodeSizes(sizes).
113 113
    nodeShapes(shapes).
114 114
    arcColors(composeMap(palette,acolors)).
115 115
    arcWidthScale(.4).arcWidths(widths).
116 116
    nodeTexts(id).nodeTextSize(3).
117 117
    drawArrows().arrowWidth(2).arrowLength(2).
118 118
    run();
119 119

	
120 120
  // Add more arcs to the digraph
121 121
  a=g.addArc(n1,n4); acolors[a]=2; widths[a]=1;
122 122
  a=g.addArc(n4,n1); acolors[a]=1; widths[a]=2;
123 123

	
124 124
  a=g.addArc(n1,n2); acolors[a]=1; widths[a]=1;
125 125
  a=g.addArc(n1,n2); acolors[a]=2; widths[a]=1;
126 126
  a=g.addArc(n1,n2); acolors[a]=3; widths[a]=1;
127 127
  a=g.addArc(n1,n2); acolors[a]=4; widths[a]=1;
128 128
  a=g.addArc(n1,n2); acolors[a]=5; widths[a]=1;
129 129
  a=g.addArc(n1,n2); acolors[a]=6; widths[a]=1;
130 130
  a=g.addArc(n1,n2); acolors[a]=7; widths[a]=1;
131 131

	
132 132
  cout << "Create 'graph_to_eps_demo_out_4_par.eps'" << endl;
133 133
  graphToEps(g,"graph_to_eps_demo_out_4_par.eps").
134 134
    title("Sample .eps figure (parallel arcs)").
135
    copyright("(C) 2003-2008 LEMON Project").
135
    copyright("(C) 2003-2009 LEMON Project").
136 136
    absoluteNodeSizes().absoluteArcWidths().
137 137
    nodeShapes(shapes).
138 138
    coords(coords).
139 139
    nodeScale(2).nodeSizes(sizes).
140 140
    nodeColors(composeMap(palette,colors)).
141 141
    arcColors(composeMap(palette,acolors)).
142 142
    arcWidthScale(.4).arcWidths(widths).
143 143
    nodeTexts(id).nodeTextSize(3).
144 144
    enableParallel().parArcDist(1.5).
145 145
    run();
146 146

	
147 147
  cout << "Create 'graph_to_eps_demo_out_5_par_arr.eps'" << endl;
148 148
  graphToEps(g,"graph_to_eps_demo_out_5_par_arr.eps").
149 149
    title("Sample .eps figure (parallel arcs and arrowheads)").
150
    copyright("(C) 2003-2008 LEMON Project").
150
    copyright("(C) 2003-2009 LEMON Project").
151 151
    absoluteNodeSizes().absoluteArcWidths().
152 152
    nodeScale(2).nodeSizes(sizes).
153 153
    coords(coords).
154 154
    nodeShapes(shapes).
155 155
    nodeColors(composeMap(palette,colors)).
156 156
    arcColors(composeMap(palette,acolors)).
157 157
    arcWidthScale(.3).arcWidths(widths).
158 158
    nodeTexts(id).nodeTextSize(3).
159 159
    enableParallel().parArcDist(1).
160 160
    drawArrows().arrowWidth(1).arrowLength(1).
161 161
    run();
162 162

	
163 163
  cout << "Create 'graph_to_eps_demo_out_6_par_arr_a4.eps'" << endl;
164 164
  graphToEps(g,"graph_to_eps_demo_out_6_par_arr_a4.eps").
165 165
    title("Sample .eps figure (fits to A4)").
166
    copyright("(C) 2003-2008 LEMON Project").
166
    copyright("(C) 2003-2009 LEMON Project").
167 167
    scaleToA4().
168 168
    absoluteNodeSizes().absoluteArcWidths().
169 169
    nodeScale(2).nodeSizes(sizes).
170 170
    coords(coords).
171 171
    nodeShapes(shapes).
172 172
    nodeColors(composeMap(palette,colors)).
173 173
    arcColors(composeMap(palette,acolors)).
174 174
    arcWidthScale(.3).arcWidths(widths).
175 175
    nodeTexts(id).nodeTextSize(3).
176 176
    enableParallel().parArcDist(1).
177 177
    drawArrows().arrowWidth(1).arrowLength(1).
178 178
    run();
179 179

	
180 180
  // Create an .eps file showing the colors of a default Palette
181 181
  ListDigraph h;
182 182
  ListDigraph::NodeMap<int> hcolors(h);
183 183
  ListDigraph::NodeMap<Point> hcoords(h);
184 184

	
185 185
  int cols=int(sqrt(double(palette.size())));
186 186
  for(int i=0;i<int(paletteW.size());i++) {
187 187
    Node n=h.addNode();
188 188
    hcoords[n]=Point(1+i%cols,1+i/cols);
189 189
    hcolors[n]=i;
190 190
  }
191 191

	
192 192
  cout << "Create 'graph_to_eps_demo_out_7_colors.eps'" << endl;
193 193
  graphToEps(h,"graph_to_eps_demo_out_7_colors.eps").
194 194
    scale(60).
195 195
    title("Sample .eps figure (Palette demo)").
196
    copyright("(C) 2003-2008 LEMON Project").
196
    copyright("(C) 2003-2009 LEMON Project").
197 197
    coords(hcoords).
198 198
    absoluteNodeSizes().absoluteArcWidths().
199 199
    nodeScale(.45).
200 200
    distantColorNodeTexts().
201 201
    nodeTexts(hcolors).nodeTextSize(.6).
202 202
    nodeColors(composeMap(paletteW,hcolors)).
203 203
    run();
204 204

	
205 205
  return 0;
206 206
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 Demonstrating graph input and output
22 22
///
23 23
/// This program gives an example of how to read and write a digraph
24 24
/// and additional maps from/to a stream or a file using the
25 25
/// \ref lgf-format "LGF" format.
26 26
///
27 27
/// The \c "digraph.lgf" file:
28 28
/// \include digraph.lgf
29 29
///
30 30
/// And the program which reads it and prints the digraph to the
31 31
/// standard output:
32 32
/// \include lgf_demo.cc
33 33

	
34 34
#include <iostream>
35 35
#include <lemon/smart_graph.h>
36 36
#include <lemon/lgf_reader.h>
37 37
#include <lemon/lgf_writer.h>
38 38

	
39 39
using namespace lemon;
40 40

	
41 41
int main() {
42 42
  SmartDigraph g;
43 43
  SmartDigraph::ArcMap<int> cap(g);
44 44
  SmartDigraph::Node s, t;
45 45

	
46 46
  try {
47 47
    digraphReader(g, "digraph.lgf"). // read the directed graph into g
48 48
      arcMap("capacity", cap).       // read the 'capacity' arc map into cap
49 49
      node("source", s).             // read 'source' node to s
50 50
      node("target", t).             // read 'target' node to t
51 51
      run();
52 52
  } catch (Exception& error) { // check if there was any error
53 53
    std::cerr << "Error: " << error.what() << std::endl;
54 54
    return -1;
55 55
  }
56 56

	
57 57
  std::cout << "A digraph is read from 'digraph.lgf'." << std::endl;
58 58
  std::cout << "Number of nodes: " << countNodes(g) << std::endl;
59 59
  std::cout << "Number of arcs: " << countArcs(g) << std::endl;
60 60

	
61 61
  std::cout << "We can write it to the standard output:" << std::endl;
62 62

	
63 63
  digraphWriter(g).                // write g to the standard output
64 64
    arcMap("capacity", cap).       // write cap into 'capacity'
65 65
    node("source", s).             // write s to 'source'
66 66
    node("target", t).             // write t to 'target'
67 67
    run();
68 68

	
69 69
  return 0;
70 70
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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

	
21 21
\page coding_style LEMON Coding Style
22 22

	
23 23
\section naming_conv Naming Conventions
24 24

	
25 25
In order to make development easier we have made some conventions
26 26
according to coding style. These include names of types, classes,
27 27
functions, variables, constants and exceptions. If these conventions
28 28
are met in one's code then it is easier to read and maintain
29 29
it. Please comply with these conventions if you want to contribute
30 30
developing LEMON library.
31 31

	
32 32
\note When the coding style requires the capitalization of an abbreviation,
33 33
only the first letter should be upper case.
34 34

	
35 35
\code
36 36
XmlReader
37 37
\endcode
38 38

	
39 39

	
40 40
\warning In some cases we diverge from these rules.
41 41
This is primary done because STL uses different naming convention and
42 42
in certain cases
43 43
it is beneficial to provide STL compatible interface.
44 44

	
45 45
\subsection cs-files File Names
46 46

	
47 47
The header file names should look like the following.
48 48

	
49 49
\code
50 50
header_file.h
51 51
\endcode
52 52

	
53 53
Note that all standard LEMON headers are located in the \c lemon subdirectory,
54 54
so you should include them from C++ source like this:
55 55

	
56 56
\code
57 57
#include <lemon/header_file.h>
58 58
\endcode
59 59

	
60 60
The source code files use the same style and they have '.cc' extension.
61 61

	
62 62
\code
63 63
source_code.cc
64 64
\endcode
65 65

	
66 66
\subsection cs-class Classes and other types
67 67

	
68 68
The name of a class or any type should look like the following.
69 69

	
70 70
\code
71 71
AllWordsCapitalizedWithoutUnderscores
72 72
\endcode
73 73

	
74 74
\subsection cs-func Methods and other functions
75 75

	
76 76
The name of a function should look like the following.
77 77

	
78 78
\code
79 79
firstWordLowerCaseRestCapitalizedWithoutUnderscores
80 80
\endcode
81 81

	
82 82
\subsection cs-funcs Constants, Macros
83 83

	
84 84
The names of constants and macros should look like the following.
85 85

	
86 86
\code
87 87
ALL_UPPER_CASE_WITH_UNDERSCORES
88 88
\endcode
89 89

	
90 90
\subsection cs-loc-var Class and instance member variables, auto variables
91 91

	
92 92
The names of class and instance member variables and auto variables
93 93
(=variables used locally in methods) should look like the following.
94 94

	
95 95
\code
96 96
all_lower_case_with_underscores
97 97
\endcode
98 98

	
99 99
\subsection pri-loc-var Private member variables
100 100

	
101 101
Private member variables should start with underscore
102 102

	
103 103
\code
104 104
_start_with_underscores
105 105
\endcode
106 106

	
107 107
\subsection cs-excep Exceptions
108 108

	
109 109
When writing exceptions please comply the following naming conventions.
110 110

	
111 111
\code
112 112
ClassNameEndsWithException
113 113
\endcode
114 114

	
115 115
or
116 116

	
117 117
\code
118 118
ClassNameEndsWithError
119 119
\endcode
120 120

	
121 121
\section header-template Template Header File
122 122

	
123 123
Each LEMON header file should look like this:
124 124

	
125 125
\include template.h
126 126

	
127 127
*/
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
\dir demo
21 21
\brief A collection of demo applications.
22 22

	
23 23
This directory contains several simple demo applications, mainly
24 24
for educational purposes.
25 25
*/
26 26

	
27 27
/**
28 28
\dir doc
29 29
\brief Auxiliary (and the whole generated) documentation.
30 30

	
31 31
This directory contains some auxiliary pages and the whole generated
32 32
documentation.
33 33
*/
34 34

	
35 35
/**
36 36
\dir test
37 37
\brief Test programs.
38 38

	
39 39
This directory contains several test programs that check the consistency
40 40
of the code.
41 41
*/
42 42

	
43 43
/**
44 44
\dir tools
45 45
\brief Some useful executables.
46 46

	
47 47
This directory contains the sources of some useful complete executables.
48 48
*/
49 49

	
50 50
/**
51 51
\dir lemon
52 52
\brief Base include directory of LEMON.
53 53

	
54 54
This is the base directory of LEMON includes, so each include file must be
55 55
prefixed with this, e.g.
56 56
\code
57 57
#include<lemon/list_graph.h>
58 58
#include<lemon/dijkstra.h>
59 59
\endcode
60 60
*/
61 61

	
62 62
/**
63 63
\dir concepts
64 64
\brief Concept descriptors and checking classes.
65 65

	
66 66
This directory contains the concept descriptors and concept checking tools.
67 67
For more information see the \ref concept "Concepts" module.
68 68
*/
69 69

	
70 70
/**
71 71
\dir bits
72 72
\brief Auxiliary tools for implementation.
73 73

	
74
This directory contains some auxiliary classes for implementing graphs, 
74
This directory contains some auxiliary classes for implementing graphs,
75 75
maps and some other classes.
76 76
As a user you typically don't have to deal with these files.
77 77
*/
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
namespace lemon {
20 20

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

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

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

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

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

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

	
61 61
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
62 62
*/
63 63

	
64 64
/**
65 65
@defgroup graph_adaptors Adaptor Classes for graphs
66 66
@ingroup graphs
67 67
\brief This group contains several adaptor classes for digraphs and graphs
68 68

	
69 69
The main parts of LEMON are the different graph structures, generic
70 70
graph algorithms, graph concepts which couple these, and graph
71 71
adaptors. While the previous notions are more or less clear, the
72 72
latter one needs further explanation. Graph adaptors are graph classes
73 73
which serve for considering graph structures in different ways.
74 74

	
75 75
A short example makes this much clearer.  Suppose that we have an
76 76
instance \c g of a directed graph type say ListDigraph and an algorithm
77 77
\code
78 78
template <typename Digraph>
79 79
int algorithm(const Digraph&);
80 80
\endcode
81 81
is needed to run on the reverse oriented graph.  It may be expensive
82 82
(in time or in memory usage) to copy \c g with the reversed
83 83
arcs.  In this case, an adaptor class is used, which (according
84 84
to LEMON digraph concepts) works as a digraph.  The adaptor uses the
85 85
original digraph structure and digraph operations when methods of the
86 86
reversed oriented graph are called.  This means that the adaptor have
87 87
minor memory usage, and do not perform sophisticated algorithmic
88 88
actions.  The purpose of it is to give a tool for the cases when a
89 89
graph have to be used in a specific alteration.  If this alteration is
90 90
obtained by a usual construction like filtering the arc-set or
91 91
considering a new orientation, then an adaptor is worthwhile to use.
92 92
To come back to the reverse oriented graph, in this situation
93 93
\code
94 94
template<typename Digraph> class ReverseDigraph;
95 95
\endcode
96 96
template class can be used. The code looks as follows
97 97
\code
98 98
ListDigraph g;
99 99
ReverseDigraph<ListGraph> rg(g);
100 100
int result = algorithm(rg);
101 101
\endcode
102 102
After running the algorithm, the original graph \c g is untouched.
103 103
This techniques gives rise to an elegant code, and based on stable
104 104
graph adaptors, complex algorithms can be implemented easily.
105 105

	
106 106
In flow, circulation and bipartite matching problems, the residual
107 107
graph is of particular importance. Combining an adaptor implementing
108 108
this, shortest path algorithms and minimum mean cycle algorithms,
109 109
a range of weighted and cardinality optimization algorithms can be
110 110
obtained. For other examples, the interested user is referred to the
111 111
detailed documentation of particular adaptors.
112 112

	
113 113
The behavior of graph adaptors can be very different. Some of them keep
114 114
capabilities of the original graph while in other cases this would be
115 115
meaningless. This means that the concepts that they are models of depend
116 116
on the graph adaptor, and the wrapped graph(s).
117 117
If an arc of \c rg is deleted, this is carried out by deleting the
118 118
corresponding arc of \c g, thus the adaptor modifies the original graph.
119 119

	
120 120
But for a residual graph, this operation has no sense.
121 121
Let us stand one more example here to simplify your work.
122 122
RevGraphAdaptor has constructor
123 123
\code
124 124
ReverseDigraph(Digraph& digraph);
125 125
\endcode
126 126
This means that in a situation, when a <tt>const ListDigraph&</tt>
127 127
reference to a graph is given, then it have to be instantiated with
128 128
<tt>Digraph=const ListDigraph</tt>.
129 129
\code
130 130
int algorithm1(const ListDigraph& g) {
131 131
  RevGraphAdaptor<const ListDigraph> rg(g);
132 132
  return algorithm2(rg);
133 133
}
134 134
\endcode
135 135
*/
136 136

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

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

	
147 147
/**
148 148
@defgroup maps Maps
149 149
@ingroup datas
150 150
\brief Map structures implemented in LEMON.
151 151

	
152 152
This group describes the map structures implemented in LEMON.
153 153

	
154 154
LEMON provides several special purpose maps and map adaptors that e.g. combine
155 155
new maps from existing ones.
156 156

	
157 157
<b>See also:</b> \ref map_concepts "Map Concepts".
158 158
*/
159 159

	
160 160
/**
161 161
@defgroup graph_maps Graph Maps
162 162
@ingroup maps
163 163
\brief Special graph-related maps.
164 164

	
165 165
This group describes maps that are specifically designed to assign
166 166
values to the nodes and arcs/edges of graphs.
167 167

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

	
172 172
/**
173 173
\defgroup map_adaptors Map Adaptors
174 174
\ingroup maps
175 175
\brief Tools to create new maps from existing ones
176 176

	
177 177
This group describes map adaptors that are used to create "implicit"
178 178
maps from other maps.
179 179

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

	
185 185
The typical usage of this classes is passing implicit maps to
186 186
algorithms.  If a function type algorithm is called then the function
187 187
type map adaptors can be used comfortable. For example let's see the
188 188
usage of map adaptors with the \c graphToEps() function.
189 189
\code
190 190
  Color nodeColor(int deg) {
191 191
    if (deg >= 2) {
192 192
      return Color(0.5, 0.0, 0.5);
193 193
    } else if (deg == 1) {
194 194
      return Color(1.0, 0.5, 1.0);
195 195
    } else {
196 196
      return Color(0.0, 0.0, 0.0);
197 197
    }
198 198
  }
199 199

	
200 200
  Digraph::NodeMap<int> degree_map(graph);
201 201

	
202 202
  graphToEps(graph, "graph.eps")
203 203
    .coords(coords).scaleToA4().undirected()
204 204
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
205 205
    .run();
206 206
\endcode
207 207
The \c functorToMap() function makes an \c int to \c Color map from the
208 208
\c nodeColor() function. The \c composeMap() compose the \c degree_map
209 209
and the previously created map. The composed map is a proper function to
210 210
get the color of each node.
211 211

	
212 212
The usage with class type algorithms is little bit harder. In this
213 213
case the function type map adaptors can not be used, because the
214 214
function map adaptors give back temporary objects.
215 215
\code
216 216
  Digraph graph;
217 217

	
218 218
  typedef Digraph::ArcMap<double> DoubleArcMap;
219 219
  DoubleArcMap length(graph);
220 220
  DoubleArcMap speed(graph);
221 221

	
222 222
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
223 223
  TimeMap time(length, speed);
224 224

	
225 225
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
226 226
  dijkstra.run(source, target);
227 227
\endcode
228 228
We have a length map and a maximum speed map on the arcs of a digraph.
229 229
The minimum time to pass the arc can be calculated as the division of
230 230
the two maps which can be done implicitly with the \c DivMap template
231 231
class. We use the implicit minimum time map as the length map of the
232 232
\c Dijkstra algorithm.
233 233
*/
234 234

	
235 235
/**
236 236
@defgroup matrices Matrices
237 237
@ingroup datas
238 238
\brief Two dimensional data storages implemented in LEMON.
239 239

	
240 240
This group describes two dimensional data storages implemented in LEMON.
241 241
*/
242 242

	
243 243
/**
244 244
@defgroup paths Path Structures
245 245
@ingroup datas
246 246
\brief %Path structures implemented in LEMON.
247 247

	
248 248
This group describes the path structures implemented in LEMON.
249 249

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

	
256 256
\sa lemon::concepts::Path
257 257
*/
258 258

	
259 259
/**
260 260
@defgroup auxdat Auxiliary Data Structures
261 261
@ingroup datas
262 262
\brief Auxiliary data structures implemented in LEMON.
263 263

	
264 264
This group describes some data structures implemented in LEMON in
265 265
order to make it easier to implement combinatorial algorithms.
266 266
*/
267 267

	
268 268
/**
269 269
@defgroup algs Algorithms
270 270
\brief This group describes the several algorithms
271 271
implemented in LEMON.
272 272

	
273 273
This group describes the several algorithms
274 274
implemented in LEMON.
275 275
*/
276 276

	
277 277
/**
278 278
@defgroup search Graph Search
279 279
@ingroup algs
280 280
\brief Common graph search algorithms.
281 281

	
282 282
This group describes the common graph search algorithms, namely
283 283
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
284 284
*/
285 285

	
286 286
/**
287 287
@defgroup shortest_path Shortest Path Algorithms
288 288
@ingroup algs
289 289
\brief Algorithms for finding shortest paths.
290 290

	
291 291
This group describes the algorithms for finding shortest paths in digraphs.
292 292

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

	
307 307
/**
308 308
@defgroup max_flow Maximum Flow Algorithms
309 309
@ingroup algs
310 310
\brief Algorithms for finding maximum flows.
311 311

	
312 312
This group describes the algorithms for finding maximum flows and
313 313
feasible circulations.
314 314

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

	
322 322
\f[ \max\sum_{a\in\delta_{out}(s)}f(a) - \sum_{a\in\delta_{in}(s)}f(a) \f]
323 323
\f[ \sum_{a\in\delta_{out}(v)} f(a) = \sum_{a\in\delta_{in}(v)} f(a)
324 324
    \qquad \forall v\in V\setminus\{s,t\} \f]
325 325
\f[ 0 \leq f(a) \leq cap(a) \qquad \forall a\in A \f]
326 326

	
327 327
LEMON contains several algorithms for solving maximum flow problems:
328 328
- \ref EdmondsKarp Edmonds-Karp algorithm.
329 329
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
330 330
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
331 331
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
332 332

	
333 333
In most cases the \ref Preflow "Preflow" algorithm provides the
334 334
fastest method for computing a maximum flow. All implementations
335 335
provides functions to also query the minimum cut, which is the dual
336 336
problem of the maximum flow.
337 337
*/
338 338

	
339 339
/**
340 340
@defgroup min_cost_flow Minimum Cost Flow Algorithms
341 341
@ingroup algs
342 342

	
343 343
\brief Algorithms for finding minimum cost flows and circulations.
344 344

	
345 345
This group describes the algorithms for finding minimum cost flows and
346 346
circulations.
347 347

	
348 348
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
349 349
minimum total cost from a set of supply nodes to a set of demand nodes
350 350
in a network with capacity constraints and arc costs.
351 351
Formally, let \f$G=(V,A)\f$ be a digraph,
352 352
\f$lower, upper: A\rightarrow\mathbf{Z}^+_0\f$ denote the lower and
353 353
upper bounds for the flow values on the arcs,
354 354
\f$cost: A\rightarrow\mathbf{Z}^+_0\f$ denotes the cost per unit flow
355 355
on the arcs, and
356 356
\f$supply: V\rightarrow\mathbf{Z}\f$ denotes the supply/demand values
357 357
of the nodes.
358 358
A minimum cost flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of
359 359
the following optimization problem.
360 360

	
361 361
\f[ \min\sum_{a\in A} f(a) cost(a) \f]
362 362
\f[ \sum_{a\in\delta_{out}(v)} f(a) - \sum_{a\in\delta_{in}(v)} f(a) =
363 363
    supply(v) \qquad \forall v\in V \f]
364 364
\f[ lower(a) \leq f(a) \leq upper(a) \qquad \forall a\in A \f]
365 365

	
366 366
LEMON contains several algorithms for solving minimum cost flow problems:
367 367
 - \ref CycleCanceling Cycle-canceling algorithms.
368 368
 - \ref CapacityScaling Successive shortest path algorithm with optional
369 369
   capacity scaling.
370 370
 - \ref CostScaling Push-relabel and augment-relabel algorithms based on
371 371
   cost scaling.
372 372
 - \ref NetworkSimplex Primal network simplex algorithm with various
373 373
   pivot strategies.
374 374
*/
375 375

	
376 376
/**
377 377
@defgroup min_cut Minimum Cut Algorithms
378 378
@ingroup algs
379 379

	
380 380
\brief Algorithms for finding minimum cut in graphs.
381 381

	
382 382
This group describes the algorithms for finding minimum cut in graphs.
383 383

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

	
390 390
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
391 391
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
392 392

	
393 393
LEMON contains several algorithms related to minimum cut problems:
394 394

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

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

	
406 406
/**
407 407
@defgroup graph_prop Connectivity and Other Graph Properties
408 408
@ingroup algs
409 409
\brief Algorithms for discovering the graph properties
410 410

	
411 411
This group describes the algorithms for discovering the graph properties
412 412
like connectivity, bipartiteness, euler property, simplicity etc.
413 413

	
414 414
\image html edge_biconnected_components.png
415 415
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
416 416
*/
417 417

	
418 418
/**
419 419
@defgroup planar Planarity Embedding and Drawing
420 420
@ingroup algs
421 421
\brief Algorithms for planarity checking, embedding and drawing
422 422

	
423 423
This group describes the algorithms for planarity checking,
424 424
embedding and drawing.
425 425

	
426 426
\image html planar.png
427 427
\image latex planar.eps "Plane graph" width=\textwidth
428 428
*/
429 429

	
430 430
/**
431 431
@defgroup matching Matching Algorithms
432 432
@ingroup algs
433 433
\brief Algorithms for finding matchings in graphs and bipartite graphs.
434 434

	
435 435
This group contains algorithm objects and functions to calculate
436 436
matchings in graphs and bipartite graphs. The general matching problem is
437 437
finding a subset of the arcs which does not shares common endpoints.
438 438

	
439 439
There are several different algorithms for calculate matchings in
440 440
graphs.  The matching problems in bipartite graphs are generally
441 441
easier than in general graphs. The goal of the matching optimization
442 442
can be finding maximum cardinality, maximum weight or minimum cost
443 443
matching. The search can be constrained to find perfect or
444 444
maximum cardinality matching.
445 445

	
446 446
The matching algorithms implemented in LEMON:
447 447
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
448 448
  for calculating maximum cardinality matching in bipartite graphs.
449 449
- \ref PrBipartiteMatching Push-relabel algorithm
450 450
  for calculating maximum cardinality matching in bipartite graphs.
451 451
- \ref MaxWeightedBipartiteMatching
452 452
  Successive shortest path algorithm for calculating maximum weighted
453 453
  matching and maximum weighted bipartite matching in bipartite graphs.
454 454
- \ref MinCostMaxBipartiteMatching
455 455
  Successive shortest path algorithm for calculating minimum cost maximum
456 456
  matching in bipartite graphs.
457 457
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
458 458
  maximum cardinality matching in general graphs.
459 459
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
460 460
  maximum weighted matching in general graphs.
461 461
- \ref MaxWeightedPerfectMatching
462 462
  Edmond's blossom shrinking algorithm for calculating maximum weighted
463 463
  perfect matching in general graphs.
464 464

	
465 465
\image html bipartite_matching.png
466 466
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
467 467
*/
468 468

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

	
474 474
This group describes the algorithms for finding a minimum cost spanning
475 475
tree in a graph.
476 476
*/
477 477

	
478 478
/**
479 479
@defgroup auxalg Auxiliary Algorithms
480 480
@ingroup algs
481 481
\brief Auxiliary algorithms implemented in LEMON.
482 482

	
483 483
This group describes some algorithms implemented in LEMON
484 484
in order to make it easier to implement complex algorithms.
485 485
*/
486 486

	
487 487
/**
488 488
@defgroup approx Approximation Algorithms
489 489
@ingroup algs
490 490
\brief Approximation algorithms.
491 491

	
492 492
This group describes the approximation and heuristic algorithms
493 493
implemented in LEMON.
494 494
*/
495 495

	
496 496
/**
497 497
@defgroup gen_opt_group General Optimization Tools
498 498
\brief This group describes some general optimization frameworks
499 499
implemented in LEMON.
500 500

	
501 501
This group describes some general optimization frameworks
502 502
implemented in LEMON.
503 503
*/
504 504

	
505 505
/**
506 506
@defgroup lp_group Lp and Mip Solvers
507 507
@ingroup gen_opt_group
508 508
\brief Lp and Mip solver interfaces for LEMON.
509 509

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

	
515 515
/**
516 516
@defgroup lp_utils Tools for Lp and Mip Solvers
517 517
@ingroup lp_group
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
namespace lemon {
20 20
/*!
21 21

	
22 22

	
23 23

	
24 24
\page lgf-format LEMON Graph Format (LGF)
25 25

	
26 26
The \e LGF is a <em>column oriented</em>
27 27
file format for storing graphs and associated data like
28 28
node and edge maps.
29 29

	
30 30
Each line with \c '#' first non-whitespace
31 31
character is considered as a comment line.
32 32

	
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 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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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

	
21 21
\page license License Terms
22 22

	
23 23
\verbinclude LICENSE
24 24

	
25 25
*/
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 want to get a quick start and see the most important features then
45 45
take a look at our \ref quicktour
46 46
"Quick Tour to LEMON" which will guide you along.
47 47

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

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

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

	
59 59
If you are a user of the old (0.x) series of LEMON, please check out the
60 60
\ref migration "Migration Guide" for the backward incompatibilities.
61 61
*/
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
namespace lemon {
20 20
/*!
21 21

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

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

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

	
31 31
\section migration-graph Graph Related Name Changes
32 32

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

	
55 55
\warning
56 56
<b>The <tt>lemon-0.x-to-1.x.sh</tt> script replaces the words \c graph,
57 57
\c ugraph, \c edge and \c uedge in your own identifiers and in
58 58
strings, comments etc. as well as in all LEMON specific identifiers.
59 59
So use the script carefully and make a backup copy of your source files
60 60
before applying the script to them.</b>
61 61

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

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

	
110 110
\section migration-error Exceptions and Debug tools
111 111

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

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

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

	
144 144
*/
145 145
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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

	
21 21
\page named-param Named Parameters
22 22

	
23 23
\section named-func-param Named Function Parameters
24 24

	
25 25
Several modern languages provide a convenient way to refer the
26 26
function parameters by name also when you call the function. It is
27 27
especially comfortable in case of a function having tons of parameters
28 28
with natural default values. Sadly, C++ lack this amenity.
29 29

	
30 30
However, with a crafty trick and with some little
31 31
inconvenience, it is possible to emulate is.
32 32
The example below shows how to do it.
33 33

	
34 34
\code
35 35
class namedFn
36 36
{
37 37
  int _id;
38 38
  double _val;
39 39
  int _dim;
40 40

	
41 41
  public:
42 42
  namedFn() : _id(0), _val(1), _dim(2) {}
43 43
  namedFn& id(int p)     { _id  = p ; return *this; }
44 44
  namedFn& val(double p) { _val = p ; return *this; }
45 45
  namedFn& dim(int p)    { _dim = p ; return *this; }
46 46

	
47 47
  run() {
48 48
    std::cout << "Here comes the function itself\n" <<
49 49
              << "With parameters "
50 50
              << _id << ", " << _val << ", " << _dim << std::endl;
51 51
  }
52 52
};
53 53
\endcode
54 54

	
55 55
Then you can use it like this.
56 56

	
57 57
\code
58 58
namedFn().id(3).val(2).run();
59 59
\endcode
60 60

	
61 61
The trick is obvious, each "named parameter" changes one component of
62 62
the underlying class, then gives back a reference to it. Finally,
63 63
<tt>run()</tt> executes the algorithm itself.
64 64

	
65 65
\note Although it is a class, namedFn is used pretty much like as it were
66 66
a function. That it why we called it namedFn instead of \c NamedFn.
67 67

	
68 68
\note In fact, the final <tt>.run()</tt> could be made unnecessary,
69 69
because the algorithm could also be implemented in the destructor of
70 70
\c namedFn instead. This however would make it impossible to implement
71 71
functions with return values, and would also cause serious problems when
72 72
implementing \ref named-templ-func-param "named template parameters".
73 73
<b>Therefore, by convention, <tt>.run()</tt> must be used
74 74
explicitly to execute a function having named parameters
75 75
everywhere in LEMON.</b>
76 76

	
77 77
\section named-templ-func-param Named Function Template Parameters
78 78

	
79 79
A named parameter can also be a template function. The usage is
80 80
exactly the same, but the implementation behind is a kind of black
81 81
magic and they are the dirtiest part of the LEMON code.
82 82

	
83 83
You will probably never need to know how it works, but if you really
84 84
committed, have a look at \ref lemon/graph_to_eps.h for an example.
85 85

	
86 86
\section traits-classes Traits Classes
87 87

	
88 88
A similar game can also be played when defining classes. In this case
89 89
the type of the class attributes can be changed. Initially we have to
90 90
define a special class called <em>Traits Class</em> defining the
91 91
default type of the attributes. Then the types of these attributes can
92 92
be changed in the same way as described in the next section.
93 93

	
94 94
See \ref lemon::DijkstraDefaultTraits for an
95 95
example how a traits class implementation looks like.
96 96

	
97 97
\section named-templ-param Named Class Template Parameters
98 98

	
99 99
If we would like to change the type of an attribute in a class that
100 100
was instantiated by using a traits class as a template parameter, and
101 101
the class contains named parameters, we do not have to instantiate again
102 102
the class with new traits class, but instead adaptor classes can
103 103
be used as shown in the following example.
104 104

	
105 105
\code
106 106
Dijkstra<>::SetPredMap<NullMap<Node,Arc> >::Create
107 107
\endcode
108 108

	
109 109
It can also be used in conjunction with other named template
110 110
parameters in arbitrary order.
111 111

	
112 112
\code
113 113
Dijkstra<>::SetDistMap<MyMap>::SetPredMap<NullMap<Node,Arc> >::Create
114 114
\endcode
115 115

	
116 116
The result will be an instantiated Dijkstra class, in which the
117 117
DistMap and the PredMap is modified.
118 118

	
119 119
*/
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
/// The namespace of LEMON
20 20

	
21 21
/// The namespace of LEMON
22 22
///
23 23
namespace lemon {
24 24

	
25 25
  /// The namespace of LEMON concepts and concept checking classes
26 26

	
27 27
  /// The namespace of LEMON concepts and concept checking classes
28 28
  ///
29 29
  namespace concepts {}
30 30
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_TEMPLATE_H
20 20
#define LEMON_TEMPLATE_H
21 21

	
22 22
#endif // LEMON_TEMPLATE_H
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt
4 4

	
5 5
pkgconfig_DATA += lemon/lemon.pc
6 6

	
7 7
lib_LTLIBRARIES += lemon/libemon.la
8 8

	
9 9
lemon_libemon_la_SOURCES = \
10
        lemon/arg_parser.cc \
11
        lemon/base.cc \
12
        lemon/color.cc \
13
        lemon/random.cc
10
	lemon/arg_parser.cc \
11
	lemon/base.cc \
12
	lemon/color.cc \
13
	lemon/random.cc
14 14

	
15 15
#lemon_libemon_la_CXXFLAGS = $(GLPK_CFLAGS) $(CPLEX_CFLAGS) $(SOPLEX_CXXFLAGS) $(AM_CXXFLAGS)
16 16
#lemon_libemon_la_LDFLAGS = $(GLPK_LIBS) $(CPLEX_LIBS) $(SOPLEX_LIBS)
17 17

	
18 18
lemon_HEADERS += \
19 19
	lemon/adaptors.h \
20
        lemon/arg_parser.h \
20
	lemon/arg_parser.h \
21 21
	lemon/assert.h \
22
        lemon/bfs.h \
23
        lemon/bin_heap.h \
24
        lemon/circulation.h \
25
        lemon/color.h \
22
	lemon/bfs.h \
23
	lemon/bin_heap.h \
24
	lemon/circulation.h \
25
	lemon/color.h \
26 26
	lemon/concept_check.h \
27
        lemon/counter.h \
27
	lemon/counter.h \
28 28
	lemon/core.h \
29
        lemon/dfs.h \
30
        lemon/dijkstra.h \
31
        lemon/dim2.h \
32
        lemon/dimacs.h \
29
	lemon/dfs.h \
30
	lemon/dijkstra.h \
31
	lemon/dim2.h \
32
	lemon/dimacs.h \
33 33
	lemon/elevator.h \
34 34
	lemon/error.h \
35 35
	lemon/full_graph.h \
36
        lemon/graph_to_eps.h \
37
        lemon/grid_graph.h \
36
	lemon/graph_to_eps.h \
37
	lemon/grid_graph.h \
38 38
	lemon/hypercube_graph.h \
39 39
	lemon/kruskal.h \
40 40
	lemon/hao_orlin.h \
41 41
	lemon/lgf_reader.h \
42 42
	lemon/lgf_writer.h \
43 43
	lemon/list_graph.h \
44 44
	lemon/maps.h \
45 45
	lemon/math.h \
46 46
	lemon/max_matching.h \
47 47
	lemon/nauty_reader.h \
48 48
	lemon/path.h \
49 49
	lemon/preflow.h \
50
        lemon/random.h \
50
	lemon/random.h \
51 51
	lemon/smart_graph.h \
52 52
	lemon/suurballe.h \
53
        lemon/time_measure.h \
54
        lemon/tolerance.h \
53
	lemon/time_measure.h \
54
	lemon/tolerance.h \
55 55
	lemon/unionfind.h
56 56

	
57 57
bits_HEADERS += \
58 58
	lemon/bits/alteration_notifier.h \
59 59
	lemon/bits/array_map.h \
60 60
	lemon/bits/base_extender.h \
61
        lemon/bits/bezier.h \
61
	lemon/bits/bezier.h \
62 62
	lemon/bits/default_map.h \
63
        lemon/bits/enable_if.h \
63
	lemon/bits/enable_if.h \
64 64
	lemon/bits/graph_adaptor_extender.h \
65 65
	lemon/bits/graph_extender.h \
66 66
	lemon/bits/map_extender.h \
67 67
	lemon/bits/path_dump.h \
68 68
	lemon/bits/traits.h \
69 69
	lemon/bits/variant.h \
70 70
	lemon/bits/vector_map.h
71 71

	
72 72
concept_HEADERS += \
73 73
	lemon/concepts/digraph.h \
74 74
	lemon/concepts/graph.h \
75 75
	lemon/concepts/graph_components.h \
76 76
	lemon/concepts/heap.h \
77 77
	lemon/concepts/maps.h \
78 78
	lemon/concepts/path.h
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_ADAPTORS_H
20 20
#define LEMON_ADAPTORS_H
21 21

	
22 22
/// \ingroup graph_adaptors
23 23
/// \file
24 24
/// \brief Several graph adaptors
25 25
///
26 26
/// This file contains several useful adaptors for digraphs and graphs.
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/variant.h>
31 31

	
32 32
#include <lemon/bits/graph_adaptor_extender.h>
33 33
#include <lemon/tolerance.h>
34 34

	
35 35
#include <algorithm>
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  template<typename _Digraph>
40 40
  class DigraphAdaptorBase {
41 41
  public:
42 42
    typedef _Digraph Digraph;
43 43
    typedef DigraphAdaptorBase Adaptor;
44 44
    typedef Digraph ParentDigraph;
45 45

	
46 46
  protected:
47 47
    Digraph* _digraph;
48 48
    DigraphAdaptorBase() : _digraph(0) { }
49 49
    void setDigraph(Digraph& digraph) { _digraph = &digraph; }
50 50

	
51 51
  public:
52 52
    DigraphAdaptorBase(Digraph& digraph) : _digraph(&digraph) { }
53 53

	
54 54
    typedef typename Digraph::Node Node;
55 55
    typedef typename Digraph::Arc Arc;
56 56

	
57 57
    void first(Node& i) const { _digraph->first(i); }
58 58
    void first(Arc& i) const { _digraph->first(i); }
59 59
    void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
60 60
    void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
61 61

	
62 62
    void next(Node& i) const { _digraph->next(i); }
63 63
    void next(Arc& i) const { _digraph->next(i); }
64 64
    void nextIn(Arc& i) const { _digraph->nextIn(i); }
65 65
    void nextOut(Arc& i) const { _digraph->nextOut(i); }
66 66

	
67 67
    Node source(const Arc& a) const { return _digraph->source(a); }
68 68
    Node target(const Arc& a) const { return _digraph->target(a); }
69 69

	
70 70
    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
71 71
    int nodeNum() const { return _digraph->nodeNum(); }
72 72

	
73 73
    typedef EdgeNumTagIndicator<Digraph> EdgeNumTag;
74 74
    int arcNum() const { return _digraph->arcNum(); }
75 75

	
76 76
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
77 77
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
78 78
      return _digraph->findArc(u, v, prev);
79 79
    }
80 80

	
81 81
    Node addNode() { return _digraph->addNode(); }
82 82
    Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
83 83

	
84 84
    void erase(const Node& n) const { _digraph->erase(n); }
85 85
    void erase(const Arc& a) const { _digraph->erase(a); }
86 86

	
87 87
    void clear() const { _digraph->clear(); }
88 88

	
89 89
    int id(const Node& n) const { return _digraph->id(n); }
90 90
    int id(const Arc& a) const { return _digraph->id(a); }
91 91

	
92 92
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
93 93
    Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
94 94

	
95 95
    int maxNodeId() const { return _digraph->maxNodeId(); }
96 96
    int maxArcId() const { return _digraph->maxArcId(); }
97 97

	
98 98
    typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
99 99
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
100 100

	
101 101
    typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
102 102
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
103 103

	
104 104
    template <typename _Value>
105 105
    class NodeMap : public Digraph::template NodeMap<_Value> {
106 106
    public:
107 107

	
108 108
      typedef typename Digraph::template NodeMap<_Value> Parent;
109 109

	
110 110
      explicit NodeMap(const Adaptor& adaptor)
111 111
        : Parent(*adaptor._digraph) {}
112 112

	
113 113
      NodeMap(const Adaptor& adaptor, const _Value& value)
114 114
        : Parent(*adaptor._digraph, value) { }
115 115

	
116 116
    private:
117 117
      NodeMap& operator=(const NodeMap& cmap) {
118 118
        return operator=<NodeMap>(cmap);
119 119
      }
120 120

	
121 121
      template <typename CMap>
122 122
      NodeMap& operator=(const CMap& cmap) {
123 123
        Parent::operator=(cmap);
124 124
        return *this;
125 125
      }
126 126

	
127 127
    };
128 128

	
129 129
    template <typename _Value>
130 130
    class ArcMap : public Digraph::template ArcMap<_Value> {
131 131
    public:
132 132

	
133 133
      typedef typename Digraph::template ArcMap<_Value> Parent;
134 134

	
135 135
      explicit ArcMap(const Adaptor& adaptor)
136 136
        : Parent(*adaptor._digraph) {}
137 137

	
138 138
      ArcMap(const Adaptor& adaptor, const _Value& value)
139 139
        : Parent(*adaptor._digraph, value) {}
140 140

	
141 141
    private:
142 142
      ArcMap& operator=(const ArcMap& cmap) {
143 143
        return operator=<ArcMap>(cmap);
144 144
      }
145 145

	
146 146
      template <typename CMap>
147 147
      ArcMap& operator=(const CMap& cmap) {
148 148
        Parent::operator=(cmap);
149 149
        return *this;
150 150
      }
151 151

	
152 152
    };
153 153

	
154 154
  };
155 155

	
156 156
  template<typename _Graph>
157 157
  class GraphAdaptorBase {
158 158
  public:
159 159
    typedef _Graph Graph;
160 160
    typedef Graph ParentGraph;
161 161

	
162 162
  protected:
163 163
    Graph* _graph;
164 164

	
165 165
    GraphAdaptorBase() : _graph(0) {}
166 166

	
167 167
    void setGraph(Graph& graph) { _graph = &graph; }
168 168

	
169 169
  public:
170 170
    GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
171 171

	
172 172
    typedef typename Graph::Node Node;
173 173
    typedef typename Graph::Arc Arc;
174 174
    typedef typename Graph::Edge Edge;
175 175

	
176 176
    void first(Node& i) const { _graph->first(i); }
177 177
    void first(Arc& i) const { _graph->first(i); }
178 178
    void first(Edge& i) const { _graph->first(i); }
179 179
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
180 180
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
181 181
    void firstInc(Edge &i, bool &d, const Node &n) const {
182 182
      _graph->firstInc(i, d, n);
183 183
    }
184 184

	
185 185
    void next(Node& i) const { _graph->next(i); }
186 186
    void next(Arc& i) const { _graph->next(i); }
187 187
    void next(Edge& i) const { _graph->next(i); }
188 188
    void nextIn(Arc& i) const { _graph->nextIn(i); }
189 189
    void nextOut(Arc& i) const { _graph->nextOut(i); }
190 190
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
191 191

	
192 192
    Node u(const Edge& e) const { return _graph->u(e); }
193 193
    Node v(const Edge& e) const { return _graph->v(e); }
194 194

	
195 195
    Node source(const Arc& a) const { return _graph->source(a); }
196 196
    Node target(const Arc& a) const { return _graph->target(a); }
197 197

	
198 198
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
199 199
    int nodeNum() const { return _graph->nodeNum(); }
200 200

	
201 201
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
202 202
    int arcNum() const { return _graph->arcNum(); }
203 203
    int edgeNum() const { return _graph->edgeNum(); }
204 204

	
205 205
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
206 206
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
207 207
      return _graph->findArc(u, v, prev);
208 208
    }
209 209
    Edge findEdge(const Node& u, const Node& v, const Edge& prev = INVALID) {
210 210
      return _graph->findEdge(u, v, prev);
211 211
    }
212 212

	
213 213
    Node addNode() { return _graph->addNode(); }
214 214
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
215 215

	
216 216
    void erase(const Node& i) { _graph->erase(i); }
217 217
    void erase(const Edge& i) { _graph->erase(i); }
218 218

	
219 219
    void clear() { _graph->clear(); }
220 220

	
221 221
    bool direction(const Arc& a) const { return _graph->direction(a); }
222 222
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
223 223

	
224 224
    int id(const Node& v) const { return _graph->id(v); }
225 225
    int id(const Arc& a) const { return _graph->id(a); }
226 226
    int id(const Edge& e) const { return _graph->id(e); }
227 227

	
228 228
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
229 229
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
230 230
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
231 231

	
232 232
    int maxNodeId() const { return _graph->maxNodeId(); }
233 233
    int maxArcId() const { return _graph->maxArcId(); }
234 234
    int maxEdgeId() const { return _graph->maxEdgeId(); }
235 235

	
236 236
    typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
237 237
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
238 238

	
239 239
    typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
240 240
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
241 241

	
242 242
    typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
243 243
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
244 244

	
245 245
    template <typename _Value>
246 246
    class NodeMap : public Graph::template NodeMap<_Value> {
247 247
    public:
248 248
      typedef typename Graph::template NodeMap<_Value> Parent;
249 249
      explicit NodeMap(const GraphAdaptorBase<Graph>& adapter)
250 250
        : Parent(*adapter._graph) {}
251 251
      NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
252 252
        : Parent(*adapter._graph, value) {}
253 253

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

	
259 259
      template <typename CMap>
260 260
      NodeMap& operator=(const CMap& cmap) {
261 261
        Parent::operator=(cmap);
262 262
        return *this;
263 263
      }
264 264

	
265 265
    };
266 266

	
267 267
    template <typename _Value>
268 268
    class ArcMap : public Graph::template ArcMap<_Value> {
269 269
    public:
270 270
      typedef typename Graph::template ArcMap<_Value> Parent;
271 271
      explicit ArcMap(const GraphAdaptorBase<Graph>& adapter)
272 272
        : Parent(*adapter._graph) {}
273 273
      ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
274 274
        : Parent(*adapter._graph, value) {}
275 275

	
276 276
    private:
277 277
      ArcMap& operator=(const ArcMap& cmap) {
278 278
        return operator=<ArcMap>(cmap);
279 279
      }
280 280

	
281 281
      template <typename CMap>
282 282
      ArcMap& operator=(const CMap& cmap) {
283 283
        Parent::operator=(cmap);
284 284
        return *this;
285 285
      }
286 286
    };
287 287

	
288 288
    template <typename _Value>
289 289
    class EdgeMap : public Graph::template EdgeMap<_Value> {
290 290
    public:
291 291
      typedef typename Graph::template EdgeMap<_Value> Parent;
292 292
      explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
293 293
        : Parent(*adapter._graph) {}
294 294
      EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
295 295
        : Parent(*adapter._graph, value) {}
296 296

	
297 297
    private:
298 298
      EdgeMap& operator=(const EdgeMap& cmap) {
299 299
        return operator=<EdgeMap>(cmap);
300 300
      }
301 301

	
302 302
      template <typename CMap>
303 303
      EdgeMap& operator=(const CMap& cmap) {
304 304
        Parent::operator=(cmap);
305 305
        return *this;
306 306
      }
307 307
    };
308 308

	
309 309
  };
310 310

	
311 311
  template <typename _Digraph>
312 312
  class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
313 313
  public:
314 314
    typedef _Digraph Digraph;
315 315
    typedef DigraphAdaptorBase<_Digraph> Parent;
316 316
  protected:
317 317
    ReverseDigraphBase() : Parent() { }
318 318
  public:
319 319
    typedef typename Parent::Node Node;
320 320
    typedef typename Parent::Arc Arc;
321 321

	
322 322
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
323 323
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
324 324

	
325 325
    void nextIn(Arc& a) const { Parent::nextOut(a); }
326 326
    void nextOut(Arc& a) const { Parent::nextIn(a); }
327 327

	
328 328
    Node source(const Arc& a) const { return Parent::target(a); }
329 329
    Node target(const Arc& a) const { return Parent::source(a); }
330 330

	
331 331
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
332 332

	
333 333
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
334 334
    Arc findArc(const Node& u, const Node& v,
335 335
                const Arc& prev = INVALID) {
336 336
      return Parent::findArc(v, u, prev);
337 337
    }
338 338

	
339 339
  };
340 340

	
341 341
  /// \ingroup graph_adaptors
342 342
  ///
343 343
  /// \brief A digraph adaptor which reverses the orientation of the arcs.
344 344
  ///
345 345
  /// ReverseDigraph reverses the arcs in the adapted digraph. The
346 346
  /// SubDigraph is conform to the \ref concepts::Digraph
347 347
  /// "Digraph concept".
348 348
  ///
349 349
  /// \tparam _Digraph It must be conform to the \ref concepts::Digraph
350 350
  /// "Digraph concept". The type can be specified to be const.
351 351
  template<typename _Digraph>
352 352
  class ReverseDigraph :
353 353
    public DigraphAdaptorExtender<ReverseDigraphBase<_Digraph> > {
354 354
  public:
355 355
    typedef _Digraph Digraph;
356 356
    typedef DigraphAdaptorExtender<
357 357
      ReverseDigraphBase<_Digraph> > Parent;
358 358
  protected:
359 359
    ReverseDigraph() { }
360 360
  public:
361 361

	
362 362
    /// \brief Constructor
363 363
    ///
364 364
    /// Creates a reverse digraph adaptor for the given digraph
365 365
    explicit ReverseDigraph(Digraph& digraph) {
366 366
      Parent::setDigraph(digraph);
367 367
    }
368 368
  };
369 369

	
370 370
  /// \brief Just gives back a reverse digraph adaptor
371 371
  ///
372 372
  /// Just gives back a reverse digraph adaptor
373 373
  template<typename Digraph>
374 374
  ReverseDigraph<const Digraph> reverseDigraph(const Digraph& digraph) {
375 375
    return ReverseDigraph<const Digraph>(digraph);
376 376
  }
377 377

	
378 378
  template <typename _Digraph, typename _NodeFilterMap,
379 379
            typename _ArcFilterMap, bool _checked = true>
380 380
  class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
381 381
  public:
382 382
    typedef _Digraph Digraph;
383 383
    typedef _NodeFilterMap NodeFilterMap;
384 384
    typedef _ArcFilterMap ArcFilterMap;
385 385

	
386 386
    typedef SubDigraphBase Adaptor;
387 387
    typedef DigraphAdaptorBase<_Digraph> Parent;
388 388
  protected:
389 389
    NodeFilterMap* _node_filter;
390 390
    ArcFilterMap* _arc_filter;
391 391
    SubDigraphBase()
392 392
      : Parent(), _node_filter(0), _arc_filter(0) { }
393 393

	
394 394
    void setNodeFilterMap(NodeFilterMap& node_filter) {
395 395
      _node_filter = &node_filter;
396 396
    }
397 397
    void setArcFilterMap(ArcFilterMap& arc_filter) {
398 398
      _arc_filter = &arc_filter;
399 399
    }
400 400

	
401 401
  public:
402 402

	
403 403
    typedef typename Parent::Node Node;
404 404
    typedef typename Parent::Arc Arc;
405 405

	
406 406
    void first(Node& i) const {
407 407
      Parent::first(i);
408 408
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
409 409
    }
410 410

	
411 411
    void first(Arc& i) const {
412 412
      Parent::first(i);
413 413
      while (i != INVALID && (!(*_arc_filter)[i]
414 414
                              || !(*_node_filter)[Parent::source(i)]
415 415
                              || !(*_node_filter)[Parent::target(i)]))
416 416
        Parent::next(i);
417 417
    }
418 418

	
419 419
    void firstIn(Arc& i, const Node& n) const {
420 420
      Parent::firstIn(i, n);
421 421
      while (i != INVALID && (!(*_arc_filter)[i]
422 422
                              || !(*_node_filter)[Parent::source(i)]))
423 423
        Parent::nextIn(i);
424 424
    }
425 425

	
426 426
    void firstOut(Arc& i, const Node& n) const {
427 427
      Parent::firstOut(i, n);
428 428
      while (i != INVALID && (!(*_arc_filter)[i]
429 429
                              || !(*_node_filter)[Parent::target(i)]))
430 430
        Parent::nextOut(i);
431 431
    }
432 432

	
433 433
    void next(Node& i) const {
434 434
      Parent::next(i);
435 435
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
436 436
    }
437 437

	
438 438
    void next(Arc& i) const {
439 439
      Parent::next(i);
440 440
      while (i != INVALID && (!(*_arc_filter)[i]
441 441
                              || !(*_node_filter)[Parent::source(i)]
442 442
                              || !(*_node_filter)[Parent::target(i)]))
443 443
        Parent::next(i);
444 444
    }
445 445

	
446 446
    void nextIn(Arc& i) const {
447 447
      Parent::nextIn(i);
448 448
      while (i != INVALID && (!(*_arc_filter)[i]
449 449
                              || !(*_node_filter)[Parent::source(i)]))
450 450
        Parent::nextIn(i);
451 451
    }
452 452

	
453 453
    void nextOut(Arc& i) const {
454 454
      Parent::nextOut(i);
455 455
      while (i != INVALID && (!(*_arc_filter)[i]
456 456
                              || !(*_node_filter)[Parent::target(i)]))
457 457
        Parent::nextOut(i);
458 458
    }
459 459

	
460 460
    void hide(const Node& n) const { _node_filter->set(n, false); }
461 461
    void hide(const Arc& a) const { _arc_filter->set(a, false); }
462 462

	
463 463
    void unHide(const Node& n) const { _node_filter->set(n, true); }
464 464
    void unHide(const Arc& a) const { _arc_filter->set(a, true); }
465 465

	
466 466
    bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
467 467
    bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
468 468

	
469 469
    typedef False NodeNumTag;
470 470
    typedef False EdgeNumTag;
471 471

	
472 472
    typedef FindEdgeTagIndicator<Digraph> FindEdgeTag;
473 473
    Arc findArc(const Node& source, const Node& target,
474 474
                const Arc& prev = INVALID) {
475 475
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
476 476
        return INVALID;
477 477
      }
478 478
      Arc arc = Parent::findArc(source, target, prev);
479 479
      while (arc != INVALID && !(*_arc_filter)[arc]) {
480 480
        arc = Parent::findArc(source, target, arc);
481 481
      }
482 482
      return arc;
483 483
    }
484 484

	
485 485
    template <typename _Value>
486 486
    class NodeMap : public SubMapExtender<Adaptor,
487 487
      typename Parent::template NodeMap<_Value> > {
488 488
    public:
489 489
      typedef _Value Value;
490 490
      typedef SubMapExtender<Adaptor, typename Parent::
491 491
                             template NodeMap<Value> > MapParent;
492 492

	
493 493
      NodeMap(const Adaptor& adaptor)
494 494
        : MapParent(adaptor) {}
495 495
      NodeMap(const Adaptor& adaptor, const Value& value)
496 496
        : MapParent(adaptor, value) {}
497 497

	
498 498
    private:
499 499
      NodeMap& operator=(const NodeMap& cmap) {
500 500
        return operator=<NodeMap>(cmap);
501 501
      }
502 502

	
503 503
      template <typename CMap>
504 504
      NodeMap& operator=(const CMap& cmap) {
505 505
        MapParent::operator=(cmap);
506 506
        return *this;
507 507
      }
508 508
    };
509 509

	
510 510
    template <typename _Value>
511 511
    class ArcMap : public SubMapExtender<Adaptor,
512 512
      typename Parent::template ArcMap<_Value> > {
513 513
    public:
514 514
      typedef _Value Value;
515 515
      typedef SubMapExtender<Adaptor, typename Parent::
516 516
                             template ArcMap<Value> > MapParent;
517 517

	
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 29
  ArgParser::ArgParser(int argc, const char * const *argv)
30 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 34
  }
35 35

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

	
60 60

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

	
75 75
  ArgParser &ArgParser::doubleOption(const std::string &name,
76 76
                               const std::string &help,
77 77
                               double value, bool obl)
78 78
  {
79 79
    ParData p;
80 80
    p.double_p=new double(value);
81 81
    p.self_delete=true;
82 82
    p.help=help;
83 83
    p.type=DOUBLE;
84 84
    p.mandatory=obl;
85 85
    _opts[name]=p;
86 86
    return *this;
87 87
  }
88 88

	
89 89
  ArgParser &ArgParser::boolOption(const std::string &name,
90 90
                               const std::string &help,
91 91
                               bool value, bool obl)
92 92
  {
93 93
    ParData p;
94 94
    p.bool_p=new bool(value);
95 95
    p.self_delete=true;
96 96
    p.help=help;
97 97
    p.type=BOOL;
98 98
    p.mandatory=obl;
99 99
    _opts[name]=p;
100 100
    return *this;
101 101
  }
102 102

	
103 103
  ArgParser &ArgParser::stringOption(const std::string &name,
104 104
                               const std::string &help,
105 105
                               std::string value, bool obl)
106 106
  {
107 107
    ParData p;
108 108
    p.string_p=new std::string(value);
109 109
    p.self_delete=true;
110 110
    p.help=help;
111 111
    p.type=STRING;
112 112
    p.mandatory=obl;
113 113
    _opts[name]=p;
114 114
    return *this;
115 115
  }
116 116

	
117 117
  ArgParser &ArgParser::refOption(const std::string &name,
118 118
                               const std::string &help,
119 119
                               int &ref, bool obl)
120 120
  {
121 121
    ParData p;
122 122
    p.int_p=&ref;
123 123
    p.self_delete=false;
124 124
    p.help=help;
125 125
    p.type=INTEGER;
126 126
    p.mandatory=obl;
127 127
    _opts[name]=p;
128 128
    return *this;
129 129
  }
130 130

	
131 131
  ArgParser &ArgParser::refOption(const std::string &name,
132 132
                                  const std::string &help,
133 133
                                  double &ref, bool obl)
134 134
  {
135 135
    ParData p;
136 136
    p.double_p=&ref;
137 137
    p.self_delete=false;
138 138
    p.help=help;
139 139
    p.type=DOUBLE;
140 140
    p.mandatory=obl;
141 141
    _opts[name]=p;
142 142
    return *this;
143 143
  }
144 144

	
145 145
  ArgParser &ArgParser::refOption(const std::string &name,
146 146
                                  const std::string &help,
147 147
                                  bool &ref, bool obl)
148 148
  {
149 149
    ParData p;
150 150
    p.bool_p=&ref;
151 151
    p.self_delete=false;
152 152
    p.help=help;
153 153
    p.type=BOOL;
154 154
    p.mandatory=obl;
155 155
    _opts[name]=p;
156 156

	
157 157
    ref = false;
158 158

	
159 159
    return *this;
160 160
  }
161 161

	
162 162
  ArgParser &ArgParser::refOption(const std::string &name,
163 163
                               const std::string &help,
164 164
                               std::string &ref, bool obl)
165 165
  {
166 166
    ParData p;
167 167
    p.string_p=&ref;
168 168
    p.self_delete=false;
169 169
    p.help=help;
170 170
    p.type=STRING;
171 171
    p.mandatory=obl;
172 172
    _opts[name]=p;
173 173
    return *this;
174 174
  }
175 175

	
176 176
  ArgParser &ArgParser::funcOption(const std::string &name,
177 177
                               const std::string &help,
178 178
                               void (*func)(void *),void *data)
179 179
  {
180 180
    ParData p;
181 181
    p.func_p.p=func;
182 182
    p.func_p.data=data;
183 183
    p.self_delete=false;
184 184
    p.help=help;
185 185
    p.type=FUNC;
186 186
    p.mandatory=false;
187 187
    _opts[name]=p;
188 188
    return *this;
189 189
  }
190 190

	
191 191
  ArgParser &ArgParser::optionGroup(const std::string &group,
192 192
                                    const std::string &opt)
193 193
  {
194 194
    Opts::iterator i = _opts.find(opt);
195 195
    LEMON_ASSERT(i!=_opts.end(), "Unknown option: '"+opt+"'");
196 196
    LEMON_ASSERT(!(i->second.ingroup),
197 197
                 "Option already in option group: '"+opt+"'");
198 198
    GroupData &g=_groups[group];
199 199
    g.opts.push_back(opt);
200 200
    i->second.ingroup=true;
201 201
    return *this;
202 202
  }
203 203

	
204 204
  ArgParser &ArgParser::onlyOneGroup(const std::string &group)
205 205
  {
206 206
    GroupData &g=_groups[group];
207 207
    g.only_one=true;
208 208
    return *this;
209 209
  }
210 210

	
211 211
  ArgParser &ArgParser::synonym(const std::string &syn,
212 212
                                const std::string &opt)
213 213
  {
214 214
    Opts::iterator o = _opts.find(opt);
215 215
    Opts::iterator s = _opts.find(syn);
216 216
    LEMON_ASSERT(o!=_opts.end(), "Unknown option: '"+opt+"'");
217 217
    LEMON_ASSERT(s==_opts.end(), "Option already used: '"+syn+"'");
218 218
    ParData p;
219 219
    p.help=opt;
220 220
    p.mandatory=false;
221 221
    p.syn=true;
222 222
    _opts[syn]=p;
223 223
    o->second.has_syn=true;
224 224
    return *this;
225 225
  }
226 226

	
227 227
  ArgParser &ArgParser::mandatoryGroup(const std::string &group)
228 228
  {
229 229
    GroupData &g=_groups[group];
230 230
    g.mandatory=true;
231 231
    return *this;
232 232
  }
233 233

	
234 234
  ArgParser &ArgParser::other(const std::string &name,
235 235
                              const std::string &help)
236 236
  {
237 237
    _others_help.push_back(OtherArg(name,help));
238 238
    return *this;
239 239
  }
240 240

	
241 241
  void ArgParser::show(std::ostream &os,Opts::const_iterator i) const
242 242
  {
243 243
    os << "-" << i->first;
244 244
    if(i->second.has_syn)
245 245
      for(Opts::const_iterator j=_opts.begin();j!=_opts.end();++j)
246 246
        if(j->second.syn&&j->second.help==i->first)
247 247
          os << "|-" << j->first;
248 248
    switch(i->second.type) {
249 249
    case STRING:
250 250
      os << " str";
251 251
      break;
252 252
    case INTEGER:
253 253
      os << " int";
254 254
      break;
255 255
    case DOUBLE:
256 256
      os << " num";
257 257
      break;
258 258
    default:
259 259
      break;
260 260
    }
261 261
  }
262 262

	
263 263
  void ArgParser::show(std::ostream &os,Groups::const_iterator i) const
264 264
  {
265 265
    GroupData::Opts::const_iterator o=i->second.opts.begin();
266 266
    while(o!=i->second.opts.end()) {
267 267
      show(os,_opts.find(*o));
268 268
      ++o;
269 269
      if(o!=i->second.opts.end()) os<<'|';
270 270
    }
271 271
  }
272 272

	
273 273
  void ArgParser::showHelp(Opts::const_iterator i) const
274 274
  {
275 275
    if(i->second.help.size()==0||i->second.syn) return;
276 276
    std::cerr << "  ";
277 277
    show(std::cerr,i);
278 278
    std::cerr << std::endl;
279 279
    std::cerr << "     " << i->second.help << std::endl;
280 280
  }
281 281
  void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::const_iterator i)
282 282
    const
283 283
  {
284 284
    if(i->help.size()==0) return;
285 285
    std::cerr << "  " << i->name << std::endl
286 286
              << "     " << i->help << std::endl;
287 287
  }
288 288

	
289 289
  void ArgParser::shortHelp() const
290 290
  {
291 291
    const unsigned int LINE_LEN=77;
292 292
    const std::string indent("    ");
293 293
    std::cerr << "Usage:\n  " << _command_name;
294 294
    int pos=_command_name.size()+2;
295 295
    for(Groups::const_iterator g=_groups.begin();g!=_groups.end();++g) {
296 296
      std::ostringstream cstr;
297 297
      cstr << ' ';
298 298
      if(!g->second.mandatory) cstr << '[';
299 299
      show(cstr,g);
300 300
      if(!g->second.mandatory) cstr << ']';
301 301
      if(pos+cstr.str().size()>LINE_LEN) {
302 302
        std::cerr << std::endl << indent;
303 303
        pos=indent.size();
304 304
      }
305 305
      std::cerr << cstr.str();
306 306
      pos+=cstr.str().size();
307 307
    }
308 308
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
309 309
      if(!i->second.ingroup&&!i->second.syn) {
310 310
        std::ostringstream cstr;
311 311
        cstr << ' ';
312 312
        if(!i->second.mandatory) cstr << '[';
313 313
        show(cstr,i);
314 314
        if(!i->second.mandatory) cstr << ']';
315 315
        if(pos+cstr.str().size()>LINE_LEN) {
316 316
          std::cerr << std::endl << indent;
317 317
          pos=indent.size();
318 318
        }
319 319
        std::cerr << cstr.str();
320 320
        pos+=cstr.str().size();
321 321
      }
322 322
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
323 323
        i!=_others_help.end();++i)
324 324
      {
325 325
        std::ostringstream cstr;
326 326
        cstr << ' ' << i->name;
327 327

	
328 328
        if(pos+cstr.str().size()>LINE_LEN) {
329 329
          std::cerr << std::endl << indent;
330 330
          pos=indent.size();
331 331
        }
332 332
        std::cerr << cstr.str();
333 333
        pos+=cstr.str().size();
334 334
      }
335 335
    std::cerr << std::endl;
336 336
  }
337 337

	
338 338
  void ArgParser::showHelp() const
339 339
  {
340 340
    shortHelp();
341 341
    std::cerr << "Where:\n";
342 342
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
343 343
        i!=_others_help.end();++i) showHelp(i);
344 344
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
345 345
    exit(1);
346 346
  }
347 347

	
348 348

	
349 349
  void ArgParser::unknownOpt(std::string arg) const
350 350
  {
351 351
    std::cerr << "\nUnknown option: " << arg << "\n";
352 352
    std::cerr << "\nType '" << _command_name <<
353 353
      " --help' to obtain a short summary on the usage.\n\n";
354 354
    exit(1);
355 355
  }
356 356

	
357 357
  void ArgParser::requiresValue(std::string arg, OptType t) const
358 358
  {
359 359
    std::cerr << "Argument '" << arg << "' requires a";
360 360
    switch(t) {
361 361
    case STRING:
362 362
      std::cerr << " string";
363 363
      break;
364 364
    case INTEGER:
365 365
      std::cerr << "n integer";
366 366
      break;
367 367
    case DOUBLE:
368 368
      std::cerr << " floating point";
369 369
      break;
370 370
    default:
371 371
      break;
372 372
    }
373 373
    std::cerr << " value\n\n";
374 374
    showHelp();
375 375
  }
376 376

	
377 377

	
378 378
  void ArgParser::checkMandatories() const
379 379
  {
380 380
    bool ok=true;
381 381
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
382 382
      if(i->second.mandatory&&!i->second.set)
383 383
        {
384 384
          if(ok)
385 385
            std::cerr << _command_name
386 386
                      << ": The following mandatory arguments are missing.\n";
387 387
          ok=false;
388 388
          showHelp(i);
389 389
        }
390 390
    for(Groups::const_iterator i=_groups.begin();i!=_groups.end();++i)
391 391
      if(i->second.mandatory||i->second.only_one)
392 392
        {
393 393
          int set=0;
394 394
          for(GroupData::Opts::const_iterator o=i->second.opts.begin();
395 395
              o!=i->second.opts.end();++o)
396 396
            if(_opts.find(*o)->second.set) ++set;
397 397
          if(i->second.mandatory&&!set) {
398 398
            std::cerr << _command_name <<
399 399
              ": At least one of the following arguments is mandatory.\n";
400 400
            ok=false;
401 401
            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
402 402
                o!=i->second.opts.end();++o)
403 403
              showHelp(_opts.find(*o));
404 404
          }
405 405
          if(i->second.only_one&&set>1) {
406 406
            std::cerr << _command_name <<
407 407
              ": At most one of the following arguments can be given.\n";
408 408
            ok=false;
409 409
            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
410 410
                o!=i->second.opts.end();++o)
411 411
              showHelp(_opts.find(*o));
412 412
          }
413 413
        }
414 414
    if(!ok) {
415 415
      std::cerr << "\nType '" << _command_name <<
416 416
        " --help' to obtain a short summary on the usage.\n\n";
417 417
      exit(1);
418 418
    }
419 419
  }
420 420

	
421 421
  ArgParser &ArgParser::parse()
422 422
  {
423 423
    for(int ar=1; ar<_argc; ++ar) {
424 424
      std::string arg(_argv[ar]);
425 425
      if (arg[0] != '-' || arg.size() == 1) {
426 426
        _file_args.push_back(arg);
427 427
      }
428 428
      else {
429 429
        Opts::iterator i = _opts.find(arg.substr(1));
430 430
        if(i==_opts.end()) unknownOpt(arg);
431 431
        else {
432 432
          if(i->second.syn) i=_opts.find(i->second.help);
433 433
          ParData &p(i->second);
434 434
          if (p.type==BOOL) *p.bool_p=true;
435 435
          else if (p.type==FUNC) p.func_p.p(p.func_p.data);
436 436
          else if(++ar==_argc) requiresValue(arg, p.type);
437 437
          else {
438 438
            std::string val(_argv[ar]);
439 439
            std::istringstream vals(val);
440 440
            switch(p.type) {
441 441
            case STRING:
442 442
              *p.string_p=val;
443 443
              break;
444 444
            case INTEGER:
445 445
              vals >> *p.int_p;
446 446
              break;
447 447
            case DOUBLE:
448 448
              vals >> *p.double_p;
449 449
              break;
450 450
            default:
451 451
              break;
452 452
            }
453 453
            if(p.type!=STRING&&(!vals||!vals.eof()))
454 454
              requiresValue(arg, p.type);
455 455
          }
456 456
          p.set = true;
457 457
        }
458 458
      }
459 459
    }
460 460
    checkMandatories();
461 461

	
462 462
    return *this;
463 463
  }
464 464

	
465 465
}
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 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 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.
171 171
    ///\param obl Indicate if the option is mandatory.
172 172
    ArgParser &stringOption(const std::string &name,
173 173
                      const std::string &help,
174 174
                      std::string value="", bool obl=false);
175 175

	
176 176
    ///Give help string for non-parsed arguments.
177 177

	
178 178
    ///With this function you can give help string for non-parsed arguments.
179 179
    ///The parameter \c name will be printed in the short usage line, while
180 180
    ///\c help gives a more detailed description.
181 181
    ArgParser &other(const std::string &name,
182 182
                     const std::string &help="");
183 183

	
184 184
    ///@}
185 185

	
186 186
    ///\name Options with External Storage
187 187
    ///Using this functions, the value of the option will be directly written
188 188
    ///into a variable once the option appears in the command line.
189 189

	
190 190
    ///@{
191 191

	
192 192
    ///Add a new integer type option with a storage reference
193 193

	
194 194
    ///Add a new integer type option with a storage reference.
195 195
    ///\param name The name of the option. The leading '-' must be omitted.
196 196
    ///\param help A help string.
197 197
    ///\param obl Indicate if the option is mandatory.
198 198
    ///\retval ref The value of the argument will be written to this variable.
199 199
    ArgParser &refOption(const std::string &name,
200 200
                    const std::string &help,
201 201
                    int &ref, bool obl=false);
202 202

	
203 203
    ///Add a new floating type option with a storage reference
204 204

	
205 205
    ///Add a new floating type option with a storage reference.
206 206
    ///\param name The name of the option. The leading '-' must be omitted.
207 207
    ///\param help A help string.
208 208
    ///\param obl Indicate if the option is mandatory.
209 209
    ///\retval ref The value of the argument will be written to this variable.
210 210
    ArgParser &refOption(const std::string &name,
211 211
                      const std::string &help,
212 212
                      double &ref, bool obl=false);
213 213

	
214 214
    ///Add a new bool type option with a storage reference
215 215

	
216 216
    ///Add a new bool type option with a storage reference.
217 217
    ///\param name The name of the option. The leading '-' must be omitted.
218 218
    ///\param help A help string.
219 219
    ///\param obl Indicate if the option is mandatory.
220 220
    ///\retval ref The value of the argument will be written to this variable.
221 221
    ///\note A mandatory bool obtion is of very little use.
222 222
    ArgParser &refOption(const std::string &name,
223 223
                      const std::string &help,
224 224
                      bool &ref, bool obl=false);
225 225

	
226 226
    ///Add a new string type option with a storage reference
227 227

	
228 228
    ///Add a new string type option with a storage reference.
229 229
    ///\param name The name of the option. The leading '-' must be omitted.
230 230
    ///\param help A help string.
231 231
    ///\param obl Indicate if the option is mandatory.
232 232
    ///\retval ref The value of the argument will be written to this variable.
233 233
    ArgParser &refOption(const std::string &name,
234 234
                      const std::string &help,
235 235
                      std::string &ref, bool obl=false);
236 236

	
237 237
    ///@}
238 238

	
239 239
    ///\name Option Groups and Synonyms
240 240
    ///
241 241

	
242 242
    ///@{
243 243

	
244 244
    ///Bundle some options into a group
245 245

	
246 246
    /// You can group some option by calling this function repeatedly for each
247 247
    /// option to be grouped with the same groupname.
248 248
    ///\param group The group name.
249 249
    ///\param opt The option name.
250 250
    ArgParser &optionGroup(const std::string &group,
251 251
                           const std::string &opt);
252 252

	
253 253
    ///Make the members of a group exclusive
254 254

	
255 255
    ///If you call this function for a group, than at most one of them can be
256 256
    ///given at the same time.
257 257
    ArgParser &onlyOneGroup(const std::string &group);
258 258

	
259 259
    ///Make a group mandatory
260 260

	
261 261
    ///Using this function, at least one of the members of \c group
262 262
    ///must be given.
263 263
    ArgParser &mandatoryGroup(const std::string &group);
264 264

	
265 265
    ///Create synonym to an option
266 266

	
267 267
    ///With this function you can create a synonym \c syn of the
268 268
    ///option \c opt.
269 269
    ArgParser &synonym(const std::string &syn,
270 270
                           const std::string &opt);
271 271

	
272 272
    ///@}
273 273

	
274 274
  private:
275 275
    void show(std::ostream &os,Opts::const_iterator i) const;
276 276
    void show(std::ostream &os,Groups::const_iterator i) const;
277 277
    void showHelp(Opts::const_iterator i) const;
278 278
    void showHelp(std::vector<OtherArg>::const_iterator i) const;
279 279

	
280 280
    void unknownOpt(std::string arg) const;
281 281

	
282 282
    void requiresValue(std::string arg, OptType t) const;
283 283
    void checkMandatories() const;
284 284

	
285 285
    void shortHelp() const;
286 286
    void showHelp() const;
287 287
  public:
288 288

	
289 289
    ///Start the parsing process
290 290
    ArgParser &parse();
291 291

	
292 292
    /// Synonym for parse()
293 293
    ArgParser &run()
294 294
    {
295 295
      return parse();
296 296
    }
297 297

	
298 298
    ///Give back the command name (the 0th argument)
299 299
    const std::string &commandName() const { return _command_name; }
300 300

	
301 301
    ///Check if an opion has been given to the command.
302 302
    bool given(std::string op) const
303 303
    {
304 304
      Opts::const_iterator i = _opts.find(op);
305 305
      return i!=_opts.end()?i->second.set:false;
306 306
    }
307 307

	
308 308

	
309 309
    ///Magic type for operator[]
310 310

	
311 311
    ///This is the type of the return value of ArgParser::operator[]().
312 312
    ///It automatically converts to \c int, \c double, \c bool or
313 313
    ///\c std::string if the type of the option matches, which is checked
314 314
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
315 315
    ///type checking).
316 316
    class RefType
317 317
    {
318 318
      const ArgParser &_parser;
319 319
      std::string _name;
320 320
    public:
321 321
      ///\e
322 322
      RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
323 323
      ///\e
324 324
      operator bool()
325 325
      {
326 326
        Opts::const_iterator i = _parser._opts.find(_name);
327 327
        LEMON_ASSERT(i!=_parser._opts.end(),
328 328
                     std::string()+"Unkown option: '"+_name+"'");
329 329
        LEMON_ASSERT(i->second.type==ArgParser::BOOL,
330 330
                     std::string()+"'"+_name+"' is a bool option");
331 331
        return *(i->second.bool_p);
332 332
      }
333 333
      ///\e
334 334
      operator std::string()
335 335
      {
336 336
        Opts::const_iterator i = _parser._opts.find(_name);
337 337
        LEMON_ASSERT(i!=_parser._opts.end(),
338 338
                     std::string()+"Unkown option: '"+_name+"'");
339 339
        LEMON_ASSERT(i->second.type==ArgParser::STRING,
340 340
                     std::string()+"'"+_name+"' is a string option");
341 341
        return *(i->second.string_p);
342 342
      }
343 343
      ///\e
344 344
      operator double()
345 345
      {
346 346
        Opts::const_iterator i = _parser._opts.find(_name);
347 347
        LEMON_ASSERT(i!=_parser._opts.end(),
348 348
                     std::string()+"Unkown option: '"+_name+"'");
349 349
        LEMON_ASSERT(i->second.type==ArgParser::DOUBLE ||
350 350
                     i->second.type==ArgParser::INTEGER,
351 351
                     std::string()+"'"+_name+"' is a floating point option");
352 352
        return i->second.type==ArgParser::DOUBLE ?
353 353
          *(i->second.double_p) : *(i->second.int_p);
354 354
      }
355 355
      ///\e
356 356
      operator int()
357 357
      {
358 358
        Opts::const_iterator i = _parser._opts.find(_name);
359 359
        LEMON_ASSERT(i!=_parser._opts.end(),
360 360
                     std::string()+"Unkown option: '"+_name+"'");
361 361
        LEMON_ASSERT(i->second.type==ArgParser::INTEGER,
362 362
                     std::string()+"'"+_name+"' is an integer option");
363 363
        return *(i->second.int_p);
364 364
      }
365 365

	
366 366
    };
367 367

	
368 368
    ///Give back the value of an option
369 369

	
370 370
    ///Give back the value of an option.
371 371
    ///\sa RefType
372 372
    RefType operator[](const std::string &n) const
373 373
    {
374 374
      return RefType(*this, n);
375 375
    }
376 376

	
377 377
    ///Give back the non-option type arguments.
378 378

	
379 379
    ///Give back a reference to a vector consisting of the program arguments
380 380
    ///not starting with a '-' character.
381 381
    const std::vector<std::string> &files() const { return _file_args; }
382 382

	
383 383
  };
384 384
}
385 385

	
386 386
#endif // LEMON_ARG_PARSER_H
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_ASSERT_H
20 20
#define LEMON_ASSERT_H
21 21

	
22 22
/// \ingroup exceptions
23 23
/// \file
24 24
/// \brief Extended assertion handling
25 25

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

	
28 28
namespace lemon {
29 29

	
30 30
  inline void assert_fail_abort(const char *file, int line,
31 31
                                const char *function, const char* message,
32 32
                                const char *assertion)
33 33
  {
34 34
    std::cerr << file << ":" << line << ": ";
35 35
    if (function)
36 36
      std::cerr << function << ": ";
37 37
    std::cerr << message;
38 38
    if (assertion)
39 39
      std::cerr << " (assertion '" << assertion << "' failed)";
40 40
    std::cerr << std::endl;
41 41
    std::abort();
42 42
  }
43 43

	
44 44
  namespace _assert_bits {
45 45

	
46 46

	
47 47
    inline const char* cstringify(const std::string& str) {
48 48
      return str.c_str();
49 49
    }
50 50

	
51 51
    inline const char* cstringify(const char* str) {
52 52
      return str;
53 53
    }
54 54
  }
55 55
}
56 56

	
57 57
#endif // LEMON_ASSERT_H
58 58

	
59 59
#undef LEMON_ASSERT
60 60
#undef LEMON_DEBUG
61 61

	
62 62
#if (defined(LEMON_ASSERT_ABORT) ? 1 : 0) +               \
63 63
  (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1
64 64
#error "LEMON assertion system is not set properly"
65 65
#endif
66 66

	
67 67
#if ((defined(LEMON_ASSERT_ABORT) ? 1 : 0) +            \
68 68
     (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 ||     \
69 69
     defined(LEMON_ENABLE_ASSERTS)) &&                  \
70 70
  (defined(LEMON_DISABLE_ASSERTS) ||                    \
71 71
   defined(NDEBUG))
72 72
#error "LEMON assertion system is not set properly"
73 73
#endif
74 74

	
75 75

	
76 76
#if defined LEMON_ASSERT_ABORT
77 77
#  undef LEMON_ASSERT_HANDLER
78 78
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
79 79
#elif defined LEMON_ASSERT_CUSTOM
80 80
#  undef LEMON_ASSERT_HANDLER
81 81
#  ifndef LEMON_CUSTOM_ASSERT_HANDLER
82 82
#    error "LEMON_CUSTOM_ASSERT_HANDLER is not set"
83 83
#  endif
84 84
#  define LEMON_ASSERT_HANDLER LEMON_CUSTOM_ASSERT_HANDLER
85 85
#elif defined LEMON_DISABLE_ASSERTS
86 86
#  undef LEMON_ASSERT_HANDLER
87 87
#elif defined NDEBUG
88 88
#  undef LEMON_ASSERT_HANDLER
89 89
#else
90 90
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
91 91
#endif
92 92

	
93 93
#ifndef LEMON_FUNCTION_NAME
94 94
#  if defined __GNUC__
95 95
#    define LEMON_FUNCTION_NAME (__PRETTY_FUNCTION__)
96 96
#  elif defined _MSC_VER
97 97
#    define LEMON_FUNCTION_NAME (__FUNCSIG__)
98 98
#  elif __STDC_VERSION__ >= 199901L
99 99
#    define LEMON_FUNCTION_NAME (__func__)
100 100
#  else
101 101
#    define LEMON_FUNCTION_NAME ("<unknown>")
102 102
#  endif
103 103
#endif
104 104

	
105 105
#ifdef DOXYGEN
106 106

	
107 107
/// \ingroup exceptions
108 108
///
109 109
/// \brief Macro for assertion with customizable message
110 110
///
111 111
/// Macro for assertion with customizable message.
112 112
/// \param exp An expression that must be convertible to \c bool.  If it is \c
113 113
/// false, then an assertion is raised. The concrete behaviour depends on the
114 114
/// settings of the assertion system.
115 115
/// \param msg A <tt>const char*</tt> parameter, which can be used to provide
116 116
/// information about the circumstances of the failed assertion.
117 117
///
118 118
/// The assertions are enabled in the default behaviour.
119 119
/// You can disable them with the following code:
120 120
/// \code
121 121
/// #define LEMON_DISABLE_ASSERTS
122 122
/// \endcode
123 123
/// or with compilation parameters:
124 124
/// \code
125 125
/// g++ -DLEMON_DISABLE_ASSERTS
126 126
/// make CXXFLAGS='-DLEMON_DISABLE_ASSERTS'
127 127
/// \endcode
128 128
/// The checking is also disabled when the standard macro \c NDEBUG is defined.
129 129
///
130 130
/// As a default behaviour the failed assertion prints a short log message to
131 131
/// the standard error and aborts the execution.
132 132
///
133 133
/// However, the following modes can be used in the assertion system:
134 134
/// - \c LEMON_ASSERT_ABORT The failed assertion prints a short log message to
135 135
///   the standard error and aborts the program. It is the default behaviour.
136 136
/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler
137 137
///   function.
138 138
///   \code
139 139
///     void custom_assert_handler(const char* file, int line,
140 140
///                                const char* function, const char* message,
141 141
///                                const char* assertion);
142 142
///   \endcode
143 143
///   The name of the function should be defined as the \c
144 144
///   LEMON_CUSTOM_ASSERT_HANDLER macro name.
145 145
///   \code
146 146
///     #define LEMON_CUSTOM_ASSERT_HANDLER custom_assert_handler
147 147
///   \endcode
148 148
///   Whenever an assertion is occured, the custom assertion
149 149
///   handler is called with appropiate parameters.
150 150
///
151 151
/// The assertion mode can also be changed within one compilation unit.
152 152
/// If the macros are redefined with other settings and the
153 153
/// \ref lemon/assert.h "assert.h" file is reincluded, then the
154 154
/// behaviour is changed appropiately to the new settings.
155 155
#  define LEMON_ASSERT(exp, msg)                                        \
156 156
  (static_cast<void> (!!(exp) ? 0 : (                                   \
157 157
    LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                            \
158 158
                         LEMON_FUNCTION_NAME,                           \
159 159
                         ::lemon::_assert_bits::cstringify(msg), #exp), 0)))
160 160

	
161 161
/// \ingroup exceptions
162 162
///
163 163
/// \brief Macro for internal assertions
164 164
///
165 165
/// Macro for internal assertions, it is used in the library to check
166 166
/// the consistency of results of algorithms, several pre- and
167 167
/// postconditions and invariants. The checking is disabled by
168 168
/// default, but it can be turned on with the macro \c
169 169
/// LEMON_ENABLE_DEBUG.
170 170
/// \code
171 171
/// #define LEMON_ENABLE_DEBUG
172 172
/// \endcode
173 173
/// or with compilation parameters:
174 174
/// \code
175 175
/// g++ -DLEMON_ENABLE_DEBUG
176 176
/// make CXXFLAGS='-DLEMON_ENABLE_DEBUG'
177 177
/// \endcode
178 178
///
179 179
/// This macro works like the \c LEMON_ASSERT macro, therefore the
180 180
/// current behaviour depends on the settings of \c LEMON_ASSERT
181 181
/// macro.
182 182
///
183 183
/// \see LEMON_ASSERT
184 184
#  define LEMON_DEBUG(exp, msg)                                         \
185 185
  (static_cast<void> (!!(exp) ? 0 : (                                   \
186 186
    LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                            \
187 187
                         LEMON_FUNCTION_NAME,                           \
188 188
                         ::lemon::_assert_bits::cstringify(msg), #exp), 0)))
189 189

	
190 190
#else
191 191

	
192 192
#  ifndef LEMON_ASSERT_HANDLER
193 193
#    define LEMON_ASSERT(exp, msg)  (static_cast<void>(0))
194 194
#    define LEMON_DEBUG(exp, msg) (static_cast<void>(0))
195 195
#  else
196 196
#    define LEMON_ASSERT(exp, msg)                                      \
197 197
       (static_cast<void> (!!(exp) ? 0 : (                              \
198 198
        LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                        \
199 199
                             LEMON_FUNCTION_NAME,                       \
200 200
                             ::lemon::_assert_bits::cstringify(msg),    \
201 201
                             #exp), 0)))
202 202
#    if LEMON_ENABLE_DEBUG
203 203
#      define LEMON_DEBUG(exp, msg)                                     \
204 204
         (static_cast<void> (!!(exp) ? 0 : (                            \
205 205
           LEMON_ASSERT_HANDLER(__FILE__, __LINE__,                     \
206 206
                                LEMON_FUNCTION_NAME,                    \
207 207
                                ::lemon::_assert_bits::cstringify(msg), \
208 208
                                #exp), 0)))
209 209
#    else
210 210
#      define LEMON_DEBUG(exp, msg) (static_cast<void>(0))
211 211
#    endif
212 212
#  endif
213 213

	
214 214
#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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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
///\file
20 20
///\brief Some basic non-inline functions and static global data.
21 21

	
22 22
#include<lemon/tolerance.h>
23 23
#include<lemon/core.h>
24 24
namespace lemon {
25 25

	
26 26
  float Tolerance<float>::def_epsilon = 1e-4;
27 27
  double Tolerance<double>::def_epsilon = 1e-10;
28 28
  long double Tolerance<long double>::def_epsilon = 1e-14;
29 29

	
30 30
#ifndef LEMON_ONLY_TEMPLATES
31 31
  const Invalid INVALID = Invalid();
32 32
#endif
33 33

	
34 34
} //namespace lemon
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 52
    ///Instantiates a PredMap.
53 53

	
54 54
    ///This function instantiates a PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 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 67
    ///Instantiates a ProcessedMap.
68 68

	
69 69
    ///This function instantiates a ProcessedMap.
70 70
    ///\param g is the digraph, to which
71 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 86
    ///Instantiates a ReachedMap.
87 87

	
88 88
    ///This function instantiates a ReachedMap.
89 89
    ///\param g is the digraph, to which
90 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 101
    ///Instantiates a DistMap.
102 102

	
103 103
    ///This function instantiates a DistMap.
104 104
    ///\param g is the digraph, to which we would like to define the
105 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 type is \ref ListDigraph.
123 123
#ifdef DOXYGEN
124 124
  template <typename GR,
125 125
            typename TR>
126 126
#else
127 127
  template <typename GR=ListDigraph,
128 128
            typename TR=BfsDefaultTraits<GR> >
129 129
#endif
130 130
  class Bfs {
131 131
  public:
132 132

	
133 133
    ///The type of the digraph the algorithm runs on.
134 134
    typedef typename TR::Digraph Digraph;
135 135

	
136 136
    ///\brief The type of the map that stores the predecessor arcs of the
137 137
    ///shortest paths.
138 138
    typedef typename TR::PredMap PredMap;
139 139
    ///The type of the map that stores the distances of the nodes.
140 140
    typedef typename TR::DistMap DistMap;
141 141
    ///The type of the map that indicates which nodes are reached.
142 142
    typedef typename TR::ReachedMap ReachedMap;
143 143
    ///The type of the map that indicates which nodes are processed.
144 144
    typedef typename TR::ProcessedMap ProcessedMap;
145 145
    ///The type of the paths.
146 146
    typedef PredMapPath<Digraph, PredMap> Path;
147 147

	
148 148
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
149 149
    typedef TR Traits;
150 150

	
151 151
  private:
152 152

	
153 153
    typedef typename Digraph::Node Node;
154 154
    typedef typename Digraph::NodeIt NodeIt;
155 155
    typedef typename Digraph::Arc Arc;
156 156
    typedef typename Digraph::OutArcIt OutArcIt;
157 157

	
158 158
    //Pointer to the underlying digraph.
159 159
    const Digraph *G;
160 160
    //Pointer to the map of predecessor arcs.
161 161
    PredMap *_pred;
162 162
    //Indicates if _pred is locally allocated (true) or not.
163 163
    bool local_pred;
164 164
    //Pointer to the map of distances.
165 165
    DistMap *_dist;
166 166
    //Indicates if _dist is locally allocated (true) or not.
167 167
    bool local_dist;
168 168
    //Pointer to the map of reached status of the nodes.
169 169
    ReachedMap *_reached;
170 170
    //Indicates if _reached is locally allocated (true) or not.
171 171
    bool local_reached;
172 172
    //Pointer to the map of processed status of the nodes.
173 173
    ProcessedMap *_processed;
174 174
    //Indicates if _processed is locally allocated (true) or not.
175 175
    bool local_processed;
176 176

	
177 177
    std::vector<typename Digraph::Node> _queue;
178 178
    int _queue_head,_queue_tail,_queue_next_dist;
179 179
    int _curr_dist;
180 180

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

	
202 202
  protected:
203 203

	
204 204
    Bfs() {}
205 205

	
206 206
  public:
207 207

	
208 208
    typedef Bfs Create;
209 209

	
210 210
    ///\name Named Template Parameters
211 211

	
212 212
    ///@{
213 213

	
214 214
    template <class T>
215 215
    struct SetPredMapTraits : public Traits {
216 216
      typedef T PredMap;
217 217
      static PredMap *createPredMap(const Digraph &)
218 218
      {
219 219
        LEMON_ASSERT(false, "PredMap is not initialized");
220 220
        return 0; // ignore warnings
221 221
      }
222 222
    };
223 223
    ///\brief \ref named-templ-param "Named parameter" for setting
224 224
    ///PredMap type.
225 225
    ///
226 226
    ///\ref named-templ-param "Named parameter" for setting
227 227
    ///PredMap type.
228 228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229 229
    template <class T>
230 230
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 231
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 232
    };
233 233

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

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

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

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

	
313 313
    ///@}
314 314

	
315 315
  public:
316 316

	
317 317
    ///Constructor.
318 318

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

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

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

	
340 340
    ///Sets the map that stores the predecessor arcs.
341 341
    ///If you don't use this function before calling \ref run(Node) "run()"
342 342
    ///or \ref init(), an instance will be allocated automatically.
343 343
    ///The destructor deallocates this automatically allocated map,
344 344
    ///of course.
345 345
    ///\return <tt> (*this) </tt>
346 346
    Bfs &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

	
356 356
    ///Sets the map that indicates which nodes are reached.
357 357

	
358 358
    ///Sets the map that indicates which nodes are reached.
359 359
    ///If you don't use this function before calling \ref run(Node) "run()"
360 360
    ///or \ref init(), an instance will be allocated automatically.
361 361
    ///The destructor deallocates this automatically allocated map,
362 362
    ///of course.
363 363
    ///\return <tt> (*this) </tt>
364 364
    Bfs &reachedMap(ReachedMap &m)
365 365
    {
366 366
      if(local_reached) {
367 367
        delete _reached;
368 368
        local_reached=false;
369 369
      }
370 370
      _reached = &m;
371 371
      return *this;
372 372
    }
373 373

	
374 374
    ///Sets the map that indicates which nodes are processed.
375 375

	
376 376
    ///Sets the map that indicates which nodes are processed.
377 377
    ///If you don't use this function before calling \ref run(Node) "run()"
378 378
    ///or \ref init(), an instance will be allocated automatically.
379 379
    ///The destructor deallocates this automatically allocated map,
380 380
    ///of course.
381 381
    ///\return <tt> (*this) </tt>
382 382
    Bfs &processedMap(ProcessedMap &m)
383 383
    {
384 384
      if(local_processed) {
385 385
        delete _processed;
386 386
        local_processed=false;
387 387
      }
388 388
      _processed = &m;
389 389
      return *this;
390 390
    }
391 391

	
392 392
    ///Sets the map that stores the distances of the nodes.
393 393

	
394 394
    ///Sets the map that stores the distances of the nodes calculated by
395 395
    ///the algorithm.
396 396
    ///If you don't use this function before calling \ref run(Node) "run()"
397 397
    ///or \ref init(), an instance will be allocated automatically.
398 398
    ///The destructor deallocates this automatically allocated map,
399 399
    ///of course.
400 400
    ///\return <tt> (*this) </tt>
401 401
    Bfs &distMap(DistMap &m)
402 402
    {
403 403
      if(local_dist) {
404 404
        delete _dist;
405 405
        local_dist=false;
406 406
      }
407 407
      _dist = &m;
408 408
      return *this;
409 409
    }
410 410

	
411 411
  public:
412 412

	
413 413
    ///\name Execution Control
414 414
    ///The simplest way to execute the BFS algorithm is to use one of the
415 415
    ///member functions called \ref run(Node) "run()".\n
416 416
    ///If you need more control on the execution, first you have to call
417 417
    ///\ref init(), then you can add several source nodes with
418 418
    ///\ref addSource(). Finally the actual path computation can be
419 419
    ///performed with one of the \ref start() functions.
420 420

	
421 421
    ///@{
422 422

	
423 423
    ///\brief Initializes the internal data structures.
424 424
    ///
425 425
    ///Initializes the internal data structures.
426 426
    void init()
427 427
    {
428 428
      create_maps();
429 429
      _queue.resize(countNodes(*G));
430 430
      _queue_head=_queue_tail=0;
431 431
      _curr_dist=1;
432 432
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
433 433
        _pred->set(u,INVALID);
434 434
        _reached->set(u,false);
435 435
        _processed->set(u,false);
436 436
      }
437 437
    }
438 438

	
439 439
    ///Adds a new source node.
440 440

	
441 441
    ///Adds a new source node to the set of nodes to be processed.
442 442
    ///
443 443
    void addSource(Node s)
444 444
    {
445 445
      if(!(*_reached)[s])
446 446
        {
447 447
          _reached->set(s,true);
448 448
          _pred->set(s,INVALID);
449 449
          _dist->set(s,0);
450 450
          _queue[_queue_head++]=s;
451 451
          _queue_next_dist=_queue_head;
452 452
        }
453 453
    }
454 454

	
455 455
    ///Processes the next node.
456 456

	
457 457
    ///Processes the next node.
458 458
    ///
459 459
    ///\return The processed node.
460 460
    ///
461 461
    ///\pre The queue must not be empty.
462 462
    Node processNextNode()
463 463
    {
464 464
      if(_queue_tail==_queue_next_dist) {
465 465
        _curr_dist++;
466 466
        _queue_next_dist=_queue_head;
467 467
      }
468 468
      Node n=_queue[_queue_tail++];
469 469
      _processed->set(n,true);
470 470
      Node m;
471 471
      for(OutArcIt e(*G,n);e!=INVALID;++e)
472 472
        if(!(*_reached)[m=G->target(e)]) {
473 473
          _queue[_queue_head++]=m;
474 474
          _reached->set(m,true);
475 475
          _pred->set(m,e);
476 476
          _dist->set(m,_curr_dist);
477 477
        }
478 478
      return n;
479 479
    }
480 480

	
481 481
    ///Processes the next node.
482 482

	
483 483
    ///Processes the next node and checks if the given target node
484 484
    ///is reached. If the target node is reachable from the processed
485 485
    ///node, then the \c reach parameter will be set to \c true.
486 486
    ///
487 487
    ///\param target The target node.
488 488
    ///\retval reach Indicates if the target node is reached.
489 489
    ///It should be initially \c false.
490 490
    ///
491 491
    ///\return The processed node.
492 492
    ///
493 493
    ///\pre The queue must not be empty.
494 494
    Node processNextNode(Node target, bool& reach)
495 495
    {
496 496
      if(_queue_tail==_queue_next_dist) {
497 497
        _curr_dist++;
498 498
        _queue_next_dist=_queue_head;
499 499
      }
500 500
      Node n=_queue[_queue_tail++];
501 501
      _processed->set(n,true);
502 502
      Node m;
503 503
      for(OutArcIt e(*G,n);e!=INVALID;++e)
504 504
        if(!(*_reached)[m=G->target(e)]) {
505 505
          _queue[_queue_head++]=m;
506 506
          _reached->set(m,true);
507 507
          _pred->set(m,e);
508 508
          _dist->set(m,_curr_dist);
509 509
          reach = reach || (target == m);
510 510
        }
511 511
      return n;
512 512
    }
513 513

	
514 514
    ///Processes the next node.
515 515

	
516 516
    ///Processes the next node and checks if at least one of reached
517 517
    ///nodes has \c true value in the \c nm node map. If one node
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_BIN_HEAP_H
20 20
#define LEMON_BIN_HEAP_H
21 21

	
22 22
///\ingroup auxdat
23 23
///\file
24 24
///\brief Binary Heap implementation.
25 25

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

	
30 30
namespace lemon {
31 31

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

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

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

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

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

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

	
105 105

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
238 238

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

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

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

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

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

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

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

	
342 342
  }; // class BinHeap
343 343

	
344 344
} // namespace lemon
345 345

	
346 346
#endif // LEMON_BIN_HEAP_H
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 27
//\ingroup graphbits
28 28
//\file
29 29
//\brief Observer notifier for graph alteration observers.
30 30

	
31 31
namespace lemon {
32 32

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

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

	
102 102
    typedef True Notifier;
103 103

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

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

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

	
134 134
      friend class AlterationNotifier;
135 135

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

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

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

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

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

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

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

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

	
189 189
    private:
190 190

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

	
193 193
    protected:
194 194

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

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

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

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

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

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

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

	
246 246
    };
247 247

	
248 248
  protected:
249 249

	
250 250
    const Container* container;
251 251

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

	
255 255

	
256 256
  public:
257 257

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

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

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

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

	
289 289
    // \brief Sets the container.
290 290
    //
291 291
    // Sets the container.
292 292
    void setContainer(const Container& _container) {
293 293
      container = &_container;
294 294
    }
295 295

	
296 296
  protected:
297 297

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

	
300 300
  public:
301 301

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

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

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

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

	
332 332
  protected:
333 333

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

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

	
345 345
  public:
346 346

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

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

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

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

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

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

	
465 465
}
466 466

	
467 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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 29
// \ingroup graphbits
30 30
// \file
31 31
// \brief Graph map based on the array storage.
32 32

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

	
75 75
  public:
76 76

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

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

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

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

	
135 135

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

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

	
164 164
  protected:
165 165

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

	
170 170
  public:
171 171

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

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

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

	
198 198
  protected:
199 199

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

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

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

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

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

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

	
323 323
  private:
324 324

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

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

	
343 343
  };
344 344

	
345 345
}
346 346

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

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

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

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

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

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

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

	
42 42
  public:
43 43

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

	
48 48
    typedef True UndirectedTag;
49 49

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

	
53 53
    protected:
54 54
      bool forward;
55 55

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

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

	
62 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 77
    // First node of the edge
78 78
    Node u(const Edge &e) const {
79 79
      return Parent::source(e);
80 80
    }
81 81

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

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

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

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

	
106 106
    // Returns whether the given directed arc has the same orientation
107 107
    // as the corresponding edge.
108 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;
156 156
      }
157 157
      else {
158 158
        Parent::firstIn(e,n);
159 159
        e.forward = true;
160 160
      }
161 161
    }
162 162
    void nextIn(Arc &e) const {
163 163
      if( ! e.forward ) {
164 164
        Node n = Parent::source(e);
165 165
        Parent::nextOut(e);
166 166
        if( Edge(e) == INVALID ) {
167 167
          Parent::firstIn(e, n);
168 168
          e.forward = true;
169 169
        }
170 170
      }
171 171
      else {
172 172
        Parent::nextIn(e);
173 173
      }
174 174
    }
175 175

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

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

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

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

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

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

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

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

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

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

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

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

	
236 236
    int edgeNum() const {
237 237
      return Parent::arcNum();
238 238
    }
239 239

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

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

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

	
287 287
    typedef typename Parent::Node Node;
288 288
    typedef typename Parent::Edge Edge;
289 289

	
290 290

	
291 291
    using Parent::first;
292 292
    using Parent::next;
293 293

	
294 294
    using Parent::id;
295 295

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

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

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

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

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

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

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

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

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

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

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

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

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

	
420 420
    void firstOut(Arc& arc, const Node& node) const {
421 421
      if (Parent::red(node)) {
422 422
        Parent::firstFromRed(arc, node);
423 423
        arc.forward = true;
424 424
      } else {
425 425
        Parent::firstFromBlue(arc, node);
426 426
        arc.forward = static_cast<Edge&>(arc) == INVALID;
427 427
      }
428 428
    }
429 429
    void nextOut(Arc& arc) const {
430 430
      if (arc.forward) {
431 431
        Parent::nextFromRed(arc);
432 432
      } else {
433 433
        Parent::nextFromBlue(arc);
434 434
        arc.forward = static_cast<Edge&>(arc) == INVALID;
435 435
      }
436 436
    }
437 437

	
438 438
    void firstIn(Arc& arc, const Node& node) const {
439 439
      if (Parent::blue(node)) {
440 440
        Parent::firstFromBlue(arc, node);
441 441
        arc.forward = true;
442 442
      } else {
443 443
        Parent::firstFromRed(arc, node);
444 444
        arc.forward = static_cast<Edge&>(arc) == INVALID;
445 445
      }
446 446
    }
447 447
    void nextIn(Arc& arc) const {
448 448
      if (arc.forward) {
449 449
        Parent::nextFromBlue(arc);
450 450
      } else {
451 451
        Parent::nextFromRed(arc);
452 452
        arc.forward = static_cast<Edge&>(arc) == INVALID;
453 453
      }
454 454
    }
455 455

	
456 456
    Node source(const Arc& arc) const {
457 457
      return arc.forward ? Parent::red(arc) : Parent::blue(arc);
458 458
    }
459 459
    Node target(const Arc& arc) const {
460 460
      return arc.forward ? Parent::blue(arc) : Parent::red(arc);
461 461
    }
462 462

	
463 463
    int id(const Arc& arc) const {
464 464
      return (Parent::id(static_cast<const Edge&>(arc)) << 1) +
465 465
        (arc.forward ? 0 : 1);
466 466
    }
467 467
    Arc arcFromId(int ix) const {
468 468
      return Arc(Parent::fromEdgeId(ix >> 1), (ix & 1) == 0);
469 469
    }
470 470
    int maxArcId() const {
471 471
      return (Parent::maxEdgeId() << 1) + 1;
472 472
    }
473 473

	
474 474
    bool direction(const Arc& arc) const {
475 475
      return arc.forward;
476 476
    }
477 477

	
478 478
    Arc direct(const Edge& arc, bool dir) const {
479 479
      return Arc(arc, dir);
480 480
    }
481 481

	
482 482
    int arcNum() const {
483 483
      return 2 * Parent::edgeNum();
484 484
    }
485 485

	
486 486
    int edgeNum() const {
487 487
      return Parent::edgeNum();
488 488
    }
489 489

	
490 490

	
491 491
  };
492 492
}
493 493

	
494 494
#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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 22
//\ingroup misc
23 23
//\file
24 24
//\brief Classes to compute with Bezier curves.
25 25
//
26 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;
75 75

	
76 76
  Bezier2() {}
77 77
  Bezier2(Point _p1, Point _p2, Point _p3) :p1(_p1), p2(_p2), p3(_p3) {}
78 78
  Bezier2(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,.5)), p3(b.p2) {}
79 79
  Point operator()(double t) const
80 80
  {
81 81
    //    return conv(conv(p1,p2,t),conv(p2,p3,t),t);
82 82
    return ((1-t)*(1-t))*p1+(2*(1-t)*t)*p2+(t*t)*p3;
83 83
  }
84 84
  Bezier2 before(double t) const
85 85
  {
86 86
    Point q(conv(p1,p2,t));
87 87
    Point r(conv(p2,p3,t));
88 88
    return Bezier2(p1,q,conv(q,r,t));
89 89
  }
90 90

	
91 91
  Bezier2 after(double t) const
92 92
  {
93 93
    Point q(conv(p1,p2,t));
94 94
    Point r(conv(p2,p3,t));
95 95
    return Bezier2(conv(q,r,t),r,p3);
96 96
  }
97 97
  Bezier2 revert() const { return Bezier2(p3,p2,p1);}
98 98
  Bezier2 operator()(double a,double b) const { return before(b).after(a/b); }
99 99
  Bezier1 grad() const { return Bezier1(2.0*(p2-p1),2.0*(p3-p2)); }
100 100
  Bezier1 norm() const { return Bezier1(2.0*rot90(p2-p1),2.0*rot90(p3-p2)); }
101 101
  Point grad(double t) const { return grad()(t); }
102 102
  Point norm(double t) const { return rot90(grad(t)); }
103 103
};
104 104

	
105 105
class Bezier3 : public BezierBase
106 106
{
107 107
public:
108 108
  Point p1,p2,p3,p4;
109 109

	
110 110
  Bezier3() {}
111 111
  Bezier3(Point _p1, Point _p2, Point _p3, Point _p4)
112 112
    : p1(_p1), p2(_p2), p3(_p3), p4(_p4) {}
113 113
  Bezier3(const Bezier1 &b) : p1(b.p1), p2(conv(b.p1,b.p2,1.0/3.0)),
114 114
                              p3(conv(b.p1,b.p2,2.0/3.0)), p4(b.p2) {}
115 115
  Bezier3(const Bezier2 &b) : p1(b.p1), p2(conv(b.p1,b.p2,2.0/3.0)),
116 116
                              p3(conv(b.p2,b.p3,1.0/3.0)), p4(b.p3) {}
117 117

	
118 118
  Point operator()(double t) const
119 119
    {
120 120
      //    return Bezier2(conv(p1,p2,t),conv(p2,p3,t),conv(p3,p4,t))(t);
121 121
      return ((1-t)*(1-t)*(1-t))*p1+(3*t*(1-t)*(1-t))*p2+
122 122
        (3*t*t*(1-t))*p3+(t*t*t)*p4;
123 123
    }
124 124
  Bezier3 before(double t) const
125 125
    {
126 126
      Point p(conv(p1,p2,t));
127 127
      Point q(conv(p2,p3,t));
128 128
      Point r(conv(p3,p4,t));
129 129
      Point a(conv(p,q,t));
130 130
      Point b(conv(q,r,t));
131 131
      Point c(conv(a,b,t));
132 132
      return Bezier3(p1,p,a,c);
133 133
    }
134 134

	
135 135
  Bezier3 after(double t) const
136 136
    {
137 137
      Point p(conv(p1,p2,t));
138 138
      Point q(conv(p2,p3,t));
139 139
      Point r(conv(p3,p4,t));
140 140
      Point a(conv(p,q,t));
141 141
      Point b(conv(q,r,t));
142 142
      Point c(conv(a,b,t));
143 143
      return Bezier3(c,b,r,p4);
144 144
    }
145 145
  Bezier3 revert() const { return Bezier3(p4,p3,p2,p1);}
146 146
  Bezier3 operator()(double a,double b) const { return before(b).after(a/b); }
147 147
  Bezier2 grad() const { return Bezier2(3.0*(p2-p1),3.0*(p3-p2),3.0*(p4-p3)); }
148 148
  Bezier2 norm() const { return Bezier2(3.0*rot90(p2-p1),
149 149
                                  3.0*rot90(p3-p2),
150 150
                                  3.0*rot90(p4-p3)); }
151 151
  Point grad(double t) const { return grad()(t); }
152 152
  Point norm(double t) const { return rot90(grad(t)); }
153 153

	
154 154
  template<class R,class F,class S,class D>
155 155
  R recSplit(F &_f,const S &_s,D _d) const
156 156
  {
157 157
    const Point a=(p1+p2)/2;
158 158
    const Point b=(p2+p3)/2;
159 159
    const Point c=(p3+p4)/2;
160 160
    const Point d=(a+b)/2;
161 161
    const Point e=(b+c)/2;
162 162
    const Point f=(d+e)/2;
163 163
    R f1=_f(Bezier3(p1,a,d,e),_d);
164 164
    R f2=_f(Bezier3(e,d,c,p4),_d);
165 165
    return _s(f1,f2);
166 166
  }
167 167

	
168 168
};
169 169

	
170 170

	
171 171
} //END OF NAMESPACE dim2
172 172
} //END OF NAMESPACE lemon
173 173

	
174 174
#endif // LEMON_BEZIER_H
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 22
#include <lemon/bits/array_map.h>
23 23
#include <lemon/bits/vector_map.h>
24 24
//#include <lemon/bits/debug_map.h>
25 25

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

	
30 30
namespace lemon {
31 31

	
32 32

	
33 33
  //#ifndef LEMON_USE_DEBUG_MAP
34 34

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

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

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

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

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

	
62 62

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

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

	
74 74

	
75 75
  // short
76 76
  template <typename _Graph, typename _Item>
77 77
  struct DefaultMapSelector<_Graph, _Item, signed short> {
78 78
    typedef VectorMap<_Graph, _Item, signed short> Map;
79 79
  };
80 80

	
81 81
  template <typename _Graph, typename _Item>
82 82
  struct DefaultMapSelector<_Graph, _Item, unsigned short> {
83 83
    typedef VectorMap<_Graph, _Item, unsigned short> Map;
84 84
  };
85 85

	
86 86

	
87 87
  // long
88 88
  template <typename _Graph, typename _Item>
89 89
  struct DefaultMapSelector<_Graph, _Item, signed long> {
90 90
    typedef VectorMap<_Graph, _Item, signed long> Map;
91 91
  };
92 92

	
93 93
  template <typename _Graph, typename _Item>
94 94
  struct DefaultMapSelector<_Graph, _Item, unsigned long> {
95 95
    typedef VectorMap<_Graph, _Item, unsigned long> Map;
96 96
  };
97 97

	
98 98

	
99 99
#if defined __GNUC__ && !defined __STRICT_ANSI__
100 100

	
101 101
  // long long
102 102
  template <typename _Graph, typename _Item>
103 103
  struct DefaultMapSelector<_Graph, _Item, signed long long> {
104 104
    typedef VectorMap<_Graph, _Item, signed long long> Map;
105 105
  };
106 106

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

	
112 112
#endif
113 113

	
114 114

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

	
121 121

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

	
128 128

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

	
135 135

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

	
142 142
// #else
143 143

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

	
149 149
// #endif
150 150

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

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

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

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

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

	
176 176
  };
177 177

	
178 178
}
179 179

	
180 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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 38
//\file
39 39
//\brief Miscellaneous basic utilities
40 40

	
41 41
namespace lemon
42 42
{
43 43

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

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

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

	
56 56
  // Basic type for defining "tags". A "NO" condition for \c enable_if.
57 57
  //
58 58
  //\sa True
59 59
  struct False {
60 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 {
109 109
    typedef T type;
110 110
  };
111 111

	
112 112
  template <class T>
113 113
  struct disable_if_c<true, T> {};
114 114

	
115 115
  template <class Cond, class T = void>
116 116
  struct disable_if : public disable_if_c<Cond::value, T> {};
117 117

	
118 118
  template <bool B, class T>
119 119
  struct lazy_disable_if_c {
120 120
    typedef typename T::type type;
121 121
  };
122 122

	
123 123
  template <class T>
124 124
  struct lazy_disable_if_c<true, T> {};
125 125

	
126 126
  template <class Cond, class T>
127 127
  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};
128 128

	
129 129
} // namespace lemon
130 130

	
131 131
#endif
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_ADAPTOR_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
21 21

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

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

	
27 27
namespace lemon {
28 28

	
29 29
  template <typename _Digraph>
30 30
  class DigraphAdaptorExtender : public _Digraph {
31 31
  public:
32 32

	
33 33
    typedef _Digraph Parent;
34 34
    typedef _Digraph Digraph;
35 35
    typedef DigraphAdaptorExtender Adaptor;
36 36

	
37 37
    // Base extensions
38 38

	
39 39
    typedef typename Parent::Node Node;
40 40
    typedef typename Parent::Arc Arc;
41 41

	
42 42
    int maxId(Node) const {
43 43
      return Parent::maxNodeId();
44 44
    }
45 45

	
46 46
    int maxId(Arc) const {
47 47
      return Parent::maxArcId();
48 48
    }
49 49

	
50 50
    Node fromId(int id, Node) const {
51 51
      return Parent::nodeFromId(id);
52 52
    }
53 53

	
54 54
    Arc fromId(int id, Arc) const {
55 55
      return Parent::arcFromId(id);
56 56
    }
57 57

	
58 58
    Node oppositeNode(const Node &n, const Arc &e) const {
59 59
      if (n == Parent::source(e))
60 60
        return Parent::target(e);
61 61
      else if(n==Parent::target(e))
62 62
        return Parent::source(e);
63 63
      else
64 64
        return INVALID;
65 65
    }
66 66

	
67 67
    class NodeIt : public Node {
68 68
      const Adaptor* _adaptor;
69 69
    public:
70 70

	
71 71
      NodeIt() {}
72 72

	
73 73
      NodeIt(Invalid i) : Node(i) { }
74 74

	
75 75
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
76 76
        _adaptor->first(static_cast<Node&>(*this));
77 77
      }
78 78

	
79 79
      NodeIt(const Adaptor& adaptor, const Node& node)
80 80
        : Node(node), _adaptor(&adaptor) {}
81 81

	
82 82
      NodeIt& operator++() {
83 83
        _adaptor->next(*this);
84 84
        return *this;
85 85
      }
86 86

	
87 87
    };
88 88

	
89 89

	
90 90
    class ArcIt : public Arc {
91 91
      const Adaptor* _adaptor;
92 92
    public:
93 93

	
94 94
      ArcIt() { }
95 95

	
96 96
      ArcIt(Invalid i) : Arc(i) { }
97 97

	
98 98
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
99 99
        _adaptor->first(static_cast<Arc&>(*this));
100 100
      }
101 101

	
102 102
      ArcIt(const Adaptor& adaptor, const Arc& e) :
103 103
        Arc(e), _adaptor(&adaptor) { }
104 104

	
105 105
      ArcIt& operator++() {
106 106
        _adaptor->next(*this);
107 107
        return *this;
108 108
      }
109 109

	
110 110
    };
111 111

	
112 112

	
113 113
    class OutArcIt : public Arc {
114 114
      const Adaptor* _adaptor;
115 115
    public:
116 116

	
117 117
      OutArcIt() { }
118 118

	
119 119
      OutArcIt(Invalid i) : Arc(i) { }
120 120

	
121 121
      OutArcIt(const Adaptor& adaptor, const Node& node)
122 122
        : _adaptor(&adaptor) {
123 123
        _adaptor->firstOut(*this, node);
124 124
      }
125 125

	
126 126
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
127 127
        : Arc(arc), _adaptor(&adaptor) {}
128 128

	
129 129
      OutArcIt& operator++() {
130 130
        _adaptor->nextOut(*this);
131 131
        return *this;
132 132
      }
133 133

	
134 134
    };
135 135

	
136 136

	
137 137
    class InArcIt : public Arc {
138 138
      const Adaptor* _adaptor;
139 139
    public:
140 140

	
141 141
      InArcIt() { }
142 142

	
143 143
      InArcIt(Invalid i) : Arc(i) { }
144 144

	
145 145
      InArcIt(const Adaptor& adaptor, const Node& node)
146 146
        : _adaptor(&adaptor) {
147 147
        _adaptor->firstIn(*this, node);
148 148
      }
149 149

	
150 150
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
151 151
        Arc(arc), _adaptor(&adaptor) {}
152 152

	
153 153
      InArcIt& operator++() {
154 154
        _adaptor->nextIn(*this);
155 155
        return *this;
156 156
      }
157 157

	
158 158
    };
159 159

	
160 160
    Node baseNode(const OutArcIt &e) const {
161 161
      return Parent::source(e);
162 162
    }
163 163
    Node runningNode(const OutArcIt &e) const {
164 164
      return Parent::target(e);
165 165
    }
166 166

	
167 167
    Node baseNode(const InArcIt &e) const {
168 168
      return Parent::target(e);
169 169
    }
170 170
    Node runningNode(const InArcIt &e) const {
171 171
      return Parent::source(e);
172 172
    }
173 173

	
174 174
  };
175 175

	
176 176

	
177 177
  /// \ingroup digraphbits
178 178
  ///
179 179
  /// \brief Extender for the GraphAdaptors
180 180
  template <typename _Graph>
181 181
  class GraphAdaptorExtender : public _Graph {
182 182
  public:
183 183

	
184 184
    typedef _Graph Parent;
185 185
    typedef _Graph Graph;
186 186
    typedef GraphAdaptorExtender Adaptor;
187 187

	
188 188
    typedef typename Parent::Node Node;
189 189
    typedef typename Parent::Arc Arc;
190 190
    typedef typename Parent::Edge Edge;
191 191

	
192 192
    // Graph extension
193 193

	
194 194
    int maxId(Node) const {
195 195
      return Parent::maxNodeId();
196 196
    }
197 197

	
198 198
    int maxId(Arc) const {
199 199
      return Parent::maxArcId();
200 200
    }
201 201

	
202 202
    int maxId(Edge) const {
203 203
      return Parent::maxEdgeId();
204 204
    }
205 205

	
206 206
    Node fromId(int id, Node) const {
207 207
      return Parent::nodeFromId(id);
208 208
    }
209 209

	
210 210
    Arc fromId(int id, Arc) const {
211 211
      return Parent::arcFromId(id);
212 212
    }
213 213

	
214 214
    Edge fromId(int id, Edge) const {
215 215
      return Parent::edgeFromId(id);
216 216
    }
217 217

	
218 218
    Node oppositeNode(const Node &n, const Edge &e) const {
219 219
      if( n == Parent::u(e))
220 220
        return Parent::v(e);
221 221
      else if( n == Parent::v(e))
222 222
        return Parent::u(e);
223 223
      else
224 224
        return INVALID;
225 225
    }
226 226

	
227 227
    Arc oppositeArc(const Arc &a) const {
228 228
      return Parent::direct(a, !Parent::direction(a));
229 229
    }
230 230

	
231 231
    using Parent::direct;
232 232
    Arc direct(const Edge &e, const Node &s) const {
233 233
      return Parent::direct(e, Parent::u(e) == s);
234 234
    }
235 235

	
236 236

	
237 237
    class NodeIt : public Node {
238 238
      const Adaptor* _adaptor;
239 239
    public:
240 240

	
241 241
      NodeIt() {}
242 242

	
243 243
      NodeIt(Invalid i) : Node(i) { }
244 244

	
245 245
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
246 246
        _adaptor->first(static_cast<Node&>(*this));
247 247
      }
248 248

	
249 249
      NodeIt(const Adaptor& adaptor, const Node& node)
250 250
        : Node(node), _adaptor(&adaptor) {}
251 251

	
252 252
      NodeIt& operator++() {
253 253
        _adaptor->next(*this);
254 254
        return *this;
255 255
      }
256 256

	
257 257
    };
258 258

	
259 259

	
260 260
    class ArcIt : public Arc {
261 261
      const Adaptor* _adaptor;
262 262
    public:
263 263

	
264 264
      ArcIt() { }
265 265

	
266 266
      ArcIt(Invalid i) : Arc(i) { }
267 267

	
268 268
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
269 269
        _adaptor->first(static_cast<Arc&>(*this));
270 270
      }
271 271

	
272 272
      ArcIt(const Adaptor& adaptor, const Arc& e) :
273 273
        Arc(e), _adaptor(&adaptor) { }
274 274

	
275 275
      ArcIt& operator++() {
276 276
        _adaptor->next(*this);
277 277
        return *this;
278 278
      }
279 279

	
280 280
    };
281 281

	
282 282

	
283 283
    class OutArcIt : public Arc {
284 284
      const Adaptor* _adaptor;
285 285
    public:
286 286

	
287 287
      OutArcIt() { }
288 288

	
289 289
      OutArcIt(Invalid i) : Arc(i) { }
290 290

	
291 291
      OutArcIt(const Adaptor& adaptor, const Node& node)
292 292
        : _adaptor(&adaptor) {
293 293
        _adaptor->firstOut(*this, node);
294 294
      }
295 295

	
296 296
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
297 297
        : Arc(arc), _adaptor(&adaptor) {}
298 298

	
299 299
      OutArcIt& operator++() {
300 300
        _adaptor->nextOut(*this);
301 301
        return *this;
302 302
      }
303 303

	
304 304
    };
305 305

	
306 306

	
307 307
    class InArcIt : public Arc {
308 308
      const Adaptor* _adaptor;
309 309
    public:
310 310

	
311 311
      InArcIt() { }
312 312

	
313 313
      InArcIt(Invalid i) : Arc(i) { }
314 314

	
315 315
      InArcIt(const Adaptor& adaptor, const Node& node)
316 316
        : _adaptor(&adaptor) {
317 317
        _adaptor->firstIn(*this, node);
318 318
      }
319 319

	
320 320
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
321 321
        Arc(arc), _adaptor(&adaptor) {}
322 322

	
323 323
      InArcIt& operator++() {
324 324
        _adaptor->nextIn(*this);
325 325
        return *this;
326 326
      }
327 327

	
328 328
    };
329 329

	
330 330
    class EdgeIt : public Parent::Edge {
331 331
      const Adaptor* _adaptor;
332 332
    public:
333 333

	
334 334
      EdgeIt() { }
335 335

	
336 336
      EdgeIt(Invalid i) : Edge(i) { }
337 337

	
338 338
      explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
339 339
        _adaptor->first(static_cast<Edge&>(*this));
340 340
      }
341 341

	
342 342
      EdgeIt(const Adaptor& adaptor, const Edge& e) :
343 343
        Edge(e), _adaptor(&adaptor) { }
344 344

	
345 345
      EdgeIt& operator++() {
346 346
        _adaptor->next(*this);
347 347
        return *this;
348 348
      }
349 349

	
350 350
    };
351 351

	
352 352
    class IncEdgeIt : public Edge {
353 353
      friend class GraphAdaptorExtender;
354 354
      const Adaptor* _adaptor;
355 355
      bool direction;
356 356
    public:
357 357

	
358 358
      IncEdgeIt() { }
359 359

	
360 360
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
361 361

	
362 362
      IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
363 363
        _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
364 364
      }
365 365

	
366 366
      IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
367 367
        : _adaptor(&adaptor), Edge(e) {
368 368
        direction = (_adaptor->u(e) == n);
369 369
      }
370 370

	
371 371
      IncEdgeIt& operator++() {
372 372
        _adaptor->nextInc(*this, direction);
373 373
        return *this;
374 374
      }
375 375
    };
376 376

	
377 377
    Node baseNode(const OutArcIt &a) const {
378 378
      return Parent::source(a);
379 379
    }
380 380
    Node runningNode(const OutArcIt &a) const {
381 381
      return Parent::target(a);
382 382
    }
383 383

	
384 384
    Node baseNode(const InArcIt &a) const {
385 385
      return Parent::target(a);
386 386
    }
387 387
    Node runningNode(const InArcIt &a) const {
388 388
      return Parent::source(a);
389 389
    }
390 390

	
391 391
    Node baseNode(const IncEdgeIt &e) const {
392 392
      return e.direction ? Parent::u(e) : Parent::v(e);
393 393
    }
394 394
    Node runningNode(const IncEdgeIt &e) const {
395 395
      return e.direction ? Parent::v(e) : Parent::u(e);
396 396
    }
397 397

	
398 398
  };
399 399

	
400 400
}
401 401

	
402 402

	
403 403
#endif
Ignore white space 1024 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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 30
//\ingroup graphbits
31 31
//\file
32 32
//\brief Extenders for the graph types
33 33
namespace lemon {
34 34

	
35 35
  // \ingroup graphbits
36 36
  //
37 37
  // \brief Extender for the digraph implementations
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

	
86 86
  public:
87 87

	
88 88
    NodeNotifier& notifier(Node) const {
89 89
      return node_notifier;
90 90
    }
91 91

	
92 92
    ArcNotifier& notifier(Arc) const {
93 93
      return arc_notifier;
94 94
    }
95 95

	
96 96
    class NodeIt : public Node {
97 97
      const Digraph* _digraph;
98 98
    public:
99 99

	
100 100
      NodeIt() {}
101 101

	
102 102
      NodeIt(Invalid i) : Node(i) { }
103 103

	
104 104
      explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) {
105 105
        _digraph->first(static_cast<Node&>(*this));
106 106
      }
107 107

	
108 108
      NodeIt(const Digraph& digraph, const Node& node)
109 109
        : Node(node), _digraph(&digraph) {}
110 110

	
111 111
      NodeIt& operator++() {
112 112
        _digraph->next(*this);
113 113
        return *this;
114 114
      }
115 115

	
116 116
    };
117 117

	
118 118

	
119 119
    class ArcIt : public Arc {
120 120
      const Digraph* _digraph;
121 121
    public:
122 122

	
123 123
      ArcIt() { }
124 124

	
125 125
      ArcIt(Invalid i) : Arc(i) { }
126 126

	
127 127
      explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) {
128 128
        _digraph->first(static_cast<Arc&>(*this));
129 129
      }
130 130

	
131 131
      ArcIt(const Digraph& digraph, const Arc& arc) :
132 132
        Arc(arc), _digraph(&digraph) { }
133 133

	
134 134
      ArcIt& operator++() {
135 135
        _digraph->next(*this);
136 136
        return *this;
137 137
      }
138 138

	
139 139
    };
140 140

	
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 189
    // \brief Base node of the iterator
190 190
    //
191 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 195
    // \brief Running node of the iterator
196 196
    //
197 197
    // Returns the running node (i.e. the target in this case) of the
198 198
    // iterator
199 199
    Node runningNode(const OutArcIt &arc) const {
200 200
      return Parent::target(arc);
201 201
    }
202 202

	
203 203
    // \brief Base node of the iterator
204 204
    //
205 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 209
    // \brief Running node of the iterator
210 210
    //
211 211
    // Returns the running node (i.e. the source in this case) of the
212 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>
261 261
      ArcMap& operator=(const CMap& cmap) {
262 262
        Parent::operator=(cmap);
263 263
        return *this;
264 264
      }
265 265
    };
266 266

	
267 267

	
268 268
    Node addNode() {
269 269
      Node node = Parent::addNode();
270 270
      notifier(Node()).add(node);
271 271
      return node;
272 272
    }
273 273

	
274 274
    Arc addArc(const Node& from, const Node& to) {
275 275
      Arc arc = Parent::addArc(from, to);
276 276
      notifier(Arc()).add(arc);
277 277
      return arc;
278 278
    }
279 279

	
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 328
  // \ingroup _graphbits
329 329
  //
330 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

	
379 379
    Arc oppositeArc(const Arc &arc) const {
380 380
      return Parent::direct(arc, !Parent::direction(arc));
381 381
    }
382 382

	
383 383
    using Parent::direct;
384 384
    Arc direct(const Edge &edge, const Node &node) const {
385 385
      return Parent::direct(edge, Parent::u(edge) == node);
386 386
    }
387 387

	
388 388
    // Alterable extension
389 389

	
390 390
    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
391 391
    typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;
392 392
    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
393 393

	
394 394

	
395 395
  protected:
396 396

	
397 397
    mutable NodeNotifier node_notifier;
398 398
    mutable ArcNotifier arc_notifier;
399 399
    mutable EdgeNotifier edge_notifier;
400 400

	
401 401
  public:
402 402

	
403 403
    NodeNotifier& notifier(Node) const {
404 404
      return node_notifier;
405 405
    }
406 406

	
407 407
    ArcNotifier& notifier(Arc) const {
408 408
      return arc_notifier;
409 409
    }
410 410

	
411 411
    EdgeNotifier& notifier(Edge) const {
412 412
      return edge_notifier;
413 413
    }
414 414

	
415 415

	
416 416

	
417 417
    class NodeIt : public Node {
418 418
      const Graph* _graph;
419 419
    public:
420 420

	
421 421
      NodeIt() {}
422 422

	
423 423
      NodeIt(Invalid i) : Node(i) { }
424 424

	
425 425
      explicit NodeIt(const Graph& graph) : _graph(&graph) {
426 426
        _graph->first(static_cast<Node&>(*this));
427 427
      }
428 428

	
429 429
      NodeIt(const Graph& graph, const Node& node)
430 430
        : Node(node), _graph(&graph) {}
431 431

	
432 432
      NodeIt& operator++() {
433 433
        _graph->next(*this);
434 434
        return *this;
435 435
      }
436 436

	
437 437
    };
438 438

	
439 439

	
440 440
    class ArcIt : public Arc {
441 441
      const Graph* _graph;
442 442
    public:
443 443

	
444 444
      ArcIt() { }
445 445

	
446 446
      ArcIt(Invalid i) : Arc(i) { }
447 447

	
448 448
      explicit ArcIt(const Graph& graph) : _graph(&graph) {
449 449
        _graph->first(static_cast<Arc&>(*this));
450 450
      }
451 451

	
452 452
      ArcIt(const Graph& graph, const Arc& arc) :
453 453
        Arc(arc), _graph(&graph) { }
454 454

	
455 455
      ArcIt& operator++() {
456 456
        _graph->next(*this);
457 457
        return *this;
458 458
      }
459 459

	
460 460
    };
461 461

	
462 462

	
463 463
    class OutArcIt : public Arc {
464 464
      const Graph* _graph;
465 465
    public:
466 466

	
467 467
      OutArcIt() { }
468 468

	
469 469
      OutArcIt(Invalid i) : Arc(i) { }
470 470

	
471 471
      OutArcIt(const Graph& graph, const Node& node)
472 472
        : _graph(&graph) {
473 473
        _graph->firstOut(*this, node);
474 474
      }
475 475

	
476 476
      OutArcIt(const Graph& graph, const Arc& arc)
477 477
        : Arc(arc), _graph(&graph) {}
478 478

	
479 479
      OutArcIt& operator++() {
480 480
        _graph->nextOut(*this);
481 481
        return *this;
482 482
      }
483 483

	
484 484
    };
485 485

	
486 486

	
487 487
    class InArcIt : public Arc {
488 488
      const Graph* _graph;
489 489
    public:
490 490

	
491 491
      InArcIt() { }
492 492

	
493 493
      InArcIt(Invalid i) : Arc(i) { }
494 494

	
495 495
      InArcIt(const Graph& graph, const Node& node)
496 496
        : _graph(&graph) {
497 497
        _graph->firstIn(*this, node);
498 498
      }
499 499

	
500 500
      InArcIt(const Graph& graph, const Arc& arc) :
501 501
        Arc(arc), _graph(&graph) {}
502 502

	
503 503
      InArcIt& operator++() {
504 504
        _graph->nextIn(*this);
505 505
        return *this;
506 506
      }
507 507

	
508 508
    };
509 509

	
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) { }
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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 29
//\file
30 30
//\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  // \ingroup graphbits
35 35
  //
36 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

	
85 85
      MapIt(Invalid i) : Parent(i) { }
86 86

	
87 87
      explicit MapIt(Map& _map) : map(_map) {
88 88
        map.notifier()->first(*this);
89 89
      }
90 90

	
91 91
      MapIt(const Map& _map, const Item& item)
92 92
        : Parent(item), map(_map) {}
93 93

	
94 94
      MapIt& operator++() {
95 95
        map.notifier()->next(*this);
96 96
        return *this;
97 97
      }
98 98

	
99 99
      typename MapTraits<Map>::ConstReturnValue operator*() const {
100 100
        return map[*this];
101 101
      }
102 102

	
103 103
      typename MapTraits<Map>::ReturnValue operator*() {
104 104
        return map[*this];
105 105
      }
106 106

	
107 107
      void set(const Value& value) {
108 108
        map.set(*this, value);
109 109
      }
110 110

	
111 111
    protected:
112 112
      Map& map;
113 113

	
114 114
    };
115 115

	
116 116
    class ConstMapIt : public Item {
117 117
    public:
118 118

	
119 119
      typedef Item Parent;
120 120

	
121 121
      typedef typename Map::Value Value;
122 122

	
123 123
      ConstMapIt() {}
124 124

	
125 125
      ConstMapIt(Invalid i) : Parent(i) { }
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 174
  // \ingroup graphbits
175 175
  //
176 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;
225 225
      typedef typename Map::Value Value;
226 226

	
227 227
      MapIt() {}
228 228

	
229 229
      MapIt(Invalid i) : Parent(i) { }
230 230

	
231 231
      explicit MapIt(Map& _map) : map(_map) {
232 232
        map.graph.first(*this);
233 233
      }
234 234

	
235 235
      MapIt(const Map& _map, const Item& item)
236 236
        : Parent(item), map(_map) {}
237 237

	
238 238
      MapIt& operator++() {
239 239
        map.graph.next(*this);
240 240
        return *this;
241 241
      }
242 242

	
243 243
      typename MapTraits<Map>::ConstReturnValue operator*() const {
244 244
        return map[*this];
245 245
      }
246 246

	
247 247
      typename MapTraits<Map>::ReturnValue operator*() {
248 248
        return map[*this];
249 249
      }
250 250

	
251 251
      void set(const Value& value) {
252 252
        map.set(*this, value);
253 253
      }
254 254

	
255 255
    protected:
256 256
      Map& map;
257 257

	
258 258
    };
259 259

	
260 260
    class ConstMapIt : public Item {
261 261
    public:
262 262

	
263 263
      typedef Item Parent;
264 264

	
265 265
      typedef typename Map::Value Value;
266 266

	
267 267
      ConstMapIt() {}
268 268

	
269 269
      ConstMapIt(Invalid i) : Parent(i) { }
270 270

	
271 271
      explicit ConstMapIt(Map& _map) : map(_map) {
272 272
        map.graph.first(*this);
273 273
      }
274 274

	
275 275
      ConstMapIt(const Map& _map, const Item& item)
276 276
        : Parent(item), map(_map) {}
277 277

	
278 278
      ConstMapIt& operator++() {
279 279
        map.graph.next(*this);
280 280
        return *this;
281 281
      }
282 282

	
283 283
      typename MapTraits<Map>::ConstReturnValue operator*() const {
284 284
        return map[*this];
285 285
      }
286 286

	
287 287
    protected:
288 288
      const Map& map;
289 289
    };
290 290

	
291 291
    class ItemIt : public Item {
292 292
    public:
293 293

	
294 294
      typedef Item Parent;
295 295

	
296 296
      ItemIt() {}
297 297

	
298 298
      ItemIt(Invalid i) : Parent(i) { }
299 299

	
300 300
      explicit ItemIt(Map& _map) : map(_map) {
301 301
        map.graph.first(*this);
302 302
      }
303 303

	
304 304
      ItemIt(const Map& _map, const Item& item)
305 305
        : Parent(item), map(_map) {}
306 306

	
307 307
      ItemIt& operator++() {
308 308
        map.graph.next(*this);
309 309
        return *this;
310 310
      }
311 311

	
312 312
    protected:
313 313
      const Map& map;
314 314

	
315 315
    };
316 316

	
317 317
  private:
318 318

	
319 319
    const Graph& graph;
320 320

	
321 321
  };
322 322

	
323 323
}
324 324

	
325 325
#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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_PRED_MAP_PATH_H
20 20
#define LEMON_BITS_PRED_MAP_PATH_H
21 21

	
22 22
namespace lemon {
23 23

	
24 24
  template <typename _Digraph, typename _PredMap>
25 25
  class PredMapPath {
26 26
  public:
27 27
    typedef True RevPathTag;
28 28

	
29 29
    typedef _Digraph Digraph;
30 30
    typedef typename Digraph::Arc Arc;
31 31
    typedef _PredMap PredMap;
32 32

	
33 33
    PredMapPath(const Digraph& _digraph, const PredMap& _predMap,
34 34
                typename Digraph::Node _target)
35 35
      : digraph(_digraph), predMap(_predMap), target(_target) {}
36 36

	
37 37
    int length() const {
38 38
      int len = 0;
39 39
      typename Digraph::Node node = target;
40 40
      typename Digraph::Arc arc;
41 41
      while ((arc = predMap[node]) != INVALID) {
42 42
        node = digraph.source(arc);
43 43
        ++len;
44 44
      }
45 45
      return len;
46 46
    }
47 47

	
48 48
    bool empty() const {
49 49
      return predMap[target] != INVALID;
50 50
    }
51 51

	
52 52
    class RevArcIt {
53 53
    public:
54 54
      RevArcIt() {}
55 55
      RevArcIt(Invalid) : path(0), current(INVALID) {}
56 56
      RevArcIt(const PredMapPath& _path)
57 57
        : path(&_path), current(_path.target) {
58 58
        if (path->predMap[current] == INVALID) current = INVALID;
59 59
      }
60 60

	
61 61
      operator const typename Digraph::Arc() const {
62 62
        return path->predMap[current];
63 63
      }
64 64

	
65 65
      RevArcIt& operator++() {
66 66
        current = path->digraph.source(path->predMap[current]);
67 67
        if (path->predMap[current] == INVALID) current = INVALID;
68 68
        return *this;
69 69
      }
70 70

	
71 71
      bool operator==(const RevArcIt& e) const {
72 72
        return current == e.current;
73 73
      }
74 74

	
75 75
      bool operator!=(const RevArcIt& e) const {
76 76
        return current != e.current;
77 77
      }
78 78

	
79 79
      bool operator<(const RevArcIt& e) const {
80 80
        return current < e.current;
81 81
      }
82 82

	
83 83
    private:
84 84
      const PredMapPath* path;
85 85
      typename Digraph::Node current;
86 86
    };
87 87

	
88 88
  private:
89 89
    const Digraph& digraph;
90 90
    const PredMap& predMap;
91 91
    typename Digraph::Node target;
92 92
  };
93 93

	
94 94

	
95 95
  template <typename _Digraph, typename _PredMatrixMap>
96 96
  class PredMatrixMapPath {
97 97
  public:
98 98
    typedef True RevPathTag;
99 99

	
100 100
    typedef _Digraph Digraph;
101 101
    typedef typename Digraph::Arc Arc;
102 102
    typedef _PredMatrixMap PredMatrixMap;
103 103

	
104 104
    PredMatrixMapPath(const Digraph& _digraph,
105 105
                      const PredMatrixMap& _predMatrixMap,
106 106
                      typename Digraph::Node _source,
107 107
                      typename Digraph::Node _target)
108 108
      : digraph(_digraph), predMatrixMap(_predMatrixMap),
109 109
        source(_source), target(_target) {}
110 110

	
111 111
    int length() const {
112 112
      int len = 0;
113 113
      typename Digraph::Node node = target;
114 114
      typename Digraph::Arc arc;
115 115
      while ((arc = predMatrixMap(source, node)) != INVALID) {
116 116
        node = digraph.source(arc);
117 117
        ++len;
118 118
      }
119 119
      return len;
120 120
    }
121 121

	
122 122
    bool empty() const {
123 123
      return source != target;
124 124
    }
125 125

	
126 126
    class RevArcIt {
127 127
    public:
128 128
      RevArcIt() {}
129 129
      RevArcIt(Invalid) : path(0), current(INVALID) {}
130 130
      RevArcIt(const PredMatrixMapPath& _path)
131 131
        : path(&_path), current(_path.target) {
132 132
        if (path->predMatrixMap(path->source, current) == INVALID)
133 133
          current = INVALID;
134 134
      }
135 135

	
136 136
      operator const typename Digraph::Arc() const {
137 137
        return path->predMatrixMap(path->source, current);
138 138
      }
139 139

	
140 140
      RevArcIt& operator++() {
141 141
        current =
142 142
          path->digraph.source(path->predMatrixMap(path->source, current));
143 143
        if (path->predMatrixMap(path->source, current) == INVALID)
144 144
          current = INVALID;
145 145
        return *this;
146 146
      }
147 147

	
148 148
      bool operator==(const RevArcIt& e) const {
149 149
        return current == e.current;
150 150
      }
151 151

	
152 152
      bool operator!=(const RevArcIt& e) const {
153 153
        return current != e.current;
154 154
      }
155 155

	
156 156
      bool operator<(const RevArcIt& e) const {
157 157
        return current < e.current;
158 158
      }
159 159

	
160 160
    private:
161 161
      const PredMatrixMapPath* path;
162 162
      typename Digraph::Node current;
163 163
    };
164 164

	
165 165
  private:
166 166
    const Digraph& digraph;
167 167
    const PredMatrixMap& predMatrixMap;
168 168
    typename Digraph::Node source;
169 169
    typename Digraph::Node target;
170 170
  };
171 171

	
172 172
}
173 173

	
174 174
#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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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 22
//\file
23 23
//\brief Traits for graphs and maps
24 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
  };
73 73

	
74 74
  template <typename Graph, typename Enable = void>
75 75
  struct ArcNotifierIndicator {
76 76
    typedef InvalidType Type;
77 77
  };
78 78
  template <typename Graph>
79 79
  struct ArcNotifierIndicator<
80 80
    Graph,
81 81
    typename enable_if<typename Graph::ArcNotifier::Notifier, void>::type
82 82
  > {
83 83
    typedef typename Graph::ArcNotifier Type;
84 84
  };
85 85

	
86 86
  template <typename _Graph>
87 87
  class ItemSetTraits<_Graph, typename _Graph::Arc> {
88 88
  public:
89 89

	
90 90
    typedef _Graph Graph;
91 91

	
92 92
    typedef typename Graph::Arc Item;
93 93
    typedef typename Graph::ArcIt ItemIt;
94 94

	
95 95
    typedef typename ArcNotifierIndicator<Graph>::Type ItemNotifier;
96 96

	
97 97
    template <typename _Value>
98 98
    class Map : public Graph::template ArcMap<_Value> {
99 99
    public:
100 100
      typedef typename Graph::template ArcMap<_Value> Parent;
101 101
      typedef typename Graph::template ArcMap<_Value> Type;
102 102
      typedef typename Parent::Value Value;
103 103

	
104 104
      Map(const Graph& _digraph) : Parent(_digraph) {}
105 105
      Map(const Graph& _digraph, const Value& _value)
106 106
        : Parent(_digraph, _value) {}
107 107
    };
108 108

	
109 109
  };
110 110

	
111 111
  template <typename Graph, typename Enable = void>
112 112
  struct EdgeNotifierIndicator {
113 113
    typedef InvalidType Type;
114 114
  };
115 115
  template <typename Graph>
116 116
  struct EdgeNotifierIndicator<
117 117
    Graph,
118 118
    typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
119 119
  > {
120 120
    typedef typename Graph::EdgeNotifier Type;
121 121
  };
122 122

	
123 123
  template <typename _Graph>
124 124
  class ItemSetTraits<_Graph, typename _Graph::Edge> {
125 125
  public:
126 126

	
127 127
    typedef _Graph Graph;
128 128

	
129 129
    typedef typename Graph::Edge Item;
130 130
    typedef typename Graph::EdgeIt ItemIt;
131 131

	
132 132
    typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
133 133

	
134 134
    template <typename _Value>
135 135
    class Map : public Graph::template EdgeMap<_Value> {
136 136
    public:
137 137
      typedef typename Graph::template EdgeMap<_Value> Parent;
138 138
      typedef typename Graph::template EdgeMap<_Value> Type;
139 139
      typedef typename Parent::Value Value;
140 140

	
141 141
      Map(const Graph& _digraph) : Parent(_digraph) {}
142 142
      Map(const Graph& _digraph, const Value& _value)
143 143
        : Parent(_digraph, _value) {}
144 144
    };
145 145

	
146 146
  };
147 147

	
148 148
  template <typename Map, typename Enable = void>
149 149
  struct MapTraits {
150 150
    typedef False ReferenceMapTag;
151 151

	
152 152
    typedef typename Map::Key Key;
153 153
    typedef typename Map::Value Value;
154 154

	
155 155
    typedef Value ConstReturnValue;
156 156
    typedef Value ReturnValue;
157 157
  };
158 158

	
159 159
  template <typename Map>
160 160
  struct MapTraits<
161 161
    Map, typename enable_if<typename Map::ReferenceMapTag, void>::type >
162 162
  {
163 163
    typedef True ReferenceMapTag;
164 164

	
165 165
    typedef typename Map::Key Key;
166 166
    typedef typename Map::Value Value;
167 167

	
168 168
    typedef typename Map::ConstReference ConstReturnValue;
169 169
    typedef typename Map::Reference ReturnValue;
170 170

	
171 171
    typedef typename Map::ConstReference ConstReference;
172 172
    typedef typename Map::Reference Reference;
173 173
 };
174 174

	
175 175
  template <typename MatrixMap, typename Enable = void>
176 176
  struct MatrixMapTraits {
177 177
    typedef False ReferenceMapTag;
178 178

	
179 179
    typedef typename MatrixMap::FirstKey FirstKey;
180 180
    typedef typename MatrixMap::SecondKey SecondKey;
181 181
    typedef typename MatrixMap::Value Value;
182 182

	
183 183
    typedef Value ConstReturnValue;
184 184
    typedef Value ReturnValue;
185 185
  };
186 186

	
187 187
  template <typename MatrixMap>
188 188
  struct MatrixMapTraits<
189 189
    MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag,
190 190
                                  void>::type >
191 191
  {
192 192
    typedef True ReferenceMapTag;
193 193

	
194 194
    typedef typename MatrixMap::FirstKey FirstKey;
195 195
    typedef typename MatrixMap::SecondKey SecondKey;
196 196
    typedef typename MatrixMap::Value Value;
197 197

	
198 198
    typedef typename MatrixMap::ConstReference ConstReturnValue;
199 199
    typedef typename MatrixMap::Reference ReturnValue;
200 200

	
201 201
    typedef typename MatrixMap::ConstReference ConstReference;
202 202
    typedef typename MatrixMap::Reference Reference;
203 203
 };
204 204

	
205 205
  // Indicators for the tags
206 206

	
207 207
  template <typename Graph, typename Enable = void>
208 208
  struct NodeNumTagIndicator {
209 209
    static const bool value = false;
210 210
  };
211 211

	
212 212
  template <typename Graph>
213 213
  struct NodeNumTagIndicator<
214 214
    Graph,
215 215
    typename enable_if<typename Graph::NodeNumTag, void>::type
216 216
  > {
217 217
    static const bool value = true;
218 218
  };
219 219

	
220 220
  template <typename Graph, typename Enable = void>
221 221
  struct ArcNumTagIndicator {
222 222
    static const bool value = false;
223 223
  };
224 224

	
225 225
  template <typename Graph>
226 226
  struct ArcNumTagIndicator<
227 227
    Graph,
228 228
    typename enable_if<typename Graph::ArcNumTag, void>::type
229 229
  > {
230 230
    static const bool value = true;
231 231
  };
232 232

	
233 233
  template <typename Graph, typename Enable = void>
234 234
  struct EdgeNumTagIndicator {
235 235
    static const bool value = false;
236 236
  };
237 237

	
238 238
  template <typename Graph>
239 239
  struct EdgeNumTagIndicator<
240 240
    Graph,
241 241
    typename enable_if<typename Graph::EdgeNumTag, void>::type
242 242
  > {
243 243
    static const bool value = true;
244 244
  };
245 245

	
246 246
  template <typename Graph, typename Enable = void>
247 247
  struct FindArcTagIndicator {
248 248
    static const bool value = false;
249 249
  };
250 250

	
251 251
  template <typename Graph>
252 252
  struct FindArcTagIndicator<
253 253
    Graph,
254 254
    typename enable_if<typename Graph::FindArcTag, void>::type
255 255
  > {
256 256
    static const bool value = true;
257 257
  };
258 258

	
259 259
  template <typename Graph, typename Enable = void>
260 260
  struct FindEdgeTagIndicator {
261 261
    static const bool value = false;
262 262
  };
263 263

	
264 264
  template <typename Graph>
265 265
  struct FindEdgeTagIndicator<
266 266
    Graph,
267 267
    typename enable_if<typename Graph::FindEdgeTag, void>::type
268 268
  > {
269 269
    static const bool value = true;
270 270
  };
271 271

	
272 272
  template <typename Graph, typename Enable = void>
273 273
  struct UndirectedTagIndicator {
274 274
    static const bool value = false;
275 275
  };
276 276

	
277 277
  template <typename Graph>
278 278
  struct UndirectedTagIndicator<
279 279
    Graph,
280 280
    typename enable_if<typename Graph::UndirectedTag, void>::type
281 281
  > {
282 282
    static const bool value = true;
283 283
  };
284 284

	
285 285
  template <typename Graph, typename Enable = void>
286 286
  struct BuildTagIndicator {
287 287
    static const bool value = false;
288 288
  };
289 289

	
290 290
  template <typename Graph>
291 291
  struct BuildTagIndicator<
292 292
    Graph,
293 293
    typename enable_if<typename Graph::BuildTag, void>::type
294 294
  > {
295 295
    static const bool value = true;
296 296
  };
297 297

	
298 298
}
299 299

	
300 300
#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
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2009
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_VARIANT_H
20 20
#define LEMON_BITS_VARIANT_H
21 21

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

	
24 24
// \file
25 25
// \brief Variant types
26 26

	
27 27
namespace lemon {
28 28

	
29 29
  namespace _variant_bits {
30 30

	
31 31
    template <int left, int right>
32 32
    struct CTMax {
33 33
      static const int value = left < right ? right : left;
34 34
    };
35 35

	
36 36
  }
37 37

	
38 38

	
39 39
  // \brief Simple Variant type for two types
40 40
  //
41 41
  // Simple Variant type for two types. The Variant type is a type-safe
42 42
  // union. C++ has strong limitations for using unions, for
43 43
  // example you cannot store a type with non-default constructor or
44 44
  // destructor in a union. This class always knowns the current
45 45
  // state of the variant and it cares for the proper construction
46 46
  // and destruction.
47 47
  template <typename _First, typename _Second>
48 48
  class BiVariant {
49 49
  public:
50 50

	
51 51
    // \brief The \c First type.
52 52
    typedef _First First;
53 53
    // \brief The \c Second type.
54 54
    typedef _Second Second;
55 55

	
56 56
    // \brief Constructor
57 57
    //
58 58
    // This constructor initalizes to the default value of the \c First
59 59
    // type.
60 60
    BiVariant() {
61 61
      flag = true;
62 62
      new(reinterpret_cast<First*>(data)) First();
63 63
    }
64 64

	
65 65
    // \brief Constructor
66 66
    //
67 67
    // This constructor initalizes to the given value of the \c First
68 68
    // type.
69 69
    BiVariant(const First& f) {
70 70
      flag = true;
71 71
      new(reinterpret_cast<First*>(data)) First(f);
72 72
    }
73 73

	
74 74
    // \brief Constructor
75 75
    //
76 76
    // This constructor initalizes to the given value of the \c
77 77
    // Second type.
78 78
    BiVariant(const Second& s) {
79 79
      flag = false;
80 80
      new(reinterpret_cast<Second*>(data)) Second(s);
81 81
    }
82 82

	
83 83
    // \brief Copy constructor
84 84
    //
85 85
    // Copy constructor
86 86
    BiVariant(const BiVariant& bivariant) {
87 87
      flag = bivariant.flag;
88 88
      if (flag) {
89 89
        new(reinterpret_cast<First*>(data)) First(bivariant.first());
90 90
      } else {
91 91
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());
92 92
      }
93 93
    }
94 94

	
95 95
    // \brief Destrcutor
96 96
    //
97 97
    // Destructor
98 98
    ~BiVariant() {
99 99
      destroy();
100 100
    }
101 101

	
102 102
    // \brief Set to the default value of the \c First type.
103 103
    //
104 104
    // This function sets the variant to the default value of the \c
105 105
    // First type.
106 106
    BiVariant& setFirst() {
107 107
      destroy();
108 108
      flag = true;
109 109
      new(reinterpret_cast<First*>(data)) First();
110 110
      return *this;
111 111
    }
112 112

	
113 113
    // \brief Set to the given value of the \c First type.
114 114
    //
115 115
    // This function sets the variant to the given value of the \c
116 116
    // First type.
117 117
    BiVariant& setFirst(const First& f) {
118 118
      destroy();
119 119
      flag = true;
120 120
      new(reinterpret_cast<First*>(data)) First(f);
121 121
      return *this;
122 122
    }
123 123

	
124 124
    // \brief Set to the default value of the \c Second type.
125 125
    //
126 126
    // This function sets the variant to the default value of the \c
127 127
    // Second type.
128 128
    BiVariant& setSecond() {
129 129
      destroy();
130 130
      flag = false;
131 131
      new(reinterpret_cast<Second*>(data)) Second();
132 132
      return *this;
133 133
    }
134 134

	
135 135
    // \brief Set to the given value of the \c Second type.
136 136
    //
137 137
    // This function sets the variant to the given value of the \c
138 138
    // Second type.
139 139
    BiVariant& setSecond(const Second& s) {
140 140
      destroy();
141 141
      flag = false;
142 142
      new(reinterpret_cast<Second*>(data)) Second(s);
143 143
      return *this;
144 144
    }
145 145

	
146 146
    // \brief Operator form of the \c setFirst()
147 147
    BiVariant& operator=(const First& f) {
148 148
      return setFirst(f);
149 149
    }
150 150

	
151 151
    // \brief Operator form of the \c setSecond()
152 152
    BiVariant& operator=(const Second& s) {
153 153
      return setSecond(s);
154 154
    }
155 155

	
156 156
    // \brief Assign operator
157 157
    BiVariant& operator=(const BiVariant& bivariant) {
158 158
      if (this == &bivariant) return *this;
159 159
      destroy();
160 160
      flag = bivariant.flag;
161 161
      if (flag) {
162 162
        new(reinterpret_cast<First*>(data)) First(bivariant.first());
163 163
      } else {
164 164
        new(reinterpret_cast<Second*>(data)) Second(bivariant.second());
165 165
      }
166 166
      return *this;
167 167
    }
168 168

	
169 169
    // \brief Reference to the value
170 170
    //
171 171
    // Reference to the value of the \c First type.
172 172
    // \pre The BiVariant should store value of \c First type.
173 173
    First& first() {
174 174
      LEMON_DEBUG(flag, "Variant wrong state");
175 175
      return *reinterpret_cast<First*>(data);
176 176
    }
177 177

	
178 178
    // \brief Const reference to the value
179 179
    //
180 180
    // Const reference to the value of the \c First type.
181 181
    // \pre The BiVariant should store value of \c First type.
182 182
    const First& first() const {
183 183
      LEMON_DEBUG(flag, "Variant wrong state");
184 184
      return *reinterpret_cast<const First*>(data);
185 185
    }
186 186

	
187 187
    // \brief Operator form of the \c first()
188 188
    operator First&() { return first(); }
189 189
    // \brief Operator form of the const \c first()
190 190
    operator const First&() const { return first(); }
191 191

	
192 192
    // \brief Reference to the value
193 193
    //
194 194
    // Reference to the value of the \c Second type.
195 195
    // \pre The BiVariant should store value of \c Second type.
196 196
    Second& second() {
197 197
      LEMON_DEBUG(!flag, "Variant wrong state");
198 198
      return *reinterpret_cast<Second*>(data);
199 199
    }
200 200

	
201 201
    // \brief Const reference to the value
202 202
    //
203 203
    // Const reference to the value of the \c Second type.
204 204
    // \pre The BiVariant should store value of \c Second type.
205 205
    const Second& second() const {
206 206
      LEMON_DEBUG(!flag, "Variant wrong state");
207 207
      return *reinterpret_cast<const Second*>(data);
208 208
    }
209 209

	
210 210
    // \brief Operator form of the \c second()
211 211
    operator Second&() { return second(); }
212 212
    // \brief Operator form of the const \c second()
213 213
    operator const Second&() const { return second(); }
214 214

	
215 215
    // \brief %True when the variant is in the first state
216 216
    //
217 217
    // %True when the variant stores value of the \c First type.
218 218
    bool firstState() const { return flag; }
219 219

	
220 220
    // \brief %True when the variant is in the second state
221 221
    //
222 222
    // %True when the variant stores value of the \c Second type.
223 223
    bool secondState() const { return !flag; }
224 224

	
225 225
  private:
226 226

	
227 227
    void destroy() {
228 228
      if (flag) {
229 229
        reinterpret_cast<First*>(data)->~First();
230 230
      } else {
231 231
        reinterpret_cast<Second*>(data)->~Second();
232 232
      }
233 233
    }
234 234

	
235 235
    char data[_variant_bits::CTMax<sizeof(First), sizeof(Second)>::value];
236 236
    bool flag;
237 237
  };
238 238

	
239 239
  namespace _variant_bits {
240 240

	
241 241
    template <int _idx, typename _TypeMap>
242 242
    struct Memory {
243 243

	
244 244
      typedef typename _TypeMap::template Map<_idx>::Type Current;
245 245

	
246 246
      static void destroy(int index, char* place) {
247 247
        if (index == _idx) {
248 248
          reinterpret_cast<Current*>(place)->~Current();
249 249
        } else {
250 250
          Memory<_idx - 1, _TypeMap>::destroy(index, place);
251 251
        }
252 252
      }
253 253

	
254 254
      static void copy(int index, char* to, const char* from) {
255 255
        if (index == _idx) {
256 256
          new (reinterpret_cast<Current*>(to))
257 257
            Current(reinterpret_cast<const Current*>(from));
258 258
        } else {
259 259
          Memory<_idx - 1, _TypeMap>::copy(index, to, from);
260 260
        }
261 261
      }
262 262

	
263 263
    };
264 264

	
265 265
    template <typename _TypeMap>
266 266
    struct Memory<-1, _TypeMap> {
267 267

	
268 268
      static void destroy(int, char*) {
269 269
        LEMON_DEBUG(false, "Variant wrong index.");
270 270
      }
271 271

	
272 272
      static void copy(int, char*, const char*) {
273 273
        LEMON_DEBUG(false, "Variant wrong index.");
274 274
      }
275 275
    };
276 276

	
277 277
    template <int _idx, typename _TypeMap>
278 278
    struct Size {
279 279
      static const int value =
280 280
      CTMax<sizeof(typename _TypeMap::template Map<_idx>::Type),
281 281
            Size<_idx - 1, _TypeMap>::value>::value;
282 282
    };
283 283

	
284 284
    template <typename _TypeMap>
285 285
    struct Size<0, _TypeMap> {
286 286
      static const int value =
287 287
      sizeof(typename _TypeMap::template Map<0>::Type);
288 288
    };
289 289

	
290 290
  }
291 291

	
292 292
  // \brief Variant type
293 293
  //
294 294
  // Simple Variant type. The Variant type is a type-safe union.
295 295
  // C++ has strong limitations for using unions, for example you
296 296
  // cannot store type with non-default constructor or destructor in
297 297
  // a union. This class always knowns the current state of the
298 298
  // variant and it cares for the proper construction and
299 299
  // destruction.
300 300
  //
301 301
  // \param _num The number of the types which can be stored in the
302 302
  // variant type.
303 303
  // \param _TypeMap This class describes the types of the Variant. The
304 304
  // _TypeMap::Map<index>::Type should be a valid type for each index
305 305
  // in the range {0, 1, ..., _num - 1}. The \c VariantTypeMap is helper
306 306
  // class to define such type mappings up to 10 types.
307 307
  //
308 308
  // And the usage of the class:
309 309
  //\code
310 310
  // typedef Variant<3, VariantTypeMap<int, std::string, double> > MyVariant;
311 311
  // MyVariant var;
312 312
  // var.set<0>(12);
313 313
  // std::cout << var.get<0>() << std::endl;
314 314
  // var.set<1>("alpha");
315 315
  // std::cout << var.get<1>() << std::endl;
316 316
  // var.set<2>(0.75);
317 317
  // std::cout << var.get<2>() << std::endl;
318 318
  //\endcode
319 319
  //
320 320
  // The result of course:
321 321
  //\code
322 322
  // 12
323 323
  // alpha
324 324
  // 0.75
325 325
  //\endcode
326 326
  template <int _num, typename _TypeMap>
327 327
  class Variant {
328 328
  public:
329 329

	
330 330
    static const int num = _num;
331 331

	
332 332
    typedef _TypeMap TypeMap;
333 333

	
334 334
    // \brief Constructor
335 335
    //
336 336
    // This constructor initalizes to the default value of the \c type
337 337
    // with 0 index.
338 338
    Variant() {
339 339
      flag = 0;
340 340
      new(reinterpret_cast<typename TypeMap::template Map<0>::Type*>(data))
341 341
        typename TypeMap::template Map<0>::Type();
342 342
    }
343 343

	
344 344

	
345 345
    // \brief Copy constructor
346 346
    //
347 347
    // Copy constructor
348 348
    Variant(const Variant& variant) {
349 349
      flag = variant.flag;
350 350
      _variant_bits::Memory<num - 1, TypeMap>::copy(flag, data, variant.data);
351 351
    }
352 352

	
353 353
    // \brief Assign operator
354 354
    //
355 355
    // Assign operator
356 356
    Variant& operator=(const Variant& variant) {
357 357
      if (this == &variant) return *this;
358 358
      _variant_bits::Memory<num - 1, TypeMap>::
359 359
        destroy(flag, data);
360 360
      flag = variant.flag;
361 361
      _variant_bits::Memory<num - 1, TypeMap>::
362 362
        copy(flag, data, variant.data);
363 363
      return *this;
364 364
    }
365 365

	
366 366
    // \brief Destrcutor
367 367
    //
368 368
    // Destructor
369 369
    ~Variant() {
370 370
      _variant_bits::Memory<num - 1, TypeMap>::destroy(flag, data);
371 371
    }
372 372

	
373 373
    // \brief Set to the default value of the type with \c _idx index.
374 374
    //
375 375
    // This function sets the variant to the default value of the
376 376
    // type with \c _idx index.
377 377
    template <int _idx>
378 378
    Variant& set() {
379 379
      _variant_bits::Memory<num - 1, TypeMap>::destroy(flag, data);
380 380
      flag = _idx;
381 381
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data))
382 382
        typename TypeMap::template Map<_idx>::Type();
383 383
      return *this;
384 384
    }
385 385

	
386 386
    // \brief Set to the given value of the type with \c _idx index.
387 387
    //
388 388
    // This function sets the variant to the given value of the type
389 389
    // with \c _idx index.
390 390
    template <int _idx>
391 391
    Variant& set(const typename _TypeMap::template Map<_idx>::Type& init) {
392 392
      _variant_bits::Memory<num - 1, TypeMap>::destroy(flag, data);
393 393
      flag = _idx;
394 394
      new(reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>(data))
395 395
        typename TypeMap::template Map<_idx>::Type(init);
396 396
      return *this;
397 397
    }
398 398

	
399 399
    // \brief Gets the current value of the type with \c _idx index.
400 400
    //
401 401
    // Gets the current value of the type with \c _idx index.
402 402
    template <int _idx>
403 403
    const typename TypeMap::template Map<_idx>::Type& get() const {
404 404
      LEMON_DEBUG(_idx == flag, "Variant wrong index");
405 405
      return *reinterpret_cast<const typename TypeMap::
406 406
        template Map<_idx>::Type*>(data);
407 407
    }
408 408

	
409 409
    // \brief Gets the current value of the type with \c _idx index.
410 410
    //
411 411
    // Gets the current value of the type with \c _idx index.
412 412
    template <int _idx>
413 413
    typename _TypeMap::template Map<_idx>::Type& get() {
414 414
      LEMON_DEBUG(_idx == flag, "Variant wrong index");
415 415
      return *reinterpret_cast<typename TypeMap::template Map<_idx>::Type*>
416 416
        (data);
417 417
    }
418 418

	
419 419
    // \brief Returns the current state of the variant.
420 420
    //
421 421
    // Returns the current state of the variant.
422 422
    int state() const {
423 423
      return flag;
424 424
    }
425 425

	
426 426
  private:
427 427

	
428 428
    char data[_variant_bits::Size<num - 1, TypeMap>::value];
429 429
    int flag;
430 430
  };
431 431

	
432 432
  namespace _variant_bits {
433 433

	
434 434
    template <int _index, typename _List>
435 435
    struct Get {
436 436
      typedef typename Get<_index - 1, typename _List::Next>::Type Type;
437 437
    };
438 438

	
439 439
    template <typename _List>
440 440
    struct Get<0, _List> {
441 441
      typedef typename _List::Type Type;
442 442
    };
443 443

	
444 444
    struct List {};
445 445

	
446 446
    template <typename _Type, typename _List>
447 447
    struct Insert {
448 448
      typedef _List Next;
449 449
      typedef _Type Type;
450 450
    };
451 451

	
452 452
    template <int _idx, typename _T0, typename _T1, typename _T2,
453 453
              typename _T3, typename _T4, typename _T5, typename _T6,
454 454
              typename _T7, typename _T8, typename _T9>
455 455
    struct Mapper {
456 456
      typedef List L10;
457 457
      typedef Insert<_T9, L10> L9;
458 458
      typedef Insert<_T8, L9> L8;
459 459
      typedef Insert<_T7, L8> L7;
460 460
      typedef Insert<_T6, L7> L6;
461 461
      typedef Insert<_T5, L6> L5;
462 462
      typedef Insert<_T4, L5> L4;
463 463
      typedef Insert<_T3, L4> L3;
464 464
      typedef Insert<_T2, L3> L2;
465 465
      typedef Insert<_T1, L2> L1;
466 466
      typedef Insert<_T0, L1> L0;
467 467
      typedef typename Get<_idx, L0>::Type Type;
468 468
    };
469 469

	
470 470
  }
471 471

	
472 472
  // \brief Helper class for Variant
473 473
  //
474 474
  // Helper class to define type mappings for Variant. This class
475 475
  // converts the template parameters to be mappable by integer.
476 476
  // \see Variant
477 477
  template <
478 478
    typename _T0,
479 479
    typename _T1 = void, typename _T2 = void, typename _T3 = void,
480 480
    typename _T4 = void, typename _T5 = void, typename _T6 = void,
481 481
    typename _T7 = void, typename _T8 = void, typename _T9 = void>
482 482
  struct VariantTypeMap {
483 483
    template <int _idx>
484 484
    struct Map {
485 485
      typedef typename _variant_bits::
486 486
      Mapper<_idx, _T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9>::Type
487 487
      Type;
488 488
    };
489 489
  };
490 490

	
491 491
}
492 492

	
493 493

	
494 494
#endif

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)