use crate::integer::Integer;
use crate::integer_polynomial::arithmetic::scalar_mul::integers_mul_scalar_to_out;
use core::cmp::max;
use malachite_base::num::arithmetic::traits::AddMulAssign;
use malachite_base::num::basic::traits::Zero;
crate_test_fn! {mul_high_to_out_classical(
out: &mut [Integer],
xs: &[Integer],
ys: &[Integer],
start: usize,
) {
let len1 = xs.len();
let len2 = ys.len();
out[..start].fill(Integer::ZERO);
if len1 == 1 && len2 == 1 {
if start == 0 {
out[0] = &xs[0] * &ys[0];
}
} else {
if start < len1 {
integers_mul_scalar_to_out(&mut out[start..len1], &xs[start..], &ys[0]);
}
let m = max(len1 - 1, start);
integers_mul_scalar_to_out(&mut out[m..], &ys[m + 1 - len1..], &xs[len1 - 1]);
let m = max(start, len2 - 1);
for i in m + 1 - len2..len1 - 1 {
let n = max(i + 1, start);
for (o, y) in out[n..].iter_mut().zip(&ys[n - i..]) {
o.add_mul_assign(y, &xs[i]);
}
}
}
}}