1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-28 12:09:53 +00:00

Merge branch 'init_filesystem_archive' into 'master'

Initialize FileSystemArchive index in constructor

See merge request OpenMW/openmw!3870
This commit is contained in:
psi29a 2024-02-17 23:42:30 +00:00
commit a297a0e742
2 changed files with 25 additions and 38 deletions

View file

@ -12,48 +12,36 @@ namespace VFS
{
FileSystemArchive::FileSystemArchive(const std::filesystem::path& path)
: mBuiltIndex(false)
, mPath(path)
: mPath(path)
{
const auto str = mPath.u8string();
std::size_t prefix = str.size();
if (prefix > 0 && str[prefix - 1] != '\\' && str[prefix - 1] != '/')
++prefix;
for (const auto& i : std::filesystem::recursive_directory_iterator(mPath))
{
if (std::filesystem::is_directory(i))
continue;
const std::filesystem::path& filePath = i.path();
const std::string proper = Files::pathToUnicodeString(filePath);
VFS::Path::Normalized searchable(std::string_view{ proper }.substr(prefix));
FileSystemArchiveFile file(filePath);
const auto inserted = mIndex.emplace(std::move(searchable), std::move(file));
if (!inserted.second)
Log(Debug::Warning)
<< "Found duplicate file for '" << proper
<< "', please check your file system for two files with the same name in different cases.";
}
}
void FileSystemArchive::listResources(FileMap& out)
{
if (!mBuiltIndex)
{
const auto str = mPath.u8string();
size_t prefix = str.size();
if (!mPath.empty() && str[prefix - 1] != '\\' && str[prefix - 1] != '/')
++prefix;
for (const auto& i : std::filesystem::recursive_directory_iterator(mPath))
{
if (std::filesystem::is_directory(i))
continue;
const auto& path = i.path();
const std::string proper = Files::pathToUnicodeString(path);
FileSystemArchiveFile file(path);
VFS::Path::Normalized searchable(std::string_view{ proper }.substr(prefix));
const auto inserted = mIndex.emplace(std::move(searchable), std::move(file));
if (!inserted.second)
Log(Debug::Warning)
<< "Warning: found duplicate file for '" << proper
<< "', please check your file system for two files with the same name in different cases.";
else
out[inserted.first->first] = &inserted.first->second;
}
mBuiltIndex = true;
}
else
{
for (auto& [k, v] : mIndex)
out[k] = &v;
}
for (auto& [k, v] : mIndex)
out[k] = &v;
}
bool FileSystemArchive::contains(Path::NormalizedView file) const

View file

@ -36,7 +36,6 @@ namespace VFS
private:
std::map<VFS::Path::Normalized, FileSystemArchiveFile, std::less<>> mIndex;
bool mBuiltIndex;
std::filesystem::path mPath;
};