use rama_utils::byte_set::{set_ascii_alpha, set_ascii_alphanum, set_each, set_range};
const CONTROL_BYTE_SET: [bool; 256] = set_each(set_range([false; 256], 0, 0x20), &[0x7F]);
const PATH_BYTE_SET: [bool; 256] = set_each(
set_ascii_alphanum([false; 256]),
b"-._~!$&'()*+,;=:@/%",
);
const QUERY_FRAGMENT_BYTE_SET: [bool; 256] =
set_each(set_ascii_alphanum([false; 256]), b"-._~!$&'()*+,;=:@/%?");
const SCHEME_FIRST_BYTE_SET: [bool; 256] = set_ascii_alpha([false; 256]);
const SCHEME_REST_BYTE_SET: [bool; 256] = set_each(set_ascii_alphanum([false; 256]), b"+-.");
const USERINFO_BYTE_SET: [bool; 256] =
set_each(set_ascii_alphanum([false; 256]), b"-._~!$&'()*+,;=:%");
const UNRESERVED_BYTE_SET: [bool; 256] = set_each(set_ascii_alphanum([false; 256]), b"-._~");
const REG_NAME_BYTE_SET: [bool; 256] =
set_each(set_ascii_alphanum([false; 256]), b"-._~!$&'()*+,;=%");
const IPVFUTURE_TAIL_BYTE_SET: [bool; 256] =
set_each(set_ascii_alphanum([false; 256]), b"-._~!$&'()*+,;=:");
const LABEL_BYTE_SET: [bool; 256] = set_each(set_ascii_alphanum([false; 256]), b"_-");
const PATTERN_NAME_BYTE_SET: [bool; 256] = set_each(set_ascii_alphanum([false; 256]), b"_-");
#[inline(always)]
pub(crate) const fn is_control_byte(b: u8) -> bool {
CONTROL_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn pct_decoded_control_byte(h1: u8, h2: u8) -> Option<u8> {
match rama_utils::hex::decode_pair(h1, h2) {
Some(b) if is_control_byte(b) => Some(b),
_ => None,
}
}
#[inline(always)]
pub(crate) const fn is_path_byte(b: u8) -> bool {
PATH_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_query_fragment_byte(b: u8) -> bool {
QUERY_FRAGMENT_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_scheme_first_byte(b: u8) -> bool {
SCHEME_FIRST_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_scheme_rest_byte(b: u8) -> bool {
SCHEME_REST_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_userinfo_byte(b: u8) -> bool {
USERINFO_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_unreserved_byte(b: u8) -> bool {
UNRESERVED_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_reg_name_byte(b: u8) -> bool {
REG_NAME_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_ipvfuture_tail_byte(b: u8) -> bool {
IPVFUTURE_TAIL_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_label_byte(b: u8) -> bool {
LABEL_BYTE_SET[b as usize]
}
#[inline(always)]
pub(crate) const fn is_pattern_name_byte(b: u8) -> bool {
PATTERN_NAME_BYTE_SET[b as usize]
}