StringBuilder: Use intrinsic if input sequence is a string
This commit is contained in:
@@ -902,13 +902,14 @@ OBJ_GETTER(Kotlin_String_unsafeStringToUtf8OrThrow, KString thiz, KInt start, KI
|
|||||||
RETURN_RESULT_OF(unsafeUtf16ToUtf8Impl<utf16toUtf8OrThrow>, thiz, start, size);
|
RETURN_RESULT_OF(unsafeUtf16ToUtf8Impl<utf16toUtf8OrThrow>, thiz, start, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
KInt Kotlin_StringBuilder_insertString(KRef builder, KInt position, KString fromString) {
|
KInt Kotlin_StringBuilder_insertString(KRef builder, KInt distIndex, KString fromString, KInt sourceIndex, KInt count) {
|
||||||
auto toArray = builder->array();
|
auto toArray = builder->array();
|
||||||
RuntimeAssert(toArray->count_ >= fromString->count_ + position, "must be true");
|
RuntimeAssert(sourceIndex >= 0 && sourceIndex + count <= fromString->count_, "must be true");
|
||||||
memcpy(CharArrayAddressOfElementAt(toArray, position),
|
RuntimeAssert(distIndex >= 0 && distIndex + count <= toArray->count_, "must be true");
|
||||||
CharArrayAddressOfElementAt(fromString, 0),
|
memcpy(CharArrayAddressOfElementAt(toArray, distIndex),
|
||||||
fromString->count_ * sizeof(KChar));
|
CharArrayAddressOfElementAt(fromString, sourceIndex),
|
||||||
return fromString->count_;
|
count * sizeof(KChar));
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
KInt Kotlin_StringBuilder_insertInt(KRef builder, KInt position, KInt value) {
|
KInt Kotlin_StringBuilder_insertInt(KRef builder, KInt position, KInt value) {
|
||||||
|
|||||||
@@ -112,6 +112,9 @@ internal fun checkBoundsIndexes(startIndex: Int, endIndex: Int, size: Int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun insertString(array: CharArray, start: Int, value: String): Int =
|
||||||
|
insertString(array, start, value, 0, value.length)
|
||||||
|
|
||||||
@SymbolName("Kotlin_ByteArray_unsafeStringFromUtf8")
|
@SymbolName("Kotlin_ByteArray_unsafeStringFromUtf8")
|
||||||
internal external fun ByteArray.unsafeStringFromUtf8(start: Int, size: Int) : String
|
internal external fun ByteArray.unsafeStringFromUtf8(start: Int, size: Int) : String
|
||||||
|
|
||||||
@@ -128,7 +131,7 @@ internal external fun String.unsafeStringToUtf8OrThrow(start: Int, size: Int) :
|
|||||||
internal external fun unsafeStringFromCharArray(array: CharArray, start: Int, size: Int) : String
|
internal external fun unsafeStringFromCharArray(array: CharArray, start: Int, size: Int) : String
|
||||||
|
|
||||||
@SymbolName("Kotlin_StringBuilder_insertString")
|
@SymbolName("Kotlin_StringBuilder_insertString")
|
||||||
internal external fun insertString(array: CharArray, start: Int, value: String): Int
|
internal external fun insertString(array: CharArray, distIndex: Int, value: String, sourceIndex: Int, count: Int): Int
|
||||||
|
|
||||||
@SymbolName("Kotlin_StringBuilder_insertInt")
|
@SymbolName("Kotlin_StringBuilder_insertInt")
|
||||||
internal external fun insertInt(array: CharArray, start: Int, value: Int): Int
|
internal external fun insertInt(array: CharArray, start: Int, value: Int): Int
|
||||||
@@ -227,6 +227,10 @@ actual class StringBuilder private constructor (
|
|||||||
val toAppend = csq ?: "null"
|
val toAppend = csq ?: "null"
|
||||||
if (start < 0 || end < start || start > toAppend.length) throw IndexOutOfBoundsException()
|
if (start < 0 || end < start || start > toAppend.length) throw IndexOutOfBoundsException()
|
||||||
ensureExtraCapacity(end - start)
|
ensureExtraCapacity(end - start)
|
||||||
|
(toAppend as? String)?.let {
|
||||||
|
_length += insertString(array, _length, it, start, end - start)
|
||||||
|
return this
|
||||||
|
}
|
||||||
var index = start
|
var index = start
|
||||||
while (index < end)
|
while (index < end)
|
||||||
array[_length++] = toAppend[index++]
|
array[_length++] = toAppend[index++]
|
||||||
|
|||||||
Reference in New Issue
Block a user