Implement fill extension function for UArrays (KT-28339)
This commit is contained in:
committed by
Ilya Gorbunov
parent
6b92190726
commit
876dff6d22
@@ -142,3 +142,38 @@ public fun UShortArray.binarySearch(element: UShort, fromIndex: Int = 0, toIndex
|
|||||||
return -(low + 1) // key not found
|
return -(low + 1) // key not found
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills original array with the provided value.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.3")
|
||||||
|
@ExperimentalUnsignedTypes
|
||||||
|
public fun UIntArray.fill(element: UInt, fromIndex: Int = 0, toIndex: Int = size): Unit {
|
||||||
|
storage.fill(element.toInt(), fromIndex, toIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills original array with the provided value.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.3")
|
||||||
|
@ExperimentalUnsignedTypes
|
||||||
|
public fun ULongArray.fill(element: ULong, fromIndex: Int = 0, toIndex: Int = size): Unit {
|
||||||
|
storage.fill(element.toLong(), fromIndex, toIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills original array with the provided value.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.3")
|
||||||
|
@ExperimentalUnsignedTypes
|
||||||
|
public fun UByteArray.fill(element: UByte, fromIndex: Int = 0, toIndex: Int = size): Unit {
|
||||||
|
storage.fill(element.toByte(), fromIndex, toIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills original array with the provided value.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.3")
|
||||||
|
@ExperimentalUnsignedTypes
|
||||||
|
public fun UShortArray.fill(element: UShort, fromIndex: Int = 0, toIndex: Int = size): Unit {
|
||||||
|
storage.fill(element.toShort(), fromIndex, toIndex)
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
package test.collections
|
package test.collections
|
||||||
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertTrue
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFailsWith
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
@@ -66,6 +67,55 @@ class UArrayJVMTest {
|
|||||||
test(array, UIntArray::binarySearch, operations, UInt::toUInt)
|
test(array, UIntArray::binarySearch, operations, UInt::toUInt)
|
||||||
test(array.toULongArray(), ULongArray::binarySearch, operations, UInt::toULong)
|
test(array.toULongArray(), ULongArray::binarySearch, operations, UInt::toULong)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun fill() {
|
||||||
|
fun <A, E> testFailures(array: A, fill: A.(E, Int, Int) -> Unit, element: E, arraySize: Int) {
|
||||||
|
assertFailsWith<ArrayIndexOutOfBoundsException> {
|
||||||
|
array.fill(element, -1, arraySize)
|
||||||
|
}
|
||||||
|
assertFailsWith<ArrayIndexOutOfBoundsException> {
|
||||||
|
array.fill(element, 0, arraySize + 1)
|
||||||
|
}
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
array.fill(element, 1, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
testFailures(UByteArray(5) { it.toUByte() }, UByteArray::fill, 0u, 5)
|
||||||
|
testFailures(UShortArray(5) { it.toUShort() }, UShortArray::fill, 0u, 5)
|
||||||
|
testFailures(UIntArray(5) { it.toUInt() }, UIntArray::fill, 0u, 5)
|
||||||
|
testFailures(ULongArray(5) { it.toULong() }, ULongArray::fill, 0u, 5)
|
||||||
|
|
||||||
|
fun <A, E> test(
|
||||||
|
array: UIntArray,
|
||||||
|
fill: A.(E, Int, Int) -> Unit,
|
||||||
|
operations: List<OperationOnRange<UInt, UIntArray>>,
|
||||||
|
arrayTransform: UIntArray.() -> A,
|
||||||
|
elementTransform: UInt.() -> E,
|
||||||
|
contentEquals: A.(A) -> Boolean
|
||||||
|
) {
|
||||||
|
for (o in operations) {
|
||||||
|
val result = array.arrayTransform()
|
||||||
|
result.fill(o.element.elementTransform(), o.fromIndex, o.toIndex)
|
||||||
|
assertTrue(o.expectedResult.arrayTransform().contentEquals(result))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val array = UIntArray(5) { it.toUInt() }
|
||||||
|
|
||||||
|
val operations = listOf(
|
||||||
|
OperationOnRange(5u, 1, 4, uintArrayOf(0u, 5u, 5u, 5u, 4u)),
|
||||||
|
OperationOnRange(1u, 0, 5, uintArrayOf(1u, 1u, 1u, 1u, 1u)),
|
||||||
|
OperationOnRange(2u, 0, 3, uintArrayOf(2u, 2u, 2u, 3u, 4u)),
|
||||||
|
OperationOnRange(3u, 2, 5, uintArrayOf(0u, 1u, 3u, 3u, 3u))
|
||||||
|
)
|
||||||
|
|
||||||
|
test(array, UByteArray::fill, operations, UIntArray::toUByteArray, UInt::toUByte, UByteArray::contentEquals)
|
||||||
|
test(array, UShortArray::fill, operations, UIntArray::toUShortArray, UInt::toUShort, UShortArray::contentEquals)
|
||||||
|
test(array, UIntArray::fill, operations, UIntArray::copyOf, UInt::toUInt, UIntArray::contentEquals)
|
||||||
|
test(array, ULongArray::fill, operations, UIntArray::toULongArray, UInt::toULong, ULongArray::contentEquals)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+8
@@ -2307,6 +2307,14 @@ public final class kotlin/collections/UArraysKt {
|
|||||||
public static final fun contentToString-GBYM_sE ([B)Ljava/lang/String;
|
public static final fun contentToString-GBYM_sE ([B)Ljava/lang/String;
|
||||||
public static final fun contentToString-QwZRm1k ([J)Ljava/lang/String;
|
public static final fun contentToString-QwZRm1k ([J)Ljava/lang/String;
|
||||||
public static final fun contentToString-rL5Bavg ([S)Ljava/lang/String;
|
public static final fun contentToString-rL5Bavg ([S)Ljava/lang/String;
|
||||||
|
public static final fun fill-2fe2U9s ([IIII)V
|
||||||
|
public static synthetic fun fill-2fe2U9s$default ([IIIIILjava/lang/Object;)V
|
||||||
|
public static final fun fill-EtDCXyQ ([SSII)V
|
||||||
|
public static synthetic fun fill-EtDCXyQ$default ([SSIIILjava/lang/Object;)V
|
||||||
|
public static final fun fill-K6DWlUc ([JJII)V
|
||||||
|
public static synthetic fun fill-K6DWlUc$default ([JJIIILjava/lang/Object;)V
|
||||||
|
public static final fun fill-WpHrYlw ([BBII)V
|
||||||
|
public static synthetic fun fill-WpHrYlw$default ([BBIIILjava/lang/Object;)V
|
||||||
public static final fun plus-CFIt9YE ([ILjava/util/Collection;)[I
|
public static final fun plus-CFIt9YE ([ILjava/util/Collection;)[I
|
||||||
public static final fun plus-kzHmqpY ([JLjava/util/Collection;)[J
|
public static final fun plus-kzHmqpY ([JLjava/util/Collection;)[J
|
||||||
public static final fun plus-ojwP5H8 ([SLjava/util/Collection;)[S
|
public static final fun plus-ojwP5H8 ([SLjava/util/Collection;)[S
|
||||||
|
|||||||
@@ -1205,7 +1205,7 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
|
|
||||||
val f_fill = fn("fill(element: T, fromIndex: Int = 0, toIndex: Int = size)") {
|
val f_fill = fn("fill(element: T, fromIndex: Int = 0, toIndex: Int = size)") {
|
||||||
platforms(Platform.JVM)
|
platforms(Platform.JVM)
|
||||||
include(InvariantArraysOfObjects, ArraysOfPrimitives)
|
include(InvariantArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
|
||||||
} builder {
|
} builder {
|
||||||
doc { "Fills original array with the provided value." }
|
doc { "Fills original array with the provided value." }
|
||||||
returns("Unit")
|
returns("Unit")
|
||||||
@@ -1214,6 +1214,13 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
java.util.Arrays.fill(this, fromIndex, toIndex, element)
|
java.util.Arrays.fill(this, fromIndex, toIndex, element)
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
specialFor(ArraysOfUnsigned) {
|
||||||
|
val signedPrimitiveName = primitive!!.name.drop(1)
|
||||||
|
body {
|
||||||
|
"storage.fill(element.to$signedPrimitiveName(), fromIndex, toIndex)"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val f_binarySearch = fn("binarySearch(element: T, fromIndex: Int = 0, toIndex: Int = size)") {
|
val f_binarySearch = fn("binarySearch(element: T, fromIndex: Int = 0, toIndex: Int = size)") {
|
||||||
|
|||||||
Reference in New Issue
Block a user