diff --git a/AnyReadable.zig b/AnyReadable.zig index 4725feb166fd9dfd4971af668a6bc05b1dc641ae..5fed1551ab0d2298778b665505ce0705f6cd86c4 100644 --- a/AnyReadable.zig +++ b/AnyReadable.zig @@ -11,4 +11,4 @@ pub fn read(r: *AnyReadable, buffer: []u8) !usize { } pub const ReadError = anyerror; -pub usingnamespace nio.Readable(@This()); +pub usingnamespace nio.Readable(@This(), ._var); diff --git a/fixed_buffer_stream.zig b/fixed_buffer_stream.zig index 0a59d176a44c9f246480ca708182ba286f002ee0..e4b0f3426dfe04c7417bea07c97a5da4bc61a698 100644 --- a/fixed_buffer_stream.zig +++ b/fixed_buffer_stream.zig @@ -18,7 +18,7 @@ pub fn FixedBufferStream(comptime Buffer: type) type { } pub const ReadError = error{}; - pub usingnamespace nio.Readable(@This()); + pub usingnamespace nio.Readable(@This(), ._var); pub fn read(self: *Self, dest: []u8) ReadError!usize { const size = @min(dest.len, self.buffer.len - self.pos); const end = self.pos + size; diff --git a/nio.zig b/nio.zig index b0733f9e1a30026a6a3ebf6eebfe224442cd4354..7313338cff808f56e7b62980541f792005cbc354 100644 --- a/nio.zig +++ b/nio.zig @@ -1,19 +1,25 @@ const std = @import("std"); -pub fn Readable(T: type) type { +pub fn Readable(T: type, this_kind: enum { _var, _const, _bare }) type { return struct { const Error = T.ReadError; + const Self = switch (this_kind) { + ._var => *T, + ._const => *const T, + ._bare => T, + }; + /// Returns the number of bytes read. It may be less than buffer.len. /// If the number of bytes read is 0, it means end of stream. /// End of stream is not an error condition. - // pub fn read(self: *T, buffer: []u8) Error!usize { + // pub fn read(self: Self, buffer: []u8) Error!usize { // } /// Returns the number of bytes read. If the number read is smaller than `buffer.len`, it /// means the stream reached the end. Reaching the end of a stream is not an error /// condition. - pub fn readAll(self: *T, buffer: []u8) Error!usize { + pub fn readAll(self: Self, buffer: []u8) Error!usize { return self.readAtLeast(buffer, buffer.len); } @@ -22,7 +28,7 @@ pub fn Readable(T: type) type { /// `len` bytes filled. If the number read is less than `len` it means /// the stream reached the end. Reaching the end of the stream is not /// an error condition. - pub fn readAtLeast(self: *T, buffer: []u8, len: usize) Error!usize { + pub fn readAtLeast(self: Self, buffer: []u8, len: usize) Error!usize { std.debug.assert(len <= buffer.len); var index: usize = 0; while (index < len) { @@ -34,7 +40,7 @@ pub fn Readable(T: type) type { } /// If the number read would be smaller than `buf.len`, `error.EndOfStream` is returned instead. - pub fn readNoEof(self: *T, buf: []u8) (Error || error{EndOfStream})!void { + pub fn readNoEof(self: Self, buf: []u8) (Error || error{EndOfStream})!void { const amt_read = try self.readAll(buf); if (amt_read < buf.len) return error.EndOfStream; }