summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/romfs.cpp2
-rw-r--r--src/core/file_sys/vfs_concat.cpp42
-rw-r--r--src/core/file_sys/vfs_concat.h33
-rw-r--r--src/core/file_sys/vfs_static.h7
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
11namespace FileSys { 12namespace 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
25VirtualFile 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
34ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name) 26ConcatenatedVfsFile::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
104VirtualFile 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
113VirtualFile 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
14namespace FileSys { 12namespace FileSys {
15 13
@@ -17,9 +15,8 @@ namespace FileSys {
17// read-only. 15// read-only.
18class ConcatenatedVfsFile : public VfsFile { 16class 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:
47VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name); 44VirtualFile 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.
51template <u8 filler_byte> 48VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name);
52VirtualFile 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
13namespace FileSys { 13namespace FileSys {
14 14
15template <u8 value>
16class StaticVfsFile : public VfsFile { 15class StaticVfsFile : public VfsFile {
17public: 16public:
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
72private: 72private:
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;