diff --git a/fixed_buffer_stream.zig b/fixed_buffer_stream.zig new file mode 100644 index 0000000000000000000000000000000000000000..0a59d176a44c9f246480ca708182ba286f002ee0 --- /dev/null +++ b/fixed_buffer_stream.zig @@ -0,0 +1,43 @@ +const std = @import("std"); + +const nio = @import("./nio.zig"); + +pub fn FixedBufferStream(comptime Buffer: type) type { + comptime std.debug.assert(Buffer == []u8 or Buffer == []const u8); + return struct { + buffer: Buffer, + pos: usize, + + const Self = @This(); + + pub fn init(buffer: Buffer) Self { + return .{ + .buffer = buffer, + .pos = 0, + }; + } + + pub const ReadError = error{}; + pub usingnamespace nio.Readable(@This()); + pub fn read(self: *Self, dest: []u8) ReadError!usize { + const size = @min(dest.len, self.buffer.len - self.pos); + const end = self.pos + size; + @memcpy(dest[0..size], self.buffer[self.pos..end]); + self.pos = end; + return size; + } + + pub fn anyReadable(self: *Self) nio.AnyReadable { + const S = struct { + fn foo(s: *anyopaque, buffer: []u8) anyerror!usize { + const fbs: *Self = @ptrCast(@alignCast(s)); + return fbs.read(buffer); + } + }; + return .{ + .readFn = S.foo, + .state = @ptrCast(self), + }; + } + }; +} diff --git a/nio.zig b/nio.zig index a560f861114f36ca6194d843d198241206ef5401..b0733f9e1a30026a6a3ebf6eebfe224442cd4354 100644 --- a/nio.zig +++ b/nio.zig @@ -42,3 +42,5 @@ pub fn Readable(T: type) type { } pub const AnyReadable = @import("./AnyReadable.zig"); + +pub const FixedBufferStream = @import("./fixed_buffer_stream.zig").FixedBufferStream;