diff options
Diffstat (limited to 'examples/scala-js/javalanglib/src/main/scala/java/lang/Float.scala')
-rw-r--r-- | examples/scala-js/javalanglib/src/main/scala/java/lang/Float.scala | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/examples/scala-js/javalanglib/src/main/scala/java/lang/Float.scala b/examples/scala-js/javalanglib/src/main/scala/java/lang/Float.scala new file mode 100644 index 0000000..70cb33e --- /dev/null +++ b/examples/scala-js/javalanglib/src/main/scala/java/lang/Float.scala @@ -0,0 +1,96 @@ +package java.lang + +/* This is a hijacked class. Its instances are primitive numbers. + * Constructors are not emitted. + */ +final class Float private () extends Number with Comparable[Float] { + + def this(value: scala.Float) = this() + def this(s: String) = this() + + @inline def floatValue(): scala.Float = + this.asInstanceOf[scala.Float] + + @inline override def byteValue(): scala.Byte = floatValue.toByte + @inline override def shortValue(): scala.Short = floatValue.toShort + @inline def intValue(): scala.Int = floatValue.toInt + @inline def longValue(): scala.Long = floatValue.toLong + @inline def doubleValue(): scala.Double = floatValue.toDouble + + override def equals(that: Any): scala.Boolean = that match { + case that: Double => // yes, Double + val a = doubleValue + val b = that.doubleValue + (a == b) || (Double.isNaN(a) && Double.isNaN(b)) + case _ => + false + } + + // Uses the hashCode of Doubles. See Bits.numberHashCode for the rationale. + @inline override def hashCode(): Int = + scala.scalajs.runtime.Bits.numberHashCode(doubleValue) + + @inline override def compareTo(that: Float): Int = + Float.compare(floatValue, that.floatValue) + + @inline override def toString(): String = + Float.toString(floatValue) + + @inline def isNaN(): scala.Boolean = + Float.isNaN(floatValue) + + @inline def isInfinite(): scala.Boolean = + Float.isInfinite(floatValue) + +} + +object Float { + final val TYPE = classOf[scala.Float] + final val POSITIVE_INFINITY = 1.0f / 0.0f + final val NEGATIVE_INFINITY = 1.0f / -0.0f + final val NaN = 0.0f / 0.0f + final val MAX_VALUE = scala.Float.MaxValue + final val MIN_VALUE = scala.Float.MinPositiveValue + final val MAX_EXPONENT = 127 + final val MIN_EXPONENT = -126 + final val SIZE = 32 + + @inline def valueOf(floatValue: scala.Float): Float = new Float(floatValue) + + @inline def valueOf(s: String): Float = valueOf(parseFloat(s)) + + @inline def parseFloat(s: String): scala.Float = + Double.parseDouble(s).toFloat + + @inline def toString(f: scala.Float): String = + "" + f + + def compare(a: scala.Float, b: scala.Float): scala.Int = { + // NaN must equal itself, and be greater than anything else + if (isNaN(a)) { + if (isNaN(b)) 0 + else 1 + } else if (isNaN(b)) { + -1 + } else { + if (a == b) 0 + else if (a < b) -1 + else 1 + } + } + + @inline protected def equals(a: scala.Float, b: scala.Float): scala.Boolean = + a == b || (isNaN(a) && isNaN(b)) + + @inline def isNaN(v: scala.Float): scala.Boolean = + v != v + + @inline def isInfinite(v: scala.Float): scala.Boolean = + v == POSITIVE_INFINITY || v == NEGATIVE_INFINITY + + @inline def intBitsToFloat(bits: scala.Int): scala.Float = + scala.scalajs.runtime.Bits.intBitsToFloat(bits) + + @inline def floatToIntBits(value: scala.Float): scala.Int = + scala.scalajs.runtime.Bits.floatToIntBits(value) +} |