284 |
284 |
285 void restoreSnapshot(const Snapshot &s) |
285 void restoreSnapshot(const Snapshot &s) |
286 { |
286 { |
287 while(s.edge_num<edges.size()) { |
287 while(s.edge_num<edges.size()) { |
288 Edge edge = edgeFromId(edges.size()-1); |
288 Edge edge = edgeFromId(edges.size()-1); |
289 Parent::getNotifier(Edge()).erase(edge); |
289 Parent::notifier(Edge()).erase(edge); |
290 nodes[edges.back().source].first_out=edges.back().next_out; |
290 nodes[edges.back().source].first_out=edges.back().next_out; |
291 nodes[edges.back().target].first_in=edges.back().next_in; |
291 nodes[edges.back().target].first_in=edges.back().next_in; |
292 edges.pop_back(); |
292 edges.pop_back(); |
293 } |
293 } |
294 while(s.node_num<nodes.size()) { |
294 while(s.node_num<nodes.size()) { |
295 Node node = nodeFromId(nodes.size()-1); |
295 Node node = nodeFromId(nodes.size()-1); |
296 Parent::getNotifier(Node()).erase(node); |
296 Parent::notifier(Node()).erase(node); |
297 nodes.pop_back(); |
297 nodes.pop_back(); |
298 } |
298 } |
299 } |
299 } |
300 |
300 |
301 public: |
301 public: |
503 if (edge.id == -2) edge.id = -1; |
503 if (edge.id == -2) edge.id = -1; |
504 } |
504 } |
505 |
505 |
506 void firstInc(UEdge &edge, bool& d, const Node& v) const { |
506 void firstInc(UEdge &edge, bool& d, const Node& v) const { |
507 int de = nodes[v.id].first_out; |
507 int de = nodes[v.id].first_out; |
508 edge.id = de / 2; |
508 if (de != -1) { |
509 d = ((de & 1) == 1); |
509 edge.id = de / 2; |
|
510 d = ((de & 1) == 1); |
|
511 } else { |
|
512 edge.id = -1; |
|
513 d = true; |
|
514 } |
510 } |
515 } |
511 void nextInc(UEdge &edge, bool& d) const { |
516 void nextInc(UEdge &edge, bool& d) const { |
512 int de = (edges[(edge.id * 2) | (d ? 1 : 0)].next_out); |
517 int de = (edges[(edge.id * 2) | (d ? 1 : 0)].next_out); |
513 edge.id = de / 2; |
518 if (de != -1) { |
514 d = ((de & 1) == 1); |
519 edge.id = de / 2; |
|
520 d = ((de & 1) == 1); |
|
521 } else { |
|
522 edge.id = -1; |
|
523 d = true; |
|
524 } |
515 } |
525 } |
516 |
526 |
517 static int id(Node v) { return v.id; } |
527 static int id(Node v) { return v.id; } |
518 static int id(Edge e) { return e.id; } |
528 static int id(Edge e) { return e.id; } |
519 static int id(UEdge e) { return e.id; } |
529 static int id(UEdge e) { return e.id; } |
639 void restoreSnapshot(const Snapshot &s) |
649 void restoreSnapshot(const Snapshot &s) |
640 { |
650 { |
641 while(s.edge_num<edges.size()) { |
651 while(s.edge_num<edges.size()) { |
642 int n=edges.size()-1; |
652 int n=edges.size()-1; |
643 UEdge edge=uEdgeFromId(n/2); |
653 UEdge edge=uEdgeFromId(n/2); |
644 Parent::getNotifier(UEdge()).erase(edge); |
654 Parent::notifier(UEdge()).erase(edge); |
645 std::vector<Edge> dir; |
655 std::vector<Edge> dir; |
646 dir.push_back(edgeFromId(n)); |
656 dir.push_back(edgeFromId(n)); |
647 dir.push_back(edgeFromId(n-1)); |
657 dir.push_back(edgeFromId(n-1)); |
648 Parent::getNotifier(Edge()).erase(dir); |
658 Parent::notifier(Edge()).erase(dir); |
649 nodes[edges[n].target].first_out=edges[n].next_out; |
659 nodes[edges[n].target].first_out=edges[n].next_out; |
650 nodes[edges[n-1].target].first_out=edges[n-1].next_out; |
660 nodes[edges[n-1].target].first_out=edges[n-1].next_out; |
651 edges.pop_back(); |
661 edges.pop_back(); |
652 edges.pop_back(); |
662 edges.pop_back(); |
653 } |
663 } |
654 while(s.node_num<nodes.size()) { |
664 while(s.node_num<nodes.size()) { |
655 int n=nodes.size()-1; |
665 int n=nodes.size()-1; |
656 Node node = nodeFromId(n); |
666 Node node = nodeFromId(n); |
657 Parent::getNotifier(Node()).erase(node); |
667 Parent::notifier(Node()).erase(node); |
658 nodes.pop_back(); |
668 nodes.pop_back(); |
659 } |
669 } |
660 } |
670 } |
661 |
671 |
662 public: |
672 public: |
1021 |
1031 |
1022 void restoreSnapshot(const Snapshot &s) |
1032 void restoreSnapshot(const Snapshot &s) |
1023 { |
1033 { |
1024 while(s.edge_num<edges.size()) { |
1034 while(s.edge_num<edges.size()) { |
1025 UEdge edge = uEdgeFromId(edges.size()-1); |
1035 UEdge edge = uEdgeFromId(edges.size()-1); |
1026 Parent::getNotifier(UEdge()).erase(edge); |
1036 Parent::notifier(UEdge()).erase(edge); |
1027 std::vector<Edge> dir; |
1037 std::vector<Edge> dir; |
1028 dir.push_back(Parent::direct(edge, true)); |
1038 dir.push_back(Parent::direct(edge, true)); |
1029 dir.push_back(Parent::direct(edge, false)); |
1039 dir.push_back(Parent::direct(edge, false)); |
1030 Parent::getNotifier(Edge()).erase(dir); |
1040 Parent::notifier(Edge()).erase(dir); |
1031 aNodes[edges.back().aNode >> 1].first=edges.back().next_out; |
1041 aNodes[edges.back().aNode >> 1].first=edges.back().next_out; |
1032 bNodes[edges.back().bNode >> 1].first=edges.back().next_in; |
1042 bNodes[edges.back().bNode >> 1].first=edges.back().next_in; |
1033 edges.pop_back(); |
1043 edges.pop_back(); |
1034 } |
1044 } |
1035 while(s.anode_num<aNodes.size()) { |
1045 while(s.anode_num<aNodes.size()) { |
1036 Node node = nodeFromANodeId(aNodes.size() - 1); |
1046 Node node = nodeFromANodeId(aNodes.size() - 1); |
1037 Parent::getNotifier(ANode()).erase(node); |
1047 Parent::notifier(ANode()).erase(node); |
1038 Parent::getNotifier(Node()).erase(node); |
1048 Parent::notifier(Node()).erase(node); |
1039 aNodes.pop_back(); |
1049 aNodes.pop_back(); |
1040 } |
1050 } |
1041 while(s.bnode_num<bNodes.size()) { |
1051 while(s.bnode_num<bNodes.size()) { |
1042 Node node = nodeFromBNodeId(bNodes.size() - 1); |
1052 Node node = nodeFromBNodeId(bNodes.size() - 1); |
1043 Parent::getNotifier(BNode()).erase(node); |
1053 Parent::notifier(BNode()).erase(node); |
1044 Parent::getNotifier(Node()).erase(node); |
1054 Parent::notifier(Node()).erase(node); |
1045 bNodes.pop_back(); |
1055 bNodes.pop_back(); |
1046 } |
1056 } |
1047 } |
1057 } |
1048 |
1058 |
1049 public: |
1059 public: |