diff --git a/lib/std/Io.zig b/lib/std/Io.zig index 00ff0cea98..a2263825d7 100644 --- a/lib/std/Io.zig +++ b/lib/std/Io.zig @@ -868,6 +868,7 @@ pub fn PollFiles(comptime StreamEnum: type) type { test { _ = Reader; + _ = Reader.Limited; _ = Writer; _ = @import("Io/bit_reader.zig"); _ = @import("Io/bit_writer.zig"); diff --git a/lib/std/Io/Reader.zig b/lib/std/Io/Reader.zig index 518fdf2568..3888cb1a89 100644 --- a/lib/std/Io/Reader.zig +++ b/lib/std/Io/Reader.zig @@ -99,7 +99,7 @@ pub const ShortError = error{ pub const failing: Reader = .{ .vtable = &.{ - .read = failingStream, + .stream = failingStream, .discard = failingDiscard, }, .buffer = &.{}, diff --git a/lib/std/Io/Reader/Limited.zig b/lib/std/Io/Reader/Limited.zig index 9476b97804..c2e9ee2f49 100644 --- a/lib/std/Io/Reader/Limited.zig +++ b/lib/std/Io/Reader/Limited.zig @@ -25,18 +25,34 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited { }; } -fn stream(context: ?*anyopaque, w: *Writer, limit: Limit) Reader.StreamError!usize { - const l: *Limited = @alignCast(@ptrCast(context)); +fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize { + const l: *Limited = @fieldParentPtr("interface", r); const combined_limit = limit.min(l.remaining); - const n = try l.unlimited_reader.read(w, combined_limit); + const n = try l.unlimited.stream(w, combined_limit); l.remaining = l.remaining.subtract(n).?; return n; } -fn discard(context: ?*anyopaque, limit: Limit) Reader.Error!usize { - const l: *Limited = @alignCast(@ptrCast(context)); +test stream { + var orig_buf: [10]u8 = undefined; + @memcpy(&orig_buf, "test bytes"); + var fixed: std.Io.Reader = .fixed(&orig_buf); + + var limit_buf: [1]u8 = undefined; + var limited: std.Io.Reader.Limited = .init(&fixed, @enumFromInt(4), &limit_buf); + + var result_buf: [10]u8 = undefined; + var fixed_writer: std.Io.Writer = .fixed(&result_buf); + const streamed = try limited.interface.stream(&fixed_writer, @enumFromInt(7)); + + try std.testing.expect(streamed == 4); + try std.testing.expectEqualStrings("test", result_buf[0..streamed]); +} + +fn discard(r: *Reader, limit: Limit) Reader.Error!usize { + const l: *Limited = @fieldParentPtr("interface", r); const combined_limit = limit.min(l.remaining); - const n = try l.unlimited_reader.discard(combined_limit); + const n = try l.unlimited.discard(combined_limit); l.remaining = l.remaining.subtract(n).?; return n; }