use crate::utils;
pub fn add(base: u16, numb1: &[u16], numb2: &[u16]) -> Vec<u16> {
let ne1 = numb1[0] == 1;
let ne2 = numb2[0] == 1;
let numb1 = abs(numb1);
let numb2 = abs(numb2);
if !ne1 && !ne2 {
let mut digits = utils::add(base, &numb1, &numb2);
digits.insert(0, 0);
digits
} else if ne1 && ne2 {
let mut digits = utils::add(base, &numb1, &numb2);
digits.insert(0, 1);
digits
} else if !ne1 && ne2 && utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb1, &numb2);
digits.insert(0, 0);
digits
} else if !ne1 && ne2 && !utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb2, &numb1);
digits.insert(0, 1);
digits
} else if ne1 && !ne2 && utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb1, &numb2);
digits.insert(0, 1);
digits
} else if ne1 && !ne2 && !utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb2, &numb1);
digits.insert(0, 0);
digits
} else {
unreachable!();
}
}
pub fn subtract(base: u16, numb1: &[u16], numb2: &[u16]) -> Vec<u16> {
let ne1 = numb1[0] == 1;
let ne2 = numb2[0] == 1;
let numb1 = abs(numb1);
let numb2 = abs(numb2);
if !ne1 && !ne2 && utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb1, &numb2);
digits.insert(0, 0);
digits
} else if !ne1 && !ne2 && !utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb2, &numb1);
digits.insert(0, 1);
digits
} else if ne1 && !ne2 {
let mut digits = utils::add(base, &numb1, &numb2);
digits.insert(0, 1);
digits
} else if !ne1 && ne2 {
let mut digits = utils::add(base, &numb1, &numb2);
digits.insert(0, 0);
digits
} else if ne1 && ne2 && utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb1, &numb2);
digits.insert(0, 1);
digits
} else if ne1 && ne2 && !utils::greater_than(&numb1, &numb2) {
let mut digits = utils::subtract(base, &numb2, &numb1);
digits.insert(0, 0);
digits
} else {
unreachable!()
}
}
pub fn div(base: u16, numb1: &[u16], numb2: &[u16]) -> (Vec<u16>, Vec<u16>) {
let ne1 = numb1[0] == 1;
let ne2 = numb2[0] == 1;
let numb1 = abs(numb1);
let numb2 = abs(numb2);
if (ne1 && ne2) || (!ne1 && !ne2) {
let (mut quotient, mut remainder) = utils::div(base, &numb1, &numb2);
quotient.insert(0, 0);
remainder.insert(0, 0);
(quotient, remainder)
} else if (ne1 && !ne2) || (!ne1 && ne2) {
let (mut qoutient, mut remainder) = utils::div(base, &numb1, &numb2);
qoutient.insert(0, 1);
remainder.insert(0, 1);
(qoutient, remainder)
} else {
unreachable!()
}
}
pub fn mul(base: u16, numb1: &[u16], numb2: &[u16]) -> Vec<u16> {
let ne1 = numb1[0] == 1;
let ne2 = numb2[0] == 1;
let numb1 = abs(numb1);
let numb2 = abs(numb2);
if (ne1 && ne2) || (!ne1 && !ne2) {
let mut digits = utils::mul(base, &numb1, &numb2);
digits.insert(0, 0);
digits
} else if (!ne1 && ne2) || (ne1 && !ne2) {
let mut digits = utils::mul(base, &numb1, &numb2);
digits.insert(0, 1);
digits
} else {
unreachable!()
}
}
pub fn abs_greater_than(numb1: &[u16], numb2: &[u16]) -> bool {
let numb1 = abs(numb1);
let numb2 = abs(numb2);
utils::greater_than(&numb1, &numb2)
}
pub fn trim_base_vec(vec: &mut Vec<u16>) -> Vec<u16> {
let positive = vec[0] == 0;
let mut digits = utils::trim_base_vec(vec);
if positive {
digits.insert(0, 0);
}
digits
}
pub fn abs(number: &[u16]) -> Vec<u16> {
let mut number = number.to_owned();
number.remove(0);
number
}