From 09c1ff123322fa961db4c400bc9491044d1becdc Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 22 Apr 2016 20:54:40 +0300 Subject: [PATCH] Do not use indexed access for lists not supporting RandomAccess Add RandomAccess specialization. --- libraries/stdlib/src/generated/_Collections.kt | 8 ++++++-- .../stdlib/src/kotlin/collections/MutableCollections.kt | 3 +++ .../tools/kotlin-stdlib-gen/src/templates/Filtering.kt | 8 ++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) 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 }