libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
file.hpp
1
8class File : public FsNode
9{
10 public:
15 [[nodiscard]] bool IsReadOnly() const { return file_type_ == FileType::READ_ONLY; }
16
21 [[nodiscard]] bool IsReadWrite() const { return file_type_ == FileType::READ_WRITE; }
22
27 [[nodiscard]] bool IsExecutable() const { return file_type_ == FileType::EXEC; }
28
35 int Run(int argc, char** argv);
36
50 template <typename DataType, SizeLimitMode LimitMode = SizeLimitMode::MORE>
51 decltype(auto) Data()
52 {
53 using RequestedType = std::remove_reference_t<DataType>;
54 using StoredType = std::remove_cv_t<RequestedType>;
55 static_assert(!std::is_reference_v<DataType>);
56 static_assert(!std::is_volatile_v<RequestedType>);
57
58 ASSERT(LibXR::SizeLimitCheck(LimitMode, sizeof(StoredType), size_));
59 if constexpr (std::is_const_v<RequestedType>)
60 {
62 }
63 else
64 {
66 }
67 }
68
77 template <typename DataType, SizeLimitMode LimitMode = SizeLimitMode::MORE>
78 decltype(auto) Data() const
79 {
80 using RequestedType = std::remove_reference_t<DataType>;
81 using StoredType = std::remove_cv_t<RequestedType>;
82 static_assert(!std::is_reference_v<DataType>);
83 static_assert(!std::is_volatile_v<RequestedType>);
84
85 ASSERT(LibXR::SizeLimitCheck(LimitMode, sizeof(StoredType), size_));
87 }
88
94 [[nodiscard]] RawData Data() { return RawData(WritableDataPtr<void>(), size_); }
95
100 [[nodiscard]] ConstRawData Data() const
101 {
102 return ConstRawData(ReadableDataPtr<void>(), size_);
103 }
104
105 private:
109 using ExecFun = int (*)(void* raw, int argc, char** argv);
110
121 [[noreturn]] static void DataAccessPanic()
122 {
123 REQUIRE(false);
124 std::abort();
125 }
126
133 template <typename DataType>
134 const DataType* ReadableDataPtr() const
135 {
136 if (file_type_ == FileType::READ_WRITE)
137 {
138 return static_cast<const DataType*>(addr_);
139 }
140 if (file_type_ == FileType::READ_ONLY)
141 {
142 return static_cast<const DataType*>(addr_const_);
143 }
145 }
146
153 template <typename DataType>
154 DataType* WritableDataPtr()
155 {
156 if (file_type_ != FileType::READ_WRITE)
157 {
159 }
160 return static_cast<DataType*>(addr_);
161 }
162
167
172 explicit File(const char* name);
173
181 union
182 {
183 void* addr_;
184 const void* addr_const_;
186 };
187
188 void* arg_ = nullptr;
189 size_t size_ = 0;
190 FileType file_type_ =
191 FileType::READ_ONLY;
192
193 friend class RamFS;
194};
RamFS 的文件节点片段 / File-node fragment of RamFS
Definition file.hpp:9
const void * addr_const_
只读数据地址 / Read-only payload address.
Definition file.hpp:184
int Run(int argc, char **argv)
执行可执行文件 / Run an executable file
int(*)(void *raw, int argc, char **argv) ExecFun
可执行文件调用入口类型 / Executable entry function type
Definition file.hpp:109
void * arg_
可执行文件上下文块 / Executable context block.
Definition file.hpp:188
FileType file_type_
当前文件存储形态 / Current file storage kind.
Definition file.hpp:190
void * addr_
可写数据地址 / Writable payload address.
Definition file.hpp:183
bool IsExecutable() const
判断文件是否可执行 / Check whether the file is executable
Definition file.hpp:27
static void DataAccessPanic()
处理不应到达的 File 数据访问路径 Handle one File data-access path that should be unreachable
Definition file.hpp:121
bool IsReadWrite() const
判断文件是否可写 / Check whether the file is writable
Definition file.hpp:21
decltype(auto) Data()
访问类型化数据 / Access typed data
Definition file.hpp:51
ConstRawData Data() const
访问只读原始数据 / Access read-only raw data
Definition file.hpp:100
DataType * WritableDataPtr()
获取可写数据地址 Get the writable data pointer
Definition file.hpp:154
ExecFun exec_
可执行入口函数 / Executable entry function.
Definition file.hpp:185
File(const char *name)
构造一个具名文件壳 / Construct one named file shell
bool IsReadOnly() const
判断文件是否只读 / Check whether the file is read-only
Definition file.hpp:15
const DataType * ReadableDataPtr() const
获取只读数据地址 Get the readable data pointer
Definition file.hpp:134
decltype(auto) Data() const
从 const 文件对象访问类型化只读数据 / Access typed read-only data from a const file object
Definition file.hpp:78
RawData Data()
访问可写原始数据,要求文件为 READ_WRITE / Access writable raw data; requires READ_WRITE
Definition file.hpp:94
size_t size_
数据负载字节数 / Payload size in bytes.
Definition file.hpp:189
File()
构造一个空文件壳 / Construct one empty file shell
RamFS 的公共节点基类片段 / Common node-base fragment of RamFS
Definition fs_node.hpp:9
constexpr bool SizeLimitCheck(SizeLimitMode mode, size_t limit, size_t size) noexcept
尺寸约束的纯判断函数