| author | |
| committer | |
| log | 86699acbb951ceed3ecdd3bd93a00ceb02028361 |
| tree | 772b69fba09b04071a840ddfdedcdd3ed0da249b |
| parent | b7d7446fbbfc35f291ffb641470233a7a9e18b9b |
2 files changed, 11 insertions(+), 29 deletions(-)
lib/std/Io/Reader.zig+5-25| ... | @@ -1702,33 +1702,13 @@ fn failingDiscard(r: *Reader, limit: Limit) Error!usize { | ... | @@ -1702,33 +1702,13 @@ fn failingDiscard(r: *Reader, limit: Limit) Error!usize { |
| 1702 | } | 1702 | } |
| 1703 | 1703 | ||
| 1704 | test "readAlloc when the backing reader provides one byte at a time" { | 1704 | test "readAlloc when the backing reader provides one byte at a time" { |
| 1705 | const OneByteReader = struct { | ||
| 1706 | str: []const u8, | ||
| 1707 | i: usize, | ||
| 1708 | reader: Reader, | ||
| 1709 | |||
| 1710 | fn stream(r: *Reader, w: *Writer, limit: Limit) StreamError!usize { | ||
| 1711 | assert(@intFromEnum(limit) >= 1); | ||
| 1712 | const self: *@This() = @fieldParentPtr("reader", r); | ||
| 1713 | if (self.str.len - self.i == 0) return error.EndOfStream; | ||
| 1714 | try w.writeByte(self.str[self.i]); | ||
| 1715 | self.i += 1; | ||
| 1716 | return 1; | ||
| 1717 | } | ||
| 1718 | }; | ||
| 1719 | const str = "This is a test"; | 1705 | const str = "This is a test"; |
| 1720 | var tiny_buffer: [1]u8 = undefined; | 1706 | var tiny_buffer: [1]u8 = undefined; |
| 1721 | var one_byte_stream: OneByteReader = .{ | 1707 | var one_byte_stream: testing.Reader = .init(&tiny_buffer, &.{ |
| 1722 | .str = str, | 1708 | .{ .buffer = str }, |
| 1723 | .i = 0, | 1709 | }); |
| 1724 | .reader = .{ | 1710 | one_byte_stream.artificial_limit = .limited(1); |
| 1725 | .buffer = &tiny_buffer, | 1711 | const res = try one_byte_stream.interface.allocRemaining(std.testing.allocator, .unlimited); |
| 1726 | .vtable = &.{ .stream = OneByteReader.stream }, | ||
| 1727 | .seek = 0, | ||
| 1728 | .end = 0, | ||
| 1729 | }, | ||
| 1730 | }; | ||
| 1731 | const res = try one_byte_stream.reader.allocRemaining(std.testing.allocator, .unlimited); | ||
| 1732 | defer std.testing.allocator.free(res); | 1712 | defer std.testing.allocator.free(res); |
| 1733 | try std.testing.expectEqualStrings(str, res); | 1713 | try std.testing.expectEqualStrings(str, res); |
| 1734 | } | 1714 | } |
lib/std/testing.zig+6-4| ... | @@ -1207,12 +1207,14 @@ pub inline fn fuzz( | ... | @@ -1207,12 +1207,14 @@ pub inline fn fuzz( |
| 1207 | return @import("root").fuzz(context, testOne, options); | 1207 | return @import("root").fuzz(context, testOne, options); |
| 1208 | } | 1208 | } |
| 1209 | 1209 | ||
| 1210 | /// A `std.io.Reader` that writes a predetermined list of buffers during `stream`. | 1210 | /// A `std.Io.Reader` that writes a predetermined list of buffers during `stream`. |
| 1211 | pub const Reader = struct { | 1211 | pub const Reader = struct { |
| 1212 | calls: []const Call, | 1212 | calls: []const Call, |
| 1213 | interface: std.io.Reader, | 1213 | interface: std.Io.Reader, |
| 1214 | next_call_index: usize, | 1214 | next_call_index: usize, |
| 1215 | next_offset: usize, | 1215 | next_offset: usize, |
| 1216 | /// Further reduces how many bytes are written in each `stream` call. | ||
| 1217 | artificial_limit: std.Io.Limit = .unlimited, | ||
| 1216 | 1218 | ||
| 1217 | pub const Call = struct { | 1219 | pub const Call = struct { |
| 1218 | buffer: []const u8, | 1220 | buffer: []const u8, |
| ... | @@ -1232,11 +1234,11 @@ pub const Reader = struct { | ... | @@ -1232,11 +1234,11 @@ pub const Reader = struct { |
| 1232 | }; | 1234 | }; |
| 1233 | } | 1235 | } |
| 1234 | 1236 | ||
| 1235 | fn stream(io_r: *std.io.Reader, w: *std.io.Writer, limit: std.io.Limit) std.io.Reader.StreamError!usize { | 1237 | fn stream(io_r: *std.Io.Reader, w: *std.Io.Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize { |
| 1236 | const r: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); | 1238 | const r: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); |
| 1237 | if (r.calls.len - r.next_call_index == 0) return error.EndOfStream; | 1239 | if (r.calls.len - r.next_call_index == 0) return error.EndOfStream; |
| 1238 | const call = r.calls[r.next_call_index]; | 1240 | const call = r.calls[r.next_call_index]; |
| 1239 | const buffer = limit.sliceConst(call.buffer[r.next_offset..]); | 1241 | const buffer = r.artificial_limit.sliceConst(limit.sliceConst(call.buffer[r.next_offset..])); |
| 1240 | const n = try w.write(buffer); | 1242 | const n = try w.write(buffer); |
| 1241 | r.next_offset += n; | 1243 | r.next_offset += n; |
| 1242 | if (call.buffer.len - r.next_offset == 0) { | 1244 | if (call.buffer.len - r.next_offset == 0) { |