summaryrefslogtreecommitdiffstats
path: root/src/javax/vecmath/VecMathUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/javax/vecmath/VecMathUtil.java')
-rw-r--r--src/javax/vecmath/VecMathUtil.java88
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));
+ }
}