summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-09-19 21:59:44 -0400
committerGravatar Zach Hilman2018-09-21 19:53:05 -0400
commit3e5c3d0f166b432b1e56e6e3a286feb21281bc7a (patch)
tree12617aa462578063599c86f8f2fc72dc8a3cfcc0 /src
parentvfs_vector: Add VectorVfsFile (diff)
downloadyuzu-3e5c3d0f166b432b1e56e6e3a286feb21281bc7a.tar.gz
yuzu-3e5c3d0f166b432b1e56e6e3a286feb21281bc7a.tar.xz
yuzu-3e5c3d0f166b432b1e56e6e3a286feb21281bc7a.zip
vfs_layered: Add LayeredVfsDirectory
Reads multiple dirs through as if a waterfall.
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/vfs_layered.cpp128
-rw-r--r--src/core/file_sys/vfs_layered.h50
2 files changed, 178 insertions, 0 deletions
diff --git a/src/core/file_sys/vfs_layered.cpp b/src/core/file_sys/vfs_layered.cpp
new file mode 100644
index 000000000..802f49384
--- /dev/null
+++ b/src/core/file_sys/vfs_layered.cpp
@@ -0,0 +1,128 @@
1// Copyright 2018 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <algorithm>
6#include <utility>
7#include "core/file_sys/vfs_layered.h"
8
9namespace FileSys {
10
11VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name) {
12 if (dirs.empty())
13 return nullptr;
14 if (dirs.size() == 1)
15 return dirs[0];
16
17 return std::shared_ptr<VfsDirectory>(new LayeredVfsDirectory(std::move(dirs), std::move(name)));
18}
19
20LayeredVfsDirectory::LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name)
21 : dirs(std::move(dirs)), name(std::move(name)) {}
22
23std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFileRelative(std::string_view path) const {
24 VirtualFile file;
25 for (const auto& layer : dirs) {
26 file = layer->GetFileRelative(path);
27 if (file != nullptr)
28 return file;
29 }
30
31 return nullptr;
32}
33
34std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetDirectoryRelative(
35 std::string_view path) const {
36 std::vector<VirtualDir> out;
37 for (const auto& layer : dirs) {
38 const auto dir = layer->GetDirectoryRelative(path);
39 if (dir != nullptr)
40 out.push_back(dir);
41 }
42
43 return LayerDirectories(out);
44}
45
46std::shared_ptr<VfsFile> LayeredVfsDirectory::GetFile(std::string_view name) const {
47 return GetFileRelative(name);
48}
49
50std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetSubdirectory(std::string_view name) const {
51 return GetDirectoryRelative(name);
52}
53
54std::string LayeredVfsDirectory::GetFullPath() const {
55 return dirs[0]->GetFullPath();
56}
57
58std::vector<std::shared_ptr<VfsFile>> LayeredVfsDirectory::GetFiles() const {
59 std::vector<VirtualFile> out;
60 for (const auto& layer : dirs) {
61 for (const auto& file : layer->GetFiles()) {
62 if (std::find_if(out.begin(), out.end(), [&file](const VirtualFile& comp) {
63 return comp->GetName() == file->GetName();
64 }) == out.end())
65 out.push_back(file);
66 }
67 }
68
69 return out;
70}
71
72std::vector<std::shared_ptr<VfsDirectory>> LayeredVfsDirectory::GetSubdirectories() const {
73 std::vector<std::string> names;
74 for (const auto& layer : dirs) {
75 for (const auto& sd : layer->GetSubdirectories()) {
76 if (std::find(names.begin(), names.end(), sd->GetName()) == names.end())
77 names.push_back(sd->GetName());
78 }
79 }
80
81 std::vector<VirtualDir> out;
82 for (const auto& subdir : names)
83 out.push_back(GetSubdirectory(subdir));
84
85 return out;
86}
87
88bool LayeredVfsDirectory::IsWritable() const {
89 return false;
90}
91
92bool LayeredVfsDirectory::IsReadable() const {
93 return true;
94}
95
96std::string LayeredVfsDirectory::GetName() const {
97 return name.empty() ? dirs[0]->GetName() : name;
98}
99
100std::shared_ptr<VfsDirectory> LayeredVfsDirectory::GetParentDirectory() const {
101 return dirs[0]->GetParentDirectory();
102}
103
104std::shared_ptr<VfsDirectory> LayeredVfsDirectory::CreateSubdirectory(std::string_view name) {
105 return nullptr;
106}
107
108std::shared_ptr<VfsFile> LayeredVfsDirectory::CreateFile(std::string_view name) {
109 return nullptr;
110}
111
112bool LayeredVfsDirectory::DeleteSubdirectory(std::string_view name) {
113 return false;
114}
115
116bool LayeredVfsDirectory::DeleteFile(std::string_view name) {
117 return false;
118}
119
120bool LayeredVfsDirectory::Rename(std::string_view name_) {
121 name = name_;
122 return true;
123}
124
125bool LayeredVfsDirectory::ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) {
126 return false;
127}
128} // namespace FileSys
diff --git a/src/core/file_sys/vfs_layered.h b/src/core/file_sys/vfs_layered.h
new file mode 100644
index 000000000..f345c2fb6
--- /dev/null
+++ b/src/core/file_sys/vfs_layered.h
@@ -0,0 +1,50 @@
1// Copyright 2018 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <memory>
8#include "core/file_sys/vfs.h"
9
10namespace FileSys {
11
12// Wrapper function to allow for more efficient handling of dirs.size() == 0, 1 cases.
13VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name = "");
14
15// Class that stacks multiple VfsDirectories on top of each other, attempting to read from the first
16// one and falling back to the one after. The highest priority directory (overwrites all others)
17// should be element 0 in the dirs vector.
18class LayeredVfsDirectory : public VfsDirectory {
19 friend VirtualDir LayerDirectories(std::vector<VirtualDir> dirs, std::string name);
20
21 LayeredVfsDirectory(std::vector<VirtualDir> dirs, std::string name);
22
23public:
24 std::shared_ptr<VfsFile> GetFileRelative(std::string_view path) const override;
25 std::shared_ptr<VfsDirectory> GetDirectoryRelative(std::string_view path) const override;
26 std::shared_ptr<VfsFile> GetFile(std::string_view name) const override;
27 std::shared_ptr<VfsDirectory> GetSubdirectory(std::string_view name) const override;
28 std::string GetFullPath() const override;
29
30 std::vector<std::shared_ptr<VfsFile>> GetFiles() const override;
31 std::vector<std::shared_ptr<VfsDirectory>> GetSubdirectories() const override;
32 bool IsWritable() const override;
33 bool IsReadable() const override;
34 std::string GetName() const override;
35 std::shared_ptr<VfsDirectory> GetParentDirectory() const override;
36 std::shared_ptr<VfsDirectory> CreateSubdirectory(std::string_view name) override;
37 std::shared_ptr<VfsFile> CreateFile(std::string_view name) override;
38 bool DeleteSubdirectory(std::string_view name) override;
39 bool DeleteFile(std::string_view name) override;
40 bool Rename(std::string_view name) override;
41
42protected:
43 bool ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) override;
44
45private:
46 std::vector<VirtualDir> dirs;
47 std::string name;
48};
49
50} // namespace FileSys