X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FIntegerTopology.java;h=55ac0821fb4fdf293acee634ec444b8025a153f5;hp=e1bec151904e3570dae4f980d4ac6398616bd2a8;hb=f069d11a0bc59d63b078df8a4aa488498c4e9cc2;hpb=6b53048f4413f3c618acc3581d0b4f60a236a9bc diff --git a/src/edu/berkeley/sbp/util/IntegerTopology.java b/src/edu/berkeley/sbp/util/IntegerTopology.java index e1bec15..55ac082 100644 --- a/src/edu/berkeley/sbp/util/IntegerTopology.java +++ b/src/edu/berkeley/sbp/util/IntegerTopology.java @@ -1,35 +1,44 @@ +// 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; + private final Functor f; - private static final IntegerTopology empty = new IntegerTopology(); + private int toInt(V v) { return f==null?((IntegerMappable)v).toInt():f.invoke(v); } public Range.Set getRanges() { return new Range.Set(rs); } + public Functor functor() { return 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; } - - public Topology empty() { return (Topology)empty; } + 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 boolean contains(V v) { return rs.contains(v.toInt()); } + public boolean contains(V v) { return rs.contains(toInt(v)); } - 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 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); } @@ -37,37 +46,4 @@ public class IntegerTopology implemen 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(); - } }