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

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

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

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

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

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

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

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

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

	
71 71
  Arc a;
72 72

	
73 73
  a=g.addArc(n1,n2); acolors[a]=0; widths[a]=1;
74 74
  a=g.addArc(n2,n3); acolors[a]=0; widths[a]=1;
75 75
  a=g.addArc(n3,n5); acolors[a]=0; widths[a]=3;
76 76
  a=g.addArc(n5,n4); acolors[a]=0; widths[a]=1;
77 77
  a=g.addArc(n4,n1); acolors[a]=0; widths[a]=1;
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 88
    copyright("(C) 2003-2008 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 95
    copyright("(C) 2003-2008 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 108
    copyright("(C) 2003-2008 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 135
    copyright("(C) 2003-2008 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 150
    copyright("(C) 2003-2008 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 166
    copyright("(C) 2003-2008 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 196
    copyright("(C) 2003-2008 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 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
90

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
177 179
*/
178 180

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

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

	
188

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

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

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

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

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

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

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

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

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

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

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

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

	
245 245
*/
246 246

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

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

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

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

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

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

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

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

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

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

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

	
286 285
*/
287 286

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

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

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

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

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

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

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

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

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

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

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

	
352 350
*/
353 351

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

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

	
363

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

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

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

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

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

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

	
389 386
*/
390 387

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

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

	
400 396
*/
401 397

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
496

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

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

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

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

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

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

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

	
525 511
*/
526 512

	
527

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

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

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

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

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

	
546 533
@defgroup demos Demo programs
547 534

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

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

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

	
558 545
Some utility applications are listed here.
559 546

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

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

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

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

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

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

	
104 104
*/
105 105
}
106 106

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

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

	
22 22
\section intro Introduction
23 23

	
24 24
\subsection whatis What is LEMON
25 25

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

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

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

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

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

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

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

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

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

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

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

	
108 108
\section migration-error Exceptions and Debug tools
109 109

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

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

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

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

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

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

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

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

	
31 31
namespace lemon {
32 32

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

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

	
102 101
    typedef True Notifier;
103 102

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

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

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

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

	
136 134
      friend class AlterationNotifier;
137 135

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

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

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

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

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

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

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

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

	
195 189
    private:
196 190

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

	
199 193
    protected:
200 194

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

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

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

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

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

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

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

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

	
253 246
    };
254 247

	
255 248
  protected:
256 249

	
257 250
    const Container* container;
258 251

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

	
262 255

	
263 256
  public:
264 257

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

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

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

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

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

	
304 296
  protected:
305 297

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

	
308 300
  public:
309 301

	
310

	
311

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

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

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

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

	
342 332
  protected:
343 333

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

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

	
355 345
  public:
356 346

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

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

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

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

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

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

	
479 465
}
480 466

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

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

	
22 22
#include <memory>
23 23

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

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

	
33 33
namespace lemon {
34 34

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

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

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

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

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

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

	
76 76
  public:
77 77

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

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

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

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

	
136 136

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

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

	
165 165
  protected:
166 166

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

	
171 171
  public:
172 172

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

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

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

	
199 199
  protected:
200 200

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

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

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

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

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

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

	
324 324
  private:
325 325

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

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

	
344 344
  };
345 345

	
346 346
}
347 347

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

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

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

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

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

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

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

	
42 42
  public:
43 43

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

	
48 48
    typedef True UndirectedTag;
49 49

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

	
53 53
    protected:
54 54
      bool forward;
55 55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
22

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

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

	
31 30
namespace lemon {
32 31

	
33 32

	
34 33
  //#ifndef LEMON_USE_DEBUG_MAP
35 34

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

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

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

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

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

	
63 62

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

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

	
75 74

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

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

	
87 86

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

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

	
99 98

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

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

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

	
113 112
#endif
114 113

	
115 114

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

	
122 121

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

	
129 128

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

	
136 135

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

	
143 142
// #else
144 143

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

	
150 149
// #endif
151 150

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

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

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

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

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

	
177 176
  };
178 177

	
179 178
}
180 179

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

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

	
22 22
// Boost enable_if library
23 23

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

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

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

	
34 34

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

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

	
41 41
namespace lemon
42 42
{
43 43

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

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

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

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

	
64 64

	
65 65

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

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

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

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

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

	
83 83

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

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

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

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

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

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

	
106 106

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

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

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

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

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

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

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

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

	
45 45
    // Base extensions
46 46

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

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

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

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

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

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

	
75 75
    // Alterable extension
76 76

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

	
80 80

	
81 81
  protected:
82 82

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

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

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

	
217 217

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

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

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

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

	
241 241
    };
242 242

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

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

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

	
260 260
      template <typename CMap>
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
  /// \ingroup _graphbits
329
  ///
330
  /// \brief Extender for the Graphs
328
  // \ingroup _graphbits
329
  //
330
  // \brief Extender for the Graphs
331 331
  template <typename Base>
332 332
  class GraphExtender : public Base {
333 333
  public:
334 334

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

	
338 338
    typedef True UndirectedTag;
339 339

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

	
344 344
    // Graph extension
345 345

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

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

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

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

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

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

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

	
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) { }
518 518

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

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

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

	
531 531
    };
532 532

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

	
539 539
      IncEdgeIt() { }
540 540

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

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

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

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

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

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

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

	
599 599
    // Mappable extension
600 600

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

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

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

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

	
624 624
    };
625 625

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

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

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

	
643 643
      template <typename CMap>
644 644
      ArcMap& operator=(const CMap& cmap) {
645 645
        Parent::operator=(cmap);
646 646
        return *this;
647 647
      }
648 648
    };
649 649

	
650 650

	
651 651
    template <typename _Value>
652 652
    class EdgeMap
653 653
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
654 654
    public:
655 655
      typedef GraphExtender Graph;
656 656
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
657 657

	
658 658
      EdgeMap(const Graph& graph)
659 659
        : Parent(graph) {}
660 660

	
661 661
      EdgeMap(const Graph& graph, const _Value& value)
662 662
        : Parent(graph, value) {}
663 663

	
664 664
    private:
665 665
      EdgeMap& operator=(const EdgeMap& cmap) {
666 666
        return operator=<EdgeMap>(cmap);
667 667
      }
668 668

	
669 669
      template <typename CMap>
670 670
      EdgeMap& operator=(const CMap& cmap) {
671 671
        Parent::operator=(cmap);
672 672
        return *this;
673 673
      }
674 674

	
675 675
    };
676 676

	
677 677
    // Alteration extension
678 678

	
679 679
    Node addNode() {
680 680
      Node node = Parent::addNode();
681 681
      notifier(Node()).add(node);
682 682
      return node;
683 683
    }
684 684

	
685 685
    Edge addEdge(const Node& from, const Node& to) {
686 686
      Edge edge = Parent::addEdge(from, to);
687 687
      notifier(Edge()).add(edge);
688 688
      std::vector<Arc> ev;
689 689
      ev.push_back(Parent::direct(edge, true));
690 690
      ev.push_back(Parent::direct(edge, false));
691 691
      notifier(Arc()).add(ev);
692 692
      return edge;
693 693
    }
694 694

	
695 695
    void clear() {
696 696
      notifier(Arc()).clear();
697 697
      notifier(Edge()).clear();
698 698
      notifier(Node()).clear();
699 699
      Parent::clear();
700 700
    }
701 701

	
702 702
    template <typename Graph, typename NodeRefMap, typename EdgeRefMap>
703 703
    void build(const Graph& graph, NodeRefMap& nodeRef,
704 704
               EdgeRefMap& edgeRef) {
705 705
      Parent::build(graph, nodeRef, edgeRef);
706 706
      notifier(Node()).build();
707 707
      notifier(Edge()).build();
708 708
      notifier(Arc()).build();
709 709
    }
710 710

	
711 711
    void erase(const Node& node) {
712 712
      Arc arc;
713 713
      Parent::firstOut(arc, node);
714 714
      while (arc != INVALID ) {
715 715
        erase(arc);
716 716
        Parent::firstOut(arc, node);
717 717
      }
718 718

	
719 719
      Parent::firstIn(arc, node);
720 720
      while (arc != INVALID ) {
721 721
        erase(arc);
722 722
        Parent::firstIn(arc, node);
723 723
      }
724 724

	
725 725
      notifier(Node()).erase(node);
726 726
      Parent::erase(node);
727 727
    }
728 728

	
729 729
    void erase(const Edge& edge) {
730 730
      std::vector<Arc> av;
731 731
      av.push_back(Parent::direct(edge, true));
732 732
      av.push_back(Parent::direct(edge, false));
733 733
      notifier(Arc()).erase(av);
734 734
      notifier(Edge()).erase(edge);
735 735
      Parent::erase(edge);
736 736
    }
737 737

	
738 738
    GraphExtender() {
739 739
      node_notifier.setContainer(*this);
740 740
      arc_notifier.setContainer(*this);
741 741
      edge_notifier.setContainer(*this);
742 742
    }
743 743

	
744 744
    ~GraphExtender() {
745 745
      edge_notifier.clear();
746 746
      arc_notifier.clear();
747 747
      node_notifier.clear();
748 748
    }
749 749

	
750 750
  };
751 751

	
752 752
}
753 753

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

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

	
22 22
#include <iterator>
23 23

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

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

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

	
32 32
namespace lemon {
33 33

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

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

	
44 44

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

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

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

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

	
57 57
  public:
58 58

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

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

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

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

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

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

	
83 83
      MapIt() {}
84 84

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

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

	
184 184
    typedef _Graph Graph;
185 185

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

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

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

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

	
197 197
  public:
198 198

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

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

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

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

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

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

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

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

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

	
28 28
namespace lemon {
29 29

	
30 30
  struct InvalidType {};
31 31

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

	
35 35

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

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

	
52 52
    typedef _Graph Graph;
53 53

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

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

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

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

	
70 70
     };
71 71

	
72 72
  };
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 EdgeNumTagIndicator {
222 222
    static const bool value = false;
223 223
  };
224 224

	
225 225
  template <typename Graph>
226 226
  struct EdgeNumTagIndicator<
227 227
    Graph,
