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 = (1ULL << (64 - 64)) | // @(64)
65 (1ULL << (91 - 64)) | // [(91)
66 (1ULL << (92 - 64)) | // \‍(92)
67 (1ULL << (93 - 64)) | // ](93)
68 (1ULL << (94 - 64)) | // ^(94)
69 (1ULL << (95 - 64)) | // _(95)
70 (1ULL << (96 - 64)) | // `(96)
71 (1ULL << (123 - 64)) | // {(123)
72 (1ULL << (124 - 64)) | // |(124)
73 (1ULL << (125 - 64)) | // }(125)
74 (1ULL << (126 - 64)); // ~(126)
75
82NEFORCE_INLINE17 constexpr uint64_t CNTRL_MASK_LOW =
83 (1ULL << 0) | (1ULL << 1) | (1ULL << 2) | (1ULL << 3) | // 0-3 (0~3 < 64)
84 (1ULL << 4) | (1ULL << 5) | (1ULL << 6) | (1ULL << 7) | // 4-7 (4~7 < 64)
85 (1ULL << 8) | (1ULL << 9) | (1ULL << 10) | (1ULL << 11) | // 8-11 (8~11 < 64)
86 (1ULL << 12) | (1ULL << 13) | (1ULL << 14) | (1ULL << 15) | // 12-15 (12~15 < 64)
87 (1ULL << 16) | (1ULL << 17) | (1ULL << 18) | (1ULL << 19) | // 16-19 (16~19 < 64)
88 (1ULL << 20) | (1ULL << 21) | (1ULL << 22) | (1ULL << 23) | // 20-23 (20~23 < 64)
89 (1ULL << 24) | (1ULL << 25) | (1ULL << 26) | (1ULL << 27) | // 24-27 (24~27 < 64)
90 (1ULL << 28) | (1ULL << 29) | (1ULL << 30) | (1ULL << 31); // 30-31 (30~31 < 64)
91
98NEFORCE_INLINE17 constexpr uint64_t CNTRL_MASK_HIGH = (1ULL << (127 - 64)); // DEL(127)
99
100NEFORCE_END_CONSTANTS__
102
103
114template <typename CharT>
115NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_ctype(const CharT c, uint64_t mask_low, uint64_t mask_high) noexcept {
116 static_assert(is_character_v<CharT>, "character required");
117 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
118 if (uc > 127) {
119 return false;
120 }
121 if (uc <= 63) {
122 return (mask_low & (1ULL << uc)) != 0;
123 }
124 const auto offset = uc - 64;
125 return (mask_high & (1ULL << offset)) != 0;
126}
127
134template <typename CharT>
135NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_punct(const CharT c) noexcept {
136 return _NEFORCE is_ctype(c, constants::PUNCT_MASK_LOW, constants::PUNCT_MASK_HIGH);
137}
138
147template <typename CharT>
148NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_cntrl(const CharT c) noexcept {
149 return _NEFORCE is_ctype(c, constants::CNTRL_MASK_LOW, constants::CNTRL_MASK_HIGH);
150}
151
160template <typename CharT>
161NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_print(const CharT c) noexcept {
162 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
163 return uc <= 127 && !_NEFORCE is_cntrl(c);
164}
165
174template <typename CharT>
175NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_blank(const CharT c) noexcept {
176 static_assert(is_character_v<CharT>, "character required");
177 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
178 return uc < 64 && (constants::BLANK_MASK & (1ULL << uc)) != 0;
179}
180
189template <typename CharT>
190NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_graph(const CharT c) noexcept {
191 return _NEFORCE is_print(c) && !_NEFORCE is_blank(c);
192}
193
202template <typename CharT>
203NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_ascii(const CharT c) noexcept {
204 static_assert(is_character_v<CharT>, "character required");
205 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
206 return uc <= 127;
207}
208
217template <typename CharT>
218NEFORCE_PURE_FUNCTION NEFORCE_CONSTEXPR14 bool is_space(const CharT c) noexcept {
219 static_assert(is_character_v<CharT>, "character required");
220 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
221 return uc < 64 && (constants::SPACE_MASK & (1ULL << uc)) != 0;
222}
223
232template <typename CharT>
233NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha(const CharT c) noexcept {
234 static_assert(is_character_v<CharT>, "character required");
235 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
236 if (uc > 127) {
237 return false;
238 }
239 return (uc & 0xDF) >= 'A' && (uc & 0xDF) <= 'Z';
240}
241
250template <typename CharT>
251NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit(const CharT c) noexcept {
252 static_assert(is_character_v<CharT>, "character required");
253 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
254 if (uc > 127) {
255 return false;
256 }
257 return (uc & 0xF0) == 0x30 && (uc & 0x0F) <= 9;
258}
259
268template <typename CharT>
269NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_xdigit(const CharT c) noexcept {
270 static_assert(is_character_v<CharT>, "character required");
271 const auto uc = static_cast<make_unsigned_t<CharT>>(c);
272 if (uc > 127) {
273 return false;
274 }
275 const bool is_09 = (uc & 0xF0) == 0x30 && (uc & 0x0F) <= 0x09;
276 const bool is_AF = (uc & 0xF0) == 0x40 && (uc & 0x0F) >= 0x01 && (uc & 0x0F) <= 0x06;
277 const bool is_af = (uc & 0xF0) == 0x60 && (uc & 0x0F) >= 0x01 && (uc & 0x0F) <= 0x06;
278 return is_09 || is_AF || is_af;
279}
280
287template <typename CharT>
288NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_alpha_or_digit(const CharT c) noexcept {
289 return _NEFORCE is_alpha(c) || _NEFORCE is_digit(c);
290}
291
298template <typename CharT>
299NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 bool is_digit_or_alpha(const CharT c) noexcept {
300 return _NEFORCE is_digit(c) || _NEFORCE is_alpha(c);
301}
302 // CharTypeChecking
304
305NEFORCE_END_NAMESPACE__
306#endif // NEFORCE_CORE_STRING_CHAR_TYPES_HPP__
constexpr bool is_character_v
is_character的便捷变量模板
constexpr bool is_graph(const CharT c) noexcept
检查字符是否为图形字符
constexpr bool is_print(const CharT c) noexcept
检查字符是否为可打印字符
constexpr bool is_blank(const CharT c) noexcept
检查字符是否为空白字符
constexpr bool is_alpha_or_digit(const CharT c) noexcept
检查字符是否为字母或数字
constexpr bool is_space(const CharT c) noexcept
检查字符是否为空白字符
constexpr bool is_punct(const CharT c) noexcept
检查字符是否为标点符号
constexpr bool is_digit(const CharT c) noexcept
检查字符是否为数字
constexpr bool is_alpha(const CharT c) noexcept
检查字符是否为字母
constexpr bool is_ascii(const CharT c) noexcept
检查字符是否为ASCII字符
constexpr bool is_ctype(const CharT c, uint64_t mask_low, uint64_t mask_high) noexcept
通用字符类型检查函数
constexpr bool is_cntrl(const CharT c) noexcept
检查字符是否为控制字符
constexpr bool is_digit_or_alpha(const CharT c) noexcept
检查字符是否为数字或字母
constexpr bool is_xdigit(const CharT c) noexcept
检查字符是否为十六进制数字
unsigned long long uint64_t
64位无符号整数类型
typename make_unsigned< T >::type make_unsigned_t
make_unsigned的便捷别名
类型萃取