import { Encoder, Packer } from "./serializer"; import { check } from "./system"; export function calcPackedVarUint32Length(val: u32): usize { let n: u32 = 0; while (true) { val >>= 7; n += 1; if (val <= 0) { break; } } return n; } export class VarInt32 implements Packer { pack(enc: Encoder): usize { check(false, "not implemented"); return 0; } unpack(data: u8[]): usize { return 0; } getSize(): usize { return 0; } } export class VarUint32 implements Packer { constructor( public n: u32 = 0, ){} pack(enc: Encoder): usize { let val = this.n; let result = new Array(); while (true) { let b = (val & 0x7f); val >>= 7; if (val > 0) { b |= (1 << 7); } result.push(b); if (val <= 0) { break; } } enc.writeBytes(result); return result.length; } unpack(val: u8[]): usize { let by: u32 = 0; let value: u32 = 0; let length: u32 = 0; for (let i=0; i(b & 0x7f) << by; by += 7; length += 1; if ((b & 0x80) == 0) { break; } } this.n = value; return length; } getSize(): usize { return calcPackedVarUint32Length(this.n); } @inline @operator('==') static eq(a: VarUint32, b: VarUint32): bool { return a.n == b.n; } }