228 228
    typename enable_if<typename Graph::EdgeNumTag, 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 FindEdgeTagIndicator {
235 235
    static const bool value = false;
236 236
  };
237 237

	
238 238
  template <typename Graph>
239 239
  struct FindEdgeTagIndicator<
240 240
    Graph,
241 241
    typename enable_if<typename Graph::FindEdgeTag, 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 UndirectedTagIndicator {
248 248
    static const bool value = false;
249 249
  };
250 250

	
251 251
  template <typename Graph>
252 252
  struct UndirectedTagIndicator<
253 253
    Graph,
254 254
    typename enable_if<typename Graph::UndirectedTag, 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 BuildTagIndicator {
261 261
    static const bool value = false;
262 262
  };
263 263

	
264 264
  template <typename Graph>
265 265
  struct BuildTagIndicator<
266 266
    Graph,
267 267
    typename enable_if<typename Graph::BuildTag, void>::type
268 268
  > {
269 269
    static const bool value = true;
270 270
  };
271 271

	
272 272
}
273 273

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

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

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

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

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

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

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

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

	
56 56
  public:
57 57

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

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

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

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

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

	
83 83

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

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

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

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

	
124 124

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

	
142 142
  public:
143 143

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

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

	
160 160

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

	
168 168
  protected:
169 169

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

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

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

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

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

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

	
232 232
  private:
233 233

	
234 234
    Container container;
235 235

	
236 236
  };
237 237

	
238 238
}
239 239

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

	
19 19
#ifndef LEMON_COLOR_H
20 20
#define LEMON_COLOR_H
21 21

	
22 22
#include<vector>
23 23
#include<lemon/math.h>
24 24
#include<lemon/maps.h>
25 25

	
26 26

	
27 27
///\ingroup misc
28 28
///\file
29 29
///\brief Tools to manage RGB colors.
30 30

	
31 31
namespace lemon {
32 32

	
33 33

	
34 34
  /// \addtogroup misc
35 35
  /// @{
36 36

	
37 37
  ///Data structure representing RGB colors.
38 38

	
39 39
  ///Data structure representing RGB colors.
40 40
  class Color
41 41
  {
42 42
    double _r,_g,_b;
43 43
  public:
44 44
    ///Default constructor
45 45
    Color() {}
46 46
    ///Constructor
47 47
    Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
48 48
    ///Set the red component
49 49
    double & red() {return _r;}
50 50
    ///Return the red component
51 51
    const double & red() const {return _r;}
52 52
    ///Set the green component
53 53
    double & green() {return _g;}
54 54
    ///Return the green component
55 55
    const double & green() const {return _g;}
56 56
    ///Set the blue component
57 57
    double & blue() {return _b;}
58 58
    ///Return the blue component
59 59
    const double & blue() const {return _b;}
60 60
    ///Set the color components
61 61
    void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
62 62
  };
63 63

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

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

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

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

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

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

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

	
141 141
        colors.push_back(Color(.5,.5,.5));
142 142
        colors.push_back(Color(1,.5,.5));
143 143
        colors.push_back(Color(.5,1,.5));
144 144
        colors.push_back(Color(.5,.5,1));
145 145
        colors.push_back(Color(1,1,.5));
146 146
        colors.push_back(Color(1,.5,1));
147 147
        colors.push_back(Color(.5,1,1));
148 148

	
149 149
        colors.push_back(Color(1,.5,0));
150 150
        colors.push_back(Color(.5,1,0));
151 151
        colors.push_back(Color(1,0,.5));
152 152
        colors.push_back(Color(0,1,.5));
153 153
        colors.push_back(Color(0,.5,1));
154 154
        colors.push_back(Color(.5,0,1));
155 155
      } while(int(colors.size())<num);
156 156
      if(num>=0) colors.resize(num);
157 157
    }
158 158
    ///\e
159 159
    Color &operator[](int i)
160 160
    {
161 161
      return colors[i%colors.size()];
162 162
    }
163 163
    ///\e
164 164
    const Color &operator[](int i) const
165 165
    {
166 166
      return colors[i%colors.size()];
167 167
    }
168 168
    ///\e
169 169
    void set(int i,const Color &c)
170 170
    {
171 171
      colors[i%colors.size()]=c;
172 172
    }
173 173
    ///Adds a new color to the end of the color list.
174 174
    void add(const Color &c)
175 175
    {
176 176
      colors.push_back(c);
177 177
    }
178 178

	
179 179
    ///Sets the number of the existing colors.
180 180
    void resize(int s) { colors.resize(s);}
181 181
    ///Returns the number of the existing colors.
182 182
    int size() const { return int(colors.size());}
183 183
  };
184 184

	
185 185
  ///Returns a visibly distinct \ref Color
186 186

	
187 187
  ///Returns a \ref Color which is as different from the given parameter
188 188
  ///as it is possible.
189 189
  inline Color distantColor(const Color &c)
190 190
  {
191 191
    return Color(c.red()<.5?1:0,c.green()<.5?1:0,c.blue()<.5?1:0);
192 192
  }
193 193
  ///Returns black for light colors and white for the dark ones.
194 194

	
195 195
  ///Returns black for light colors and white for the dark ones.
196 196
  inline Color distantBW(const Color &c){
197 197
    return (.2125*c.red()+.7154*c.green()+.0721*c.blue())<.5 ? WHITE : BLACK;
198 198
  }
199 199

	
200 200
  /// @}
201 201

	
202 202
} //END OF NAMESPACE LEMON
203 203

	
204 204
#endif // LEMON_COLOR_H
Ignore white space 6 line context
... ...
@@ -217,1281 +217,1281 @@
217 217
        /// \brief Converter from arc to edge.
218 218
        ///
219 219
        /// Besides the core graph item functionality each arc should
220 220
        /// be convertible to the represented edge.
221 221
        Edge(const Arc&) {}
222 222
        /// \brief Assign arc to edge.
223 223
        ///
224 224
        /// Besides the core graph item functionality each arc should
225 225
        /// be convertible to the represented edge.
226 226
        Edge& operator=(const Arc&) { return *this; }
227 227
      };
228 228

	
229 229
      /// \brief Returns the direction of the arc.
230 230
      ///
231 231
      /// Returns the direction of the arc. Each arc represents an
232 232
      /// edge with a direction. It gives back the
233 233
      /// direction.
234 234
      bool direction(const Arc&) const { return true; }
235 235

	
236 236
      /// \brief Returns the directed arc.
237 237
      ///
238 238
      /// Returns the directed arc from its direction and the
239 239
      /// represented edge.
240 240
      Arc direct(const Edge&, bool) const { return INVALID;}
241 241

	
242 242
      /// \brief Returns the directed arc.
243 243
      ///
244 244
      /// Returns the directed arc from its source and the
245 245
      /// represented edge.
246 246
      Arc direct(const Edge&, const Node&) const { return INVALID;}
247 247

	
248 248
      /// \brief Returns the opposite arc.
249 249
      ///
250 250
      /// Returns the opposite arc. It is the arc representing the
251 251
      /// same edge and has opposite direction.
252 252
      Arc oppositeArc(const Arc&) const { return INVALID;}
253 253

	
254 254
      /// \brief Gives back one ending of an edge.
255 255
      ///
256 256
      /// Gives back one ending of an edge.
257 257
      Node u(const Edge&) const { return INVALID;}
258 258

	
259 259
      /// \brief Gives back the other ending of an edge.
260 260
      ///
261 261
      /// Gives back the other ending of an edge.
262 262
      Node v(const Edge&) const { return INVALID;}
263 263

	
264 264
      template <typename _Graph>
265 265
      struct Constraints {
266 266
        typedef typename _Graph::Node Node;
267 267
        typedef typename _Graph::Arc Arc;
268 268
        typedef typename _Graph::Edge Edge;
269 269

	
270 270
        void constraints() {
271 271
          checkConcept<BaseDigraphComponent, _Graph>();
272 272
          checkConcept<GraphItem<'u'>, Edge>();
273 273
          {
274 274
            Node n;
275 275
            Edge ue(INVALID);
276 276
            Arc e;
277 277
            n = graph.u(ue);
278 278
            n = graph.v(ue);
279 279
            e = graph.direct(ue, true);
280 280
            e = graph.direct(ue, n);
281 281
            e = graph.oppositeArc(e);
282 282
            ue = e;
283 283
            bool d = graph.direction(e);
284 284
            ignore_unused_variable_warning(d);
285 285
          }
286 286
        }
287 287

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

	
291 291
    };
292 292

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

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

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

	
313 313
      /// \brief Gives back the node by the unique id.
314 314
      ///
315 315
      /// Gives back the node by the unique id.
316 316
      /// If the digraph does not contain node with the given id
317 317
      /// then the result of the function is undetermined.
318 318
      Node nodeFromId(int) const { return INVALID;}
319 319

	
320 320
      /// \brief Gives back an unique integer id for the Arc.
321 321
      ///
322 322
      /// Gives back an unique integer id for the Arc.
323 323
      ///
324 324
      int id(const Arc&) const { return -1;}
325 325

	
326 326
      /// \brief Gives back the arc by the unique id.
327 327
      ///
328 328
      /// Gives back the arc by the unique id.
329 329
      /// If the digraph does not contain arc with the given id
330 330
      /// then the result of the function is undetermined.
331 331
      Arc arcFromId(int) const { return INVALID;}
332 332

	
333 333
      /// \brief Gives back an integer greater or equal to the maximum
334 334
      /// Node id.
335 335
      ///
336 336
      /// Gives back an integer greater or equal to the maximum Node
337 337
      /// id.
338 338
      int maxNodeId() const { return -1;}
339 339

	
340 340
      /// \brief Gives back an integer greater or equal to the maximum
341 341
      /// Arc id.
342 342
      ///
343 343
      /// Gives back an integer greater or equal to the maximum Arc
344 344
      /// id.
345 345
      int maxArcId() const { return -1;}
346 346

	
347 347
      template <typename _Digraph>
