mod test;
use crate::{Immutable, Zeroable};
use core::cell::{Cell, UnsafeCell};
use core::cmp::Reverse;
use core::marker::{PhantomData, PhantomPinned};
use core::mem::{ManuallyDrop, MaybeUninit};
use core::num::{NonZero, Saturating, Wrapping};
use core::ptr::NonNull;
#[cfg(target_has_atomic = "8")]
use core::sync::atomic::{AtomicI8, AtomicU8};
#[cfg(target_has_atomic = "16")]
use core::sync::atomic::{AtomicI16, AtomicU16};
#[cfg(target_has_atomic = "32")]
use core::sync::atomic::{AtomicI32, AtomicU32};
#[cfg(target_has_atomic = "64")]
use core::sync::atomic::{AtomicI64, AtomicU64};
#[cfg(target_has_atomic = "128")]
use core::sync::atomic::{AtomicI128, AtomicU128};
#[cfg(target_arch = "x86")]
use core::arch::x86::{
__m128,
__m128bh,
__m128d,
__m128i,
__m256,
__m256bh,
__m256d,
__m256i,
__m512,
__m512bh,
__m512d,
__m512i,
};
#[cfg(target_arch = "x86_64")]
use core::arch::x86_64::{
__m128,
__m128bh,
__m128d,
__m128i,
__m256,
__m256bh,
__m256d,
__m256i,
__m512,
__m512bh,
__m512d,
__m512i,
};
pub unsafe trait FromOcts: Zeroable {
#[inline(always)]
#[must_use]
#[track_caller]
fn read_from_octs(octs: &[u8]) -> Self
where
Self: Sized,
{
let p = octs.as_ptr() as *const Self;
unsafe { p.read_unaligned() }
}
#[inline]
#[must_use]
#[track_caller]
fn ref_from_octs(octs: &[u8]) -> &Self
where
Self: Sized + Immutable,
{
assert_eq!(
octs.len(),
size_of::<Self>(),
"cannot construct reference from inexactly-sized octets",
);
let p = octs.as_ptr() as *const Self;
assert!(
p.is_aligned(),
"cannot construct reference from unaligned octets",
);
unsafe { &*p }
}
#[inline]
#[must_use]
#[track_caller]
fn mut_from_octs(octs: &mut [u8]) -> &mut Self
where
Self: Sized,
{
assert_eq!(
octs.len(),
size_of::<Self>(),
"cannot construct reference from inexactly-sized octets",
);
let p = octs.as_mut_ptr() as *mut Self;
assert!(
p.is_aligned(),
"cannot construct reference from unaligned octets",
);
unsafe { &mut *p }
}
#[inline]
#[must_use]
fn oned() -> Self
where
Self: Sized,
{
let mut this = MaybeUninit::<Self>::uninit();
this.make_oned();
unsafe { this.assume_init() }
}
#[inline]
fn make_oned(&mut self) {
let len = size_of_val(self);
let ptr = &raw mut *self as *mut u8;
unsafe { ptr.write_bytes(0b11111111, len) };
}
}
unsafe impl<T: FromOcts, const N: usize> FromOcts for [T; N] {}
#[cfg(target_has_atomic = "128")]
unsafe impl FromOcts for AtomicI128 {}
#[cfg(target_has_atomic = "16")]
unsafe impl FromOcts for AtomicI16 {}
#[cfg(target_has_atomic = "32")]
unsafe impl FromOcts for AtomicI32 {}
#[cfg(target_has_atomic = "64")]
unsafe impl FromOcts for AtomicI64 {}
#[cfg(target_has_atomic = "8")]
unsafe impl FromOcts for AtomicI8 {}
#[cfg(target_has_atomic = "128")]
unsafe impl FromOcts for AtomicU128 {}
#[cfg(target_has_atomic = "16")]
unsafe impl FromOcts for AtomicU16 {}
#[cfg(target_has_atomic = "32")]
unsafe impl FromOcts for AtomicU32 {}
#[cfg(target_has_atomic = "64")]
unsafe impl FromOcts for AtomicU64 {}
#[cfg(target_has_atomic = "8")]
unsafe impl FromOcts for AtomicU8 {}
unsafe impl<T: FromOcts> FromOcts for Cell<T> {}
#[cfg(feature = "f128")]
unsafe impl FromOcts for f128 {}
#[cfg(feature = "f16")]
unsafe impl FromOcts for f16 {}
unsafe impl FromOcts for f32 {}
unsafe impl FromOcts for f64 {}
unsafe impl FromOcts for i128 {}
unsafe impl FromOcts for i16 {}
unsafe impl FromOcts for i32 {}
unsafe impl FromOcts for i64 {}
unsafe impl FromOcts for i8 {}
unsafe impl FromOcts for isize {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m128 {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m128 {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m128bh {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m128bh {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m128d {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m128d {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m128i {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m128i {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m256 {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m256 {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m256bh {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m256bh {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m256d {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m256d {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m256i {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m256i {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m512 {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m512 {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m512bh {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m512bh {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m512d {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m512d {}
#[cfg(target_arch = "x86")]
unsafe impl FromOcts for __m512i {}
#[cfg(target_arch = "x86_64")]
unsafe impl FromOcts for __m512i {}
unsafe impl<T: FromOcts> FromOcts for ManuallyDrop<T> {}
unsafe impl<T: FromOcts> FromOcts for MaybeUninit<T> {}
unsafe impl<T> FromOcts for Option<NonNull<T>> {}
unsafe impl FromOcts for Option<NonZero<i128>> {}
unsafe impl FromOcts for Option<NonZero<i16>> {}
unsafe impl FromOcts for Option<NonZero<i32>> {}
unsafe impl FromOcts for Option<NonZero<i64>> {}
unsafe impl FromOcts for Option<NonZero<i8>> {}
unsafe impl FromOcts for Option<NonZero<isize>> {}
unsafe impl FromOcts for Option<NonZero<u128>> {}
unsafe impl FromOcts for Option<NonZero<u16>> {}
unsafe impl FromOcts for Option<NonZero<u32>> {}
unsafe impl FromOcts for Option<NonZero<u64>> {}
unsafe impl FromOcts for Option<NonZero<u8>> {}
unsafe impl FromOcts for Option<NonZero<usize>> {}
unsafe impl<T: ?Sized> FromOcts for PhantomData<T> {}
unsafe impl FromOcts for PhantomPinned {}
unsafe impl<T: FromOcts> FromOcts for Reverse<T> {}
unsafe impl<T: FromOcts> FromOcts for Saturating<T> {}
unsafe impl<T: FromOcts> FromOcts for [T] {}
unsafe impl FromOcts for str {}
#[cfg_attr(feature = "unstable_docs", doc(fake_variadic))]
unsafe impl<T: FromOcts> FromOcts for (T,) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T, T, T, T, T) {}
#[doc(hidden)]
unsafe impl<T: FromOcts> FromOcts for (T, T, T, T, T, T, T, T, T, T, T, T) {}
unsafe impl FromOcts for u128 {}
unsafe impl FromOcts for u16 {}
unsafe impl FromOcts for u32 {}
unsafe impl FromOcts for u64 {}
unsafe impl FromOcts for u8 {}
unsafe impl FromOcts for () {}
unsafe impl<T: FromOcts> FromOcts for UnsafeCell<T> {}
unsafe impl FromOcts for usize {}
unsafe impl<T: FromOcts> FromOcts for Wrapping<T> {}