summaryrefslogtreecommitdiff
path: root/library-aux/src/main/scala/scala/runtime/Statics.scala
diff options
context:
space:
mode:
Diffstat (limited to 'library-aux/src/main/scala/scala/runtime/Statics.scala')
-rw-r--r--library-aux/src/main/scala/scala/runtime/Statics.scala89
1 files changed, 89 insertions, 0 deletions
diff --git a/library-aux/src/main/scala/scala/runtime/Statics.scala b/library-aux/src/main/scala/scala/runtime/Statics.scala
new file mode 100644
index 0000000..b4e7e52
--- /dev/null
+++ b/library-aux/src/main/scala/scala/runtime/Statics.scala
@@ -0,0 +1,89 @@
+package scala.runtime
+
+/** Not for public consumption. Usage by the runtime only.
+ */
+
+object Statics {
+ def mix(hash: Int, data: Int): Int = {
+ var h = mixLast(hash, data)
+ h = Integer.rotateLeft(h, 13)
+ (h * 5) + 0xe6546b64
+ }
+
+ def mixLast(hash: Int, data: Int): Int = {
+ var k = data
+ k *= 0xcc9e2d51
+ k = Integer.rotateLeft(k, 15)
+ k *= 0x1b873593
+ hash ^ k
+ }
+
+ def finalizeHash(hash: Int, length: Int): Int = {
+ avalanche(hash ^ length)
+ }
+
+ /** Force all bits of the hash to avalanche. Used for finalizing the hash. */
+ def avalanche(h0: Int): Int = {
+ var h = h0
+ h ^= h >>> 16
+ h *= 0x85ebca6b
+ h ^= h >>> 13
+ h *= 0xc2b2ae35
+ h ^= h >>> 16
+ h
+ }
+
+ def longHash(lv: Long): Int = {
+ lv.toInt
+ /*
+ val iv = lv.toInt | 0
+ if (iv == lv) iv
+ else (lv ^ (lv >>> 32)).toInt | 0
+ */
+ }
+
+ def doubleHash(dv: Double): Int = {
+ dv.toInt
+ /*
+ val iv = dv.toInt | 0
+ if (iv == dv)
+ return iv
+
+ val fv = dv.toFloat
+ if (fv == dv)
+ return java.lang.Float.floatToIntBits(fv)
+
+ val lv = dv.toLong
+ if (lv == dv)
+ return lv.toInt | 0
+
+ val lv2 == java.lang.Double.doubleToLongBits(dv)
+ return (lv2 ^ (lv2 >>> 32)).toInt | 0
+ */
+ }
+
+ def floatHash(fv: Float): Int = {
+ fv.toInt
+ /*
+ val iv = fv.toInt
+ if (iv == fv)
+ return iv
+
+ val lv = fv.toLong
+ if (lv == fv)
+ return (lv ^ (lv >>> 32)).toInt | 0
+
+ return java.lang.Float.floatToIntBits(fv)
+ */
+ }
+
+ def anyHash(x: Any): Int = {
+ x match {
+ case null => 0
+ case x: Long => longHash(x)
+ case x: Double => doubleHash(x)
+ case x: Float => floatHash(x)
+ case _ => x.hashCode()
+ }
+ }
+}