const UNCHECKED_DIGITS: usize = 9;
#[inline]
fn append_digit(value: u32, byte: u8) -> u32 {
value * 10 + (byte - b'0') as u32
}
#[inline]
fn append_digit_checked(value: u32, byte: u8) -> Option<u32> {
value.checked_mul(10)?.checked_add((byte - b'0') as u32)
}
#[inline]
pub(crate) fn parse_express_id_prefix(input: &[u8]) -> (usize, Option<u32>) {
let mut end = 0;
let mut result = 0u32;
for &byte in input.iter().take(UNCHECKED_DIGITS) {
if !byte.is_ascii_digit() { return (end, (end != 0).then_some(result)); }
result = append_digit(result, byte);
end += 1;
}
if end == 0 { return (0, None); }
let mut value = Some(result);
for &byte in &input[end..] {
if !byte.is_ascii_digit() { break; }
value = value.and_then(|value| append_digit_checked(value, byte));
end += 1;
}
(end, value)
}
#[inline]
pub fn parse_express_id(digits: &[u8]) -> Option<u32> {
debug_assert!(
!digits.is_empty() && digits.iter().all(u8::is_ascii_digit),
"parse_express_id expects a validated, non-empty digit run"
);
let mut result: u32 = 0;
if digits.len() <= UNCHECKED_DIGITS {
for &b in digits {
result = append_digit(result, b);
}
return Some(result);
}
for &b in digits {
result = append_digit_checked(result, b)?;
}
Some(result)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn short_runs_parse_without_overflow_checks() {
assert_eq!(parse_express_id(b"1"), Some(1));
assert_eq!(parse_express_id(b"999999999"), Some(999_999_999));
}
#[test]
fn max_u32_is_inclusive() {
assert_eq!(parse_express_id(b"4294967295"), Some(u32::MAX));
}
#[test]
fn one_past_max_is_refused_not_wrapped() {
assert_eq!(parse_express_id(b"4294967296"), None);
}
#[test]
fn the_defect_value_is_refused_not_aliased_to_a_real_id() {
assert_eq!(parse_express_id(b"4294967297"), None);
}
#[test]
fn express_prefix_matches_checked_decimal_oracle_3987() {
let runs = ["0", "1", "999999999", "1000000000", "4294967295",
"4294967296", "4294967297", "999999999999999999999999999999999"];
for zeros in [0, 1, 9, 10, 64, 1024] {
for run in runs {
let digits = format!("{}{run}", "0".repeat(zeros));
let expected = digits.parse::<u32>().ok();
assert_eq!(parse_express_id(digits.as_bytes()), expected);
for suffix in [b"".as_slice(), b"=IFCWALL($);", b"/* ; */ =", b"x", b"\xff"] {
let source = [digits.as_bytes(), suffix].concat();
assert_eq!(parse_express_id_prefix(&source), (digits.len(), expected));
}
}
}
for source in [b"".as_slice(), b"=", b"-1", b"+1", b" ", b"\xff"] {
assert_eq!(parse_express_id_prefix(source), (0, None));
}
for value in [2u32, 19, 100, 123456789, u32::MAX - 1] {
let source = format!("{value};trailing");
assert_eq!(parse_express_id_prefix(source.as_bytes()),
(value.to_string().len(), Some(value)));
}
}
}