vfs_static: Remove template byte parameter from StaticVfsFile
This converts it into a regular constructor parameter. There's no need to make this a template parameter on the class when it functions perfectly well as a constructor argument. This also reduces the amount of code bloat produced by the compiler, as it doesn't need to generate the same code for multiple different instantiations of the same class type, but with a different fill value.
This commit is contained in:
parent
7b81e1e525
commit
14e2df5610
4 changed files with 42 additions and 42 deletions
|
@ -134,7 +134,7 @@ VirtualFile CreateRomFS(VirtualDir dir) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
RomFSBuildContext ctx{dir};
|
RomFSBuildContext ctx{dir};
|
||||||
return ConcatenateFiles<0>(ctx.Build(), dir->GetName());
|
return ConcatenateFiles(0, ctx.Build(), dir->GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/file_sys/vfs_concat.h"
|
#include "core/file_sys/vfs_concat.h"
|
||||||
|
#include "core/file_sys/vfs_static.h"
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
|
@ -22,15 +23,6 @@ static bool VerifyConcatenationMapContinuity(const std::map<u64, VirtualFile>& m
|
||||||
return map.begin()->first == 0;
|
return map.begin()->first == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)));
|
|
||||||
}
|
|
||||||
|
|
||||||
ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name)
|
ConcatenatedVfsFile::ConcatenatedVfsFile(std::vector<VirtualFile> files_, std::string name)
|
||||||
: name(std::move(name)) {
|
: name(std::move(name)) {
|
||||||
std::size_t next_offset = 0;
|
std::size_t next_offset = 0;
|
||||||
|
@ -109,4 +101,36 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) {
|
||||||
return false;
|
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
|
} // namespace FileSys
|
||||||
|
|
|
@ -7,9 +7,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <boost/container/flat_map.hpp>
|
|
||||||
#include "core/file_sys/vfs.h"
|
#include "core/file_sys/vfs.h"
|
||||||
#include "core/file_sys/vfs_static.h"
|
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
|
@ -17,9 +15,8 @@ namespace FileSys {
|
||||||
// read-only.
|
// read-only.
|
||||||
class ConcatenatedVfsFile : public VfsFile {
|
class ConcatenatedVfsFile : public VfsFile {
|
||||||
friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
|
friend VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
|
||||||
|
friend VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files,
|
||||||
template <u8 filler_byte>
|
std::string name);
|
||||||
friend VirtualFile ConcatenateFiles(std::map<u64, VirtualFile> files, std::string name);
|
|
||||||
|
|
||||||
ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name);
|
ConcatenatedVfsFile(std::vector<VirtualFile> files, std::string name);
|
||||||
ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name);
|
ConcatenatedVfsFile(std::map<u64, VirtualFile> files, std::string name);
|
||||||
|
@ -47,29 +44,7 @@ private:
|
||||||
VirtualFile ConcatenateFiles(std::vector<VirtualFile> files, std::string name);
|
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
|
// Convenience function that turns a map of offsets to files into a concatenated file, filling gaps
|
||||||
// with template parameter.
|
// with a given filler byte.
|
||||||
template <u8 filler_byte>
|
VirtualFile ConcatenateFiles(u8 filler_byte, std::map<u64, VirtualFile> files, std::string name);
|
||||||
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
|
} // namespace FileSys
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
template <u8 value>
|
|
||||||
class StaticVfsFile : public VfsFile {
|
class StaticVfsFile : public VfsFile {
|
||||||
public:
|
public:
|
||||||
explicit StaticVfsFile(size_t size = 0, std::string name = "", VirtualDir parent = nullptr)
|
explicit StaticVfsFile(u8 value, size_t size = 0, std::string name = "",
|
||||||
: size(size), name(std::move(name)), parent(std::move(parent)) {}
|
VirtualDir parent = nullptr)
|
||||||
|
: value{value}, size{size}, name{std::move(name)}, parent{std::move(parent)} {}
|
||||||
|
|
||||||
std::string GetName() const override {
|
std::string GetName() const override {
|
||||||
return name;
|
return name;
|
||||||
|
@ -70,6 +70,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
u8 value;
|
||||||
size_t size;
|
size_t size;
|
||||||
std::string name;
|
std::string name;
|
||||||
VirtualDir parent;
|
VirtualDir parent;
|
||||||
|
|
Loading…
Reference in a new issue