authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-02-04 18:12:05 -08:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-02-04 18:12:05 -08:00
logfdb957c198a75db546675dce52c13a1bef5565a3
tree48ace1d9bc4cef8d67ddcbdcd47ce085d8cbc419
parent9cbad3ea650abdab1215f1e44819c41b1dc99275

add BufferedWriter


2 files changed, 53 insertions(+), 0 deletions(-)

buffered_writer.zig created+51
...@@ -0,0 +1,51 @@
1const std = @import("std");
2const nio = @import("./nio.zig");
3
4pub fn BufferedWriter(comptime buffer_size: usize, comptime WriterType: type) type {
5 return struct {
6 unbuffered_writer: WriterType,
7 buf: [buffer_size]u8,
8 end: usize,
9
10 const Self = @This();
11
12 pub fn init(unbuffered_writer: WriterType) Self {
13 return .{
14 .unbuffered_writer = unbuffered_writer,
15 .buf = undefined,
16 .end = 0,
17 };
18 }
19
20 pub const WriteError = WriterType.WriteError;
21 pub usingnamespace nio.Writable(@This(), ._var);
22 pub fn write(self: *Self, bytes: []const u8) WriteError!usize {
23 if (self.end + bytes.len > self.buf.len) {
24 try self.flush();
25 if (bytes.len > self.buf.len) return self.unbuffered_writer.write(bytes);
26 }
27 const new_end = self.end + bytes.len;
28 @memcpy(self.buf[self.end..new_end], bytes);
29 self.end = new_end;
30 return bytes.len;
31 }
32
33 pub fn anyWritable(self: *Self) nio.AnyWritable {
34 const S = struct {
35 fn write(s: *allowzero anyopaque, buffer: []u8) anyerror!usize {
36 const bw: *Self = @ptrCast(@alignCast(s));
37 return bw.write(buffer);
38 }
39 };
40 return .{
41 .vtable = &.{ .write = S.write },
42 .state = @ptrCast(self),
43 };
44 }
45
46 pub fn flush(self: *Self) !void {
47 try self.unbuffered_writer.writeAll(self.buf[0..self.end]);
48 self.end = 0;
49 }
50 };
51}
nio.zig+2
...@@ -141,3 +141,5 @@ pub const AnyWritable = @import("./AnyWritable.zig");...@@ -141,3 +141,5 @@ pub const AnyWritable = @import("./AnyWritable.zig");
141pub const FixedBufferStream = @import("./fixed_buffer_stream.zig").FixedBufferStream;141pub const FixedBufferStream = @import("./fixed_buffer_stream.zig").FixedBufferStream;
142142
143pub const BufferedReader = @import("./buffered_reader.zig").BufferedReader;143pub const BufferedReader = @import("./buffered_reader.zig").BufferedReader;
144
145pub const BufferedWriter = @import("./buffered_writer.zig").BufferedWriter;