use crate::integer::*;
use crate::Chunk;
pub unsafe trait Zeroable: Sized + 'static {
#[inline]
unsafe fn zero_memory() -> Self {
core::mem::zeroed::<Self>()
}
}
macro_rules! impl_zeroable_trait {
($($ty:ty),* $(,)?) => {
$(
unsafe impl Zeroable for $ty {}
)*
};
}
impl_zeroable_trait! {
(),
bool,
char,
*const str,
*mut str,
core::marker::PhantomPinned,
u8, u16, u32, u64, u128, usize,
i8, i16, i32, i64, i128, isize,
U8, U16, U32, U64, U128, Usize,
I8, I16, I32, I64, I128, Isize,
f32, f64,
}
macro_rules! impl_zeroable_trait_for_generic {
($($wrapper:tt: $ty:ty),* $(,)?) => {
$(
unsafe impl<$wrapper: Zeroable> Zeroable for $ty {}
)*
};
($($ty:ty),* $(,)?) => {
$(
unsafe impl<T: Zeroable> Zeroable for $ty {}
)*
};
}
impl_zeroable_trait_for_generic! {
*const T,
*const [T],
*mut T,
*mut [T],
}
impl_zeroable_trait_for_generic! {
T: core::num::Wrapping<T>,
T: core::cmp::Reverse<T>,
T: core::mem::MaybeUninit<T>,
T: core::mem::ManuallyDrop<T>,
T: core::cell::UnsafeCell<T>,
T: core::cell::Cell<T>,
}
unsafe impl<T: ?Sized + 'static> Zeroable for core::marker::PhantomData<T> {}
unsafe impl<A: Zeroable> Zeroable for (A,) {}
unsafe impl<A: Zeroable, B: Zeroable> Zeroable for (A, B) {}
unsafe impl<A: Zeroable, B: Zeroable, C: Zeroable> Zeroable for (A, B, C) {}
unsafe impl<T, const N: usize> Zeroable for [T; N] where T: Zeroable {}
unsafe impl<const N: usize> Zeroable for Chunk<N> {}