0
2
0
... | ... |
@@ -33,5 +33,5 @@ |
33 | 33 |
|
34 | 34 |
StaticDigraphBase() |
35 |
: node_num( |
|
35 |
: built(false), node_num(0), arc_num(0), |
|
36 | 36 |
node_first_out(NULL), node_first_in(NULL), |
37 | 37 |
arc_source(NULL), arc_target(NULL), |
... | ... |
@@ -39,5 +39,5 @@ |
39 | 39 |
|
40 | 40 |
~StaticDigraphBase() { |
41 |
if ( |
|
41 |
if (built) { |
|
42 | 42 |
delete[] node_first_out; |
43 | 43 |
delete[] node_first_in; |
... | ... |
@@ -129,8 +129,6 @@ |
129 | 129 |
typedef True BuildTag; |
130 | 130 |
|
131 |
template <typename Digraph, typename NodeRefMap, typename ArcRefMap> |
|
132 |
void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) { |
|
133 |
|
|
134 |
if (node_num != -1) { |
|
131 |
void clear() { |
|
132 |
if (built) { |
|
135 | 133 |
delete[] node_first_out; |
136 | 134 |
delete[] node_first_in; |
... | ... |
@@ -140,8 +138,16 @@ |
140 | 138 |
delete[] arc_next_in; |
141 | 139 |
} |
140 |
built = false; |
|
141 |
node_num = 0; |
|
142 |
arc_num = 0; |
|
143 |
} |
|
142 | 144 |
|
145 |
template <typename Digraph, typename NodeRefMap, typename ArcRefMap> |
|
146 |
void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) { |
|
143 | 147 |
typedef typename Digraph::Node GNode; |
144 | 148 |
typedef typename Digraph::Arc GArc; |
145 | 149 |
|
150 |
built = true; |
|
151 |
|
|
146 | 152 |
node_num = countNodes(digraph); |
147 | 153 |
arc_num = countArcs(digraph); |
... | ... |
@@ -206,5 +212,6 @@ |
206 | 212 |
} |
207 | 213 |
|
208 |
|
|
214 |
protected: |
|
215 |
bool built; |
|
209 | 216 |
int node_num; |
210 | 217 |
int arc_num; |
... | ... |
@@ -225,4 +232,13 @@ |
225 | 232 |
typedef ExtendedStaticDigraphBase Parent; |
226 | 233 |
|
234 |
public: |
|
235 |
|
|
236 |
template <typename Digraph, typename NodeRefMap, typename ArcRefMap> |
|
237 |
void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) { |
|
238 |
if (built) Parent::clear(); |
|
239 |
Parent::build(digraph, nodeRef, arcRef); |
|
240 |
} |
|
241 |
|
|
242 |
|
|
227 | 243 |
protected: |
228 | 244 |
|
... | ... |
@@ -262,4 +278,20 @@ |
262 | 278 |
}; |
263 | 279 |
|
280 |
Node baseNode(const OutArcIt &arc) const { |
|
281 |
return Parent::source(static_cast<const Arc&>(arc)); |
|
282 |
} |
|
283 |
|
|
284 |
Node runningNode(const OutArcIt &arc) const { |
|
285 |
return Parent::target(static_cast<const Arc&>(arc)); |
|
286 |
} |
|
287 |
|
|
288 |
Node baseNode(const InArcIt &arc) const { |
|
289 |
return Parent::target(static_cast<const Arc&>(arc)); |
|
290 |
} |
|
291 |
|
|
292 |
Node runningNode(const InArcIt &arc) const { |
|
293 |
return Parent::source(static_cast<const Arc&>(arc)); |
|
294 |
} |
|
295 |
|
|
264 | 296 |
}; |
265 | 297 |
... | ... |
@@ -20,4 +20,5 @@ |
20 | 20 |
#include <lemon/list_graph.h> |
21 | 21 |
#include <lemon/smart_graph.h> |
22 |
#include <lemon/static_graph.h> |
|
22 | 23 |
#include <lemon/full_graph.h> |
23 | 24 |
|
... | ... |
@@ -318,4 +319,8 @@ |
318 | 319 |
checkConcept<ClearableDigraphComponent<>, SmartDigraph>(); |
319 | 320 |
} |
321 |
{ // Checking StaticDigraph |
|
322 |
checkConcept<Digraph, StaticDigraph>(); |
|
323 |
checkConcept<ClearableDigraphComponent<>, StaticDigraph>(); |
|
324 |
} |
|
320 | 325 |
{ // Checking FullDigraph |
321 | 326 |
checkConcept<Digraph, FullDigraph>(); |
... | ... |
@@ -373,4 +378,74 @@ |
373 | 378 |
} |
374 | 379 |
|
380 |
void checkStaticDigraph() { |
|
381 |
SmartDigraph g; |
|
382 |
SmartDigraph::NodeMap<StaticDigraph::Node> nref(g); |
|
383 |
SmartDigraph::ArcMap<StaticDigraph::Arc> aref(g); |
|
384 |
|
|
385 |
StaticDigraph G; |
|
386 |
|
|
387 |
checkGraphNodeList(G, 0); |
|
388 |
checkGraphArcList(G, 0); |
|
389 |
|
|
390 |
G.build(g, nref, aref); |
|
391 |
|
|
392 |
checkGraphNodeList(G, 0); |
|
393 |
checkGraphArcList(G, 0); |
|
394 |
|
|
395 |
SmartDigraph::Node |
|
396 |
n1 = g.addNode(), |
|
397 |
n2 = g.addNode(), |
|
398 |
n3 = g.addNode(); |
|
399 |
|
|
400 |
G.build(g, nref, aref); |
|
401 |
|
|
402 |
checkGraphNodeList(G, 3); |
|
403 |
checkGraphArcList(G, 0); |
|
404 |
|
|
405 |
SmartDigraph::Arc a1 = g.addArc(n1, n2); |
|
406 |
|
|
407 |
G.build(g, nref, aref); |
|
408 |
|
|
409 |
check(G.source(aref[a1]) == nref[n1] && G.target(aref[a1]) == nref[n2], |
|
410 |
"Wrong arc or wrong references"); |
|
411 |
checkGraphNodeList(G, 3); |
|
412 |
checkGraphArcList(G, 1); |
|
413 |
|
|
414 |
checkGraphOutArcList(G, nref[n1], 1); |
|
415 |
checkGraphOutArcList(G, nref[n2], 0); |
|
416 |
checkGraphOutArcList(G, nref[n3], 0); |
|
417 |
|
|
418 |
checkGraphInArcList(G, nref[n1], 0); |
|
419 |
checkGraphInArcList(G, nref[n2], 1); |
|
420 |
checkGraphInArcList(G, nref[n3], 0); |
|
421 |
|
|
422 |
checkGraphConArcList(G, 1); |
|
423 |
|
|
424 |
SmartDigraph::Arc |
|
425 |
a2 = g.addArc(n2, n1), |
|
426 |
a3 = g.addArc(n2, n3), |
|
427 |
a4 = g.addArc(n2, n3); |
|
428 |
|
|
429 |
digraphCopy(g, G).nodeRef(nref).run(); |
|
430 |
|
|
431 |
checkGraphNodeList(G, 3); |
|
432 |
checkGraphArcList(G, 4); |
|
433 |
|
|
434 |
checkGraphOutArcList(G, nref[n1], 1); |
|
435 |
checkGraphOutArcList(G, nref[n2], 3); |
|
436 |
checkGraphOutArcList(G, nref[n3], 0); |
|
437 |
|
|
438 |
checkGraphInArcList(G, nref[n1], 1); |
|
439 |
checkGraphInArcList(G, nref[n2], 1); |
|
440 |
checkGraphInArcList(G, nref[n3], 2); |
|
441 |
|
|
442 |
checkGraphConArcList(G, 4); |
|
443 |
|
|
444 |
checkNodeIds(G); |
|
445 |
checkArcIds(G); |
|
446 |
checkGraphNodeMap(G); |
|
447 |
checkGraphArcMap(G); |
|
448 |
} |
|
449 |
|
|
375 | 450 |
void checkFullDigraph(int num) { |
376 | 451 |
typedef FullDigraph Digraph; |
... | ... |
@@ -420,4 +495,7 @@ |
420 | 495 |
checkDigraphValidity<SmartDigraph>(); |
421 | 496 |
} |
497 |
{ // Checking StaticDigraph |
|
498 |
checkStaticDigraph(); |
|
499 |
} |
|
422 | 500 |
{ // Checking FullDigraph |
423 | 501 |
checkFullDigraph(8); |
0 comments (0 inline)