libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
factory.hpp
1
13template <typename DataType>
14static 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
49template <typename ArgType>
50static File CreateFile(const char* name, int (*exec)(ArgType arg, int argc, char** argv),
51 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
90template <typename ArgType>
91static File CreateCommand(const char* name,
92 int (*exec)(ArgType arg, int argc, char** argv), ArgType&& arg)
93{
94 return CreateFile(name, exec, std::forward<ArgType>(arg));
95}
96
104static Dir CreateDir(const char* name) { return Dir(name); }
105
110void Add(File& file) { root_.Add(file); }
111
116void Add(Dir& dir) { root_.Add(dir); }
117
122void Add(Custom& custom) { root_.Add(custom); }
123
129File* FindFile(const char* name) { return root_.FindFileRev(name); }
130
136Dir* FindDir(const char* name) { return root_.FindDirRev(name); }
137
144Custom* FindCustom(const char* name) { return root_.FindCustomRev(name); }
145
146Dir root_;
148Dir 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