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:
		@@ -64,7 +64,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
 | 
			
		||||
        if (concat.empty())
 | 
			
		||||
            return nullptr;
 | 
			
		||||
 | 
			
		||||
        return FileSys::ConcatenateFiles(concat, dir->GetName());
 | 
			
		||||
        return FileSys::ConcatenatedVfsFile::MakeConcatenatedFile(concat, dir->GetName());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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));
 | 
			
		||||
 | 
			
		||||
            const auto layered = LayerDirectories(layers);
 | 
			
		||||
 | 
			
		||||
            auto layered = LayeredVfsDirectory::MakeLayeredDirectory(std::move(layers));
 | 
			
		||||
            if (layered != nullptr) {
 | 
			
		||||
                auto packed = CreateRomFS(layered);
 | 
			
		||||
                auto packed = CreateRomFS(std::move(layered));
 | 
			
		||||
 | 
			
		||||
                if (packed != nullptr) {
 | 
			
		||||
                    LOG_INFO(Loader, "    RomFS: LayeredFS patches applied successfully");
 | 
			
		||||
 
 | 
			
		||||
@@ -125,7 +125,7 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
 | 
			
		||||
            if (concat.empty())
 | 
			
		||||
                return nullptr;
 | 
			
		||||
 | 
			
		||||
            file = FileSys::ConcatenateFiles(concat, concat.front()->GetName());
 | 
			
		||||
            file = ConcatenatedVfsFile::MakeConcatenatedFile(concat, concat.front()->GetName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return file;
 | 
			
		||||
 
 | 
			
		||||
@@ -134,7 +134,7 @@ VirtualFile CreateRomFS(VirtualDir dir) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
 | 
			
		||||
    RomFSBuildContext ctx{dir};
 | 
			
		||||
    return ConcatenateFiles(0, ctx.Build(), dir->GetName());
 | 
			
		||||
    return ConcatenatedVfsFile::MakeConcatenatedFile(0, ctx.Build(), dir->GetName());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace FileSys
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,41 @@ ConcatenatedVfsFile::ConcatenatedVfsFile(std::map<u64, VirtualFile> files_, std:
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
    if (files.empty())
 | 
			
		||||
        return "";
 | 
			
		||||
@@ -101,36 +136,4 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) {
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
@@ -14,16 +14,20 @@ namespace FileSys {
 | 
			
		||||
// Class that wraps multiple vfs files and concatenates them, making reads seamless. Currently
 | 
			
		||||
// read-only.
 | 
			
		||||
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::map<u64, VirtualFile> files, std::string name);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    ~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::size_t GetSize() const override;
 | 
			
		||||
    bool Resize(std::size_t new_size) override;
 | 
			
		||||
@@ -40,11 +44,4 @@ private:
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,13 @@
 | 
			
		||||
 | 
			
		||||
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())
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    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)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
    for (const auto& layer : dirs) {
 | 
			
		||||
        const auto file = layer->GetFileRelative(path);
 | 
			
		||||
@@ -41,7 +42,7 @@ std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetDirectoryRelative(
 | 
			
		||||
            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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,20 +9,18 @@
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
// one and falling back to the one after. The highest priority directory (overwrites all others)
 | 
			
		||||
// should be element 0 in the dirs vector.
 | 
			
		||||
class LayeredVfsDirectory : public VfsDirectory {
 | 
			
		||||
    friend VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name);
 | 
			
		||||
 | 
			
		||||
    LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    ~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<VfsDirectory> GetDirectoryRelative(std::string_view path) const override;
 | 
			
		||||
    std::shared_ptr<VfsFile> GetFile(std::string_view name) const override;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user