[Core] Optimize `String::insert`

This commit is contained in:
A Thousand Ships 2024-05-30 17:31:22 +02:00
parent ee363af0ed
commit 746c6b87eb
No known key found for this signature in database
GPG Key ID: 2033189A662F8BD7
1 changed files with 16 additions and 6 deletions

View File

@ -3149,7 +3149,7 @@ Vector<uint8_t> String::sha256_buffer() const {
} }
String String::insert(int p_at_pos, const String &p_string) const { String String::insert(int p_at_pos, const String &p_string) const {
if (p_at_pos < 0) { if (p_string.is_empty() || p_at_pos < 0) {
return *this; return *this;
} }
@ -3157,17 +3157,27 @@ String String::insert(int p_at_pos, const String &p_string) const {
p_at_pos = length(); p_at_pos = length();
} }
String pre; String ret;
ret.resize(length() + p_string.length() + 1);
char32_t *ret_ptrw = ret.ptrw();
const char32_t *this_ptr = ptr();
if (p_at_pos > 0) { if (p_at_pos > 0) {
pre = substr(0, p_at_pos); memcpy(ret_ptrw, this_ptr, p_at_pos * sizeof(char32_t));
ret_ptrw += p_at_pos;
} }
String post; memcpy(ret_ptrw, p_string.ptr(), p_string.length() * sizeof(char32_t));
ret_ptrw += p_string.length();
if (p_at_pos < length()) { if (p_at_pos < length()) {
post = substr(p_at_pos, length() - p_at_pos); memcpy(ret_ptrw, this_ptr + p_at_pos, (length() - p_at_pos) * sizeof(char32_t));
ret_ptrw += length() - p_at_pos;
} }
return pre + p_string + post; *ret_ptrw = 0;
return ret;
} }
String String::erase(int p_pos, int p_chars) const { String String::erase(int p_pos, int p_chars) const {