import BitArray from './BitArray.js'; export default class MultiBitArray { private readonly bitArray: BitArray; private readonly bitsPerEntry: number; private constructor(buffer: Buffer, bitsPerEntry: number) { this.bitArray = new BitArray(buffer); this.bitsPerEntry = bitsPerEntry; } static fromBuffer(buffer: Buffer, bitsPerEntry: number): MultiBitArray { if (!Number.isInteger(bitsPerEntry) || bitsPerEntry < 1) { throw new Error('Bits must be an integer >= 1'); } if ((bitsPerEntry & (bitsPerEntry - 1)) !== 0) { throw new Error('Bits must be a power of 2'); } return new MultiBitArray(buffer, bitsPerEntry); } private getBitOffset(index: number): number { return index * this.bitsPerEntry; } get(index: number): number { const offset = this.getBitOffset(index); let value = 0; for (let i = 0; i < this.bitsPerEntry; i++) { const bit = this.bitArray.get(offset + i); value |= bit << i; } return value; } set(index: number, value: number): void { const offset = this.getBitOffset(index); for (let i = 0; i < this.bitsPerEntry; i++) { const bit = (value >> i) & 1; if (bit === 1) { this.bitArray.set(offset + i); } else { this.bitArray.unset(offset + i); } } } unset(index: number): void { const offset = this.getBitOffset(index); for (let i = 0; i < this.bitsPerEntry; i++) { this.bitArray.unset(offset + i); } } toArray(): Uint8Array { return this.bitArray.toArray(); } }