diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-12-19 21:13:31 -0500 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2020-02-04 03:33:18 -0500 |
| commit | 0a908c49625fe0e54bc45e29fe8c4908d20b0dbe (patch) | |
| tree | 98b2b6d7ebb5224b33c2ad55690ff9ceb72d16df /src/shared | |
| parent | 72394faa750ac05871f62583c7c922879a20bc7b (diff) | |
added a map for directories in DirectoryEntry
more optimizations for filetree
Diffstat (limited to 'src/shared')
| -rw-r--r-- | src/shared/directoryentry.cpp | 56 | ||||
| -rw-r--r-- | src/shared/directoryentry.h | 19 |
2 files changed, 64 insertions, 11 deletions
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index c6b29fbb..97da1061 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -485,7 +485,9 @@ void DirectoryEntry::clear() for (DirectoryEntry *entry : m_SubDirectories) {
delete entry;
}
+
m_SubDirectories.clear();
+ m_SubDirectoriesMap.clear();
}
@@ -665,7 +667,9 @@ void DirectoryEntry::removeDirRecursive() entry->removeDirRecursive();
delete entry;
}
+
m_SubDirectories.clear();
+ m_SubDirectoriesMap.clear();
}
void DirectoryEntry::removeDir(const std::wstring &path)
@@ -676,6 +680,20 @@ void DirectoryEntry::removeDir(const std::wstring &path) DirectoryEntry *entry = *iter;
if (CaseInsensitiveEqual(entry->getName(), path)) {
entry->removeDirRecursive();
+
+ bool found = false;
+ for (auto iter2=m_SubDirectoriesMap.begin(); iter2!=m_SubDirectoriesMap.end(); ++iter2) {
+ if (iter2->second == entry) {
+ m_SubDirectoriesMap.erase(iter2);
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ log::error("entry {} not in sub directories map", entry->getName());
+ }
+
m_SubDirectories.erase(iter);
delete entry;
break;
@@ -858,14 +876,22 @@ const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const }
-DirectoryEntry *DirectoryEntry::findSubDirectory(const std::wstring &name) const
+DirectoryEntry *DirectoryEntry::findSubDirectory(
+ const std::wstring &name, bool alreadyLowerCase) const
{
- for (DirectoryEntry *entry : m_SubDirectories) {
- if (CaseInsensitiveEqual(entry->getName(), name)) {
- return entry;
- }
+ SubDirectoriesMap::const_iterator itor;
+
+ if (alreadyLowerCase) {
+ itor = m_SubDirectoriesMap.find(name);
+ } else {
+ itor = m_SubDirectoriesMap.find(ToLower(name));
+ }
+
+ if (itor == m_SubDirectoriesMap.end()) {
+ return nullptr;
}
- return nullptr;
+
+ return itor->second;
}
@@ -878,7 +904,13 @@ DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &pa const FileEntry::Ptr DirectoryEntry::findFile(
const std::wstring &name, bool alreadyLowerCase) const
{
- auto iter = m_Files.find(alreadyLowerCase ? name : ToLower(name));
+ std::map<std::wstring, FileEntry::Index>::const_iterator iter;
+
+ if (alreadyLowerCase) {
+ iter = m_Files.find(name);
+ } else {
+ iter = m_Files.find(ToLower(name));
+ }
if (iter != m_Files.end()) {
return m_FileRegister->getFile(iter->second);
@@ -900,9 +932,13 @@ DirectoryEntry *DirectoryEntry::getSubDirectory(const std::wstring &name, bool c }
}
if (create) {
- std::vector<DirectoryEntry*>::iterator iter = m_SubDirectories.insert(m_SubDirectories.end(),
- new DirectoryEntry(name, this, originID, m_FileRegister, m_OriginConnection));
- return *iter;
+ auto* entry = new DirectoryEntry(
+ name, this, originID, m_FileRegister, m_OriginConnection);
+
+ m_SubDirectories.push_back(entry);
+ m_SubDirectoriesMap.emplace(ToLower(name), entry);
+
+ return entry;
} else {
return nullptr;
}
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index d33b495a..79bc5cf2 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -271,7 +271,22 @@ public: }
}
- DirectoryEntry *findSubDirectory(const std::wstring &name) const;
+ template <class F>
+ void forEachFileIndex(F&& f) const
+ {
+ for (auto&& p : m_Files) {
+ if (!f(p.second)) {
+ break;
+ }
+ }
+ }
+
+ FileEntry::Ptr getFileByIndex(FileEntry::Index index) const
+ {
+ return m_FileRegister->getFile(index);
+ }
+
+ DirectoryEntry *findSubDirectory(const std::wstring &name, bool alreadyLowerCase=false) const;
DirectoryEntry *findSubDirectoryRecursive(const std::wstring &path);
/** retrieve a file in this directory by name.
@@ -352,6 +367,7 @@ private: void removeDirRecursive();
private:
+ using SubDirectoriesMap = std::unordered_map<std::wstring, DirectoryEntry*>;
boost::shared_ptr<FileRegister> m_FileRegister;
boost::shared_ptr<OriginConnection> m_OriginConnection;
@@ -359,6 +375,7 @@ private: std::wstring m_Name;
std::map<std::wstring, FileEntry::Index> m_Files;
std::vector<DirectoryEntry*> m_SubDirectories;
+ SubDirectoriesMap m_SubDirectoriesMap;
DirectoryEntry *m_Parent;
std::set<int> m_Origins;
|
