diff options
Diffstat (limited to 'src/javax/vecmath/VecMathUtil.java')
-rw-r--r-- | src/javax/vecmath/VecMathUtil.java | 88 |
1 files changed, 29 insertions, 59 deletions
diff --git a/src/javax/vecmath/VecMathUtil.java b/src/javax/vecmath/VecMathUtil.java index 5e1503f..5bc5b53 100644 --- a/src/javax/vecmath/VecMathUtil.java +++ b/src/javax/vecmath/VecMathUtil.java @@ -31,68 +31,38 @@ package javax.vecmath; * objects containing float or double values. This fixes Issue 36. */ class VecMathUtil { - /** - * Returns the representation of the specified floating-point - * value according to the IEEE 754 floating-point "single format" - * bit layout, after first mapping -0.0 to 0.0. This method is - * identical to Float.floatToIntBits(float) except that an integer - * value of 0 is returned for a floating-point value of - * -0.0f. This is done for the purpose of computing a hash code - * that satisfies the contract of hashCode() and equals(). The - * equals() method in each vecmath class does a pair-wise "==" - * test on each floating-point field in the class (e.g., x, y, and - * z for a Tuple3f). Since 0.0f == -0.0f returns true, - * we must also return the same hash code for two objects, one of - * which has a field with a value of -0.0f and the other of which - * has a cooresponding field with a value of 0.0f. - * - * @param f an input floating-point number - * @return the integer bits representing that floating-point - * number, after first mapping -0.0f to 0.0f - */ - static int floatToIntBits(float f) { - // Check for +0 or -0 - if (f == 0.0f) { - return 0; - } - else { - return Float.floatToIntBits(f); - } - } +/** + * Do not construct an instance of this class. + */ +private VecMathUtil() {} - /** - * Returns the representation of the specified floating-point - * value according to the IEEE 754 floating-point "double format" - * bit layout, after first mapping -0.0 to 0.0. This method is - * identical to Double.doubleToLongBits(double) except that an - * integer value of 0L is returned for a floating-point value of - * -0.0. This is done for the purpose of computing a hash code - * that satisfies the contract of hashCode() and equals(). The - * equals() method in each vecmath class does a pair-wise "==" - * test on each floating-point field in the class (e.g., x, y, and - * z for a Tuple3d). Since 0.0 == -0.0 returns true, we - * must also return the same hash code for two objects, one of - * which has a field with a value of -0.0 and the other of which - * has a cooresponding field with a value of 0.0. - * - * @param d an input double precision floating-point number - * @return the integer bits representing that floating-point - * number, after first mapping -0.0f to 0.0f - */ - static long doubleToLongBits(double d) { - // Check for +0 or -0 - if (d == 0.0) { - return 0L; + static final long hashLongBits(long hash, long l) { + hash *= 31L; + return hash + l; } - else { - return Double.doubleToLongBits(d); + + static final long hashFloatBits(long hash, float f) { + hash *= 31L; + // Treat 0.0d and -0.0d the same (all zero bits) + if (f == 0.0f) + return hash; + + return hash + Float.floatToIntBits(f); } - } + static final long hashDoubleBits(long hash, double d) { + hash *= 31L; + // Treat 0.0d and -0.0d the same (all zero bits) + if (d == 0.0d) + return hash; + + return hash + Double.doubleToLongBits(d); + } - /** - * Do not construct an instance of this class. - */ - private VecMathUtil() { - } + /** + * Return an integer hash from a long by mixing it with itself. + */ + static final int hashFinish(long hash) { + return (int)(hash ^ (hash >> 32)); + } } |