mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-15 22:54:00 +00:00
vfs_concat/vfs_layered: Remove friend declarations from ConcatenatedVfsFile
Given these are only added to the class to allow those functions to access the private constructor, it's a better approach to just make them static functions in the interface, to make the dependency explicit.
This commit is contained in:
parent
14e2df5610
commit
28bef31ea8
8 changed files with 59 additions and 61 deletions
|
@ -64,7 +64,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
|
||||||
if (concat.empty())
|
if (concat.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return FileSys::ConcatenateFiles(concat, dir->GetName());
|
return FileSys::ConcatenatedVfsFile::MakeConcatenatedFile(concat, dir->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return vfs->OpenFile(path, FileSys::Mode::Read);
|
return vfs->OpenFile(path, FileSys::Mode::Read);
|
||||||
|
|
|
@ -90,10 +90,9 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t
|
||||||
|
|
||||||
layers.push_back(std::move(extracted));
|
layers.push_back(std::move(extracted));
|
||||||
|
|
||||||
const auto layered = LayerDirectories(layers);
|
auto layered = LayeredVfsDirectory::MakeLayeredDirectory(std::move(layers));
|
||||||
|
|
||||||
if (layered != nullptr) {
|
if (layered != nullptr) {
|
||||||
auto packed = CreateRomFS(layered);
|
auto packed = CreateRomFS(std::move(layered));
|
||||||
|
|
||||||
if (packed != nullptr) {
|
if (packed != nullptr) {
|
||||||
LOG_INFO(Loader, " RomFS: LayeredFS patches applied successfully");
|
LOG_INFO(Loader, " RomFS: LayeredFS patches applied successfully");
|
||||||
|
|
|
@ -125,7 +125,7 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
|
||||||
if (concat.empty())
|
if (concat.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
file = FileSys::ConcatenateFiles(concat, concat.front()->GetName());
|
file = ConcatenatedVfsFile::MakeConcatenatedFile(concat, concat.front()->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return file;
|
return file;
|
||||||
|
|
|
@ -134,7 +134,7 @@ VirtualFile CreateRomFS(VirtualDir dir) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
RomFSBuildContext ctx{dir};
|
RomFSBuildContext ctx{dir};
|
||||||
return ConcatenateFiles(0, ctx.Build(), dir->GetName());
|
return ConcatenatedVfsFile::MakeConcatenatedFile(0, ctx.Build(), dir->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -39,6 +39,41 @@ ConcatenatedVfsFile::ConcatenatedVfsFile(std::map<u64, VirtualFile> files_, std:
|
||||||
|
|
||||||
ConcatenatedVfsFile::~ConcatenatedVfsFile() = default;
|
ConcatenatedVfsFile::~ConcatenatedVfsFile() = default;
|
||||||
|
|
||||||
|
VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(std::vector<VirtualFile> files,
|
||||||
|
std::string name) {
|
||||||
|
if (files.empty())
|
||||||
|
return nullptr;
|
||||||
|
if (files.size() == 1)
|
||||||
|
return files[0];
|
||||||
|
|
||||||
|
return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name)));
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte,
|
||||||
|
std::map<u64, VirtualFile> files,
|
||||||
|
std::string name) {
|
||||||
|
if (files.empty())
|
||||||
|
return nullptr;
|
||||||
|
if (files.size() == 1)
|
||||||
|
return files.begin()->second;
|
||||||
|
|
||||||
|
const auto last_valid = --files.end();
|
||||||
|
for (auto iter = files.begin(); iter != last_valid;) {
|
||||||
|
const auto old = iter++;
|
||||||
|
if (old->first + old->second->GetSize() != iter->first) {
|
||||||
|
files.emplace(old->first + old->second->GetSize(),
|
||||||
|
std::make_shared<StaticVfsFile>(filler_byte, iter->first - old->first -
|
||||||
|
old->second->GetSize()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the map starts at offset 0 (start of file), otherwise pad to fill.
|
||||||
|
if (files.begin()->first != 0)
|
||||||
|
files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first));
|
||||||
|
|
||||||
|
return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name)));
|
||||||
|
}
|
||||||
|
|
||||||
std::string ConcatenatedVfsFile::GetName() const {
|
std::string ConcatenatedVfsFile::GetName() const {
|
||||||
if (files.empty())
|
if (files.empty())
|
||||||
return "";
|
return "";
|
||||||
|
@ -101,36 +136,4 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) {
|
|
||||||
if (files.empty())
|
|
||||||
return nullptr;
|
|
||||||
if (files.size() == 1)
|
|
||||||
return files[0];
|
|
||||||
|
|
||||||
return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name)));
|
|
||||||
}
|
|
||||||
|
|
||||||
VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name) {
|
|
||||||
if (files.empty())
|
|
||||||
return nullptr;
|
|
||||||
if (files.size() == 1)
|
|
||||||
return files.begin()->second;
|
|
||||||
|
|
||||||
const auto last_valid = --files.end();
|
|
||||||
for (auto iter = files.begin(); iter != last_valid;) {
|
|
||||||
const auto old = iter++;
|
|
||||||
if (old->first + old->second->GetSize() != iter->first) {
|
|
||||||
files.emplace(old->first + old->second->GetSize(),
|
|
||||||
std::make_shared<StaticVfsFile>(filler_byte, iter->first - old->first -
|
|
||||||
old->second->GetSize()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure the map starts at offset 0 (start of file), otherwise pad to fill.
|
|
||||||
if (files.begin()->first != 0)
|
|
||||||
files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first));
|
|
||||||
|
|
||||||
return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name)));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -14,16 +14,20 @@ namespace FileSys {
|
||||||
// Class that wraps multiple vfs files and concatenates them, making reads seamless. Currently
|
// Class that wraps multiple vfs files and concatenates them, making reads seamless. Currently
|
||||||
// read-only.
|
// read-only.
|
||||||
class ConcatenatedVfsFile : public VfsFile {
|
class ConcatenatedVfsFile : public VfsFile {
|
||||||
friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
|
|
||||||
friend VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files,
|
|
||||||
std::string name);
|
|
||||||
|
|
||||||
ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name);
|
ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name);
|
||||||
ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name);
|
ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~ConcatenatedVfsFile() override;
|
~ConcatenatedVfsFile() override;
|
||||||
|
|
||||||
|
/// Wrapper function to allow for more efficient handling of files.size() == 0, 1 cases.
|
||||||
|
static VirtualFile MakeConcatenatedFile(std::vector<VirtualFile> files, std::string name);
|
||||||
|
|
||||||
|
/// Convenience function that turns a map of offsets to files into a concatenated file, filling
|
||||||
|
/// gaps with a given filler byte.
|
||||||
|
static VirtualFile MakeConcatenatedFile(u8 filler_byte, std::map<u64, VirtualFile> files,
|
||||||
|
std::string name);
|
||||||
|
|
||||||
std::string GetName() const override;
|
std::string GetName() const override;
|
||||||
std::size_t GetSize() const override;
|
std::size_t GetSize() const override;
|
||||||
bool Resize(std::size_t new_size) override;
|
bool Resize(std::size_t new_size) override;
|
||||||
|
@ -40,11 +44,4 @@ private:
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Wrapper function to allow for more efficient handling of files.size() == 0, 1 cases.
|
|
||||||
VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
|
|
||||||
|
|
||||||
// Convenience function that turns a map of offsets to files into a concatenated file, filling gaps
|
|
||||||
// with a given filler byte.
|
|
||||||
VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name);
|
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -8,7 +8,13 @@
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name) {
|
LayeredVfsDirectory::LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name)
|
||||||
|
: dirs(std::move(dirs)), name(std::move(name)) {}
|
||||||
|
|
||||||
|
LayeredVfsDirectory::~LayeredVfsDirectory() = default;
|
||||||
|
|
||||||
|
VirtualDir LayeredVfsDirectory::MakeLayeredDirectory(std::vector<VirtualDir> dirs,
|
||||||
|
std::string name) {
|
||||||
if (dirs.empty())
|
if (dirs.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (dirs.size() == 1)
|
if (dirs.size() == 1)
|
||||||
|
@ -17,11 +23,6 @@ VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name) {
|
||||||
return std::shared_ptr<VfsDirectory>(new LayeredVfsDirectory(std::move(dirs), std::move(name)));
|
return std::shared_ptr<VfsDirectory>(new LayeredVfsDirectory(std::move(dirs), std::move(name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
LayeredVfsDirectory::LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name)
|
|
||||||
: dirs(std::move(dirs)), name(std::move(name)) {}
|
|
||||||
|
|
||||||
LayeredVfsDirectory::~LayeredVfsDirectory() = default;
|
|
||||||
|
|
||||||
std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFileRelative(std::string_view path) const {
|
std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFileRelative(std::string_view path) const {
|
||||||
for (const auto& layer : dirs) {
|
for (const auto& layer : dirs) {
|
||||||
const auto file = layer->GetFileRelative(path);
|
const auto file = layer->GetFileRelative(path);
|
||||||
|
@ -41,7 +42,7 @@ std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetDirectoryRelative(
|
||||||
out.push_back(std::move(dir));
|
out.push_back(std::move(dir));
|
||||||
}
|
}
|
||||||
|
|
||||||
return LayerDirectories(std::move(out));
|
return MakeLayeredDirectory(std::move(out));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFile(std::string_view name) const {
|
std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFile(std::string_view name) const {
|
||||||
|
|
|
@ -9,20 +9,18 @@
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
// Wrapper function to allow for more efficient handling of dirs.size() == 0, 1 cases.
|
|
||||||
VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name = "");
|
|
||||||
|
|
||||||
// Class that stacks multiple VfsDirectories on top of each other, attempting to read from the first
|
// Class that stacks multiple VfsDirectories on top of each other, attempting to read from the first
|
||||||
// one and falling back to the one after. The highest priority directory (overwrites all others)
|
// one and falling back to the one after. The highest priority directory (overwrites all others)
|
||||||
// should be element 0 in the dirs vector.
|
// should be element 0 in the dirs vector.
|
||||||
class LayeredVfsDirectory : public VfsDirectory {
|
class LayeredVfsDirectory : public VfsDirectory {
|
||||||
friend VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name);
|
|
||||||
|
|
||||||
LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name);
|
LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~LayeredVfsDirectory() override;
|
~LayeredVfsDirectory() override;
|
||||||
|
|
||||||
|
/// Wrapper function to allow for more efficient handling of dirs.size() == 0, 1 cases.
|
||||||
|
static VirtualDir MakeLayeredDirectory(std::vector<VirtualDir> dirs, std::string name = "");
|
||||||
|
|
||||||
std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const override;
|
std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const override;
|
||||||
std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const override;
|
std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const override;
|
||||||
std::shared_ptr<VfsFile> GetFile(std::string_view name) const override;
|
std::shared_ptr<VfsFile> GetFile(std::string_view name) const override;
|
||||||
|
|
Loading…
Reference in a new issue