use core::mem::MaybeUninit;
macro_rules! cfg_sel {
({#[cfg(else)] { $($output:tt)* }}) => {
$($output)*
};
({
#[cfg($cfg:meta)]
{ $($output:tt)* }
$($( $rest:tt )+)?
}) => {
#[cfg($cfg)]
cfg_sel! {{#[cfg(else)] { $($output)* }}}
$(
#[cfg(not($cfg))]
cfg_sel! {{ $($rest)+ }}
)?
};
}
#[allow(dead_code)]
#[inline(always)]
pub(crate) const unsafe fn slice_assume_init_ref<T>(s: &[MaybeUninit<T>]) -> &[T] {
unsafe { &*(s as *const [MaybeUninit<T>] as *const [T]) }
}
#[inline(always)]
pub(crate) unsafe fn slice_assume_init_mut<T>(s: &mut [MaybeUninit<T>]) -> &mut [T] {
unsafe { &mut *(s as *mut [MaybeUninit<T>] as *mut [T]) }
}
pub(crate) mod ptr {
cfg_sel!({
#[cfg(not(semihosting_no_strict_provenance))]
{
pub(crate) use core::ptr::{
with_exposed_provenance, with_exposed_provenance_mut, without_provenance_mut,
};
}
#[cfg(else)]
{
#[inline(always)]
#[must_use]
pub(crate) const fn without_provenance_mut<T>(addr: usize) -> *mut T {
#[cfg(miri)]
unsafe {
core::mem::transmute(addr)
}
#[cfg(not(miri))]
{
addr as *mut T
}
}
#[inline(always)]
#[must_use]
#[cfg_attr(miri, track_caller)] pub(crate) fn with_exposed_provenance<T>(addr: usize) -> *const T {
addr as *const T
}
#[inline(always)]
#[must_use]
#[cfg_attr(miri, track_caller)] pub(crate) fn with_exposed_provenance_mut<T>(addr: usize) -> *mut T {
addr as *mut T
}
pub(crate) trait PtrExt<T: ?Sized>: Copy {
#[must_use]
fn addr(self) -> usize;
}
impl<T: ?Sized> PtrExt<T> for *const T {
#[inline(always)]
#[must_use]
fn addr(self) -> usize {
#[cfg(miri)]
unsafe {
core::mem::transmute(self.cast::<()>())
}
#[cfg(not(miri))]
{
self.cast::<()>() as usize
}
}
}
impl<T: ?Sized> PtrExt<T> for *mut T {
#[inline(always)]
#[must_use]
fn addr(self) -> usize {
#[cfg(miri)]
unsafe {
core::mem::transmute(self.cast::<()>())
}
#[cfg(not(miri))]
{
self.cast::<()>() as usize
}
}
}
}
});
}