diff options
author | Lei Zhang <thestig@chromium.org> | 2017-11-06 19:00:21 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-11-06 19:00:21 +0000 |
commit | d7a3f981fdc6bf9aef306854505638db7b4b51c7 (patch) | |
tree | bb83ad096cf3618b864e93f4cbb07632a9510368 /core/fxcrt/widestring.cpp | |
parent | ac7ce6ec217ba7b4753f4cf2ed80c921d8ea6898 (diff) | |
download | pdfium-d7a3f981fdc6bf9aef306854505638db7b4b51c7.tar.xz |
Improve ByteString{View}::operator<().
Make it possible to compare:
1) const char* < ByteStringView
2) ByteString < const char*
3) ByteString < ByteStringView
4) const char* < ByteString
Do the same for WideString{View}. With new unit test cases.
Change-Id: I31da526b1ab78b8d51ec1c99bf29046fe13754d5
Reviewed-on: https://pdfium-review.googlesource.com/17872
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'core/fxcrt/widestring.cpp')
-rw-r--r-- | core/fxcrt/widestring.cpp | 67 |
1 files changed, 42 insertions, 25 deletions
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp index adeb28cc16..bd504e0cac 100644 --- a/core/fxcrt/widestring.cpp +++ b/core/fxcrt/widestring.cpp @@ -434,13 +434,39 @@ bool WideString::operator==(const WideString& other) const { m_pData->m_nDataLength) == 0; } -bool WideString::operator<(const WideString& str) const { - if (m_pData == str.m_pData) +bool WideString::operator<(const wchar_t* ptr) const { + if (!m_pData && !ptr) return false; + if (c_str() == ptr) + return false; + + size_t len = GetLength(); + size_t other_len = ptr ? wcslen(ptr) : 0; + int result = wmemcmp(c_str(), ptr, std::min(len, other_len)); + return result < 0 || (result == 0 && len < other_len); +} +bool WideString::operator<(const WideStringView& 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 = - wmemcmp(c_str(), str.c_str(), std::min(GetLength(), str.GetLength())); - return result < 0 || (result == 0 && GetLength() < str.GetLength()); + wmemcmp(c_str(), str.unterminated_c_str(), std::min(len, other_len)); + return result < 0 || (result == 0 && len < other_len); +} + +bool WideString::operator<(const WideString& other) const { + if (m_pData == other.m_pData) + return false; + + size_t len = GetLength(); + size_t other_len = other.GetLength(); + int result = wmemcmp(c_str(), other.c_str(), std::min(len, other_len)); + return result < 0 || (result == 0 && len < other_len); } void WideString::AssignCopy(const wchar_t* pSrcData, size_t nSrcLen) { @@ -880,45 +906,36 @@ void WideString::SetAt(size_t index, wchar_t c) { int WideString::Compare(const wchar_t* lpsz) const { if (m_pData) - return wcscmp(m_pData->m_String, lpsz); + return lpsz ? wcscmp(m_pData->m_String, lpsz) : 1; return (!lpsz || lpsz[0] == 0) ? 0 : -1; } int WideString::Compare(const WideString& str) const { - if (!m_pData) { - if (!str.m_pData) { - return 0; - } - return -1; - } - if (!str.m_pData) { + if (!m_pData) + return str.m_pData ? -1 : 0; + if (!str.m_pData) return 1; - } + size_t this_len = m_pData->m_nDataLength; size_t that_len = str.m_pData->m_nDataLength; size_t min_len = std::min(this_len, that_len); for (size_t i = 0; i < min_len; i++) { - if (m_pData->m_String[i] < str.m_pData->m_String[i]) { + if (m_pData->m_String[i] < str.m_pData->m_String[i]) return -1; - } - if (m_pData->m_String[i] > str.m_pData->m_String[i]) { + if (m_pData->m_String[i] > str.m_pData->m_String[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; } int WideString::CompareNoCase(const wchar_t* lpsz) const { - if (!m_pData) { - return (!lpsz || lpsz[0] == 0) ? 0 : -1; - } - return FXSYS_wcsicmp(m_pData->m_String, lpsz); + if (m_pData) + return lpsz ? FXSYS_wcsicmp(m_pData->m_String, lpsz) : 1; + return (!lpsz || lpsz[0] == 0) ? 0 : -1; } size_t WideString::WStringLength(const unsigned short* str) { |