authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-09-27 14:43:44+10:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-09-27 14:43:44+10:00
loga1abbb8eac4c73d1235a03579ee228ed48b56f9f
tree29459d9ca69e9b9962bb38fadd72f32e7699f184
parenta502604702726f3983f8a8b80bb73d9d5381baab
signaturelock-open Commit is signed but in an unrecognized format.

std: add LinearFifo(...).pump(src_reader, dest_writer)


1 files changed, 28 insertions(+), 0 deletions(-)

lib/std/fifo.zig+28
...@@ -373,6 +373,25 @@ pub fn LinearFifo(...@@ -373,6 +373,25 @@ pub fn LinearFifo(
373 }373 }
374 return self.buf[index];374 return self.buf[index];
375 }375 }
376
377 /// Pump data from a reader into a writer
378 /// stops when reader returns 0 bytes (EOF)
379 /// Buffer size must be set before calling; a buffer length of 0 is invalid.
380 pub fn pump(self: *Self, src_reader: anytype, dest_writer: anytype) !void {
381 assert(self.buf.len > 0);
382 while (true) {
383 if (self.writableLength() > 0) {
384 const n = try src_reader.read(self.writableSlice(0));
385 if (n == 0) break; // EOF
386 self.update(n);
387 }
388 self.discard(try dest_writer.write(self.readableSlice(0)));
389 }
390 // flush remaining data
391 while (self.readableLength() > 0) {
392 self.discard(try dest_writer.write(self.readableSlice(0)));
393 }
394 }
376 };395 };
377}396}
378397
...@@ -451,6 +470,15 @@ test "LinearFifo(u8, .Dynamic)" {...@@ -451,6 +470,15 @@ test "LinearFifo(u8, .Dynamic)" {
451 testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?);470 testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?);
452 testing.expectEqualSlices(u8, "test", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?);471 testing.expectEqualSlices(u8, "test", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?);
453 }472 }
473
474 {
475 try fifo.ensureCapacity(1);
476 var in_fbs = std.io.fixedBufferStream("pump test");
477 var out_buf: [50]u8 = undefined;
478 var out_fbs = std.io.fixedBufferStream(&out_buf);
479 try fifo.pump(in_fbs.reader(), out_fbs.writer());
480 testing.expectEqualSlices(u8, in_fbs.buffer, out_fbs.getWritten());
481 }
454}482}
455483
456test "LinearFifo" {484test "LinearFifo" {