Compare floating point values asList elements in total order #KT-28753
This commit is contained in:
@@ -192,10 +192,10 @@ public actual fun FloatArray.asList(): List<Float> {
|
|||||||
return object : AbstractList<Float>(), RandomAccess {
|
return object : AbstractList<Float>(), RandomAccess {
|
||||||
override val size: Int get() = this@asList.size
|
override val size: Int get() = this@asList.size
|
||||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||||
override fun contains(element: Float): Boolean = this@asList.contains(element)
|
override fun contains(element: Float): Boolean = this@asList.any { it.toBits() == element.toBits() }
|
||||||
override fun get(index: Int): Float = this@asList[index]
|
override fun get(index: Int): Float = this@asList[index]
|
||||||
override fun indexOf(element: Float): Int = this@asList.indexOf(element)
|
override fun indexOf(element: Float): Int = this@asList.indexOfFirst { it.toBits() == element.toBits() }
|
||||||
override fun lastIndexOf(element: Float): Int = this@asList.lastIndexOf(element)
|
override fun lastIndexOf(element: Float): Int = this@asList.indexOfLast { it.toBits() == element.toBits() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,10 +206,10 @@ public actual fun DoubleArray.asList(): List<Double> {
|
|||||||
return object : AbstractList<Double>(), RandomAccess {
|
return object : AbstractList<Double>(), RandomAccess {
|
||||||
override val size: Int get() = this@asList.size
|
override val size: Int get() = this@asList.size
|
||||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||||
override fun contains(element: Double): Boolean = this@asList.contains(element)
|
override fun contains(element: Double): Boolean = this@asList.any { it.toBits() == element.toBits() }
|
||||||
override fun get(index: Int): Double = this@asList[index]
|
override fun get(index: Int): Double = this@asList[index]
|
||||||
override fun indexOf(element: Double): Int = this@asList.indexOf(element)
|
override fun indexOf(element: Double): Int = this@asList.indexOfFirst { it.toBits() == element.toBits() }
|
||||||
override fun lastIndexOf(element: Double): Int = this@asList.lastIndexOf(element)
|
override fun lastIndexOf(element: Double): Int = this@asList.indexOfLast { it.toBits() == element.toBits() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -824,6 +824,26 @@ class ArraysTest {
|
|||||||
assertEquals(10, intsAsList[1], "Should reflect changes in original array")
|
assertEquals(10, intsAsList[1], "Should reflect changes in original array")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test fun asListInFloatingPrimitiveArrays() {
|
||||||
|
fun <T> testTotalOrder(expected: List<T>, actual: List<T>, element: T) = compare(expected, actual) {
|
||||||
|
propertyEquals { contains(element) }
|
||||||
|
propertyEquals { indexOf(element) }
|
||||||
|
propertyEquals { lastIndexOf(element) }
|
||||||
|
}
|
||||||
|
|
||||||
|
testTotalOrder(listOf(Float.NaN), floatArrayOf(Float.NaN).asList(), Float.NaN)
|
||||||
|
testTotalOrder(listOf(-0.0f), floatArrayOf(-0.0f).asList(), -0.0f)
|
||||||
|
testTotalOrder(listOf(-0.0f), floatArrayOf(-0.0f).asList(), 0.0f)
|
||||||
|
testTotalOrder(listOf(0.0f), floatArrayOf(0.0f).asList(), 0.0f)
|
||||||
|
testTotalOrder(listOf(0.0f), floatArrayOf(0.0f).asList(), -0.0f)
|
||||||
|
|
||||||
|
testTotalOrder(listOf(Double.NaN), doubleArrayOf(Double.NaN).asList(), Double.NaN)
|
||||||
|
testTotalOrder(listOf(-0.0), doubleArrayOf(-0.0).asList(), -0.0)
|
||||||
|
testTotalOrder(listOf(-0.0), doubleArrayOf(-0.0).asList(), 0.0)
|
||||||
|
testTotalOrder(listOf(0.0), doubleArrayOf(0.0).asList(), 0.0)
|
||||||
|
testTotalOrder(listOf(0.0), doubleArrayOf(0.0).asList(), -0.0)
|
||||||
|
}
|
||||||
|
|
||||||
@Test fun toPrimitiveArray() {
|
@Test fun toPrimitiveArray() {
|
||||||
val genericArray: Array<Int> = arrayOf(1, 2, 3)
|
val genericArray: Array<Int> = arrayOf(1, 2, 3)
|
||||||
val primitiveArray: IntArray = genericArray.toIntArray()
|
val primitiveArray: IntArray = genericArray.toIntArray()
|
||||||
|
|||||||
@@ -1467,16 +1467,26 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
body { """return ArrayList<T>(this.unsafeCast<Array<Any?>>())""" }
|
body { """return ArrayList<T>(this.unsafeCast<Array<Any?>>())""" }
|
||||||
}
|
}
|
||||||
|
|
||||||
val objectLiteralImpl = """
|
val objectLiteralImpl = if (primitive in PrimitiveType.floatingPointPrimitives) """
|
||||||
return object : AbstractList<T>(), RandomAccess {
|
return object : AbstractList<T>(), RandomAccess {
|
||||||
override val size: Int get() = this@asList.size
|
override val size: Int get() = this@asList.size
|
||||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||||
override fun contains(element: T): Boolean = this@asList.contains(element)
|
override fun contains(element: T): Boolean = this@asList.any { it.toBits() == element.toBits() }
|
||||||
override fun get(index: Int): T = this@asList[index]
|
override fun get(index: Int): T = this@asList[index]
|
||||||
override fun indexOf(element: T): Int = this@asList.indexOf(element)
|
override fun indexOf(element: T): Int = this@asList.indexOfFirst { it.toBits() == element.toBits() }
|
||||||
override fun lastIndexOf(element: T): Int = this@asList.lastIndexOf(element)
|
override fun lastIndexOf(element: T): Int = this@asList.indexOfLast { it.toBits() == element.toBits() }
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
else """
|
||||||
|
return object : AbstractList<T>(), RandomAccess {
|
||||||
|
override val size: Int get() = this@asList.size
|
||||||
|
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||||
|
override fun contains(element: T): Boolean = this@asList.contains(element)
|
||||||
|
override fun get(index: Int): T = this@asList[index]
|
||||||
|
override fun indexOf(element: T): Int = this@asList.indexOf(element)
|
||||||
|
override fun lastIndexOf(element: T): Int = this@asList.lastIndexOf(element)
|
||||||
|
}
|
||||||
|
"""
|
||||||
specialFor(ArraysOfPrimitives, ArraysOfUnsigned) {
|
specialFor(ArraysOfPrimitives, ArraysOfUnsigned) {
|
||||||
on(Platform.JVM) {
|
on(Platform.JVM) {
|
||||||
body { objectLiteralImpl }
|
body { objectLiteralImpl }
|
||||||
|
|||||||
Reference in New Issue
Block a user