pub fn writeVbr(self: *BcWriter, value: anytype, comptime vbr_bits: usize) Error!void self: *BcWritervaluevbr_bits: usizeOutOfMemory91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 pub fn writeVbr(self: *BcWriter, value: anytype, comptime vbr_bits: usize) Error!void {
comptime {
std.debug.assert(vbr_bits > 1);
if (@bitSizeOf(@TypeOf(value)) > 64) @compileError("Unsupported VBR block type: " ++ @typeName(@TypeOf(value)));
}
var in_buffer = bufValue(value, vbr_bits);
const continue_bit = @as(@TypeOf(in_buffer), 1) << @intCast(vbr_bits - 1);
const mask = continue_bit - 1;
// If input is larger than one VBR block can store
// then store vbr_bits - 1 bits and a continue bit
while (in_buffer > mask) {
try self.writeBits(in_buffer & mask | continue_bit, vbr_bits);
in_buffer >>= @intCast(vbr_bits - 1);
}
// Store remaining bits
try self.writeBits(in_buffer, vbr_bits);
}