diff options
author | Zach Hilman <zachhilman@gmail.com> | 2018-09-20 04:00:44 +0200 |
---|---|---|
committer | Zach Hilman <zachhilman@gmail.com> | 2018-09-22 01:53:33 +0200 |
commit | 44fdac334cef098c46b6e26e2f65b09756574e60 (patch) | |
tree | 66fd1e10ab5b30cd8cbc0eee617f58ce38969305 /src/core/file_sys/vfs_concat.h | |
parent | vfs_layered: Add LayeredVfsDirectory (diff) | |
download | yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar.gz yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar.bz2 yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar.lz yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar.xz yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.tar.zst yuzu-44fdac334cef098c46b6e26e2f65b09756574e60.zip |
Diffstat (limited to 'src/core/file_sys/vfs_concat.h')
-rw-r--r-- | src/core/file_sys/vfs_concat.h | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h index 717d04bdc..c65c20d15 100644 --- a/src/core/file_sys/vfs_concat.h +++ b/src/core/file_sys/vfs_concat.h @@ -4,22 +4,54 @@ #pragma once +#include <map> #include <memory> #include <string_view> #include <boost/container/flat_map.hpp> #include "core/file_sys/vfs.h" +#include "core/file_sys/vfs_static.h" namespace FileSys { +class ConcatenatedVfsFile; + // 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 template parameter. +template <u8 filler_byte> +VirtualFile ConcatenateFiles(std::map<u64, VirtualFile> files, std::string name = "") { + if (files.empty()) + return nullptr; + if (files.size() == 1) + return files.begin()->second; + + for (auto iter = files.begin(); iter != --files.end();) { + 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())); + } + } + + 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))); +} + // 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); + template <u8 filler_byte> + friend VirtualFile ConcatenateFiles(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; @@ -36,7 +68,7 @@ public: private: // Maps starting offset to file -- more efficient. - boost::container::flat_map<u64, VirtualFile> files; + std::map<u64, VirtualFile> files; std::string name; }; |