Skip to content

Commit a3f48f7

Browse files
committed
Optimize String construction from statically known strings allowing strlen to be evaluated at compile time, where possible.
1 parent a372214 commit a3f48f7

File tree

2 files changed

+177
-179
lines changed

2 files changed

+177
-179
lines changed

core/string/ustring.cpp

+11-147
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,6 @@ const char16_t Char16String::_null = 0;
6565
const char32_t String::_null = 0;
6666
const char32_t String::_replacement_char = 0xfffd;
6767

68-
// strlen equivalent function for char32_t * arguments.
69-
_FORCE_INLINE_ size_t strlen(const char32_t *p_str) {
70-
const char32_t *ptr = p_str;
71-
while (*ptr != 0) {
72-
++ptr;
73-
}
74-
return ptr - p_str;
75-
}
76-
7768
bool select_word(const String &p_s, int p_col, int &r_beg, int &r_end) {
7869
const String &s = p_s;
7970
int beg = CLAMP(p_col, 0, s.length());
@@ -313,80 +304,32 @@ Error String::parse_url(String &r_scheme, String &r_host, int &r_port, String &r
313304
return OK;
314305
}
315306

316-
void String::copy_from(const char *p_cstr) {
317-
// copy Latin-1 encoded c-string directly
318-
if (!p_cstr) {
307+
void String::copy_from(const StrRange<char> &p_cstr) {
308+
if (p_cstr.len == 0) {
319309
resize(0);
320310
return;
321311
}
322312

323-
const size_t len = strlen(p_cstr);
313+
resize(p_cstr.len + 1); // include 0
324314

325-
if (len == 0) {
326-
resize(0);
327-
return;
328-
}
329-
330-
resize(len + 1); // include 0
331-
332-
const char *end = p_cstr + len;
315+
const char *src = p_cstr.c_str;
316+
const char *end = src + p_cstr.len;
333317
char32_t *dst = ptrw();
334318

335-
for (; p_cstr < end; ++p_cstr, ++dst) {
319+
for (; src < end; ++src, ++dst) {
336320
// If char is int8_t, a set sign bit will be reinterpreted as 256 - val implicitly.
337-
*dst = static_cast<uint8_t>(*p_cstr);
321+
*dst = static_cast<uint8_t>(*src);
338322
}
339323
*dst = 0;
340324
}
341325

342-
void String::copy_from(const char *p_cstr, const int p_clip_to) {
343-
// copy Latin-1 encoded c-string directly
344-
if (!p_cstr) {
345-
resize(0);
346-
return;
347-
}
348-
349-
int len = 0;
350-
const char *ptr = p_cstr;
351-
while ((p_clip_to < 0 || len < p_clip_to) && *(ptr++) != 0) {
352-
len++;
353-
}
354-
355-
if (len == 0) {
326+
void String::copy_from(const StrRange<char32_t> &p_cstr) {
327+
if (p_cstr.len == 0) {
356328
resize(0);
357329
return;
358330
}
359331

360-
resize(len + 1); // include 0
361-
362-
const char *end = p_cstr + len;
363-
char32_t *dst = ptrw();
364-
365-
for (; p_cstr < end; ++p_cstr, ++dst) {
366-
// If char is int8_t, a set sign bit will be reinterpreted as 256 - val implicitly.
367-
*dst = static_cast<uint8_t>(*p_cstr);
368-
}
369-
*dst = 0;
370-
}
371-
372-
void String::copy_from(const wchar_t *p_cstr) {
373-
#ifdef WINDOWS_ENABLED
374-
// wchar_t is 16-bit, parse as UTF-16
375-
parse_utf16((const char16_t *)p_cstr);
376-
#else
377-
// wchar_t is 32-bit, copy directly
378-
copy_from((const char32_t *)p_cstr);
379-
#endif
380-
}
381-
382-
void String::copy_from(const wchar_t *p_cstr, const int p_clip_to) {
383-
#ifdef WINDOWS_ENABLED
384-
// wchar_t is 16-bit, parse as UTF-16
385-
parse_utf16((const char16_t *)p_cstr, p_clip_to);
386-
#else
387-
// wchar_t is 32-bit, copy directly
388-
copy_from((const char32_t *)p_cstr, p_clip_to);
389-
#endif
332+
copy_from_unchecked(p_cstr.c_str, p_cstr.len);
390333
}
391334

392335
void String::copy_from(const char32_t &p_char) {
@@ -412,42 +355,6 @@ void String::copy_from(const char32_t &p_char) {
412355
dst[1] = 0;
413356
}
414357

415-
void String::copy_from(const char32_t *p_cstr) {
416-
if (!p_cstr) {
417-
resize(0);
418-
return;
419-
}
420-
421-
const int len = strlen(p_cstr);
422-
423-
if (len == 0) {
424-
resize(0);
425-
return;
426-
}
427-
428-
copy_from_unchecked(p_cstr, len);
429-
}
430-
431-
void String::copy_from(const char32_t *p_cstr, const int p_clip_to) {
432-
if (!p_cstr) {
433-
resize(0);
434-
return;
435-
}
436-
437-
int len = 0;
438-
const char32_t *ptr = p_cstr;
439-
while ((p_clip_to < 0 || len < p_clip_to) && *(ptr++) != 0) {
440-
len++;
441-
}
442-
443-
if (len == 0) {
444-
resize(0);
445-
return;
446-
}
447-
448-
copy_from_unchecked(p_cstr, len);
449-
}
450-
451358
// assumes the following have already been validated:
452359
// p_char != nullptr
453360
// p_length > 0
@@ -475,18 +382,6 @@ void String::copy_from_unchecked(const char32_t *p_char, const int p_length) {
475382
*dst = 0;
476383
}
477384

478-
void String::operator=(const char *p_str) {
479-
copy_from(p_str);
480-
}
481-
482-
void String::operator=(const char32_t *p_str) {
483-
copy_from(p_str);
484-
}
485-
486-
void String::operator=(const wchar_t *p_str) {
487-
copy_from(p_str);
488-
}
489-
490385
String String::operator+(const String &p_str) const {
491386
String res = *this;
492387
res += p_str;
@@ -697,7 +592,7 @@ bool String::operator==(const String &p_str) const {
697592
return true;
698593
}
699594

700-
bool String::operator==(const StrRange &p_str_range) const {
595+
bool String::operator==(const StrRange<char32_t> &p_str_range) const {
701596
int len = p_str_range.len;
702597

703598
if (length() != len) {
@@ -2512,37 +2407,6 @@ Char16String String::utf16() const {
25122407
return utf16s;
25132408
}
25142409

2515-
String::String(const char *p_str) {
2516-
copy_from(p_str);
2517-
}
2518-
2519-
String::String(const wchar_t *p_str) {
2520-
copy_from(p_str);
2521-
}
2522-
2523-
String::String(const char32_t *p_str) {
2524-
copy_from(p_str);
2525-
}
2526-
2527-
String::String(const char *p_str, int p_clip_to_len) {
2528-
copy_from(p_str, p_clip_to_len);
2529-
}
2530-
2531-
String::String(const wchar_t *p_str, int p_clip_to_len) {
2532-
copy_from(p_str, p_clip_to_len);
2533-
}
2534-
2535-
String::String(const char32_t *p_str, int p_clip_to_len) {
2536-
copy_from(p_str, p_clip_to_len);
2537-
}
2538-
2539-
String::String(const StrRange &p_range) {
2540-
if (!p_range.c_str) {
2541-
return;
2542-
}
2543-
copy_from(p_range.c_str, p_range.len);
2544-
}
2545-
25462410
int64_t String::hex_to_int() const {
25472411
int len = length();
25482412
if (len == 0) {

0 commit comments

Comments
 (0)