Optimize String.repeat()
This backports the optimization done in `master`. Co-authored-by: VolTer <mew.pur.pur@abv.bg>
This commit is contained in:
parent
5beec641b6
commit
3b31ff9008
1 changed files with 11 additions and 9 deletions
|
@ -3081,17 +3081,19 @@ String String::replacen(const String &p_key, const String &p_with) const {
|
||||||
String String::repeat(int p_count) const {
|
String String::repeat(int p_count) const {
|
||||||
ERR_FAIL_COND_V_MSG(p_count < 0, "", "Parameter count should be a positive number.");
|
ERR_FAIL_COND_V_MSG(p_count < 0, "", "Parameter count should be a positive number.");
|
||||||
|
|
||||||
String new_string;
|
int len = length();
|
||||||
const CharType *src = this->c_str();
|
String new_string = *this;
|
||||||
|
new_string.resize(p_count * len + 1);
|
||||||
|
|
||||||
new_string.resize(length() * p_count + 1);
|
CharType *dst = new_string.ptrw();
|
||||||
new_string[length() * p_count] = 0;
|
int offset = 1;
|
||||||
|
int stride = 1;
|
||||||
for (int i = 0; i < p_count; i++) {
|
while (offset < p_count) {
|
||||||
for (int j = 0; j < length(); j++) {
|
memcpy(dst + offset * len, dst, stride * len * sizeof(CharType));
|
||||||
new_string[i * length() + j] = src[j];
|
offset += stride;
|
||||||
}
|
stride = MIN(stride * 2, p_count - offset);
|
||||||
}
|
}
|
||||||
|
dst[p_count * len] = _null;
|
||||||
|
|
||||||
return new_string;
|
return new_string;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue