1#ifndef NEFORCE_CORE_UTILITY_PACKAGES_HPP__
2#define NEFORCE_CORE_UTILITY_PACKAGES_HPP__
15NEFORCE_BEGIN_NAMESPACE__
29struct boolean : ipackage<boolean, bool>,
iobject<boolean> {
30 using value_type = bool;
31 using base = ipackage;
33 constexpr boolean()
noexcept =
default;
34 NEFORCE_CONSTEXPR20 ~boolean() =
default;
36 constexpr boolean(
const boolean&)
noexcept =
default;
37 constexpr boolean(
boolean&&)
noexcept =
default;
39 constexpr boolean& operator=(
const boolean& other)
noexcept =
default;
40 constexpr boolean& operator=(
boolean&& other)
noexcept =
default;
42 explicit constexpr boolean(
const value_type
value) noexcept :
45 constexpr boolean& operator=(
const value_type
value)
noexcept {
55 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
56 return boolean(
value).to_string();
63 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return value_ ?
"true" :
"false"; }
76 string str(lower.
trim());
79 if (str ==
"true" || str ==
"yes" || str ==
"y") {
81 }
else if (str ==
"false" || str ==
"no" || str ==
"n") {
84 obj =
static_cast<bool>(
to_int32(str.
view(),
nullptr, 10));
101 using type = boolean;
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>; \
115 constexpr SIGN##integer##BYTE() noexcept = default; \
116 NEFORCE_CONSTEXPR20 ~SIGN##integer##BYTE() = default; \
118 constexpr SIGN##integer##BYTE(const SIGN##integer##BYTE&) noexcept = default; \
119 constexpr SIGN##integer##BYTE(SIGN##integer##BYTE&&) noexcept = default; \
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; \
124 explicit constexpr SIGN##integer##BYTE(const value_type value) noexcept : \
127 constexpr SIGN##integer##BYTE& operator=(const value_type value) noexcept { \
132 NEFORCE_NODISCARD constexpr explicit operator bool() const noexcept { \
133 return value_ != _NEFORCE initialize<value_type>(); \
136 NEFORCE_NODISCARD static NEFORCE_CONSTEXPR20 string to_string(const value_type value) { \
137 return inner::__int_to_string_dispatch(value); \
140 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const { \
141 return inner::__int_to_string_dispatch(value_); \
144 NEFORCE_NODISCARD static constexpr SIGN##integer##BYTE parse(const string_view str) { \
145 return SIGN##integer##BYTE{_NEFORCE to_##SIGN##int##BYTE(str)}; \
149 struct package<SIGN##int##BYTE##_t> { \
150 using type = SIGN##integer##BYTE; \
153 struct unpackage<SIGN##integer##BYTE> { \
154 using type = SIGN##int##BYTE##_t; \
163__NEFORCE_BUILD_INTEGER_STRUCT(, , 8)
171__NEFORCE_BUILD_INTEGER_STRUCT(, , 16)
179__NEFORCE_BUILD_INTEGER_STRUCT(, , 32)
187__NEFORCE_BUILD_INTEGER_STRUCT(, , 64)
195__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 8)
203__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 16)
211__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 32)
219__NEFORCE_BUILD_INTEGER_STRUCT(u, U, 64)
221#undef __NEFORCE_BUILD_INTEGER_STRUCT
223#ifdef NEFORCE_PLATFORM_LINUX64
229struct package<unsigned long long> {
235 using type = integer32;
239 using type = uinteger32;
250struct float32 :
iobject<float32>, ipackage<float32, float32_t> {
252 using base = ipackage<float32, float32_t>;
254 constexpr float32()
noexcept =
default;
255 NEFORCE_CONSTEXPR20 ~float32() =
default;
257 constexpr float32(
const float32&)
noexcept =
default;
258 constexpr float32(float32&&)
noexcept =
default;
260 constexpr float32& operator=(
const float32& other)
noexcept =
default;
261 constexpr float32& operator=(float32&& other)
noexcept =
default;
263 explicit constexpr float32(
const value_type
value) noexcept :
266 constexpr float32& operator=(
const value_type
value)
noexcept {
271 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
275 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
276 return float32(
value).to_string();
278 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
280 NEFORCE_NODISCARD
static constexpr float32 parse(
const string_view str) {
302struct float64 :
iobject<float64>, ipackage<float64, float64_t> {
304 using base = ipackage<float64, float64_t>;
306 constexpr float64()
noexcept =
default;
307 NEFORCE_CONSTEXPR20 ~float64() =
default;
309 constexpr float64(
const float64&)
noexcept =
default;
310 constexpr float64(float64&&)
noexcept =
default;
312 constexpr float64& operator=(
const float64& other)
noexcept =
default;
313 constexpr float64& operator=(float64&& other)
noexcept =
default;
315 explicit constexpr float64(
const value_type
value) noexcept :
318 constexpr float64& operator=(
const value_type
value)
noexcept {
323 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
327 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
328 return float64(
value).to_string();
330 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
332 NEFORCE_NODISCARD
static constexpr float64 parse(
const string_view str) {
354struct decimal :
iobject<decimal>, ipackage<decimal, decimal_t> {
356 using base = ipackage<decimal, decimal_t>;
358 constexpr decimal()
noexcept =
default;
359 NEFORCE_CONSTEXPR20 ~decimal() =
default;
361 constexpr decimal(
const decimal&)
noexcept =
default;
362 constexpr decimal(decimal&&)
noexcept =
default;
364 constexpr decimal& operator=(
const decimal& other)
noexcept =
default;
365 constexpr decimal& operator=(decimal&& other)
noexcept =
default;
367 explicit constexpr decimal(
const value_type
value) noexcept :
370 constexpr decimal& operator=(
const value_type
value)
noexcept {
375 NEFORCE_NODISCARD
constexpr explicit operator bool()
const noexcept {
379 NEFORCE_NODISCARD
static NEFORCE_CONSTEXPR20
string to_string(
const value_type
value) {
380 return decimal(
value).to_string();
382 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return inner::__float_to_string<char>(
value_); }
384 NEFORCE_NODISCARD
static constexpr decimal parse(
const string_view str) {
401NEFORCE_END_NAMESPACE__
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)
将布尔值转换为字符串
NEFORCE_NODISCARD constexpr package_type value() const noexcept
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const