/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.filters.api; /** * * @author Mathieu Bastian */ public final class Range { private final Class rangeType; private Double lowerDouble; private Double upperDouble; private Float lowerFloat; private Float upperFloat; private Integer lowerInteger; private Integer upperInteger; private Long lowerLong; private Long upperLong; public Range(Double lowerBound, Double upperBound) { lowerDouble = lowerBound; upperDouble = upperBound; rangeType = Double.class; } public Range(Float lowerBound, Float upperBound) { lowerFloat = lowerBound; upperFloat = upperBound; rangeType = Float.class; } public Range(Integer lowerBound, Integer upperBound) { lowerInteger = lowerBound; upperInteger = upperBound; rangeType = Integer.class; } public Range(Long lowerBound, Long upperBound) { lowerLong = lowerBound; upperLong = upperBound; rangeType = Long.class; } public Range(Object lowerBound, Object upperBound) { if (lowerBound instanceof Double) { lowerDouble = (Double) lowerBound; upperDouble = (Double) upperBound; rangeType = Double.class; } else if (lowerBound instanceof Float) { lowerFloat = (Float) lowerBound; upperFloat = (Float) upperBound; rangeType = Float.class; } else if (lowerBound instanceof Integer) { lowerInteger = (Integer) lowerBound; upperInteger = (Integer) upperBound; rangeType = Integer.class; } else if (lowerBound instanceof Long) { lowerLong = (Long) lowerBound; upperLong = (Long) upperBound; rangeType = Long.class; } else { throw new IllegalArgumentException("must be Double, Float, Integer or Long"); } } public boolean isInRange(Double value) { if (rangeType != Double.class) { throw new IllegalArgumentException("value must be " + rangeType.getName()); } return lowerDouble.compareTo(value) <= 0 && upperDouble.compareTo(value) >= 0; } public boolean isInRange(Float value) { if (rangeType != Float.class) { throw new IllegalArgumentException("value must be " + rangeType.getName()); } return lowerFloat.compareTo(value) <= 0 && upperFloat.compareTo(value) >= 0; } public boolean isInRange(Integer value) { if (rangeType != Integer.class) { throw new IllegalArgumentException("value must be " + rangeType.getName()); } return lowerInteger.compareTo(value) <= 0 && upperInteger.compareTo(value) >= 0; } public boolean isInRange(Long value) { if (rangeType != Long.class) { throw new IllegalArgumentException("value must be " + rangeType.getName()); } return lowerLong.compareTo(value) <= 0 && upperLong.compareTo(value) >= 0; } public boolean isInRange(Object value) { if (rangeType == Double.class) { return isInRange((Double) value); } else if (rangeType == Float.class) { return isInRange((Float) value); } else if (rangeType == Integer.class) { return isInRange((Integer) value); } else if (rangeType == Long.class) { return isInRange((Long) value); } return false; } public void trimBounds(Object min, Object max) { if (rangeType == Double.class) { Double minD = (Double) min; Double maxD = (Double) max; if (minD > lowerDouble || maxD < lowerDouble || lowerDouble.equals(upperDouble)) { lowerDouble = minD; } if (minD > upperDouble || maxD < upperDouble || lowerDouble.equals(upperDouble)) { upperDouble = maxD; } } else if (rangeType == Float.class) { Float minF = (Float) min; Float maxF = (Float) max; if (minF > lowerFloat || maxF < lowerFloat || lowerFloat.equals(upperFloat)) { lowerFloat = minF; } if (minF > upperFloat || maxF < upperFloat || lowerFloat.equals(upperFloat)) { upperFloat = maxF; } } else if (rangeType == Integer.class) { Integer minI = (Integer) min; Integer maxI = (Integer) max; if (minI > lowerInteger || maxI < lowerInteger || lowerInteger.equals(upperInteger)) { lowerInteger = minI; } if (minI > upperInteger || maxI < upperInteger || lowerInteger.equals(upperInteger)) { upperInteger = maxI; } } else if (rangeType == Long.class) { Long minL = (Long) min; Long maxL = (Long) max; if (minL > lowerLong || maxL < lowerLong || lowerLong.equals(upperLong)) { lowerLong = minL; } if (minL > upperLong || maxL < upperLong || lowerLong.equals(upperLong)) { upperLong = maxL; } } } public Double getLowerDouble() { return lowerDouble; } public Float getLowerFloat() { return lowerFloat; } public Integer getLowerInteger() { return lowerInteger; } public Long getLowerLong() { return lowerLong; } public Double getUpperDouble() { return upperDouble; } public Float getUpperFloat() { return upperFloat; } public Integer getUpperInteger() { return upperInteger; } public Long getUpperLong() { return upperLong; } public Object getLowerBound() { if (rangeType == Double.class) { return lowerDouble; } else if (rangeType == Float.class) { return lowerFloat; } else if (rangeType == Integer.class) { return lowerInteger; } else if (rangeType == Long.class) { return lowerLong; } return null; } public Object getUpperBound() { if (rangeType == Double.class) { return upperDouble; } else if (rangeType == Float.class) { return upperFloat; } else if (rangeType == Integer.class) { return upperInteger; } else if (rangeType == Long.class) { return upperLong; } return null; } public Class getRangeType() { return rangeType; } //TODO equals @Override public String toString() { if (rangeType == Double.class) { return lowerDouble.toString() + " - " + upperDouble.toString(); } else if (rangeType == Float.class) { return lowerFloat.toString() + " - " + upperFloat.toString(); } else if (rangeType == Integer.class) { return lowerInteger.toString() + " - " + upperInteger.toString(); } else if (rangeType == Long.class) { return lowerLong.toString() + " - " + upperLong.toString(); } return "null"; } }