vfs_vector.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <cstring>
  6. #include <memory>
  7. #include <string>
  8. #include <vector>
  9. #include "core/file_sys/vfs.h"
  10. namespace FileSys {
  11. // An implementation of VfsFile that is backed by a statically-sized array
  12. template <std::size_t size>
  13. class ArrayVfsFile : public VfsFile {
  14. public:
  15. explicit ArrayVfsFile(const std::array<u8, size>& data_, std::string name_ = "",
  16. VirtualDir parent_ = nullptr)
  17. : data(data_), name(std::move(name_)), parent(std::move(parent_)) {}
  18. std::string GetName() const override {
  19. return name;
  20. }
  21. std::size_t GetSize() const override {
  22. return size;
  23. }
  24. bool Resize(std::size_t new_size) override {
  25. return false;
  26. }
  27. VirtualDir GetContainingDirectory() const override {
  28. return parent;
  29. }
  30. bool IsWritable() const override {
  31. return false;
  32. }
  33. bool IsReadable() const override {
  34. return true;
  35. }
  36. std::size_t Read(u8* data_, std::size_t length, std::size_t offset) const override {
  37. const auto read = std::min(length, size - offset);
  38. std::memcpy(data_, data.data() + offset, read);
  39. return read;
  40. }
  41. std::size_t Write(const u8* data_, std::size_t length, std::size_t offset) override {
  42. return 0;
  43. }
  44. bool Rename(std::string_view new_name) override {
  45. name = new_name;
  46. return true;
  47. }
  48. private:
  49. std::array<u8, size> data;
  50. std::string name;
  51. VirtualDir parent;
  52. };
  53. template <std::size_t Size, typename... Args>
  54. std::shared_ptr<ArrayVfsFile<Size>> MakeArrayFile(const std::array<u8, Size>& data,
  55. Args&&... args) {
  56. return std::make_shared<ArrayVfsFile<Size>>(data, std::forward<Args>(args)...);
  57. }
  58. // An implementation of VfsFile that is backed by a vector optionally supplied upon construction
  59. class VectorVfsFile : public VfsFile {
  60. public:
  61. explicit VectorVfsFile(std::vector<u8> initial_data = {}, std::string name_ = "",
  62. VirtualDir parent_ = nullptr);
  63. ~VectorVfsFile() override;
  64. std::string GetName() const override;
  65. std::size_t GetSize() const override;
  66. bool Resize(std::size_t new_size) override;
  67. VirtualDir GetContainingDirectory() const override;
  68. bool IsWritable() const override;
  69. bool IsReadable() const override;
  70. std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override;
  71. std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override;
  72. bool Rename(std::string_view name) override;
  73. virtual void Assign(std::vector<u8> new_data);
  74. private:
  75. std::vector<u8> data;
  76. VirtualDir parent;
  77. std::string name;
  78. };
  79. // An implementation of VfsDirectory that maintains two vectors for subdirectories and files.
  80. // Vector data is supplied upon construction.
  81. class VectorVfsDirectory : public VfsDirectory {
  82. public:
  83. explicit VectorVfsDirectory(std::vector<VirtualFile> files = {},
  84. std::vector<VirtualDir> dirs = {}, std::string name = "",
  85. VirtualDir parent = nullptr);
  86. ~VectorVfsDirectory() override;
  87. std::vector<VirtualFile> GetFiles() const override;
  88. std::vector<VirtualDir> GetSubdirectories() const override;
  89. bool IsWritable() const override;
  90. bool IsReadable() const override;
  91. std::string GetName() const override;
  92. VirtualDir GetParentDirectory() const override;
  93. bool DeleteSubdirectory(std::string_view subdir_name) override;
  94. bool DeleteFile(std::string_view file_name) override;
  95. bool Rename(std::string_view name) override;
  96. VirtualDir CreateSubdirectory(std::string_view subdir_name) override;
  97. VirtualFile CreateFile(std::string_view file_name) override;
  98. virtual void AddFile(VirtualFile file);
  99. virtual void AddDirectory(VirtualDir dir);
  100. private:
  101. std::vector<VirtualFile> files;
  102. std::vector<VirtualDir> dirs;
  103. VirtualDir parent;
  104. std::string name;
  105. };
  106. } // namespace FileSys