crate::ix!();
#[macro_export]
macro_rules! define_baseuint_get_hex {
($name:ident, $bits:expr, $limbs:expr) => {
impl $name {
pub fn get_hex(&self) -> String {
let limb_count = $limbs;
let total_bytes = $bits / 8; let mut le_bytes = Vec::with_capacity(total_bytes);
for i in 0..limb_count {
let limb = self.pn[i];
let limb_bytes = limb.to_le_bytes();
le_bytes.extend_from_slice(&limb_bytes);
}
le_bytes.reverse();
use std::fmt::Write;
let mut result = String::with_capacity(total_bytes * 2);
for &byte in &le_bytes {
write!(result, "{:02x}", byte).unwrap();
}
result
}
}
}
}
#[cfg(test)]
mod base_uint_get_hex_exhaustive_tests {
use super::*;
#[traced_test]
fn test_get_hex_32_bits_edge_cases() {
info!("Testing get_hex() on 32-bit BaseUInt edge cases.");
type U32 = BaseUInt32;
let x0 = U32::default();
assert_eq!(x0.get_hex(), "00000000", "Zero should yield '0'");
let mut x1 = U32::default();
x1.pn[0] = 1;
debug!("x1 = {:?}", x1);
assert_eq!(x1.get_hex(), "00000001", "Single nibble leading zero trim check");
let mut x2 = U32::default();
x2.pn[0] = 0x0000_1234;
debug!("x2 = {:?}", x2);
assert_eq!(x2.get_hex(), "00001234");
let mut x3 = U32::default();
x3.pn[0] = 0xFFFF_FFFF;
assert_eq!(x3.get_hex(), "ffffffff");
info!("32-bit get_hex edge-case tests passed.");
}
#[traced_test]
fn test_get_hex_64_bits_edge_cases() {
info!("Testing get_hex() on 64-bit BaseUInt edge cases.");
type U64B = BaseUInt64;
let z = U64B::default();
assert_eq!(z.get_hex(), "0000000000000000");
let mut x = U64B::default();
x.pn[0] = 0x0000_1234;
assert_eq!(x.get_hex(), "0000000000001234");
let mut y = U64B::default();
y.pn[1] = 0x0000_0001;
assert_eq!(y.get_hex(), "0000000100000000" , "One nibble in upper 32 bits => 9 hex digits");
let mut w = U64B::default();
w.pn[0] = 0x3456_7890;
w.pn[1] = 0xABCD_EF12;
assert_eq!(w.get_hex(), "abcdef1234567890");
info!("64-bit get_hex edge-case tests passed.");
}
#[traced_test]
fn test_get_hex_256_bits_edge_cases() {
info!("Testing get_hex() on 256-bit BaseUInt edge cases.");
type U256 = BaseUInt256;
let a = U256::default();
assert_eq!(a.get_hex(), "0000000000000000000000000000000000000000000000000000000000000000", "Zero in 256 bits => '0'");
let mut b = U256::default();
b.pn[0] = 0x1234_ABCD;
assert_eq!(b.get_hex(), "000000000000000000000000000000000000000000000000000000001234abcd");
let mut c = U256::default();
c.pn[7] = 0x0000_FFFF; let hex_c = c.get_hex();
debug!("c.get_hex() => '{}'", hex_c);
assert!(
hex_c.starts_with("0000ffff"),
"Should start with '0000ffff' for top-limb partial set. got={}",
hex_c
);
let mut d = U256::default();
for i in 0..8 {
d.pn[i] = 0xFFFF_FFFF;
}
assert_eq!(
d.get_hex(),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
);
info!("256-bit get_hex edge-case tests passed.");
}
#[traced_test]
fn test_get_hex_random_32_64_256() {
info!("Testing get_hex() with random data for 32, 64, 256 bits => then parse back and compare.");
let mut rng = SimpleLCG::new(0x9999_8888_7777_6666);
for _ in 0..30 {
let random32 = rng.next_u64() & 0xFFFF_FFFF; let mut x32 = BaseUInt32::default();
x32.pn[0] = random32 as u32;
let rt = round_trip_hex_32(&x32);
assert_eq!(rt.pn[0], x32.pn[0], "32-bit random round trip mismatch");
}
for _ in 0..30 {
let random64 = rng.next_u64();
let mut x64 = BaseUInt64::default();
x64.pn[0] = (random64 & 0xFFFF_FFFF) as u32;
x64.pn[1] = ((random64 >> 32) & 0xFFFF_FFFF) as u32;
let rt = round_trip_hex_64(&x64);
assert_eq!(rt.pn, x64.pn, "64-bit random round trip mismatch");
}
for _ in 0..20 {
let a0 = rng.next_u64();
let a1 = rng.next_u64();
let a2 = rng.next_u64();
let a3 = rng.next_u64();
let mut x256 = BaseUInt256::default();
x256.pn[0] = (a0 & 0xFFFF_FFFF) as u32;
x256.pn[1] = ((a0 >> 32) & 0xFFFF_FFFF) as u32;
x256.pn[2] = (a1 & 0xFFFF_FFFF) as u32;
x256.pn[3] = ((a1 >> 32) & 0xFFFF_FFFF) as u32;
x256.pn[4] = (a2 & 0xFFFF_FFFF) as u32;
x256.pn[5] = ((a2 >> 32) & 0xFFFF_FFFF) as u32;
x256.pn[6] = (a3 & 0xFFFF_FFFF) as u32;
x256.pn[7] = ((a3 >> 32) & 0xFFFF_FFFF) as u32;
let rt = round_trip_hex_256(&x256);
assert_eq!(rt.pn, x256.pn, "256-bit random round trip mismatch");
}
info!("Random get_hex tests for 32,64,256 bits done => round-tripped successfully.");
}
}