use crate::bint::{intrinsics::_transmute, Int, UInt};
use core::ptr;
#[allow(unsafe_code)]
#[inline(always)]
pub const unsafe fn transmute<const N: usize, const M: usize>(v: Int<N>) -> Int<M> {
let bits = v.to_bits();
let src_digits = bits.digits();
let digits = if N <= M {
if v.is_negative() {
let mut digits = *(UInt::<M>::MAX.digits());
ptr::copy_nonoverlapping(src_digits.as_ptr(), digits.as_mut_ptr(), N);
digits
} else {
_transmute::<N, M, N>(src_digits)
}
} else {
debug_assert!(v.last_digit_index() < M);
debug_assert!(v.bits() <= Int::<M>::BITS);
_transmute::<N, M, M>(src_digits)
};
Int::from_digits(digits)
}