package org.infinispan.objectfilter.impl.util;
/**
* Represents an interval of values of type K. K is not restricted to be a Comparable type here, but the IntervalTree
* must be able to compare values of type K using its Comparator.
*
* @param <K> the key value type
* @author anistor@redhat.com
* @since 7.0
*/
public final class Interval<K extends Comparable<K>> {
public static <K extends Comparable<K>> K getMinusInf() {
return (K) MINUS_INF;
}
public static <K extends Comparable<K>> K getPlusInf() {
return (K) PLUS_INF;
}
/**
* Placeholder for the smallest possible value.
*/
private static final Comparable MINUS_INF = new Comparable() {
@Override
public String toString() {
return "-INF";
}
@Override
public int compareTo(Object obj) {
return obj == this ? 0 : -1;
}
@Override
public boolean equals(Object obj) {
return obj == this;
}
};
/**
* Placeholder for the greatest possible value.
*/
private static final Comparable PLUS_INF = new Comparable() {
@Override
public String toString() {
return "+INF";
}
@Override
public int compareTo(Object obj) {
return obj == this ? 0 : 1;
}
@Override
public boolean equals(Object obj) {
return obj == this;
}
};
/**
* The lower bound.
*/
public final K low;
/**
* Indicates if the interval is closed in the lower bound.
*/
public final boolean includeLower;
/**
* The upper bound.
*/
public final K up;
/**
* Indicates if the interval is closed in the upper bound.
*/
public final boolean includeUpper;
public Interval(K low, boolean includeLower, K up, boolean includeUpper) {
if (low == null || up == null) {
throw new IllegalArgumentException("arguments cannot be null");
}
this.low = low;
this.includeLower = includeLower;
this.up = up;
this.includeUpper = includeUpper;
}
public boolean contains(K value) {
return (includeLower ? low.compareTo(value) <= 0 : low.compareTo(value) < 0)
&& (includeUpper ? up.compareTo(value) >= 0 : up.compareTo(value) > 0);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Interval other = (Interval) obj;
return includeLower == other.includeLower
&& includeUpper == other.includeUpper
&& low.equals(other.low) && up.equals(other.up);
}
@Override
public int hashCode() {
int result = low.hashCode();
result = 31 * result + (includeLower ? 1 : 0);
result = 31 * result + up.hashCode();
result = 31 * result + (includeUpper ? 1 : 0);
return result;
}
@Override
public String toString() {
return (includeLower ? "[" : "(") + low + ", " + up + (includeUpper ? "]" : ")");
}
}