summaryrefslogtreecommitdiff
path: root/core/fxcrt/bytestring.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcrt/bytestring.cpp')
-rw-r--r--core/fxcrt/bytestring.cpp50
1 files changed, 36 insertions, 14 deletions
diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 37121a7da9..704cdd46aa 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -251,13 +251,39 @@ bool ByteString::operator==(const ByteString& other) const {
m_pData->m_nDataLength) == 0;
}
-bool ByteString::operator<(const ByteString& str) const {
- if (m_pData == str.m_pData)
+bool ByteString::operator<(const char* ptr) const {
+ if (!m_pData && !ptr)
return false;
+ if (c_str() == ptr)
+ return false;
+
+ size_t len = GetLength();
+ size_t other_len = ptr ? strlen(ptr) : 0;
+ int result = memcmp(c_str(), ptr, std::min(len, other_len));
+ return result < 0 || (result == 0 && len < other_len);
+}
+bool ByteString::operator<(const ByteStringView& str) const {
+ if (!m_pData && !str.unterminated_c_str())
+ return false;
+ if (c_str() == str.unterminated_c_str())
+ return false;
+
+ size_t len = GetLength();
+ size_t other_len = str.GetLength();
int result =
- memcmp(c_str(), str.c_str(), std::min(GetLength(), str.GetLength()));
- return result < 0 || (result == 0 && GetLength() < str.GetLength());
+ memcmp(c_str(), str.unterminated_c_str(), std::min(len, other_len));
+ return result < 0 || (result == 0 && len < other_len);
+}
+
+bool ByteString::operator<(const ByteString& other) const {
+ if (m_pData == other.m_pData)
+ return false;
+
+ size_t len = GetLength();
+ size_t other_len = other.GetLength();
+ int result = memcmp(c_str(), other.c_str(), std::min(len, other_len));
+ return result < 0 || (result == 0 && len < other_len);
}
bool ByteString::EqualNoCase(const ByteStringView& str) const {
@@ -668,26 +694,22 @@ ByteString ByteString::FromUnicode(const WideString& str) {
}
int ByteString::Compare(const ByteStringView& str) const {
- if (!m_pData) {
+ if (!m_pData)
return str.IsEmpty() ? 0 : -1;
- }
+
size_t this_len = m_pData->m_nDataLength;
size_t that_len = str.GetLength();
size_t min_len = std::min(this_len, that_len);
for (size_t i = 0; i < min_len; i++) {
- if (static_cast<uint8_t>(m_pData->m_String[i]) < str[i]) {
+ if (static_cast<uint8_t>(m_pData->m_String[i]) < str[i])
return -1;
- }
- if (static_cast<uint8_t>(m_pData->m_String[i]) > str[i]) {
+ if (static_cast<uint8_t>(m_pData->m_String[i]) > str[i])
return 1;
- }
}
- if (this_len < that_len) {
+ if (this_len < that_len)
return -1;
- }
- if (this_len > that_len) {
+ if (this_len > that_len)
return 1;
- }
return 0;
}