diff --git a/libraries/stdlib/src/generated/_Collections.kt b/libraries/stdlib/src/generated/_Collections.kt index f29c914e72b..939271a03a9 100644 --- a/libraries/stdlib/src/generated/_Collections.kt +++ b/libraries/stdlib/src/generated/_Collections.kt @@ -550,8 +550,12 @@ public fun Iterable.drop(n: Int): List { return emptyList() list = ArrayList(resultSize) if (this is List) { - for (item in listIterator(n)) { - list.add(item) + if (this is RandomAccess) { + for (index in n..size - 1) + list.add(this[index]) + } else { + for (item in listIterator(n)) + list.add(item) } return list } diff --git a/libraries/stdlib/src/kotlin/collections/MutableCollections.kt b/libraries/stdlib/src/kotlin/collections/MutableCollections.kt index 7ae71903e04..dadd30dbe57 100644 --- a/libraries/stdlib/src/kotlin/collections/MutableCollections.kt +++ b/libraries/stdlib/src/kotlin/collections/MutableCollections.kt @@ -177,6 +177,9 @@ public fun MutableList.removeAll(predicate: (T) -> Boolean): Boolean = fi public fun MutableList.retainAll(predicate: (T) -> Boolean): Boolean = filterInPlace(predicate, false) private fun MutableList.filterInPlace(predicate: (T) -> Boolean, predicateResultToRemove: Boolean): Boolean { + if (this !is RandomAccess) + return (this as MutableIterable).filterInPlace(predicate, predicateResultToRemove) + var writeIndex: Int = 0 for (readIndex in 0..lastIndex) { val element = this[readIndex] diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt index f6747eb61b5..c8e0ce9e1a0 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt @@ -49,8 +49,12 @@ fun filtering(): List { list = ArrayList(resultSize) if (this is List) { - for (item in listIterator(n)) { - list.add(item) + if (this is RandomAccess) { + for (index in n..size - 1) + list.add(this[index]) + } else { + for (item in listIterator(n)) + list.add(item) } return list }