use crate::{
core::optional::{gen_optional, NSTDOptional},
NSTDBool, NSTDChar32, NSTDUInt32,
};
use nstdapi::nstdapi;
#[nstdapi]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct NSTDUnichar {
value: NSTDChar32,
}
impl From<char> for NSTDUnichar {
#[inline]
fn from(value: char) -> Self {
Self { value: value as _ }
}
}
impl From<NSTDUnichar> for char {
#[inline]
fn from(value: NSTDUnichar) -> Self {
unsafe { Self::from_u32_unchecked(value.value) }
}
}
gen_optional!(NSTDOptionalUnichar, NSTDUnichar);
#[inline]
#[nstdapi]
pub const fn nstd_core_unichar_new(value: NSTDChar32) -> NSTDOptionalUnichar {
match char::from_u32(value) {
Some(_) => NSTDOptional::Some(NSTDUnichar { value }),
_ => NSTDOptional::None,
}
}
#[inline]
#[nstdapi]
pub const fn nstd_core_unichar_replacement() -> NSTDUnichar {
NSTDUnichar {
value: char::REPLACEMENT_CHARACTER as _,
}
}
macro_rules! gen_deterministic {
(
$(#[$meta:meta])*
$name: ident,
$method: ident
) => {
$(#[$meta])*
#[inline]
#[nstdapi]
pub fn $name(chr: NSTDUnichar) -> NSTDBool {
char::from(chr).$method()
}
};
}
gen_deterministic!(
nstd_core_unichar_is_ascii,
is_ascii
);
gen_deterministic!(
nstd_core_unichar_is_alphabetic,
is_alphabetic
);
gen_deterministic!(
nstd_core_unichar_is_numeric,
is_numeric
);
gen_deterministic!(
nstd_core_unichar_is_alphanumeric,
is_alphanumeric
);
gen_deterministic!(
nstd_core_unichar_is_lowercase,
is_lowercase
);
gen_deterministic!(
nstd_core_unichar_is_uppercase,
is_uppercase
);
gen_deterministic!(
nstd_core_unichar_is_whitespace,
is_whitespace
);
gen_deterministic!(
nstd_core_unichar_is_control,
is_control
);
#[inline]
#[nstdapi]
pub fn nstd_core_unichar_is_digit(chr: NSTDUnichar, radix: NSTDUInt32) -> NSTDBool {
radix <= 36 && char::from(chr).is_digit(radix)
}