libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
libxr_type.hpp
1#pragma once
2
3#include <cstring>
4#include <string>
5#include <string_view>
6#include <type_traits>
7
8#include "libxr_def.hpp"
9
10namespace LibXR
11{
12
13namespace Detail
14{
20template <size_t N>
21[[nodiscard]] constexpr size_t TrailingNulTrimmedArraySize(char (&data)[N]) noexcept
22{
23 return (data[N - 1] == '\0') ? (N - 1) : N;
24}
25
26template <size_t N>
27[[nodiscard]] constexpr size_t TrailingNulTrimmedArraySize(const char (&data)[N]) noexcept
28{
29 return (data[N - 1] == '\0') ? (N - 1) : N;
30}
31
39template <typename T>
40concept StdStringOrView = std::is_same_v<std::remove_cvref_t<T>, std::string> ||
41 std::is_same_v<std::remove_cvref_t<T>, std::string_view>;
42} // namespace Detail
43
54{
55 public:
65 RawData(void* addr, size_t size) : addr_(addr), size_(size) {}
66
71 RawData() = default;
72
80 template <typename DataType>
81 requires(!std::is_const_v<DataType> &&
82 !std::is_same_v<std::remove_cvref_t<DataType>, RawData> &&
84 RawData(DataType& data) : addr_(&data), size_(sizeof(DataType))
85 {
86 }
87
93 template <typename Text>
94 requires(std::is_same_v<Text, std::string>)
95 RawData(Text&) = delete; // 用 RawData(text) / Use RawData(text)
96
104 RawData(const RawData& data) = default;
105
114 template <typename CharPtr>
115 requires(std::is_same_v<std::remove_cvref_t<CharPtr>, char*>)
116 RawData(CharPtr&& data) : addr_(data), size_(data != nullptr ? std::strlen(data) : 0)
117 {
118 }
119
129 template <size_t N>
130 RawData(char (&data)[N]) : addr_(data), size_(Detail::TrailingNulTrimmedArraySize(data))
131 {
132 }
133
138 explicit RawData(std::string& data)
139 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
140 {
141 }
142
152 RawData& operator=(const RawData& data) = default;
153
154 void* addr_ = nullptr;
155 size_t size_ = 0;
156};
157
168{
169 public:
179 ConstRawData(const void* addr, size_t size) : addr_(addr), size_(size) {}
180
185 ConstRawData() = default;
186
194 template <typename DataType>
195 requires(!std::is_pointer_v<std::remove_cvref_t<DataType>> &&
196 !std::is_same_v<std::remove_cvref_t<DataType>, ConstRawData> &&
197 !std::is_same_v<std::remove_cvref_t<DataType>, RawData> &&
199 ConstRawData(const DataType& data)
200 : addr_(reinterpret_cast<const DataType*>(&data)), size_(sizeof(DataType))
201 {
202 }
203
210 template <typename Text>
212 ConstRawData(const Text&) = delete; // 用 ConstRawData(text) / Use ConstRawData(text)
213
221 ConstRawData(const ConstRawData& data) = default;
222
231 ConstRawData(const RawData& data) : addr_(data.addr_), size_(data.size_) {}
232
242 template <typename CharPtr>
243 requires(std::is_pointer_v<std::remove_cvref_t<CharPtr>> &&
244 std::is_same_v<
245 std::remove_cv_t<std::remove_pointer_t<std::remove_cvref_t<CharPtr>>>,
246 char> &&
247 !std::is_volatile_v<std::remove_pointer_t<std::remove_cvref_t<CharPtr>>>)
248 ConstRawData(CharPtr&& data)
249 : addr_(data),
250 size_(data != nullptr ? std::strlen(static_cast<const char*>(data)) : 0)
251 {
252 }
253
258 explicit ConstRawData(const std::string& data)
259 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
260 {
261 }
262
267 explicit ConstRawData(std::string_view data)
268 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
269 {
270 }
271
282 template <size_t N>
283 ConstRawData(char (&data)[N])
284 : addr_(reinterpret_cast<const void*>(data)),
285 size_(Detail::TrailingNulTrimmedArraySize(data))
286 {
287 }
288
289 template <size_t N>
290 ConstRawData(const char (&data)[N])
291 : addr_(reinterpret_cast<const void*>(data)),
292 size_(Detail::TrailingNulTrimmedArraySize(data))
293 {
294 }
295
305 ConstRawData& operator=(const ConstRawData& data) = default;
306
307 const void* addr_ = nullptr;
308 size_t size_ = 0;
309};
310
315{
316 public:
317 using ID = const void*;
318
324 template <typename T>
325 static ID GetID()
326 {
327 static char id; // NOLINT
328 return &id;
329 }
330};
331
332} // namespace LibXR
只读原始数据视图 / Immutable raw data view
ConstRawData(const std::string &data)
从只读字符串构造文本视图 / Construct a text view from a read-only string
ConstRawData(const DataType &data)
从任意对象构造只读视图,大小为 sizeof(DataType) / Construct a read-only view from any object; the size is sizeof(Dat...
ConstRawData(std::string_view data)
从字符串视图构造文本视图 / Construct a text view from a string view
ConstRawData(const RawData &data)
从 RawData 构造 ConstRawData,数据地址和大小保持不变。 Constructs ConstRawData from RawData, keeping the same data ad...
ConstRawData(char(&data)[N])
从字符数组构造 ConstRawData;若最后一个字符是 \\0,仅忽略这一尾随终止符。 Constructs ConstRawData from a character array; if the ...
ConstRawData & operator=(const ConstRawData &data)=default
赋值运算符重载。 Overloaded assignment operator.
ConstRawData(const Text &)=delete
禁止 std::string / std::string_view 隐式转换为 ConstRawData;文本视图须 显式写 ConstRawData(text)。 Implicit conversio...
ConstRawData(const void *addr, size_t size)
使用指定地址和大小构造 ConstRawData 对象。 Constructs a ConstRawData object with the specified address and size.
ConstRawData(CharPtr &&data)
从 char* / const char* 文本指针构造 ConstRawData,数据大小为字符串长度(不含 \0)。 Constructs ConstRawData from a char* / c...
size_t size_
数据字节数 / Data size in bytes
ConstRawData(const ConstRawData &data)=default
拷贝构造函数。 Copy constructor.
const void * addr_
数据起始地址 / Data start address
ConstRawData()=default
默认构造函数,初始化为空数据。 Default constructor initializing to empty data.
可写原始数据视图 / Mutable raw data view
RawData & operator=(const RawData &data)=default
赋值运算符重载。 Overloaded assignment operator.
RawData(CharPtr &&data)
从 char * 指针构造 RawData,数据大小为字符串长度(不含 \0)。 Constructs RawData from a char * pointer,...
RawData(void *addr, size_t size)
使用指定地址和大小构造 RawData 对象。 Constructs a RawData object with the specified address and size.
RawData(DataType &data)
从可写对象构造视图,大小为 sizeof(DataType) / Construct a view from a writable object; the size is sizeof(DataType...
RawData()=default
默认构造函数,初始化为空数据。 Default constructor initializing to empty data.
size_t size_
数据字节数 / Data size in bytes
RawData(char(&data)[N])
从可写字符数组构造文本视图 / Construct a text view from a writable char array
void * addr_
数据起始地址 / Data start address
RawData(Text &)=delete
禁止 std::string 隐式转换为 RawData;文本视图须显式写 RawData(text)。 Implicit conversion from std::string is deleted;...
RawData(const RawData &data)=default
拷贝构造函数。 Copy constructor.
RawData(std::string &data)
从可写字符串构造文本视图 / Construct a text view from a writable string
类型标识符生成器 / RTTI-free type identifier generator
static ID GetID()
获取类型的唯一标识符 / Get a unique identifier for type T
std::string 或 std::string_view(忽略 cv 和引用)。通用对象构造函数会取这类 对象本身的字节而不是文本,因此它们不能隐式转换为 RawData / ConstRawDat...
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14