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
223#ifdef NEFORCE_PLATFORM_LINUX64
224template <>
225struct package<long long> {
226 using type = integer64;
227};
228template <>
229struct package<unsigned long long> {
230 using type = uinteger64;
231};
232#else
233template <>
234struct package<long> {
235 using type = integer32;
236};
237template <>
238struct package<unsigned long> {
239 using type = uinteger32;
240};
241#endif
242
243
250struct float32 : iobject<float32>, ipackage<float32, float32_t> {
251 using value_type = float32_t;
252 using base = ipackage<float32, float32_t>;
253
254 constexpr float32() noexcept = default;
255 NEFORCE_CONSTEXPR20 ~float32() = default;
256
257 constexpr float32(const float32&) noexcept = default;
258 constexpr float32(float32&&) noexcept = default;
259
260 constexpr float32& operator=(const float32& other) noexcept = default;
261 constexpr float32& operator=(float32&& other) noexcept = default;
262
263 explicit constexpr float32(const value_type value) noexcept :
264 base(value) {}
265
266 constexpr float32& operator=(const value_type value) noexcept {
267 value_ = value;
268 return *this;
269 }
270
271 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
272 return value_ != _NEFORCE initialize<value_type>();
273 }
274
275 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
276 return float32(value).to_string();
277 }
278 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
279
280 NEFORCE_NODISCARD static constexpr float32 parse(const string_view str) {
281 return float32{_NEFORCE to_float32(str)};
282 }
283};
284
285template <>
286struct package<float32_t> {
287 using type = float32;
288};
289
290template <>
291struct unpackage<float32> {
292 using type = float32_t;
293};
294
295
302struct float64 : iobject<float64>, ipackage<float64, float64_t> {
303 using value_type = float64_t;
304 using base = ipackage<float64, float64_t>;
305
306 constexpr float64() noexcept = default;
307 NEFORCE_CONSTEXPR20 ~float64() = default;
308
309 constexpr float64(const float64&) noexcept = default;
310 constexpr float64(float64&&) noexcept = default;
311
312 constexpr float64& operator=(const float64& other) noexcept = default;
313 constexpr float64& operator=(float64&& other) noexcept = default;
314
315 explicit constexpr float64(const value_type value) noexcept :
316 base(value) {}
317
318 constexpr float64& operator=(const value_type value) noexcept {
319 value_ = value;
320 return *this;
321 }
322
323 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
324 return value_ != _NEFORCE initialize<value_type>();
325 }
326
327 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
328 return float64(value).to_string();
329 }
330 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
331
332 NEFORCE_NODISCARD static constexpr float64 parse(const string_view str) {
333 return float64{_NEFORCE to_float64(str)};
334 }
335};
336
337template <>
338struct package<float64_t> {
339 using type = float64;
340};
341
342template <>
343struct unpackage<float64> {
344 using type = float64_t;
345};
346
347
354struct decimal : iobject<decimal>, ipackage<decimal, decimal_t> {
355 using value_type = decimal_t;
356 using base = ipackage<decimal, decimal_t>;
357
358 constexpr decimal() noexcept = default;
359 NEFORCE_CONSTEXPR20 ~decimal() = default;
360
361 constexpr decimal(const decimal&) noexcept = default;
362 constexpr decimal(decimal&&) noexcept = default;
363
364 constexpr decimal& operator=(const decimal& other) noexcept = default;
365 constexpr decimal& operator=(decimal&& other) noexcept = default;
366
367 explicit constexpr decimal(const value_type value) noexcept :
368 base(value) {}
369
370 constexpr decimal& operator=(const value_type value) noexcept {
371 value_ = value;
372 return *this;
373 }
374
375 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept {
376 return value_ != _NEFORCE initialize<value_type>();
377 }
378
379 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) {
380 return decimal(value).to_string();
381 }
382 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { return inner::__float_to_string<char>(value_); }
383
384 NEFORCE_NODISCARD static constexpr decimal parse(const string_view str) {
385 return decimal{_NEFORCE to_decimal(str)};
386 }
387};
388
389template <>
390struct package<decimal_t> {
391 using type = decimal;
392};
393
394template <>
395struct unpackage<decimal> {
396 using type = decimal_t;
397};
398 // Packages
400
401NEFORCE_END_NAMESPACE__
402#endif // NEFORCE_CORE_UTILITY_PACKAGES_HPP__
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 basic_string_view trim() const noexcept
去除两侧空白字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 view_type view() const noexcept
获取字符串视图
NEFORCE_CONSTEXPR20 basic_string & lowercase() noexcept(noexcept(_NEFORCE transform(begin(), end(), begin(), _NEFORCE to_lowercase< CharT >)))
转换为小写
字符串格式化功能
float float32_t
32位单精度浮点数类型
long double decimal_t
扩展精度浮点数类型
double float64_t
64位双精度浮点数类型
NEFORCE_NODISCARD constexpr decimal_t to_decimal(const string_view sv, size_t *idx=nullptr)
将字符串转换为decimal浮点数
NEFORCE_NODISCARD constexpr float64_t to_float64(const string_view sv, size_t *idx=nullptr)
将字符串转换为64位浮点数
NEFORCE_NODISCARD constexpr float32_t to_float32(const string_view sv, size_t *idx=nullptr)
将字符串转换为32位浮点数
NEFORCE_NODISCARD constexpr int32_t to_int32(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为32位有符号整数
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
可解析对象接口
布尔值包装类
static NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 boolean parse(const string_view lower)
从字符串解析布尔值
constexpr boolean operator!() const noexcept
逻辑非操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const
将当前对象转换为字符串
static NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string(const value_type value)
将布尔值转换为字符串
长双精度浮点数包装类
32位浮点数包装类
64位浮点数包装类
64位整数包装类
可解析对象接口
NEFORCE_NODISCARD constexpr package_type value() const noexcept
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const
类型包装器模板
类型转换异常
无符号64位整数包装类
类型解包器模板
字符串到数值的转换函数