summaryrefslogtreecommitdiff
path: root/examples/scala-js/library-aux/src/main/scala/scala/runtime/Statics.scala
blob: b4e7e526f1dd4d8d43924de8e1246e7d53dbe8f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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()
    }
  }
}