Skip to content

Commit 0f1f680

Browse files
committed
refactor: use concrete *std.Io.Reader and *std.Io.Writer types
Replace all anytype reader/writer parameters with concrete types *std.Io.Reader and *std.Io.Writer throughout the codebase. This leverages Zig 0.15's new IO system with buffers above vtables. Updated all pack/unpack functions, Packer/Unpacker types, and tests to use the new concrete types and updated API methods (takeByte, readSliceAll, etc.).
1 parent ac41fb4 commit 0f1f680

13 files changed

Lines changed: 575 additions & 591 deletions

File tree

src/any.zig

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub fn sizeOfPackedAny(comptime T: type, value: T) usize {
7575
@compileError("Unsupported type '" ++ @typeName(T) ++ "'");
7676
}
7777

78-
pub fn packAny(writer: anytype, value: anytype) !void {
78+
pub fn packAny(writer: *std.Io.Writer, value: anytype) !void {
7979
const T = @TypeOf(value);
8080
switch (@typeInfo(T)) {
8181
.void => return packNull(writer),
@@ -123,7 +123,7 @@ pub fn packAny(writer: anytype, value: anytype) !void {
123123
@compileError("Unsupported type '" ++ @typeName(T) ++ "'");
124124
}
125125

126-
pub fn unpackAny(reader: anytype, allocator: std.mem.Allocator, comptime T: type) !T {
126+
pub fn unpackAny(reader: *std.Io.Reader, allocator: std.mem.Allocator, comptime T: type) !T {
127127
switch (@typeInfo(T)) {
128128
.void => return unpackNull(reader),
129129
.bool => return unpackBool(reader, T),
@@ -156,74 +156,74 @@ pub fn unpackAny(reader: anytype, allocator: std.mem.Allocator, comptime T: type
156156

157157
test "packAny/unpackAny: bool" {
158158
var buffer: [16]u8 = undefined;
159-
var stream = std.io.fixedBufferStream(&buffer);
160-
try packAny(stream.writer(), true);
159+
var writer = std.Io.Writer.fixed(&buffer);
160+
try packAny(&writer, true);
161161

162-
stream.reset();
163-
try std.testing.expectEqual(true, try unpackAny(stream.reader(), std.testing.allocator, bool));
162+
var reader = std.Io.Reader.fixed(writer.buffered());
163+
try std.testing.expectEqual(true, try unpackAny(&reader, std.testing.allocator, bool));
164164
}
165165

166166
test "packAny/unpackAny: optional bool" {
167167
const values = [_]?bool{ true, null };
168168
for (values) |value| {
169169
var buffer: [16]u8 = undefined;
170-
var stream = std.io.fixedBufferStream(&buffer);
171-
try packAny(stream.writer(), value);
170+
var writer = std.Io.Writer.fixed(&buffer);
171+
try packAny(&writer, value);
172172

173-
stream.reset();
174-
try std.testing.expectEqual(value, try unpackAny(stream.reader(), std.testing.allocator, ?bool));
173+
var reader = std.Io.Reader.fixed(writer.buffered());
174+
try std.testing.expectEqual(value, try unpackAny(&reader, std.testing.allocator, ?bool));
175175
}
176176
}
177177

178178
test "packAny/unpackAny: int" {
179179
var buffer: [16]u8 = undefined;
180-
var stream = std.io.fixedBufferStream(&buffer);
181-
try packAny(stream.writer(), -42);
180+
var writer = std.Io.Writer.fixed(&buffer);
181+
try packAny(&writer, -42);
182182

183-
stream.reset();
184-
try std.testing.expectEqual(-42, try unpackAny(stream.reader(), std.testing.allocator, i32));
183+
var reader = std.Io.Reader.fixed(writer.buffered());
184+
try std.testing.expectEqual(-42, try unpackAny(&reader, std.testing.allocator, i32));
185185
}
186186

187187
test "packAny/unpackAny: optional int" {
188188
const values = [_]?i32{ -42, null };
189189
for (values) |value| {
190190
var buffer: [16]u8 = undefined;
191-
var stream = std.io.fixedBufferStream(&buffer);
192-
try packAny(stream.writer(), value);
191+
var writer = std.Io.Writer.fixed(&buffer);
192+
try packAny(&writer, value);
193193

194-
stream.reset();
195-
try std.testing.expectEqual(value, try unpackAny(stream.reader(), std.testing.allocator, ?i32));
194+
var reader = std.Io.Reader.fixed(writer.buffered());
195+
try std.testing.expectEqual(value, try unpackAny(&reader, std.testing.allocator, ?i32));
196196
}
197197
}
198198

199199
test "packAny/unpackAny: float" {
200200
var buffer: [16]u8 = undefined;
201-
var stream = std.io.fixedBufferStream(&buffer);
202-
try packAny(stream.writer(), 3.14);
201+
var writer = std.Io.Writer.fixed(&buffer);
202+
try packAny(&writer, 3.14);
203203

204-
stream.reset();
205-
try std.testing.expectEqual(3.14, try unpackAny(stream.reader(), std.testing.allocator, f32));
204+
var reader = std.Io.Reader.fixed(writer.buffered());
205+
try std.testing.expectEqual(3.14, try unpackAny(&reader, std.testing.allocator, f32));
206206
}
207207

208208
test "packAny/unpackAny: optional float" {
209209
const values = [_]?f32{ 3.14, null };
210210
for (values) |value| {
211211
var buffer: [16]u8 = undefined;
212-
var stream = std.io.fixedBufferStream(&buffer);
213-
try packAny(stream.writer(), value);
212+
var writer = std.Io.Writer.fixed(&buffer);
213+
try packAny(&writer, value);
214214

215-
stream.reset();
216-
try std.testing.expectEqual(value, try unpackAny(stream.reader(), std.testing.allocator, ?f32));
215+
var reader = std.Io.Reader.fixed(writer.buffered());
216+
try std.testing.expectEqual(value, try unpackAny(&reader, std.testing.allocator, ?f32));
217217
}
218218
}
219219

220220
test "packAny/unpackAny: string" {
221221
var buffer: [32]u8 = undefined;
222-
var stream = std.io.fixedBufferStream(&buffer);
223-
try packAny(stream.writer(), "hello");
222+
var writer = std.Io.Writer.fixed(&buffer);
223+
try packAny(&writer, "hello");
224224

225-
stream.reset();
226-
const result = try unpackAny(stream.reader(), std.testing.allocator, []const u8);
225+
var reader = std.Io.Reader.fixed(writer.buffered());
226+
const result = try unpackAny(&reader, std.testing.allocator, []const u8);
227227
defer std.testing.allocator.free(result);
228228
try std.testing.expectEqualStrings("hello", result);
229229
}
@@ -232,11 +232,11 @@ test "packAny/unpackAny: optional string" {
232232
const values = [_]?[]const u8{ "hello", null };
233233
for (values) |value| {
234234
var buffer: [32]u8 = undefined;
235-
var stream = std.io.fixedBufferStream(&buffer);
236-
try packAny(stream.writer(), value);
235+
var writer = std.Io.Writer.fixed(&buffer);
236+
try packAny(&writer, value);
237237

238-
stream.reset();
239-
const result = try unpackAny(stream.reader(), std.testing.allocator, ?[]const u8);
238+
var reader = std.Io.Reader.fixed(writer.buffered());
239+
const result = try unpackAny(&reader, std.testing.allocator, ?[]const u8);
240240
defer if (result) |str| std.testing.allocator.free(str);
241241
if (value) |str| {
242242
try std.testing.expectEqualStrings(str, result.?);
@@ -248,12 +248,12 @@ test "packAny/unpackAny: optional string" {
248248

249249
test "packAny/unpackAny: array" {
250250
var buffer: [64]u8 = undefined;
251-
var stream = std.io.fixedBufferStream(&buffer);
251+
var writer = std.Io.Writer.fixed(&buffer);
252252
const array = [_]i32{ 1, 2, 3, 4, 5 };
253-
try packAny(stream.writer(), &array);
253+
try packAny(&writer, &array);
254254

255-
stream.reset();
256-
const result = try unpackAny(stream.reader(), std.testing.allocator, []const i32);
255+
var reader = std.Io.Reader.fixed(writer.buffered());
256+
const result = try unpackAny(&reader, std.testing.allocator, []const i32);
257257
defer std.testing.allocator.free(result);
258258
try std.testing.expectEqualSlices(i32, &array, result);
259259
}
@@ -263,11 +263,11 @@ test "packAny/unpackAny: optional array" {
263263
const values = [_]?[]const i32{ &array, null };
264264
for (values) |value| {
265265
var buffer: [64]u8 = undefined;
266-
var stream = std.io.fixedBufferStream(&buffer);
267-
try packAny(stream.writer(), value);
266+
var writer = std.Io.Writer.fixed(&buffer);
267+
try packAny(&writer, value);
268268

269-
stream.reset();
270-
const result = try unpackAny(stream.reader(), std.testing.allocator, ?[]const i32);
269+
var reader = std.Io.Reader.fixed(writer.buffered());
270+
const result = try unpackAny(&reader, std.testing.allocator, ?[]const i32);
271271
defer if (result) |arr| std.testing.allocator.free(arr);
272272
if (value) |arr| {
273273
try std.testing.expectEqualSlices(i32, arr, result.?);
@@ -283,12 +283,12 @@ test "packAny/unpackAny: struct" {
283283
y: i32,
284284
};
285285
var buffer: [64]u8 = undefined;
286-
var stream = std.io.fixedBufferStream(&buffer);
286+
var writer = std.Io.Writer.fixed(&buffer);
287287
const point = Point{ .x = 10, .y = 20 };
288-
try packAny(stream.writer(), point);
288+
try packAny(&writer, point);
289289

290-
stream.reset();
291-
const result = try unpackAny(stream.reader(), std.testing.allocator, Point);
290+
var reader = std.Io.Reader.fixed(writer.buffered());
291+
const result = try unpackAny(&reader, std.testing.allocator, Point);
292292
try std.testing.expectEqualDeep(point, result);
293293
}
294294

@@ -301,11 +301,11 @@ test "packAny/unpackAny: optional struct" {
301301
const values = [_]?Point{ point, null };
302302
for (values) |value| {
303303
var buffer: [64]u8 = undefined;
304-
var stream = std.io.fixedBufferStream(&buffer);
305-
try packAny(stream.writer(), value);
304+
var writer = std.Io.Writer.fixed(&buffer);
305+
try packAny(&writer, value);
306306

307-
stream.reset();
308-
const result = try unpackAny(stream.reader(), std.testing.allocator, ?Point);
307+
var reader = std.Io.Reader.fixed(writer.buffered());
308+
const result = try unpackAny(&reader, std.testing.allocator, ?Point);
309309
try std.testing.expectEqualDeep(value, result);
310310
}
311311
}
@@ -323,11 +323,11 @@ test "packAny/unpackAny: union" {
323323

324324
for (values) |value| {
325325
var buffer: [64]u8 = undefined;
326-
var stream = std.io.fixedBufferStream(&buffer);
327-
try packAny(stream.writer(), value);
326+
var writer = std.Io.Writer.fixed(&buffer);
327+
try packAny(&writer, value);
328328

329-
stream.reset();
330-
const result = try unpackAny(stream.reader(), std.testing.allocator, Value);
329+
var reader = std.Io.Reader.fixed(writer.buffered());
330+
const result = try unpackAny(&reader, std.testing.allocator, Value);
331331
try std.testing.expectEqualDeep(value, result);
332332
}
333333
}
@@ -346,35 +346,35 @@ test "packAny/unpackAny: optional union" {
346346

347347
for (values) |value| {
348348
var buffer: [64]u8 = undefined;
349-
var stream = std.io.fixedBufferStream(&buffer);
350-
try packAny(stream.writer(), value);
349+
var writer = std.Io.Writer.fixed(&buffer);
350+
try packAny(&writer, value);
351351

352-
stream.reset();
353-
const result = try unpackAny(stream.reader(), std.testing.allocator, ?Value);
352+
var reader = std.Io.Reader.fixed(writer.buffered());
353+
const result = try unpackAny(&reader, std.testing.allocator, ?Value);
354354
try std.testing.expectEqualDeep(value, result);
355355
}
356356
}
357357

358358
test "packAny/unpackAny: String struct" {
359359
var buffer: [64]u8 = undefined;
360-
var stream = std.io.fixedBufferStream(&buffer);
360+
var writer = std.Io.Writer.fixed(&buffer);
361361
const str = String{ .data = "hello" };
362-
try packAny(stream.writer(), str);
362+
try packAny(&writer, str);
363363

364-
stream.reset();
365-
const result = try unpackAny(stream.reader(), std.testing.allocator, String);
364+
var reader = std.Io.Reader.fixed(writer.buffered());
365+
const result = try unpackAny(&reader, std.testing.allocator, String);
366366
defer std.testing.allocator.free(result.data);
367367
try std.testing.expectEqualStrings("hello", result.data);
368368
}
369369

370370
test "packAny/unpackAny: Binary struct" {
371371
var buffer: [64]u8 = undefined;
372-
var stream = std.io.fixedBufferStream(&buffer);
372+
var writer = std.Io.Writer.fixed(&buffer);
373373
const str = String{ .data = "\x01\x02\x03\x04" };
374-
try packAny(stream.writer(), str);
374+
try packAny(&writer, str);
375375

376-
stream.reset();
377-
const result = try unpackAny(stream.reader(), std.testing.allocator, String);
376+
var reader = std.Io.Reader.fixed(writer.buffered());
377+
const result = try unpackAny(&reader, std.testing.allocator, String);
378378
defer std.testing.allocator.free(result.data);
379379
try std.testing.expectEqualStrings("\x01\x02\x03\x04", result.data);
380380
}

src/array.zig

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub fn sizeOfPackedArray(len: usize) !usize {
3131
return try sizeOfPackedArrayHeader(len) + len;
3232
}
3333

34-
pub fn packArrayHeader(writer: anytype, len: usize) !void {
34+
pub fn packArrayHeader(writer: *std.Io.Writer, len: usize) !void {
3535
if (len <= hdrs.FIXARRAY_MAX - hdrs.FIXARRAY_MIN) {
3636
try writer.writeByte(hdrs.FIXARRAY_MIN + @as(u8, @intCast(len)));
3737
} else if (len <= std.math.maxInt(u16)) {
@@ -45,8 +45,8 @@ pub fn packArrayHeader(writer: anytype, len: usize) !void {
4545
}
4646
}
4747

48-
pub fn unpackArrayHeader(reader: anytype, comptime T: type) !T {
49-
const header = try reader.readByte();
48+
pub fn unpackArrayHeader(reader: *std.Io.Reader, comptime T: type) !T {
49+
const header = try reader.takeByte();
5050
switch (header) {
5151
hdrs.FIXARRAY_MIN...hdrs.FIXARRAY_MAX => {
5252
return header - hdrs.FIXARRAY_MIN;
@@ -63,7 +63,7 @@ pub fn unpackArrayHeader(reader: anytype, comptime T: type) !T {
6363
}
6464
}
6565

66-
pub fn packArray(writer: anytype, comptime T: type, value_or_maybe_null: T) !void {
66+
pub fn packArray(writer: *std.Io.Writer, comptime T: type, value_or_maybe_null: T) !void {
6767
const value = try maybePackNull(writer, T, value_or_maybe_null) orelse return;
6868
try packArrayHeader(writer, value.len);
6969

@@ -72,7 +72,7 @@ pub fn packArray(writer: anytype, comptime T: type, value_or_maybe_null: T) !voi
7272
}
7373
}
7474

75-
pub fn unpackArray(reader: anytype, allocator: std.mem.Allocator, comptime T: type) !T {
75+
pub fn unpackArray(reader: *std.Io.Reader, allocator: std.mem.Allocator, comptime T: type) !T {
7676
const len = if (isOptional(T))
7777
try unpackArrayHeader(reader, ?u32) orelse return null
7878
else
@@ -90,7 +90,7 @@ pub fn unpackArray(reader: anytype, allocator: std.mem.Allocator, comptime T: ty
9090
return data;
9191
}
9292

93-
pub fn unpackArrayInto(reader: anytype, allocator: std.mem.Allocator, comptime Item: type, buffer: []Item) ![]Item {
93+
pub fn unpackArrayInto(reader: *std.Io.Reader, allocator: std.mem.Allocator, comptime Item: type, buffer: []Item) ![]Item {
9494
const len = try unpackArrayHeader(reader, u32);
9595

9696
if (buffer.len < len) {
@@ -126,16 +126,16 @@ const packed_abc = [_]u8{ 0x93, 0x61, 0x62, 0x63 };
126126

127127
test "packArray: abc" {
128128
var buffer: [16]u8 = undefined;
129-
var stream = std.io.fixedBufferStream(&buffer);
130-
try packArray(stream.writer(), []const u8, "abc");
131-
try std.testing.expectEqualSlices(u8, &packed_abc, stream.getWritten());
129+
var writer = std.Io.Writer.fixed(&buffer);
130+
try packArray(&writer, []const u8, "abc");
131+
try std.testing.expectEqualSlices(u8, &packed_abc, writer.buffered());
132132
}
133133

134134
test "packArray: null" {
135135
var buffer: [16]u8 = undefined;
136-
var stream = std.io.fixedBufferStream(&buffer);
137-
try packArray(stream.writer(), ?[]const u8, null);
138-
try std.testing.expectEqualSlices(u8, &packed_null, stream.getWritten());
136+
var writer = std.Io.Writer.fixed(&buffer);
137+
try packArray(&writer, ?[]const u8, null);
138+
try std.testing.expectEqualSlices(u8, &packed_null, writer.buffered());
139139
}
140140

141141
test "sizeOfPackedArray" {

0 commit comments

Comments
 (0)