NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
char_types.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
2#define NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
22NEFORCE_BEGIN_CONSTANTS__
23
30NEFORCE_INLINE17 constexpr uint64_t BLANK_MASK = (1ULL << 9) | // \t
31 (1ULL << 32); // space
32
39NEFORCE_INLINE17 constexpr uint64_t SPACE_MASK = BLANK_MASK | (1ULL << 10) | // \n
40 (1ULL << 11) | // \v
41 (1ULL << 12) | // \f
42 (1ULL << 13); // \r
43
50NEFORCE_INLINE17 constexpr uint64_t PUNCT_MASK_LOW =
51 (1ULL << 33) | (1ULL << 34) | (1ULL << 35) | (1ULL << 36) | // !"#$ (33~36 < 64)
52 (1ULL << 37) | (1ULL << 38) | (1ULL << 39) | (1ULL << 40) | // %&'() (37~40 < 64)
53 (1ULL << 41) | (1ULL << 42) | (1ULL << 43) | (1ULL << 44) | // *+,- (41~44 < 64)
54 (1ULL << 45) | (1ULL << 46) | (1ULL << 47) | (1ULL << 58) | // ./: (45~47,58 < 64)
55 (1ULL << 59) | (1ULL << 60) | (1ULL << 61) | (1ULL << 62) | // ;<=> (59~62 < 64)
56 (1ULL << 63); // ?
57
64NEFORCE_INLINE17 constexpr uint64_t PUNCT_MASK_HIGH =
65 (1ULL << (64 - 64)) | (1ULL << (65 - 64)) | (1ULL << (91 - 64)) | // @(64)、A(65)、[(91)
66 (1ULL << (92 - 64)) | (1ULL << (93 - 64)) | (1ULL << (94 - 64)) |
67 (1ULL << (95 - 64)) | // \\‍(92)、](93)、^(94)、_(95)
68 (1ULL << (96 - 64)) | (1ULL << (123 - 64)) | (1ULL << (124 - 64)) |
69 (1ULL << (125 - 64)) | // `(96)、{(123)、|(124)、}(125)
70 (1ULL << (126 - 64)); // ~(126)
71
78NEFORCE_INLINE17 constexpr uint64_t CNTRL_MASK_LOW =
79 (1ULL << 0) | (1ULL << 1) | (1ULL << 2) | (1ULL << 3) | // 0-3 (0~3 < 64)
80 (1ULL << 4) | (1ULL << 5) | (1ULL << 6) | (1ULL << 7) | // 4-7 (4~7 < 64)
81 (1ULL << 8) | (1ULL << 9) | (1ULL << 10) | (1ULL << 11) | // 8-11 (8~11 < 64)
82 (1ULL << 12) | (1ULL << 13) | (1ULL << 14) | (1ULL << 15) | // 12-15 (12~15 < 64)
83 (1ULL << 16) | (1ULL << 17) | (1ULL << 18) | (1ULL << 19) | // 16-19 (16~19 < 64)
84 (1ULL << 20) | (1ULL << 21) | (1ULL << 22) | (1ULL << 23) | // 20-23 (20~23 < 64)
85 (1ULL << 24) | (1ULL << 25) | (1ULL << 26) | (1ULL << 27) | // 24-27 (24~27 < 64)
86 (1ULL << 28) | (1ULL << 29) | (1ULL << 30) | (1ULL << 31); // 30-31 (30~31 < 64)
87
94NEFORCE_INLINE17 constexpr uint64_t CNTRL_MASK_HIGH = (1ULL << (127 - 64)); // DEL(127)
95
96NEFORCE_END_CONSTANTS__
98
99
110template <typename CharT>
111NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_ctype(const CharT c, uint64_t mask_low, uint64_t mask_high) noexcept {
112 static_assert(is_character_v<CharT>, "character required");
113 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
114 if (uc > 127) {
115 return false;
116 }
117 if (uc <= 63) {
118 return (mask_low & (1ULL << uc)) != 0;
119 }
120 const auto offset = uc - 64;
121 return (mask_high & (1ULL << offset)) != 0;
122}
123
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);
133}
134
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);
146}
147
156template <typename CharT>
157NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_print(const CharT c) noexcept {
158 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
159 return uc <= 127 && !_NEFORCE is_cntrl(c);
160}
161
170template <typename CharT>
171NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_blank(const CharT c) noexcept {
172 static_assert(is_character_v<CharT>, "character required");
173 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
174 return uc < 64 && (constants::BLANK_MASK & (1ULL << uc)) != 0;
175}
176
185template <typename CharT>
186NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_graph(const CharT c) noexcept {
187 return _NEFORCE is_print(c) && !_NEFORCE is_blank(c);
188}
189
198template <typename CharT>
199NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_ascii(const CharT c) noexcept {
200 static_assert(is_character_v<CharT>, "character required");
201 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
202 return uc <= 127;
203}
204
213template <typename CharT>
214NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_space(const CharT c) noexcept {
215 static_assert(is_character_v<CharT>, "character required");
216 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
217 return uc < 64 && (constants::SPACE_MASK & (1ULL << uc)) != 0;
218}
219
228template <typename CharT>
229NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha(const CharT c) noexcept {
230 static_assert(is_character_v<CharT>, "character required");
231 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
232 if (uc > 127) {
233 return false;
234 }
235 return (uc & 0xDF) >= 'A' && (uc & 0xDF) <= 'Z';
236}
237
246template <typename CharT>
247NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit(const CharT c) noexcept {
248 static_assert(is_character_v<CharT>, "character required");
249 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
250 if (uc > 127) {
251 return false;
252 }
253 return (uc & 0xF0) == 0x30 && (uc & 0x0F) <= 9;
254}
255
264template <typename CharT>
265NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_xdigit(const CharT c) noexcept {
266 static_assert(is_character_v<CharT>, "character required");
267 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
268 if (uc > 127) {
269 return false;
270 }
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;
275}
276
283template <typename CharT>
284NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha_or_digit(const CharT c) noexcept {
285 return _NEFORCE is_alpha(c) || _NEFORCE is_digit(c);
286}
287
294template <typename CharT>
295NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit_or_alpha(const CharT c) noexcept {
296 return _NEFORCE is_digit(c) || _NEFORCE is_alpha(c);
297}
298 // CharTypeChecking
300
301NEFORCE_END_NAMESPACE__
302#endif // NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
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的便捷别名
类型萃取