Optimize trivial cases of CharSequence.repeat. Provide CharSequence.repeat for JS.

#KT-3064 Fixed
This commit is contained in:
Ilya Gorbunov
2016-02-21 06:43:56 +03:00
parent 7a43d62408
commit f564adfdd4
4 changed files with 51 additions and 17 deletions
+21
View File
@@ -75,6 +75,27 @@ public inline fun String.decapitalize(): String {
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 =
nativeReplace(RegExp(Regex.escape(oldValue), if (ignoreCase) "gi" else "g"), Regex.escapeReplacement(newValue))
+17 -6
View File
@@ -457,14 +457,25 @@ public fun String.decapitalize(): String {
* @sample test.text.StringJVMTest.repeat
*/
public fun CharSequence.repeat(n: Int): String {
if (n < 0)
throw IllegalArgumentException("Value should be non-negative, but was $n")
require (n >= 0) { "Count 'n' must be non-negative, but was $n." }
val sb = StringBuilder(n * length)
for (i in 1..n) {
sb.append(this)
return when (n) {
0 -> ""
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 ->
assertFails {
arg1("abc").slice(1..4)
+13
View File
@@ -334,6 +334,19 @@ class StringTest {
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 ->
var sum = 0
for(c in data)