pub mod canonicalize;
pub mod endian;
pub use canonicalize::{canonical_f32_zero, canonical_f64_zero, canonical_regex_flags};
pub use endian::{
push_f32, push_f64, push_i16, push_i32, push_i64, push_u16, push_u32, push_u64, read_f32,
read_f64, read_i16, read_i32, read_i64, read_u16, read_u32, read_u64, LeBytesWriter,
OpaquePayloadTruncated,
};
#[cfg(test)]
mod tests {
use super::canonicalize::{canonical_f32_zero, canonical_f64_zero, canonical_regex_flags};
#[test]
fn regex_flags_are_sorted_and_deduped() {
assert_eq!(canonical_regex_flags("im"), canonical_regex_flags("mi"));
assert_eq!(canonical_regex_flags("mim"), "im");
assert_eq!(canonical_regex_flags(""), "");
assert_eq!(canonical_regex_flags("abc"), "abc");
assert_eq!(canonical_regex_flags("cba"), "abc");
}
#[test]
fn negative_zero_canonicalises_to_positive_zero() {
assert_eq!(canonical_f32_zero(-0.0).to_bits(), 0);
assert_eq!(canonical_f32_zero(0.0).to_bits(), 0);
}
#[test]
fn non_zero_floats_and_nans_pass_through_unchanged() {
let payload = f32::from_bits(0xDEADBEEF);
assert_eq!(canonical_f32_zero(payload).to_bits(), 0xDEADBEEF);
assert_eq!(canonical_f32_zero(1.0).to_bits(), 1.0f32.to_bits());
assert_eq!(canonical_f32_zero(-1.0).to_bits(), (-1.0f32).to_bits());
}
#[test]
fn f64_negative_zero_canonicalises_to_positive_zero() {
assert_eq!(canonical_f64_zero(-0.0_f64).to_bits(), 0u64);
assert_eq!(canonical_f64_zero(0.0_f64).to_bits(), 0u64);
}
#[test]
fn f64_non_zero_floats_pass_through_unchanged() {
let smallest_neg_subnormal = f64::from_bits(0x8000_0000_0000_0001);
assert_eq!(
canonical_f64_zero(smallest_neg_subnormal).to_bits(),
0x8000_0000_0000_0001
);
assert_eq!(canonical_f64_zero(-1.0_f64).to_bits(), (-1.0_f64).to_bits());
let qnan_neg = f64::from_bits(0xFFF8_0000_0000_0001);
assert_eq!(
canonical_f64_zero(qnan_neg).to_bits(),
0xFFF8_0000_0000_0001
);
let snan_pos = f64::from_bits(0x7FF0_0000_0000_0001);
assert_eq!(
canonical_f64_zero(snan_pos).to_bits(),
0x7FF0_0000_0000_0001
);
}
}