| ... | ... | @@ -373,6 +373,25 @@ pub fn LinearFifo( |
| 373 | 373 | } |
| 374 | 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 | } |
| 378 | 397 | |
| ... | ... | @@ -451,6 +470,15 @@ test "LinearFifo(u8, .Dynamic)" { |
| 451 | 470 | testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); |
| 452 | 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 | } |
| 455 | 483 | |
| 456 | 484 | test "LinearFifo" { |