diff --git a/libraries/stdlib/src/generated/_Arrays.kt b/libraries/stdlib/src/generated/_Arrays.kt index ef31447cffc..3a04ab0b27f 100644 --- a/libraries/stdlib/src/generated/_Arrays.kt +++ b/libraries/stdlib/src/generated/_Arrays.kt @@ -2518,15 +2518,7 @@ public inline fun CharArray.singleOrNull(predicate: (Char) -> Boolean): Char? { */ public fun Array.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2534,15 +2526,7 @@ public fun Array.drop(n: Int): List { */ public fun ByteArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2550,15 +2534,7 @@ public fun ByteArray.drop(n: Int): List { */ public fun ShortArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2566,15 +2542,7 @@ public fun ShortArray.drop(n: Int): List { */ public fun IntArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2582,15 +2550,7 @@ public fun IntArray.drop(n: Int): List { */ public fun LongArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2598,15 +2558,7 @@ public fun LongArray.drop(n: Int): List { */ public fun FloatArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2614,15 +2566,7 @@ public fun FloatArray.drop(n: Int): List { */ public fun DoubleArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2630,15 +2574,7 @@ public fun DoubleArray.drop(n: Int): List { */ public fun BooleanArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -2646,15 +2582,7 @@ public fun BooleanArray.drop(n: Int): List { */ public fun CharArray.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) } /** @@ -3846,6 +3774,7 @@ public fun Array.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3853,7 +3782,7 @@ public fun Array.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3863,6 +3792,7 @@ public fun ByteArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3870,7 +3800,7 @@ public fun ByteArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3880,6 +3810,7 @@ public fun ShortArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3887,7 +3818,7 @@ public fun ShortArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3897,6 +3828,7 @@ public fun IntArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3904,7 +3836,7 @@ public fun IntArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3914,6 +3846,7 @@ public fun LongArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3921,7 +3854,7 @@ public fun LongArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3931,6 +3864,7 @@ public fun FloatArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3938,7 +3872,7 @@ public fun FloatArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3948,6 +3882,7 @@ public fun DoubleArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3955,7 +3890,7 @@ public fun DoubleArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3965,6 +3900,7 @@ public fun BooleanArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3972,7 +3908,7 @@ public fun BooleanArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -3982,6 +3918,7 @@ public fun CharArray.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -3989,7 +3926,7 @@ public fun CharArray.take(n: Int): List { break list.add(item) } - return list.optimizeReadOnlyList() + return list } /** @@ -4000,10 +3937,11 @@ public fun Array.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4014,10 +3952,11 @@ public fun ByteArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4028,10 +3967,11 @@ public fun ShortArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4042,10 +3982,11 @@ public fun IntArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4056,10 +3997,11 @@ public fun LongArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4070,10 +4012,11 @@ public fun FloatArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4084,10 +4027,11 @@ public fun DoubleArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4098,10 +4042,11 @@ public fun BooleanArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** @@ -4112,10 +4057,11 @@ public fun CharArray.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list } /** diff --git a/libraries/stdlib/src/generated/_Collections.kt b/libraries/stdlib/src/generated/_Collections.kt index 7563880ec4d..50e9bcbbd10 100644 --- a/libraries/stdlib/src/generated/_Collections.kt +++ b/libraries/stdlib/src/generated/_Collections.kt @@ -544,6 +544,8 @@ public fun Iterable.drop(n: Int): List { val resultSize = size - n if (resultSize <= 0) return emptyList() + if (resultSize == 1) + return listOf(last()) list = ArrayList(resultSize) if (this is List) { if (this is RandomAccess) { @@ -553,7 +555,7 @@ public fun Iterable.drop(n: Int): List { for (item in listIterator(n)) list.add(item) } - return list.optimizeReadOnlyList() + return list } } else { @@ -713,7 +715,10 @@ public fun List.slice(indices: Iterable): List { public fun Iterable.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() - if (this is Collection && n >= size) return toList() + if (this is Collection) { + if (n >= size) return toList() + if (n == 1) return listOf(first()) + } var count = 0 val list = ArrayList(n) for (item in this) { @@ -732,6 +737,7 @@ public fun List.takeLast(n: Int): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(last()) val list = ArrayList(n) if (this is RandomAccess) { for (index in size - n .. size - 1) @@ -740,7 +746,7 @@ public fun List.takeLast(n: Int): List { for (item in listIterator(n)) list.add(item) } - return list.optimizeReadOnlyList() + return list } /** diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt index aa354e32013..325cfd69d65 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt @@ -46,6 +46,8 @@ fun filtering(): List { val resultSize = size - n if (resultSize <= 0) return emptyList() + if (resultSize == 1) + return listOf(last()) list = ArrayList(resultSize) if (this is List) { @@ -56,7 +58,7 @@ fun filtering(): List { for (item in listIterator(n)) list.add(item) } - return list.optimizeReadOnlyList() + return list } } else { @@ -96,16 +98,7 @@ fun filtering(): List { body(ArraysOfObjects, ArraysOfPrimitives) { """ require(n >= 0) { "Requested element count $n is less than zero." } - if (n == 0) - return toList() - if (n >= size) - return emptyList() - - val list = ArrayList(size - n) - for (index in n..size - 1) { - list.add(this[index]) - } - return list.optimizeReadOnlyList() + return takeLast((size - n).coerceAtLeast(0)) """ } } @@ -118,7 +111,10 @@ fun filtering(): List { """ require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() - if (this is Collection && n >= size) return toList() + if (this is Collection) { + if (n >= size) return toList() + if (n == 1) return listOf(first()) + } var count = 0 val list = ArrayList(n) for (item in this) { @@ -158,6 +154,7 @@ fun filtering(): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (n >= size) return toList() + if (n == 1) return listOf(this[0]) var count = 0 val list = ArrayList(n) for (item in this) { @@ -165,7 +162,7 @@ fun filtering(): List { break; list.add(item) } - return list.optimizeReadOnlyList() + return list """ } } @@ -212,10 +209,12 @@ fun filtering(): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(this[size - 1]) + val list = ArrayList(n) for (index in size - n .. size - 1) list.add(this[index]) - return list.optimizeReadOnlyList() + return list """ } body(Lists) { @@ -224,6 +223,8 @@ fun filtering(): List { if (n == 0) return emptyList() val size = size if (n >= size) return toList() + if (n == 1) return listOf(last()) + val list = ArrayList(n) if (this is RandomAccess) { for (index in size - n .. size - 1) @@ -232,7 +233,7 @@ fun filtering(): List { for (item in listIterator(n)) list.add(item) } - return list.optimizeReadOnlyList() + return list """ } }