Function writeSplatAll [src]
The data parameter is mutable because this function needs to mutate the
fields in order to handle partial writes from VTable.writeSplat.
data will be restored to its original state before returning.
Prototype
pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void
Parameters
w: *Writer
data: [][]const u8
splat: usize
Possible Errors
See the Writer
implementation for detailed diagnostics.
Example
test writeSplatAll {
var aw: Writer.Allocating = .init(testing.allocator);
defer aw.deinit();
var buffers = [_][]const u8{ "ba", "na" };
try aw.writer.writeSplatAll(&buffers, 2);
try testing.expectEqualStrings("banana", aw.writer.buffered());
}
Source
pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {
var index: usize = 0;
var truncate: usize = 0;
while (index + 1 < data.len) {
{
const untruncated = data[index];
data[index] = untruncated[truncate..];
defer data[index] = untruncated;
truncate += try w.writeSplat(data[index..], splat);
}
while (truncate >= data[index].len and index + 1 < data.len) {
truncate -= data[index].len;
index += 1;
}
}
// Deal with any left over splats
if (data.len != 0 and truncate < data[index].len * splat) {
assert(index == data.len - 1);
var remaining_splat = splat;
while (true) {
remaining_splat -= truncate / data[index].len;
truncate %= data[index].len;
if (remaining_splat == 0) break;
truncate += try w.writeSplat(&.{ data[index][truncate..], data[index] }, remaining_splat - 1);
}
}
}