vfs_vector.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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)), name(std::move(name)), parent(std::move(parent)) {}
  10. std::string VectorVfsFile::GetName() const {
  11. return name;
  12. }
  13. size_t VectorVfsFile::GetSize() const {
  14. return data.size();
  15. }
  16. bool VectorVfsFile::Resize(size_t new_size) {
  17. data.resize(new_size);
  18. return data.size() == new_size;
  19. }
  20. std::shared_ptr<VfsDirectory> VectorVfsFile::GetContainingDirectory() const {
  21. return parent;
  22. }
  23. bool VectorVfsFile::IsWritable() const {
  24. return true;
  25. }
  26. bool VectorVfsFile::IsReadable() const {
  27. return true;
  28. }
  29. size_t VectorVfsFile::Read(u8* data_, size_t length, size_t offset) const {
  30. const auto read = std::min(length, data.size() - offset);
  31. std::memcpy(data_, data.data() + offset, read);
  32. return read;
  33. }
  34. size_t VectorVfsFile::Write(const u8* data_, size_t length, size_t offset) {
  35. if (offset + length > data.size())
  36. data.resize(offset + length);
  37. const auto write = std::min(length, data.size() - offset);
  38. std::memcpy(data.data(), data_, write);
  39. return write;
  40. }
  41. bool VectorVfsFile::Rename(std::string_view name_) {
  42. name = name_;
  43. return true;
  44. }
  45. void VectorVfsFile::Assign(std::vector<u8> new_data) {
  46. data = new_data;
  47. }
  48. VectorVfsDirectory::VectorVfsDirectory(std::vector<VirtualFile> files_,
  49. std::vector<VirtualDir> dirs_, std::string name_,
  50. VirtualDir parent_)
  51. : files(std::move(files_)), dirs(std::move(dirs_)), parent(std::move(parent_)),
  52. name(std::move(name_)) {}
  53. VectorVfsDirectory::~VectorVfsDirectory() = default;
  54. std::vector<std::shared_ptr<VfsFile>> VectorVfsDirectory::GetFiles() const {
  55. return files;
  56. }
  57. std::vector<std::shared_ptr<VfsDirectory>> VectorVfsDirectory::GetSubdirectories() const {
  58. return dirs;
  59. }
  60. bool VectorVfsDirectory::IsWritable() const {
  61. return false;
  62. }
  63. bool VectorVfsDirectory::IsReadable() const {
  64. return true;
  65. }
  66. std::string VectorVfsDirectory::GetName() const {
  67. return name;
  68. }
  69. std::shared_ptr<VfsDirectory> VectorVfsDirectory::GetParentDirectory() const {
  70. return parent;
  71. }
  72. template <typename T>
  73. static bool FindAndRemoveVectorElement(std::vector<T>& vec, std::string_view name) {
  74. const auto iter =
  75. std::find_if(vec.begin(), vec.end(), [name](const T& e) { return e->GetName() == name; });
  76. if (iter == vec.end())
  77. return false;
  78. vec.erase(iter);
  79. return true;
  80. }
  81. bool VectorVfsDirectory::DeleteSubdirectory(std::string_view name) {
  82. return FindAndRemoveVectorElement(dirs, name);
  83. }
  84. bool VectorVfsDirectory::DeleteFile(std::string_view name) {
  85. return FindAndRemoveVectorElement(files, name);
  86. }
  87. bool VectorVfsDirectory::Rename(std::string_view name_) {
  88. name = name_;
  89. return true;
  90. }
  91. std::shared_ptr<VfsDirectory> VectorVfsDirectory::CreateSubdirectory(std::string_view name) {
  92. return nullptr;
  93. }
  94. std::shared_ptr<VfsFile> VectorVfsDirectory::CreateFile(std::string_view name) {
  95. return nullptr;
  96. }
  97. void VectorVfsDirectory::AddFile(VirtualFile file) {
  98. files.push_back(std::move(file));
  99. }
  100. void VectorVfsDirectory::AddDirectory(VirtualDir dir) {
  101. dirs.push_back(std::move(dir));
  102. }
  103. bool VectorVfsDirectory::ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) {
  104. if (!DeleteFile(file->GetName()))
  105. return false;
  106. dirs.emplace_back(std::move(dir));
  107. return true;
  108. }
  109. } // namespace FileSys