use crate::spec::Spec;
const MASK_SCHEME_CONTINUE: u8 = 1 << 0;
const MASK_UNRESERVED: u8 = 1 << 1;
const MASK_SUB_DELIMS: u8 = 1 << 3;
const MASK_PCHAR: u8 = 1 << 4;
const MASK_FRAG_QUERY: u8 = 1 << 5;
const MASK_USERINFO_IPVFUTUREADDR: u8 = 1 << 6;
const MASK_PCHAR_SLASH: u8 = 1 << 7;
const TABLE: [u8; 128] = [
0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1111_1000, 0b_0000_0000, 0b_0000_0100, 0b_1111_1000, 0b_0000_0000, 0b_1111_1000, 0b_1111_1000, 0b_1111_1000, 0b_1111_1000, 0b_1111_1000, 0b_1111_1001, 0b_1111_1000, 0b_1111_0011, 0b_1111_0011, 0b_1010_0100, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0100, 0b_1111_1000, 0b_0000_0000, 0b_1111_1000, 0b_0000_0000, 0b_0010_0100, 0b_1011_0100, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_0000_0100, 0b_0000_0000, 0b_0000_0100, 0b_0000_0000, 0b_1111_0010, 0b_0000_0000, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_1111_0011, 0b_0000_0000, 0b_0000_0000, 0b_0000_0000, 0b_1111_0010, 0b_0000_0000, ];
#[inline]
#[must_use]
pub(crate) const fn is_ascii_scheme_continue(c: u8) -> bool {
(TABLE[c as usize] & MASK_SCHEME_CONTINUE) != 0
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_unreserved(c: u8) -> bool {
(TABLE[c as usize] & MASK_UNRESERVED) != 0
}
#[inline]
#[must_use]
pub(crate) fn is_unreserved<S: Spec>(c: char) -> bool {
if c.is_ascii() {
is_ascii_unreserved(c as u8)
} else {
S::is_nonascii_char_unreserved(c)
}
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_pchar(c: u8) -> bool {
(TABLE[c as usize] & MASK_PCHAR) != 0
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_frag_query(c: u8) -> bool {
(TABLE[c as usize] & MASK_FRAG_QUERY) != 0
}
#[inline]
#[must_use]
pub(crate) fn is_nonascii_query<S: Spec>(c: char) -> bool {
S::is_nonascii_char_unreserved(c) || S::is_nonascii_char_private(c)
}
#[inline]
#[must_use]
pub(crate) fn is_nonascii_fragment<S: Spec>(c: char) -> bool {
S::is_nonascii_char_unreserved(c)
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_userinfo_ipvfutureaddr(c: u8) -> bool {
(TABLE[c as usize] & MASK_USERINFO_IPVFUTUREADDR) != 0
}
#[inline]
#[must_use]
pub(crate) fn is_nonascii_userinfo<S: Spec>(c: char) -> bool {
S::is_nonascii_char_unreserved(c)
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_regname(c: u8) -> bool {
(TABLE[c as usize] & (MASK_UNRESERVED | MASK_SUB_DELIMS)) != 0
}
#[inline]
#[must_use]
pub(crate) fn is_nonascii_regname<S: Spec>(c: char) -> bool {
S::is_nonascii_char_unreserved(c)
}
#[inline]
#[must_use]
pub(crate) const fn is_ascii_pchar_slash(c: u8) -> bool {
(TABLE[c as usize] & MASK_PCHAR_SLASH) != 0
}
#[must_use]
pub(crate) fn is_ucschar(c: char) -> bool {
matches!(
u32::from(c),
0xA0..=0xD7FF |
0xF900..=0xFDCF |
0xFDF0..=0xFFEF |
0x1_0000..=0x1_FFFD |
0x2_0000..=0x2_FFFD |
0x3_0000..=0x3_FFFD |
0x4_0000..=0x4_FFFD |
0x5_0000..=0x5_FFFD |
0x6_0000..=0x6_FFFD |
0x7_0000..=0x7_FFFD |
0x8_0000..=0x8_FFFD |
0x9_0000..=0x9_FFFD |
0xA_0000..=0xA_FFFD |
0xB_0000..=0xB_FFFD |
0xC_0000..=0xC_FFFD |
0xD_0000..=0xD_FFFD |
0xE_1000..=0xE_FFFD
)
}
#[inline(always)]
#[must_use]
pub(crate) fn is_utf8_byte_continue(byte: u8) -> bool {
(byte as i8) < -64
}