1#ifndef NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
2#define NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
13NEFORCE_BEGIN_NAMESPACE__
22NEFORCE_BEGIN_CONSTANTS__
30NEFORCE_INLINE17
constexpr uint64_t BLANK_MASK = (1ULL << 9) |
39NEFORCE_INLINE17
constexpr uint64_t SPACE_MASK = BLANK_MASK | (1ULL << 10) |
50NEFORCE_INLINE17
constexpr uint64_t PUNCT_MASK_LOW =
51 (1ULL << 33) | (1ULL << 34) | (1ULL << 35) | (1ULL << 36) |
52 (1ULL << 37) | (1ULL << 38) | (1ULL << 39) | (1ULL << 40) |
53 (1ULL << 41) | (1ULL << 42) | (1ULL << 43) | (1ULL << 44) |
54 (1ULL << 45) | (1ULL << 46) | (1ULL << 47) | (1ULL << 58) |
55 (1ULL << 59) | (1ULL << 60) | (1ULL << 61) | (1ULL << 62) |
64NEFORCE_INLINE17
constexpr uint64_t PUNCT_MASK_HIGH =
65 (1ULL << (64 - 64)) | (1ULL << (65 - 64)) | (1ULL << (91 - 64)) |
66 (1ULL << (92 - 64)) | (1ULL << (93 - 64)) | (1ULL << (94 - 64)) |
68 (1ULL << (96 - 64)) | (1ULL << (123 - 64)) | (1ULL << (124 - 64)) |
69 (1ULL << (125 - 64)) |
78NEFORCE_INLINE17
constexpr uint64_t CNTRL_MASK_LOW =
79 (1ULL << 0) | (1ULL << 1) | (1ULL << 2) | (1ULL << 3) |
80 (1ULL << 4) | (1ULL << 5) | (1ULL << 6) | (1ULL << 7) |
81 (1ULL << 8) | (1ULL << 9) | (1ULL << 10) | (1ULL << 11) |
82 (1ULL << 12) | (1ULL << 13) | (1ULL << 14) | (1ULL << 15) |
83 (1ULL << 16) | (1ULL << 17) | (1ULL << 18) | (1ULL << 19) |
84 (1ULL << 20) | (1ULL << 21) | (1ULL << 22) | (1ULL << 23) |
85 (1ULL << 24) | (1ULL << 25) | (1ULL << 26) | (1ULL << 27) |
86 (1ULL << 28) | (1ULL << 29) | (1ULL << 30) | (1ULL << 31);
94NEFORCE_INLINE17
constexpr uint64_t CNTRL_MASK_HIGH = (1ULL << (127 - 64));
96NEFORCE_END_CONSTANTS__
110template <
typename CharT>
118 return (mask_low & (1ULL << uc)) != 0;
120 const auto offset = uc - 64;
121 return (mask_high & (1ULL << offset)) != 0;
130template <
typename CharT>
131NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_punct(
const CharT c)
noexcept {
132 return _NEFORCE
is_ctype(c, constants::PUNCT_MASK_LOW, constants::PUNCT_MASK_HIGH);
143template <
typename CharT>
144NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_cntrl(
const CharT c)
noexcept {
145 return _NEFORCE
is_ctype(c, constants::CNTRL_MASK_LOW, constants::CNTRL_MASK_HIGH);
156template <
typename CharT>
157NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_print(
const CharT c)
noexcept {
159 return uc <= 127 && !_NEFORCE
is_cntrl(c);
170template <
typename CharT>
171NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_blank(
const CharT c)
noexcept {
174 return uc < 64 && (constants::BLANK_MASK & (1ULL << uc)) != 0;
185template <
typename CharT>
186NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_graph(
const CharT c)
noexcept {
198template <
typename CharT>
199NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14
bool is_ascii(
const CharT c)
noexcept {
213template <
typename CharT>
214NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14
bool is_space(
const CharT c)
noexcept {
217 return uc < 64 && (constants::SPACE_MASK & (1ULL << uc)) != 0;
228template <
typename CharT>
229NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14
bool is_alpha(
const CharT c)
noexcept {
235 return (uc & 0xDF) >=
'A' && (uc & 0xDF) <=
'Z';
246template <
typename CharT>
247NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14
bool is_digit(
const CharT c)
noexcept {
253 return (uc & 0xF0) == 0x30 && (uc & 0x0F) <= 9;
264template <
typename CharT>
265NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14
bool is_xdigit(
const CharT c)
noexcept {
271 const bool is_09 = (uc & 0xF0) == 0x30 && (uc & 0x0F) <= 0x09;
272 const bool is_AF = (uc & 0xF0) == 0x40 && (uc & 0x0F) >= 0x01 && (uc & 0x0F) <= 0x06;
273 const bool is_af = (uc & 0xF0) == 0x60 && (uc & 0x0F) >= 0x01 && (uc & 0x0F) <= 0x06;
274 return is_09 || is_AF || is_af;
283template <
typename CharT>
294template <
typename CharT>
301NEFORCE_END_NAMESPACE__
NEFORCE_INLINE17 constexpr bool is_character_v
is_character的便捷变量模板
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_ctype(const CharT c, uint64_t mask_low, uint64_t mask_high) noexcept
通用字符类型检查函数
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_xdigit(const CharT c) noexcept
检查字符是否为十六进制数字
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit_or_alpha(const CharT c) noexcept
检查字符是否为数字或字母
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit(const CharT c) noexcept
检查字符是否为数字
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_cntrl(const CharT c) noexcept
检查字符是否为控制字符
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha_or_digit(const CharT c) noexcept
检查字符是否为字母或数字
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_punct(const CharT c) noexcept
检查字符是否为标点符号
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_blank(const CharT c) noexcept
检查字符是否为空白字符
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha(const CharT c) noexcept
检查字符是否为字母
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_ascii(const CharT c) noexcept
检查字符是否为ASCII字符
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_print(const CharT c) noexcept
检查字符是否为可打印字符
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_graph(const CharT c) noexcept
检查字符是否为图形字符
NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_space(const CharT c) noexcept
检查字符是否为空白字符
unsigned long long uint64_t
64位无符号整数类型
typename make_unsigned< T >::type make_unsigned_t
make_unsigned的便捷别名