libxr  1.0
Want to be the best embedded framework
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} // namespace Detail
32
43{
44 public:
54 RawData(void* addr, size_t size) : addr_(addr), size_(size) {}
55
60 RawData() = default;
61
67 template <typename DataType>
68 requires(!std::is_const_v<DataType> &&
69 !std::is_same_v<std::remove_cvref_t<DataType>, RawData>)
70 RawData(DataType& data) : addr_(&data), size_(sizeof(DataType))
71 {
72 }
73
81 RawData(const RawData& data) = default;
82
91 template <typename CharPtr>
92 requires(std::is_same_v<std::remove_cvref_t<CharPtr>, char*>)
93 RawData(CharPtr&& data) : addr_(data), size_(data != nullptr ? std::strlen(data) : 0)
94 {
95 }
96
106 template <size_t N>
107 RawData(char (&data)[N]) : addr_(data), size_(Detail::TrailingNulTrimmedArraySize(data))
108 {
109 }
110
115 explicit RawData(std::string& data)
116 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
117 {
118 }
119
129 RawData& operator=(const RawData& data) = default;
130
131 void* addr_ = nullptr;
132 size_t size_ = 0;
133};
134
145{
146 public:
156 ConstRawData(const void* addr, size_t size) : addr_(addr), size_(size) {}
157
162 ConstRawData() = default;
163
169 template <typename DataType>
170 requires(!std::is_pointer_v<std::remove_cvref_t<DataType>> &&
171 !std::is_same_v<std::remove_cvref_t<DataType>, ConstRawData> &&
172 !std::is_same_v<std::remove_cvref_t<DataType>, RawData>)
173 ConstRawData(const DataType& data)
174 : addr_(reinterpret_cast<const DataType*>(&data)), size_(sizeof(DataType))
175 {
176 }
177
185 ConstRawData(const ConstRawData& data) = default;
186
195 ConstRawData(const RawData& data) : addr_(data.addr_), size_(data.size_) {}
196
206 template <typename CharPtr>
207 requires(std::is_pointer_v<std::remove_cvref_t<CharPtr>> &&
208 std::is_same_v<
209 std::remove_cv_t<std::remove_pointer_t<std::remove_cvref_t<CharPtr>>>,
210 char> &&
211 !std::is_volatile_v<std::remove_pointer_t<std::remove_cvref_t<CharPtr>>>)
212 ConstRawData(CharPtr&& data)
213 : addr_(data),
214 size_(data != nullptr ? std::strlen(static_cast<const char*>(data)) : 0)
215 {
216 }
217
222 explicit ConstRawData(const std::string& data)
223 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
224 {
225 }
226
231 explicit ConstRawData(std::string_view data)
232 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
233 {
234 }
235
246 template <size_t N>
247 ConstRawData(char (&data)[N])
248 : addr_(reinterpret_cast<const void*>(data)),
249 size_(Detail::TrailingNulTrimmedArraySize(data))
250 {
251 }
252
253 template <size_t N>
254 ConstRawData(const char (&data)[N])
255 : addr_(reinterpret_cast<const void*>(data)),
256 size_(Detail::TrailingNulTrimmedArraySize(data))
257 {
258 }
259
269 ConstRawData& operator=(const ConstRawData& data) = default;
270
271 const void* addr_ = nullptr;
272 size_t size_ = 0;
273};
274
279{
280 public:
281 using ID = const void*;
282
288 template <typename T>
289 static ID GetID()
290 {
291 static char id; // NOLINT
292 return &id;
293 }
294};
295
296} // namespace LibXR
只读原始数据视图 / Immutable raw data view
ConstRawData(const std::string &data)
从只读字符串构造文本视图 / Construct a text view from a read-only string
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,仅忽略这一尾随终止符。
ConstRawData(const DataType &data)
从任意对象构造只读视图 / Construct a read-only view from any object
ConstRawData & operator=(const ConstRawData &data)=default
赋值运算符重载。 Overloaded assignment operator.
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()=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(DataType &data)
从可写对象构造视图 / Construct a view from a writable object
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
LibXR 命名空间
Definition ch32_can.hpp:14