348 348
      struct Constraints {
349 349

	
350 350
        void constraints() {
351 351
          checkConcept<Base, _Digraph >();
352 352
          typename _Digraph::Node node;
353 353
          int nid = digraph.id(node);
354 354
          nid = digraph.id(node);
355 355
          node = digraph.nodeFromId(nid);
356 356
          typename _Digraph::Arc arc;
357 357
          int eid = digraph.id(arc);
358 358
          eid = digraph.id(arc);
359 359
          arc = digraph.arcFromId(eid);
360 360

	
361 361
          nid = digraph.maxNodeId();
362 362
          ignore_unused_variable_warning(nid);
363 363
          eid = digraph.maxArcId();
364 364
          ignore_unused_variable_warning(eid);
365 365
        }
366 366

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

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

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

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

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

	
392 392
      /// \brief Gives back the edge by the unique id.
393 393
      ///
394 394
      /// Gives back the edge by the unique id.  If the
395 395
      /// graph does not contain arc with the given id then the
396 396
      /// result of the function is undetermined.
397 397
      Edge edgeFromId(int) const { return INVALID;}
398 398

	
399 399
      /// \brief Gives back an integer greater or equal to the maximum
400 400
      /// Edge id.
401 401
      ///
402 402
      /// Gives back an integer greater or equal to the maximum Edge
403 403
      /// id.
404 404
      int maxEdgeId() const { return -1;}
405 405

	
406 406
      template <typename _Graph>
407 407
      struct Constraints {
408 408

	
409 409
        void constraints() {
410 410
          checkConcept<Base, _Graph >();
411 411
          checkConcept<IDableDigraphComponent<Base>, _Graph >();
412 412
          typename _Graph::Edge edge;
413 413
          int ueid = graph.id(edge);
414 414
          ueid = graph.id(edge);
415 415
          edge = graph.edgeFromId(ueid);
416 416
          ueid = graph.maxEdgeId();
417 417
          ignore_unused_variable_warning(ueid);
418 418
        }
419 419

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

	
424 424
    /// \brief Skeleton class for graph NodeIt and ArcIt
425 425
    ///
426 426
    /// Skeleton class for graph NodeIt and ArcIt.
427 427
    ///
428 428
    template <typename _Graph, typename _Item>
429 429
    class GraphItemIt : public _Item {
430 430
    public:
431 431
      /// \brief Default constructor.
432 432
      ///
433 433
      /// @warning The default constructor sets the iterator
434 434
      /// to an undefined value.
435 435
      GraphItemIt() {}
436 436
      /// \brief Copy constructor.
437 437
      ///
438 438
      /// Copy constructor.
439 439
      ///
440 440
      GraphItemIt(const GraphItemIt& ) {}
441 441
      /// \brief Sets the iterator to the first item.
442 442
      ///
443 443
      /// Sets the iterator to the first item of \c the graph.
444 444
      ///
445 445
      explicit GraphItemIt(const _Graph&) {}
446 446
      /// \brief Invalid constructor \& conversion.
447 447
      ///
448 448
      /// This constructor initializes the item to be invalid.
449 449
      /// \sa Invalid for more details.
450 450
      GraphItemIt(Invalid) {}
451 451
      /// \brief Assign operator for items.
452 452
      ///
453 453
      /// The items are assignable.
454 454
      ///
455 455
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
456 456
      /// \brief Next item.
457 457
      ///
458 458
      /// Assign the iterator to the next item.
459 459
      ///
460 460
      GraphItemIt& operator++() { return *this; }
461 461
      /// \brief Equality operator
462 462
      ///
463 463
      /// Two iterators are equal if and only if they point to the
464 464
      /// same object or both are invalid.
465 465
      bool operator==(const GraphItemIt&) const { return true;}
466 466
      /// \brief Inequality operator
467 467
      ///
468 468
      /// \sa operator==(Node n)
469 469
      ///
470 470
      bool operator!=(const GraphItemIt&) const { return true;}
471 471

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

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

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

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

	
534 534
      /// \brief Equality operator
535 535
      ///
536 536
      /// Two iterators are equal if and only if they point to the
537 537
      /// same object or both are invalid.
538 538
      bool operator==(const GraphIncIt&) const { return true;}
539 539

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

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

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

	
559 559
        }
560 560

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

	
568 568

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

	
577 577
    public:
578 578

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

	
583 583
      typedef IterableDigraphComponent Digraph;
584 584

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

	
591 591
      /// \brief Gives back the first node in the iterating order.
592 592
      ///
593 593
      /// Gives back the first node in the iterating order.
594 594
      ///
595 595
      void first(Node&) const {}
596 596

	
597 597
      /// \brief Gives back the next node in the iterating order.
598 598
      ///
599 599
      /// Gives back the next node in the iterating order.
600 600
      ///
601 601
      void next(Node&) const {}
602 602

	
603 603
      /// \brief Gives back the first arc in the iterating order.
604 604
      ///
605 605
      /// Gives back the first arc in the iterating order.
606 606
      ///
607 607
      void first(Arc&) const {}
608 608

	
609 609
      /// \brief Gives back the next arc in the iterating order.
610 610
      ///
611 611
      /// Gives back the next arc in the iterating order.
612 612
      ///
613 613
      void next(Arc&) const {}
614 614

	
615 615

	
616 616
      /// \brief Gives back the first of the arcs point to the given
617 617
      /// node.
618 618
      ///
619 619
      /// Gives back the first of the arcs point to the given node.
620 620
      ///
621 621
      void firstIn(Arc&, const Node&) const {}
622 622

	
623 623
      /// \brief Gives back the next of the arcs points to the given
624 624
      /// node.
625 625
      ///
626 626
      /// Gives back the next of the arcs points to the given node.
627 627
      ///
628 628
      void nextIn(Arc&) const {}
629 629

	
630 630
      /// \brief Gives back the first of the arcs start from the
631 631
      /// given node.
632 632
      ///
633 633
      /// Gives back the first of the arcs start from the given node.
634 634
      ///
635 635
      void firstOut(Arc&, const Node&) const {}
636 636

	
637 637
      /// \brief Gives back the next of the arcs start from the given
638 638
      /// node.
639 639
      ///
640 640
      /// Gives back the next of the arcs start from the given node.
641 641
      ///
642 642
      void nextOut(Arc&) const {}
643 643

	
644 644
      /// @}
645 645

	
646 646
      /// \name Class based iteration
647 647
      ///
648 648
      /// This interface provides functions for iteration on digraph items
649 649
      ///
650 650
      /// @{
651 651

	
652 652
      /// \brief This iterator goes through each node.
653 653
      ///
654 654
      /// This iterator goes through each node.
655 655
      ///
656 656
      typedef GraphItemIt<Digraph, Node> NodeIt;
657 657

	
658 658
      /// \brief This iterator goes through each node.
659 659
      ///
660 660
      /// This iterator goes through each node.
661 661
      ///
662 662
      typedef GraphItemIt<Digraph, Arc> ArcIt;
663 663

	
664 664
      /// \brief This iterator goes trough the incoming arcs of a node.
665 665
      ///
666 666
      /// This iterator goes trough the \e inccoming arcs of a certain node
667 667
      /// of a digraph.
668 668
      typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
669 669

	
670 670
      /// \brief This iterator goes trough the outgoing arcs of a node.
671 671
      ///
672 672
      /// This iterator goes trough the \e outgoing arcs of a certain node
673 673
      /// of a digraph.
674 674
      typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
675 675

	
676 676
      /// \brief The base node of the iterator.
677 677
      ///
678 678
      /// Gives back the base node of the iterator.
679 679
      /// It is always the target of the pointed arc.
680 680
      Node baseNode(const InArcIt&) const { return INVALID; }
681 681

	
682 682
      /// \brief The running node of the iterator.
683 683
      ///
684 684
      /// Gives back the running node of the iterator.
685 685
      /// It is always the source of the pointed arc.
686 686
      Node runningNode(const InArcIt&) const { return INVALID; }
687 687

	
688 688
      /// \brief The base node of the iterator.
689 689
      ///
690 690
      /// Gives back the base node of the iterator.
691 691
      /// It is always the source of the pointed arc.
692 692
      Node baseNode(const OutArcIt&) const { return INVALID; }
693 693

	
694 694
      /// \brief The running node of the iterator.
695 695
      ///
696 696
      /// Gives back the running node of the iterator.
697 697
      /// It is always the target of the pointed arc.
698 698
      Node runningNode(const OutArcIt&) const { return INVALID; }
699 699

	
700 700
      /// @}
701 701

	
702 702
      template <typename _Digraph>
703 703
      struct Constraints {
704 704
        void constraints() {
705 705
          checkConcept<Base, _Digraph>();
706 706

	
707 707
          {
708 708
            typename _Digraph::Node node(INVALID);
709 709
            typename _Digraph::Arc arc(INVALID);
710 710
            {
711 711
              digraph.first(node);
712 712
              digraph.next(node);
713 713
            }
714 714
            {
715 715
              digraph.first(arc);
716 716
              digraph.next(arc);
717 717
            }
718 718
            {
719 719
              digraph.firstIn(arc, node);
720 720
              digraph.nextIn(arc);
721 721
            }
722 722
            {
723 723
              digraph.firstOut(arc, node);
724 724
              digraph.nextOut(arc);
725 725
            }
726 726
          }
727 727

	
728 728
          {
729 729
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
730 730
              typename _Digraph::ArcIt >();
731 731
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
732 732
              typename _Digraph::NodeIt >();
733 733
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
734 734
              typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
735 735
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
736 736
              typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
737 737

	
738 738
            typename _Digraph::Node n;
739 739
            typename _Digraph::InArcIt ieit(INVALID);
740 740
            typename _Digraph::OutArcIt oeit(INVALID);
741 741
            n = digraph.baseNode(ieit);
742 742
            n = digraph.runningNode(ieit);
743 743
            n = digraph.baseNode(oeit);
744 744
            n = digraph.runningNode(oeit);
745 745
            ignore_unused_variable_warning(n);
746 746
          }
747 747
        }
748 748

	
749 749
        const _Digraph& digraph;
750 750

	
751 751
      };
752 752
    };
753 753

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

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

	
768 768

	
769 769
      typedef IterableGraphComponent Graph;
770 770

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

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

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

	
786 786
      /// \brief Gives back the next edge in the iterating
787 787
      /// order.
788 788
      ///
789 789
      /// Gives back the next edge in the iterating order.
790 790
      ///
791 791
      void next(Edge&) const {}
792 792

	
793 793

	
794 794
      /// \brief Gives back the first of the edges from the
795 795
      /// given node.
796 796
      ///
797 797
      /// Gives back the first of the edges from the given
798 798
      /// node. The bool parameter gives back that direction which
799 799
      /// gives a good direction of the edge so the source of the
800 800
      /// directed arc is the given node.
801 801
      void firstInc(Edge&, bool&, const Node&) const {}
802 802

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

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

	
814 814
      /// @}
815 815

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

	
822 822
      /// \brief This iterator goes through each node.
823 823
      ///
824 824
      /// This iterator goes through each node.
825 825
      typedef GraphItemIt<Graph, Edge> EdgeIt;
826 826
      /// \brief This iterator goes trough the incident arcs of a
827 827
      /// node.
828 828
      ///
829 829
      /// This iterator goes trough the incident arcs of a certain
830 830
      /// node of a graph.
831 831
      typedef GraphIncIt<Graph, Edge, Node, 'u'> IncEdgeIt;
832 832
      /// \brief The base node of the iterator.
833 833
      ///
834 834
      /// Gives back the base node of the iterator.
835 835
      Node baseNode(const IncEdgeIt&) const { return INVALID; }
836 836

	
837 837
      /// \brief The running node of the iterator.
838 838
      ///
839 839
      /// Gives back the running node of the iterator.
840 840
      Node runningNode(const IncEdgeIt&) const { return INVALID; }
841 841

	
842 842
      /// @}
843 843

	
844 844
      template <typename _Graph>
845 845
      struct Constraints {
846 846
        void constraints() {
847 847
          checkConcept<IterableDigraphComponent<Base>, _Graph>();
848 848

	
849 849
          {
850 850
            typename _Graph::Node node(INVALID);
851 851
            typename _Graph::Edge edge(INVALID);
852 852
            bool dir;
853 853
            {
854 854
              graph.first(edge);
855 855
              graph.next(edge);
856 856
            }
857 857
            {
858 858
              graph.firstInc(edge, dir, node);
859 859
              graph.nextInc(edge, dir);
860 860
            }
861 861

	
862 862
          }
863 863

	
864 864
          {
865 865
            checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
866 866
              typename _Graph::EdgeIt >();
867 867
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
868 868
              typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
869 869

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

	
877 877
        const _Graph& graph;
878 878

	
879 879
      };
880 880
    };
881 881

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

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

	
898 898

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

	
906 906
      /// \brief Gives back the node alteration notifier.
907 907
      ///
908 908
      /// Gives back the node alteration notifier.
909 909
      NodeNotifier& notifier(Node) const {
910 910
        return NodeNotifier();
911 911
      }
912 912

	
913 913
      /// \brief Gives back the arc alteration notifier.
914 914
      ///
915 915
      /// Gives back the arc alteration notifier.
916 916
      ArcNotifier& notifier(Arc) const {
917 917
        return ArcNotifier();
918 918
      }
919 919

	
920 920
      template <typename _Digraph>
921 921
      struct Constraints {
922 922
        void constraints() {
923 923
          checkConcept<Base, _Digraph>();
924 924
          typename _Digraph::NodeNotifier& nn
925 925
            = digraph.notifier(typename _Digraph::Node());
926 926

	
927 927
          typename _Digraph::ArcNotifier& en
928 928
            = digraph.notifier(typename _Digraph::Arc());
929 929

	
930 930
          ignore_unused_variable_warning(nn);
931 931
          ignore_unused_variable_warning(en);
932 932
        }
933 933

	
934 934
        const _Digraph& digraph;
935 935

	
936 936
      };
937 937

	
938 938
    };
939 939

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

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

	
955 955

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

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

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

	
976 976
        const _Graph& graph;
977 977

	
978 978
      };
