import { S16_0, S16_1, S16_2, S16_3, S16_4, S16_5, S16_6, S16_7, S16_8, S16_9, S16_A, S16_B, S16_C, S16_D, S16_E, S16_F } from "./symbol/S16.js" import { S8_0, S8_1, S8_2, S8_3, S8_4, S8_5, S8_6, S8_7 } from "./symbol/S8.js" import { S2_0, S2_1 } from "./symbol/S2.js" import { S10_0, S10_1, S10_2, S10_3, S10_4, S10_5, S10_6, S10_7, S10_8, S10_9 } from "./symbol/S10.js" import { kBuffer, Num } from "./num.js" import { add16, add8, add2, add10 } from "./add.js" import { size16, size8, size2, size10 } from "./alloc.js" import { one10, one16, one2, one8 } from "./num.js" /** * @param { symbol } a */ function not16B(a) { switch (a) { case S16_0: return S16_F; case S16_1: return S16_E; case S16_2: return S16_D; case S16_3: return S16_C; case S16_4: return S16_B; case S16_5: return S16_A; case S16_6: return S16_9; case S16_7: return S16_8; case S16_8: return S16_7; case S16_9: return S16_6; case S16_A: return S16_5; case S16_B: return S16_4; case S16_C: return S16_3; case S16_D: return S16_2; case S16_E: return S16_1; case S16_F: return S16_0; default: throw new Error("unexpected symbol"); } } /** * @param { symbol } a */ function not8B(a) { switch (a) { case S8_0: return S8_7; case S8_1: return S8_6; case S8_2: return S8_5; case S8_3: return S8_4; case S8_4: return S8_3; case S8_5: return S8_2; case S8_6: return S8_1; case S8_7: return S8_0; default: throw new Error("unexpected symbol"); } } /** * @param { symbol } a */ function not2B(a) { switch (a) { case S2_0: return S2_1; case S2_1: return S2_0; default: throw new Error("unexpected symbol"); } } /** * @param { symbol } a */ function not10B(a) { switch (a) { case S10_0: return S10_9; case S10_1: return S10_8; case S10_2: return S10_7; case S10_3: return S10_6; case S10_4: return S10_5; case S10_5: return S10_4; case S10_6: return S10_3; case S10_7: return S10_2; case S10_8: return S10_1; case S10_9: return S10_0; default: throw new Error("unexpected symbol"); } } /** * @param { Num } a */ export function not16(a) { const { [kBuffer]: buff } = a; for (let i = 0; i < size16; i++) { buff[i] = not16B(buff[i]); } add16(a, one16); } /** * @param { Num } a */ export function not8(a) { const { [kBuffer]: buff } = a; for (let i = 0; i < size8; i++) { buff[i] = not8B(buff[i]); } add8(a, one8); } /** * @param { Num } a */ export function not2(a) { const { [kBuffer]: buff } = a; for (let i = 0; i < size2; i++) { buff[i] = not2B(buff[i]); } add2(a, one2); } /** * @param { Num } a */ export function not10(a) { const { [kBuffer]: buff } = a; for (let i = 0; i < size10; i++) { buff[i] = not10B(buff[i]); } add10(a, one10); } /** * @param { Num } a */ export function not(a) { switch (a.radix) { case 2: return not2(a); case 8: return not8(a); case 16: return not16(a); case 10: return not10(a); default: throw new Error(`unsupported radix (${a.radix})`); } }