Merge pull request #20569 from ZehMatt/string-cleanup-2

String cleanup 2
This commit is contained in:
Matthias Moninger 2023-07-06 14:55:20 +03:00 committed by GitHub
commit 0a3573ec67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 176 additions and 151 deletions

View File

@ -23,51 +23,51 @@ constexpr uint32_t UsefulModifiers = KMOD_SHIFT | KMOD_CTRL | KMOD_ALT | KMOD_GU
static uint32_t ParseModifier(std::string_view text) static uint32_t ParseModifier(std::string_view text)
{ {
if (String::Equals(text, "CTRL", true)) if (String::IEquals(text, "CTRL"))
{ {
return KMOD_CTRL; return KMOD_CTRL;
} }
if (String::Equals(text, "LCTRL", true)) if (String::IEquals(text, "LCTRL"))
{ {
return KMOD_LCTRL; return KMOD_LCTRL;
} }
if (String::Equals(text, "RCTRL", true)) if (String::IEquals(text, "RCTRL"))
{ {
return KMOD_RCTRL; return KMOD_RCTRL;
} }
if (String::Equals(text, "SHIFT", true)) if (String::IEquals(text, "SHIFT"))
{ {
return KMOD_SHIFT; return KMOD_SHIFT;
} }
if (String::Equals(text, "LSHIFT", true)) if (String::IEquals(text, "LSHIFT"))
{ {
return KMOD_LSHIFT; return KMOD_LSHIFT;
} }
if (String::Equals(text, "RSHIFT", true)) if (String::IEquals(text, "RSHIFT"))
{ {
return KMOD_RSHIFT; return KMOD_RSHIFT;
} }
if (String::Equals(text, "ALT", true)) if (String::IEquals(text, "ALT"))
{ {
return KMOD_ALT; return KMOD_ALT;
} }
if (String::Equals(text, "LALT", true)) if (String::IEquals(text, "LALT"))
{ {
return KMOD_LALT; return KMOD_LALT;
} }
if (String::Equals(text, "RALT", true)) if (String::IEquals(text, "RALT"))
{ {
return KMOD_RALT; return KMOD_RALT;
} }
if (String::Equals(text, "GUI", true)) if (String::IEquals(text, "GUI"))
{ {
return KMOD_GUI; return KMOD_GUI;
} }
if (String::Equals(text, "LCTRL", true)) if (String::IEquals(text, "LCTRL"))
{ {
return KMOD_LGUI; return KMOD_LGUI;
} }
if (String::Equals(text, "RGUI", true)) if (String::IEquals(text, "RGUI"))
{ {
return KMOD_RGUI; return KMOD_RGUI;
} }
@ -167,13 +167,13 @@ ShortcutInput::ShortcutInput(std::string_view value)
Button = *number - 1; Button = *number - 1;
} }
} }
else if (String::Equals(rem, "LMB", true)) else if (String::IEquals(rem, "LMB"))
{ {
Kind = InputDeviceKind::Mouse; Kind = InputDeviceKind::Mouse;
Modifiers = modifiers; Modifiers = modifiers;
Button = 0; Button = 0;
} }
else if (String::Equals(rem, "RMB", true)) else if (String::IEquals(rem, "RMB"))
{ {
Kind = InputDeviceKind::Mouse; Kind = InputDeviceKind::Mouse;
Modifiers = modifiers; Modifiers = modifiers;

View File

@ -721,7 +721,7 @@ size_t ThemeGetIndexForName(const utf8* name)
for (size_t i = 0; i < count; i++) for (size_t i = 0; i < count; i++)
{ {
const utf8* tn = ThemeManagerGetAvailableThemeName(i); const utf8* tn = ThemeManagerGetAvailableThemeName(i);
if (String::Equals(tn, name, true)) if (String::IEquals(tn, name))
{ {
return i; return i;
} }

View File

@ -574,7 +574,7 @@ namespace OpenRCT2
try try
{ {
if (String::Equals(Path::GetExtension(path), ".sea", true)) if (String::IEquals(Path::GetExtension(path), ".sea"))
{ {
auto data = DecryptSea(fs::u8path(path)); auto data = DecryptSea(fs::u8path(path));
auto ms = MemoryStream(data.data(), data.size(), MEMORY_ACCESS::READ); auto ms = MemoryStream(data.data(), data.size(), MEMORY_ACCESS::READ);

View File

@ -197,25 +197,25 @@ static bool TryClassifyAsTD4_TD6(OpenRCT2::IStream* stream, ClassifiedFileInfo*
FileExtension GetFileExtensionType(u8string_view path) FileExtension GetFileExtensionType(u8string_view path)
{ {
auto extension = Path::GetExtension(path); auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".dat", true) || String::Equals(extension, ".pob", true)) if (String::IEquals(extension, ".dat") || String::IEquals(extension, ".pob"))
return FileExtension::DAT; return FileExtension::DAT;
if (String::Equals(extension, ".sc4", true)) if (String::IEquals(extension, ".sc4"))
return FileExtension::SC4; return FileExtension::SC4;
if (String::Equals(extension, ".sv4", true)) if (String::IEquals(extension, ".sv4"))
return FileExtension::SV4; return FileExtension::SV4;
if (String::Equals(extension, ".td4", true)) if (String::IEquals(extension, ".td4"))
return FileExtension::TD4; return FileExtension::TD4;
if (String::Equals(extension, ".sc6", true)) if (String::IEquals(extension, ".sc6"))
return FileExtension::SC6; return FileExtension::SC6;
if (String::Equals(extension, ".sea", true)) if (String::IEquals(extension, ".sea"))
return FileExtension::SC6; return FileExtension::SC6;
if (String::Equals(extension, ".sv6", true)) if (String::IEquals(extension, ".sv6"))
return FileExtension::SV6; return FileExtension::SV6;
if (String::Equals(extension, ".sv7", true)) if (String::IEquals(extension, ".sv7"))
return FileExtension::SV6; return FileExtension::SV6;
if (String::Equals(extension, ".td6", true)) if (String::IEquals(extension, ".td6"))
return FileExtension::TD6; return FileExtension::TD6;
if (String::Equals(extension, ".park", true)) if (String::IEquals(extension, ".park"))
return FileExtension::PARK; return FileExtension::PARK;
return FileExtension::Unknown; return FileExtension::Unknown;
} }

View File

@ -41,17 +41,16 @@ namespace ParkImporter
bool ExtensionIsOpenRCT2ParkFile(std::string_view extension) bool ExtensionIsOpenRCT2ParkFile(std::string_view extension)
{ {
return String::Equals(extension, ".park", true); return String::IEquals(extension, ".park");
} }
bool ExtensionIsRCT1(std::string_view extension) bool ExtensionIsRCT1(std::string_view extension)
{ {
return String::Equals(extension, ".sc4", true) || String::Equals(extension, ".sv4", true); return String::IEquals(extension, ".sc4") || String::IEquals(extension, ".sv4");
} }
bool ExtensionIsScenario(std::string_view extension) bool ExtensionIsScenario(std::string_view extension)
{ {
return String::Equals(extension, ".sc4", true) || String::Equals(extension, ".sc6", true) return String::IEquals(extension, ".sc4") || String::IEquals(extension, ".sc6") || String::IEquals(extension, ".sea");
|| String::Equals(extension, ".sea", true);
} }
} // namespace ParkImporter } // namespace ParkImporter

View File

@ -33,6 +33,6 @@ namespace TrackImporter
bool ExtensionIsRCT1(const std::string& extension) bool ExtensionIsRCT1(const std::string& extension)
{ {
return String::Equals(extension, ".td4", true); return String::IEquals(extension, ".td4");
} }
} // namespace TrackImporter } // namespace TrackImporter

View File

@ -49,9 +49,9 @@ const CommandLineCommand CommandLine::SpriteCommands[]
static exitcode_t HandleSprite(CommandLineArgEnumerator* argEnumerator) static exitcode_t HandleSprite(CommandLineArgEnumerator* argEnumerator)
{ {
if (String::Equals(_mode, SZ_CLOSEST, true)) if (String::IEquals(_mode, SZ_CLOSEST))
gSpriteMode = ImportMode::Closest; gSpriteMode = ImportMode::Closest;
else if (String::Equals(_mode, SZ_DITHERING, true)) else if (String::IEquals(_mode, SZ_DITHERING))
gSpriteMode = ImportMode::Dithering; gSpriteMode = ImportMode::Dithering;
Memory::Free(_mode); Memory::Free(_mode);

View File

@ -61,7 +61,7 @@ public:
{ {
for (const auto& entry : _entries) for (const auto& entry : _entries)
{ {
if (String::Equals(entry.Key, key, true)) if (String::IEquals(entry.Key, key))
{ {
return entry.Value; return entry.Value;
} }

View File

@ -133,7 +133,7 @@ public:
std::string value; std::string value;
if (TryGetString(name, &value)) if (TryGetString(name, &value))
{ {
result = String::Equals(value, "true", true); result = String::IEquals(value, "true");
} }
return result; return result;
} }

View File

@ -108,7 +108,7 @@ namespace Path
bool Equals(u8string_view a, u8string_view b) bool Equals(u8string_view a, u8string_view b)
{ {
return String::Equals(a, b, Platform::ShouldIgnoreCase()); return Platform::ShouldIgnoreCase() ? String::IEquals(a, b) : String::Equals(a, b);
} }
u8string ResolveCasing(u8string_view path) u8string ResolveCasing(u8string_view path)

View File

@ -150,66 +150,28 @@ namespace String
return strcmp(a, b); return strcmp(a, b);
} }
bool Equals(std::string_view a, std::string_view b, bool ignoreCase) template<typename TString> static bool EqualsImpl(TString&& lhs, TString&& rhs, bool ignoreCase)
{ {
if (ignoreCase) return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [ignoreCase](auto a, auto b) {
{ const auto first = static_cast<unsigned char>(a);
if (a.size() == b.size()) const auto second = static_cast<unsigned char>(b);
if (((first | second) & 0x80) != 0)
{ {
for (size_t i = 0; i < a.size(); i++) // Only do case insensitive comparison on ASCII characters
{ return first == second;
if (tolower(static_cast<unsigned char>(a[i])) != tolower(static_cast<unsigned char>(b[i])))
{
return false;
}
}
return true;
} }
return ignoreCase ? (tolower(first) == tolower(second)) : (first == second);
return false; });
}
return a == b;
} }
bool Equals(const std::string& a, const std::string& b, bool ignoreCase) bool Equals(u8string_view a, u8string_view b)
{ {
if (a.size() != b.size()) return EqualsImpl(a, b, false);
return false; }
if (ignoreCase) bool Equals(const u8string& a, const u8string& b)
{ {
for (size_t i = 0; i < a.size(); i++) return EqualsImpl(a, b, false);
{
auto ai = a[i];
auto bi = b[i];
// Only do case insensitive comparison on ASCII characters
if ((ai & 0x80) != 0 || (bi & 0x80) != 0)
{
if (a[i] != b[i])
{
return false;
}
}
else if (tolower(static_cast<unsigned char>(ai)) != tolower(static_cast<unsigned char>(bi)))
{
return false;
}
}
}
else
{
for (size_t i = 0; i < a.size(); i++)
{
if (a[i] != b[i])
{
return false;
}
}
}
return true;
} }
bool Equals(const utf8* a, const utf8* b, bool ignoreCase) bool Equals(const utf8* a, const utf8* b, bool ignoreCase)
@ -227,12 +189,31 @@ namespace String
return strcmp(a, b) == 0; return strcmp(a, b) == 0;
} }
bool IEquals(u8string_view a, u8string_view b)
{
return EqualsImpl(a, b, true);
}
bool IEquals(const u8string& a, const u8string& b)
{
return EqualsImpl(a, b, true);
}
bool IEquals(const utf8* a, const utf8* b)
{
if (a == b)
return true;
if (a == nullptr || b == nullptr)
return false;
return _stricmp(a, b) == 0;
}
bool StartsWith(std::string_view str, std::string_view match, bool ignoreCase) bool StartsWith(std::string_view str, std::string_view match, bool ignoreCase)
{ {
if (str.size() >= match.size()) if (str.size() >= match.size())
{ {
auto view = str.substr(0, match.size()); auto view = str.substr(0, match.size());
return Equals(view, match, ignoreCase); return EqualsImpl(view, match, ignoreCase);
} }
return false; return false;
} }
@ -242,7 +223,7 @@ namespace String
if (str.size() >= match.size()) if (str.size() >= match.size())
{ {
auto view = str.substr(str.size() - match.size()); auto view = str.substr(str.size() - match.size());
return Equals(view, match, ignoreCase); return EqualsImpl(view, match, ignoreCase);
} }
return false; return false;
} }
@ -259,7 +240,7 @@ namespace String
for (size_t start = 0; start <= end; start++) for (size_t start = 0; start <= end; start++)
{ {
auto sub = haystack.substr(start, needle.size()); auto sub = haystack.substr(start, needle.size());
if (Equals(sub, needle, ignoreCase)) if (EqualsImpl(sub, needle, ignoreCase))
{ {
return true; return true;
} }

View File

@ -56,21 +56,14 @@ namespace String
bool IsNullOrEmpty(const utf8* str); bool IsNullOrEmpty(const utf8* str);
int32_t Compare(const std::string& a, const std::string& b, bool ignoreCase = false); int32_t Compare(const std::string& a, const std::string& b, bool ignoreCase = false);
int32_t Compare(const utf8* a, const utf8* b, bool ignoreCase = false); int32_t Compare(const utf8* a, const utf8* b, bool ignoreCase = false);
bool Equals(std::string_view a, std::string_view b, bool ignoreCase = false);
inline bool IEquals(std::string_view a, std::string_view b) bool Equals(u8string_view a, u8string_view b);
{ bool Equals(const u8string& a, const u8string& b);
return Equals(a, b, true);
}
bool Equals(const std::string& a, const std::string& b, bool ignoreCase = false);
inline bool IEquals(const std::string& a, const std::string& b)
{
return Equals(a, b, true);
}
bool Equals(const utf8* a, const utf8* b, bool ignoreCase = false); bool Equals(const utf8* a, const utf8* b, bool ignoreCase = false);
inline bool IEquals(const utf8* a, const utf8* b) bool IEquals(u8string_view a, u8string_view b);
{ bool IEquals(const u8string& a, const u8string& b);
return Equals(a, b, true); bool IEquals(const utf8* a, const utf8* b);
}
bool StartsWith(std::string_view str, std::string_view match, bool ignoreCase = false); bool StartsWith(std::string_view str, std::string_view match, bool ignoreCase = false);
bool EndsWith(std::string_view str, std::string_view match, bool ignoreCase = false); bool EndsWith(std::string_view str, std::string_view match, bool ignoreCase = false);
bool Contains(std::string_view haystack, std::string_view needle, bool ignoreCase = false); bool Contains(std::string_view haystack, std::string_view needle, bool ignoreCase = false);

View File

@ -162,7 +162,7 @@ public:
int32_t ooIndex = 0; int32_t ooIndex = 0;
for (const ScenarioOverride& scenarioOverride : _scenarioOverrides) for (const ScenarioOverride& scenarioOverride : _scenarioOverrides)
{ {
if (String::Equals(scenarioOverride.filename.c_str(), scenarioFilename, true)) if (String::IEquals(scenarioOverride.filename, scenarioFilename))
{ {
if (scenarioOverride.strings[index].empty()) if (scenarioOverride.strings[index].empty())
{ {
@ -181,7 +181,7 @@ private:
{ {
for (auto& so : _scenarioOverrides) for (auto& so : _scenarioOverrides)
{ {
if (String::Equals(so.strings[0], scenarioIdentifier.c_str(), true)) if (String::IEquals(so.strings[0], scenarioIdentifier))
{ {
return &so; return &so;
} }

View File

@ -2113,7 +2113,7 @@ std::string NetworkBase::MakePlayerNameUnique(const std::string& name)
// Check if there is already a player with this name in the server // Check if there is already a player with this name in the server
for (const auto& player : player_list) for (const auto& player : player_list)
{ {
if (String::Equals(player->Name.c_str(), new_name.c_str(), true)) if (String::IEquals(player->Name, new_name))
{ {
unique = false; unique = false;
break; break;

View File

@ -186,7 +186,7 @@ const NetworkUser* NetworkUserManager::GetUserByName(const std::string& name) co
for (const auto& kvp : _usersByHash) for (const auto& kvp : _usersByHash)
{ {
const auto& networkUser = kvp.second; const auto& networkUser = kvp.second;
if (String::Equals(name.c_str(), networkUser->Name.c_str(), true)) if (String::IEquals(name, networkUser->Name))
{ {
return networkUser.get(); return networkUser.get();
} }

View File

@ -118,7 +118,7 @@ void ServerList::Sort()
[](const ServerListEntry& a, const ServerListEntry& b) { [](const ServerListEntry& a, const ServerListEntry& b) {
if (a.Favourite == b.Favourite) if (a.Favourite == b.Favourite)
{ {
return String::Equals(a.Address, b.Address, true); return String::IEquals(a.Address, b.Address);
} }
return false; return false;
}), }),

View File

@ -416,7 +416,7 @@ std::string ImageTable::FindLegacyObject(const std::string& name)
while (scanner->Next()) while (scanner->Next())
{ {
auto currentName = Path::GetFileName(scanner->GetPathRelative()); auto currentName = Path::GetFileName(scanner->GetPathRelative());
if (String::Equals(currentName, name, true) || String::Equals(currentName, altName, true)) if (String::IEquals(currentName, name) || String::IEquals(currentName, altName))
{ {
objectPath = scanner->GetPath(); objectPath = scanner->GetPath();
break; break;

View File

@ -101,11 +101,11 @@ public:
{ {
std::unique_ptr<Object> object; std::unique_ptr<Object> object;
auto extension = Path::GetExtension(path); auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".json", true)) if (String::IEquals(extension, ".json"))
{ {
object = ObjectFactory::CreateObjectFromJsonFile(_objectRepository, path, false); object = ObjectFactory::CreateObjectFromJsonFile(_objectRepository, path, false);
} }
else if (String::Equals(extension, ".parkobj", true)) else if (String::IEquals(extension, ".parkobj"))
{ {
object = ObjectFactory::CreateObjectFromZipFile(_objectRepository, path, false); object = ObjectFactory::CreateObjectFromZipFile(_objectRepository, path, false);
} }
@ -267,11 +267,11 @@ public:
Guard::ArgumentNotNull(ori, GUARD_LINE); Guard::ArgumentNotNull(ori, GUARD_LINE);
auto extension = Path::GetExtension(ori->Path); auto extension = Path::GetExtension(ori->Path);
if (String::Equals(extension, ".json", true)) if (String::IEquals(extension, ".json"))
{ {
return ObjectFactory::CreateObjectFromJsonFile(*this, ori->Path, !gOpenRCT2NoGraphics); return ObjectFactory::CreateObjectFromJsonFile(*this, ori->Path, !gOpenRCT2NoGraphics);
} }
if (String::Equals(extension, ".parkobj", true)) if (String::IEquals(extension, ".parkobj"))
{ {
return ObjectFactory::CreateObjectFromZipFile(*this, ori->Path, !gOpenRCT2NoGraphics); return ObjectFactory::CreateObjectFromZipFile(*this, ori->Path, !gOpenRCT2NoGraphics);
} }

View File

@ -745,12 +745,12 @@ namespace OpenRCT2
for (const auto* ori : ExportObjectsList) for (const auto* ori : ExportObjectsList)
{ {
auto extension = Path::GetExtension(ori->Path); auto extension = Path::GetExtension(ori->Path);
if (String::Equals(extension, ".dat", true)) if (String::IEquals(extension, ".dat"))
{ {
cs.Write(DESCRIPTOR_DAT); cs.Write(DESCRIPTOR_DAT);
cs.Write(&ori->ObjectEntry, sizeof(RCTObjectEntry)); cs.Write(&ori->ObjectEntry, sizeof(RCTObjectEntry));
} }
else if (String::Equals(extension, ".parkobj", true)) else if (String::IEquals(extension, ".parkobj"))
{ {
cs.Write(DESCRIPTOR_PARKOBJ); cs.Write(DESCRIPTOR_PARKOBJ);
cs.Write(ori->Identifier); cs.Write(ori->Identifier);

View File

@ -223,7 +223,7 @@ namespace Platform
// Find a file which matches by name (case insensitive) // Find a file which matches by name (case insensitive)
for (int32_t i = 0; i < count; i++) for (int32_t i = 0; i < count; i++)
{ {
if (String::Equals(files[i]->d_name, fileName.c_str(), true)) if (String::IEquals(files[i]->d_name, fileName.c_str()))
{ {
result = Path::Combine(directory, std::string(files[i]->d_name)); result = Path::Combine(directory, std::string(files[i]->d_name));
break; break;

View File

@ -129,11 +129,11 @@ namespace RCT1
ParkLoadResult Load(const u8string& path) override ParkLoadResult Load(const u8string& path) override
{ {
const auto extension = Path::GetExtension(path); const auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".sc4", true)) if (String::IEquals(extension, ".sc4"))
{ {
return LoadScenario(path); return LoadScenario(path);
} }
if (String::Equals(extension, ".sv4", true)) if (String::IEquals(extension, ".sv4"))
{ {
return LoadSavedGame(path); return LoadSavedGame(path);
} }

View File

@ -40,7 +40,7 @@ namespace RCT1
bool Load(const utf8* path) override bool Load(const utf8* path) override
{ {
const auto extension = Path::GetExtension(path); const auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".td4", true)) if (String::IEquals(extension, ".td4"))
{ {
_name = GetNameFromTrackPath(path); _name = GetNameFromTrackPath(path);
auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN); auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN);

View File

@ -110,11 +110,11 @@ namespace RCT2
ParkLoadResult Load(const u8string& path) override ParkLoadResult Load(const u8string& path) override
{ {
const auto extension = Path::GetExtension(path); const auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".sc6", true)) if (String::IEquals(extension, ".sc6"))
{ {
return LoadScenario(path); return LoadScenario(path);
} }
if (String::Equals(extension, ".sv6", true)) if (String::IEquals(extension, ".sv6"))
{ {
return LoadSavedGame(path); return LoadSavedGame(path);
} }
@ -586,8 +586,8 @@ namespace RCT2
// clang-format on // clang-format on
} }
else if ( else if (
String::Equals(gScenarioFileName, "Six Flags Magic Mountain.SC6", true) String::IEquals(gScenarioFileName, "Six Flags Magic Mountain.SC6")
|| String::Equals(gScenarioFileName, "six flags magic mountain.sea", true)) || String::IEquals(gScenarioFileName, "six flags magic mountain.sea"))
{ {
// clang-format off // clang-format off
FixLandOwnershipTilesWithOwnership( FixLandOwnershipTilesWithOwnership(
@ -611,8 +611,8 @@ namespace RCT2
OWNERSHIP_OWNED); OWNERSHIP_OWNED);
} }
else if ( else if (
String::Equals(gScenarioFileName, "N America - Extreme Hawaiian Island.SC6", true) String::IEquals(gScenarioFileName, "N America - Extreme Hawaiian Island.SC6")
|| String::Equals(gScenarioFileName, "n america - extreme hawaiian island.sea", true)) || String::IEquals(gScenarioFileName, "n america - extreme hawaiian island.sea"))
{ {
FixLandOwnershipTilesWithOwnership( FixLandOwnershipTilesWithOwnership(
{ {
@ -647,8 +647,8 @@ namespace RCT2
{ {
return; return;
} }
if (String::Equals(_s6.ScenarioFilename, "Infernal Views.SC6", true) if (String::IEquals(_s6.ScenarioFilename, "Infernal Views.SC6")
|| String::Equals(_s6.ScenarioFilename, "infernal views.sea", true)) || String::IEquals(_s6.ScenarioFilename, "infernal views.sea"))
{ {
auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ 45, 62 }); auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ 45, 62 });
@ -656,7 +656,7 @@ namespace RCT2
} }
else if ( else if (
String::Equals(_s6.ScenarioFilename, "Six Flags Holland.SC6") String::Equals(_s6.ScenarioFilename, "Six Flags Holland.SC6")
|| String::Equals(_s6.ScenarioFilename, "six flags holland.sea", true)) || String::IEquals(_s6.ScenarioFilename, "six flags holland.sea"))
{ {
auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ 126, 73 }); auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ 126, 73 });

View File

@ -44,7 +44,7 @@ namespace RCT2
bool Load(const utf8* path) override bool Load(const utf8* path) override
{ {
const auto extension = Path::GetExtension(path); const auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".td6", true)) if (String::IEquals(extension, ".td6"))
{ {
_name = GetNameFromTrackPath(path); _name = GetNameFromTrackPath(path);
auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN); auto fs = OpenRCT2::FileStream(path, OpenRCT2::FILE_MODE_OPEN);

View File

@ -157,7 +157,7 @@ public:
entryIsNotSeparate = true; entryIsNotSeparate = true;
} }
if (entryIsNotSeparate || String::Equals(item.ObjectEntry, entry, true)) if (entryIsNotSeparate || String::IEquals(item.ObjectEntry, entry))
{ {
count++; count++;
} }
@ -191,7 +191,7 @@ public:
entryIsNotSeparate = true; entryIsNotSeparate = true;
} }
if (entryIsNotSeparate || String::Equals(item.ObjectEntry, entry, true)) if (entryIsNotSeparate || String::IEquals(item.ObjectEntry, entry))
{ {
TrackDesignFileRef ref; TrackDesignFileRef ref;
ref.name = GetNameFromTrackPath(item.Path); ref.name = GetNameFromTrackPath(item.Path);

View File

@ -173,7 +173,7 @@ protected:
private: private:
static std::unique_ptr<IStream> GetStreamFromRCT2Scenario(const std::string& path) static std::unique_ptr<IStream> GetStreamFromRCT2Scenario(const std::string& path)
{ {
if (String::Equals(Path::GetExtension(path), ".sea", true)) if (String::IEquals(Path::GetExtension(path), ".sea"))
{ {
auto data = DecryptSea(fs::u8path(path)); auto data = DecryptSea(fs::u8path(path));
auto ms = std::make_unique<MemoryStream>(); auto ms = std::make_unique<MemoryStream>();
@ -196,7 +196,7 @@ private:
try try
{ {
std::string extension = Path::GetExtension(path); std::string extension = Path::GetExtension(path);
if (String::Equals(extension, ".park", true)) if (String::IEquals(extension, ".park"))
{ {
// OpenRCT2 park // OpenRCT2 park
bool result = false; bool result = false;
@ -218,7 +218,7 @@ private:
return result; return result;
} }
if (String::Equals(extension, ".sc4", true)) if (String::IEquals(extension, ".sc4"))
{ {
// RCT1 scenario // RCT1 scenario
bool result = false; bool result = false;
@ -389,7 +389,7 @@ public:
const auto scenarioFilename = Path::GetFileName(scenario.Path); const auto scenarioFilename = Path::GetFileName(scenario.Path);
// Note: this is always case insensitive search for cross platform consistency // Note: this is always case insensitive search for cross platform consistency
if (String::Equals(filename, scenarioFilename, true)) if (String::IEquals(filename, scenarioFilename))
{ {
return &scenario; return &scenario;
} }
@ -407,7 +407,7 @@ public:
continue; continue;
// Note: this is always case insensitive search for cross platform consistency // Note: this is always case insensitive search for cross platform consistency
if (String::Equals(name, scenario->InternalName, true)) if (String::IEquals(name, scenario->InternalName))
{ {
return &_scenarios[i]; return &_scenarios[i];
} }
@ -441,18 +441,18 @@ public:
const std::string scenarioExtension = Path::GetExtension(scenarioFileName); const std::string scenarioExtension = Path::GetExtension(scenarioFileName);
// Check if this is an RCTC scenario that corresponds to a known RCT1/2 scenario or vice versa, see #12626 // Check if this is an RCTC scenario that corresponds to a known RCT1/2 scenario or vice versa, see #12626
if (String::Equals(scenarioExtension, ".sea", true)) if (String::IEquals(scenarioExtension, ".sea"))
{ {
// Get scenario using RCT2 style name of RCTC scenario // Get scenario using RCT2 style name of RCTC scenario
scenario = GetByFilename((scenarioBaseName + ".sc6").c_str()); scenario = GetByFilename((scenarioBaseName + ".sc6").c_str());
} }
else if (String::Equals(scenarioExtension, ".sc6", true)) else if (String::IEquals(scenarioExtension, ".sc6"))
{ {
// Get scenario using RCTC style name of RCT2 scenario // Get scenario using RCTC style name of RCT2 scenario
scenario = GetByFilename((scenarioBaseName + ".sea").c_str()); scenario = GetByFilename((scenarioBaseName + ".sea").c_str());
} }
// gScenarioFileName .Park scenarios is the full file path instead of just <scenarioName.park>, so need to convert // gScenarioFileName .Park scenarios is the full file path instead of just <scenarioName.park>, so need to convert
else if (String::Equals(scenarioExtension, ".park", true)) else if (String::IEquals(scenarioExtension, ".park"))
{ {
scenario = GetByFilename((scenarioBaseName + ".park").c_str()); scenario = GetByFilename((scenarioBaseName + ".park").c_str());
} }
@ -496,7 +496,7 @@ private:
const auto scenarioFilename = Path::GetFileName(scenario.Path); const auto scenarioFilename = Path::GetFileName(scenario.Path);
// Note: this is always case insensitive search for cross platform consistency // Note: this is always case insensitive search for cross platform consistency
if (String::Equals(filename, scenarioFilename, true)) if (String::IEquals(filename, scenarioFilename))
{ {
return &scenario; return &scenario;
} }
@ -681,7 +681,7 @@ private:
bool notFound = true; bool notFound = true;
for (auto& highscore : _highscores) for (auto& highscore : _highscores)
{ {
if (String::Equals(scBasic.Path, highscore->fileName, true)) if (String::IEquals(scBasic.Path, highscore->fileName))
{ {
notFound = false; notFound = false;

View File

@ -368,7 +368,7 @@ namespace ScenarioSources
for (size_t j = 0; j < ScenarioTitlesBySource[i].count; j++) for (size_t j = 0; j < ScenarioTitlesBySource[i].count; j++)
{ {
const ScenarioTitleDescriptor* desc = &ScenarioTitlesBySource[i].titles[j]; const ScenarioTitleDescriptor* desc = &ScenarioTitlesBySource[i].titles[j];
if (String::Equals(name, desc->Title, true)) if (String::IEquals(name, desc->Title))
{ {
outDesc->title = desc->Title; outDesc->title = desc->Title;
outDesc->id = desc->Id; outDesc->id = desc->Id;

View File

@ -320,7 +320,7 @@ namespace OpenRCT2::Title
{ {
auto name = zip->GetFileName(i); auto name = zip->GetFileName(i);
auto ext = Path::GetExtension(name); auto ext = Path::GetExtension(name);
if (String::Equals(ext, ".sv6", true) || String::Equals(ext, ".sc6", true) || String::Equals(ext, ".park", true)) if (String::IEquals(ext, ".sv6") || String::IEquals(ext, ".sc6") || String::IEquals(ext, ".park"))
{ {
saves.push_back(std::move(name)); saves.push_back(std::move(name));
} }
@ -348,7 +348,7 @@ namespace OpenRCT2::Title
const std::string relativePath = parts[1].data(); const std::string relativePath = parts[1].data();
for (size_t i = 0; i < saves.size(); i++) for (size_t i = 0; i < saves.size(); i++)
{ {
if (String::Equals(relativePath, saves[i], true)) if (String::IEquals(relativePath, saves[i]))
{ {
saveIndex = static_cast<uint8_t>(i); saveIndex = static_cast<uint8_t>(i);
break; break;

View File

@ -169,7 +169,7 @@ namespace TitleSequenceManager
auto filename = Path::GetFileName(path); auto filename = Path::GetFileName(path);
for (size_t i = 0; i < std::size(PredefinedSequences); i++) for (size_t i = 0; i < std::size(PredefinedSequences); i++)
{ {
if (String::Equals(filename, PredefinedSequences[i].Filename, true)) if (String::IEquals(filename, PredefinedSequences[i].Filename))
{ {
return i; return i;
} }
@ -217,7 +217,7 @@ namespace TitleSequenceManager
{ {
TitleSequenceManagerItem item{}; TitleSequenceManagerItem item{};
if (String::Equals(Path::GetExtension(scanPath), u8".txt", true)) if (String::IEquals(Path::GetExtension(scanPath), u8".txt"))
{ {
// If we are given a .txt file, set the path to the containing directory // If we are given a .txt file, set the path to the containing directory
item.Path = Path::GetDirectory(scanPath); item.Path = Path::GetDirectory(scanPath);
@ -270,7 +270,7 @@ namespace TitleSequenceManager
{ {
for (const auto& pseq : TitleSequenceManager::PredefinedSequences) for (const auto& pseq : TitleSequenceManager::PredefinedSequences)
{ {
if (String::Equals(name, pseq.ConfigId, true)) if (String::IEquals(name, pseq.ConfigId))
{ {
return true; return true;
} }
@ -315,7 +315,7 @@ const utf8* TitleSequenceManagerGetConfigID(size_t index)
const auto filename = Path::GetFileName(item->Path); const auto filename = Path::GetFileName(item->Path);
for (const auto& pseq : TitleSequenceManager::PredefinedSequences) for (const auto& pseq : TitleSequenceManager::PredefinedSequences)
{ {
if (String::Equals(filename, pseq.Filename, true)) if (String::IEquals(filename, pseq.Filename))
{ {
return pseq.ConfigId; return pseq.ConfigId;
} }

View File

@ -170,6 +170,58 @@ TEST_F(StringTest, StrLogicalCmp)
EXPECT_LT(StrLogicalCmp("!", "a"), 0); EXPECT_LT(StrLogicalCmp("!", "a"), 0);
} }
TEST_F(StringTest, IEqualsU8String)
{
EXPECT_TRUE(String::IEquals(u8string{ u8"" }, u8string{ u8"" }));
EXPECT_TRUE(String::IEquals(u8string{ u8"Test" }, u8string{ u8"Test" }));
EXPECT_TRUE(String::IEquals(u8string{ u8"TesT" }, u8string{ u8"Test" }));
EXPECT_TRUE(String::IEquals(u8string{ u8"TEsT" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::IEquals(u8string{ u8"Test" }, u8string{ u8"Message" }));
EXPECT_FALSE(String::IEquals(u8string{ u8"Test" }, u8string{ u8"TestMessage" }));
EXPECT_FALSE(String::IEquals(u8string{ u8"" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::IEquals(u8string{ u8"Test" }, u8string{ u8"" }));
}
TEST_F(StringTest, IEqualsU8StringView)
{
EXPECT_TRUE(String::IEquals(u8string_view{ u8"" }, u8string_view{ u8"" }));
EXPECT_TRUE(String::IEquals(u8string_view{ u8"Test" }, u8string_view{ u8"Test" }));
EXPECT_TRUE(String::IEquals(u8string_view{ u8"TesT" }, u8string_view{ u8"Test" }));
EXPECT_TRUE(String::IEquals(u8string_view{ u8"TEsT" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::IEquals(u8string_view{ u8"Test" }, u8string_view{ u8"Message" }));
EXPECT_FALSE(String::IEquals(u8string_view{ u8"Test" }, u8string_view{ u8"TestMessage" }));
EXPECT_FALSE(String::IEquals(u8string_view{ u8"" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::IEquals(u8string_view{ u8"Test" }, u8string_view{ u8"" }));
}
TEST_F(StringTest, EqualsU8String)
{
EXPECT_TRUE(String::Equals(u8string{ u8"" }, u8string{ u8"" }));
EXPECT_TRUE(String::Equals(u8string{ u8"Test" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string{ u8"TesT" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string{ u8"TEsT" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string{ u8"Test" }, u8string{ u8"Message" }));
EXPECT_FALSE(String::Equals(u8string{ u8"Test" }, u8string{ u8"TestMessage" }));
EXPECT_FALSE(String::Equals(u8string{ u8"" }, u8string{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string{ u8"Test" }, u8string{ u8"" }));
}
TEST_F(StringTest, EqualsU8StringView)
{
EXPECT_TRUE(String::Equals(u8string_view{ u8"" }, u8string_view{ u8"" }));
EXPECT_TRUE(String::Equals(u8string_view{ u8"Test" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"TesT" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"TEsT" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"Test" }, u8string_view{ u8"Message" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"Test" }, u8string_view{ u8"TestMessage" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"" }, u8string_view{ u8"Test" }));
EXPECT_FALSE(String::Equals(u8string_view{ u8"Test" }, u8string_view{ u8"" }));
}
class CodepointViewTest : public testing::Test class CodepointViewTest : public testing::Test
{ {
}; };