X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FIntegerTopology.java;h=55ac0821fb4fdf293acee634ec444b8025a153f5;hp=cac19e9b19676da56eb8ec7fde15d15c2be445b5;hb=f069d11a0bc59d63b078df8a4aa488498c4e9cc2;hpb=c61dfbe5593a9257d39e84261d48472a74975afa diff --git a/src/edu/berkeley/sbp/util/IntegerTopology.java b/src/edu/berkeley/sbp/util/IntegerTopology.java index cac19e9..55ac082 100644 --- a/src/edu/berkeley/sbp/util/IntegerTopology.java +++ b/src/edu/berkeley/sbp/util/IntegerTopology.java @@ -1,76 +1,49 @@ +// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license + 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.*; +import edu.berkeley.sbp.util.*; /** implementation of Topology for any class for which there is a mapping to the ints */ -public class IntegerTopology implements Topology { +public class IntegerTopology implements Topology, Serializable { + private final Range.Set rs; - - public Range.Set getRanges() { return new Range.Set(rs); } + private final Functor f; - 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; } + private int toInt(V v) { return f==null?((IntegerMappable)v).toInt():f.invoke(v); } - public Topology fresh() { return new IntegerTopology(); } - public Topology dup() { return new IntegerTopology(this.rs); } - public Topology dup(Range.Set rs) { return new IntegerTopology(rs); } + public Range.Set getRanges() { return new Range.Set(rs); } + public Functor functor() { return f; } + + public IntegerTopology(Functor f) { this(f, new Range.Set()); } + public IntegerTopology(Functor f, V a) { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a)); } + public IntegerTopology(Functor f, V a, V b) { this(f, f==null?((IntegerMappable)a).toInt():f.invoke(a), + f==null?((IntegerMappable)b).toInt():f.invoke(b)); } + public IntegerTopology(Functor f, int a) { this(f, a, a); } + public IntegerTopology(Functor f, int a, int b) { this(f, new Range(a, b)); } + public IntegerTopology(Functor f, Range r) { this(f, new Range.Set(r)); } + public IntegerTopology(Functor f, Range.Set rs) { + this.rs = rs; + this.f = f==null?(this instanceof Functor ? (Functor)this : null):f; + } + + public Topology empty() { return new IntegerTopology(f); } - public void add(Topology t) { rs.add(((IntegerTopology)t).rs); } - public void remove(Topology t) { rs.remove(((IntegerTopology)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 boolean contains(V v) { return rs.contains(toInt(v)); } - public Topology complement() { return dup(rs.complement()); } - public Topology intersect(Topology t) { return dup(rs.intersect(((IntegerTopology)t).rs)); } - public Topology minus(Topology t) { return dup(rs.intersect(((IntegerTopology)t).rs.complement())); } - public Topology union(Topology t) { return dup(rs.union(((IntegerTopology)t).rs)); } - public boolean disjoint(Topology t) { return rs.intersect(((IntegerTopology)t).rs).size()==0; } - public boolean containsAll(Topology t) { return rs.intersect(((IntegerTopology)t).rs).equals(((IntegerTopology)t).rs); } + public Topology complement() { return new IntegerTopology(f, rs.complement()); } + public Topology intersect(Topology t) { return new IntegerTopology(f, rs.intersect(((IntegerTopology)t.unwrap()).rs)); } + public Topology minus(Topology t) { return new IntegerTopology(f, rs.intersect(((IntegerTopology)t.unwrap()).rs.complement())); } + public Topology union(Topology t) { return new IntegerTopology(f, 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(); - } }