/** * @import { Num } from "./num.js" */ import { kBuffer } from "./num.js"; import { add16B } from "./add/16B.js" import { add8B } from "./add/8B.js"; import { add2B } from "./add/2B.js"; import { add10B } from "./add/10B.js"; import { size16, size8, size2, size10 } from "./alloc.js" /** * @param { Num } a * @param { Num } b */ export function add16(a, b) { let carry = false; const { [kBuffer]: b1 } = a; const { [kBuffer]: b2 } = b; for (let i = 0; i < size16; i++) ([b1[i], carry] = add16B(b1[i], b2[i], carry)); } /** * @param { Num } a * @param { Num } b */ export function add8(a, b) { let carry = false; const { [kBuffer]: b1 } = a; const { [kBuffer]: b2 } = b; for (let i = 0; i < size8; i++) ([b1[i], carry] = add8B(b1[i], b2[i], carry)); } /** * @param { Num } a * @param { Num } b */ export function add2(a, b) { let carry = false; const { [kBuffer]: b1 } = a; const { [kBuffer]: b2 } = b; for (let i = 0; i < size2; i++) ([b1[i], carry] = add2B(b1[i], b2[i], carry)); } /** * @param { Num } a * @param { Num } b */ export function add10(a, b) { let carry = false; const { [kBuffer]: b1 } = a; const { [kBuffer]: b2 } = b; for (let i = 0; i < size10; i++) ([b1[i], carry] = add10B(b1[i], b2[i], carry)); } /** * @param { Num } a * @param { Num } b */ export function add(a, b) { if (a.radix !== b.radix) throw new Error(`numbers must have same radix`); switch (a.radix) { case 2: return add2(a, b); case 8: return add8(a, b); case 16: return add16(a, b); case 10: return add10(a, b); default: throw new Error(`unsupported radix (${a.radix})`); } }