NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
packages.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_UTILITY_PACKAGES_HPP__
2#define NEFORCE_CORE_UTILITY_PACKAGES_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
22
29struct boolean : ipackage<boolean, bool>, iobject<boolean> {
30 using value_type = bool;
31 using base = ipackage;
32
33 constexpr boolean() noexcept = default;
34 NEFORCE_CONSTEXPR20 ~boolean() = default;
35
36 constexpr boolean(const boolean&) noexcept = default;
37 constexpr boolean(boolean&&) noexcept = default;
38
39 constexpr boolean& operator=(const boolean& other) noexcept = default;
40 constexpr boolean& operator=(boolean&& other) noexcept = default;
41
42 explicit constexpr boolean(const value_type value) noexcept :
43 base(value) {}
44
45 constexpr boolean& operator=(const value_type value) noexcept {
46 value_ = value;
47 return *this;
48 }
49
55 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
56 return boolean(value).to_string();
57 }
58
63 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return value_ ? "true" : "false"; }
64
74 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 boolean parse(const string_view lower) {
75 boolean obj;
76 string str(lower.trim());
77 try {
78 str.lowercase();
79 if (str == "true" || str == "yes" || str == "y") {
80 obj = true;
81 } else if (str == "false" || str == "no" || str == "n") {
82 obj = false;
83 } else {
84 obj = static_cast<bool>(to_int32(str.view(), nullptr, 10));
85 }
86 } catch (...) {
87 NEFORCE_THROW_EXCEPTION(typecast_exception("Convert from string to boolean failed."));
88 }
89 return obj;
90 }
91
96 constexpr boolean operator!() const noexcept { return boolean(!value_); }
97};
98
99template <>
100struct package<bool> {
101 using type = boolean;
102};
103
104template <>
105struct unpackage<boolean> {
106 using type = bool;
107};
108
109
110#define __NEFORCE_BUILD_INTEGER_STRUCT(SIGN, UPPER, BYTE) \
111 struct SIGN##integer##BYTE : iobject<SIGN##integer##BYTE>, ipackage<SIGN##integer##BYTE, SIGN##int##BYTE##_t> { \
112 using value_type = SIGN##int##BYTE##_t; \
113 using base = ipackage<SIGN##integer##BYTE, SIGN##int##BYTE##_t>; \
114 \
115 constexpr SIGN##integer##BYTE() noexcept = default; \
116 NEFORCE_CONSTEXPR20 ~SIGN##integer##BYTE() = default; \
117 \
118 constexpr SIGN##integer##BYTE(const SIGN##integer##BYTE&) noexcept = default; \
119 constexpr SIGN##integer##BYTE(SIGN##integer##BYTE&&) noexcept = default; \
120 \
121 constexpr SIGN##integer##BYTE& operator=(const SIGN##integer##BYTE& other) noexcept = default; \
122 constexpr SIGN##integer##BYTE& operator=(SIGN##integer##BYTE&& other) noexcept = default; \
123 \
124 explicit constexpr SIGN##integer##BYTE(const value_type value) noexcept : \
125 base(value) {} \
126 \
127 constexpr SIGN##integer##BYTE& operator=(const value_type value) noexcept { \
128 value_ = value; \
129 return *this; \
130 } \
131 \
132 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept { \
133 return value_ != _NEFORCE initialize<value_type>(); \
134 } \
135 \
136 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) { \
137 return inner::__int_to_string_dispatch(value); \
138 } \
139 \
140 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { \
141 return inner::__int_to_string_dispatch(value_); \
142 } \
143 \
144 NEFORCE_NODISCARD static constexpr SIGN##integer##BYTE parse(const string_view str) { \
145 return SIGN##integer##BYTE{_NEFORCE to_##SIGN##int##BYTE(str)}; \
146 } \
147 }; \
148 template <> \
149 struct package<SIGN##int##BYTE##_t> { \
150 using type = SIGN##integer##BYTE; \
151 }; \
152 template <> \
153 struct unpackage<SIGN##integer##BYTE> { \
154 using type = SIGN##int##BYTE##_t; \
155 };
156
163__NEFORCE_BUILD_INTEGER_STRUCT(, , 8)
164
165
171__NEFORCE_BUILD_INTEGER_STRUCT(, , 16)
172
179__NEFORCE_BUILD_INTEGER_STRUCT(, , 32)
180
187__NEFORCE_BUILD_INTEGER_STRUCT(, , 64)
188
195__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 8)
196
203__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 16)
204
211__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 32)
212
219__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 64)
220
221#undef __NEFORCE_BUILD_INTEGER_STRUCT
222
230
231
232#ifdef NEFORCE_PLATFORM_LINUX64
233template <>
234struct package<long long> {
235 using type = integer64;
236};
237template <>
238struct package<unsigned long long> {
239 using type = uinteger64;
240};
241#else
242template <>
243struct package<long> {
244 using type = integer32;
245};
246template <>
247struct package<unsigned long> {
248 using type = uinteger32;
249};
250#endif
251
252
259struct float32 : iobject<float32>, ipackage<float32, float32_t> {
260 using value_type = float32_t;
261 using base = ipackage<float32, float32_t>;
262
263 constexpr float32() noexcept = default;
264 NEFORCE_CONSTEXPR20 ~float32() = default;
265
266 constexpr float32(const float32&) noexcept = default;
267 constexpr float32(float32&&) noexcept = default;
268
269 constexpr float32& operator=(const float32& other) noexcept = default;
270 constexpr float32& operator=(float32&& other) noexcept = default;
271
272 explicit constexpr float32(const value_type value) noexcept :
273 base(value) {}
274
275 constexpr float32& operator=(const value_type value) noexcept {
276 value_ = value;
277 return *this;
278 }
279
280 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
281 return value_ != _NEFORCE initialize<value_type>();
282 }
283
284 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
285 return float32(value).to_string();
286 }
287 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
288
289 NEFORCE_NODISCARD static constexpr float32 parse(const string_view str) {
290 return float32{_NEFORCE to_float32(str)};
291 }
292};
293
294template <>
295struct package<float32_t> {
296 using type = float32;
297};
298
299template <>
300struct unpackage<float32> {
301 using type = float32_t;
302};
303
304
311struct float64 : iobject<float64>, ipackage<float64, float64_t> {
312 using value_type = float64_t;
313 using base = ipackage<float64, float64_t>;
314
315 constexpr float64() noexcept = default;
316 NEFORCE_CONSTEXPR20 ~float64() = default;
317
318 constexpr float64(const float64&) noexcept = default;
319 constexpr float64(float64&&) noexcept = default;
320
321 constexpr float64& operator=(const float64& other) noexcept = default;
322 constexpr float64& operator=(float64&& other) noexcept = default;
323
324 explicit constexpr float64(const value_type value) noexcept :
325 base(value) {}
326
327 constexpr float64& operator=(const value_type value) noexcept {
328 value_ = value;
329 return *this;
330 }
331
332 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
333 return value_ != _NEFORCE initialize<value_type>();
334 }
335
336 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
337 return float64(value).to_string();
338 }
339 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
340
341 NEFORCE_NODISCARD static constexpr float64 parse(const string_view str) {
342 return float64{_NEFORCE to_float64(str)};
343 }
344};
345
346template <>
347struct package<float64_t> {
348 using type = float64;
349};
350
351template <>
352struct unpackage<float64> {
353 using type = float64_t;
354};
355
356
363struct decimal : iobject<decimal>, ipackage<decimal, decimal_t> {
364 using value_type = decimal_t;
365 using base = ipackage<decimal, decimal_t>;
366
367 constexpr decimal() noexcept = default;
368 NEFORCE_CONSTEXPR20 ~decimal() = default;
369
370 constexpr decimal(const decimal&) noexcept = default;
371 constexpr decimal(decimal&&) noexcept = default;
372
373 constexpr decimal& operator=(const decimal& other) noexcept = default;
374 constexpr decimal& operator=(decimal&& other) noexcept = default;
375
376 explicit constexpr decimal(const value_type value) noexcept :
377 base(value) {}
378
379 constexpr decimal& operator=(const value_type value) noexcept {
380 value_ = value;
381 return *this;
382 }
383
384 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
385 return value_ != _NEFORCE initialize<value_type>();
386 }
387
388 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
389 return decimal(value).to_string();
390 }
391 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
392
393 NEFORCE_NODISCARD static constexpr decimal parse(const string_view str) {
394 return decimal{_NEFORCE to_decimal(str)};
395 }
396};
397
398template <>
399struct package<decimal_t> {
400 using type = decimal;
401};
402
403template <>
404struct unpackage<decimal> {
405 using type = decimal_t;
406};
407 // Packages
409
410NEFORCE_END_NAMESPACE__
411#endif // NEFORCE_CORE_UTILITY_PACKAGES_HPP__
constexpr basic_string_view trim() const noexcept
去除两侧空白字符
constexpr basic_string & lowercase() noexcept(noexcept(_NEFORCE transform(begin(), end(), begin(), _NEFORCE to_lowercase< CharT >)))
转换为小写
constexpr view_type view() const noexcept
获取字符串视图
字符串格式化功能
float float32_t
32位单精度浮点数类型
long double decimal_t
扩展精度浮点数类型
double float64_t
64位双精度浮点数类型
uinteger8 byte
字节包装类
constexpr decimal_t to_decimal(const string_view sv, size_t *idx=nullptr)
将字符串转换为decimal浮点数
constexpr float64_t to_float64(const string_view sv, size_t *idx=nullptr)
将字符串转换为64位浮点数
constexpr int32_t to_int32(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为32位有符号整数
constexpr float32_t to_float32(const string_view sv, size_t *idx=nullptr)
将字符串转换为32位浮点数
basic_string_view< char > string_view
字符字符串视图
constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
可解析对象接口
布尔值包装类
constexpr string to_string() const
将当前对象转换为字符串
constexpr boolean operator!() const noexcept
逻辑非操作符
static constexpr boolean parse(const string_view lower)
从字符串解析布尔值
static constexpr string to_string(const value_type value)
将布尔值转换为字符串
长双精度浮点数包装类
32位浮点数包装类
64位浮点数包装类
64位整数包装类
可解析对象接口
constexpr package_type value() const noexcept
constexpr string to_string() const
类型包装器模板
类型转换异常
无符号8位整数包装类
类型解包器模板
字符串到数值的转换函数