authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-08-24 02:33:43 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-08-24 02:33:43 -07:00
logce531ba7a65f4b5eb037e893270cd07c42e88802
treeab65c29b9d5ed193d69246fe22fc33af3e47d603
parenta53ead2fb5378e9b09cb2f68e8a2b7cddfe086d2

add FixedBufferStream


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

fixed_buffer_stream.zig created+43
......@@ -0,0 +1,43 @@
1const std = @import("std");
2
3const nio = @import("./nio.zig");
4
5pub fn FixedBufferStream(comptime Buffer: type) type {
6 comptime std.debug.assert(Buffer == []u8 or Buffer == []const u8);
7 return struct {
8 buffer: Buffer,
9 pos: usize,
10
11 const Self = @This();
12
13 pub fn init(buffer: Buffer) Self {
14 return .{
15 .buffer = buffer,
16 .pos = 0,
17 };
18 }
19
20 pub const ReadError = error{};
21 pub usingnamespace nio.Readable(@This());
22 pub fn read(self: *Self, dest: []u8) ReadError!usize {
23 const size = @min(dest.len, self.buffer.len - self.pos);
24 const end = self.pos + size;
25 @memcpy(dest[0..size], self.buffer[self.pos..end]);
26 self.pos = end;
27 return size;
28 }
29
30 pub fn anyReadable(self: *Self) nio.AnyReadable {
31 const S = struct {
32 fn foo(s: *anyopaque, buffer: []u8) anyerror!usize {
33 const fbs: *Self = @ptrCast(@alignCast(s));
34 return fbs.read(buffer);
35 }
36 };
37 return .{
38 .readFn = S.foo,
39 .state = @ptrCast(self),
40 };
41 }
42 };
43}
nio.zig+2
......@@ -42,3 +42,5 @@ pub fn Readable(T: type) type {
4242}
4343
4444pub const AnyReadable = @import("./AnyReadable.zig");
45
46pub const FixedBufferStream = @import("./fixed_buffer_stream.zig").FixedBufferStream;