use crate::{
Alignment, Length, PrimitiveUnsigned, SupportedLength, Vector, utils::transmute_generic,
};
type Signed<T> = <T as PrimitiveUnsigned>::Signed;
impl<const N: usize, T, A: Alignment> Vector<N, T, A>
where
Length<N>: SupportedLength,
T: PrimitiveUnsigned,
{
#[inline]
#[must_use]
pub const fn cast_signed(self) -> Vector<N, Signed<T>, A> {
if const { size_of::<Vector<N, T, A>>() == size_of::<Vector<N, Signed<T>, A>>() } {
unsafe { transmute_generic::<Vector<N, T, A>, Vector<N, Signed<T>, A>>(self) }
} else {
Vector::from_array(unsafe {
transmute_generic::<[T; N], [Signed<T>; N]>(self.to_array())
})
}
}
}
#[cfg(test)]
mod tests {
use crate::{Vec3A, test_utils::for_types};
#[test]
fn test_cast_signed() {
for_types!(|T: PrimitiveUnsigned| {
let vector = Vec3A::<T>::new(1, T::MAX / 2, T::MAX);
assert_eq!(vector.cast_signed(), vector.map(T::cast_signed));
});
}
}