Avoid repeating UTF-16 conversions when setting up sorting data

This makes sorting 5% faster.
This commit is contained in:
Oliver Hamlet
2025-01-17 20:18:28 +00:00
parent 7849682946
commit 379cf32ec7
5 changed files with 70 additions and 17 deletions
+12
View File
@@ -38,6 +38,13 @@ std::vector<PluginSortingData> GetPluginsSortingData(
std::vector<PluginSortingData> pluginsSortingData;
pluginsSortingData.reserve(loadedPluginInterfaces.size());
#ifdef _WIN32
std::vector<std::wstring> wideLoadOrder;
for (const auto& pluginName : loadOrder) {
wideLoadOrder.push_back(ToWinWide(pluginName));
}
#endif
for (const auto& pluginInterface : loadedPluginInterfaces) {
if (!pluginInterface) {
continue;
@@ -56,8 +63,13 @@ std::vector<PluginSortingData> GetPluginsSortingData(
const auto userMetadata = db.GetPluginUserMetadata(plugin->GetName(), true)
.value_or(PluginMetadata(plugin->GetName()));
#ifdef _WIN32
const auto pluginSortingData = PluginSortingData(
plugin, masterlistMetadata, userMetadata, wideLoadOrder);
#else
const auto pluginSortingData =
PluginSortingData(plugin, masterlistMetadata, userMetadata, loadOrder);
#endif
pluginsSortingData.push_back(pluginSortingData);
}
+14 -1
View File
@@ -53,7 +53,11 @@ PluginSortingData::PluginSortingData(
const PluginSortingInterface* plugin,
const PluginMetadata& masterlistMetadata,
const PluginMetadata& userMetadata,
#ifdef _WIN32
const std::vector<std::wstring>& loadOrder) :
#else
const std::vector<std::string>& loadOrder) :
#endif
plugin_(plugin),
group_(userMetadata.GetGroup().value_or(
masterlistMetadata.GetGroup().value_or(Group::DEFAULT_NAME))),
@@ -66,8 +70,17 @@ PluginSortingData::PluginSortingData(
return;
}
#ifdef _WIN32
auto wideName = ToWinWide(GetName());
#endif
for (size_t i = 0; i < loadOrder.size(); i++) {
if (CompareFilenames(plugin->GetName(), loadOrder.at(i)) == 0) {
#ifdef _WIN32
int comparison = CompareFilenames(wideName, loadOrder.at(i));
#else
int comparison = CompareFilenames(GetName(), loadOrder.at(i));
#endif
if (comparison == 0) {
loadOrderIndex_ = i;
break;
}
+4
View File
@@ -43,7 +43,11 @@ public:
explicit PluginSortingData(const PluginSortingInterface* plugin,
const PluginMetadata& masterlistMetadata,
const PluginMetadata& userMetadata,
#ifdef _WIN32
const std::vector<std::wstring>& loadOrder);
#else
const std::vector<std::string>& loadOrder);
#endif
std::string GetName() const;
bool IsMaster() const;
@@ -83,8 +83,18 @@ protected:
const std::vector<std::string>& loadOrder = {}) {
const auto plugin = GetPlugin(name);
#ifdef _WIN32
std::vector<std::wstring> wideLoadOrder;
for (const auto& pluginName : loadOrder) {
wideLoadOrder.push_back(ToWinWide(pluginName));
}
return PluginSortingData(
plugin, PluginMetadata(), PluginMetadata(), wideLoadOrder);
#else
return PluginSortingData(
plugin, PluginMetadata(), PluginMetadata(), loadOrder);
#endif
}
plugingraph::TestPlugin* GetPlugin(const std::string& name) {
@@ -63,6 +63,19 @@ protected:
return loadedPluginInterfaces;
}
#ifdef _WIN32
std::vector<std::wstring> getNativeLoadOrder() {
std::vector<std::wstring> wideLoadOrder;
for (const auto &pluginName : getLoadOrder()) {
wideLoadOrder.push_back(ToWinWide(pluginName));
}
return wideLoadOrder;
}
#else
std::vector<std::string> getNativeLoadOrder() { return getLoadOrder(); }
#endif
Game game_;
const std::string blankEslEsp;
};
@@ -89,14 +102,14 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) {
dynamic_cast<const PluginSortingInterface *>(game_.GetPlugin(blankEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_FALSE(esp.IsMaster());
auto master = PluginSortingData(
dynamic_cast<const PluginSortingInterface *>(game_.GetPlugin(blankEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_TRUE(master.IsMaster());
if (GetParam() == GameType::fo4 || GetParam() == GameType::tes5se) {
@@ -104,7 +117,7 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) {
dynamic_cast<const PluginSortingInterface *>(game_.GetPlugin(blankEsl)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_TRUE(lightMaster.IsMaster());
auto lightPlugin =
@@ -112,7 +125,7 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) {
game_.GetPlugin(blankEslEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_FALSE(lightPlugin.IsMaster());
}
}
@@ -125,7 +138,7 @@ TEST_P(PluginSortingDataTest,
dynamic_cast<const Plugin *>(game_.GetPlugin(blankMasterDependentEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
if (GetParam() == GameType::starfield) {
EXPECT_EQ(1, plugin.GetOverrideRecordCount());
} else {
@@ -140,11 +153,11 @@ TEST_P(PluginSortingDataTest,
ASSERT_NO_THROW(loadInstalledPlugins(game_, false));
auto plugin = PluginSortingData(
dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
auto plugin =
PluginSortingData(dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsm)),
PluginMetadata(),
PluginMetadata(),
getNativeLoadOrder());
if (GetParam() == GameType::starfield) {
EXPECT_TRUE(plugin.IsBlueprintMaster());
} else {
@@ -155,20 +168,21 @@ TEST_P(PluginSortingDataTest,
dynamic_cast<const Plugin *>(game_.GetPlugin(blankDifferentEsm)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_FALSE(plugin.IsBlueprintMaster());
plugin = PluginSortingData(dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
plugin =
PluginSortingData(dynamic_cast<const Plugin *>(game_.GetPlugin(blankEsp)),
PluginMetadata(),
PluginMetadata(),
getNativeLoadOrder());
EXPECT_FALSE(plugin.IsBlueprintMaster());
plugin = PluginSortingData(
dynamic_cast<const Plugin *>(game_.GetPlugin(blankDifferentEsp)),
PluginMetadata(),
PluginMetadata(),
getLoadOrder());
getNativeLoadOrder());
EXPECT_FALSE(plugin.IsBlueprintMaster());
}
}