From 468fe4196d522c947b9f348a6754a8067f3853f1 Mon Sep 17 00:00:00 2001 From: Igor Laevsky Date: Fri, 30 Jul 2021 15:12:45 +0300 Subject: [PATCH] WASM: Implement string.compareTo and string.subSequence --- .../stdlib/wasm/builtins/kotlin/String.kt | 22 ++++++++++++++----- libraries/stdlib/wasm/src/kotlin/Math.kt | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/libraries/stdlib/wasm/builtins/kotlin/String.kt b/libraries/stdlib/wasm/builtins/kotlin/String.kt index a5fb6568dec..c6682cc4814 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/String.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/String.kt @@ -6,6 +6,7 @@ package kotlin import kotlin.wasm.internal.* +import kotlin.math.min /** * The `String` class represents character strings. All string literals in Kotlin programs, such as `"abc"`, are @@ -31,16 +32,25 @@ public class String internal constructor(internal val chars: CharArray) : Compar */ public override fun get(index: Int): Char = chars[index] - public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence = - TODO("todo") + public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence { + return String(chars.sliceArray(startIndex until endIndex)) + } - public override fun compareTo(other: String): Int = - TODO("todo") + public override fun compareTo(other: String): Int { + val len = min(this.length, other.length) + + for (i in 0 until len) { + val l = this[i] + val r = other[i] + if (l != r) + return l - r + } + return this.length - other.length + } public override fun equals(other: Any?): Boolean { if (other is String) - return chars.contentEquals(other.chars) - //return this.compareTo(other) == 0 + return this.compareTo(other) == 0 return false } diff --git a/libraries/stdlib/wasm/src/kotlin/Math.kt b/libraries/stdlib/wasm/src/kotlin/Math.kt index 61843481e38..48d6272c640 100644 --- a/libraries/stdlib/wasm/src/kotlin/Math.kt +++ b/libraries/stdlib/wasm/src/kotlin/Math.kt @@ -913,7 +913,7 @@ public actual fun abs(n: Int): Int = TODO("Wasm stdlib: Math") * Returns the smaller of two values. */ @SinceKotlin("1.2") -public actual fun min(a: Int, b: Int): Int = TODO("Wasm stdlib: Math") +public actual fun min(a: Int, b: Int): Int = if (a < b) a else b /** * Returns the greater of two values.