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     }