diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/file_sys/vfs_vector.cpp | 19 | ||||
-rw-r--r-- | src/core/file_sys/vfs_vector.h | 4 |
2 files changed, 23 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)); } diff --git a/src/core/file_sys/vfs_vector.h b/src/core/file_sys/vfs_vector.h index bfedb6e42..c9955755b 100644 --- a/src/core/file_sys/vfs_vector.h +++ b/src/core/file_sys/vfs_vector.h @@ -105,6 +105,7 @@ public: VirtualDir parent = nullptr); ~VectorVfsDirectory() override; + VirtualFile GetFile(std::string_view file_name) const override; std::vector<VirtualFile> GetFiles() const override; std::vector<VirtualDir> GetSubdirectories() const override; bool IsWritable() const override; @@ -126,6 +127,9 @@ private: VirtualDir parent; std::string name; + + mutable std::map<std::string, size_t, std::less<>> optimized_file_index; + mutable bool optimized_file_index_built{}; }; } // namespace FileSys |