979 979

	
980 980
    };
981 981

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

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

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

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

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

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

	
1026 1026
    public:
1027 1027
      template<typename _Map>
1028 1028
      struct Constraints {
1029 1029
        void constraints() {
1030 1030
          checkConcept<ReadWriteMap<Key, Value>, _Map >();
1031 1031
          // Construction with a graph parameter
1032 1032
          _Map a(g);
1033 1033
          // Constructor with a graph and a default value parameter
1034 1034
          _Map a2(g,t);
1035 1035
          // Copy constructor.
1036 1036
          // _Map b(c);
1037 1037

	
1038 1038
          // ReadMap<Key, Value> cmap;
1039 1039
          // b = cmap;
1040 1040

	
1041 1041
          ignore_unused_variable_warning(a);
1042 1042
          ignore_unused_variable_warning(a2);
1043 1043
          // ignore_unused_variable_warning(b);
1044 1044
        }
1045 1045

	
1046 1046
        const _Map &c;
1047 1047
        const Graph &g;
1048 1048
        const typename GraphMap::Value &t;
1049 1049
      };
1050 1050

	
1051 1051
    };
1052 1052

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

	
1062 1062
      typedef _Base Base;
1063 1063
      typedef typename Base::Node Node;
1064 1064
      typedef typename Base::Arc Arc;
1065 1065

	
1066 1066
      typedef MappableDigraphComponent Digraph;
1067 1067

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

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

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

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

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

	
1104 1104
      };
1105 1105

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

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

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

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

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

	
1142 1142
      };
1143 1143

	
1144 1144

	
1145 1145
      template <typename _Digraph>
1146 1146
      struct Constraints {
1147 1147

	
1148 1148
        struct Dummy {
1149 1149
          int value;
1150 1150
          Dummy() : value(0) {}
1151 1151
          Dummy(int _v) : value(_v) {}
1152 1152
        };
1153 1153

	
1154 1154
        void constraints() {
1155 1155
          checkConcept<Base, _Digraph>();
1156 1156
          { // int map test
1157 1157
            typedef typename _Digraph::template NodeMap<int> IntNodeMap;
1158 1158
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
1159 1159
              IntNodeMap >();
1160 1160
          } { // bool map test
1161 1161
            typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
1162 1162
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
1163 1163
              BoolNodeMap >();
1164 1164
          } { // Dummy map test
1165 1165
            typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
1166 1166
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
1167 1167
              DummyNodeMap >();
1168 1168
          }
1169 1169

	
1170 1170
          { // int map test
1171 1171
            typedef typename _Digraph::template ArcMap<int> IntArcMap;
1172 1172
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
1173 1173
              IntArcMap >();
1174 1174
          } { // bool map test
1175 1175
            typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1176 1176
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1177 1177
              BoolArcMap >();
1178 1178
          } { // Dummy map test
1179 1179
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1180 1180
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1181 1181
              DummyArcMap >();
1182 1182
          }
1183 1183
        }
1184 1184

	
1185 1185
        _Digraph& digraph;
1186 1186
      };
1187 1187
    };
1188 1188

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

	
1198 1198
      typedef _Base Base;
1199 1199
      typedef typename Base::Edge Edge;
1200 1200

	
1201 1201
      typedef MappableGraphComponent Graph;
1202 1202

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

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

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

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

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

	
1239 1239
      };
1240 1240

	
1241 1241

	
1242 1242
      template <typename _Graph>
1243 1243
      struct Constraints {
1244 1244

	
1245 1245
        struct Dummy {
1246 1246
          int value;
1247 1247
          Dummy() : value(0) {}
1248 1248
          Dummy(int _v) : value(_v) {}
1249 1249
        };
1250 1250

	
1251 1251
        void constraints() {
1252 1252
          checkConcept<MappableGraphComponent<Base>, _Graph>();
1253 1253

	
1254 1254
          { // int map test
1255 1255
            typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1256 1256
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1257 1257
              IntEdgeMap >();
1258 1258
          } { // bool map test
1259 1259
            typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1260 1260
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1261 1261
              BoolEdgeMap >();
1262 1262
          } { // Dummy map test
1263 1263
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1264 1264
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1265 1265
              DummyEdgeMap >();
1266 1266
          }
1267 1267
        }
1268 1268

	
1269 1269
        _Graph& graph;
1270 1270
      };
1271 1271
    };
1272 1272

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

	
1284 1284
      typedef typename _Base::Node Node;
1285 1285
      typedef typename _Base::Arc Arc;
1286 1286

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

	
1295 1295
      /// \brief Adds a new arc connects the given two nodes.
1296 1296
      ///
1297 1297
      /// Adds a new arc connects the the given two nodes.
1298 1298
      Arc addArc(const Node&, const Node&) {
1299 1299
        return INVALID;
1300 1300
      }
1301 1301

	
1302 1302
      template <typename _Digraph>
1303 1303
      struct Constraints {
1304 1304
        void constraints() {
1305 1305
          checkConcept<Base, _Digraph>();
1306 1306
          typename _Digraph::Node node_a, node_b;
1307 1307
          node_a = digraph.addNode();
1308 1308
          node_b = digraph.addNode();
1309 1309
          typename _Digraph::Arc arc;
1310 1310
          arc = digraph.addArc(node_a, node_b);
1311 1311
        }
1312 1312

	
1313 1313
        _Digraph& digraph;
1314 1314
      };
1315 1315
    };
1316 1316

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

	
1328 1328
      typedef _Base Base;
1329 1329
      typedef typename _Base::Node Node;
1330 1330
      typedef typename _Base::Edge Edge;
1331 1331

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

	
1340 1340
      /// \brief Adds a new arc connects the given two nodes.
1341 1341
      ///
1342 1342
      /// Adds a new arc connects the the given two nodes.
1343 1343
      Edge addArc(const Node&, const Node&) {
1344 1344
        return INVALID;
1345 1345
      }
1346 1346

	
1347 1347
      template <typename _Graph>
