use core::mem::{self, ManuallyDrop};
use core::ptr;
pub type EncodedValue = usize;
pub unsafe fn encode_val<T>(val: &mut ManuallyDrop<T>) -> EncodedValue {
if mem::size_of::<T>() <= mem::size_of::<EncodedValue>() {
let mut out = 0;
ptr::write_unaligned(
&mut out as *mut EncodedValue as *mut T,
ManuallyDrop::take(val),
);
out
} else {
val as *const ManuallyDrop<T> as EncodedValue
}
}
pub unsafe fn decode_val<T>(val: EncodedValue) -> T {
if mem::size_of::<T>() <= mem::size_of::<EncodedValue>() {
ptr::read_unaligned(&val as *const EncodedValue as *const T)
} else {
ptr::read(val as *const T)
}
}