0
2
0
... | ... |
@@ -34,3 +34,3 @@ |
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), |
... | ... |
@@ -40,3 +40,3 @@ |
40 | 40 |
~StaticDigraphBase() { |
41 |
if ( |
|
41 |
if (built) { |
|
42 | 42 |
delete[] node_first_out; |
... | ... |
@@ -130,6 +130,4 @@ |
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; |
... | ... |
@@ -141,3 +139,9 @@ |
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; |
... | ... |
@@ -145,2 +149,4 @@ |
145 | 149 |
|
150 |
built = true; |
|
151 |
|
|
146 | 152 |
node_num = countNodes(digraph); |
... | ... |
@@ -207,3 +213,4 @@ |
207 | 213 |
|
208 |
|
|
214 |
protected: |
|
215 |
bool built; |
|
209 | 216 |
int node_num; |
... | ... |
@@ -226,2 +233,11 @@ |
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: |
... | ... |
@@ -263,2 +279,18 @@ |
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 |
}; |
... | ... |
@@ -21,2 +21,3 @@ |
21 | 21 |
#include <lemon/smart_graph.h> |
22 |
#include <lemon/static_graph.h> |
|
22 | 23 |
#include <lemon/full_graph.h> |
... | ... |
@@ -319,2 +320,6 @@ |
319 | 320 |
} |
321 |
{ // Checking StaticDigraph |
|
322 |
checkConcept<Digraph, StaticDigraph>(); |
|
323 |
checkConcept<ClearableDigraphComponent<>, StaticDigraph>(); |
|
324 |
} |
|
320 | 325 |
{ // Checking FullDigraph |
... | ... |
@@ -374,2 +379,72 @@ |
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) { |
... | ... |
@@ -421,2 +496,5 @@ |
421 | 496 |
} |
497 |
{ // Checking StaticDigraph |
|
498 |
checkStaticDigraph(); |
|
499 |
} |
|
422 | 500 |
{ // Checking FullDigraph |
0 comments (0 inline)