1348 1348
      struct Constraints {
1349 1349
        void constraints() {
1350 1350
          checkConcept<Base, _Graph>();
1351 1351
          typename _Graph::Node node_a, node_b;
1352 1352
          node_a = graph.addNode();
1353 1353
          node_b = graph.addNode();
1354 1354
          typename _Graph::Edge edge;
1355 1355
          edge = graph.addEdge(node_a, node_b);
1356 1356
        }
1357 1357

	
1358 1358
        _Graph& graph;
1359 1359
      };
1360 1360
    };
1361 1361

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

	
1372 1372
      typedef _Base Base;
1373 1373
      typedef typename Base::Node Node;
1374 1374
      typedef typename Base::Arc Arc;
1375 1375

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

	
1382 1382
      /// \brief Erase an arc from the digraph.
1383 1383
      ///
1384 1384
      /// Erase an arc from the digraph.
1385 1385
      ///
1386 1386
      void erase(const Arc&) {}
1387 1387

	
1388 1388
      template <typename _Digraph>
1389 1389
      struct Constraints {
1390 1390
        void constraints() {
1391 1391
          checkConcept<Base, _Digraph>();
1392 1392
          typename _Digraph::Node node;
1393 1393
          digraph.erase(node);
1394 1394
          typename _Digraph::Arc arc;
1395 1395
          digraph.erase(arc);
1396 1396
        }
1397 1397

	
1398 1398
        _Digraph& digraph;
1399 1399
      };
1400 1400
    };
1401 1401

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

	
1412 1412
      typedef _Base Base;
1413 1413
      typedef typename Base::Node Node;
1414 1414
      typedef typename Base::Edge Edge;
1415 1415

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

	
1422 1422
      /// \brief Erase an arc from the graph.
1423 1423
      ///
1424 1424
      /// Erase an arc from the graph.
1425 1425
      ///
1426 1426
      void erase(const Edge&) {}
1427 1427

	
1428 1428
      template <typename _Graph>
1429 1429
      struct Constraints {
1430 1430
        void constraints() {
1431 1431
          checkConcept<Base, _Graph>();
1432 1432
          typename _Graph::Node node;
1433 1433
          graph.erase(node);
1434 1434
          typename _Graph::Edge edge;
1435 1435
          graph.erase(edge);
1436 1436
        }
1437 1437

	
1438 1438
        _Graph& graph;
1439 1439
      };
1440 1440
    };
1441 1441

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

	
1452 1452
      typedef _Base Base;
1453 1453

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

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

	
1467 1467
        _Digraph digraph;
1468 1468
      };
1469 1469
    };
1470 1470

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

	
1481 1481
      typedef _Base Base;
1482 1482

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

	
1489 1489
        _Graph graph;
1490 1490
      };
1491 1491
    };
1492 1492

	
1493 1493
  }
1494 1494

	
1495 1495
}
1496 1496

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

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

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

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

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

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

	
36 36
    /// Readable map concept
37 37

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

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

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

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

	
73 73
    };
74 74

	
75 75

	
76 76
    /// Writable map concept
77 77

	
78 78
    /// Writable map concept.
79 79
    ///
80 80
    template<typename K, typename T>
81 81
    class WriteMap
82 82
    {
83 83
    public:
84 84
      /// The key type of the map.
85 85
      typedef K Key;
86 86
      /// \brief The value type of the map.
87 87
      /// (The type of objects associated with the keys).
88 88
      typedef T Value;
89 89

	
90 90
      /// Sets the value associated with the given key.
91 91
      void set(const Key &, const Value &) {}
92 92

	
93 93
      /// Default constructor.
94 94
      WriteMap() {}
95 95

	
96 96
      template <typename _WriteMap>
97 97
      struct Constraints {
98 98
        void constraints() {
99 99
          m.set(key, val);
100 100
          m.set(own_key, own_val);
101 101

	
102 102
          ignore_unused_variable_warning(key);
103 103
          ignore_unused_variable_warning(val);
104 104
          ignore_unused_variable_warning(own_key);
105 105
          ignore_unused_variable_warning(own_val);
106 106
        }
107 107
        const Key& key;
108 108
        const Value& val;
109 109
        const typename _WriteMap::Key& own_key;
110 110
        const typename _WriteMap::Value& own_val;
111 111
        _WriteMap& m;
112 112
      };
113 113
    };
114 114

	
115 115
    /// Read/writable map concept
116 116

	
117 117
    /// Read/writable map concept.
118 118
    ///
119 119
    template<typename K, typename T>
120 120
    class ReadWriteMap : public ReadMap<K,T>,
121 121
                         public WriteMap<K,T>
122 122
    {
123 123
    public:
124 124
      /// The key type of the map.
125 125
      typedef K Key;
126 126
      /// \brief The value type of the map.
127 127
      /// (The type of objects associated with the keys).
128 128
      typedef T Value;
129 129

	
130 130
      /// Returns the value associated with the given key.
131 131
      Value operator[](const Key &) const {
132 132
        return *static_cast<Value *>(0);
133 133
      }
134 134

	
135 135
      /// Sets the value associated with the given key.
136 136
      void set(const Key &, const Value &) {}
137 137

	
138 138
      template<typename _ReadWriteMap>
139 139
      struct Constraints {
140 140
        void constraints() {
141 141
          checkConcept<ReadMap<K, T>, _ReadWriteMap >();
142 142
          checkConcept<WriteMap<K, T>, _ReadWriteMap >();
143 143
        }
144 144
      };
145 145
    };
146 146

	
147 147

	
148 148
    /// Dereferable map concept
149 149

	
150 150
    /// Dereferable map concept.
151 151
    ///
152 152
    template<typename K, typename T, typename R, typename CR>
153 153
    class ReferenceMap : public ReadWriteMap<K,T>
154 154
    {
155 155
    public:
156 156
      /// Tag for reference maps.
157 157
      typedef True ReferenceMapTag;
158 158
      /// The key type of the map.
159 159
      typedef K Key;
160 160
      /// \brief The value type of the map.
161 161
      /// (The type of objects associated with the keys).
162 162
      typedef T Value;
163 163
      /// The reference type of the map.
164 164
      typedef R Reference;
165 165
      /// The const reference type of the map.
166 166
      typedef CR ConstReference;
167 167

	
168 168
    public:
169 169

	
170 170
      /// Returns a reference to the value associated with the given key.
171 171
      Reference operator[](const Key &) {
172 172
        return *static_cast<Value *>(0);
173 173
      }
174 174

	
175 175
      /// Returns a const reference to the value associated with the given key.
176 176
      ConstReference operator[](const Key &) const {
177 177
        return *static_cast<Value *>(0);
178 178
      }
179 179

	
180 180
      /// Sets the value associated with the given key.
181 181
      void set(const Key &k,const Value &t) { operator[](k)=t; }
182 182

	
183 183
      template<typename _ReferenceMap>
184 184
      struct Constraints {
185 185
        void constraints() {
186 186
          checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
187 187
          ref = m[key];
188 188
          m[key] = val;
189 189
          m[key] = ref;
190 190
          m[key] = cref;
191 191
          own_ref = m[own_key];
192 192
          m[own_key] = own_val;
193 193
          m[own_key] = own_ref;
194 194
          m[own_key] = own_cref;
195 195
          m[key] = m[own_key];
196 196
          m[own_key] = m[key];
197 197
        }
198 198
        const Key& key;
199 199
        Value& val;
200 200
        Reference ref;
201 201
        ConstReference cref;
202 202
        const typename _ReferenceMap::Key& own_key;
203 203
        typename _ReferenceMap::Value& own_val;
204 204
        typename _ReferenceMap::Reference own_ref;
205 205
        typename _ReferenceMap::ConstReference own_cref;
206 206
        _ReferenceMap& m;
207 207
      };
208 208
    };
209 209

	
210 210
    // @}
211 211

	
212 212
  } //namespace concepts
213 213

	
214 214
} //namespace lemon
215 215

	
216 216
#endif // LEMON_CONCEPT_MAPS_H
Ignore white space 6 line context
... ...
@@ -789,1056 +789,1056 @@
789 789
    template <typename FromMap, typename ToMap>
790 790
    GraphCopy& nodeMap(const FromMap& map, ToMap& tmap) {
791 791
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
792 792
                           NodeRefMap, FromMap, ToMap>(map, tmap));
793 793
      return *this;
794 794
    }
795 795

	
796 796
    /// \brief Make a copy of the given node.
797 797
    ///
798 798
    /// This function makes a copy of the given node.
799 799
    GraphCopy& node(const Node& node, TNode& tnode) {
800 800
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
801 801
                           NodeRefMap, TNode>(node, tnode));
802 802
      return *this;
803 803
    }
804 804

	
805 805
    /// \brief Copy the arc references into the given map.
806 806
    ///
807 807
    /// This function copies the arc references into the given map.
808 808
    /// The parameter should be a map, whose key type is the Arc type of
809 809
    /// the source graph, while the value type is the Arc type of the
810 810
    /// destination graph.
811 811
    template <typename ArcRef>
812 812
    GraphCopy& arcRef(ArcRef& map) {
813 813
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
814 814
                          ArcRefMap, ArcRef>(map));
815 815
      return *this;
816 816
    }
817 817

	
818 818
    /// \brief Copy the arc cross references into the given map.
819 819
    ///
820 820
    /// This function copies the arc cross references (reverse references)
821 821
    /// into the given map. The parameter should be a map, whose key type
822 822
    /// is the Arc type of the destination graph, while the value type is
823 823
    /// the Arc type of the source graph.
824 824
    template <typename ArcCrossRef>
825 825
    GraphCopy& arcCrossRef(ArcCrossRef& map) {
826 826
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
827 827
                          ArcRefMap, ArcCrossRef>(map));
828 828
      return *this;
829 829
    }
830 830

	
831 831
    /// \brief Make a copy of the given arc map.
832 832
    ///
833 833
    /// This function makes a copy of the given arc map for the newly
834 834
    /// created graph.
835 835
    /// The key type of the new map \c tmap should be the Arc type of the
836 836
    /// destination graph, and the key type of the original map \c map
837 837
    /// should be the Arc type of the source graph.
838 838
    template <typename FromMap, typename ToMap>
