package IR.Flat;
import java.util.Vector;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.Iterator;
public class FlatNode {
- protected Vector next;
+ public Vector next;
protected Vector prev;
+ static int idcounter=0;
+ public final int nodeid;
public FlatNode() {
next=new Vector();
prev=new Vector();
+ nodeid=(idcounter++);
}
public String toString() {
next.add(n);
n.addPrev(this);
}
+
+ public void removeNext(FlatNode n) {
+ next.remove(n);
+ }
public void removePrev(FlatNode n) {
prev.remove(n);
}
+
/** This function modifies the graph */
public void setNext(int i, FlatNode n) {
FlatNode old=getNext(i);
throw new Error();
}
+ public Set<FlatNode> getReachableSet(Set<FlatNode> endset) {
+ HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
+ HashSet<FlatNode> visited=new HashSet<FlatNode>();
+ tovisit.add(this);
+ while(!tovisit.isEmpty()) {
+ FlatNode fn=tovisit.iterator().next();
+ tovisit.remove(fn);
+ visited.add(fn);
+ if (endset!=null&&!endset.contains(fn)) {
+ for(int i=0; i<fn.numNext(); i++) {
+ FlatNode nn=fn.getNext(i);
+ if (!visited.contains(nn))
+ tovisit.add(nn);
+ }
+ }
+ }
+ return visited;
+ }
+
public void replace(FlatNode fnnew) {
fnnew.prev.setSize(prev.size());
fnnew.next.setSize(next.size());
}
for(int i=0;i<next.size();i++) {
FlatNode nnext=(FlatNode)next.get(i);
- fnnew.next.set(i,nnext);;
+ fnnew.next.set(i,nnext);
for(int j=0;j<nnext.numPrev();j++) {
FlatNode n=nnext.getPrev(j);
if (n==this)
nnext.prev.set(j, fnnew);
}
}
+ next=null;
+ prev=null;
}
}