#![allow(dead_code)]
pub const ON_BASELINE_HOST: bool = cfg!(all(target_arch = "aarch64", target_os = "macos"));
pub fn close_within(a: f64, b: f64, rel: f64) -> bool {
if a.is_nan() || b.is_nan() {
return a.is_nan() && b.is_nan();
}
if a == b {
return true;
}
if a.is_infinite() || b.is_infinite() {
return false;
}
let diff = (a - b).abs();
diff <= 1e-12 || diff <= rel * a.abs().max(b.abs())
}
pub fn numeric_skeleton(s: &str) -> (String, usize, f64) {
let (skel, vals) = numeric_values(s);
let sum = vals.iter().map(|v| v.abs()).sum();
(skel, vals.len(), sum)
}
pub fn numeric_values(s: &str) -> (String, Vec<f64>) {
let b = s.as_bytes();
let mut skel = String::with_capacity(s.len());
let mut vals: Vec<f64> = Vec::new();
let mut i = 0usize;
while i < b.len() {
let prev_is_ident =
i > 0 && (b[i - 1].is_ascii_alphanumeric() || b[i - 1] == b'_' || b[i - 1] == b'.');
let starts = !prev_is_ident
&& (b[i].is_ascii_digit()
|| ((b[i] == b'-' || b[i] == b'.')
&& i + 1 < b.len()
&& b[i + 1].is_ascii_digit()));
if !starts {
skel.push(b[i] as char);
i += 1;
continue;
}
let start = i;
if b[i] == b'-' {
i += 1;
}
while i < b.len() && b[i].is_ascii_digit() {
i += 1;
}
if i < b.len() && b[i] == b'.' {
i += 1;
while i < b.len() && b[i].is_ascii_digit() {
i += 1;
}
}
if i < b.len() && (b[i] == b'e' || b[i] == b'E') {
let mut j = i + 1;
if j < b.len() && (b[j] == b'+' || b[j] == b'-') {
j += 1;
}
if j < b.len() && b[j].is_ascii_digit() {
while j < b.len() && b[j].is_ascii_digit() {
j += 1;
}
i = j;
}
}
if i < b.len() && (b[i].is_ascii_alphanumeric() || b[i] == b'_') {
skel.push_str(&s[start..i]);
continue;
}
vals.push(s[start..i].parse::<f64>().unwrap_or(f64::NAN));
skel.push('#');
}
(skel, vals)
}
pub fn fnv1a64(bytes: &[u8]) -> u64 {
let mut h: u64 = 0xcbf2_9ce4_8422_2325;
for &x in bytes {
h ^= x as u64;
h = h.wrapping_mul(0x1000_0000_01b3);
}
h
}