refactored Topology to make it a value (immutable) class
[sbp.git] / src / edu / berkeley / sbp / util / IntegerTopology.java
index e9f01df..e1bec15 100644 (file)
@@ -10,7 +10,9 @@ import edu.berkeley.sbp.*;
 public class IntegerTopology<V extends IntegerTopology.IntegerMappable> implements Topology<V> {
     private final Range.Set rs;
 
-    public Range.Set getRanges() { return rs; /*FIXME: copy?*/ }
+    private static final IntegerTopology empty = new IntegerTopology();
+
+    public Range.Set getRanges()         { return new Range.Set(rs); }
 
     public IntegerTopology()             { this(new Range.Set()); }
     public IntegerTopology(V v)          { this(v.toInt()); }
@@ -20,23 +22,18 @@ public class IntegerTopology<V extends IntegerTopology.IntegerMappable> implemen
     public IntegerTopology(Range r)      { this(new Range.Set(r)); }
     public IntegerTopology(Range.Set rs) { this.rs = rs; }
 
-    public Topology<V> fresh()             { return new IntegerTopology<V>();   }
-    public Topology<V> dup()               { return new IntegerTopology<V>(this.rs); }
-    public Topology<V> dup(Range.Set rs)   { return new IntegerTopology<V>(rs); }
+    public Topology<V> empty()             { return (Topology<V>)empty;   }
         
-    public void             add(Topology<V> t)         { rs.add(((IntegerTopology<V>)t).rs); }
-    public void             remove(Topology<V> t)      { rs.remove(((IntegerTopology<V>)t).rs); }
-    public void             add(V v)                   { rs.add(v.toInt()); }
-    public void             remove(V v)                { rs.remove(v.toInt()); }
     public boolean          contains(V v)              { return rs.contains(v.toInt()); }
         
-    public Topology<V> complement()                    { return dup(rs.complement()); }
-    public Topology<V> intersect(Topology<V> t)        { return dup(rs.intersect(((IntegerTopology<V>)t).rs)); }
-    public Topology<V> minus(Topology<V> t)            { return dup(rs.intersect(((IntegerTopology<V>)t).rs.complement())); }
-    public Topology<V> union(Topology<V> t)            { return dup(rs.union(((IntegerTopology<V>)t).rs)); }
-    public boolean          disjoint(Topology<V> t)    { return rs.intersect(((IntegerTopology<V>)t).rs).size()==0; }
-    public boolean          containsAll(Topology<V> t) { return rs.intersect(((IntegerTopology<V>)t).rs).equals(((IntegerTopology<V>)t).rs); }
+    public Topology<V>      complement()               { return new IntegerTopology<V>(rs.complement()); }
+    public Topology<V>      intersect(Topology<V> t)   { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs)); }
+    public Topology<V>      minus(Topology<V> t)       { return new IntegerTopology<V>(rs.intersect(((IntegerTopology<V>)t.unwrap()).rs.complement())); }
+    public Topology<V>      union(Topology<V> t)       { return new IntegerTopology<V>(rs.union(((IntegerTopology<V>)t.unwrap()).rs)); }
+    public boolean          disjoint(Topology<V> t)    { return rs.intersect(((IntegerTopology<V>)t.unwrap()).rs).size()==0; }
+    public boolean          containsAll(Topology<V> t) { return rs.containsAll(((IntegerTopology<V>)t.unwrap()).rs); }
 
+    public Topology<V> unwrap() { return this; }
     public int     hashCode()                          { return rs.hashCode(); }
     public boolean equals(Object o)                    { return o!=null && o instanceof IntegerTopology && ((IntegerTopology<V>)o).rs.equals(rs); }