aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-11-26 20:14:35 +0100
committerShauren <shauren.trinity@gmail.com>2024-11-26 20:14:35 +0100
commit2a6fd947ded9fb6333de0e50b7216602cc9c1255 (patch)
tree27e4b82ef77a6ab12b52881a17474c39fbe529e8 /src/common
parent93c8993314cde7f45f1b0be32152a318aee51999 (diff)
Core/Misc: Modernize and improve GetMainPartOfName
Diffstat (limited to 'src/common')
-rw-r--r--src/common/Utilities/Util.cpp86
1 files changed, 45 insertions, 41 deletions
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
index ddf649ff663..dded1af889f 100644
--- a/src/common/Utilities/Util.cpp
+++ b/src/common/Utilities/Util.cpp
@@ -437,10 +437,10 @@ bool WStrToUtf8(std::wstring_view wstr, std::string& utf8str)
return true;
}
-void wstrToUpper(std::wstring& str) { std::transform(std::begin(str), std::end(str), std::begin(str), wcharToUpper); }
-void wstrToLower(std::wstring& str) { std::transform(std::begin(str), std::end(str), std::begin(str), wcharToLower); }
-void strToUpper(std::string& str) { std::transform(std::begin(str), std::end(str), std::begin(str), charToUpper); }
-void strToLower(std::string& str) { std::transform(std::begin(str), std::end(str), std::begin(str), charToLower); }
+void wstrToUpper(std::wstring& str) { std::ranges::transform(str, std::begin(str), wcharToUpper); }
+void wstrToLower(std::wstring& str) { std::ranges::transform(str, std::begin(str), wcharToLower); }
+void strToUpper(std::string& str) { std::ranges::transform(str, std::begin(str), charToUpper); }
+void strToLower(std::string& str) { std::ranges::transform(str, std::begin(str), charToLower); }
std::wstring wstrCaseAccentInsensitiveParse(std::wstring_view wstr, LocaleConstant locale)
{
@@ -629,51 +629,55 @@ std::wstring wstrCaseAccentInsensitiveParse(std::wstring_view wstr, LocaleConsta
std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension)
{
+ std::wstring result = wname;
+
// supported only Cyrillic cases
if (wname.empty() || !isCyrillicCharacter(wname[0]) || declension > 5)
- return wname;
+ return result;
// Important: end length must be <= MAX_INTERNAL_PLAYER_NAME-MAX_PLAYER_NAME (3 currently)
- static std::wstring const a_End = { wchar_t(0x0430) };
- static std::wstring const o_End = { wchar_t(0x043E) };
- static std::wstring const ya_End = { wchar_t(0x044F) };
- static std::wstring const ie_End = { wchar_t(0x0435) };
- static std::wstring const i_End = { wchar_t(0x0438) };
- static std::wstring const yeru_End = { wchar_t(0x044B) };
- static std::wstring const u_End = { wchar_t(0x0443) };
- static std::wstring const yu_End = { wchar_t(0x044E) };
- static std::wstring const oj_End = { wchar_t(0x043E), wchar_t(0x0439) };
- static std::wstring const ie_j_End = { wchar_t(0x0435), wchar_t(0x0439) };
- static std::wstring const io_j_End = { wchar_t(0x0451), wchar_t(0x0439) };
- static std::wstring const o_m_End = { wchar_t(0x043E), wchar_t(0x043C) };
- static std::wstring const io_m_End = { wchar_t(0x0451), wchar_t(0x043C) };
- static std::wstring const ie_m_End = { wchar_t(0x0435), wchar_t(0x043C) };
- static std::wstring const soft_End = { wchar_t(0x044C) };
- static std::wstring const j_End = { wchar_t(0x0439) };
-
- static std::array<std::array<std::wstring const*, 7>, 6> const dropEnds = {{
- { &a_End, &o_End, &ya_End, &ie_End, &soft_End, &j_End, nullptr },
- { &a_End, &ya_End, &yeru_End, &i_End, nullptr, nullptr, nullptr },
- { &ie_End, &u_End, &yu_End, &i_End, nullptr, nullptr, nullptr },
- { &u_End, &yu_End, &o_End, &ie_End, &soft_End, &ya_End, &a_End },
- { &oj_End, &io_j_End, &ie_j_End, &o_m_End, &io_m_End, &ie_m_End, &yu_End },
- { &ie_End, &i_End, nullptr, nullptr, nullptr, nullptr, nullptr }
+ static constexpr std::wstring_view a_End = L"\x430";
+ static constexpr std::wstring_view o_End = L"\x43E";
+ static constexpr std::wstring_view ya_End = L"\x44F";
+ static constexpr std::wstring_view ie_End = L"\x435";
+ static constexpr std::wstring_view i_End = L"\x438";
+ static constexpr std::wstring_view yeru_End = L"\x44B";
+ static constexpr std::wstring_view u_End = L"\x443";
+ static constexpr std::wstring_view yu_End = L"\x44E";
+ static constexpr std::wstring_view oj_End = L"\x43E\x439";
+ static constexpr std::wstring_view ie_j_End = L"\x435\x439";
+ static constexpr std::wstring_view io_j_End = L"\x451\x439";
+ static constexpr std::wstring_view o_m_End = L"\x43E\x43C";
+ static constexpr std::wstring_view io_m_End = L"\x451\x43C";
+ static constexpr std::wstring_view ie_m_End = L"\x435\x43C";
+ static constexpr std::wstring_view soft_End = L"\x44C";
+ static constexpr std::wstring_view j_End = L"\x439";
+
+ static constexpr std::array<std::array<std::wstring_view, 7>, 6> dropEnds = {{
+ { a_End, o_End, ya_End, ie_End, soft_End, j_End, {} },
+ { a_End, ya_End, yeru_End, i_End, {}, {}, {} },
+ { ie_End, u_End, yu_End, i_End, {}, {}, {} },
+ { u_End, yu_End, o_End, ie_End, soft_End, ya_End, a_End },
+ { oj_End, io_j_End, ie_j_End, o_m_End, io_m_End, ie_m_End, yu_End },
+ { ie_End, i_End, {}, {}, {}, {}, {} }
}};
std::size_t const thisLen = wname.length();
- std::array<std::wstring const*, 7> const& endings = dropEnds[declension];
- for (auto itr = endings.begin(), end = endings.end(); (itr != end) && *itr; ++itr)
+ std::array<std::wstring_view, 7> const& endings = dropEnds[declension];
+ for (auto itr = endings.begin(), end = endings.end(); itr != end && !itr->empty(); ++itr)
{
- std::wstring const& ending = **itr;
- std::size_t const endLen = ending.length();
- if (!(endLen <= thisLen))
+ std::size_t const endLen = itr->length();
+ if (endLen > thisLen)
continue;
- if (wname.substr(thisLen-endLen, thisLen) == ending)
- return wname.substr(0, thisLen-endLen);
+ if (wname.ends_with(*itr))
+ {
+ result.erase(thisLen - endLen);
+ break;
+ }
}
- return wname;
+ return result;
}
bool utf8ToConsole(std::string_view utf8str, std::string& conStr)
@@ -759,7 +763,7 @@ bool Utf8ToUpperOnlyLatin(std::string& utf8String)
if (!Utf8toWStr(utf8String, wstr))
return false;
- std::transform(wstr.begin(), wstr.end(), wstr.begin(), wcharToUpperOnlyLatin);
+ std::ranges::transform(wstr, wstr.begin(), wcharToUpperOnlyLatin);
return WStrToUtf8(wstr, utf8String);
}
@@ -852,18 +856,18 @@ void Trinity::Impl::HexStrToByteArray(std::string_view str, uint8* out, size_t o
bool StringEqualI(std::string_view a, std::string_view b)
{
- return std::equal(a.begin(), a.end(), b.begin(), b.end(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2); });
+ return std::ranges::equal(a, b, {}, charToLower, charToLower);
}
bool StringContainsStringI(std::string_view haystack, std::string_view needle)
{
return haystack.end() !=
- std::search(haystack.begin(), haystack.end(), needle.begin(), needle.end(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2); });
+ std::ranges::search(haystack, needle, {}, charToLower, charToLower).begin();
}
bool StringCompareLessI(std::string_view a, std::string_view b)
{
- return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](char c1, char c2) { return std::tolower(c1) < std::tolower(c2); });
+ return std::ranges::lexicographical_compare(a, b, {}, charToLower, charToLower);
}
std::string Trinity::Impl::GetTypeName(std::type_info const& info)