token classes combed over and tested thoroughly
[IRC.git] / Robust / src / Analysis / OwnershipAnalysis / ChangeTupleSet.java
index 650716bccf9569682601ab53e70ddd728962cee8..ee2813dd4f6bb8d66d840b17c9aca1c73b9e47e0 100644 (file)
@@ -6,9 +6,9 @@ import java.util.*;
 import java.io.*;
 
 
-public class ChangeTupleSet {
+public class ChangeTupleSet extends Canonical {
 
-    public HashSet<ChangeTuple> changeTuples;
+    private HashSet<ChangeTuple> changeTuples;
 
     public ChangeTupleSet() {
        changeTuples = new HashSet<ChangeTuple>();
@@ -20,20 +20,69 @@ public class ChangeTupleSet {
     }
 
     public ChangeTupleSet( ChangeTupleSet cts ) {
-       changeTuples = (HashSet<ChangeTuple>) cts.changeTuples.clone(); //COPY?!
+       changeTuples = (HashSet<ChangeTuple>) cts.changeTuples.clone();
+    }
+
+    public ChangeTupleSet makeCanonical() {
+       return (ChangeTupleSet) Canonical.makeCanonical( this );
+    }
+
+    public Iterator iterator() {
+       return changeTuples.iterator();
     }
 
     public ChangeTupleSet union( ChangeTupleSet ctsIn ) {
+       assert ctsIn != null;
+
        ChangeTupleSet ctsOut = new ChangeTupleSet( this );
        ctsOut.changeTuples.addAll( ctsIn.changeTuples );
-       return ctsOut;
+       return ctsOut.makeCanonical();
+    }
+
+    public ChangeTupleSet union( ChangeTuple ctIn ) {
+       assert ctIn != null;
+
+       ChangeTupleSet ctsOut = new ChangeTupleSet( this );
+       ctsOut.changeTuples.add( ctIn );
+       return ctsOut.makeCanonical();
+    }
+
+    public boolean isEmpty() {
+       return changeTuples.isEmpty();
     }
 
     public boolean isSubset( ChangeTupleSet ctsIn ) {
+       assert ctsIn != null;
        return ctsIn.changeTuples.containsAll( this.changeTuples );
     }
 
+    public boolean equals( Object o ) {
+       if( o == null ) {
+           return false;
+       }
+
+       if( !(o instanceof ChangeTupleSet) ) {
+           return false;
+       }
+
+       ChangeTupleSet cts = (ChangeTupleSet) o;
+       return changeTuples.equals( cts.changeTuples );
+    }
+
+    public int hashCode() {
+       return changeTuples.hashCode();
+    }
+
     public String toString() {
-       return changeTuples.toString();
+       String s = "[";
+
+       Iterator i = this.iterator();
+       while( i.hasNext() ) {
+           s += "\n  "+i.next();
+       }
+
+       s += "\n]";
+
+       return s;
     }
 }