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(
28 const char (&data)[N]) noexcept
29{
30 return (data[N - 1] == '\0') ? (N - 1) : N;
31}
32} // namespace Detail
33
44{
45 public:
55 RawData(void* addr, size_t size) : addr_(addr), size_(size) {}
56
61 RawData() = default;
62
68 template <typename DataType>
69 requires(!std::is_const_v<DataType> &&
70 !std::is_same_v<std::remove_cvref_t<DataType>, RawData>)
71 RawData(DataType& data) : addr_(&data), size_(sizeof(DataType))
72 {
73 }
74
82 RawData(const RawData& data) = default;
83
92 RawData(char* data) : addr_(data), size_(data != nullptr ? std::strlen(data) : 0) {}
93
103 template <size_t N>
104 RawData(char (&data)[N]) : addr_(data), size_(Detail::TrailingNulTrimmedArraySize(data))
105 {
106 }
107
112 explicit RawData(std::string& data)
113 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
114 {
115 }
116
126 RawData& operator=(const RawData& data) = default;
127
128 void* addr_ = nullptr;
129 size_t size_ = 0;
130};
131
142{
143 public:
153 ConstRawData(const void* addr, size_t size) : addr_(addr), size_(size) {}
154
159 ConstRawData() = default;
160
166 template <typename DataType>
167 requires(!std::is_pointer_v<std::remove_cvref_t<DataType>> &&
168 !std::is_same_v<std::remove_cvref_t<DataType>, ConstRawData> &&
169 !std::is_same_v<std::remove_cvref_t<DataType>, RawData>)
170 ConstRawData(const DataType& data)
171 : addr_(reinterpret_cast<const DataType*>(&data)), size_(sizeof(DataType))
172 {
173 }
174
182 ConstRawData(const ConstRawData& data) = default;
183
192 ConstRawData(const RawData& data) : addr_(data.addr_), size_(data.size_) {}
193
202 template <typename CharPtr>
203 requires(std::is_pointer_v<std::remove_reference_t<CharPtr>> &&
204 std::is_same_v<std::remove_cv_t<
205 std::remove_pointer_t<std::remove_reference_t<CharPtr>>>,
206 char> &&
207 !std::is_volatile_v<std::remove_pointer_t<std::remove_reference_t<CharPtr>>>)
208 ConstRawData(CharPtr data)
209 : addr_(data),
210 size_(data != nullptr ? std::strlen(static_cast<const char*>(data)) : 0)
211 {
212 }
213
218 explicit ConstRawData(const std::string& data)
219 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
220 {
221 }
222
227 explicit ConstRawData(std::string_view data)
228 : addr_(data.empty() ? nullptr : data.data()), size_(data.size())
229 {
230 }
231
242 template <size_t N>
243 ConstRawData(char (&data)[N])
244 : addr_(reinterpret_cast<const void*>(data)),
245 size_(Detail::TrailingNulTrimmedArraySize(data))
246 {
247 }
248
249 template <size_t N>
250 ConstRawData(const char (&data)[N])
251 : addr_(reinterpret_cast<const void*>(data)),
252 size_(Detail::TrailingNulTrimmedArraySize(data))
253 {
254 }
255
265 ConstRawData& operator=(const ConstRawData& data) = default;
266
267 const void* addr_ = nullptr;
268 size_t size_ = 0;
269};
270
275{
276 public:
277 using ID = const void*;
278
284 template <typename T>
285 static ID GetID()
286 {
287 static char id; // NOLINT
288 return &id;
289 }
290};
291
292} // 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(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(char *data)
从 char * 指针构造 RawData,数据大小为字符串长度(不含 \0)。 Constructs RawData from a char * pointer,...
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