Optimize trivial cases of CharSequence.repeat. Provide CharSequence.repeat for JS.
#KT-3064 Fixed
This commit is contained in:
@@ -75,6 +75,27 @@ public inline fun String.decapitalize(): String {
|
|||||||
return if (isNotEmpty()) substring(0, 1).toLowerCase() + substring(1) else this
|
return if (isNotEmpty()) substring(0, 1).toLowerCase() + substring(1) else this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string containing this char sequence repeated [n] times.
|
||||||
|
* @throws [IllegalArgumentException] when n < 0.
|
||||||
|
*/
|
||||||
|
public fun CharSequence.repeat(n: Int): String {
|
||||||
|
require (n >= 0) { "Count 'n' must be non-negative, but was $n." }
|
||||||
|
return when (n) {
|
||||||
|
0 -> ""
|
||||||
|
1 -> this.toString()
|
||||||
|
else -> {
|
||||||
|
var result = ""
|
||||||
|
if (!isEmpty()) {
|
||||||
|
val s = this.toString()
|
||||||
|
for (i in 1..n) {
|
||||||
|
result += s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String =
|
public fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String =
|
||||||
nativeReplace(RegExp(Regex.escape(oldValue), if (ignoreCase) "gi" else "g"), Regex.escapeReplacement(newValue))
|
nativeReplace(RegExp(Regex.escape(oldValue), if (ignoreCase) "gi" else "g"), Regex.escapeReplacement(newValue))
|
||||||
|
|||||||
@@ -457,14 +457,25 @@ public fun String.decapitalize(): String {
|
|||||||
* @sample test.text.StringJVMTest.repeat
|
* @sample test.text.StringJVMTest.repeat
|
||||||
*/
|
*/
|
||||||
public fun CharSequence.repeat(n: Int): String {
|
public fun CharSequence.repeat(n: Int): String {
|
||||||
if (n < 0)
|
require (n >= 0) { "Count 'n' must be non-negative, but was $n." }
|
||||||
throw IllegalArgumentException("Value should be non-negative, but was $n")
|
|
||||||
|
|
||||||
val sb = StringBuilder(n * length)
|
return when (n) {
|
||||||
for (i in 1..n) {
|
0 -> ""
|
||||||
sb.append(this)
|
1 -> this.toString()
|
||||||
|
else -> {
|
||||||
|
when (length) {
|
||||||
|
0 -> ""
|
||||||
|
1 -> this[0].let { char -> String(CharArray(n) { char }) }
|
||||||
|
else -> {
|
||||||
|
val sb = StringBuilder(n * length)
|
||||||
|
for (i in 1..n) {
|
||||||
|
sb.append(this)
|
||||||
|
}
|
||||||
|
sb.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return sb.toString()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,17 +45,6 @@ class StringJVMTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@test fun repeat() = withOneCharSequenceArg { arg1 ->
|
|
||||||
fun String.repeat(n: Int): String = arg1(this).repeat(n)
|
|
||||||
|
|
||||||
assertFails { "foo".repeat(-1) }
|
|
||||||
assertEquals("", "foo".repeat(0))
|
|
||||||
assertEquals("foo", "foo".repeat(1))
|
|
||||||
assertEquals("foofoo", "foo".repeat(2))
|
|
||||||
assertEquals("foofoofoo", "foo".repeat(3))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@test fun sliceCharSequenceFails() = withOneCharSequenceArg { arg1 ->
|
@test fun sliceCharSequenceFails() = withOneCharSequenceArg { arg1 ->
|
||||||
assertFails {
|
assertFails {
|
||||||
arg1("abc").slice(1..4)
|
arg1("abc").slice(1..4)
|
||||||
|
|||||||
@@ -334,6 +334,19 @@ class StringTest {
|
|||||||
assertEquals("xxx", s.replaceBeforeLast("=", "/new/path", "xxx"))
|
assertEquals("xxx", s.replaceBeforeLast("=", "/new/path", "xxx"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test fun repeat() = withOneCharSequenceArg { arg1 ->
|
||||||
|
fun String.repeat(n: Int): String = arg1(this).repeat(n)
|
||||||
|
|
||||||
|
assertFails { "foo".repeat(-1) }
|
||||||
|
assertEquals("", "foo".repeat(0))
|
||||||
|
assertEquals("foo", "foo".repeat(1))
|
||||||
|
assertEquals("foofoo", "foo".repeat(2))
|
||||||
|
assertEquals("foofoofoo", "foo".repeat(3))
|
||||||
|
|
||||||
|
assertEquals("", "".repeat(Int.MAX_VALUE))
|
||||||
|
assertEquals("aaaaaaaaaaaaa", "a".repeat(13))
|
||||||
|
}
|
||||||
|
|
||||||
@test fun stringIterator() = withOneCharSequenceArg("239") { data ->
|
@test fun stringIterator() = withOneCharSequenceArg("239") { data ->
|
||||||
var sum = 0
|
var sum = 0
|
||||||
for(c in data)
|
for(c in data)
|
||||||
|
|||||||
Reference in New Issue
Block a user