diff options
| author | 2018-09-19 21:58:33 -0400 | |
|---|---|---|
| committer | 2018-09-21 19:53:05 -0400 | |
| commit | b52343a428b76ef0fa74c6a939aef7eab33feedb (patch) | |
| tree | 9cbbc5df26915a7213705644dd39c2cf48512afe /src | |
| parent | vfs_static: Add StaticVfsFile (diff) | |
| download | yuzu-b52343a428b76ef0fa74c6a939aef7eab33feedb.tar.gz yuzu-b52343a428b76ef0fa74c6a939aef7eab33feedb.tar.xz yuzu-b52343a428b76ef0fa74c6a939aef7eab33feedb.zip | |
vfs_vector: Add VectorVfsFile
Maps a vector into the VFS interface.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/file_sys/vfs_vector.cpp | 51 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_vector.h | 24 |
2 files changed, 75 insertions, 0 deletions
diff --git a/src/core/file_sys/vfs_vector.cpp b/src/core/file_sys/vfs_vector.cpp index ec7f735b5..efca3d4ad 100644 --- a/src/core/file_sys/vfs_vector.cpp +++ b/src/core/file_sys/vfs_vector.cpp | |||
| @@ -7,6 +7,57 @@ | |||
| 7 | #include "core/file_sys/vfs_vector.h" | 7 | #include "core/file_sys/vfs_vector.h" |
| 8 | 8 | ||
| 9 | namespace FileSys { | 9 | namespace FileSys { |
| 10 | VectorVfsFile::VectorVfsFile(std::vector<u8> initial_data, std::string name, VirtualDir parent) | ||
| 11 | : data(std::move(initial_data)), name(std::move(name)), parent(std::move(parent)) {} | ||
| 12 | |||
| 13 | std::string VectorVfsFile::GetName() const { | ||
| 14 | return name; | ||
| 15 | } | ||
| 16 | |||
| 17 | size_t VectorVfsFile::GetSize() const { | ||
| 18 | return data.size(); | ||
| 19 | } | ||
| 20 | |||
| 21 | bool VectorVfsFile::Resize(size_t new_size) { | ||
| 22 | data.resize(new_size); | ||
| 23 | return data.size() == new_size; | ||
| 24 | } | ||
| 25 | |||
| 26 | std::shared_ptr<VfsDirectory> VectorVfsFile::GetContainingDirectory() const { | ||
| 27 | return parent; | ||
| 28 | } | ||
| 29 | |||
| 30 | bool VectorVfsFile::IsWritable() const { | ||
| 31 | return true; | ||
| 32 | } | ||
| 33 | |||
| 34 | bool VectorVfsFile::IsReadable() const { | ||
| 35 | return true; | ||
| 36 | } | ||
| 37 | |||
| 38 | size_t VectorVfsFile::Read(u8* data_, size_t length, size_t offset) const { | ||
| 39 | const auto read = std::min(length, data.size() - offset); | ||
| 40 | std::memcpy(data_, data.data() + offset, read); | ||
| 41 | return read; | ||
| 42 | } | ||
| 43 | |||
| 44 | size_t VectorVfsFile::Write(const u8* data_, size_t length, size_t offset) { | ||
| 45 | if (offset + length > data.size()) | ||
| 46 | data.resize(offset + length); | ||
| 47 | const auto write = std::min(length, data.size() - offset); | ||
| 48 | std::memcpy(data.data(), data_, write); | ||
| 49 | return write; | ||
| 50 | } | ||
| 51 | |||
| 52 | bool VectorVfsFile::Rename(std::string_view name_) { | ||
| 53 | name = name_; | ||
| 54 | return true; | ||
| 55 | } | ||
| 56 | |||
| 57 | void VectorVfsFile::Assign(std::vector<u8> new_data) { | ||
| 58 | data = new_data; | ||
| 59 | } | ||
| 60 | |||
| 10 | VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_, | 61 | VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_, |
| 11 | std::vector<VirtualDir> dirs_, std::string name_, | 62 | std::vector<VirtualDir> dirs_, std::string name_, |
| 12 | VirtualDir parent_) | 63 | VirtualDir parent_) |
diff --git a/src/core/file_sys/vfs_vector.h b/src/core/file_sys/vfs_vector.h index cba44a7a6..c84e137a9 100644 --- a/src/core/file_sys/vfs_vector.h +++ b/src/core/file_sys/vfs_vector.h | |||
| @@ -8,6 +8,30 @@ | |||
| 8 | 8 | ||
| 9 | namespace FileSys { | 9 | namespace FileSys { |
| 10 | 10 | ||
| 11 | // An implementation of VfsFile that is backed by a vector optionally supplied upon construction | ||
| 12 | class VectorVfsFile : public VfsFile { | ||
| 13 | public: | ||
| 14 | explicit VectorVfsFile(std::vector<u8> initial_data = {}, std::string name = "", | ||
| 15 | VirtualDir parent = nullptr); | ||
| 16 | |||
| 17 | std::string GetName() const override; | ||
| 18 | size_t GetSize() const override; | ||
| 19 | bool Resize(size_t new_size) override; | ||
| 20 | std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | ||
| 21 | bool IsWritable() const override; | ||
| 22 | bool IsReadable() const override; | ||
| 23 | size_t Read(u8* data, size_t length, size_t offset) const override; | ||
| 24 | size_t Write(const u8* data, size_t length, size_t offset) override; | ||
| 25 | bool Rename(std::string_view name) override; | ||
| 26 | |||
| 27 | virtual void Assign(std::vector<u8> new_data); | ||
| 28 | |||
| 29 | private: | ||
| 30 | std::vector<u8> data; | ||
| 31 | VirtualDir parent; | ||
| 32 | std::string name; | ||
| 33 | }; | ||
| 34 | |||
| 11 | // An implementation of VfsDirectory that maintains two vectors for subdirectories and files. | 35 | // An implementation of VfsDirectory that maintains two vectors for subdirectories and files. |
| 12 | // Vector data is supplied upon construction. | 36 | // Vector data is supplied upon construction. |
| 13 | class VectorVfsDirectory : public VfsDirectory { | 37 | class VectorVfsDirectory : public VfsDirectory { |