e9f01dfc4428ed36b90b0e792a16ca6f680bb695
[sbp.git] / src / edu / berkeley / sbp / util / IntegerTopology.java
1 package edu.berkeley.sbp.util;
2 import java.io.*;
3 import java.util.*;
4 import java.lang.reflect.*;
5 import java.lang.ref.*;
6 import edu.berkeley.sbp.util.*;
7 import edu.berkeley.sbp.*;
8
9 /** implementation of <tt>Topology</tt> for any class for which there is a mapping to the <tt>int</tt>s */
10 public class IntegerTopology<V extends IntegerTopology.IntegerMappable> implements Topology<V> {
11     private final Range.Set rs;
12
13     public Range.Set getRanges() { return rs; /*FIXME: copy?*/ }
14
15     public IntegerTopology()             { this(new Range.Set()); }
16     public IntegerTopology(V v)          { this(v.toInt()); }
17     public IntegerTopology(V a, V b)     { this(a.toInt(), b.toInt()); }
18     public IntegerTopology(int a)        { this(a, a); }
19     public IntegerTopology(int a, int b) { this(new Range(a, b)); }
20     public IntegerTopology(Range r)      { this(new Range.Set(r)); }
21     public IntegerTopology(Range.Set rs) { this.rs = rs; }
22
23     public Topology<V> fresh()             { return new IntegerTopology<V>();   }
24     public Topology<V> dup()               { return new IntegerTopology<V>(this.rs); }
25     public Topology<V> dup(Range.Set rs)   { return new IntegerTopology<V>(rs); }
26         
27     public void             add(Topology<V> t)         { rs.add(((IntegerTopology<V>)t).rs); }
28     public void             remove(Topology<V> t)      { rs.remove(((IntegerTopology<V>)t).rs); }
29     public void             add(V v)                   { rs.add(v.toInt()); }
30     public void             remove(V v)                { rs.remove(v.toInt()); }
31     public boolean          contains(V v)              { return rs.contains(v.toInt()); }
32         
33     public Topology<V> complement()                    { return dup(rs.complement()); }
34     public Topology<V> intersect(Topology<V> t)        { return dup(rs.intersect(((IntegerTopology<V>)t).rs)); }
35     public Topology<V> minus(Topology<V> t)            { return dup(rs.intersect(((IntegerTopology<V>)t).rs.complement())); }
36     public Topology<V> union(Topology<V> t)            { return dup(rs.union(((IntegerTopology<V>)t).rs)); }
37     public boolean          disjoint(Topology<V> t)    { return rs.intersect(((IntegerTopology<V>)t).rs).size()==0; }
38     public boolean          containsAll(Topology<V> t) { return rs.intersect(((IntegerTopology<V>)t).rs).equals(((IntegerTopology<V>)t).rs); }
39
40     public int     hashCode()                          { return rs.hashCode(); }
41     public boolean equals(Object o)                    { return o!=null && o instanceof IntegerTopology && ((IntegerTopology<V>)o).rs.equals(rs); }
42
43     // FIXME: this is currently char-range specific
44     /*
45     public String toString() {
46         String classname = this.getClass().getName().replace('$', '.');
47         if (rs==null) return "new " + classname + "()";
48         StringBuffer sb = new StringBuffer();
49         sb.append("new ");
50         sb.append(classname);
51         sb.append("(new Range.Set(new Range[] { ");
52         for(Range r : rs) {
53             sb.append("new Range(");
54             if (r.isMinNegInf() && r.isMaxPosInf()) {
55                 sb.append("true, true");
56             } else if (r.isMinNegInf()) {
57                 sb.append("true, ");
58                 sb.append(r.getMax());
59             } else if (r.isMaxPosInf()) {
60                 sb.append(r.getMin());
61                 sb.append(", true");
62             } else {
63                 sb.append(r.getMin());
64                 sb.append(", ");
65                 sb.append(r.getMax());
66             }
67             sb.append(")");
68         }
69         sb.append("new Range() }))");
70         return sb.toString();
71     }
72     */
73     public static interface IntegerMappable {
74         public int toInt();
75     }
76 }