X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FIntegerTopology.java;h=55ac0821fb4fdf293acee634ec444b8025a153f5;hb=61566402d83d5c06d57fb850e60ca0f82c27b9a2;hp=e82ce736dbf8e3528feddc1e5a1bf795e12652c2;hpb=3eb9fa560dee4f8c3b3af0460ff850d755676d81;p=sbp.git
diff --git a/src/edu/berkeley/sbp/util/IntegerTopology.java b/src/edu/berkeley/sbp/util/IntegerTopology.java
index e82ce73..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,34 +46,4 @@ public class IntegerTopology implements Topology {
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();
- }
- */
}