fn rebase(r: *Reader, capacity: usize) void r: *Readercapacity: usize127
128
129
130
131
132
133
134
135
136
137
138
139fn rebase(r: *Reader, capacity: usize) void {
const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
// `capacity` must fit in the buffer along with the required sliding window
assert(capacity <= r.buffer.len - d.window_len);
// According to the vtable contract, this function will only be called if the free space in the
// buffer cannot already fit `capacity` bytes
assert(r.end + capacity > r.buffer.len);
const discard_n = @min(r.seek, r.end - d.window_len);
const keep = r.buffer[discard_n..r.end];
@memmove(r.buffer[0..keep.len], keep);
r.end = keep.len;
r.seek -= discard_n;
}
Rebase the buffer, keeping at least the sliding window (
d.window_lenbytes) buffered