diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/file_sys/romfs.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_concat.cpp | 42 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_concat.h | 33 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_static.h | 7 |
4 files changed, 42 insertions, 42 deletions
diff --git a/src/core/file_sys/romfs.cpp b/src/core/file_sys/romfs.cpp index 205284a4d..7804ef56d 100644 --- a/src/core/file_sys/romfs.cpp +++ b/src/core/file_sys/romfs.cpp | |||
| @@ -134,7 +134,7 @@ VirtualFile CreateRomFS(VirtualDir dir) { | |||
| 134 | return nullptr; | 134 | return nullptr; |
| 135 | 135 | ||
| 136 | RomFSBuildContext ctx{dir}; | 136 | RomFSBuildContext ctx{dir}; |
| 137 | return ConcatenateFiles<0>(ctx.Build(), dir->GetName()); | 137 | return ConcatenateFiles(0, ctx.Build(), dir->GetName()); |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | } // namespace FileSys | 140 | } // namespace FileSys |
diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp index d9f9911da..8a0df508e 100644 --- a/src/core/file_sys/vfs_concat.cpp +++ b/src/core/file_sys/vfs_concat.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #include "common/assert.h" | 8 | #include "common/assert.h" |
| 9 | #include "core/file_sys/vfs_concat.h" | 9 | #include "core/file_sys/vfs_concat.h" |
| 10 | #include "core/file_sys/vfs_static.h" | ||
| 10 | 11 | ||
| 11 | namespace FileSys { | 12 | namespace FileSys { |
| 12 | 13 | ||
| @@ -22,15 +23,6 @@ static bool VerifyConcatenationMapContinuity(const std::map<u64, VirtualFile>& m | |||
| 22 | return map.begin()->first == 0; | 23 | return map.begin()->first == 0; |
| 23 | } | 24 | } |
| 24 | 25 | ||
| 25 | VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) { | ||
| 26 | if (files.empty()) | ||
| 27 | return nullptr; | ||
| 28 | if (files.size() == 1) | ||
| 29 | return files[0]; | ||
| 30 | |||
| 31 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | ||
| 32 | } | ||
| 33 | |||
| 34 | ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name) | 26 | ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name) |
| 35 | : name(std::move(name)) { | 27 | : name(std::move(name)) { |
| 36 | std::size_t next_offset = 0; | 28 | std::size_t next_offset = 0; |
| @@ -109,4 +101,36 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) { | |||
| 109 | return false; | 101 | return false; |
| 110 | } | 102 | } |
| 111 | 103 | ||
| 104 | VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name) { | ||
| 105 | if (files.empty()) | ||
| 106 | return nullptr; | ||
| 107 | if (files.size() == 1) | ||
| 108 | return files[0]; | ||
| 109 | |||
| 110 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | ||
| 111 | } | ||
| 112 | |||
| 113 | VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name) { | ||
| 114 | if (files.empty()) | ||
| 115 | return nullptr; | ||
| 116 | if (files.size() == 1) | ||
| 117 | return files.begin()->second; | ||
| 118 | |||
| 119 | const auto last_valid = --files.end(); | ||
| 120 | for (auto iter = files.begin(); iter != last_valid;) { | ||
| 121 | const auto old = iter++; | ||
| 122 | if (old->first + old->second->GetSize() != iter->first) { | ||
| 123 | files.emplace(old->first + old->second->GetSize(), | ||
| 124 | std::make_shared<StaticVfsFile>(filler_byte, iter->first - old->first - | ||
| 125 | old->second->GetSize())); | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 129 | // Ensure the map starts at offset 0 (start of file), otherwise pad to fill. | ||
| 130 | if (files.begin()->first != 0) | ||
| 131 | files.emplace(0, std::make_shared<StaticVfsFile>(filler_byte, files.begin()->first)); | ||
| 132 | |||
| 133 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | ||
| 134 | } | ||
| 135 | |||
| 112 | } // namespace FileSys | 136 | } // namespace FileSys |
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h index 76211d38a..17fa40ade 100644 --- a/src/core/file_sys/vfs_concat.h +++ b/src/core/file_sys/vfs_concat.h | |||
| @@ -7,9 +7,7 @@ | |||
| 7 | #include <map> | 7 | #include <map> |
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | #include <string_view> | 9 | #include <string_view> |
| 10 | #include <boost/container/flat_map.hpp> | ||
| 11 | #include "core/file_sys/vfs.h" | 10 | #include "core/file_sys/vfs.h" |
| 12 | #include "core/file_sys/vfs_static.h" | ||
| 13 | 11 | ||
| 14 | namespace FileSys { | 12 | namespace FileSys { |
| 15 | 13 | ||
| @@ -17,9 +15,8 @@ namespace FileSys { | |||
| 17 | // read-only. | 15 | // read-only. |
| 18 | class ConcatenatedVfsFile : public VfsFile { | 16 | class ConcatenatedVfsFile : public VfsFile { |
| 19 | friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name); | 17 | friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name); |
| 20 | 18 | friend VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, | |
| 21 | template <u8 filler_byte> | 19 | std::string name); |
| 22 | friend VirtualFile ConcatenateFiles(std::map<u64, VirtualFile> files, std::string name); | ||
| 23 | 20 | ||
| 24 | ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name); | 21 | ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name); |
| 25 | ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name); | 22 | ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name); |
| @@ -47,29 +44,7 @@ private: | |||
| 47 | VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name); | 44 | VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name); |
| 48 | 45 | ||
| 49 | // Convenience function that turns a map of offsets to files into a concatenated file, filling gaps | 46 | // Convenience function that turns a map of offsets to files into a concatenated file, filling gaps |
| 50 | // with template parameter. | 47 | // with a given filler byte. |
| 51 | template <u8 filler_byte> | 48 | VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name); |
| 52 | VirtualFile ConcatenateFiles(std::map<u64, VirtualFile> files, std::string name) { | ||
| 53 | if (files.empty()) | ||
| 54 | return nullptr; | ||
| 55 | if (files.size() == 1) | ||
| 56 | return files.begin()->second; | ||
| 57 | |||
| 58 | const auto last_valid = --files.end(); | ||
| 59 | for (auto iter = files.begin(); iter != last_valid;) { | ||
| 60 | const auto old = iter++; | ||
| 61 | if (old->first + old->second->GetSize() != iter->first) { | ||
| 62 | files.emplace(old->first + old->second->GetSize(), | ||
| 63 | std::make_shared<StaticVfsFile<filler_byte>>(iter->first - old->first - | ||
| 64 | old->second->GetSize())); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | // Ensure the map starts at offset 0 (start of file), otherwise pad to fill. | ||
| 69 | if (files.begin()->first != 0) | ||
| 70 | files.emplace(0, std::make_shared<StaticVfsFile<filler_byte>>(files.begin()->first)); | ||
| 71 | |||
| 72 | return std::shared_ptr<VfsFile>(new ConcatenatedVfsFile(std::move(files), std::move(name))); | ||
| 73 | } | ||
| 74 | 49 | ||
| 75 | } // namespace FileSys | 50 | } // namespace FileSys |
diff --git a/src/core/file_sys/vfs_static.h b/src/core/file_sys/vfs_static.h index 4dd47ffcc..8ad77d300 100644 --- a/src/core/file_sys/vfs_static.h +++ b/src/core/file_sys/vfs_static.h | |||
| @@ -12,11 +12,11 @@ | |||
| 12 | 12 | ||
| 13 | namespace FileSys { | 13 | namespace FileSys { |
| 14 | 14 | ||
| 15 | template <u8 value> | ||
| 16 | class StaticVfsFile : public VfsFile { | 15 | class StaticVfsFile : public VfsFile { |
| 17 | public: | 16 | public: |
| 18 | explicit StaticVfsFile(size_t size = 0, std::string name = "", VirtualDir parent = nullptr) | 17 | explicit StaticVfsFile(u8 value, size_t size = 0, std::string name = "", |
| 19 | : size(size), name(std::move(name)), parent(std::move(parent)) {} | 18 | VirtualDir parent = nullptr) |
| 19 | : value{value}, size{size}, name{std::move(name)}, parent{std::move(parent)} {} | ||
| 20 | 20 | ||
| 21 | std::string GetName() const override { | 21 | std::string GetName() const override { |
| 22 | return name; | 22 | return name; |
| @@ -70,6 +70,7 @@ public: | |||
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | private: | 72 | private: |
| 73 | u8 value; | ||
| 73 | size_t size; | 74 | size_t size; |
| 74 | std::string name; | 75 | std::string name; |
| 75 | VirtualDir parent; | 76 | VirtualDir parent; |