Skip to content

Commit 1d18389

Browse files
popemattqurbonzoda
authored andcommitted
Adds an empty input check to all addAll, removeAll, and retainAll methods
1 parent a1d250a commit 1d18389

File tree

8 files changed

+18
-0
lines changed

8 files changed

+18
-0
lines changed

core/commonMain/src/implementations/immutableList/AbstractPersistentList.kt

+6
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,21 @@ package kotlinx.collections.immutable.implementations.immutableList
88
import kotlinx.collections.immutable.ImmutableList
99
import kotlinx.collections.immutable.PersistentList
1010
import kotlinx.collections.immutable.mutate
11+
import kotlinx.collections.immutable.internal.ListImplementation.checkPositionIndex
1112

1213
public abstract class AbstractPersistentList<E> : PersistentList<E>, AbstractList<E>() {
1314
override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> {
1415
return super<PersistentList>.subList(fromIndex, toIndex)
1516
}
1617

1718
override fun addAll(elements: Collection<E>): PersistentList<E> {
19+
if (elements.isEmpty()) return this
1820
return mutate { it.addAll(elements) }
1921
}
2022

2123
override fun addAll(index: Int, c: Collection<E>): PersistentList<E> {
24+
checkPositionIndex(index, size)
25+
if (c.isEmpty()) return this
2226
return mutate { it.addAll(index, c) }
2327
}
2428

@@ -31,10 +35,12 @@ public abstract class AbstractPersistentList<E> : PersistentList<E>, AbstractLis
3135
}
3236

3337
override fun removeAll(elements: Collection<E>): PersistentList<E> {
38+
if (elements.isEmpty()) return this
3439
return removeAll { elements.contains(it) }
3540
}
3641

3742
override fun retainAll(elements: Collection<E>): PersistentList<E> {
43+
if (elements.isEmpty()) return persistentVectorOf()
3844
return removeAll { !elements.contains(it) }
3945
}
4046

core/commonMain/src/implementations/immutableList/PersistentVectorBuilder.kt

+1
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ internal class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
669669
}
670670

671671
override fun removeAll(elements: Collection<E>): Boolean {
672+
if (elements.isEmpty()) return false
672673
return removeAllWithPredicate { elements.contains(it) }
673674
}
674675

core/commonMain/src/implementations/immutableMap/PersistentHashMap.kt

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ internal class PersistentHashMap<K, V>(internal val node: TrieNode<K, V>,
6868
}
6969

7070
override fun putAll(m: Map<out K, @UnsafeVariance V>): PersistentMap<K, V> {
71+
if (m.isEmpty()) return this
7172
return this.mutate { it.putAll(m) }
7273
}
7374

core/commonMain/src/implementations/immutableMap/PersistentHashMapBuilder.kt

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ internal class PersistentHashMapBuilder<K, V>(private var map: PersistentHashMap
6666
}
6767

6868
override fun putAll(from: Map<out K, V>) {
69+
if (from.isEmpty()) return
6970
val map = from as? PersistentHashMap ?: (from as? PersistentHashMapBuilder)?.build()
7071
if (map != null) @Suppress("UNCHECKED_CAST") {
7172
val intersectionCounter = DeltaCounter()

core/commonMain/src/implementations/immutableSet/PersistentHashSet.kt

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal class PersistentHashSet<E>(internal val node: TrieNode<E>,
2121
}
2222

2323
override fun addAll(elements: Collection<E>): PersistentSet<E> {
24+
if (elements.isEmpty()) return this
2425
return this.mutate { it.addAll(elements) }
2526
}
2627

@@ -31,6 +32,7 @@ internal class PersistentHashSet<E>(internal val node: TrieNode<E>,
3132
}
3233

3334
override fun removeAll(elements: Collection<E>): PersistentSet<E> {
35+
if (elements.isEmpty()) return this
3436
return mutate { it.removeAll(elements) }
3537
}
3638

@@ -39,6 +41,7 @@ internal class PersistentHashSet<E>(internal val node: TrieNode<E>,
3941
}
4042

4143
override fun retainAll(elements: Collection<E>): PersistentSet<E> {
44+
if (elements.isEmpty()) return PersistentHashSet.emptyOf<E>()
4245
return mutate { it.retainAll(elements) }
4346
}
4447

core/commonMain/src/implementations/immutableSet/PersistentHashSetBuilder.kt

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ internal class PersistentHashSetBuilder<E>(private var set: PersistentHashSet<E>
4545
}
4646

4747
override fun addAll(elements: Collection<E>): Boolean {
48+
if (elements.isEmpty()) return false
4849
val set = elements as? PersistentHashSet ?: (elements as? PersistentHashSetBuilder)?.build()
4950
if (set !== null) {
5051
val deltaCounter = DeltaCounter()
@@ -81,6 +82,7 @@ internal class PersistentHashSetBuilder<E>(private var set: PersistentHashSet<E>
8182
}
8283

8384
override fun removeAll(elements: Collection<E>): Boolean {
85+
if (elements.isEmpty()) return false
8486
val set = elements as? PersistentHashSet ?: (elements as? PersistentHashSetBuilder)?.build()
8587
if (set !== null) {
8688
val counter = DeltaCounter()

core/commonMain/src/implementations/persistentOrderedMap/PersistentOrderedMap.kt

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ internal class PersistentOrderedMap<K, V>(
117117
}
118118

119119
override fun putAll(m: Map<out K, @UnsafeVariance V>): PersistentMap<K, V> {
120+
if (m.isEmpty()) return this
120121
return this.mutate { it.putAll(m) }
121122
}
122123

core/commonMain/src/implementations/persistentOrderedSet/PersistentOrderedSet.kt

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ internal class PersistentOrderedSet<E>(
5353
}
5454

5555
override fun addAll(elements: Collection<E>): PersistentSet<E> {
56+
if (elements.isEmpty()) return this
5657
return this.mutate { it.addAll(elements) }
5758
}
5859

@@ -78,6 +79,7 @@ internal class PersistentOrderedSet<E>(
7879
}
7980

8081
override fun removeAll(elements: Collection<E>): PersistentSet<E> {
82+
if (elements.isEmpty()) return this
8183
return mutate { it.removeAll(elements) }
8284
}
8385

@@ -86,6 +88,7 @@ internal class PersistentOrderedSet<E>(
8688
}
8789

8890
override fun retainAll(elements: Collection<E>): PersistentSet<E> {
91+
if (elements.isEmpty()) return PersistentOrderedSet.emptyOf<E>()
8992
return mutate { it.retainAll(elements) }
9093
}
9194

0 commit comments

Comments
 (0)