diff options
| author | tgschultz <tgschultz@gmail.com> | 2020-12-22 14:30:48 +0000 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2020-12-23 01:27:12 +0200 |
| commit | ab6183e11999f3d1dbc1e9dca091cd1411256323 (patch) | |
| tree | d4a4fe8a0d5d4e0dc7b8057d21d0784c9b44102e /lib/std | |
| parent | cb3198af2af2501c1caf04228736d0b94a371f97 (diff) | |
| download | zig-ab6183e11999f3d1dbc1e9dca091cd1411256323.tar.gz zig-ab6183e11999f3d1dbc1e9dca091cd1411256323.zip | |
Added std.io.counting_reader
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/io.zig | 2 | ||||
| -rw-r--r-- | lib/std/io/counting_reader.zig | 48 |
2 files changed, 50 insertions, 0 deletions
diff --git a/lib/std/io.zig b/lib/std/io.zig index feeab08804..103c443dd6 100644 --- a/lib/std/io.zig +++ b/lib/std/io.zig @@ -143,6 +143,8 @@ pub const cOutStream = cWriter; pub const CountingWriter = @import("io/counting_writer.zig").CountingWriter; pub const countingWriter = @import("io/counting_writer.zig").countingWriter; +pub const CountingReader = @import("io/counting_reader.zig").CountingReader; +pub const countingReader = @import("io/counting_reader.zig").countingReader; /// Deprecated: use `CountingWriter` pub const CountingOutStream = CountingWriter; /// Deprecated: use `countingWriter` diff --git a/lib/std/io/counting_reader.zig b/lib/std/io/counting_reader.zig new file mode 100644 index 0000000000..09a624952f --- /dev/null +++ b/lib/std/io/counting_reader.zig @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2015-2020 Zig Contributors +// This file is part of [zig](https://ziglang.org/), which is MIT licensed. +// The MIT license requires this copyright notice to be included in all copies +// and substantial portions of the software. +const std = @import("../std.zig"); +const io = std.io; +const testing = std.testing; + +/// A Reader that counts how many bytes has been read from it. +pub fn CountingReader(comptime ReaderType: anytype) type { + return struct { + child_reader: ReaderType, + bytes_read: u64 = 0, + + pub const Error = ReaderType.Error; + pub const Reader = io.Reader(*@This(), Error, read); + + pub fn read(self: *@This(), buf: []u8) Error!usize { + const amt = try self.child_reader.read(buf); + self.bytes_read += amt; + return amt; + } + + pub fn reader(self: *@This()) Reader { + return .{ .context = self }; + } + }; +} + +pub fn countingReader(reader: anytype) CountingReader(@TypeOf(reader)) { + return .{ .child_reader = reader, }; +} + +test "io.CountingReader" { + const bytes = "yay" ** 100; + var fbs = io.fixedBufferStream(bytes); + + var counting_stream = countingReader(fbs.reader()); + const stream = counting_stream.reader(); + + //read and discard all bytes + while(stream.readByte()) |_| {} else |err| { + testing.expect(err == error.EndOfStream); + } + + testing.expect(counting_stream.bytes_read == bytes.len); +}
\ No newline at end of file |
