package edu.berkeley.sbp.util;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import edu.berkeley.sbp.util.*;
import edu.berkeley.sbp.*;
/** implementation of Topology for any class for which there is a mapping to the ints */
public class IntegerTopology implements Topology {
private final Range.Set rs;
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()); }
public IntegerTopology(V a, V b) { this(a.toInt(), b.toInt()); }
public IntegerTopology(int a) { this(a, a); }
public IntegerTopology(int a, int b) { this(new Range(a, b)); }
public IntegerTopology(Range r) { this(new Range.Set(r)); }
public IntegerTopology(Range.Set rs) { this.rs = rs; }
public Topology empty() { return (Topology)empty; }
public boolean contains(V v) { return rs.contains(v.toInt()); }
public Topology complement() { return new IntegerTopology(rs.complement()); }
public Topology intersect(Topology t) { return new IntegerTopology(rs.intersect(((IntegerTopology)t.unwrap()).rs)); }
public Topology minus(Topology t) { return new IntegerTopology(rs.intersect(((IntegerTopology)t.unwrap()).rs.complement())); }
public Topology union(Topology t) { return new IntegerTopology(rs.union(((IntegerTopology)t.unwrap()).rs)); }
public boolean disjoint(Topology t) { return rs.intersect(((IntegerTopology)t.unwrap()).rs).size()==0; }
public boolean containsAll(Topology t) { return rs.containsAll(((IntegerTopology)t.unwrap()).rs); }
public Topology unwrap() { return this; }
public int hashCode() { return rs.hashCode(); }
public boolean equals(Object o) { return o!=null && o instanceof IntegerTopology && ((IntegerTopology)o).rs.equals(rs); }
// FIXME: this is currently char-range specific
/*
public String toString() {
String classname = this.getClass().getName().replace('$', '.');
if (rs==null) return "new " + classname + "()";
StringBuffer sb = new StringBuffer();
sb.append("new ");
sb.append(classname);
sb.append("(new Range.Set(new Range[] { ");
for(Range r : rs) {
sb.append("new Range(");
if (r.isMinNegInf() && r.isMaxPosInf()) {
sb.append("true, true");
} else if (r.isMinNegInf()) {
sb.append("true, ");
sb.append(r.getMax());
} else if (r.isMaxPosInf()) {
sb.append(r.getMin());
sb.append(", true");
} else {
sb.append(r.getMin());
sb.append(", ");
sb.append(r.getMax());
}
sb.append(")");
}
sb.append("new Range() }))");
return sb.toString();
}
*/
public static interface IntegerMappable {
public int toInt();
}
}