use core::{any::TypeId, mem::size_of, ptr::read_unaligned};
#[inline]
#[must_use]
pub const fn pack_type_id(id: u128) -> TypeId {
static_assertions::const_assert!(size_of::<TypeId>() == 16);
unsafe { *(&raw const id as *const TypeId) }
}
#[inline]
#[must_use]
pub const fn unpack_type_id(id: TypeId) -> u128 {
static_assertions::const_assert!(size_of::<TypeId>() == 16);
let ret: u128 = unsafe { read_unaligned::<u128>(&raw const id as *const u128) };
ret
}
#[cfg(test)]
mod test {
use core::any::TypeId;
use super::{pack_type_id, unpack_type_id};
#[test]
fn test_type_id() {
let type_id_u64 = unpack_type_id(TypeId::of::<u64>());
let type_id_u128 = unpack_type_id(TypeId::of::<u128>());
assert_eq!(pack_type_id(type_id_u64), TypeId::of::<u64>());
assert_eq!(pack_type_id(type_id_u128), TypeId::of::<u128>());
assert_ne!(pack_type_id(type_id_u64), TypeId::of::<u128>());
assert_ne!(pack_type_id(type_id_u128), TypeId::of::<u64>());
}
}