summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-19 20:18:14 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:18 -0500
commit72394faa750ac05871f62583c7c922879a20bc7b (patch)
treec392c4e9c3f82e75df0bf77b0d990e8f2a739877
parent2d276cad0b46d68e6886645559cd47c0165392fe (diff)
some optimizations to avoid case conversions and memory allocations
-rw-r--r--src/filetreeitem.cpp13
-rw-r--r--src/filetreeitem.h3
-rw-r--r--src/filetreemodel.cpp24
-rw-r--r--src/shared/directoryentry.cpp6
-rw-r--r--src/shared/directoryentry.h2
5 files changed, 29 insertions, 19 deletions
diff --git a/src/filetreeitem.cpp b/src/filetreeitem.cpp
index 38eb5ec2..c2f3a1fc 100644
--- a/src/filetreeitem.cpp
+++ b/src/filetreeitem.cpp
@@ -1,8 +1,10 @@
#include "filetreeitem.h"
#include "modinfo.h"
+#include "util.h"
#include <log.h>
using namespace MOBase;
+using namespace MOShared;
FileTreeItem::FileTreeItem()
: m_flags(NoFlags), m_loaded(false)
@@ -17,6 +19,7 @@ FileTreeItem::FileTreeItem(
m_virtualParentPath(QString::fromStdWString(dataRelativeParentPath)),
m_realPath(QString::fromStdWString(realPath)),
m_flags(flags),
+ m_wsFile(file), m_wsLcFile(ToLower(file)),
m_file(QString::fromStdWString(file)),
m_mod(QString::fromStdWString(mod)),
m_loaded(false),
@@ -110,6 +113,16 @@ const QString& FileTreeItem::filename() const
return m_file;
}
+const std::wstring& FileTreeItem::filenameWs() const
+{
+ return m_wsFile;
+}
+
+const std::wstring& FileTreeItem::filenameWsLowerCase() const
+{
+ return m_wsLcFile;
+}
+
const QString& FileTreeItem::mod() const
{
return m_mod;
diff --git a/src/filetreeitem.h b/src/filetreeitem.h
index 516319ac..423038ba 100644
--- a/src/filetreeitem.h
+++ b/src/filetreeitem.h
@@ -37,6 +37,8 @@ public:
const QString& virtualParentPath() const;
QString virtualPath() const;
const QString& filename() const;
+ const std::wstring& filenameWs() const;
+ const std::wstring& filenameWsLowerCase() const;
const QString& mod() const;
QFont font() const;
@@ -68,6 +70,7 @@ private:
QString m_virtualParentPath;
QString m_realPath;
Flags m_flags;
+ std::wstring m_wsFile, m_wsLcFile;
QString m_file;
QString m_mod;
bool m_loaded;
diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp
index 024ec6ee..b5ae9dc8 100644
--- a/src/filetreemodel.cpp
+++ b/src/filetreemodel.cpp
@@ -1,6 +1,7 @@
#include "filetreemodel.h"
#include "organizercore.h"
#include <log.h>
+#include <unordered_set>
using namespace MOBase;
using namespace MOShared;
@@ -247,18 +248,16 @@ void FileTreeModel::updateDirectories(
int row = 0;
std::vector<FileTreeItem*> remove;
- std::set<std::wstring> seen;
+ std::unordered_set<std::wstring_view> seen;
for (auto&& item : parentItem.children()) {
if (!item->isDirectory()) {
break;
}
- const auto name = item->filename().toStdWString();
-
- if (auto d=parentEntry.findSubDirectory(name)) {
+ if (auto d=parentEntry.findSubDirectory(item->filenameWsLowerCase())) {
// directory still exists
- seen.insert(name);
+ seen.insert(item->filenameWs());
if (item->areChildrenVisible()) {
trace([&]{ log::debug(
@@ -419,7 +418,7 @@ void FileTreeModel::updateFiles(
parentItem.debugName(), (path.empty() ? L"\\" : path));
});
- std::set<std::wstring> seen;
+ std::unordered_set<std::wstring_view> seen;
std::vector<FileTreeItem*> remove;
for (auto&& item : parentItem.children()) {
@@ -427,13 +426,11 @@ void FileTreeModel::updateFiles(
continue;
}
- const auto name = item->filename().toStdWString();
-
- if (auto f=parentEntry.findFile(name)) {
+ if (auto f=parentEntry.findFile(item->filenameWsLowerCase(), true)) {
if (shouldShowFile(*f)) {
// file still exists
trace([&]{ log::debug("{} still exists", item->debugName()); });
- seen.insert(name);
+ seen.insert(item->filenameWs());
continue;
}
}
@@ -569,12 +566,7 @@ FileTreeItem* FileTreeModel::itemFromIndex(const QModelIndex& index) const
return nullptr;
}
- auto* item = static_cast<FileTreeItem*>(data);
- if (!item->debugName().isEmpty()) {
- return item;
- }
-
- return nullptr;
+ return static_cast<FileTreeItem*>(data);
}
QModelIndex FileTreeModel::indexFromItem(
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index 146662ad..c6b29fbb 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -875,9 +875,11 @@ DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &pa
}
-const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name) const
+const FileEntry::Ptr DirectoryEntry::findFile(
+ const std::wstring &name, bool alreadyLowerCase) const
{
- auto iter = m_Files.find(ToLower(name));
+ auto iter = m_Files.find(alreadyLowerCase ? name : ToLower(name));
+
if (iter != m_Files.end()) {
return m_FileRegister->getFile(iter->second);
} else {
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h
index 52265583..d33b495a 100644
--- a/src/shared/directoryentry.h
+++ b/src/shared/directoryentry.h
@@ -278,7 +278,7 @@ public:
* @param name name of the file
* @return fileentry object for the file or nullptr if no file matches
*/
- const FileEntry::Ptr findFile(const std::wstring &name) const;
+ const FileEntry::Ptr findFile(const std::wstring &name, bool alreadyLowerCase=false) const;
bool hasFile(const std::wstring& name) const;
bool containsArchive(std::wstring archiveName);