pub(crate) fn provenance_addr<P, A>(provenance: *const P, addr: *const A) -> *const A {
let self_addr = provenance as usize as isize;
let dest_addr = addr as usize as isize;
let offset = dest_addr.wrapping_sub(self_addr);
provenance.cast::<u8>().wrapping_offset(offset).cast()
}
pub(crate) fn provenance_addr_mut<P, A>(provenance: *mut P, addr: *mut A) -> *mut A {
let self_addr = provenance as usize as isize;
let dest_addr = addr as usize as isize;
let offset = dest_addr.wrapping_sub(self_addr);
provenance.cast::<u8>().wrapping_offset(offset).cast()
}