Reimplement 'codepoint_flags' as 'codepoint_categ'
This commit is contained in:
parent
5ceab90b4d
commit
ba4bbbd1ad
1 changed files with 101 additions and 37 deletions
138
src/unicode.h
138
src/unicode.h
|
@ -4,46 +4,110 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
struct codepoint_flags {
|
struct codepoint_categ {
|
||||||
enum {
|
enum _category : uint16_t {
|
||||||
UNDEFINED = 0x0001,
|
UNDEF = 0, // \p{Cn} Undefined
|
||||||
NUMBER = 0x0002, // regex: \p{N}
|
C = 1 << 0, // \p{C} Control
|
||||||
LETTER = 0x0004, // regex: \p{L}
|
L = 1 << 1, // \p{L} Letter
|
||||||
SEPARATOR = 0x0008, // regex: \p{Z}
|
M = 1 << 2, // \p{M} Mark
|
||||||
ACCENT_MARK = 0x0010, // regex: \p{M}
|
N = 1 << 3, // \p{N} Number
|
||||||
PUNCTUATION = 0x0020, // regex: \p{P}
|
P = 1 << 4, // \p{P} Punctuation
|
||||||
SYMBOL = 0x0040, // regex: \p{S}
|
S = 1 << 5, // \p{S} Symbol
|
||||||
CONTROL = 0x0080, // regex: \p{C}
|
Z = 1 << 6, // \p{Z} Separator
|
||||||
MASK_CATEGORIES = 0x00FF,
|
MASK = (1 << 7) - 1 // 7 bits
|
||||||
};
|
};
|
||||||
|
|
||||||
// codepoint type
|
enum _subcategory : uint16_t {
|
||||||
uint16_t is_undefined : 1;
|
Cc = C | (1 << 7), // \p{Cc} Control
|
||||||
uint16_t is_number : 1; // regex: \p{N}
|
Cf = C | (2 << 7), // \p{Cf} Format
|
||||||
uint16_t is_letter : 1; // regex: \p{L}
|
Co = C | (3 << 7), // \p{Co} Private Use
|
||||||
uint16_t is_separator : 1; // regex: \p{Z}
|
Cs = C | (4 << 7), // \p{Cs} Surrrogate
|
||||||
uint16_t is_accent_mark : 1; // regex: \p{M}
|
Ll = L | (1 << 7), // \p{Ll} Lowercase Letter
|
||||||
uint16_t is_punctuation : 1; // regex: \p{P}
|
Lm = L | (2 << 7), // \p{Lm} Modifier Letter
|
||||||
uint16_t is_symbol : 1; // regex: \p{S}
|
Lo = L | (3 << 7), // \p{Lo} Other Letter
|
||||||
uint16_t is_control : 1; // regex: \p{C}
|
Lt = L | (4 << 7), // \p{Lt} Titlecase Letter
|
||||||
// helper flags
|
Lu = L | (5 << 7), // \p{Lu} Uppercase Letter
|
||||||
uint16_t is_whitespace : 1; // regex: \s
|
Mc = M | (1 << 7), // \p{Mc} Spacing Mark
|
||||||
uint16_t is_lowercase : 1;
|
Me = M | (2 << 7), // \p{Me} Enclosing Mark
|
||||||
uint16_t is_uppercase : 1;
|
Mn = M | (3 << 7), // \p{Mn} Nonspacing Mark
|
||||||
uint16_t is_nfd : 1;
|
Nd = N | (1 << 7), // \p{Nd} Decimal Number
|
||||||
|
Nl = N | (2 << 7), // \p{Nl} Letter Number
|
||||||
|
No = N | (3 << 7), // \p{No} Other Number
|
||||||
|
Pc = P | (1 << 7), // \p{Pc} Connector Punctuation
|
||||||
|
Pd = P | (2 << 7), // \p{Pd} Dash Punctuation
|
||||||
|
Pe = P | (3 << 7), // \p{Pe} Close Punctuation
|
||||||
|
Pf = P | (4 << 7), // \p{Pf} Final Punctuation
|
||||||
|
Pi = P | (5 << 7), // \p{Pi} Initial Punctuation
|
||||||
|
Po = P | (6 << 7), // \p{Po} Other Punctuation
|
||||||
|
Ps = P | (7 << 7), // \p{Ps} Open Punctuation
|
||||||
|
Sc = S | (1 << 7), // \p{Sc} Currency Symbol
|
||||||
|
Sk = S | (2 << 7), // \p{Sk} Modifier Symbol
|
||||||
|
Sm = S | (3 << 7), // \p{Sm} Math Symbol
|
||||||
|
So = S | (4 << 7), // \p{So} Other Symbol
|
||||||
|
Zl = Z | (1 << 7), // \p{Zl} Line Separator
|
||||||
|
Zp = Z | (2 << 7), // \p{Zp} Paragraph Separator
|
||||||
|
Zs = Z | (3 << 7), // \p{Zs} Space Separator
|
||||||
|
SUBMASK = (1 << 10) - 1 // 7+3 bits
|
||||||
|
};
|
||||||
|
|
||||||
// decode from uint16
|
enum _flags : uint16_t {
|
||||||
inline codepoint_flags(const uint16_t flags=0) {
|
WHITESPACE = (1 << 10), // regex: \s
|
||||||
*reinterpret_cast<uint16_t*>(this) = flags;
|
LOWERCASE = (1 << 11),
|
||||||
}
|
UPPERCASE = (1 << 12),
|
||||||
|
//Norm NFD/NFC = ...,
|
||||||
|
};
|
||||||
|
|
||||||
inline uint16_t as_uint() const {
|
inline codepoint_categ(const uint16_t categ=0) : encoded{categ} {}
|
||||||
return *reinterpret_cast<const uint16_t*>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint16_t category_flag() const {
|
inline uint8_t get_category() const { return encoded & MASK; }
|
||||||
return this->as_uint() & MASK_CATEGORIES;
|
inline uint8_t get_subcategory() const { return encoded & SUBMASK; }
|
||||||
}
|
|
||||||
|
inline bool is_undefined() const { return !encoded; }
|
||||||
|
inline bool is_defined() const { return encoded; }
|
||||||
|
|
||||||
|
inline auto is_whitespace() const { return encoded & WHITESPACE; }
|
||||||
|
inline auto is_lowercase() const { return encoded & LOWERCASE; }
|
||||||
|
inline auto is_uppercase() const { return encoded & UPPERCASE; }
|
||||||
|
|
||||||
|
inline auto is_C() const { return encoded & C; }
|
||||||
|
inline auto is_L() const { return encoded & L; }
|
||||||
|
inline auto is_M() const { return encoded & M; }
|
||||||
|
inline auto is_N() const { return encoded & N; }
|
||||||
|
inline auto is_P() const { return encoded & P; }
|
||||||
|
inline auto is_S() const { return encoded & S; }
|
||||||
|
inline auto is_Z() const { return encoded & Z; }
|
||||||
|
|
||||||
|
inline auto is_Cc() const { return (encoded & SUBMASK) == Cc; }
|
||||||
|
inline auto is_Cf() const { return (encoded & SUBMASK) == Cf; }
|
||||||
|
inline auto is_Co() const { return (encoded & SUBMASK) == Co; }
|
||||||
|
inline auto is_Cs() const { return (encoded & SUBMASK) == Cs; }
|
||||||
|
inline auto is_Ll() const { return (encoded & SUBMASK) == Ll; }
|
||||||
|
inline auto is_Lm() const { return (encoded & SUBMASK) == Lm; }
|
||||||
|
inline auto is_Lo() const { return (encoded & SUBMASK) == Lo; }
|
||||||
|
inline auto is_Lt() const { return (encoded & SUBMASK) == Lt; }
|
||||||
|
inline auto is_Lu() const { return (encoded & SUBMASK) == Lu; }
|
||||||
|
inline auto is_Mc() const { return (encoded & SUBMASK) == Mc; }
|
||||||
|
inline auto is_Me() const { return (encoded & SUBMASK) == Me; }
|
||||||
|
inline auto is_Mn() const { return (encoded & SUBMASK) == Mn; }
|
||||||
|
inline auto is_Nd() const { return (encoded & SUBMASK) == Nd; }
|
||||||
|
inline auto is_Nl() const { return (encoded & SUBMASK) == Nl; }
|
||||||
|
inline auto is_No() const { return (encoded & SUBMASK) == No; }
|
||||||
|
inline auto is_Pc() const { return (encoded & SUBMASK) == Pc; }
|
||||||
|
inline auto is_Pd() const { return (encoded & SUBMASK) == Pd; }
|
||||||
|
inline auto is_Pe() const { return (encoded & SUBMASK) == Pe; }
|
||||||
|
inline auto is_Pf() const { return (encoded & SUBMASK) == Pf; }
|
||||||
|
inline auto is_Pi() const { return (encoded & SUBMASK) == Pi; }
|
||||||
|
inline auto is_Po() const { return (encoded & SUBMASK) == Po; }
|
||||||
|
inline auto is_Ps() const { return (encoded & SUBMASK) == Ps; }
|
||||||
|
inline auto is_Sc() const { return (encoded & SUBMASK) == Sc; }
|
||||||
|
inline auto is_Sk() const { return (encoded & SUBMASK) == Sk; }
|
||||||
|
inline auto is_Sm() const { return (encoded & SUBMASK) == Sm; }
|
||||||
|
inline auto is_So() const { return (encoded & SUBMASK) == So; }
|
||||||
|
inline auto is_Zl() const { return (encoded & SUBMASK) == Zl; }
|
||||||
|
inline auto is_Zp() const { return (encoded & SUBMASK) == Zp; }
|
||||||
|
inline auto is_Zs() const { return (encoded & SUBMASK) == Zs; }
|
||||||
|
|
||||||
|
uint16_t encoded;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,8 +117,8 @@ std::vector<uint32_t> unicode_cpts_from_utf8(const std::string & utf8);
|
||||||
|
|
||||||
std::vector<uint32_t> unicode_cpts_normalize_nfd(const std::vector<uint32_t> & cpts);
|
std::vector<uint32_t> unicode_cpts_normalize_nfd(const std::vector<uint32_t> & cpts);
|
||||||
|
|
||||||
codepoint_flags unicode_cpt_flags(const uint32_t cp);
|
codepoint_categ unicode_cpt_category(const uint32_t cp);
|
||||||
codepoint_flags unicode_cpt_flags(const std::string & utf8);
|
codepoint_categ unicode_cpt_category(const std::string & utf8);
|
||||||
|
|
||||||
std::string unicode_byte_to_utf8(uint8_t byte);
|
std::string unicode_byte_to_utf8(uint8_t byte);
|
||||||
uint8_t unicode_utf8_to_byte(const std::string & utf8);
|
uint8_t unicode_utf8_to_byte(const std::string & utf8);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue