vfs_vector.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <algorithm>
  4. #include <utility>
  5. #include "core/file_sys/vfs_vector.h"
  6. namespace FileSys {
  7. VectorVfsFile::VectorVfsFile(std::vector<u8> initial_data, std::string name_, VirtualDir parent_)
  8. : data(std::move(initial_data)), parent(std::move(parent_)), name(std::move(name_)) {}
  9. VectorVfsFile::~VectorVfsFile() = default;
  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 true;
  19. }
  20. VirtualDir 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. std::size_t VectorVfsFile::Read(u8* data_, std::size_t length, std::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. std::size_t VectorVfsFile::Write(const u8* data_, std::size_t length, std::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() + offset, 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 = std::move(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. VirtualFile VectorVfsDirectory::GetFile(std::string_view file_name) const {
  55. if (!optimized_file_index_built) {
  56. optimized_file_index.clear();
  57. for (size_t i = 0; i < files.size(); i++) {
  58. optimized_file_index.emplace(files[i]->GetName(), i);
  59. }
  60. optimized_file_index_built = true;
  61. }
  62. const auto it = optimized_file_index.find(file_name);
  63. if (it != optimized_file_index.end()) {
  64. return files[it->second];
  65. }
  66. return nullptr;
  67. }
  68. std::vector<VirtualFile> VectorVfsDirectory::GetFiles() const {
  69. return files;
  70. }
  71. std::vector<VirtualDir> VectorVfsDirectory::GetSubdirectories() const {
  72. return dirs;
  73. }
  74. bool VectorVfsDirectory::IsWritable() const {
  75. return false;
  76. }
  77. bool VectorVfsDirectory::IsReadable() const {
  78. return true;
  79. }
  80. std::string VectorVfsDirectory::GetName() const {
  81. return name;
  82. }
  83. VirtualDir VectorVfsDirectory::GetParentDirectory() const {
  84. return parent;
  85. }
  86. template <typename T>
  87. static bool FindAndRemoveVectorElement(std::vector<T>& vec, std::string_view name) {
  88. const auto iter =
  89. std::find_if(vec.begin(), vec.end(), [name](const T& e) { return e->GetName() == name; });
  90. if (iter == vec.end())
  91. return false;
  92. vec.erase(iter);
  93. return true;
  94. }
  95. bool VectorVfsDirectory::DeleteSubdirectory(std::string_view subdir_name) {
  96. return FindAndRemoveVectorElement(dirs, subdir_name);
  97. }
  98. bool VectorVfsDirectory::DeleteFile(std::string_view file_name) {
  99. optimized_file_index_built = false;
  100. return FindAndRemoveVectorElement(files, file_name);
  101. }
  102. bool VectorVfsDirectory::Rename(std::string_view name_) {
  103. name = name_;
  104. return true;
  105. }
  106. VirtualDir VectorVfsDirectory::CreateSubdirectory(std::string_view subdir_name) {
  107. return nullptr;
  108. }
  109. VirtualFile VectorVfsDirectory::CreateFile(std::string_view file_name) {
  110. return nullptr;
  111. }
  112. void VectorVfsDirectory::AddFile(VirtualFile file) {
  113. optimized_file_index_built = false;
  114. files.push_back(std::move(file));
  115. }
  116. void VectorVfsDirectory::AddDirectory(VirtualDir dir) {
  117. dirs.push_back(std::move(dir));
  118. }
  119. } // namespace FileSys