use core::{
mem::{ManuallyDrop, MaybeUninit},
ptr::NonNull,
};
pub(crate) use gnat_proc::__apply as apply;
pub(crate) const unsafe fn _union_transmute<Src, Dst>(src: Src) -> Dst {
#[repr(C)]
union Helper<Src, Dst> {
src: ManuallyDrop<Src>,
dst: ManuallyDrop<Dst>,
}
unsafe {
ManuallyDrop::into_inner(
Helper {
src: ManuallyDrop::new(src),
}
.dst,
)
}
}
macro_rules! union_transmute {
($Src:ty, $Dst:ty, $src:expr $(,)?) => {
crate::utils::_union_transmute::<$Src, $Dst>($src)
};
}
pub(crate) use union_transmute;
pub(crate) const unsafe fn _same_type_transmute<Src, Dst>(src: Src) -> Dst {
if size_of::<Src>() != size_of::<Dst>() || align_of::<Src>() != align_of::<Dst>() {
unsafe { core::hint::unreachable_unchecked() }
}
unsafe { _union_transmute::<Src, Dst>(src) }
}
macro_rules! same_type_transmute {
($Src:ty, $Dst:ty, $src:expr $(,)?) => {
crate::utils::_same_type_transmute::<$Src, $Dst>($src)
};
}
pub(crate) use same_type_transmute;
pub(crate) const unsafe fn assume_init_slice<T>(slice: &[MaybeUninit<T>]) -> &[T] {
unsafe { core::slice::from_raw_parts(slice.as_ptr().cast(), slice.len()) }
}
pub(crate) const unsafe fn assume_init_mut_slice<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
unsafe { core::slice::from_raw_parts_mut(slice.as_mut_ptr().cast(), slice.len()) }
}
pub(crate) const fn nonnull_from_const_ref<T: ?Sized>(r: &T) -> NonNull<T> {
unsafe { NonNull::new_unchecked(core::ptr::from_ref(r).cast_mut()) }
}
macro_rules! subslice {
( & $slice:expr, $($range:tt)* ) => {
crate::utils::subslice!(@split_at $slice, $($range)*)
};
( &mut $slice:expr, $($range:tt)* ) => {
crate::utils::subslice!(@split_at_mut $slice, $($range)*)
};
( @$method:ident $slice:expr, _, $right:expr $(,)? ) => {
$slice.$method($right).0
};
( @$method:ident $slice:expr, $left:expr, _ $(,)? ) => {
$slice.$method($left).1
};
( @$method:ident $slice:expr, $left:expr, $right:expr $(,)? ) => {
$slice.$method($right).0.$method($left).1
};
}
pub(crate) use subslice;
macro_rules! docexpr {
[ $(#[doc = $doc:expr])* ] => {
::core::concat!($($doc, "\n"),*)
};
}
pub(crate) use docexpr;