Merge pull request #64995 from Calinou/string-optimize-repeat-3.x

Optimize `String.repeat()` (3.x)
This commit is contained in:
Rémi Verschelde 2022-08-29 00:04:44 +02:00 committed by GitHub
commit 2a1403cf62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 9 deletions

View File

@ -3081,17 +3081,19 @@ String String::replacen(const String &p_key, const String &p_with) const {
String String::repeat(int p_count) const {
ERR_FAIL_COND_V_MSG(p_count < 0, "", "Parameter count should be a positive number.");
String new_string;
const CharType *src = this->c_str();
int len = length();
String new_string = *this;
new_string.resize(p_count * len + 1);
new_string.resize(length() * p_count + 1);
new_string[length() * p_count] = 0;
for (int i = 0; i < p_count; i++) {
for (int j = 0; j < length(); j++) {
new_string[i * length() + j] = src[j];
}
CharType *dst = new_string.ptrw();
int offset = 1;
int stride = 1;
while (offset < p_count) {
memcpy(dst + offset * len, dst, stride * len * sizeof(CharType));
offset += stride;
stride = MIN(stride * 2, p_count - offset);
}
dst[p_count * len] = _null;
return new_string;
}