/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2011, Open Source Geospatial Foundation (OSGeo) * (C) 2003-2005, Open Geospatial Consortium Inc. * * All Rights Reserved. http://www.opengis.org/legal/ */ package org.opengis.util; import org.opengis.annotation.UML; import static org.opengis.annotation.Obligation.*; import static org.opengis.annotation.Specification.*; /** * An {@linkplain Integer integer} with associated infinite flag. This implementation uses * {@link Integer#MAX_VALUE} as a sentinel value for positive infinity. This approach is * consistent with J2SE {@link java.util.Collection#size()} contract. For consistency, * {@link Integer#MIN_VALUE} is a sentinal value for negative infinity. * * @author Jody Garnett (Refractions Research) * @author Martin Desruisseaux (IRD) * @since GeoAPI 2.1 * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/library/opengis/src/main/java/org/opengis/util/UnlimitedInteger.java $ */ @UML(identifier="UnlimitedInteger", specification=ISO_19103) public final class UnlimitedInteger extends Number implements Comparable<UnlimitedInteger> { /** * For compatibility with different versions. */ private static final long serialVersionUID = 4748246369364771836L; /** * A constant holding the negative infinity. */ public static final UnlimitedInteger NEGATIVE_INFINITY = new UnlimitedInteger(Integer.MIN_VALUE); /** * A constant holding the positive infinity. */ public static final UnlimitedInteger POSITIVE_INFINITY = new UnlimitedInteger(Integer.MAX_VALUE); /** * A constant holding the minimum finite value a {@code UnlimitedInteger} can have. */ public static final int MIN_VALUE = Integer.MIN_VALUE + 1; /** * A constant holding the maximum finite value a {@code UnlimitedInteger} can have. */ public static final int MAX_VALUE = Integer.MAX_VALUE - 1; /** * The integer value. */ private final int value; /** * Constructs a newly allocated {@code UnlimitedInteger} object that represents the specified * {@code int} value. {@link Integer#MAX_VALUE} and {@link Integer#MIN_VALUE MIN_VALUE} maps * to positive and negative infinities respectively. */ public UnlimitedInteger(final int value) { this.value = value; } /** * Returns {@code true} if this integer represents a positive or negative infinity. */ public boolean isInfinite(){ return (value == Integer.MAX_VALUE) || (value == Integer.MIN_VALUE); } /** * Returns the value of this {@code UnlimitedInteger} as an {@code int}. Positive and negative * infinities map to {@link Integer#MAX_VALUE} and {@link Integer#MIN_VALUE MIN_VALUE} * respectively. */ @Override public int intValue() { return value; } /** * Returns the value of this {@code UnlimitedInteger} as a {@code long}. Positive and negative * infinities map to {@link Long#MAX_VALUE} and {@link Long#MIN_VALUE MIN_VALUE} respectively. */ @Override public long longValue() { return value; } /** * Returns the value of this {@code UnlimitedInteger} as a {@code float}. * Positive and negative infinities map to {@link Float#POSITIVE_INFINITY} * and {@link Float#NEGATIVE_INFINITY NEGATIVE_INFINITY} respectively. */ @Override public float floatValue() { switch (value) { case Integer.MAX_VALUE: return Float.POSITIVE_INFINITY; case Integer.MIN_VALUE: return Float.NEGATIVE_INFINITY; default: return value; } } /** * Returns the value of this {@code UnlimitedInteger} as a {@code double}. * Positive and negative infinities map to {@link Double#POSITIVE_INFINITY} * and {@link Double#NEGATIVE_INFINITY NEGATIVE_INFINITY} respectively. */ @Override public double doubleValue() { switch (value) { case Integer.MAX_VALUE: return Double.POSITIVE_INFINITY; case Integer.MIN_VALUE: return Double.NEGATIVE_INFINITY; default: return value; } } /** * Returns a string representation of this number. */ @Override public String toString() { switch (value) { case Integer.MAX_VALUE: return "\u221E"; // Infinity symbol. case Integer.MIN_VALUE: return "-\u221E"; default: return Integer.toString(value); } } /** * Returns a hash code for this integer. */ @Override public int hashCode() { return value; } /** * Compares this number with the specified object for equality. */ @Override public boolean equals(final Object object) { return (object instanceof UnlimitedInteger) && ((UnlimitedInteger) object).value == value; } /** * Compares two {@code UnlimitedInteger} objects numerically. * * @param other the unlimited integer to be compared. * @return {@code 0} if this {@code UnlimitedInteger} is equal to the given value, * {@code -1} if this {@code UnlimitedInteger} is numerically less than the given value, and * {@code +1} if this {@code UnlimitedInteger} is numerically greater than the given value, */ public int compareTo(final UnlimitedInteger other) { if (value < other.value) return -1; if (value > other.value) return +1; return 0; } }