use core::mem::{ManuallyDrop, MaybeUninit};
union Xmute<T, U> {
t: ManuallyDrop<T>,
u: ManuallyDrop<U>,
}
pub const unsafe fn transmute<T, U>(x: T) -> U {
unsafe {
ManuallyDrop::into_inner(
Xmute {
t: ManuallyDrop::new(x),
}
.u,
)
}
}
pub const fn uninit_array<T, const LEN: usize>() -> [MaybeUninit<T>; LEN] {
unsafe { transmute(()) }
}
#[cfg(test)]
mod tests {
use super::*;
use core::mem::MaybeUninit;
#[test]
fn uninit_array() {
const ARRAY1: [u32; 3] = {
let array = [
MaybeUninit::new(1u32),
MaybeUninit::new(2),
MaybeUninit::new(3),
];
unsafe { transmute(array) }
};
assert_eq!(ARRAY1, [1, 2, 3]);
}
}