0
3
0
| ... | ... |
@@ -690,128 +690,131 @@ |
| 690 | 690 |
clear(); |
| 691 | 691 |
node_observer_proxy.detach(); |
| 692 | 692 |
throw ArcNotifier::ImmediateDetach(); |
| 693 | 693 |
} else {
|
| 694 | 694 |
added_arcs.erase(it); |
| 695 | 695 |
} |
| 696 | 696 |
} |
| 697 | 697 |
|
| 698 | 698 |
void attach(ListDigraph &_digraph) {
|
| 699 | 699 |
digraph = &_digraph; |
| 700 | 700 |
node_observer_proxy.attach(digraph->notifier(Node())); |
| 701 | 701 |
arc_observer_proxy.attach(digraph->notifier(Arc())); |
| 702 | 702 |
} |
| 703 | 703 |
|
| 704 | 704 |
void detach() {
|
| 705 | 705 |
node_observer_proxy.detach(); |
| 706 | 706 |
arc_observer_proxy.detach(); |
| 707 | 707 |
} |
| 708 | 708 |
|
| 709 | 709 |
bool attached() const {
|
| 710 | 710 |
return node_observer_proxy.attached(); |
| 711 | 711 |
} |
| 712 | 712 |
|
| 713 | 713 |
void clear() {
|
| 714 | 714 |
added_nodes.clear(); |
| 715 | 715 |
added_arcs.clear(); |
| 716 | 716 |
} |
| 717 | 717 |
|
| 718 | 718 |
public: |
| 719 | 719 |
|
| 720 | 720 |
/// \brief Default constructor. |
| 721 | 721 |
/// |
| 722 | 722 |
/// Default constructor. |
| 723 | 723 |
/// You have to call save() to actually make a snapshot. |
| 724 | 724 |
Snapshot() |
| 725 | 725 |
: digraph(0), node_observer_proxy(*this), |
| 726 | 726 |
arc_observer_proxy(*this) {}
|
| 727 | 727 |
|
| 728 | 728 |
/// \brief Constructor that immediately makes a snapshot. |
| 729 | 729 |
/// |
| 730 | 730 |
/// This constructor immediately makes a snapshot of the given digraph. |
| 731 | 731 |
Snapshot(ListDigraph &gr) |
| 732 | 732 |
: node_observer_proxy(*this), |
| 733 | 733 |
arc_observer_proxy(*this) {
|
| 734 | 734 |
attach(gr); |
| 735 | 735 |
} |
| 736 | 736 |
|
| 737 | 737 |
/// \brief Make a snapshot. |
| 738 | 738 |
/// |
| 739 | 739 |
/// This function makes a snapshot of the given digraph. |
| 740 | 740 |
/// It can be called more than once. In case of a repeated |
| 741 | 741 |
/// call, the previous snapshot gets lost. |
| 742 | 742 |
void save(ListDigraph &gr) {
|
| 743 | 743 |
if (attached()) {
|
| 744 | 744 |
detach(); |
| 745 | 745 |
clear(); |
| 746 | 746 |
} |
| 747 | 747 |
attach(gr); |
| 748 | 748 |
} |
| 749 | 749 |
|
| 750 | 750 |
/// \brief Undo the changes until the last snapshot. |
| 751 | 751 |
/// |
| 752 | 752 |
/// This function undos the changes until the last snapshot |
| 753 | 753 |
/// created by save() or Snapshot(ListDigraph&). |
| 754 |
/// |
|
| 755 |
/// \warning This method invalidates the snapshot, i.e. repeated |
|
| 756 |
/// restoring is not supported unless you call save() again. |
|
| 754 | 757 |
void restore() {
|
| 755 | 758 |
detach(); |
| 756 | 759 |
for(std::list<Arc>::iterator it = added_arcs.begin(); |
| 757 | 760 |
it != added_arcs.end(); ++it) {
|
| 758 | 761 |
digraph->erase(*it); |
| 759 | 762 |
} |
| 760 | 763 |
for(std::list<Node>::iterator it = added_nodes.begin(); |
| 761 | 764 |
it != added_nodes.end(); ++it) {
|
| 762 | 765 |
digraph->erase(*it); |
| 763 | 766 |
} |
| 764 | 767 |
clear(); |
| 765 | 768 |
} |
| 766 | 769 |
|
| 767 | 770 |
/// \brief Returns \c true if the snapshot is valid. |
| 768 | 771 |
/// |
| 769 | 772 |
/// This function returns \c true if the snapshot is valid. |
| 770 | 773 |
bool valid() const {
|
| 771 | 774 |
return attached(); |
| 772 | 775 |
} |
| 773 | 776 |
}; |
| 774 | 777 |
|
| 775 | 778 |
}; |
| 776 | 779 |
|
| 777 | 780 |
///@} |
| 778 | 781 |
|
| 779 | 782 |
class ListGraphBase {
|
| 780 | 783 |
|
| 781 | 784 |
protected: |
| 782 | 785 |
|
| 783 | 786 |
struct NodeT {
|
| 784 | 787 |
int first_out; |
| 785 | 788 |
int prev, next; |
| 786 | 789 |
}; |
| 787 | 790 |
|
| 788 | 791 |
struct ArcT {
|
| 789 | 792 |
int target; |
| 790 | 793 |
int prev_out, next_out; |
| 791 | 794 |
}; |
| 792 | 795 |
|
| 793 | 796 |
std::vector<NodeT> nodes; |
| 794 | 797 |
|
| 795 | 798 |
int first_node; |
| 796 | 799 |
|
| 797 | 800 |
int first_free_node; |
| 798 | 801 |
|
| 799 | 802 |
std::vector<ArcT> arcs; |
| 800 | 803 |
|
| 801 | 804 |
int first_free_arc; |
| 802 | 805 |
|
| 803 | 806 |
public: |
| 804 | 807 |
|
| 805 | 808 |
typedef ListGraphBase Graph; |
| 806 | 809 |
|
| 807 | 810 |
class Node {
|
| 808 | 811 |
friend class ListGraphBase; |
| 809 | 812 |
protected: |
| 810 | 813 |
|
| 811 | 814 |
int id; |
| 812 | 815 |
explicit Node(int pid) { id = pid;}
|
| 813 | 816 |
|
| 814 | 817 |
public: |
| 815 | 818 |
Node() {}
|
| 816 | 819 |
Node (Invalid) { id = -1; }
|
| 817 | 820 |
bool operator==(const Node& node) const {return id == node.id;}
|
| ... | ... |
@@ -1489,91 +1492,94 @@ |
| 1489 | 1492 |
clear(); |
| 1490 | 1493 |
node_observer_proxy.detach(); |
| 1491 | 1494 |
throw EdgeNotifier::ImmediateDetach(); |
| 1492 | 1495 |
} else {
|
| 1493 | 1496 |
added_edges.erase(it); |
| 1494 | 1497 |
} |
| 1495 | 1498 |
} |
| 1496 | 1499 |
|
| 1497 | 1500 |
void attach(ListGraph &_graph) {
|
| 1498 | 1501 |
graph = &_graph; |
| 1499 | 1502 |
node_observer_proxy.attach(graph->notifier(Node())); |
| 1500 | 1503 |
edge_observer_proxy.attach(graph->notifier(Edge())); |
| 1501 | 1504 |
} |
| 1502 | 1505 |
|
| 1503 | 1506 |
void detach() {
|
| 1504 | 1507 |
node_observer_proxy.detach(); |
| 1505 | 1508 |
edge_observer_proxy.detach(); |
| 1506 | 1509 |
} |
| 1507 | 1510 |
|
| 1508 | 1511 |
bool attached() const {
|
| 1509 | 1512 |
return node_observer_proxy.attached(); |
| 1510 | 1513 |
} |
| 1511 | 1514 |
|
| 1512 | 1515 |
void clear() {
|
| 1513 | 1516 |
added_nodes.clear(); |
| 1514 | 1517 |
added_edges.clear(); |
| 1515 | 1518 |
} |
| 1516 | 1519 |
|
| 1517 | 1520 |
public: |
| 1518 | 1521 |
|
| 1519 | 1522 |
/// \brief Default constructor. |
| 1520 | 1523 |
/// |
| 1521 | 1524 |
/// Default constructor. |
| 1522 | 1525 |
/// You have to call save() to actually make a snapshot. |
| 1523 | 1526 |
Snapshot() |
| 1524 | 1527 |
: graph(0), node_observer_proxy(*this), |
| 1525 | 1528 |
edge_observer_proxy(*this) {}
|
| 1526 | 1529 |
|
| 1527 | 1530 |
/// \brief Constructor that immediately makes a snapshot. |
| 1528 | 1531 |
/// |
| 1529 | 1532 |
/// This constructor immediately makes a snapshot of the given graph. |
| 1530 | 1533 |
Snapshot(ListGraph &gr) |
| 1531 | 1534 |
: node_observer_proxy(*this), |
| 1532 | 1535 |
edge_observer_proxy(*this) {
|
| 1533 | 1536 |
attach(gr); |
| 1534 | 1537 |
} |
| 1535 | 1538 |
|
| 1536 | 1539 |
/// \brief Make a snapshot. |
| 1537 | 1540 |
/// |
| 1538 | 1541 |
/// This function makes a snapshot of the given graph. |
| 1539 | 1542 |
/// It can be called more than once. In case of a repeated |
| 1540 | 1543 |
/// call, the previous snapshot gets lost. |
| 1541 | 1544 |
void save(ListGraph &gr) {
|
| 1542 | 1545 |
if (attached()) {
|
| 1543 | 1546 |
detach(); |
| 1544 | 1547 |
clear(); |
| 1545 | 1548 |
} |
| 1546 | 1549 |
attach(gr); |
| 1547 | 1550 |
} |
| 1548 | 1551 |
|
| 1549 | 1552 |
/// \brief Undo the changes until the last snapshot. |
| 1550 | 1553 |
/// |
| 1551 | 1554 |
/// This function undos the changes until the last snapshot |
| 1552 | 1555 |
/// created by save() or Snapshot(ListGraph&). |
| 1556 |
/// |
|
| 1557 |
/// \warning This method invalidates the snapshot, i.e. repeated |
|
| 1558 |
/// restoring is not supported unless you call save() again. |
|
| 1553 | 1559 |
void restore() {
|
| 1554 | 1560 |
detach(); |
| 1555 | 1561 |
for(std::list<Edge>::iterator it = added_edges.begin(); |
| 1556 | 1562 |
it != added_edges.end(); ++it) {
|
| 1557 | 1563 |
graph->erase(*it); |
| 1558 | 1564 |
} |
| 1559 | 1565 |
for(std::list<Node>::iterator it = added_nodes.begin(); |
| 1560 | 1566 |
it != added_nodes.end(); ++it) {
|
| 1561 | 1567 |
graph->erase(*it); |
| 1562 | 1568 |
} |
| 1563 | 1569 |
clear(); |
| 1564 | 1570 |
} |
| 1565 | 1571 |
|
| 1566 | 1572 |
/// \brief Returns \c true if the snapshot is valid. |
| 1567 | 1573 |
/// |
| 1568 | 1574 |
/// This function returns \c true if the snapshot is valid. |
| 1569 | 1575 |
bool valid() const {
|
| 1570 | 1576 |
return attached(); |
| 1571 | 1577 |
} |
| 1572 | 1578 |
}; |
| 1573 | 1579 |
}; |
| 1574 | 1580 |
|
| 1575 | 1581 |
/// @} |
| 1576 | 1582 |
} //namespace lemon |
| 1577 | 1583 |
|
| 1578 | 1584 |
|
| 1579 | 1585 |
#endif |
| ... | ... |
@@ -225,128 +225,136 @@ |
| 225 | 225 |
// Check node deletion |
| 226 | 226 |
G.erase(n4); |
| 227 | 227 |
|
| 228 | 228 |
checkGraphNodeList(G, 3); |
| 229 | 229 |
checkGraphArcList(G, 1); |
| 230 | 230 |
|
| 231 | 231 |
checkGraphOutArcList(G, n1, 0); |
| 232 | 232 |
checkGraphOutArcList(G, n2, 0); |
| 233 | 233 |
checkGraphOutArcList(G, n3, 1); |
| 234 | 234 |
checkGraphOutArcList(G, n4, 0); |
| 235 | 235 |
|
| 236 | 236 |
checkGraphInArcList(G, n1, 1); |
| 237 | 237 |
checkGraphInArcList(G, n2, 0); |
| 238 | 238 |
checkGraphInArcList(G, n3, 0); |
| 239 | 239 |
checkGraphInArcList(G, n4, 0); |
| 240 | 240 |
|
| 241 | 241 |
checkGraphConArcList(G, 1); |
| 242 | 242 |
} |
| 243 | 243 |
|
| 244 | 244 |
|
| 245 | 245 |
template <class Digraph> |
| 246 | 246 |
void checkDigraphSnapshot() {
|
| 247 | 247 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 248 | 248 |
|
| 249 | 249 |
Digraph G; |
| 250 | 250 |
Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(); |
| 251 | 251 |
Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1), |
| 252 | 252 |
a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3); |
| 253 | 253 |
|
| 254 | 254 |
typename Digraph::Snapshot snapshot(G); |
| 255 | 255 |
|
| 256 | 256 |
Node n = G.addNode(); |
| 257 | 257 |
G.addArc(n3, n); |
| 258 | 258 |
G.addArc(n, n3); |
| 259 | 259 |
|
| 260 | 260 |
checkGraphNodeList(G, 4); |
| 261 | 261 |
checkGraphArcList(G, 6); |
| 262 | 262 |
|
| 263 | 263 |
snapshot.restore(); |
| 264 | 264 |
|
| 265 | 265 |
checkGraphNodeList(G, 3); |
| 266 | 266 |
checkGraphArcList(G, 4); |
| 267 | 267 |
|
| 268 | 268 |
checkGraphOutArcList(G, n1, 1); |
| 269 | 269 |
checkGraphOutArcList(G, n2, 3); |
| 270 | 270 |
checkGraphOutArcList(G, n3, 0); |
| 271 | 271 |
|
| 272 | 272 |
checkGraphInArcList(G, n1, 1); |
| 273 | 273 |
checkGraphInArcList(G, n2, 1); |
| 274 | 274 |
checkGraphInArcList(G, n3, 2); |
| 275 | 275 |
|
| 276 | 276 |
checkGraphConArcList(G, 4); |
| 277 | 277 |
|
| 278 | 278 |
checkNodeIds(G); |
| 279 | 279 |
checkArcIds(G); |
| 280 | 280 |
checkGraphNodeMap(G); |
| 281 | 281 |
checkGraphArcMap(G); |
| 282 | 282 |
|
| 283 | 283 |
G.addNode(); |
| 284 | 284 |
snapshot.save(G); |
| 285 | 285 |
|
| 286 | 286 |
G.addArc(G.addNode(), G.addNode()); |
| 287 | 287 |
|
| 288 | 288 |
snapshot.restore(); |
| 289 |
snapshot.save(G); |
|
| 290 |
|
|
| 291 |
checkGraphNodeList(G, 4); |
|
| 292 |
checkGraphArcList(G, 4); |
|
| 293 |
|
|
| 294 |
G.addArc(G.addNode(), G.addNode()); |
|
| 295 |
|
|
| 296 |
snapshot.restore(); |
|
| 289 | 297 |
|
| 290 | 298 |
checkGraphNodeList(G, 4); |
| 291 | 299 |
checkGraphArcList(G, 4); |
| 292 | 300 |
} |
| 293 | 301 |
|
| 294 | 302 |
void checkConcepts() {
|
| 295 | 303 |
{ // Checking digraph components
|
| 296 | 304 |
checkConcept<BaseDigraphComponent, BaseDigraphComponent >(); |
| 297 | 305 |
|
| 298 | 306 |
checkConcept<IDableDigraphComponent<>, |
| 299 | 307 |
IDableDigraphComponent<> >(); |
| 300 | 308 |
|
| 301 | 309 |
checkConcept<IterableDigraphComponent<>, |
| 302 | 310 |
IterableDigraphComponent<> >(); |
| 303 | 311 |
|
| 304 | 312 |
checkConcept<MappableDigraphComponent<>, |
| 305 | 313 |
MappableDigraphComponent<> >(); |
| 306 | 314 |
} |
| 307 | 315 |
{ // Checking skeleton digraph
|
| 308 | 316 |
checkConcept<Digraph, Digraph>(); |
| 309 | 317 |
} |
| 310 | 318 |
{ // Checking ListDigraph
|
| 311 | 319 |
checkConcept<Digraph, ListDigraph>(); |
| 312 | 320 |
checkConcept<AlterableDigraphComponent<>, ListDigraph>(); |
| 313 | 321 |
checkConcept<ExtendableDigraphComponent<>, ListDigraph>(); |
| 314 | 322 |
checkConcept<ClearableDigraphComponent<>, ListDigraph>(); |
| 315 | 323 |
checkConcept<ErasableDigraphComponent<>, ListDigraph>(); |
| 316 | 324 |
} |
| 317 | 325 |
{ // Checking SmartDigraph
|
| 318 | 326 |
checkConcept<Digraph, SmartDigraph>(); |
| 319 | 327 |
checkConcept<AlterableDigraphComponent<>, SmartDigraph>(); |
| 320 | 328 |
checkConcept<ExtendableDigraphComponent<>, SmartDigraph>(); |
| 321 | 329 |
checkConcept<ClearableDigraphComponent<>, SmartDigraph>(); |
| 322 | 330 |
} |
| 323 | 331 |
{ // Checking FullDigraph
|
| 324 | 332 |
checkConcept<Digraph, FullDigraph>(); |
| 325 | 333 |
} |
| 326 | 334 |
} |
| 327 | 335 |
|
| 328 | 336 |
template <typename Digraph> |
| 329 | 337 |
void checkDigraphValidity() {
|
| 330 | 338 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 331 | 339 |
Digraph g; |
| 332 | 340 |
|
| 333 | 341 |
Node |
| 334 | 342 |
n1 = g.addNode(), |
| 335 | 343 |
n2 = g.addNode(), |
| 336 | 344 |
n3 = g.addNode(); |
| 337 | 345 |
|
| 338 | 346 |
Arc |
| 339 | 347 |
e1 = g.addArc(n1, n2), |
| 340 | 348 |
e2 = g.addArc(n2, n3); |
| 341 | 349 |
|
| 342 | 350 |
check(g.valid(n1), "Wrong validity check"); |
| 343 | 351 |
check(g.valid(e1), "Wrong validity check"); |
| 344 | 352 |
|
| 345 | 353 |
check(!g.valid(g.nodeFromId(-1)), "Wrong validity check"); |
| 346 | 354 |
check(!g.valid(g.arcFromId(-1)), "Wrong validity check"); |
| 347 | 355 |
} |
| 348 | 356 |
|
| 349 | 357 |
template <typename Digraph> |
| 350 | 358 |
void checkDigraphValidityErase() {
|
| 351 | 359 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 352 | 360 |
Digraph g; |
| ... | ... |
@@ -198,128 +198,137 @@ |
| 198 | 198 |
|
| 199 | 199 |
checkGraphNodeList(G, 3); |
| 200 | 200 |
checkGraphEdgeList(G, 2); |
| 201 | 201 |
checkGraphArcList(G, 4); |
| 202 | 202 |
|
| 203 | 203 |
checkGraphIncEdgeArcLists(G, n1, 2); |
| 204 | 204 |
checkGraphIncEdgeArcLists(G, n2, 1); |
| 205 | 205 |
checkGraphIncEdgeArcLists(G, n4, 1); |
| 206 | 206 |
|
| 207 | 207 |
checkGraphConEdgeList(G, 2); |
| 208 | 208 |
checkGraphConArcList(G, 4); |
| 209 | 209 |
} |
| 210 | 210 |
|
| 211 | 211 |
|
| 212 | 212 |
template <class Graph> |
| 213 | 213 |
void checkGraphSnapshot() {
|
| 214 | 214 |
TEMPLATE_GRAPH_TYPEDEFS(Graph); |
| 215 | 215 |
|
| 216 | 216 |
Graph G; |
| 217 | 217 |
Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode(); |
| 218 | 218 |
Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1), |
| 219 | 219 |
e3 = G.addEdge(n2, n3); |
| 220 | 220 |
|
| 221 | 221 |
checkGraphNodeList(G, 3); |
| 222 | 222 |
checkGraphEdgeList(G, 3); |
| 223 | 223 |
checkGraphArcList(G, 6); |
| 224 | 224 |
|
| 225 | 225 |
typename Graph::Snapshot snapshot(G); |
| 226 | 226 |
|
| 227 | 227 |
Node n = G.addNode(); |
| 228 | 228 |
G.addEdge(n3, n); |
| 229 | 229 |
G.addEdge(n, n3); |
| 230 | 230 |
G.addEdge(n3, n2); |
| 231 | 231 |
|
| 232 | 232 |
checkGraphNodeList(G, 4); |
| 233 | 233 |
checkGraphEdgeList(G, 6); |
| 234 | 234 |
checkGraphArcList(G, 12); |
| 235 | 235 |
|
| 236 | 236 |
snapshot.restore(); |
| 237 | 237 |
|
| 238 | 238 |
checkGraphNodeList(G, 3); |
| 239 | 239 |
checkGraphEdgeList(G, 3); |
| 240 | 240 |
checkGraphArcList(G, 6); |
| 241 | 241 |
|
| 242 | 242 |
checkGraphIncEdgeArcLists(G, n1, 2); |
| 243 | 243 |
checkGraphIncEdgeArcLists(G, n2, 3); |
| 244 | 244 |
checkGraphIncEdgeArcLists(G, n3, 1); |
| 245 | 245 |
|
| 246 | 246 |
checkGraphConEdgeList(G, 3); |
| 247 | 247 |
checkGraphConArcList(G, 6); |
| 248 | 248 |
|
| 249 | 249 |
checkNodeIds(G); |
| 250 | 250 |
checkEdgeIds(G); |
| 251 | 251 |
checkArcIds(G); |
| 252 | 252 |
checkGraphNodeMap(G); |
| 253 | 253 |
checkGraphEdgeMap(G); |
| 254 | 254 |
checkGraphArcMap(G); |
| 255 | 255 |
|
| 256 | 256 |
G.addNode(); |
| 257 | 257 |
snapshot.save(G); |
| 258 | 258 |
|
| 259 | 259 |
G.addEdge(G.addNode(), G.addNode()); |
| 260 | 260 |
|
| 261 | 261 |
snapshot.restore(); |
| 262 |
snapshot.save(G); |
|
| 263 |
|
|
| 264 |
checkGraphNodeList(G, 4); |
|
| 265 |
checkGraphEdgeList(G, 3); |
|
| 266 |
checkGraphArcList(G, 6); |
|
| 267 |
|
|
| 268 |
G.addEdge(G.addNode(), G.addNode()); |
|
| 269 |
|
|
| 270 |
snapshot.restore(); |
|
| 262 | 271 |
|
| 263 | 272 |
checkGraphNodeList(G, 4); |
| 264 | 273 |
checkGraphEdgeList(G, 3); |
| 265 | 274 |
checkGraphArcList(G, 6); |
| 266 | 275 |
} |
| 267 | 276 |
|
| 268 | 277 |
void checkFullGraph(int num) {
|
| 269 | 278 |
typedef FullGraph Graph; |
| 270 | 279 |
GRAPH_TYPEDEFS(Graph); |
| 271 | 280 |
|
| 272 | 281 |
Graph G(num); |
| 273 | 282 |
check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2, |
| 274 | 283 |
"Wrong size"); |
| 275 | 284 |
|
| 276 | 285 |
G.resize(num); |
| 277 | 286 |
check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2, |
| 278 | 287 |
"Wrong size"); |
| 279 | 288 |
|
| 280 | 289 |
checkGraphNodeList(G, num); |
| 281 | 290 |
checkGraphEdgeList(G, num * (num - 1) / 2); |
| 282 | 291 |
|
| 283 | 292 |
for (NodeIt n(G); n != INVALID; ++n) {
|
| 284 | 293 |
checkGraphOutArcList(G, n, num - 1); |
| 285 | 294 |
checkGraphInArcList(G, n, num - 1); |
| 286 | 295 |
checkGraphIncEdgeList(G, n, num - 1); |
| 287 | 296 |
} |
| 288 | 297 |
|
| 289 | 298 |
checkGraphConArcList(G, num * (num - 1)); |
| 290 | 299 |
checkGraphConEdgeList(G, num * (num - 1) / 2); |
| 291 | 300 |
|
| 292 | 301 |
checkArcDirections(G); |
| 293 | 302 |
|
| 294 | 303 |
checkNodeIds(G); |
| 295 | 304 |
checkArcIds(G); |
| 296 | 305 |
checkEdgeIds(G); |
| 297 | 306 |
checkGraphNodeMap(G); |
| 298 | 307 |
checkGraphArcMap(G); |
| 299 | 308 |
checkGraphEdgeMap(G); |
| 300 | 309 |
|
| 301 | 310 |
|
| 302 | 311 |
for (int i = 0; i < G.nodeNum(); ++i) {
|
| 303 | 312 |
check(G.index(G(i)) == i, "Wrong index"); |
| 304 | 313 |
} |
| 305 | 314 |
|
| 306 | 315 |
for (NodeIt u(G); u != INVALID; ++u) {
|
| 307 | 316 |
for (NodeIt v(G); v != INVALID; ++v) {
|
| 308 | 317 |
Edge e = G.edge(u, v); |
| 309 | 318 |
Arc a = G.arc(u, v); |
| 310 | 319 |
if (u == v) {
|
| 311 | 320 |
check(e == INVALID, "Wrong edge lookup"); |
| 312 | 321 |
check(a == INVALID, "Wrong arc lookup"); |
| 313 | 322 |
} else {
|
| 314 | 323 |
check((G.u(e) == u && G.v(e) == v) || |
| 315 | 324 |
(G.u(e) == v && G.v(e) == u), "Wrong edge lookup"); |
| 316 | 325 |
check(G.source(a) == u && G.target(a) == v, "Wrong arc lookup"); |
| 317 | 326 |
} |
| 318 | 327 |
} |
| 319 | 328 |
} |
| 320 | 329 |
} |
| 321 | 330 |
|
| 322 | 331 |
void checkConcepts() {
|
| 323 | 332 |
{ // Checking graph components
|
| 324 | 333 |
checkConcept<BaseGraphComponent, BaseGraphComponent >(); |
| 325 | 334 |
|
0 comments (0 inline)