839 839
    GraphCopy& arcMap(const FromMap& map, ToMap& tmap) {
840 840
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
841 841
                          ArcRefMap, FromMap, ToMap>(map, tmap));
842 842
      return *this;
843 843
    }
844 844

	
845 845
    /// \brief Make a copy of the given arc.
846 846
    ///
847 847
    /// This function makes a copy of the given arc.
848 848
    GraphCopy& arc(const Arc& arc, TArc& tarc) {
849 849
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
850 850
                          ArcRefMap, TArc>(arc, tarc));
851 851
      return *this;
852 852
    }
853 853

	
854 854
    /// \brief Copy the edge references into the given map.
855 855
    ///
856 856
    /// This function copies the edge references into the given map.
857 857
    /// The parameter should be a map, whose key type is the Edge type of
858 858
    /// the source graph, while the value type is the Edge type of the
859 859
    /// destination graph.
860 860
    template <typename EdgeRef>
861 861
    GraphCopy& edgeRef(EdgeRef& map) {
862 862
      _edge_maps.push_back(new _core_bits::RefCopy<From, Edge,
863 863
                           EdgeRefMap, EdgeRef>(map));
864 864
      return *this;
865 865
    }
866 866

	
867 867
    /// \brief Copy the edge cross references into the given map.
868 868
    ///
869 869
    /// This function copies the edge cross references (reverse references)
870 870
    /// into the given map. The parameter should be a map, whose key type
871 871
    /// is the Edge type of the destination graph, while the value type is
872 872
    /// the Edge type of the source graph.
873 873
    template <typename EdgeCrossRef>
874 874
    GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
875 875
      _edge_maps.push_back(new _core_bits::CrossRefCopy<From,
876 876
                           Edge, EdgeRefMap, EdgeCrossRef>(map));
877 877
      return *this;
878 878
    }
879 879

	
880 880
    /// \brief Make a copy of the given edge map.
881 881
    ///
882 882
    /// This function makes a copy of the given edge map for the newly
883 883
    /// created graph.
884 884
    /// The key type of the new map \c tmap should be the Edge type of the
885 885
    /// destination graph, and the key type of the original map \c map
886 886
    /// should be the Edge type of the source graph.
887 887
    template <typename FromMap, typename ToMap>
888 888
    GraphCopy& edgeMap(const FromMap& map, ToMap& tmap) {
889 889
      _edge_maps.push_back(new _core_bits::MapCopy<From, Edge,
890 890
                           EdgeRefMap, FromMap, ToMap>(map, tmap));
891 891
      return *this;
892 892
    }
893 893

	
894 894
    /// \brief Make a copy of the given edge.
895 895
    ///
896 896
    /// This function makes a copy of the given edge.
897 897
    GraphCopy& edge(const Edge& edge, TEdge& tedge) {
898 898
      _edge_maps.push_back(new _core_bits::ItemCopy<From, Edge,
899 899
                           EdgeRefMap, TEdge>(edge, tedge));
900 900
      return *this;
901 901
    }
902 902

	
903 903
    /// \brief Execute copying.
904 904
    ///
905 905
    /// This function executes the copying of the graph along with the
906 906
    /// copying of the assigned data.
907 907
    void run() {
908 908
      NodeRefMap nodeRefMap(_from);
909 909
      EdgeRefMap edgeRefMap(_from);
910 910
      ArcRefMap arcRefMap(_from, _to, edgeRefMap, nodeRefMap);
911 911
      _core_bits::GraphCopySelector<To>::
912 912
        copy(_from, _to, nodeRefMap, edgeRefMap);
913 913
      for (int i = 0; i < int(_node_maps.size()); ++i) {
914 914
        _node_maps[i]->copy(_from, nodeRefMap);
915 915
      }
916 916
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
917 917
        _edge_maps[i]->copy(_from, edgeRefMap);
918 918
      }
919 919
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
920 920
        _arc_maps[i]->copy(_from, arcRefMap);
921 921
      }
922 922
    }
923 923

	
924 924
  private:
925 925

	
926 926
    const From& _from;
927 927
    To& _to;
928 928

	
929 929
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
930 930
      _node_maps;
931 931

	
932 932
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
933 933
      _arc_maps;
934 934

	
935 935
    std::vector<_core_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
936 936
      _edge_maps;
937 937

	
938 938
  };
939 939

	
940 940
  /// \brief Copy a graph to another graph.
941 941
  ///
942 942
  /// This function copies a graph to another graph.
943 943
  /// The complete usage of it is detailed in the GraphCopy class,
944 944
  /// but a short example shows a basic work:
945 945
  ///\code
946 946
  /// graphCopy(src, trg).nodeRef(nr).edgeCrossRef(ecr).run();
947 947
  ///\endcode
948 948
  ///
949 949
  /// After the copy the \c nr map will contain the mapping from the
950 950
  /// nodes of the \c from graph to the nodes of the \c to graph and
951 951
  /// \c ecr will contain the mapping from the edges of the \c to graph
952 952
  /// to the edges of the \c from graph.
953 953
  ///
954 954
  /// \see GraphCopy
955 955
  template <typename From, typename To>
956 956
  GraphCopy<From, To>
957 957
  graphCopy(const From& from, To& to) {
958 958
    return GraphCopy<From, To>(from, to);
959 959
  }
960 960

	
961 961
  namespace _core_bits {
962 962

	
963 963
    template <typename Graph, typename Enable = void>
964 964
    struct FindArcSelector {
965 965
      typedef typename Graph::Node Node;
966 966
      typedef typename Graph::Arc Arc;
967 967
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
968 968
        if (e == INVALID) {
969 969
          g.firstOut(e, u);
970 970
        } else {
971 971
          g.nextOut(e);
972 972
        }
973 973
        while (e != INVALID && g.target(e) != v) {
974 974
          g.nextOut(e);
975 975
        }
976 976
        return e;
977 977
      }
978 978
    };
979 979

	
980 980
    template <typename Graph>
981 981
    struct FindArcSelector<
982 982
      Graph,
983 983
      typename enable_if<typename Graph::FindArcTag, void>::type>
984 984
    {
985 985
      typedef typename Graph::Node Node;
986 986
      typedef typename Graph::Arc Arc;
987 987
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
988 988
        return g.findArc(u, v, prev);
989 989
      }
990 990
    };
991 991
  }
992 992

	
993 993
  /// \brief Find an arc between two nodes of a digraph.
994 994
  ///
995 995
  /// This function finds an arc from node \c u to node \c v in the
996 996
  /// digraph \c g.
997 997
  ///
998 998
  /// If \c prev is \ref INVALID (this is the default value), then
999 999
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
1000 1000
  /// the next arc from \c u to \c v after \c prev.
1001 1001
  /// \return The found arc or \ref INVALID if there is no such an arc.
1002 1002
  ///
1003 1003
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
1004 1004
  ///\code
1005 1005
  /// for(Arc e = findArc(g,u,v); e != INVALID; e = findArc(g,u,v,e)) {
1006 1006
  ///   ...
1007 1007
  /// }
1008 1008
  ///\endcode
1009 1009
  ///
1010 1010
  /// \note \ref ConArcIt provides iterator interface for the same
1011 1011
  /// functionality.
1012 1012
  ///
1013 1013
  ///\sa ConArcIt
1014 1014
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
1015 1015
  template <typename Graph>
1016 1016
  inline typename Graph::Arc
1017 1017
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
1018 1018
          typename Graph::Arc prev = INVALID) {
1019 1019
    return _core_bits::FindArcSelector<Graph>::find(g, u, v, prev);
1020 1020
  }
1021 1021

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

	
1039 1039
    typedef _Graph Graph;
1040 1040
    typedef typename Graph::Arc Parent;
1041 1041

	
1042 1042
    typedef typename Graph::Arc Arc;
1043 1043
    typedef typename Graph::Node Node;
1044 1044

	
1045 1045
    /// \brief Constructor.
1046 1046
    ///
1047 1047
    /// Construct a new ConArcIt iterating on the arcs that
1048 1048
    /// connects nodes \c u and \c v.
1049 1049
    ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
1050 1050
      Parent::operator=(findArc(_graph, u, v));
1051 1051
    }
1052 1052

	
1053 1053
    /// \brief Constructor.
1054 1054
    ///
1055 1055
    /// Construct a new ConArcIt that continues the iterating from arc \c a.
1056 1056
    ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
1057 1057

	
1058 1058
    /// \brief Increment operator.
1059 1059
    ///
1060 1060
    /// It increments the iterator and gives back the next arc.
1061 1061
    ConArcIt& operator++() {
1062 1062
      Parent::operator=(findArc(_graph, _graph.source(*this),
1063 1063
                                _graph.target(*this), *this));
1064 1064
      return *this;
1065 1065
    }
1066 1066
  private:
1067 1067
    const Graph& _graph;
1068 1068
  };
1069 1069

	
1070 1070
  namespace _core_bits {
1071 1071

	
1072 1072
    template <typename Graph, typename Enable = void>
1073 1073
    struct FindEdgeSelector {
1074 1074
      typedef typename Graph::Node Node;
1075 1075
      typedef typename Graph::Edge Edge;
1076 1076
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
1077 1077
        bool b;
1078 1078
        if (u != v) {
1079 1079
          if (e == INVALID) {
1080 1080
            g.firstInc(e, b, u);
1081 1081
          } else {
1082 1082
            b = g.u(e) == u;
1083 1083
            g.nextInc(e, b);
1084 1084
          }
1085 1085
          while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) {
1086 1086
            g.nextInc(e, b);
1087 1087
          }
1088 1088
        } else {
1089 1089
          if (e == INVALID) {
1090 1090
            g.firstInc(e, b, u);
1091 1091
          } else {
1092 1092
            b = true;
1093 1093
            g.nextInc(e, b);
1094 1094
          }
1095 1095
          while (e != INVALID && (!b || g.v(e) != v)) {
1096 1096
            g.nextInc(e, b);
1097 1097
          }
1098 1098
        }
1099 1099
        return e;
1100 1100
      }
1101 1101
    };
1102 1102

	
1103 1103
    template <typename Graph>
1104 1104
    struct FindEdgeSelector<
1105 1105
      Graph,
