// 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.*;
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, Serializable {
private final Range.Set rs;
private final Functor f;
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(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(toInt(v)); }
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); }
}