1 cananian 1.1.2.2 package harpoon.Backend.CSAHack.Graph; 2 cananian 1.1.2.1 3 cananian 1.1.2.1 public class Graph { 4 cananian 1.1.2.1 5 cananian 1.1.2.1 int nodecount=0; 6 cananian 1.1.2.1 NodeList mynodes, mylast; 7 cananian 1.1.2.1 public NodeList nodes() { return mynodes;} 8 cananian 1.1.2.1 9 cananian 1.1.2.1 public Node newNode() { 10 cananian 1.1.2.1 return new Node(this); 11 cananian 1.1.2.1 } 12 cananian 1.1.2.1 13 cananian 1.1.2.1 void check(Node n) { 14 cananian 1.1.2.1 if (n.mygraph != this) 15 cananian 1.1.2.1 throw new Error("Graph.addEdge using nodes from the wrong graph"); 16 cananian 1.1.2.1 } 17 cananian 1.1.2.1 18 cananian 1.1.2.1 static boolean inList(Node a, NodeList l) { 19 cananian 1.1.2.1 for(NodeList p=l; p!=null; p=p.tail) 20 cananian 1.1.2.1 if (p.head==a) return true; 21 cananian 1.1.2.1 return false; 22 cananian 1.1.2.1 } 23 cananian 1.1.2.1 24 cananian 1.1.2.1 public void addEdge(Node from, Node to) { 25 cananian 1.1.2.1 check(from); check(to); 26 cananian 1.1.2.1 if (from.goesTo(to)) return; 27 cananian 1.1.2.1 to.preds=new NodeList(from, to.preds); 28 cananian 1.1.2.1 from.succs=new NodeList(to, from.succs); 29 cananian 1.1.2.1 } 30 cananian 1.1.2.1 31 cananian 1.1.2.1 NodeList delete(Node a, NodeList l) { 32 cananian 1.1.2.1 if (l==null) throw new Error("Graph.rmEdge: edge nonexistent"); 33 cananian 1.1.2.1 else if (a==l.head) return l.tail; 34 cananian 1.1.2.1 else return new NodeList(l.head, delete(a, l.tail)); 35 cananian 1.1.2.1 } 36 cananian 1.1.2.1 37 cananian 1.1.2.1 public void rmEdge(Node from, Node to) { 38 cananian 1.1.2.1 to.preds=delete(from,to.preds); 39 cananian 1.1.2.1 from.succs=delete(to,from.succs); 40 cananian 1.1.2.1 } 41 cananian 1.1.2.1 42 cananian 1.1.2.1 /** 43 cananian 1.1.2.1 * Print a human-readable dump for debugging. 44 cananian 1.1.2.1 */ 45 cananian 1.1.2.1 public void show(java.io.PrintStream out) { 46 cananian 1.1.2.1 for (NodeList p=nodes(); p!=null; p=p.tail) { 47 cananian 1.1.2.1 Node n = p.head; 48 cananian 1.1.2.1 out.print(n.toString()); 49 cananian 1.1.2.1 out.print(": "); 50 cananian 1.1.2.1 for(NodeList q=n.succ(); q!=null; q=q.tail) { 51 cananian 1.1.2.1 out.print(q.head.toString()); 52 cananian 1.1.2.1 out.print(" "); 53 cananian 1.1.2.1 } 54 cananian 1.1.2.1 out.println(); 55 cananian 1.1.2.1 } 56 cananian 1.1.2.1 } 57 cananian 1.1.2.1 58 cananian 1.2 }