use super::*;
pub unsafe trait BitZero: Sized + BitZeroed {}
map_on_number_and_bool!(
($type_name : ident) =>
{
unsafe impl BitZero for $type_name {}
}
);
unsafe impl BitZero for () {}
unsafe impl BitZero for char {}
unsafe impl<T: BitZero> BitZero for Wrapping<T> {}
unsafe impl<T: BitZero> BitZero for core::cmp::Reverse<T> {}
unsafe impl<T: BitZero> BitZero for core::num::Saturating<T> {}
unsafe impl<T> BitZero for *mut T {}
unsafe impl<T> BitZero for *const T {}
unsafe impl<T> BitZero for *mut [T] {}
unsafe impl<T> BitZero for *const [T] {}
unsafe impl BitZero for *mut str {}
unsafe impl BitZero for *const str {}
unsafe impl<T: ?Sized> BitZero for PhantomData<T> {}
unsafe impl BitZero for PhantomPinned {}
unsafe impl<T: BitZero> BitZero for core::mem::ManuallyDrop<T> {}
unsafe impl<T: BitZero> BitZero for core::cell::UnsafeCell<T> {}
unsafe impl<T: BitZero> BitZero for core::cell::Cell<T> {}
pub trait BitZeroed: Sized
{
#[inline(always)]
fn zeroed() -> Self { unsafe { core::mem::zeroed() } }
}
impl<T> BitZeroed for T where T: BitZero {}
mod atomic_impls
{
use super::BitZero;
#[cfg(target_has_atomic = "8")]
unsafe impl BitZero for core::sync::atomic::AtomicBool {}
#[cfg(target_has_atomic = "8")]
unsafe impl BitZero for core::sync::atomic::AtomicU8 {}
#[cfg(target_has_atomic = "8")]
unsafe impl BitZero for core::sync::atomic::AtomicI8 {}
#[cfg(target_has_atomic = "16")]
unsafe impl BitZero for core::sync::atomic::AtomicU16 {}
#[cfg(target_has_atomic = "16")]
unsafe impl BitZero for core::sync::atomic::AtomicI16 {}
#[cfg(target_has_atomic = "32")]
unsafe impl BitZero for core::sync::atomic::AtomicU32 {}
#[cfg(target_has_atomic = "32")]
unsafe impl BitZero for core::sync::atomic::AtomicI32 {}
#[cfg(target_has_atomic = "64")]
unsafe impl BitZero for core::sync::atomic::AtomicU64 {}
#[cfg(target_has_atomic = "64")]
unsafe impl BitZero for core::sync::atomic::AtomicI64 {}
#[cfg(target_has_atomic = "ptr")]
unsafe impl BitZero for core::sync::atomic::AtomicUsize {}
#[cfg(target_has_atomic = "ptr")]
unsafe impl BitZero for core::sync::atomic::AtomicIsize {}
#[cfg(target_has_atomic = "ptr")]
unsafe impl<T> BitZero for core::sync::atomic::AtomicPtr<T> {}
}
unsafe impl<T> BitZero for core::mem::MaybeUninit<T> {}
map_on_tuple!(
(
$(
$len:literal => ( $( $idx:tt $typ:ident )+ )
)*
) => {
$(
#[cfg_attr(docsrs, doc(fake_variadic))]
unsafe impl<$( $typ: BitZero ),+> BitZero for ( $( $typ ),+ ,) { }
)*
};
);
unsafe impl<T, const N: usize> BitZero for [T; N] where T: BitZero {}