use crate::integer_polynomial::arithmetic::coefficient::PolynomialCoefficient;
use crate::integer_polynomial::arithmetic::vec::small_values;
use crate::platform::{SignedDoubleLimb, SignedLimb};
use alloc::vec;
use alloc::vec::Vec;
use malachite_base::num::basic::signeds::PrimitiveSigned;
use malachite_base::num::conversion::traits::ExactFrom;
pub(crate) fn mul_truncated_to_out_tiny<
T: PrimitiveSigned + From<SignedLimb>,
C: PolynomialCoefficient + ExactFrom<T>,
>(
out: &mut [C],
xs: &[C],
ys: &[C],
) {
let n = out.len();
let ys: Vec<T> = small_values(&ys[..ys.len().min(n)]);
let mut res = vec![T::ZERO; n];
for (i, x) in small_values::<T, _>(&xs[..xs.len().min(n)])
.into_iter()
.enumerate()
{
if x != T::ZERO {
for (r, &y) in res[i..].iter_mut().zip(&ys) {
if y != T::ZERO {
*r += x * y;
}
}
}
}
for (o, r) in out.iter_mut().zip(res) {
*o = C::exact_from(r);
}
}
crate_test_fn! {
#[inline]
mul_truncated_to_out_tiny_1<C: PolynomialCoefficient>(out: &mut [C], xs: &[C], ys: &[C]) {
mul_truncated_to_out_tiny::<SignedLimb, C>(out, xs, ys);
}}
crate_test_fn! {
#[inline]
mul_truncated_to_out_tiny_2<C: PolynomialCoefficient>(out: &mut [C], xs: &[C], ys: &[C]) {
mul_truncated_to_out_tiny::<SignedDoubleLimb, C>(out, xs, ys);
}}