//! Characters.
/// Properties of ASCII characters.
///
/// About `'` (single quote) being considered as a literal: see
/// [Errata ID 6937](https://www.rfc-editor.org/errata/eid6937).
const CHARS_TABLE: [u8; 128] = [
0b_0000_0000, // NUL
0b_0000_0000, // SOH
0b_0000_0000, // STX
0b_0000_0000, // ETX
0b_0000_0000, // EOT
0b_0000_0000, // ENQ
0b_0000_0000, // ACK
0b_0000_0000, // BEL
0b_0000_0000, // BS
0b_0000_0000, // HT
0b_0000_0000, // LF
0b_0000_0000, // VT
0b_0000_0000, // FF
0b_0000_0000, // CR
0b_0000_0000, // SO
0b_0000_0000, // SI
0b_0000_0000, // DLE
0b_0000_0000, // DC1
0b_0000_0000, // DC2
0b_0000_0000, // DC3
0b_0000_0000, // DC4
0b_0000_0000, // NAK
0b_0000_0000, // SYN
0b_0000_0000, // ETB
0b_0000_0000, // CAN
0b_0000_0000, // EM
0b_0000_0000, // SUB
0b_0000_0000, // ESC
0b_0000_0000, // FS
0b_0000_0000, // GS
0b_0000_0000, // RS
0b_0000_0000, // US
0b_0000_0000, // SPACE
0b_0000_0001, // !
0b_0000_0000, // "
0b_0000_0001, // #
0b_0000_0001, // $
0b_0000_0000, // %
0b_0000_0001, // &
0b_0000_0001, // '
0b_0000_0001, // (
0b_0000_0001, // )
0b_0000_0001, // *
0b_0000_0001, // +
0b_0000_0001, // ,
0b_0000_0001, // -
0b_0000_0101, // .
0b_0000_0001, // /
0b_0000_0111, // 0
0b_0000_0111, // 1
0b_0000_0111, // 2
0b_0000_0111, // 3
0b_0000_0111, // 4
0b_0000_0111, // 5
0b_0000_0111, // 6
0b_0000_0111, // 7
0b_0000_0111, // 8
0b_0000_0111, // 9
0b_0000_0001, // :
0b_0000_0001, // ;
0b_0000_0000, // <
0b_0000_0001, // =
0b_0000_0000, // >
0b_0000_0001, // ?
0b_0000_0001, // @
0b_0000_0111, // A
0b_0000_0111, // B
0b_0000_0111, // C
0b_0000_0111, // D
0b_0000_0111, // E
0b_0000_0111, // F
0b_0000_0111, // G
0b_0000_0111, // H
0b_0000_0111, // I
0b_0000_0111, // J
0b_0000_0111, // K
0b_0000_0111, // L
0b_0000_0111, // M
0b_0000_0111, // N
0b_0000_0111, // O
0b_0000_0111, // P
0b_0000_0111, // Q
0b_0000_0111, // R
0b_0000_0111, // S
0b_0000_0111, // T
0b_0000_0111, // U
0b_0000_0111, // V
0b_0000_0111, // W
0b_0000_0111, // X
0b_0000_0111, // Y
0b_0000_0111, // Z
0b_0000_0001, // [
0b_0000_0000, // \
0b_0000_0001, // ]
0b_0000_0000, // ^
0b_0000_0111, // _
0b_0000_0000, // `
0b_0000_0111, // a
0b_0000_0111, // b
0b_0000_0111, // c
0b_0000_0111, // d
0b_0000_0111, // e
0b_0000_0111, // f
0b_0000_0111, // g
0b_0000_0111, // h
0b_0000_0111, // i
0b_0000_0111, // j
0b_0000_0111, // k
0b_0000_0111, // l
0b_0000_0111, // m
0b_0000_0111, // n
0b_0000_0111, // o
0b_0000_0111, // p
0b_0000_0111, // q
0b_0000_0111, // r
0b_0000_0111, // s
0b_0000_0111, // t
0b_0000_0111, // u
0b_0000_0111, // v
0b_0000_0111, // w
0b_0000_0111, // x
0b_0000_0111, // y
0b_0000_0111, // z
0b_0000_0000, // {
0b_0000_0000, // |
0b_0000_0000, // }
0b_0000_0001, // ~
0b_0000_0000, // DEL
];
/// A mask to test whether the character matches `literals` rule defined in [RFC 6570].
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.1
const CHARS_TABLE_MASK_LITERAL: u8 = 1 << 0;
/// A mask to test whether the character matches `varchar` rule defined in [RFC 6570].
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.3
const CHARS_TABLE_MASK_VARCHAR_START: u8 = 1 << 1;
/// A mask to test whether the character matches `varchar` rule defined in [RFC 6570] or a period.
///
/// [RFC 6570]: https://www.rfc-editor.org/rfc/rfc6570.html#section-2.3
const CHARS_TABLE_MASK_VARCHAR_CONTINUE: u8 = 1 << 2;
/// Returns true if the given ASCII character is allowed in a literal string.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_literal_char(c: u8) -> bool {
(CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_LITERAL) != 0
}
/// Returns true if the given ASCII character is allowed as the beginning of the `varname`.
///
/// Note that this does not return true for `%` character. It is caller's
/// responsibility to test validity of percent-encoded triplets.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_varchar_start(c: u8) -> bool {
(CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_VARCHAR_START) != 0
}
/// Returns true if the given ASCII character is allowed as the non-beginning of the `varname`.
///
/// Note that this does not return true for `%` character. It is caller's
/// responsibility to test validity of percent-encoded triplets.
///
/// # Precondition
///
/// The given byte should be an ASCII character, i.e. should be less than 128.
#[inline]
#[must_use]
pub(super) const fn is_ascii_varchar_continue(c: u8) -> bool {
(CHARS_TABLE[c as usize] & CHARS_TABLE_MASK_VARCHAR_CONTINUE) != 0
}