#[cfg(not(feature = "ucd-17"))]
#[path = "ucd/16/data.rs"]
mod data;
#[cfg(feature = "ucd-17")]
#[path = "ucd/17/data.rs"]
mod data;
pub use data::{Script, UCD_VERSION};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum GeneralCategory {
UppercaseLetter = 0,
LowercaseLetter = 1,
TitlecaseLetter = 2,
ModifierLetter = 3,
OtherLetter = 4,
NonspacingMark = 5,
SpacingMark = 6,
EnclosingMark = 7,
DecimalNumber = 8,
LetterNumber = 9,
OtherNumber = 10,
ConnectorPunctuation = 11,
DashPunctuation = 12,
OpenPunctuation = 13,
ClosePunctuation = 14,
InitialPunctuation = 15,
FinalPunctuation = 16,
OtherPunctuation = 17,
MathSymbol = 18,
CurrencySymbol = 19,
ModifierSymbol = 20,
OtherSymbol = 21,
SpaceSeparator = 22,
LineSeparator = 23,
ParagraphSeparator = 24,
Control = 25,
Format = 26,
Surrogate = 27,
PrivateUse = 28,
Unassigned = 29,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum GeneralCategoryGroup {
Letter,
Mark,
Number,
Punctuation,
Symbol,
Separator,
Other,
}
impl GeneralCategory {
#[inline]
pub const fn group(self) -> GeneralCategoryGroup {
use GeneralCategoryGroup as G;
match self as u8 {
0..=4 => G::Letter,
5..=7 => G::Mark,
8..=10 => G::Number,
11..=17 => G::Punctuation,
18..=21 => G::Symbol,
22..=24 => G::Separator,
_ => G::Other,
}
}
}
static GC_BY_INDEX: [GeneralCategory; 32] = {
use GeneralCategory as GC;
[
GC::UppercaseLetter,
GC::LowercaseLetter,
GC::TitlecaseLetter,
GC::ModifierLetter,
GC::OtherLetter,
GC::NonspacingMark,
GC::SpacingMark,
GC::EnclosingMark,
GC::DecimalNumber,
GC::LetterNumber,
GC::OtherNumber,
GC::ConnectorPunctuation,
GC::DashPunctuation,
GC::OpenPunctuation,
GC::ClosePunctuation,
GC::InitialPunctuation,
GC::FinalPunctuation,
GC::OtherPunctuation,
GC::MathSymbol,
GC::CurrencySymbol,
GC::ModifierSymbol,
GC::OtherSymbol,
GC::SpaceSeparator,
GC::LineSeparator,
GC::ParagraphSeparator,
GC::Control,
GC::Format,
GC::Surrogate,
GC::PrivateUse,
GC::Unassigned,
GC::Unassigned,
GC::Unassigned,
]
};
#[inline]
pub fn general_category(cp: u32) -> GeneralCategory {
GC_BY_INDEX[(data::word(cp) & 31) as usize]
}
#[inline]
pub fn general_category_group(cp: u32) -> GeneralCategoryGroup {
general_category(cp).group()
}
#[inline]
pub fn script(cp: u32) -> Script {
data::SCRIPT_BY_INDEX[(data::word(cp) >> 5) as u8 as usize]
}
mod sealed {
pub trait Sealed {}
impl Sealed for u32 {}
impl Sealed for char {}
}
pub trait Ucd: sealed::Sealed + Copy {
fn general_category(self) -> GeneralCategory;
#[inline]
fn general_category_group(self) -> GeneralCategoryGroup {
self.general_category().group()
}
fn script(self) -> Script;
}
impl Ucd for u32 {
#[inline]
fn general_category(self) -> GeneralCategory {
general_category(self)
}
#[inline]
fn script(self) -> Script {
script(self)
}
}
impl Ucd for char {
#[inline]
fn general_category(self) -> GeneralCategory {
general_category(self as u32)
}
#[inline]
fn script(self) -> Script {
script(self as u32)
}
}