summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys/vfs_concat.h
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-09-26 22:09:16 +0200
committerGitHub <noreply@github.com>2018-09-26 22:09:16 +0200
commit92dd496fb94385aa16adec75d6eb8bc3ef29c6b0 (patch)
tree113a0ad25b279c70d825514e9e35020f08a366a4 /src/core/file_sys/vfs_concat.h
parentMerge pull request #1398 from lioncash/macos (diff)
parentpatch_manager: Invert conditionals within ApplyLayeredFS() (diff)
downloadyuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar.gz
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar.bz2
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar.lz
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar.xz
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.tar.zst
yuzu-92dd496fb94385aa16adec75d6eb8bc3ef29c6b0.zip
Diffstat (limited to 'src/core/file_sys/vfs_concat.h')
-rw-r--r--src/core/file_sys/vfs_concat.h44
1 files changed, 8 insertions, 36 deletions
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h
index 76211d38a..c90f9d5d1 100644
--- a/src/core/file_sys/vfs_concat.h
+++ b/src/core/file_sys/vfs_concat.h
@@ -7,26 +7,27 @@
#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 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;
+ /// 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;
@@ -43,33 +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 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;
-
- 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