diff options
| author | Liam <byteslice@airmail.cc> | 2023-05-07 01:19:13 -0400 |
|---|---|---|
| committer | Liam <byteslice@airmail.cc> | 2023-05-07 16:50:35 -0400 |
| commit | b0c0344388161b09a5348e0f4a9b98b6ee4f1e8a (patch) | |
| tree | 1a78974bcfbedcab5e94f894b6330ada9edb98f0 /src/core/file_sys/vfs_vector.cpp | |
| parent | 28ed548196d0067c6aa0b5cfcbf5b7602fc88a45 (diff) | |
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 251d9d7c9f..af1df4c514 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)); } |
