mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Avoid repeating UTF-16 conversions when setting up sorting data
This makes sorting 5% faster.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user