diff options
-rw-r--r-- | core/string_db.h | 17 | ||||
-rw-r--r-- | core/ustring.cpp | 61 | ||||
-rw-r--r-- | core/ustring.h | 23 |
3 files changed, 42 insertions, 59 deletions
diff --git a/core/string_db.h b/core/string_db.h index de91e2abd8..9665198ecd 100644 --- a/core/string_db.h +++ b/core/string_db.h @@ -138,7 +138,22 @@ public: _FORCE_INLINE_ bool operator()(const StringName &l, const StringName &r) const { - return l.operator String() < r.operator String(); + const char *l_cname = l._data ? l._data->cname : ""; + const char *r_cname = r._data ? r._data->cname : ""; + + if (l_cname) { + + if (r_cname) + return is_str_less(l_cname, r_cname); + else + return is_str_less(l_cname, r._data->name.ptr()); + } else { + + if (r_cname) + return is_str_less(l._data->name.ptr(), r_cname); + else + return is_str_less(l._data->name.ptr(), r._data->name.ptr()); + } } }; diff --git a/core/ustring.cpp b/core/ustring.cpp index 3a0708851e..9cd94ac919 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -64,26 +64,7 @@ bool CharString::operator<(const CharString &p_right) const { return p_right.length() != 0; } - const char *this_str = get_data(); - const char *that_str = p_right.get_data(); - while (true) { - - if (*that_str == 0 && *this_str == 0) - return false; //this can't be equal, sadly - else if (*this_str == 0) - return true; //if this is empty, and the other one is not, then we're less.. I think? - else if (*that_str == 0) - return false; //otherwise the other one is smaller.. - else if (*this_str < *that_str) //more than - return true; - else if (*this_str > *that_str) //less than - return false; - - this_str++; - that_str++; - } - - return false; //should never reach here anyway + return is_str_less(get_data(), p_right.get_data()); } const char *CharString::get_data() const { @@ -372,25 +353,7 @@ bool String::operator<(const CharType *p_str) const { if (empty()) return true; - const CharType *this_str = c_str(); - while (true) { - - if (*p_str == 0 && *this_str == 0) - return false; //this can't be equal, sadly - else if (*this_str == 0) - return true; //if this is empty, and the other one is not, then we're less.. I think? - else if (*p_str == 0) - return false; //otherwise the other one is smaller.. - else if (*this_str < *p_str) //more than - return true; - else if (*this_str > *p_str) //less than - return false; - - this_str++; - p_str++; - } - - return false; //should never reach here anyway + return is_str_less(c_str(), p_str); } bool String::operator<=(String p_str) const { @@ -405,25 +368,7 @@ bool String::operator<(const char *p_str) const { if (empty()) return true; - const CharType *this_str = c_str(); - while (true) { - - if (*p_str == 0 && *this_str == 0) - return false; //this can't be equal, sadly - else if (*this_str == 0) - return true; //if this is empty, and the other one is not, then we're less.. I think? - else if (*p_str == 0) - return false; //otherwise the other one is smaller.. - else if (*this_str < *p_str) //more than - return true; - else if (*this_str > *p_str) //less than - return false; - - this_str++; - p_str++; - } - - return false; //should never reach here anyway + return is_str_less(c_str(), p_str); } bool String::operator<(String p_str) const { diff --git a/core/ustring.h b/core/ustring.h index 9c24133b55..a56c90544a 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -272,6 +272,29 @@ struct NaturalNoCaseComparator { } }; +template <typename L, typename R> +_FORCE_INLINE_ bool is_str_less(const L *l_ptr, const R *r_ptr) { + + while (true) { + + if (*l_ptr == 0 && *r_ptr == 0) + return false; + else if (*l_ptr == 0) + return true; + else if (*r_ptr == 0) + return false; + else if (*l_ptr < *r_ptr) + return true; + else if (*l_ptr > *r_ptr) + return false; + + l_ptr++; + r_ptr++; + } + + CRASH_COND(true); // unreachable +} + /* end of namespace */ //tool translate |