Deprecate floating point to integral types lesser than Int #KT-30360

This commit is contained in:
Abduqodiri Qurbonzoda
2020-01-17 06:07:49 +03:00
parent e459542e6f
commit 1203df7405
14 changed files with 255 additions and 32 deletions
@@ -670,11 +670,11 @@ internal fun Short.toByteExactOrNull(): Byte? {
}
internal fun Double.toByteExactOrNull(): Byte? {
return if (this in Byte.MIN_VALUE.toDouble()..Byte.MAX_VALUE.toDouble()) this.toByte() else null
return if (this in Byte.MIN_VALUE.toDouble()..Byte.MAX_VALUE.toDouble()) this.toInt().toByte() else null
}
internal fun Float.toByteExactOrNull(): Byte? {
return if (this in Byte.MIN_VALUE.toFloat()..Byte.MAX_VALUE.toFloat()) this.toByte() else null
return if (this in Byte.MIN_VALUE.toFloat()..Byte.MAX_VALUE.toFloat()) this.toInt().toByte() else null
}
internal fun Long.toIntExactOrNull(): Int? {
@@ -706,11 +706,11 @@ internal fun Long.toShortExactOrNull(): Short? {
}
internal fun Double.toShortExactOrNull(): Short? {
return if (this in Short.MIN_VALUE.toDouble()..Short.MAX_VALUE.toDouble()) this.toShort() else null
return if (this in Short.MIN_VALUE.toDouble()..Short.MAX_VALUE.toDouble()) this.toInt().toShort() else null
}
internal fun Float.toShortExactOrNull(): Short? {
return if (this in Short.MIN_VALUE.toFloat()..Short.MAX_VALUE.toFloat()) this.toShort() else null
return if (this in Short.MIN_VALUE.toFloat()..Short.MAX_VALUE.toFloat()) this.toInt().toShort() else null
}
/**
@@ -187,12 +187,55 @@ public class Byte private constructor() : Number(), Comparable<Byte> {
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Long): LongRange
/** Returns this value. */
public override fun toByte(): Byte
/**
* Converts this [Byte] value to [Char].
*
* If this value is non-negative, the resulting `Char` code is equal to this value.
*
* The least significant 8 bits of the resulting `Char` code are the same as the bits of this `Byte` value,
* whereas the most significant 8 bits are filled with the sign bit of this value.
*/
public override fun toChar(): Char
/**
* Converts this [Byte] value to [Short].
*
* The resulting `Short` value represents the same numerical value as this `Byte`.
*
* The least significant 8 bits of the resulting `Short` value are the same as the bits of this `Byte` value,
* whereas the most significant 8 bits are filled with the sign bit of this value.
*/
public override fun toShort(): Short
/**
* Converts this [Byte] value to [Int].
*
* The resulting `Int` value represents the same numerical value as this `Byte`.
*
* The least significant 8 bits of the resulting `Int` value are the same as the bits of this `Byte` value,
* whereas the most significant 24 bits are filled with the sign bit of this value.
*/
public override fun toInt(): Int
/**
* Converts this [Byte] value to [Long].
*
* The resulting `Long` value represents the same numerical value as this `Byte`.
*
* The least significant 8 bits of the resulting `Long` value are the same as the bits of this `Byte` value,
* whereas the most significant 56 bits are filled with the sign bit of this value.
*/
public override fun toLong(): Long
/**
* Converts this [Byte] value to [Float].
*
* The resulting `Float` value represents the same numerical value as this `Byte`.
*/
public override fun toFloat(): Float
/**
* Converts this [Byte] value to [Double].
*
* The resulting `Double` value represents the same numerical value as this `Byte`.
*/
public override fun toDouble(): Double
}
@@ -375,12 +418,53 @@ public class Short private constructor() : Number(), Comparable<Short> {
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Long): LongRange
/**
* Converts this [Short] value to [Byte].
*
* If this value is in [Byte.MIN_VALUE]..[Byte.MAX_VALUE], the resulting `Byte` value represents
* the same numerical value as this `Short`.
*
* The resulting `Byte` value is represented by the least significant 8 bits of this `Short` value.
*/
public override fun toByte(): Byte
/**
* Converts this [Short] value to [Char].
*
* The resulting `Char` code is equal to this value reinterpreted as an unsigned number,
* i.e. it has the same binary representation as this `Short`.
*/
public override fun toChar(): Char
/** Returns this value. */
public override fun toShort(): Short
/**
* Converts this [Short] value to [Int].
*
* The resulting `Int` value represents the same numerical value as this `Short`.
*
* The least significant 16 bits of the resulting `Int` value are the same as the bits of this `Short` value,
* whereas the most significant 16 bits are filled with the sign bit of this value.
*/
public override fun toInt(): Int
/**
* Converts this [Short] value to [Long].
*
* The resulting `Long` value represents the same numerical value as this `Short`.
*
* The least significant 16 bits of the resulting `Long` value are the same as the bits of this `Short` value,
* whereas the most significant 48 bits are filled with the sign bit of this value.
*/
public override fun toLong(): Long
/**
* Converts this [Short] value to [Float].
*
* The resulting `Float` value represents the same numerical value as this `Short`.
*/
public override fun toFloat(): Float
/**
* Converts this [Short] value to [Double].
*
* The resulting `Double` value represents the same numerical value as this `Short`.
*/
public override fun toDouble(): Double
}
@@ -578,12 +662,57 @@ public class Int private constructor() : Number(), Comparable<Int> {
/** Inverts the bits in this value. */
public fun inv(): Int
/**
* Converts this [Int] value to [Byte].
*
* If this value is in [Byte.MIN_VALUE]..[Byte.MAX_VALUE], the resulting `Byte` value represents
* the same numerical value as this `Int`.
*
* The resulting `Byte` value is represented by the least significant 8 bits of this `Int` value.
*/
public override fun toByte(): Byte
/**
* Converts this [Int] value to [Char].
*
* If this value is in the range of `Char` codes `Char.MIN_VALUE..Char.MAX_VALUE`,
* the resulting `Char` code is equal to this value.
*
* The resulting `Char` code is represented by the least significant 16 bits of this `Int` value.
*/
public override fun toChar(): Char
/**
* Converts this [Int] value to [Short].
*
* If this value is in [Short.MIN_VALUE]..[Short.MAX_VALUE], the resulting `Short` value represents
* the same numerical value as this `Int`.
*
* The resulting `Short` value is represented by the least significant 16 bits of this `Int` value.
*/
public override fun toShort(): Short
/** Returns this value. */
public override fun toInt(): Int
/**
* Converts this [Int] value to [Long].
*
* The resulting `Long` value represents the same numerical value as this `Int`.
*
* The least significant 32 bits of the resulting `Long` value are the same as the bits of this `Int` value,
* whereas the most significant 32 bits are filled with the sign bit of this value.
*/
public override fun toLong(): Long
/**
* Converts this [Int] value to [Float].
*
* The resulting value is the closest `Float` to this `Int` value.
* In case when this `Int` value is exactly between two `Float`s,
* the one with zero at least significant bit of mantissa is selected.
*/
public override fun toFloat(): Float
/**
* Converts this [Int] value to [Double].
*
* The resulting `Double` value represents the same numerical value as this `Int`.
*/
public override fun toDouble(): Double
}
@@ -766,12 +895,49 @@ public class Float private constructor() : Number(), Comparable<Float> {
public operator fun unaryMinus(): Float
/**
* Converts this [Float] value to [Byte].
*
* The resulting `Byte` value is equal to `this.toInt().toByte()`.
*/
@Deprecated("Unclear conversion. To achieve the same result convert to Int explicitly and then to Byte.", ReplaceWith("toInt().toByte()"))
public override fun toByte(): Byte
/**
* Converts this [Float] value to [Char].
*
* The resulting `Char` value is equal to `this.toInt().toChar()`.
*/
public override fun toChar(): Char
/**
* Converts this [Float] value to [Short].
*
* The resulting `Short` value is equal to `this.toInt().toShort()`.
*/
@Deprecated("Unclear conversion. To achieve the same result convert to Int explicitly and then to Short.", ReplaceWith("toInt().toShort()"))
public override fun toShort(): Short
/**
* Converts this [Float] value to [Int].
*
* The fractional part, if any, is rounded down towards zero.
* Returns zero if this `Float` value is `NaN`, [Int.MIN_VALUE] if it's less than `Int.MIN_VALUE`,
* [Int.MAX_VALUE] if it's bigger than `Int.MAX_VALUE`.
*/
public override fun toInt(): Int
/**
* Converts this [Float] value to [Long].
*
* The fractional part, if any, is rounded down towards zero.
* Returns zero if this `Float` value is `NaN`, [Long.MIN_VALUE] if it's less than `Long.MIN_VALUE`,
* [Long.MAX_VALUE] if it's bigger than `Long.MAX_VALUE`.
*/
public override fun toLong(): Long
/** Returns this value. */
public override fun toFloat(): Float
/**
* Converts this [Float] value to [Double].
*
* The resulting `Double` value represents the same numerical value as this `Float`.
*/
public override fun toDouble(): Double
}
@@ -954,12 +1120,51 @@ public class Double private constructor() : Number(), Comparable<Double> {
public operator fun unaryMinus(): Double
/**
* Converts this [Double] value to [Byte].
*
* The resulting `Byte` value is equal to `this.toInt().toByte()`.
*/
@Deprecated("Unclear conversion. To achieve the same result convert to Int explicitly and then to Byte.", ReplaceWith("toInt().toByte()"))
public override fun toByte(): Byte
/**
* Converts this [Double] value to [Char].
*
* The resulting `Char` value is equal to `this.toInt().toChar()`.
*/
public override fun toChar(): Char
/**
* Converts this [Double] value to [Short].
*
* The resulting `Short` value is equal to `this.toInt().toShort()`.
*/
@Deprecated("Unclear conversion. To achieve the same result convert to Int explicitly and then to Short.", ReplaceWith("toInt().toShort()"))
public override fun toShort(): Short
/**
* Converts this [Double] value to [Int].
*
* The fractional part, if any, is rounded down towards zero.
* Returns zero if this `Double` value is `NaN`, [Int.MIN_VALUE] if it's less than `Int.MIN_VALUE`,
* [Int.MAX_VALUE] if it's bigger than `Int.MAX_VALUE`.
*/
public override fun toInt(): Int
/**
* Converts this [Double] value to [Long].
*
* The fractional part, if any, is rounded down towards zero.
* Returns zero if this `Double` value is `NaN`, [Long.MIN_VALUE] if it's less than `Long.MIN_VALUE`,
* [Long.MAX_VALUE] if it's bigger than `Long.MAX_VALUE`.
*/
public override fun toLong(): Long
/**
* Converts this [Double] value to [Float].
*
* The resulting value is the closest `Float` to this `Double` value.
* In case when this `Double` value is exactly between two `Float`s,
* the one with zero at least significant bit of mantissa is selected.
*/
public override fun toFloat(): Float
/** Returns this value. */
public override fun toDouble(): Double
}
@@ -477,7 +477,7 @@ class ArraysTest {
expect(3.8) { arrayOf(1, 2, 5, 8, 3).average() }
expect(2.1) { arrayOf(1.6, 2.6, 3.6, 0.6).average() }
expect(100.0) { arrayOf<Byte>(100, 100, 100, 100, 100, 100).average() }
expect(0) { arrayOf<Short>(1, -1, 2, -2, 3, -3).average().toShort() }
expect(0) { arrayOf<Short>(1, -1, 2, -2, 3, -3).average().toInt() }
// TODO: Property based tests
// for each arr with size 1 arr.average() == arr[0]
// for each arr with size > 0 arr.average() = arr.sum().toDouble() / arr.size()