{"version":3,"sources":["../../../../../src/classes/ribbon/codecs/utils/bits.ts"],"sourcesContent":["const MAX_BITS = Number.MAX_SAFE_INTEGER.toString(2).length;\n\nexport class Bits {\n  public buffer: Buffer;\n  private _length: number;\n  private _offset: number;\n\n  constructor(t: number | Buffer) {\n    if (typeof t === \"number\") {\n      this.buffer = Buffer.alloc(Math.ceil(t / 8));\n    } else if (t instanceof Buffer) {\n      this.buffer = t;\n    } else {\n      throw new TypeError(\n        \"Initialize by specifying a bit-length or referencing a Buffer\"\n      );\n    }\n    this._length = this.buffer.length * 8;\n    this._offset = 0;\n  }\n\n  static alloc(t: number, r?: number, n?: number): Bits {\n    return new Bits(Buffer.alloc(t, r ?? 0, n as BufferEncoding | undefined));\n  }\n\n  static from(t: any, r?: number, n?: number): Bits {\n    return new Bits(Buffer.from(t, r, n));\n  }\n\n  get eof(): boolean {\n    return this._offset === this._length;\n  }\n\n  get length(): number {\n    return this._length;\n  }\n\n  get offset(): number {\n    return this._offset;\n  }\n\n  set offset(t: number) {\n    if (t < 0) {\n      throw new RangeError(\"Cannot set offset below 0\");\n    }\n    if (t > this._length) {\n      throw new RangeError(\n        `Cannot set offset to ${t}, buffer length is ${this._length}`\n      );\n    }\n    this._offset = Math.floor(t);\n  }\n\n  get remaining(): number {\n    return this._length - this._offset;\n  }\n\n  clear(t: number = 0): this {\n    this.buffer.fill(t);\n    this._offset = 0;\n    return this;\n  }\n\n  clearBit(t: number): this {\n    this.insert(0, 1, t);\n    return this;\n  }\n\n  flipBit(t: number): number {\n    const result = this.peek(1, t) ^ 1;\n    this.modifyBit(result, t);\n    return result;\n  }\n\n  getBit(t: number): number {\n    return this.peek(1, t);\n  }\n\n  insert(val: number, bits: number = 1, pos?: number): number {\n    let r = typeof pos === \"number\" ? pos | 0 : this._offset;\n    if (r + bits > this._length) {\n      throw new RangeError(\n        `Cannot write ${bits} bits, only ${this.remaining} bit(s) left`\n      );\n    }\n    if (bits > MAX_BITS) {\n      throw new RangeError(`Cannot write ${bits} bits, max is ${MAX_BITS}`);\n    }\n    let i = bits;\n    while (i > 0) {\n      const byteIndex = r >> 3;\n      const bitIndex = r & 7;\n      const o = Math.min(8 - bitIndex, i);\n      const mask = (1 << o) - 1;\n      const shift = 8 - o - bitIndex;\n      const u = ((val >>> (i - o)) & mask) << shift;\n      this.buffer[byteIndex] = (this.buffer[byteIndex] & ~(mask << shift)) | u;\n      r += o;\n      i -= o;\n    }\n    return r;\n  }\n\n  modifyBit(val: number, pos: number): number {\n    this.insert(val, 1, pos);\n    return val;\n  }\n\n  peek(bits: number = 1, pos?: number): number {\n    let e = typeof pos === \"number\" ? pos | 0 : this._offset;\n    if (e + bits > this._length) {\n      throw new RangeError(\n        `Cannot read ${bits} bits, only ${this.remaining} bit(s) left`\n      );\n    }\n    if (bits > MAX_BITS) {\n      throw new RangeError(\n        `Reading ${bits} bits would overflow result, max is ${MAX_BITS}`\n      );\n    }\n    const bitOffset = e & 7;\n    const i = Math.min(8 - bitOffset, bits);\n    const mask = (1 << i) - 1;\n    let s = (this.buffer[e >> 3] >> (8 - i - bitOffset)) & mask;\n    e += i;\n    let remainingBits = bits - i;\n    while (remainingBits >= 8) {\n      s <<= 8;\n      s |= this.buffer[e >> 3];\n      e += 8;\n      remainingBits -= 8;\n    }\n    if (remainingBits > 0) {\n      const shift = 8 - remainingBits;\n      s <<= remainingBits;\n      s |= (this.buffer[e >> 3] >> shift) & (255 >> shift);\n    }\n    return s;\n  }\n\n  read(bits: number = 1): number {\n    const val = this.peek(bits, this._offset);\n    this._offset += bits;\n    return val;\n  }\n\n  seek(t: number, mode: number = 1): this {\n    switch (mode) {\n      case 2:\n        this.offset = this._offset + t;\n        break;\n      case 3:\n        this.offset = this.length - t;\n        break;\n      default:\n        this.offset = t;\n    }\n    return this;\n  }\n\n  setBit(t: number): this {\n    this.insert(1, 1, t);\n    return this;\n  }\n\n  skip(t: number): this {\n    return this.seek(t, 2);\n  }\n\n  testBit(t: number): boolean {\n    return !!this.peek(1, t);\n  }\n\n  toString(encoding: BufferEncoding = \"utf8\"): string {\n    return this.buffer.toString(encoding);\n  }\n\n  write(val: number, bits: number = 1): this {\n    this._offset = this.insert(val, bits, this._offset);\n    return this;\n  }\n}\n"],"names":["MAX_BITS","Number","MAX_SAFE_INTEGER","toString","length","Bits","buffer","_length","_offset","t","Buffer","alloc","Math","ceil","TypeError","r","n","from","eof","offset","RangeError","floor","remaining","clear","fill","clearBit","insert","flipBit","result","peek","modifyBit","getBit","val","bits","pos","i","byteIndex","bitIndex","o","min","mask","shift","u","e","bitOffset","s","remainingBits","read","seek","mode","setBit","skip","testBit","encoding","write"],"mappings":"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"}