vfs_vector.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <utility>
  6. #include "core/file_sys/vfs_vector.h"
  7. namespace FileSys {
  8. VectorVfsFile::VectorVfsFile(std::vector<u8> initial_data, std::string name, VirtualDir parent)
  9. : data(std::move(initial_data)), parent(std::move(parent)), name(std::move(name)) {}
  10. VectorVfsFile::~VectorVfsFile() = default;
  11. std::string VectorVfsFile::GetName() const {
  12. return name;
  13. }
  14. size_t VectorVfsFile::GetSize() const {
  15. return data.size();
  16. }
  17. bool VectorVfsFile::Resize(size_t new_size) {
  18. data.resize(new_size);
  19. return true;
  20. }
  21. std::shared_ptr<VfsDirectory> VectorVfsFile::GetContainingDirectory() const {
  22. return parent;
  23. }
  24. bool VectorVfsFile::IsWritable() const {
  25. return true;
  26. }
  27. bool VectorVfsFile::IsReadable() const {
  28. return true;
  29. }
  30. std::size_t VectorVfsFile::Read(u8* data_, std::size_t length, std::size_t offset) const {
  31. const auto read = std::min(length, data.size() - offset);
  32. std::memcpy(data_, data.data() + offset, read);
  33. return read;
  34. }
  35. std::size_t VectorVfsFile::Write(const u8* data_, std::size_t length, std::size_t offset) {
  36. if (offset + length > data.size())
  37. data.resize(offset + length);
  38. const auto write = std::min(length, data.size() - offset);
  39. std::memcpy(data.data() + offset, data_, write);
  40. return write;
  41. }
  42. bool VectorVfsFile::Rename(std::string_view name_) {
  43. name = name_;
  44. return true;
  45. }
  46. void VectorVfsFile::Assign(std::vector<u8> new_data) {
  47. data = std::move(new_data);
  48. }
  49. VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_,
  50. std::vector<VirtualDir> dirs_, std::string name_,
  51. VirtualDir parent_)
  52. : files(std::move(files_)), dirs(std::move(dirs_)), parent(std::move(parent_)),
  53. name(std::move(name_)) {}
  54. VectorVfsDirectory::~VectorVfsDirectory() = default;
  55. std::vector<std::shared_ptr<VfsFile>> VectorVfsDirectory::GetFiles() const {
  56. return files;
  57. }
  58. std::vector<std::shared_ptr<VfsDirectory>> VectorVfsDirectory::GetSubdirectories() const {
  59. return dirs;
  60. }
  61. bool VectorVfsDirectory::IsWritable() const {
  62. return false;
  63. }
  64. bool VectorVfsDirectory::IsReadable() const {
  65. return true;
  66. }
  67. std::string VectorVfsDirectory::GetName() const {
  68. return name;
  69. }
  70. std::shared_ptr<VfsDirectory> VectorVfsDirectory::GetParentDirectory() const {
  71. return parent;
  72. }
  73. template <typename T>
  74. static bool FindAndRemoveVectorElement(std::vector<T>& vec, std::string_view name) {
  75. const auto iter =
  76. std::find_if(vec.begin(), vec.end(), [name](const T& e) { return e->GetName() == name; });
  77. if (iter == vec.end())
  78. return false;
  79. vec.erase(iter);
  80. return true;
  81. }
  82. bool VectorVfsDirectory::DeleteSubdirectory(std::string_view name) {
  83. return FindAndRemoveVectorElement(dirs, name);
  84. }
  85. bool VectorVfsDirectory::DeleteFile(std::string_view name) {
  86. return FindAndRemoveVectorElement(files, name);
  87. }
  88. bool VectorVfsDirectory::Rename(std::string_view name_) {
  89. name = name_;
  90. return true;
  91. }
  92. std::shared_ptr<VfsDirectory> VectorVfsDirectory::CreateSubdirectory(std::string_view name) {
  93. return nullptr;
  94. }
  95. std::shared_ptr<VfsFile> VectorVfsDirectory::CreateFile(std::string_view name) {
  96. return nullptr;
  97. }
  98. void VectorVfsDirectory::AddFile(VirtualFile file) {
  99. files.push_back(std::move(file));
  100. }
  101. void VectorVfsDirectory::AddDirectory(VirtualDir dir) {
  102. dirs.push_back(std::move(dir));
  103. }
  104. } // namespace FileSys