diff options
| author | liamwhite <liamwhite@users.noreply.github.com> | 2023-05-09 09:47:36 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-09 09:47:36 -0400 |
| commit | 7944f271dcbd8217ea0a9e556b75edbe7a23eaff (patch) | |
| tree | 7e2159b9fc6043e8318d14d0eb8da803d4019d6a /src/core/file_sys/vfs_vector.cpp | |
| parent | 5890b96ce5d17e3702805ebfc1601a45295c94d0 (diff) | |
| parent | d100de27ee77fc98e1f3fa3dc6d2db0999da0a1a (diff) | |
Merge pull request #10183 from liamwhite/mods
vfs_vector: avoid n^2 lookup in layeredfs building
Diffstat (limited to 'src/core/file_sys/vfs_vector.cpp')
| -rw-r--r-- | src/core/file_sys/vfs_vector.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/core/file_sys/vfs_vector.cpp b/src/core/file_sys/vfs_vector.cpp index 251d9d7c9..af1df4c51 100644 --- a/src/core/file_sys/vfs_vector.cpp +++ b/src/core/file_sys/vfs_vector.cpp @@ -67,6 +67,23 @@ VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_, VectorVfsDirectory::~VectorVfsDirectory() = default; +VirtualFile VectorVfsDirectory::GetFile(std::string_view file_name) const { + if (!optimized_file_index_built) { + optimized_file_index.clear(); + for (size_t i = 0; i < files.size(); i++) { + optimized_file_index.emplace(files[i]->GetName(), i); + } + optimized_file_index_built = true; + } + + const auto it = optimized_file_index.find(file_name); + if (it != optimized_file_index.end()) { + return files[it->second]; + } + + return nullptr; +} + std::vector<VirtualFile> VectorVfsDirectory::GetFiles() const { return files; } @@ -107,6 +124,7 @@ bool VectorVfsDirectory::DeleteSubdirectory(std::string_view subdir_name) { } bool VectorVfsDirectory::DeleteFile(std::string_view file_name) { + optimized_file_index_built = false; return FindAndRemoveVectorElement(files, file_name); } @@ -124,6 +142,7 @@ VirtualFile VectorVfsDirectory::CreateFile(std::string_view file_name) { } void VectorVfsDirectory::AddFile(VirtualFile file) { + optimized_file_index_built = false; files.push_back(std::move(file)); } |
