libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
factory.hpp
1
13 template <typename DataType>
14 static File CreateFile(const char* name, DataType& raw)
15 {
16 using StoredType = std::remove_reference_t<DataType>;
17
18 File file(name);
19 if constexpr (std::is_const_v<StoredType>)
20 {
21 file.file_type_ = FileType::READ_ONLY;
22 file.addr_const_ = &raw;
23 }
24 else
25 {
26 file.file_type_ = FileType::READ_WRITE;
27 file.addr_ = &raw;
28 }
29
30 file.size_ = sizeof(StoredType);
31 return file;
32 }
33
49 template <typename ArgType>
50 static File CreateFile(const char* name,
51 int (*exec)(ArgType arg, int argc, char** argv), ArgType&& arg)
52 {
53 using StoredArgType = std::remove_reference_t<ArgType>;
54 struct ExecutableBlock
55 {
56 StoredArgType arg_;
57 decltype(exec) exec_fun_;
58 };
59
60 File file(name);
61
62 auto block = new ExecutableBlock{std::forward<ArgType>(arg), exec};
63 file.file_type_ = FileType::EXEC;
64 file.arg_ = block;
65
66 file.exec_ = [](void* raw, int argc, char** argv)
67 {
68 auto* block = static_cast<ExecutableBlock*>(raw);
69 return block->exec_fun_(block->arg_, argc, argv);
70 };
71
72 return file;
73 }
74
90 template <typename ArgType>
91 static File CreateCommand(const char* name,
92 int (*exec)(ArgType arg, int argc, char** argv),
93 ArgType&& arg)
94 {
95 return CreateFile(name, exec, std::forward<ArgType>(arg));
96 }
97
105 static Dir CreateDir(const char* name) { return Dir(name); }
106
111 void Add(File& file) { root_.Add(file); }
112
117 void Add(Dir& dir) { root_.Add(dir); }
118
123 void Add(Custom& custom) { root_.Add(custom); }
124
130 File* FindFile(const char* name) { return root_.FindFileRev(name); }
131
137 Dir* FindDir(const char* name) { return root_.FindDirRev(name); }
138
145 Custom* FindCustom(const char* name) { return root_.FindCustomRev(name); }
146
147 Dir root_;
148 Dir bin_;
RamFS 的自定义节点片段 / Custom-node fragment of RamFS
Definition custom.hpp:10
RamFS 的目录节点片段 / Directory-node fragment of RamFS
Definition dir.hpp:9
Dir * FindDirRev(const char *name)
递归查找目录,支持 "." 和 ".." / Find a directory recursively, supporting "." and ".."
File * FindFileRev(const char *name)
递归查找文件 / Find a file recursively
void Add(File &file)
添加直属文件节点 / Add a direct child file node
Definition dir.hpp:15
Custom * FindCustomRev(const char *name)
递归查找自定义节点 / Find a custom node recursively
RamFS 的文件节点片段 / File-node fragment of RamFS
Definition file.hpp:9