From 7010bf2c2021128ae9655df9b0aa3dc418be5324 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Thu, 1 Jun 2023 13:26:08 +0300 Subject: [PATCH] Move copyToArrayImpl implementation to Common source set --- .../kotlin/kotlin/collections/ArraysNative.kt | 13 ------- .../stdlib/js/src/kotlin/collectionJs.kt | 20 ++--------- .../src/kotlin/collections/Arrays.kt | 11 ++---- .../src/kotlin/collections/Collections.kt | 34 +++++++++++++++++++ .../wasm/src/kotlin/collections/ArraysWasm.kt | 15 +------- 5 files changed, 40 insertions(+), 53 deletions(-) diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt index b9dc9d1ea12..747b7a53fc5 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt @@ -18,17 +18,4 @@ public actual inline fun Collection.toTypedArray(): Array { for (element in this) result[index++] = element @Suppress("UNCHECKED_CAST") return result as Array -} - -@Suppress("UNCHECKED_CAST") -internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array): Array { - if (array.size < collection.size) - return copyToArrayImpl(collection) as Array - - val iterator = collection.iterator() - var index = 0 - while (iterator.hasNext()) { - array[index++] = iterator.next() as T - } - return terminateCollectionToArray(collection.size, array) } \ No newline at end of file diff --git a/libraries/stdlib/js/src/kotlin/collectionJs.kt b/libraries/stdlib/js/src/kotlin/collectionJs.kt index 7b0f88d61eb..b53a069511e 100644 --- a/libraries/stdlib/js/src/kotlin/collectionJs.kt +++ b/libraries/stdlib/js/src/kotlin/collectionJs.kt @@ -36,26 +36,10 @@ internal fun copyToArray(collection: Collection): Array { } @JsName("copyToArrayImpl") -internal actual fun copyToArrayImpl(collection: Collection<*>): Array { - val array = emptyArray() - val iterator = collection.iterator() - while (iterator.hasNext()) - array.asDynamic().push(iterator.next()) - return array -} +internal actual fun copyToArrayImpl(collection: Collection<*>): Array = collectionToArrayCommonImpl(collection) @JsName("copyToExistingArrayImpl") -internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array): Array { - if (array.size < collection.size) - return copyToArrayImpl(collection).unsafeCast>() - - val iterator = collection.iterator() - var index = 0 - while (iterator.hasNext()) { - array[index++] = iterator.next().unsafeCast() - } - return terminateCollectionToArray(collection.size, array) -} +internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array): Array = collectionToArrayCommonImpl(collection, array) internal actual fun terminateCollectionToArray(collectionSize: Int, array: Array): Array = array diff --git a/libraries/stdlib/native-wasm/src/kotlin/collections/Arrays.kt b/libraries/stdlib/native-wasm/src/kotlin/collections/Arrays.kt index 95529e442e6..7d4b101715f 100644 --- a/libraries/stdlib/native-wasm/src/kotlin/collections/Arrays.kt +++ b/libraries/stdlib/native-wasm/src/kotlin/collections/Arrays.kt @@ -84,14 +84,9 @@ internal fun Array?.contentDeepHashCodeImpl(): Int { @Suppress("UNCHECKED_CAST") internal actual fun arrayOfNulls(reference: Array, size: Int): Array = arrayOfNulls(size) as Array -internal actual fun copyToArrayImpl(collection: Collection<*>): Array { - val array = arrayOfUninitializedElements(collection.size) - val iterator = collection.iterator() - var index = 0 - while (iterator.hasNext()) - array[index++] = iterator.next() - return array -} +internal actual fun copyToArrayImpl(collection: Collection<*>): Array = collectionToArrayCommonImpl(collection) + +internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array): Array = collectionToArrayCommonImpl(collection, array) internal actual fun terminateCollectionToArray(collectionSize: Int, array: Array): Array = array diff --git a/libraries/stdlib/src/kotlin/collections/Collections.kt b/libraries/stdlib/src/kotlin/collections/Collections.kt index 0135a431491..86997d36813 100644 --- a/libraries/stdlib/src/kotlin/collections/Collections.kt +++ b/libraries/stdlib/src/kotlin/collections/Collections.kt @@ -479,6 +479,40 @@ internal fun throwIndexOverflow() { throw ArithmeticException("Index overflow ha @SinceKotlin("1.3") internal fun throwCountOverflow() { throw ArithmeticException("Count overflow has happened.") } + +internal fun collectionToArrayCommonImpl(collection: Collection<*>): Array { + if (collection.isEmpty()) return emptyArray() + + val destination = arrayOfNulls(collection.size) + + val iterator = collection.iterator() + var index = 0 + while (iterator.hasNext()) { + destination[index++] = iterator.next() + } + + return destination +} + +internal fun collectionToArrayCommonImpl(collection: Collection<*>, array: Array): Array { + if (collection.isEmpty()) return terminateCollectionToArray(0, array) + + val destination = if (array.size < collection.size) { + arrayOfNulls(array, collection.size) + } else { + array + } + + val iterator = collection.iterator() + var index = 0 + while (iterator.hasNext()) { + @Suppress("UNCHECKED_CAST") + destination[index++] = iterator.next() as T + } + + return terminateCollectionToArray(collection.size, destination) +} + /** * In JVM if the size of [array] is bigger than [collectionSize], sets `array[collectionSize] = null`. * In other platforms does nothing. diff --git a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt index 4b75b27a71e..45a8ff7010b 100644 --- a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt +++ b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt @@ -22,17 +22,4 @@ internal fun copyToArray(collection: Collection): Array = //TODO: Find more proper way to call abstract collection's toArray @Suppress("INVISIBLE_MEMBER") collection.toArray() as Array else - copyToArrayImpl(collection) as Array - -@Suppress("UNCHECKED_CAST") -internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array): Array { - if (array.size < collection.size) - return copyToArrayImpl(collection) as Array - - val iterator = collection.iterator() - var index = 0 - while (iterator.hasNext()) { - array[index++] = iterator.next() as T - } - return terminateCollectionToArray(collection.size, array) -} \ No newline at end of file + copyToArrayImpl(collection) as Array \ No newline at end of file