From c1b523ddef188257c7d425074f9beadb57973d70 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Wed, 20 Feb 2019 04:10:02 +0300 Subject: [PATCH] Fix UArray.containsAll(Collection) --- generators/builtins/unsignedTypes.kt | 5 ++++- libraries/stdlib/test/collections/UnsignedArraysTest.kt | 9 +++++++++ libraries/stdlib/unsigned/src/kotlin/UByteArray.kt | 5 ++++- libraries/stdlib/unsigned/src/kotlin/UIntArray.kt | 5 ++++- libraries/stdlib/unsigned/src/kotlin/ULongArray.kt | 5 ++++- libraries/stdlib/unsigned/src/kotlin/UShortArray.kt | 5 ++++- 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/generators/builtins/unsignedTypes.kt b/generators/builtins/unsignedTypes.kt index 0fa89724021..857bec755c9 100644 --- a/generators/builtins/unsignedTypes.kt +++ b/generators/builtins/unsignedTypes.kt @@ -353,7 +353,10 @@ class UnsignedArrayGenerator(val type: UnsignedType, out: PrintWriter) : BuiltIn override fun contains(element: $elementType): Boolean = storage.contains(element.to$storageElementType()) - override fun containsAll(elements: Collection<$elementType>): Boolean = elements.all { storage.contains(it.to$storageElementType()) } + override fun containsAll(elements: Collection<$elementType>): Boolean { + if ((elements as Collection).any { it as? $elementType == null }) return false + return elements.all { storage.contains(it.to$storageElementType()) } + } override fun isEmpty(): Boolean = this.storage.size == 0""" ) diff --git a/libraries/stdlib/test/collections/UnsignedArraysTest.kt b/libraries/stdlib/test/collections/UnsignedArraysTest.kt index 76dc3763b43..b2865c9df3b 100644 --- a/libraries/stdlib/test/collections/UnsignedArraysTest.kt +++ b/libraries/stdlib/test/collections/UnsignedArraysTest.kt @@ -6,10 +6,19 @@ @file:Suppress("SIGNED_CONSTANT_CONVERTED_TO_UNSIGNED") package test.collections +import test.collections.behaviors.collectionBehavior import kotlin.test.* class UnsignedArraysTest { + @Test + fun collectionBehavior() { + compare(listOf(), ubyteArrayOf()) { this.collectionBehavior() } + compare(listOf(1), ushortArrayOf(1)) { this.collectionBehavior() } + compare(listOf(1, 2), uintArrayOf(1u, 2u)) { this.collectionBehavior() } + compare(listOf(1, 2, 3), ulongArrayOf(1u, 2u, 3u)) { this.collectionBehavior() } + } + @Test fun ubyteArrayInit() { val zeroArray = UByteArray(42) diff --git a/libraries/stdlib/unsigned/src/kotlin/UByteArray.kt b/libraries/stdlib/unsigned/src/kotlin/UByteArray.kt index 8316056b544..2973b72ebf7 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UByteArray.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UByteArray.kt @@ -39,7 +39,10 @@ internal constructor(@PublishedApi internal val storage: ByteArray) : Collection override fun contains(element: UByte): Boolean = storage.contains(element.toByte()) - override fun containsAll(elements: Collection): Boolean = elements.all { storage.contains(it.toByte()) } + override fun containsAll(elements: Collection): Boolean { + if ((elements as Collection).any { it as? UByte == null }) return false + return elements.all { storage.contains(it.toByte()) } + } override fun isEmpty(): Boolean = this.storage.size == 0 } diff --git a/libraries/stdlib/unsigned/src/kotlin/UIntArray.kt b/libraries/stdlib/unsigned/src/kotlin/UIntArray.kt index 7b0c9b704f3..ad5c2bb56d6 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UIntArray.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UIntArray.kt @@ -39,7 +39,10 @@ internal constructor(@PublishedApi internal val storage: IntArray) : Collection< override fun contains(element: UInt): Boolean = storage.contains(element.toInt()) - override fun containsAll(elements: Collection): Boolean = elements.all { storage.contains(it.toInt()) } + override fun containsAll(elements: Collection): Boolean { + if ((elements as Collection).any { it as? UInt == null }) return false + return elements.all { storage.contains(it.toInt()) } + } override fun isEmpty(): Boolean = this.storage.size == 0 } diff --git a/libraries/stdlib/unsigned/src/kotlin/ULongArray.kt b/libraries/stdlib/unsigned/src/kotlin/ULongArray.kt index 6506b80e279..29b0cd646ac 100644 --- a/libraries/stdlib/unsigned/src/kotlin/ULongArray.kt +++ b/libraries/stdlib/unsigned/src/kotlin/ULongArray.kt @@ -39,7 +39,10 @@ internal constructor(@PublishedApi internal val storage: LongArray) : Collection override fun contains(element: ULong): Boolean = storage.contains(element.toLong()) - override fun containsAll(elements: Collection): Boolean = elements.all { storage.contains(it.toLong()) } + override fun containsAll(elements: Collection): Boolean { + if ((elements as Collection).any { it as? ULong == null }) return false + return elements.all { storage.contains(it.toLong()) } + } override fun isEmpty(): Boolean = this.storage.size == 0 } diff --git a/libraries/stdlib/unsigned/src/kotlin/UShortArray.kt b/libraries/stdlib/unsigned/src/kotlin/UShortArray.kt index 98dfaa41a58..cd6622f458e 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UShortArray.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UShortArray.kt @@ -39,7 +39,10 @@ internal constructor(@PublishedApi internal val storage: ShortArray) : Collectio override fun contains(element: UShort): Boolean = storage.contains(element.toShort()) - override fun containsAll(elements: Collection): Boolean = elements.all { storage.contains(it.toShort()) } + override fun containsAll(elements: Collection): Boolean { + if ((elements as Collection).any { it as? UShort == null }) return false + return elements.all { storage.contains(it.toShort()) } + } override fun isEmpty(): Boolean = this.storage.size == 0 }