1#ifndef NEFORCE_CORE_UTILITY_PACKAGES_HPP__
2#define NEFORCE_CORE_UTILITY_PACKAGES_HPP__
16NEFORCE_BEGIN_NAMESPACE__
30struct boolean : ipackage<boolean, bool>,
iobject<boolean> {
31 using value_type = bool;
32 using base = ipackage;
34 constexpr boolean()
noexcept =
default;
35 NEFORCE_CONSTEXPR20 ~boolean() =
default;
37 constexpr boolean(
const boolean&)
noexcept =
default;
38 constexpr boolean(
boolean&&)
noexcept =
default;
40 constexpr boolean& operator=(
const boolean& other)
noexcept =
default;
41 constexpr boolean& operator=(
boolean&& other)
noexcept =
default;
43 explicit constexpr boolean(
const value_type
value) noexcept :
46 constexpr boolean& operator=(
const value_type
value)
noexcept {
56 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
57 return boolean(
value).to_string();
64 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return value_ ?
"true" :
"false"; }
77 string str(lower.
trim());
80 if (str ==
"true" || str ==
"yes" || str ==
"y") {
82 }
else if (str ==
"false" || str ==
"no" || str ==
"n") {
85 obj =
static_cast<bool>(
to_int32(str.
view(),
nullptr, 10));
101struct package<bool> {
102 using type = boolean;
106struct unpackage<boolean> {
111#define __NEFORCE_BUILD_INTEGER_STRUCT(SIGN, UPPER, BYTE) \
112 struct SIGN##integer##BYTE : iobject<SIGN##integer##BYTE>, ipackage<SIGN##integer##BYTE, SIGN##int##BYTE##_t> { \
113 using value_type = SIGN##int##BYTE##_t; \
114 using base = ipackage<SIGN##integer##BYTE, SIGN##int##BYTE##_t>; \
116 constexpr SIGN##integer##BYTE() noexcept = default; \
117 NEFORCE_CONSTEXPR20 ~SIGN##integer##BYTE() = default; \
119 constexpr SIGN##integer##BYTE(const SIGN##integer##BYTE&) noexcept = default; \
120 constexpr SIGN##integer##BYTE(SIGN##integer##BYTE&&) noexcept = default; \
122 constexpr SIGN##integer##BYTE& operator=(const SIGN##integer##BYTE& other) noexcept = default; \
123 constexpr SIGN##integer##BYTE& operator=(SIGN##integer##BYTE&& other) noexcept = default; \
125 explicit constexpr SIGN##integer##BYTE(const value_type value) noexcept : \
128 constexpr SIGN##integer##BYTE& operator=(const value_type value) noexcept { \
133 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept { \
134 return value_ != _NEFORCE initialize<value_type>(); \
137 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) { \
138 return inner::__int_to_string_dispatch(value); \
141 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { \
142 return inner::__int_to_string_dispatch(value_); \
145 NEFORCE_NODISCARD static constexpr SIGN##integer##BYTE parse(const string_view str) { \
146 return SIGN##integer##BYTE{_NEFORCE to_##SIGN##int##BYTE(str)}; \
150 struct package<SIGN##int##BYTE##_t> { \
151 using type = SIGN##integer##BYTE; \
154 struct unpackage<SIGN##integer##BYTE> { \
155 using type = SIGN##int##BYTE##_t; \
164__NEFORCE_BUILD_INTEGER_STRUCT(, , 8)
172__NEFORCE_BUILD_INTEGER_STRUCT(, , 16)
180__NEFORCE_BUILD_INTEGER_STRUCT(, , 32)
188__NEFORCE_BUILD_INTEGER_STRUCT(, , 64)
196__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 8)
204__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 16)
212__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 32)
220__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 64)
222#undef __NEFORCE_BUILD_INTEGER_STRUCT
233#ifdef NEFORCE_PLATFORM_LINUX64
239struct package<unsigned long long> {
240 using type = uinteger64;
244struct package<long> {
245 using type = integer32;
248struct package<unsigned long> {
249 using type = uinteger32;
260struct uinteger128 :
iobject<uinteger128>, ipackage<uinteger128, uint128_t> {
262 using base = ipackage<uinteger128, uint128_t>;
264 constexpr uinteger128()
noexcept =
default;
265 NEFORCE_CONSTEXPR20 ~uinteger128() =
default;
267 constexpr uinteger128(
const uinteger128&)
noexcept =
default;
268 constexpr uinteger128(uinteger128&&)
noexcept =
default;
270 constexpr uinteger128& operator=(
const uinteger128& other)
noexcept =
default;
271 constexpr uinteger128& operator=(uinteger128&& other)
noexcept =
default;
296 explicit NEFORCE_CONSTEXPR20
uinteger128(
const string& str,
const int base = 10) :
297 uinteger128(str.view(), base) {}
307 NEFORCE_NODISCARD
constexpr explicit operator bool() const noexcept {
return value_ != value_type(); }
314 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
315 return inner::__int_to_string_dispatch(
value);
322 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__int_to_string_dispatch(
value_); }
361struct integer128 :
iobject<integer128>, ipackage<integer128, int128_t> {
363 using base = ipackage<integer128, int128_t>;
365 constexpr integer128()
noexcept =
default;
366 NEFORCE_CONSTEXPR20 ~integer128() =
default;
368 constexpr integer128(
const integer128&)
noexcept =
default;
369 constexpr integer128(integer128&&)
noexcept =
default;
371 constexpr integer128& operator=(
const integer128& other)
noexcept =
default;
372 constexpr integer128& operator=(integer128&& other)
noexcept =
default;
397 explicit NEFORCE_CONSTEXPR20
integer128(
const string& str,
const int base = 10) :
398 integer128(str.view(), base) {}
408 NEFORCE_NODISCARD
constexpr explicit operator bool() const noexcept {
return value_ != value_type(); }
415 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
416 return inner::__int_to_string_dispatch(
value);
423 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__int_to_string_dispatch(
value_); }
432 return integer128{_NEFORCE
to_int128(str)};
441 ignore =
value_ <<= shift;
451 ignore =
value_ >>= shift;
456constexpr uinteger128::uinteger128(
const string_view str,
const int base) {
457 *
this = uinteger128{
to_uint128(str,
nullptr, base)};
460constexpr integer128::integer128(
const string_view str,
const int base) {
461 *
this = integer128{
to_int128(str,
nullptr, base)};
470struct unpackage<uinteger128> {
471 using type = uint128_t;
475struct package<int128_t> {
476 using type = integer128;
480struct unpackage<integer128> {
481 using type = int128_t;
491struct float32 :
iobject<float32>, ipackage<float32, float32_t> {
493 using base = ipackage<float32, float32_t>;
495 constexpr float32()
noexcept =
default;
496 NEFORCE_CONSTEXPR20 ~float32() =
default;
498 constexpr float32(
const float32&)
noexcept =
default;
499 constexpr float32(float32&&)
noexcept =
default;
501 constexpr float32& operator=(
const float32& other)
noexcept =
default;
502 constexpr float32& operator=(float32&& other)
noexcept =
default;
504 explicit constexpr float32(
const value_type
value) noexcept :
507 constexpr float32& operator=(
const value_type
value)
noexcept {
512 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
516 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
517 return float32(
value).to_string();
519 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
521 NEFORCE_NODISCARD
static constexpr float32 parse(
const string_view str) {
532struct unpackage<float32> {
533 using type = float32_t;
543struct float64 :
iobject<float64>, ipackage<float64, float64_t> {
545 using base = ipackage<float64, float64_t>;
547 constexpr float64()
noexcept =
default;
548 NEFORCE_CONSTEXPR20 ~float64() =
default;
550 constexpr float64(
const float64&)
noexcept =
default;
551 constexpr float64(float64&&)
noexcept =
default;
553 constexpr float64& operator=(
const float64& other)
noexcept =
default;
554 constexpr float64& operator=(float64&& other)
noexcept =
default;
556 explicit constexpr float64(
const value_type
value) noexcept :
559 constexpr float64& operator=(
const value_type
value)
noexcept {
564 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
568 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
569 return float64(
value).to_string();
571 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
573 NEFORCE_NODISCARD
static constexpr float64 parse(
const string_view str) {
584struct unpackage<float64> {
585 using type = float64_t;
595struct decimal :
iobject<decimal>, ipackage<decimal, decimal_t> {
597 using base = ipackage<decimal, decimal_t>;
599 constexpr decimal()
noexcept =
default;
600 NEFORCE_CONSTEXPR20 ~decimal() =
default;
602 constexpr decimal(
const decimal&)
noexcept =
default;
603 constexpr decimal(decimal&&)
noexcept =
default;
605 constexpr decimal& operator=(
const decimal& other)
noexcept =
default;
606 constexpr decimal& operator=(decimal&& other)
noexcept =
default;
608 explicit constexpr decimal(
const value_type
value) noexcept :
611 constexpr decimal& operator=(
const value_type
value)
noexcept {
616 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
620 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
621 return decimal(
value).to_string();
623 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
625 NEFORCE_NODISCARD
static constexpr decimal parse(
const string_view str) {
636struct unpackage<decimal> {
637 using type = decimal_t;
642NEFORCE_END_NAMESPACE__
constexpr basic_string_view trim() const noexcept
去除两侧空白字符
constexpr view_type view() const noexcept
获取字符串视图
constexpr basic_string & lowercase() noexcept(noexcept(_NEFORCE transform(begin(), end(), begin(), _NEFORCE to_lowercase< CharT >)))
转换为小写
float float32_t
32位单精度浮点数类型
unsigned int uint32_t
32位无符号整数类型
long double decimal_t
扩展精度浮点数类型
double float64_t
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位浮点数
constexpr float64_t to_float64(const string_view sv, size_t *idx=nullptr)
将字符串转换为64位浮点数
constexpr int128_t to_int128(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为128位有符号整数
constexpr uint128_t to_uint128(const string_view sv, size_t *idx=nullptr, const int base=10)
将字符串转换为128位无符号整数
constexpr decimal_t to_decimal(const string_view sv, size_t *idx=nullptr)
将字符串转换为decimal浮点数
basic_string_view< char > string_view
字符字符串视图
constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
static constexpr boolean parse(const string_view lower)
从字符串解析布尔值
constexpr boolean operator!() const noexcept
逻辑非操作符
static constexpr string to_string(const value_type value)
将布尔值转换为字符串
constexpr string to_string() const
将当前对象转换为字符串
constexpr integer128(const value_type value) noexcept
从基础类型构造
constexpr integer128 & operator=(const value_type value) noexcept
从基础类型赋值
constexpr integer128 & operator<<=(const uint32_t shift) noexcept
重写左移赋值以支持128位移位
static constexpr integer128 parse(const string_view str)
从字符串解析
constexpr integer128(const string &str, const int base=10)
从字符串构造
static constexpr string to_string(const value_type value)
将基础类型值转换为字符串
constexpr integer128 & operator>>=(const uint32_t shift) noexcept
重写右移赋值以支持128位移位(算术右移)
constexpr string to_string() const
将当前对象转换为字符串
constexpr package_type value() const noexcept
constexpr uinteger128 & operator>>=(const uint32_t shift) noexcept
重写右移赋值以支持128位移位
constexpr uinteger128(const value_type value) noexcept
从基础类型构造
constexpr string to_string() const
将当前对象转换为字符串
static constexpr uinteger128 parse(const string_view str)
从字符串解析
constexpr uinteger128(const string &str, const int base=10)
从字符串构造
static constexpr string to_string(const value_type value)
将基础类型值转换为字符串
constexpr uinteger128 & operator<<=(const uint32_t shift) noexcept
重写左移赋值以支持128位移位
constexpr uinteger128 & operator=(const value_type value) noexcept
从基础类型赋值