copyInto: copying elements between two arrays
#KT-25874 Fixed
This commit is contained in:
@@ -5572,6 +5572,177 @@ public expect fun BooleanArray.contentToString(): String
|
||||
@SinceKotlin("1.1")
|
||||
public expect fun CharArray.contentToString(): String
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun <T> Array<out T>.copyInto(destination: Array<T>, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): Array<T>
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun ByteArray.copyInto(destination: ByteArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): ByteArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun ShortArray.copyInto(destination: ShortArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): ShortArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun IntArray.copyInto(destination: IntArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): IntArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun LongArray.copyInto(destination: LongArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): LongArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun FloatArray.copyInto(destination: FloatArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): FloatArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun DoubleArray.copyInto(destination: DoubleArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): DoubleArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun BooleanArray.copyInto(destination: BooleanArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): BooleanArray
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public expect fun CharArray.copyInto(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): CharArray
|
||||
|
||||
/**
|
||||
* Returns new array which is a copy of the original array.
|
||||
*
|
||||
|
||||
@@ -225,6 +225,98 @@ public fun UShortArray.contentToString(): String {
|
||||
return joinToString(", ", "[", "]")
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun UIntArray.copyInto(destination: UIntArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): UIntArray {
|
||||
return UIntArray(storage.copyInto(destination.storage, destinationOffset, startIndex, endIndex))
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun ULongArray.copyInto(destination: ULongArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): ULongArray {
|
||||
return ULongArray(storage.copyInto(destination.storage, destinationOffset, startIndex, endIndex))
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun UByteArray.copyInto(destination: UByteArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): UByteArray {
|
||||
return UByteArray(storage.copyInto(destination.storage, destinationOffset, startIndex, endIndex))
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun UShortArray.copyInto(destination: UShortArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1): UShortArray {
|
||||
return UShortArray(storage.copyInto(destination.storage, destinationOffset, startIndex, endIndex))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns new array which is a copy of the original array.
|
||||
*
|
||||
|
||||
@@ -407,6 +407,222 @@ public actual fun CharArray.contentToString(): String {
|
||||
definedExternally
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun <T> Array<out T>.copyInto(destination: Array<T>, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): Array<T> {
|
||||
arrayCopy(this, destination, destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun ByteArray.copyInto(destination: ByteArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): ByteArray {
|
||||
arrayCopy(this.unsafeCast<Array<Byte>>(), destination.unsafeCast<Array<Byte>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun ShortArray.copyInto(destination: ShortArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): ShortArray {
|
||||
arrayCopy(this.unsafeCast<Array<Short>>(), destination.unsafeCast<Array<Short>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun IntArray.copyInto(destination: IntArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): IntArray {
|
||||
arrayCopy(this.unsafeCast<Array<Int>>(), destination.unsafeCast<Array<Int>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun LongArray.copyInto(destination: LongArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): LongArray {
|
||||
arrayCopy(this.unsafeCast<Array<Long>>(), destination.unsafeCast<Array<Long>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun FloatArray.copyInto(destination: FloatArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): FloatArray {
|
||||
arrayCopy(this.unsafeCast<Array<Float>>(), destination.unsafeCast<Array<Float>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun DoubleArray.copyInto(destination: DoubleArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): DoubleArray {
|
||||
arrayCopy(this.unsafeCast<Array<Double>>(), destination.unsafeCast<Array<Double>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun BooleanArray.copyInto(destination: BooleanArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): BooleanArray {
|
||||
arrayCopy(this.unsafeCast<Array<Boolean>>(), destination.unsafeCast<Array<Boolean>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual inline fun CharArray.copyInto(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): CharArray {
|
||||
arrayCopy(this.unsafeCast<Array<Char>>(), destination.unsafeCast<Array<Char>>(), destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns new array which is a copy of the original array.
|
||||
*
|
||||
|
||||
@@ -126,6 +126,27 @@ internal actual fun <T> arrayOfNulls(reference: Array<T>, size: Int): Array<T> {
|
||||
return arrayOfNulls<Any>(size).unsafeCast<Array<T>>()
|
||||
}
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
@PublishedApi
|
||||
@JsName("arrayCopy")
|
||||
internal fun <T> arrayCopy(source: Array<out T>, destination: Array<in T>, destinationOffset: Int, startIndex: Int, endIndex: Int) {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) source.size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
AbstractList.checkRangeIndexes(startIndex, endIndex, source.size)
|
||||
val rangeSize = endIndex - startIndex
|
||||
AbstractList.checkRangeIndexes(destinationOffset, destinationOffset + rangeSize, destination.size)
|
||||
|
||||
if (source !== destination || destinationOffset <= startIndex) {
|
||||
for (index in 0 until rangeSize) {
|
||||
destination[destinationOffset + index] = source[startIndex + index]
|
||||
}
|
||||
} else {
|
||||
for (index in rangeSize - 1 downTo 0) {
|
||||
destination[destinationOffset + index] = source[startIndex + index]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// no singleton map implementation in js, return map as is
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
internal actual inline fun <K, V> Map<K, V>.toSingletonMapOrSelf(): Map<K, V> = this
|
||||
|
||||
@@ -597,6 +597,231 @@ public actual inline fun CharArray.contentToString(): String {
|
||||
return java.util.Arrays.toString(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun <T> Array<out T>.copyInto(destination: Array<T>, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): Array<T> {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun ByteArray.copyInto(destination: ByteArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): ByteArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun ShortArray.copyInto(destination: ShortArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): ShortArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun IntArray.copyInto(destination: IntArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): IntArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun LongArray.copyInto(destination: LongArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): LongArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun FloatArray.copyInto(destination: FloatArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): FloatArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun DoubleArray.copyInto(destination: DoubleArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): DoubleArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun BooleanArray.copyInto(destination: BooleanArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): BooleanArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this array or its subrange into the [destination] array and returns that array.
|
||||
*
|
||||
* It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
*
|
||||
* @param destination the array to copy to.
|
||||
* @param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
* @param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
* @param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
*
|
||||
* @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
* @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
* or when that index is out of the [destination] array indices range.
|
||||
*
|
||||
* @return the [destination] array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
public actual fun CharArray.copyInto(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size): CharArray {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns new array which is a copy of the original array.
|
||||
*
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
package test.collections
|
||||
|
||||
import test.assertStaticTypeIs
|
||||
import test.assertTypeEquals
|
||||
import test.collections.behaviors.*
|
||||
import test.comparisons.STRING_CASE_INSENSITIVE_ORDER
|
||||
import kotlin.test.*
|
||||
@@ -789,6 +791,98 @@ class ArraysTest {
|
||||
}
|
||||
|
||||
|
||||
@Test fun copyRangeInto() {
|
||||
fun <T> doTest(
|
||||
copyInto: T.(T, Int, Int, Int) -> T,
|
||||
assertTEquals: (T, T, String) -> Unit,
|
||||
toStringT: T.() -> String,
|
||||
dest: T, newValues: T,
|
||||
result1: T, result2: T, result3: T
|
||||
) {
|
||||
newValues.copyInto(dest, 0, 1, 3)
|
||||
assertTypeEquals(result1, dest)
|
||||
assertTEquals(result1, dest, "Copying from newValues: ${result1.toStringT()}, ${dest.toStringT()}")
|
||||
|
||||
dest.copyInto(dest, 0, 1, 3)
|
||||
assertTEquals(result2, dest, "Overlapping backward copy: ${result2.toStringT()}, ${dest.toStringT()}")
|
||||
|
||||
dest.copyInto(dest, 1, 0, 2)
|
||||
assertTEquals(result3, dest, "Overlapping forward copy: ${result2.toStringT()}, ${dest.toStringT()}")
|
||||
|
||||
for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0)) {
|
||||
val bounds = "start: $start, end: $end"
|
||||
val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
|
||||
assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
|
||||
}
|
||||
for (destIndex in listOf(-1, 2, 4)) {
|
||||
assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
|
||||
}
|
||||
}
|
||||
|
||||
doTest(
|
||||
Array<String>::copyInto, { e, a, msg -> assertArrayNotSameButEquals(e, a, msg) }, Array<*>::contentToString,
|
||||
arrayOf("a", "b", "c"), arrayOf("e", "f", "g"),
|
||||
arrayOf("f", "g", "c"), arrayOf("g", "c", "c"), arrayOf("g", "g", "c")
|
||||
)
|
||||
|
||||
doTest(
|
||||
IntArray::copyInto, ::assertArrayNotSameButEquals, IntArray::contentToString,
|
||||
intArrayOf(1, 2, 3), intArrayOf(4, 5, 6),
|
||||
intArrayOf(5, 6, 3), intArrayOf(6, 3, 3), intArrayOf(6, 6, 3)
|
||||
)
|
||||
|
||||
doTest(
|
||||
LongArray::copyInto, ::assertArrayNotSameButEquals, LongArray::contentToString,
|
||||
longArrayOf(1, 2, 3), longArrayOf(4, 5, 6),
|
||||
longArrayOf(5, 6, 3), longArrayOf(6, 3, 3), longArrayOf(6, 6, 3)
|
||||
)
|
||||
|
||||
doTest(
|
||||
ByteArray::copyInto, ::assertArrayNotSameButEquals, ByteArray::contentToString,
|
||||
byteArrayOf(1, 2, 3), byteArrayOf(4, 5, 6),
|
||||
byteArrayOf(5, 6, 3), byteArrayOf(6, 3, 3), byteArrayOf(6, 6, 3)
|
||||
)
|
||||
|
||||
doTest(
|
||||
CharArray::copyInto, ::assertArrayNotSameButEquals, CharArray::contentToString,
|
||||
charArrayOf('a', 'b', 'c'), charArrayOf('e', 'f', 'g'),
|
||||
charArrayOf('f', 'g', 'c'), charArrayOf('g', 'c', 'c'), charArrayOf('g', 'g', 'c')
|
||||
)
|
||||
|
||||
doTest(
|
||||
UIntArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, UIntArray::contentToString,
|
||||
uintArrayOf(1, 2, 3), uintArrayOf(4, 5, 6),
|
||||
uintArrayOf(5, 6, 3), uintArrayOf(6, 3, 3), uintArrayOf(6, 6, 3)
|
||||
)
|
||||
|
||||
doTest(
|
||||
ULongArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, ULongArray::contentToString,
|
||||
ulongArrayOf(1, 2, 3), ulongArrayOf(4, 5, 6),
|
||||
ulongArrayOf(5, 6, 3), ulongArrayOf(6, 3, 3), ulongArrayOf(6, 6, 3)
|
||||
)
|
||||
|
||||
doTest(
|
||||
UByteArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, UByteArray::contentToString,
|
||||
ubyteArrayOf(1, 2, 3), ubyteArrayOf(4, 5, 6),
|
||||
ubyteArrayOf(5, 6, 3), ubyteArrayOf(6, 3, 3), ubyteArrayOf(6, 6, 3)
|
||||
)
|
||||
}
|
||||
|
||||
@Test fun copyRangeIntoVarianceTest() {
|
||||
val sourceArr: Array<out Int> = arrayOf(1, 2, 3)
|
||||
val targetAnyArr: Array<Any?> = arrayOfNulls<Any?>(3)
|
||||
val targetNumberArr: Array<Number> = Array<Number>(3) { 0.0 }
|
||||
val targetArrProjection: Array<in Number> = targetNumberArr
|
||||
|
||||
val c1 = sourceArr.copyInto(targetAnyArr)
|
||||
assertStaticTypeIs<Array<Any?>>(c1)
|
||||
|
||||
val c2 = sourceArr.copyInto(targetNumberArr)
|
||||
assertStaticTypeIs<Array<Number>>(c2)
|
||||
|
||||
val c3 = sourceArr.copyInto(targetArrProjection)
|
||||
assertStaticTypeIs<Array<in Number>>(c3)
|
||||
}
|
||||
|
||||
@Test fun reduceIndexed() {
|
||||
expect(-1) { intArrayOf(1, 2, 3).reduceIndexed { index, a, b -> index + a - b } }
|
||||
|
||||
+18
@@ -998,6 +998,24 @@ public final class kotlin/collections/ArraysKt {
|
||||
public static final fun contains ([Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
public static final fun contains ([SS)Z
|
||||
public static final fun contains ([ZZ)Z
|
||||
public static final fun copyInto ([B[BIII)[B
|
||||
public static final fun copyInto ([C[CIII)[C
|
||||
public static final fun copyInto ([D[DIII)[D
|
||||
public static final fun copyInto ([F[FIII)[F
|
||||
public static final fun copyInto ([I[IIII)[I
|
||||
public static final fun copyInto ([J[JIII)[J
|
||||
public static final fun copyInto ([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object;
|
||||
public static final fun copyInto ([S[SIII)[S
|
||||
public static final fun copyInto ([Z[ZIII)[Z
|
||||
public static synthetic fun copyInto$default ([B[BIIIILjava/lang/Object;)[B
|
||||
public static synthetic fun copyInto$default ([C[CIIIILjava/lang/Object;)[C
|
||||
public static synthetic fun copyInto$default ([D[DIIIILjava/lang/Object;)[D
|
||||
public static synthetic fun copyInto$default ([F[FIIIILjava/lang/Object;)[F
|
||||
public static synthetic fun copyInto$default ([I[IIIIILjava/lang/Object;)[I
|
||||
public static synthetic fun copyInto$default ([J[JIIIILjava/lang/Object;)[J
|
||||
public static synthetic fun copyInto$default ([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object;
|
||||
public static synthetic fun copyInto$default ([S[SIIIILjava/lang/Object;)[S
|
||||
public static synthetic fun copyInto$default ([Z[ZIIIILjava/lang/Object;)[Z
|
||||
public static final fun copyOfRange ([BII)[B
|
||||
public static final fun copyOfRange ([CII)[C
|
||||
public static final fun copyOfRange ([DII)[D
|
||||
|
||||
@@ -465,6 +465,69 @@ object ArrayOps : TemplateGroupBase() {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Remove -1 from common signature
|
||||
val f_copyInto = fn("copyInto(destination: SELF, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = -1)") {
|
||||
include(InvariantArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
|
||||
} builder {
|
||||
since("1.3")
|
||||
returns("SELF")
|
||||
|
||||
doc {
|
||||
"""
|
||||
Copies this array or its subrange into the [destination] array and returns that array.
|
||||
|
||||
It's allowed to pass the same array in the [destination] and even specify the subrange so that it overlaps with the destination range.
|
||||
|
||||
@param destination the array to copy to.
|
||||
@param destinationOffset the position in the [destination] array to copy to, 0 by default.
|
||||
@param startIndex the beginning (inclusive) of the subrange to copy, 0 by default.
|
||||
@param endIndex the end (exclusive) of the subrange to copy, size of this array by default.
|
||||
|
||||
@throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this array indices or when `startIndex > endIndex`.
|
||||
@throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationIndex],
|
||||
or when that index is out of the [destination] array indices range.
|
||||
|
||||
@return the [destination] array.
|
||||
"""
|
||||
}
|
||||
|
||||
specialFor(ArraysOfUnsigned) {
|
||||
inlineOnly()
|
||||
body {
|
||||
"return SELF(storage.copyInto(destination.storage, destinationOffset, startIndex, endIndex))"
|
||||
}
|
||||
}
|
||||
specialFor(ArraysOfPrimitives, InvariantArraysOfObjects) {
|
||||
specialFor(InvariantArraysOfObjects) {
|
||||
receiver("Array<out T>")
|
||||
}
|
||||
on(Platform.JVM) {
|
||||
suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
signature("copyInto(destination: SELF, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size)")
|
||||
body {
|
||||
"""
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val endIndex = if (endIndex == -1) size else endIndex // TODO: Remove when default value from expect is fixed
|
||||
System.arraycopy(this, startIndex, destination, destinationOffset, endIndex - startIndex)
|
||||
return destination
|
||||
"""
|
||||
}
|
||||
}
|
||||
on(Platform.JS) {
|
||||
suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS")
|
||||
signature("copyInto(destination: SELF, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = size)")
|
||||
inlineOnly()
|
||||
body {
|
||||
val cast = ".unsafeCast<Array<$primitive>>()".takeIf { family == ArraysOfPrimitives } ?: ""
|
||||
"""
|
||||
arrayCopy(this$cast, destination$cast, destinationOffset, startIndex, endIndex)
|
||||
return destination
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val f_copyOfRangeJvmImpl = fn("copyOfRangeImpl(fromIndex: Int, toIndex: Int)") {
|
||||
include(InvariantArraysOfObjects, ArraysOfPrimitives)
|
||||
platforms(Platform.JVM)
|
||||
|
||||
Reference in New Issue
Block a user