pub use apply_binary::apply_binary;
pub use apply_unary::apply_unary;
pub use call_u32::call_u32;
pub use is_unary_spec::is_unary_spec;
pub use lookup_primitive_cpu::lookup_primitive_cpu;
pub use sample::SAMPLE;
use crate::properties::tests::{pair, primitive, result_u32, unary};
use crate::spec::law::AlgebraicLaw;
#[inline]
pub fn apply_binary(f: fn(&[u8]) -> Vec<u8>, a: u32, b: u32) -> u32 {
result_u32(&f(&pair(a, b)))
}
#[inline]
pub fn apply_unary(f: fn(&[u8]) -> Vec<u8>, a: u32) -> u32 {
result_u32(&f(&unary(a)))
}
#[inline]
pub fn call_u32(spec: &crate::spec::types::OpSpec, input: &[u8]) -> u32 {
result_u32(&(spec.cpu_fn)(input))
}
#[inline]
pub fn is_unary_spec(spec: &crate::spec::types::OpSpec) -> bool {
spec.signature.inputs.len() == 1
}
#[inline]
pub fn lookup_primitive_cpu(id: &str) -> fn(&[u8]) -> Vec<u8> {
let specs = primitive::specs();
let spec = specs.iter().find(|s| s.id == id).unwrap_or_else(|| {
panic!(
"primitive op '{id}' not in catalog; a declared law references an op that does not exist. \
Fix: register the referenced op or correct the law declaration."
)
});
spec.cpu_fn
}
pub const SAMPLE: [u32; 8] = [
0,
1,
5,
0x7FFF_FFFF,
0x8000_0000,
0xDEAD_BEEF,
0xFFFF_FFFF - 1,
u32::MAX,
];