diff options
| author | 2023-10-17 11:49:11 -0400 | |
|---|---|---|
| committer | 2023-10-17 11:49:11 -0400 | |
| commit | bd05ace08d04fe42b9cc94dae611adf2859d7c99 (patch) | |
| tree | 185415915b3aec7b42f4e4be2ae53790c751d168 | |
| parent | Merge pull request #11747 from Kelebek1/image_alias_sample_names (diff) | |
| parent | fsmitm_romfsbuild: avoid unnecessary copies of vfs pointers (diff) | |
| download | yuzu-bd05ace08d04fe42b9cc94dae611adf2859d7c99.tar.gz yuzu-bd05ace08d04fe42b9cc94dae611adf2859d7c99.tar.xz yuzu-bd05ace08d04fe42b9cc94dae611adf2859d7c99.zip | |
Merge pull request #11774 from liamwhite/refcount-issue
fsmitm_romfsbuild: avoid unnecessary copies of vfs pointers
| -rw-r--r-- | src/core/core.cpp | 7 | ||||
| -rw-r--r-- | src/core/file_sys/fsmitm_romfsbuild.cpp | 84 | ||||
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 8 | ||||
| -rw-r--r-- | src/core/file_sys/registered_cache.cpp | 3 | ||||
| -rw-r--r-- | src/core/file_sys/romfs.cpp | 5 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_cached.cpp | 6 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_cached.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_concat.cpp | 27 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_concat.h | 12 | ||||
| -rw-r--r-- | src/core/file_sys/vfs_layered.cpp | 8 |
10 files changed, 77 insertions, 85 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 0ab2e3b76..d7e2efbd7 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -116,11 +116,8 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | |||
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | if (concat.empty()) { | 119 | return FileSys::ConcatenatedVfsFile::MakeConcatenatedFile(dir->GetName(), |
| 120 | return nullptr; | 120 | std::move(concat)); |
| 121 | } | ||
| 122 | |||
| 123 | return FileSys::ConcatenatedVfsFile::MakeConcatenatedFile(concat, dir->GetName()); | ||
| 124 | } | 121 | } |
| 125 | 122 | ||
| 126 | if (Common::FS::IsDir(path)) { | 123 | if (Common::FS::IsDir(path)) { |
diff --git a/src/core/file_sys/fsmitm_romfsbuild.cpp b/src/core/file_sys/fsmitm_romfsbuild.cpp index e39c7b62b..f1d3e4129 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.cpp +++ b/src/core/file_sys/fsmitm_romfsbuild.cpp | |||
| @@ -107,62 +107,56 @@ static u64 romfs_get_hash_table_count(u64 num_entries) { | |||
| 107 | 107 | ||
| 108 | void RomFSBuildContext::VisitDirectory(VirtualDir romfs_dir, VirtualDir ext_dir, | 108 | void RomFSBuildContext::VisitDirectory(VirtualDir romfs_dir, VirtualDir ext_dir, |
| 109 | std::shared_ptr<RomFSBuildDirectoryContext> parent) { | 109 | std::shared_ptr<RomFSBuildDirectoryContext> parent) { |
| 110 | std::vector<std::shared_ptr<RomFSBuildDirectoryContext>> child_dirs; | 110 | for (auto& child_romfs_file : romfs_dir->GetFiles()) { |
| 111 | const auto name = child_romfs_file->GetName(); | ||
| 112 | const auto child = std::make_shared<RomFSBuildFileContext>(); | ||
| 113 | // Set child's path. | ||
| 114 | child->cur_path_ofs = parent->path_len + 1; | ||
| 115 | child->path_len = child->cur_path_ofs + static_cast<u32>(name.size()); | ||
| 116 | child->path = parent->path + "/" + name; | ||
| 117 | |||
| 118 | if (ext_dir != nullptr && ext_dir->GetFile(name + ".stub") != nullptr) { | ||
| 119 | continue; | ||
| 120 | } | ||
| 111 | 121 | ||
| 112 | const auto entries = romfs_dir->GetEntries(); | 122 | // Sanity check on path_len |
| 123 | ASSERT(child->path_len < FS_MAX_PATH); | ||
| 113 | 124 | ||
| 114 | for (const auto& kv : entries) { | 125 | child->source = std::move(child_romfs_file); |
| 115 | if (kv.second == VfsEntryType::Directory) { | ||
| 116 | const auto child = std::make_shared<RomFSBuildDirectoryContext>(); | ||
| 117 | // Set child's path. | ||
| 118 | child->cur_path_ofs = parent->path_len + 1; | ||
| 119 | child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size()); | ||
| 120 | child->path = parent->path + "/" + kv.first; | ||
| 121 | 126 | ||
| 122 | if (ext_dir != nullptr && ext_dir->GetFile(kv.first + ".stub") != nullptr) { | 127 | if (ext_dir != nullptr) { |
| 123 | continue; | 128 | if (const auto ips = ext_dir->GetFile(name + ".ips")) { |
| 129 | if (auto patched = PatchIPS(child->source, ips)) { | ||
| 130 | child->source = std::move(patched); | ||
| 131 | } | ||
| 124 | } | 132 | } |
| 133 | } | ||
| 125 | 134 | ||
| 126 | // Sanity check on path_len | 135 | child->size = child->source->GetSize(); |
| 127 | ASSERT(child->path_len < FS_MAX_PATH); | ||
| 128 | |||
| 129 | if (AddDirectory(parent, child)) { | ||
| 130 | child_dirs.push_back(child); | ||
| 131 | } | ||
| 132 | } else { | ||
| 133 | const auto child = std::make_shared<RomFSBuildFileContext>(); | ||
| 134 | // Set child's path. | ||
| 135 | child->cur_path_ofs = parent->path_len + 1; | ||
| 136 | child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size()); | ||
| 137 | child->path = parent->path + "/" + kv.first; | ||
| 138 | |||
| 139 | if (ext_dir != nullptr && ext_dir->GetFile(kv.first + ".stub") != nullptr) { | ||
| 140 | continue; | ||
| 141 | } | ||
| 142 | 136 | ||
| 143 | // Sanity check on path_len | 137 | AddFile(parent, child); |
| 144 | ASSERT(child->path_len < FS_MAX_PATH); | 138 | } |
| 145 | 139 | ||
| 146 | child->source = romfs_dir->GetFile(kv.first); | 140 | for (auto& child_romfs_dir : romfs_dir->GetSubdirectories()) { |
| 141 | const auto name = child_romfs_dir->GetName(); | ||
| 142 | const auto child = std::make_shared<RomFSBuildDirectoryContext>(); | ||
| 143 | // Set child's path. | ||
| 144 | child->cur_path_ofs = parent->path_len + 1; | ||
| 145 | child->path_len = child->cur_path_ofs + static_cast<u32>(name.size()); | ||
| 146 | child->path = parent->path + "/" + name; | ||
| 147 | 147 | ||
| 148 | if (ext_dir != nullptr) { | 148 | if (ext_dir != nullptr && ext_dir->GetFile(name + ".stub") != nullptr) { |
| 149 | if (const auto ips = ext_dir->GetFile(kv.first + ".ips")) { | 149 | continue; |
| 150 | if (auto patched = PatchIPS(child->source, ips)) { | 150 | } |
| 151 | child->source = std::move(patched); | ||
| 152 | } | ||
| 153 | } | ||
| 154 | } | ||
| 155 | 151 | ||
| 156 | child->size = child->source->GetSize(); | 152 | // Sanity check on path_len |
| 153 | ASSERT(child->path_len < FS_MAX_PATH); | ||
| 157 | 154 | ||
| 158 | AddFile(parent, child); | 155 | if (!AddDirectory(parent, child)) { |
| 156 | continue; | ||
| 159 | } | 157 | } |
| 160 | } | ||
| 161 | 158 | ||
| 162 | for (auto& child : child_dirs) { | 159 | auto child_ext_dir = ext_dir != nullptr ? ext_dir->GetSubdirectory(name) : nullptr; |
| 163 | auto subdir_name = std::string_view(child->path).substr(child->cur_path_ofs); | ||
| 164 | auto child_romfs_dir = romfs_dir->GetSubdirectory(subdir_name); | ||
| 165 | auto child_ext_dir = ext_dir != nullptr ? ext_dir->GetSubdirectory(subdir_name) : nullptr; | ||
| 166 | this->VisitDirectory(child_romfs_dir, child_ext_dir, child); | 160 | this->VisitDirectory(child_romfs_dir, child_ext_dir, child); |
| 167 | } | 161 | } |
| 168 | } | 162 | } |
| @@ -293,7 +287,7 @@ std::multimap<u64, VirtualFile> RomFSBuildContext::Build() { | |||
| 293 | 287 | ||
| 294 | cur_entry.name_size = name_size; | 288 | cur_entry.name_size = name_size; |
| 295 | 289 | ||
| 296 | out.emplace(cur_file->offset + ROMFS_FILEPARTITION_OFS, cur_file->source); | 290 | out.emplace(cur_file->offset + ROMFS_FILEPARTITION_OFS, std::move(cur_file->source)); |
| 297 | std::memcpy(file_table.data() + cur_file->entry_offset, &cur_entry, sizeof(RomFSFileEntry)); | 291 | std::memcpy(file_table.data() + cur_file->entry_offset, &cur_entry, sizeof(RomFSFileEntry)); |
| 298 | std::memset(file_table.data() + cur_file->entry_offset + sizeof(RomFSFileEntry), 0, | 292 | std::memset(file_table.data() + cur_file->entry_offset + sizeof(RomFSFileEntry), 0, |
| 299 | Common::AlignUp(cur_entry.name_size, 4)); | 293 | Common::AlignUp(cur_entry.name_size, 4)); |
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 8e475f25a..0bca05587 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp | |||
| @@ -377,16 +377,16 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t | |||
| 377 | 377 | ||
| 378 | auto romfs_dir = FindSubdirectoryCaseless(subdir, "romfs"); | 378 | auto romfs_dir = FindSubdirectoryCaseless(subdir, "romfs"); |
| 379 | if (romfs_dir != nullptr) | 379 | if (romfs_dir != nullptr) |
| 380 | layers.push_back(std::make_shared<CachedVfsDirectory>(romfs_dir)); | 380 | layers.emplace_back(std::make_shared<CachedVfsDirectory>(std::move(romfs_dir))); |
| 381 | 381 | ||
| 382 | auto ext_dir = FindSubdirectoryCaseless(subdir, "romfs_ext"); | 382 | auto ext_dir = FindSubdirectoryCaseless(subdir, "romfs_ext"); |
| 383 | if (ext_dir != nullptr) | 383 | if (ext_dir != nullptr) |
| 384 | layers_ext.push_back(std::make_shared<CachedVfsDirectory>(ext_dir)); | 384 | layers_ext.emplace_back(std::make_shared<CachedVfsDirectory>(std::move(ext_dir))); |
| 385 | 385 | ||
| 386 | if (type == ContentRecordType::HtmlDocument) { | 386 | if (type == ContentRecordType::HtmlDocument) { |
| 387 | auto manual_dir = FindSubdirectoryCaseless(subdir, "manual_html"); | 387 | auto manual_dir = FindSubdirectoryCaseless(subdir, "manual_html"); |
| 388 | if (manual_dir != nullptr) | 388 | if (manual_dir != nullptr) |
| 389 | layers.push_back(std::make_shared<CachedVfsDirectory>(manual_dir)); | 389 | layers.emplace_back(std::make_shared<CachedVfsDirectory>(std::move(manual_dir))); |
| 390 | } | 390 | } |
| 391 | } | 391 | } |
| 392 | 392 | ||
| @@ -400,7 +400,7 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t | |||
| 400 | return; | 400 | return; |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | layers.push_back(std::move(extracted)); | 403 | layers.emplace_back(std::move(extracted)); |
| 404 | 404 | ||
| 405 | auto layered = LayeredVfsDirectory::MakeLayeredDirectory(std::move(layers)); | 405 | auto layered = LayeredVfsDirectory::MakeLayeredDirectory(std::move(layers)); |
| 406 | if (layered == nullptr) { | 406 | if (layered == nullptr) { |
diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 04da93d5c..1cc77ad14 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp | |||
| @@ -322,7 +322,8 @@ VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& open_di | |||
| 322 | return nullptr; | 322 | return nullptr; |
| 323 | } | 323 | } |
| 324 | 324 | ||
| 325 | return ConcatenatedVfsFile::MakeConcatenatedFile(concat, concat.front()->GetName()); | 325 | auto name = concat.front()->GetName(); |
| 326 | return ConcatenatedVfsFile::MakeConcatenatedFile(std::move(name), std::move(concat)); | ||
| 326 | } | 327 | } |
| 327 | 328 | ||
| 328 | VirtualFile RegisteredCache::GetFileAtID(NcaID id) const { | 329 | VirtualFile RegisteredCache::GetFileAtID(NcaID id) const { |
diff --git a/src/core/file_sys/romfs.cpp b/src/core/file_sys/romfs.cpp index 614da2130..1c580de57 100644 --- a/src/core/file_sys/romfs.cpp +++ b/src/core/file_sys/romfs.cpp | |||
| @@ -133,7 +133,7 @@ VirtualDir ExtractRomFS(VirtualFile file, RomFSExtractionType type) { | |||
| 133 | out = out->GetSubdirectories().front(); | 133 | out = out->GetSubdirectories().front(); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | return std::make_shared<CachedVfsDirectory>(out); | 136 | return std::make_shared<CachedVfsDirectory>(std::move(out)); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | VirtualFile CreateRomFS(VirtualDir dir, VirtualDir ext) { | 139 | VirtualFile CreateRomFS(VirtualDir dir, VirtualDir ext) { |
| @@ -141,8 +141,7 @@ VirtualFile CreateRomFS(VirtualDir dir, VirtualDir ext) { | |||
| 141 | return nullptr; | 141 | return nullptr; |
| 142 | 142 | ||
| 143 | RomFSBuildContext ctx{dir, ext}; | 143 | RomFSBuildContext ctx{dir, ext}; |
| 144 | auto file_map = ctx.Build(); | 144 | return ConcatenatedVfsFile::MakeConcatenatedFile(0, dir->GetName(), ctx.Build()); |
| 145 | return ConcatenatedVfsFile::MakeConcatenatedFile(0, file_map, dir->GetName()); | ||
| 146 | } | 145 | } |
| 147 | 146 | ||
| 148 | } // namespace FileSys | 147 | } // namespace FileSys |
diff --git a/src/core/file_sys/vfs_cached.cpp b/src/core/file_sys/vfs_cached.cpp index c3154ee81..7ee5300e5 100644 --- a/src/core/file_sys/vfs_cached.cpp +++ b/src/core/file_sys/vfs_cached.cpp | |||
| @@ -6,13 +6,13 @@ | |||
| 6 | 6 | ||
| 7 | namespace FileSys { | 7 | namespace FileSys { |
| 8 | 8 | ||
| 9 | CachedVfsDirectory::CachedVfsDirectory(VirtualDir& source_dir) | 9 | CachedVfsDirectory::CachedVfsDirectory(VirtualDir&& source_dir) |
| 10 | : name(source_dir->GetName()), parent(source_dir->GetParentDirectory()) { | 10 | : name(source_dir->GetName()), parent(source_dir->GetParentDirectory()) { |
| 11 | for (auto& dir : source_dir->GetSubdirectories()) { | 11 | for (auto& dir : source_dir->GetSubdirectories()) { |
| 12 | dirs.emplace(dir->GetName(), std::make_shared<CachedVfsDirectory>(dir)); | 12 | dirs.emplace(dir->GetName(), std::make_shared<CachedVfsDirectory>(std::move(dir))); |
| 13 | } | 13 | } |
| 14 | for (auto& file : source_dir->GetFiles()) { | 14 | for (auto& file : source_dir->GetFiles()) { |
| 15 | files.emplace(file->GetName(), file); | 15 | files.emplace(file->GetName(), std::move(file)); |
| 16 | } | 16 | } |
| 17 | } | 17 | } |
| 18 | 18 | ||
diff --git a/src/core/file_sys/vfs_cached.h b/src/core/file_sys/vfs_cached.h index 113acac12..1e5300784 100644 --- a/src/core/file_sys/vfs_cached.h +++ b/src/core/file_sys/vfs_cached.h | |||
| @@ -11,7 +11,7 @@ namespace FileSys { | |||
| 11 | 11 | ||
| 12 | class CachedVfsDirectory : public ReadOnlyVfsDirectory { | 12 | class CachedVfsDirectory : public ReadOnlyVfsDirectory { |
| 13 | public: | 13 | public: |
| 14 | CachedVfsDirectory(VirtualDir& source_directory); | 14 | CachedVfsDirectory(VirtualDir&& source_directory); |
| 15 | 15 | ||
| 16 | ~CachedVfsDirectory() override; | 16 | ~CachedVfsDirectory() override; |
| 17 | VirtualFile GetFile(std::string_view file_name) const override; | 17 | VirtualFile GetFile(std::string_view file_name) const override; |
diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp index 311a59e5f..168b9cbec 100644 --- a/src/core/file_sys/vfs_concat.cpp +++ b/src/core/file_sys/vfs_concat.cpp | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | namespace FileSys { | 11 | namespace FileSys { |
| 12 | 12 | ||
| 13 | ConcatenatedVfsFile::ConcatenatedVfsFile(ConcatenationMap&& concatenation_map_, std::string&& name_) | 13 | ConcatenatedVfsFile::ConcatenatedVfsFile(std::string&& name_, ConcatenationMap&& concatenation_map_) |
| 14 | : concatenation_map(std::move(concatenation_map_)), name(std::move(name_)) { | 14 | : concatenation_map(std::move(concatenation_map_)), name(std::move(name_)) { |
| 15 | DEBUG_ASSERT(this->VerifyContinuity()); | 15 | DEBUG_ASSERT(this->VerifyContinuity()); |
| 16 | } | 16 | } |
| @@ -30,8 +30,8 @@ bool ConcatenatedVfsFile::VerifyContinuity() const { | |||
| 30 | 30 | ||
| 31 | ConcatenatedVfsFile::~ConcatenatedVfsFile() = default; | 31 | ConcatenatedVfsFile::~ConcatenatedVfsFile() = default; |
| 32 | 32 | ||
| 33 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(const std::vector<VirtualFile>& files, | 33 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(std::string&& name, |
| 34 | std::string&& name) { | 34 | std::vector<VirtualFile>&& files) { |
| 35 | // Fold trivial cases. | 35 | // Fold trivial cases. |
| 36 | if (files.empty()) { | 36 | if (files.empty()) { |
| 37 | return nullptr; | 37 | return nullptr; |
| @@ -46,20 +46,21 @@ VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(const std::vector<VirtualF | |||
| 46 | u64 last_offset = 0; | 46 | u64 last_offset = 0; |
| 47 | 47 | ||
| 48 | for (auto& file : files) { | 48 | for (auto& file : files) { |
| 49 | const auto size = file->GetSize(); | ||
| 50 | |||
| 49 | concatenation_map.emplace_back(ConcatenationEntry{ | 51 | concatenation_map.emplace_back(ConcatenationEntry{ |
| 50 | .offset = last_offset, | 52 | .offset = last_offset, |
| 51 | .file = file, | 53 | .file = std::move(file), |
| 52 | }); | 54 | }); |
| 53 | 55 | ||
| 54 | last_offset += file->GetSize(); | 56 | last_offset += size; |
| 55 | } | 57 | } |
| 56 | 58 | ||
| 57 | return VirtualFile(new ConcatenatedVfsFile(std::move(concatenation_map), std::move(name))); | 59 | return VirtualFile(new ConcatenatedVfsFile(std::move(name), std::move(concatenation_map))); |
| 58 | } | 60 | } |
| 59 | 61 | ||
| 60 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, | 62 | VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, std::string&& name, |
| 61 | const std::multimap<u64, VirtualFile>& files, | 63 | std::multimap<u64, VirtualFile>&& files) { |
| 62 | std::string&& name) { | ||
| 63 | // Fold trivial cases. | 64 | // Fold trivial cases. |
| 64 | if (files.empty()) { | 65 | if (files.empty()) { |
| 65 | return nullptr; | 66 | return nullptr; |
| @@ -76,6 +77,8 @@ VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, | |||
| 76 | 77 | ||
| 77 | // Iteration of a multimap is ordered, so offset will be strictly non-decreasing. | 78 | // Iteration of a multimap is ordered, so offset will be strictly non-decreasing. |
| 78 | for (auto& [offset, file] : files) { | 79 | for (auto& [offset, file] : files) { |
| 80 | const auto size = file->GetSize(); | ||
| 81 | |||
| 79 | if (offset > last_offset) { | 82 | if (offset > last_offset) { |
| 80 | concatenation_map.emplace_back(ConcatenationEntry{ | 83 | concatenation_map.emplace_back(ConcatenationEntry{ |
| 81 | .offset = last_offset, | 84 | .offset = last_offset, |
| @@ -85,13 +88,13 @@ VirtualFile ConcatenatedVfsFile::MakeConcatenatedFile(u8 filler_byte, | |||
| 85 | 88 | ||
| 86 | concatenation_map.emplace_back(ConcatenationEntry{ | 89 | concatenation_map.emplace_back(ConcatenationEntry{ |
| 87 | .offset = offset, | 90 | .offset = offset, |
| 88 | .file = file, | 91 | .file = std::move(file), |
| 89 | }); | 92 | }); |
| 90 | 93 | ||
| 91 | last_offset = offset + file->GetSize(); | 94 | last_offset = offset + size; |
| 92 | } | 95 | } |
| 93 | 96 | ||
| 94 | return VirtualFile(new ConcatenatedVfsFile(std::move(concatenation_map), std::move(name))); | 97 | return VirtualFile(new ConcatenatedVfsFile(std::move(name), std::move(concatenation_map))); |
| 95 | } | 98 | } |
| 96 | 99 | ||
| 97 | std::string ConcatenatedVfsFile::GetName() const { | 100 | std::string ConcatenatedVfsFile::GetName() const { |
diff --git a/src/core/file_sys/vfs_concat.h b/src/core/file_sys/vfs_concat.h index 6b329d545..cbddd12bd 100644 --- a/src/core/file_sys/vfs_concat.h +++ b/src/core/file_sys/vfs_concat.h | |||
| @@ -24,22 +24,20 @@ private: | |||
| 24 | }; | 24 | }; |
| 25 | using ConcatenationMap = std::vector<ConcatenationEntry>; | 25 | using ConcatenationMap = std::vector<ConcatenationEntry>; |
| 26 | 26 | ||
| 27 | explicit ConcatenatedVfsFile(std::vector<ConcatenationEntry>&& concatenation_map, | 27 | explicit ConcatenatedVfsFile(std::string&& name, |
| 28 | std::string&& name); | 28 | std::vector<ConcatenationEntry>&& concatenation_map); |
| 29 | bool VerifyContinuity() const; | 29 | bool VerifyContinuity() const; |
| 30 | 30 | ||
| 31 | public: | 31 | public: |
| 32 | ~ConcatenatedVfsFile() override; | 32 | ~ConcatenatedVfsFile() override; |
| 33 | 33 | ||
| 34 | /// Wrapper function to allow for more efficient handling of files.size() == 0, 1 cases. | 34 | /// Wrapper function to allow for more efficient handling of files.size() == 0, 1 cases. |
| 35 | static VirtualFile MakeConcatenatedFile(const std::vector<VirtualFile>& files, | 35 | static VirtualFile MakeConcatenatedFile(std::string&& name, std::vector<VirtualFile>&& files); |
| 36 | std::string&& name); | ||
| 37 | 36 | ||
| 38 | /// Convenience function that turns a map of offsets to files into a concatenated file, filling | 37 | /// Convenience function that turns a map of offsets to files into a concatenated file, filling |
| 39 | /// gaps with a given filler byte. | 38 | /// gaps with a given filler byte. |
| 40 | static VirtualFile MakeConcatenatedFile(u8 filler_byte, | 39 | static VirtualFile MakeConcatenatedFile(u8 filler_byte, std::string&& name, |
| 41 | const std::multimap<u64, VirtualFile>& files, | 40 | std::multimap<u64, VirtualFile>&& files); |
| 42 | std::string&& name); | ||
| 43 | 41 | ||
| 44 | std::string GetName() const override; | 42 | std::string GetName() const override; |
| 45 | std::size_t GetSize() const override; | 43 | std::size_t GetSize() const override; |
diff --git a/src/core/file_sys/vfs_layered.cpp b/src/core/file_sys/vfs_layered.cpp index 3e6426afc..08daca397 100644 --- a/src/core/file_sys/vfs_layered.cpp +++ b/src/core/file_sys/vfs_layered.cpp | |||
| @@ -38,7 +38,7 @@ VirtualDir LayeredVfsDirectory::GetDirectoryRelative(std::string_view path) cons | |||
| 38 | for (const auto& layer : dirs) { | 38 | for (const auto& layer : dirs) { |
| 39 | auto dir = layer->GetDirectoryRelative(path); | 39 | auto dir = layer->GetDirectoryRelative(path); |
| 40 | if (dir != nullptr) { | 40 | if (dir != nullptr) { |
| 41 | out.push_back(std::move(dir)); | 41 | out.emplace_back(std::move(dir)); |
| 42 | } | 42 | } |
| 43 | } | 43 | } |
| 44 | 44 | ||
| @@ -62,11 +62,11 @@ std::vector<VirtualFile> LayeredVfsDirectory::GetFiles() const { | |||
| 62 | std::set<std::string, std::less<>> out_names; | 62 | std::set<std::string, std::less<>> out_names; |
| 63 | 63 | ||
| 64 | for (const auto& layer : dirs) { | 64 | for (const auto& layer : dirs) { |
| 65 | for (const auto& file : layer->GetFiles()) { | 65 | for (auto& file : layer->GetFiles()) { |
| 66 | auto file_name = file->GetName(); | 66 | auto file_name = file->GetName(); |
| 67 | if (!out_names.contains(file_name)) { | 67 | if (!out_names.contains(file_name)) { |
| 68 | out_names.emplace(std::move(file_name)); | 68 | out_names.emplace(std::move(file_name)); |
| 69 | out.push_back(file); | 69 | out.emplace_back(std::move(file)); |
| 70 | } | 70 | } |
| 71 | } | 71 | } |
| 72 | } | 72 | } |
| @@ -86,7 +86,7 @@ std::vector<VirtualDir> LayeredVfsDirectory::GetSubdirectories() const { | |||
| 86 | std::vector<VirtualDir> out; | 86 | std::vector<VirtualDir> out; |
| 87 | out.reserve(names.size()); | 87 | out.reserve(names.size()); |
| 88 | for (const auto& subdir : names) | 88 | for (const auto& subdir : names) |
| 89 | out.push_back(GetSubdirectory(subdir)); | 89 | out.emplace_back(GetSubdirectory(subdir)); |
| 90 | 90 | ||
| 91 | return out; | 91 | return out; |
| 92 | } | 92 | } |