/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.util;
/**
* Represents a bounded or unbounded numeric range. By default the range is closed (ake inclusive)
* on the low end and open (aka exclusive) on the high end: mathematically "[low, high)". (I'm not
* using the similarly-named class from Apache commons because it doesn't implement comparable, and
* because it only allows inclusive bounds.)
*/
public class DoubleRange implements Comparable<DoubleRange> {
private Double low;
private Double high;
private boolean closedLow = true; //TODO: add setters and getters for these
private boolean closedHigh = false;
public DoubleRange() {
}
public DoubleRange(Double low, Double high) {
this.low = low == null ? new Double(Double.NEGATIVE_INFINITY) : low;
this.high = high == null ? new Double(Double.POSITIVE_INFINITY) : high;
}
/**
* @return Returns the high.
*/
public Double getHigh() {
return high;
}
/**
* @param high The high to set.
*/
public void setHigh(Double high) {
this.high = high == null ? new Double(Double.POSITIVE_INFINITY) : high;
}
/**
* @return Returns the low.
*/
public Double getLow() {
return low;
}
/**
* @param low The low to set.
*/
public void setLow(Double low) {
this.low = low == null ? new Double(Double.NEGATIVE_INFINITY) : low;
}
/**
* first sorts according to low-bound (ascending) then according to high-bound (descending)
*/
public int compareTo(DoubleRange other) {
int temp = low.compareTo(other.low);
if (temp == 0) {
temp = other.high.compareTo(high);
}
return temp;
}
public boolean contains(double d) {
if (low != null) {
if (closedLow) {
if (d < low) {
return false;
}
} else {
if (d <= low) {
return false;
}
}
}
if (high != null) {
if (closedHigh) {
if (d > high) {
return false;
}
} else {
if (d >= high) {
return false;
}
}
}
return true;
}
public String toString() {
StringBuffer ret = new StringBuffer();
if (low != null && low.doubleValue() != Double.NEGATIVE_INFINITY) {
ret.append(">");
if (closedLow) {
ret.append("=");
}
ret.append(" " + Format.format(low));
if (high != null && high.doubleValue() != Double.NEGATIVE_INFINITY) {
ret.append(" and ");
}
}
if (high != null && high.doubleValue() != Double.POSITIVE_INFINITY) {
ret.append("<");
if (closedHigh) {
ret.append("=");
}
ret.append(" " + Format.format(high));
}
return ret.toString();
}
public boolean equals(Object o) {
DoubleRange other = (DoubleRange) o;
return low.equals(other.low) && high.equals(other.high);
}
}