From 3750cc06fda89c076da850a430d39d959ce45a99 Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Wed, 26 Aug 2020 19:50:46 +0200 Subject: [PATCH] Improve io.Reader.skipBytes and add tests --- lib/std/io/reader.zig | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/std/io/reader.zig b/lib/std/io/reader.zig index 07327a431d..2ab799046a 100644 --- a/lib/std/io/reader.zig +++ b/lib/std/io/reader.zig @@ -231,10 +231,20 @@ pub fn Reader( return mem.readVarInt(ReturnType, bytes, endian); } - pub fn skipBytes(self: Self, num_bytes: u64) !void { - var i: u64 = 0; - while (i < num_bytes) : (i += 1) { - _ = try self.readByte(); + /// Optional parameters for `skipBytes` + pub const SkipBytesOptions = struct { + buf_size: usize = 512, + }; + + /// Reads `num_bytes` bytes from the stream and discards them + pub fn skipBytes(self: Self, num_bytes: usize, comptime options: SkipBytesOptions) !void { + var buf: [options.buf_size]u8 = undefined; + var remaining = num_bytes; + + while (remaining > 0) { + const amt = std.math.min(remaining, options.buf_size); + try self.readNoEof(buf[0..amt]); + remaining -= amt; } } @@ -298,3 +308,11 @@ test "Reader.isBytes" { testing.expectEqual(true, try reader.isBytes("foo")); testing.expectEqual(false, try reader.isBytes("qux")); } + +test "Reader.skipBytes" { + const reader = std.io.fixedBufferStream("foobar").reader(); + try reader.skipBytes(3, .{}); + testing.expect(try reader.isBytes("bar")); + try reader.skipBytes(0, .{}); + testing.expectError(error.EndOfStream, reader.skipBytes(1, .{})); +}