1106 1106
      typename enable_if<typename Graph::FindEdgeTag, void>::type>
1107 1107
    {
1108 1108
      typedef typename Graph::Node Node;
1109 1109
      typedef typename Graph::Edge Edge;
1110 1110
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
1111 1111
        return g.findEdge(u, v, prev);
1112 1112
      }
1113 1113
    };
1114 1114
  }
1115 1115

	
1116 1116
  /// \brief Find an edge between two nodes of a graph.
1117 1117
  ///
1118 1118
  /// This function finds an edge from node \c u to node \c v in graph \c g.
1119 1119
  /// If node \c u and node \c v is equal then each loop edge
1120 1120
  /// will be enumerated once.
1121 1121
  ///
1122 1122
  /// If \c prev is \ref INVALID (this is the default value), then
1123 1123
  /// it finds the first edge from \c u to \c v. Otherwise it looks for
1124 1124
  /// the next edge from \c u to \c v after \c prev.
1125 1125
  /// \return The found edge or \ref INVALID if there is no such an edge.
1126 1126
  ///
1127 1127
  /// Thus you can iterate through each edge between \c u and \c v
1128 1128
  /// as it follows.
1129 1129
  ///\code
1130 1130
  /// for(Edge e = findEdge(g,u,v); e != INVALID; e = findEdge(g,u,v,e)) {
1131 1131
  ///   ...
1132 1132
  /// }
1133 1133
  ///\endcode
1134 1134
  ///
1135 1135
  /// \note \ref ConEdgeIt provides iterator interface for the same
1136 1136
  /// functionality.
1137 1137
  ///
1138 1138
  ///\sa ConEdgeIt
1139 1139
  template <typename Graph>
1140 1140
  inline typename Graph::Edge
1141 1141
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
1142 1142
            typename Graph::Edge p = INVALID) {
1143 1143
    return _core_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
1144 1144
  }
1145 1145

	
1146 1146
  /// \brief Iterator for iterating on parallel edges connecting the same nodes.
1147 1147
  ///
1148 1148
  /// Iterator for iterating on parallel edges connecting the same nodes.
1149 1149
  /// It is a higher level interface for the findEdge() function. You can
1150 1150
  /// use it the following way:
1151 1151
  ///\code
1152 1152
  /// for (ConEdgeIt<Graph> it(g, u, v); it != INVALID; ++it) {
1153 1153
  ///   ...
1154 1154
  /// }
1155 1155
  ///\endcode
1156 1156
  ///
1157 1157
  ///\sa findEdge()
1158 1158
  template <typename _Graph>
1159 1159
  class ConEdgeIt : public _Graph::Edge {
1160 1160
  public:
1161 1161

	
1162 1162
    typedef _Graph Graph;
1163 1163
    typedef typename Graph::Edge Parent;
1164 1164

	
1165 1165
    typedef typename Graph::Edge Edge;
1166 1166
    typedef typename Graph::Node Node;
1167 1167

	
1168 1168
    /// \brief Constructor.
1169 1169
    ///
1170 1170
    /// Construct a new ConEdgeIt iterating on the edges that
1171 1171
    /// connects nodes \c u and \c v.
1172 1172
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
1173 1173
      Parent::operator=(findEdge(_graph, u, v));
1174 1174
    }
1175 1175

	
1176 1176
    /// \brief Constructor.
1177 1177
    ///
1178 1178
    /// Construct a new ConEdgeIt that continues iterating from edge \c e.
1179 1179
    ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
1180 1180

	
1181 1181
    /// \brief Increment operator.
1182 1182
    ///
1183 1183
    /// It increments the iterator and gives back the next edge.
1184 1184
    ConEdgeIt& operator++() {
1185 1185
      Parent::operator=(findEdge(_graph, _graph.u(*this),
1186 1186
                                 _graph.v(*this), *this));
1187 1187
      return *this;
1188 1188
    }
1189 1189
  private:
1190 1190
    const Graph& _graph;
1191 1191
  };
1192 1192

	
1193 1193

	
1194 1194
  ///Dynamic arc look-up between given endpoints.
1195 1195

	
1196 1196
  ///Using this class, you can find an arc in a digraph from a given
1197 1197
  ///source to a given target in amortized time <em>O</em>(log<em>d</em>),
1198 1198
  ///where <em>d</em> is the out-degree of the source node.
1199 1199
  ///
1200 1200
  ///It is possible to find \e all parallel arcs between two nodes with
1201 1201
  ///the \c operator() member.
1202 1202
  ///
1203 1203
  ///This is a dynamic data structure. Consider to use \ref ArcLookUp or
1204 1204
  ///\ref AllArcLookUp if your digraph is not changed so frequently.
1205 1205
  ///
1206 1206
  ///This class uses a self-adjusting binary search tree, the Splay tree
1207 1207
  ///of Sleator and Tarjan to guarantee the logarithmic amortized
1208 1208
  ///time bound for arc look-ups. This class also guarantees the
1209 1209
  ///optimal time bound in a constant factor for any distribution of
1210 1210
  ///queries.
1211 1211
  ///
1212 1212
  ///\tparam G The type of the underlying digraph.
1213 1213
  ///
1214 1214
  ///\sa ArcLookUp
1215 1215
  ///\sa AllArcLookUp
1216 1216
  template<class G>
1217 1217
  class DynArcLookUp
