pub mod detect;
pub mod scalar;
pub use detect::cpu_features;
#[cfg(feature = "simd-codecs")]
pub fn base64_encode(input: &[u8]) -> String {
base64_simd::STANDARD.encode_to_string(input)
}
#[cfg(not(feature = "simd-codecs"))]
pub fn base64_encode(input: &[u8]) -> String {
scalar::base64_encode(input)
}
#[cfg(feature = "simd-codecs")]
pub fn base64_decode(input: &str) -> Result<Vec<u8>, String> {
base64_simd::STANDARD
.decode_to_vec(input.as_bytes())
.map_err(|e| e.to_string())
}
#[cfg(not(feature = "simd-codecs"))]
pub fn base64_decode(input: &str) -> Result<Vec<u8>, String> {
scalar::base64_decode(input).map_err(|e| e.to_string())
}
#[cfg(feature = "simd-checksum")]
pub fn crc32(data: &[u8]) -> u32 {
crc32fast::hash(data)
}
#[cfg(not(feature = "simd-checksum"))]
pub fn crc32(data: &[u8]) -> u32 {
scalar::crc32(data)
}
#[cfg(all(test, feature = "simd-codecs"))]
mod simd_codecs_equivalence {
use super::scalar;
#[test]
fn base64_simd_matches_scalar() {
for len in [0usize, 1, 2, 3, 7, 16, 64, 255, 4096] {
let data: Vec<u8> = (0..len).map(|i| (i * 31 + 7) as u8).collect();
let simd = super::base64_encode(&data);
assert_eq!(
simd,
scalar::base64_encode(&data),
"encode mismatch @ {len}"
);
assert_eq!(
super::base64_decode(&simd).unwrap(),
data,
"decode mismatch @ {len}"
);
}
}
}
#[cfg(all(test, feature = "simd-checksum"))]
mod simd_checksum_equivalence {
use super::scalar;
#[test]
fn crc32fast_matches_scalar() {
for s in [b"".as_slice(), b"123456789", b"The quick brown fox"] {
assert_eq!(
super::crc32(s),
scalar::crc32(s),
"crc32 mismatch for {s:?}"
);
}
}
}