futureproof transmutation issues

This commit is contained in:
bendn 2024-05-18 20:55:27 +07:00
parent 293121e5f5
commit 2c9b749230
No known key found for this signature in database
GPG key ID: 0D9D3A2A3B2A93D6
4 changed files with 24 additions and 11 deletions

View file

@ -86,7 +86,7 @@
confusable_idents,
internal_features
)]
use std::{hint::assert_unchecked, num::NonZeroU32, ops::Range};
use std::{hint::assert_unchecked, intrinsics::transmute_unchecked, num::NonZeroU32, ops::Range};
mod affine;
#[cfg(feature = "blur")]
@ -448,6 +448,18 @@ impl<T, const CHANNELS: usize> Image<T, CHANNELS> {
self.buffer().as_ref().len()
}
/// Transforms the N
///
/// # Safety
///
/// i think you can see why this is a problem.
///
/// # WHY???
///
/// sometimes rust is silly with generics
unsafe fn trans<const N: usize>(self) -> Image<T, N> {
unsafe { transmute_unchecked(self) }
}
/// # Safety
///
/// the output index is not guaranteed to be in bounds

View file

@ -50,16 +50,17 @@ where
let (w, h) = fit((self.width(), self.height()));
macro_rules! n {
($n:literal) => {
transmute::<Image<Box<[u8]>, $n>, Image<Box<[u8]>, N>>(
transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref())
.scale::<scale::Nearest>(w, h),
)
self.as_ref()
.trans::<$n>()
.scale::<scale::Nearest>(w, h)
.trans::<N>()
};
(o $n:literal) => {
transmute::<Image<Box<[u8]>, 1>, Image<Box<[u8]>, N>>(
transmute::<Image<Vec<u8>, N>, Image<Vec<u8>, 1>>(self.as_ref().to_owned())
.scale::<scale::Nearest>(w, h),
)
self.as_ref()
.to_owned()
.trans::<1>()
.scale::<scale::Nearest>(w, h)
.trans::<N>()
};
}
// SAFETY: #[allow(clippy::undocumented_unsafe_blocks)]

View file

@ -42,7 +42,7 @@ where
($n:literal) => {
WritePng::write(
// SAFETY: ... i renounce traits
&unsafe { transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) },
&unsafe { self.as_ref().trans::<$n>() },
&mut d,
)
.unwrap()

View file

@ -45,7 +45,7 @@ impl<T: AsRef<[u8]>, const N: usize> Kitty<T, N> {
Cow::Owned(
<Image<Box<[u8]>, 3>>::from({
// SAFETY: ...
unsafe { transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) }
unsafe { self.as_ref().trans::<$n>() }
})
.take_buffer()
.to_vec(),