1 package edu.berkeley.sbp.util;
4 import java.lang.reflect.*;
5 import java.lang.ref.*;
6 import edu.berkeley.sbp.util.*;
7 import edu.berkeley.sbp.*;
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;
13 public Range.Set getRanges() { return rs; /*FIXME: copy?*/ }
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; }
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); }
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()); }
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); }
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); }
43 // FIXME: this is currently char-range specific
45 public String toString() {
46 String classname = this.getClass().getName().replace('$', '.');
47 if (rs==null) return "new " + classname + "()";
48 StringBuffer sb = new StringBuffer();
51 sb.append("(new Range.Set(new Range[] { ");
53 sb.append("new Range(");
54 if (r.isMinNegInf() && r.isMaxPosInf()) {
55 sb.append("true, true");
56 } else if (r.isMinNegInf()) {
58 sb.append(r.getMax());
59 } else if (r.isMaxPosInf()) {
60 sb.append(r.getMin());
63 sb.append(r.getMin());
65 sb.append(r.getMax());
69 sb.append("new Range() }))");
73 public static interface IntegerMappable {