1218 1218
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
1219 1219
  {
1220 1220
  public:
1221 1221
    typedef typename ItemSetTraits<G, typename G::Arc>
1222 1222
    ::ItemNotifier::ObserverBase Parent;
1223 1223

	
1224 1224
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1225 1225
    typedef G Digraph;
1226 1226

	
1227 1227
  protected:
1228 1228

	
1229 1229
    class AutoNodeMap : public ItemSetTraits<G, Node>::template Map<Arc>::Type {
1230 1230
    public:
1231 1231

	
1232 1232
      typedef typename ItemSetTraits<G, Node>::template Map<Arc>::Type Parent;
1233 1233

	
1234 1234
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
1235 1235

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

	
1241 1241
      virtual void add(const std::vector<Node>& nodes) {
1242 1242
        Parent::add(nodes);
1243 1243
        for (int i = 0; i < int(nodes.size()); ++i) {
1244 1244
          Parent::set(nodes[i], INVALID);
1245 1245
        }
1246 1246
      }
1247 1247

	
1248 1248
      virtual void build() {
1249 1249
        Parent::build();
1250 1250
        Node it;
1251 1251
        typename Parent::Notifier* nf = Parent::notifier();
1252 1252
        for (nf->first(it); it != INVALID; nf->next(it)) {
1253 1253
          Parent::set(it, INVALID);
1254 1254
        }
1255 1255
      }
1256 1256
    };
1257 1257

	
1258 1258
    const Digraph &_g;
1259 1259
    AutoNodeMap _head;
1260 1260
    typename Digraph::template ArcMap<Arc> _parent;
1261 1261
    typename Digraph::template ArcMap<Arc> _left;
1262 1262
    typename Digraph::template ArcMap<Arc> _right;
1263 1263

	
1264 1264
    class ArcLess {
1265 1265
      const Digraph &g;
1266 1266
    public:
1267 1267
      ArcLess(const Digraph &_g) : g(_g) {}
1268 1268
      bool operator()(Arc a,Arc b) const
1269 1269
      {
1270 1270
        return g.target(a)<g.target(b);
1271 1271
      }
1272 1272
    };
1273 1273

	
1274 1274
  public:
1275 1275

	
1276 1276
    ///Constructor
1277 1277

	
1278 1278
    ///Constructor.
1279 1279
    ///
1280 1280
    ///It builds up the search database.
1281 1281
    DynArcLookUp(const Digraph &g)
1282 1282
      : _g(g),_head(g),_parent(g),_left(g),_right(g)
1283 1283
    {
1284 1284
      Parent::attach(_g.notifier(typename Digraph::Arc()));
1285 1285
      refresh();
1286 1286
    }
1287 1287

	
1288 1288
  protected:
1289 1289

	
1290 1290
    virtual void add(const Arc& arc) {
1291 1291
      insert(arc);
1292 1292
    }
1293 1293

	
1294 1294
    virtual void add(const std::vector<Arc>& arcs) {
1295 1295
      for (int i = 0; i < int(arcs.size()); ++i) {
1296 1296
        insert(arcs[i]);
1297 1297
      }
1298 1298
    }
1299 1299

	
1300 1300
    virtual void erase(const Arc& arc) {
1301 1301
      remove(arc);
1302 1302
    }
1303 1303

	
1304 1304
    virtual void erase(const std::vector<Arc>& arcs) {
1305 1305
      for (int i = 0; i < int(arcs.size()); ++i) {
1306 1306
        remove(arcs[i]);
1307 1307
      }
1308 1308
    }
1309 1309

	
1310 1310
    virtual void build() {
1311 1311
      refresh();
1312 1312
    }
1313 1313

	
1314 1314
    virtual void clear() {
1315 1315
      for(NodeIt n(_g);n!=INVALID;++n) {
1316 1316
        _head.set(n, INVALID);
1317 1317
      }
1318 1318
    }
1319 1319

	
1320 1320
    void insert(Arc arc) {
1321 1321
      Node s = _g.source(arc);
1322 1322
      Node t = _g.target(arc);
1323 1323
      _left.set(arc, INVALID);
1324 1324
      _right.set(arc, INVALID);
1325 1325

	
1326 1326
      Arc e = _head[s];
1327 1327
      if (e == INVALID) {
1328 1328
        _head.set(s, arc);
1329 1329
        _parent.set(arc, INVALID);
1330 1330
        return;
1331 1331
      }
1332 1332
      while (true) {
1333 1333
        if (t < _g.target(e)) {
1334 1334
          if (_left[e] == INVALID) {
1335 1335
            _left.set(e, arc);
1336 1336
            _parent.set(arc, e);
1337 1337
            splay(arc);
1338 1338
            return;
1339 1339
          } else {
1340 1340
            e = _left[e];
1341 1341
          }
1342 1342
        } else {
1343 1343
          if (_right[e] == INVALID) {
1344 1344
            _right.set(e, arc);
1345 1345
            _parent.set(arc, e);
1346 1346
            splay(arc);
1347 1347
            return;
1348 1348
          } else {
1349 1349
            e = _right[e];
1350 1350
          }
1351 1351
        }
1352 1352
      }
1353 1353
    }
1354 1354

	
1355 1355
    void remove(Arc arc) {
1356 1356
      if (_left[arc] == INVALID) {
1357 1357
        if (_right[arc] != INVALID) {
1358 1358
          _parent.set(_right[arc], _parent[arc]);
1359 1359
        }
1360 1360
        if (_parent[arc] != INVALID) {
1361 1361
          if (_left[_parent[arc]] == arc) {
1362 1362
            _left.set(_parent[arc], _right[arc]);
1363 1363
          } else {
1364 1364
            _right.set(_parent[arc], _right[arc]);
1365 1365
          }
1366 1366
        } else {
1367 1367
          _head.set(_g.source(arc), _right[arc]);
1368 1368
        }
1369 1369
      } else if (_right[arc] == INVALID) {
1370 1370
        _parent.set(_left[arc], _parent[arc]);
1371 1371
        if (_parent[arc] != INVALID) {
1372 1372
          if (_left[_parent[arc]] == arc) {
1373 1373
            _left.set(_parent[arc], _left[arc]);
1374 1374
          } else {
1375 1375
            _right.set(_parent[arc], _left[arc]);
1376 1376
          }
1377 1377
        } else {
1378 1378
          _head.set(_g.source(arc), _left[arc]);
1379 1379
        }
1380 1380
      } else {
1381 1381
        Arc e = _left[arc];
1382 1382
        if (_right[e] != INVALID) {
1383 1383
          e = _right[e];
1384 1384
          while (_right[e] != INVALID) {
1385 1385
            e = _right[e];
1386 1386
          }
1387 1387
          Arc s = _parent[e];
1388 1388
          _right.set(_parent[e], _left[e]);
1389 1389
          if (_left[e] != INVALID) {
1390 1390
            _parent.set(_left[e], _parent[e]);
1391 1391
          }
1392 1392

	
1393 1393
          _left.set(e, _left[arc]);
1394 1394
          _parent.set(_left[arc], e);
1395 1395
          _right.set(e, _right[arc]);
1396 1396
          _parent.set(_right[arc], e);
1397 1397

	
1398 1398
          _parent.set(e, _parent[arc]);
1399 1399
          if (_parent[arc] != INVALID) {
1400 1400
            if (_left[_parent[arc]] == arc) {
1401 1401
              _left.set(_parent[arc], e);
1402 1402
            } else {
1403 1403
              _right.set(_parent[arc], e);
1404 1404
            }
1405 1405
          }
1406 1406
          splay(s);
1407 1407
        } else {
1408 1408
          _right.set(e, _right[arc]);
1409 1409
          _parent.set(_right[arc], e);
1410 1410
          _parent.set(e, _parent[arc]);
1411 1411

	
1412 1412
          if (_parent[arc] != INVALID) {
1413 1413
            if (_left[_parent[arc]] == arc) {
1414 1414
              _left.set(_parent[arc], e);
1415 1415
            } else {
1416 1416
              _right.set(_parent[arc], e);
1417 1417
            }
1418 1418
          } else {
1419 1419
            _head.set(_g.source(arc), e);
1420 1420
          }
1421 1421
        }
1422 1422
      }
1423 1423
    }
1424 1424

	
1425 1425
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1426 1426
    {
1427 1427
      int m=(a+b)/2;
1428 1428
      Arc me=v[m];
1429 1429
      if (a < m) {
1430 1430
        Arc left = refreshRec(v,a,m-1);
1431 1431
        _left.set(me, left);
1432 1432
        _parent.set(left, me);
1433 1433
      } else {
1434 1434
        _left.set(me, INVALID);
1435 1435
      }
1436 1436
      if (m < b) {
1437 1437
        Arc right = refreshRec(v,m+1,b);
1438 1438
        _right.set(me, right);
1439 1439
        _parent.set(right, me);
1440 1440
      } else {
1441 1441
        _right.set(me, INVALID);
1442 1442
      }
1443 1443
      return me;
1444 1444
    }
1445 1445

	
1446 1446
    void refresh() {
1447 1447
      for(NodeIt n(_g);n!=INVALID;++n) {
1448 1448
        std::vector<Arc> v;
1449 1449
        for(OutArcIt a(_g,n);a!=INVALID;++a) v.push_back(a);
1450 1450
        if (!v.empty()) {
1451 1451
          std::sort(v.begin(),v.end(),ArcLess(_g));
1452 1452
          Arc head = refreshRec(v,0,v.size()-1);
1453 1453
          _head.set(n, head);
1454 1454
          _parent.set(head, INVALID);
1455 1455
        }
1456 1456
        else _head.set(n, INVALID);
1457 1457
      }
1458 1458
    }
1459 1459

	
1460 1460
    void zig(Arc v) {
1461 1461
      Arc w = _parent[v];
1462 1462
      _parent.set(v, _parent[w]);
1463 1463
      _parent.set(w, v);
1464 1464
      _left.set(w, _right[v]);
1465 1465
      _right.set(v, w);
1466 1466
      if (_parent[v] != INVALID) {
1467 1467
        if (_right[_parent[v]] == w) {
1468 1468
          _right.set(_parent[v], v);
1469 1469
        } else {
1470 1470
          _left.set(_parent[v], v);
1471 1471
        }
1472 1472
      }
1473 1473
      if (_left[w] != INVALID){
1474 1474
        _parent.set(_left[w], w);
1475 1475
      }
1476 1476
    }
1477 1477

	
1478 1478
    void zag(Arc v) {
1479 1479
      Arc w = _parent[v];
1480 1480
      _parent.set(v, _parent[w]);
1481 1481
      _parent.set(w, v);
1482 1482
      _right.set(w, _left[v]);
1483 1483
      _left.set(v, w);
1484 1484
      if (_parent[v] != INVALID){
1485 1485
        if (_left[_parent[v]] == w) {
1486 1486
          _left.set(_parent[v], v);
1487 1487
        } else {
1488 1488
          _right.set(_parent[v], v);
1489 1489
        }
1490 1490
      }
1491 1491
      if (_right[w] != INVALID){
1492 1492
        _parent.set(_right[w], w);
1493 1493
      }
1494 1494
    }
1495 1495

	
1496 1496
    void splay(Arc v) {
1497 1497
      while (_parent[v] != INVALID) {
1498 1498
        if (v == _left[_parent[v]]) {
1499 1499
          if (_parent[_parent[v]] == INVALID) {
1500 1500
            zig(v);
1501 1501
          } else {
1502 1502
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1503 1503
              zig(_parent[v]);
1504 1504
              zig(v);
1505 1505
            } else {
1506 1506
              zig(v);
1507 1507
              zag(v);
1508 1508
            }
1509 1509
          }
1510 1510
        } else {
1511 1511
          if (_parent[_parent[v]] == INVALID) {
1512 1512
            zag(v);
1513 1513
          } else {
1514 1514
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1515 1515
              zag(v);
1516 1516
              zig(v);
1517 1517
            } else {
1518 1518
              zag(_parent[v]);
1519 1519
              zag(v);
1520 1520
            }
1521 1521
          }
1522 1522
        }
1523 1523
      }
1524 1524
      _head[_g.source(v)] = v;
1525 1525
    }
1526 1526

	
1527 1527

	
1528 1528
  public:
1529 1529

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

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

	
1608 1608
  };
1609 1609

	
1610 1610
  ///Fast arc look-up between given endpoints.
1611 1611

	
1612 1612
  ///Using this class, you can find an arc in a digraph from a given
1613 1613
  ///source to a given target in time <em>O</em>(log<em>d</em>),
1614 1614
  ///where <em>d</em> is the out-degree of the source node.
1615 1615
  ///
1616 1616
  ///It is not possible to find \e all parallel arcs between two nodes.
1617 1617
  ///Use \ref AllArcLookUp for this purpose.
1618 1618
  ///
1619 1619
  ///\warning This class is static, so you should call refresh() (or at
1620 1620
  ///least refresh(Node)) to refresh this data structure whenever the
1621 1621
  ///digraph changes. This is a time consuming (superlinearly proportional
1622 1622
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
1623 1623
  ///
1624 1624
  ///\tparam G The type of the underlying digraph.
1625 1625
  ///
1626 1626
  ///\sa DynArcLookUp
1627 1627
  ///\sa AllArcLookUp
1628 1628
  template<class G>
1629 1629
  class ArcLookUp
1630 1630
  {
1631 1631
  public:
1632 1632
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
1633 1633
    typedef G Digraph;
1634 1634

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

	
1641 1641
    class ArcLess {
1642 1642
      const Digraph &g;
1643 1643
    public:
1644 1644
      ArcLess(const Digraph &_g) : g(_g) {}
1645 1645
      bool operator()(Arc a,Arc b) const
1646 1646
      {
1647 1647
        return g.target(a)<g.target(b);
1648 1648
      }
1649 1649
    };
1650 1650

	
1651 1651
  public:
1652 1652

	
1653 1653
    ///Constructor
1654 1654

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

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

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

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

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

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

	
1721 1721
  };
1722 1722

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

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

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

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

	
1751 1751
    Arc refreshNext(Arc head,Arc next=INVALID)
1752 1752
    {
1753 1753
      if(head==INVALID) return next;
1754 1754
      else {
1755 1755
        next=refreshNext(_right[head],next);
1756 1756
        _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
1757 1757
          ? next : INVALID;
1758 1758
        return refreshNext(_left[head],head);
1759 1759
      }
1760 1760
    }
1761 1761

	
1762 1762
    void refreshNext()
1763 1763
    {
1764 1764
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
1765 1765
    }
1766 1766

	
1767 1767
  public:
1768 1768
    ///Constructor
1769 1769

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

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

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

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

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

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

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

	
1838 1838
  };
1839 1839

	
1840 1840
  /// @}
1841 1841

	
1842 1842
} //namespace lemon
1843 1843

	
1844 1844
#endif

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)