lemon/smart_graph.h
changeset 2381 0248790c66ea
parent 2350 eb371753e814
child 2386 81b47fc5c444
equal deleted inserted replaced
40:ff5731122c10 41:f2f4b2849138
   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: