libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
file.hpp
1
8 class 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()
95 {
96 return RawData(WritableDataPtr<void>(), size_);
97 }
98
103 [[nodiscard]] ConstRawData Data() const
104 {
105 return ConstRawData(ReadableDataPtr<void>(), size_);
106 }
107
108 private:
112 using ExecFun = int (*)(void* raw, int argc, char** argv);
113
124 [[noreturn]] static void DataAccessPanic()
125 {
126 REQUIRE(false);
127 std::abort();
128 }
129
136 template <typename DataType>
137 const DataType* ReadableDataPtr() const
138 {
139 if (file_type_ == FileType::READ_WRITE)
140 {
141 return static_cast<const DataType*>(addr_);
142 }
143 if (file_type_ == FileType::READ_ONLY)
144 {
145 return static_cast<const DataType*>(addr_const_);
146 }
148 }
149
156 template <typename DataType>
157 DataType* WritableDataPtr()
158 {
159 if (file_type_ != FileType::READ_WRITE)
160 {
162 }
163 return static_cast<DataType*>(addr_);
164 }
165
170
175 explicit File(const char* name);
176
184 union
185 {
186 void* addr_;
187 const void* addr_const_;
189 };
190
191 void* arg_ = nullptr;
192 size_t size_ = 0;
193 FileType file_type_ = FileType::READ_ONLY;
194
195 friend class RamFS;
196 };
RamFS 的文件节点片段 / File-node fragment of RamFS
Definition file.hpp:9
const void * addr_const_
只读数据地址 / Read-only payload address.
Definition file.hpp:187
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:112
void * arg_
可执行文件上下文块 / Executable context block.
Definition file.hpp:191
FileType file_type_
当前文件存储形态 / Current file storage kind.
Definition file.hpp:193
void * addr_
可写数据地址 / Writable payload address.
Definition file.hpp:186
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:124
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:103
DataType * WritableDataPtr()
获取可写数据地址 Get the writable data pointer
Definition file.hpp:157
ExecFun exec_
可执行入口函数 / Executable entry function.
Definition file.hpp:188
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:137
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:192
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
尺寸约束的纯判断函数