konst_macro_rules/
utils_1_56.rs

1use core::mem::{ManuallyDrop, MaybeUninit};
2
3#[repr(C)]
4pub union Transmuter<F, T> {
5    pub from: ManuallyDrop<F>,
6    pub to: ManuallyDrop<T>,
7}
8
9#[repr(C)]
10pub union PtrToRef<'a, P: ?Sized> {
11    pub ptr: *const P,
12    pub reff: &'a P,
13}
14
15#[doc(hidden)]
16#[macro_export]
17macro_rules! __priv_transmute {
18    ($from:ty, $to:ty, $value:expr) => {{
19        $crate::__::ManuallyDrop::into_inner(
20            $crate::utils_1_56::Transmuter::<$from, $to> {
21                from: $crate::__::ManuallyDrop::new($value),
22            }
23            .to,
24        )
25    }};
26}
27
28#[doc(hidden)]
29#[macro_export]
30macro_rules! __priv_transmute_ref {
31    ($from:ty, $to:ty, $reference:expr) => {
32        match $reference {
33            ptr => {
34                let ptr: *const $from = ptr;
35                $crate::utils_1_56::PtrToRef::<$to> {
36                    ptr: ptr as *const $to,
37                }
38                .reff
39            }
40        }
41    };
42}
43
44#[inline(always)]
45pub const fn uninit_array<T, const LEN: usize>() -> [MaybeUninit<T>; LEN] {
46    union MakeMUArray<T, const LEN: usize> {
47        unit: (),
48        array: ManuallyDrop<[MaybeUninit<T>; LEN]>,
49    }
50
51    unsafe { ManuallyDrop::into_inner(MakeMUArray { unit: () }.array) }
52}
53
54#[inline(always)]
55pub const unsafe fn array_assume_init<T, const N: usize>(md: [MaybeUninit<T>; N]) -> [T; N] {
56    crate::__priv_transmute! {[MaybeUninit<T>; N], [T; N], md}
57}