use crate::integer_polynomial::arithmetic::coefficient::PolynomialCoefficient;
use crate::integer_polynomial::arithmetic::mul_truncated::classical::product_coefficient;
use crate::integer_polynomial::arithmetic::square_truncated::classical::square_coefficient;
use core::ptr;
crate_test_fn! {mul_middle_to_out_classical<C: PolynomialCoefficient>(
out: &mut [C],
xs: &[C],
ys: &[C],
nlo: usize,
nhi: usize,
) {
assert_ne!(xs.len(), 0);
assert_ne!(ys.len(), 0);
assert!(nlo < nhi);
assert!(nhi < xs.len() + ys.len());
if xs.len() == 1 {
C::vec_mul_scalar_to_out(out, &ys[nlo..nhi], &xs[0]);
} else if ys.len() == 1 {
C::vec_mul_scalar_to_out(out, &xs[nlo..nhi], &ys[0]);
} else if ptr::eq(xs, ys) {
for (o, i) in out.iter_mut().zip(nlo..nhi) {
*o = square_coefficient(xs, i);
}
} else {
for (o, i) in out.iter_mut().zip(nlo..nhi) {
*o = product_coefficient(xs, ys, i);
}
}
}}