| ... | ... | @@ -16,6 +16,8 @@ pub fn FixedBufferStream(comptime Buffer: type) type { |
| 16 | 16 | buffer: Buffer, |
| 17 | 17 | pos: usize, |
| 18 | 18 | |
| 19 | const is_const = Buffer == []const u8; |
| 20 | |
| 19 | 21 | const Self = @This(); |
| 20 | 22 | |
| 21 | 23 | pub fn init(buffer: Buffer) Self { |
| ... | ... | @@ -84,18 +86,28 @@ pub fn FixedBufferStream(comptime Buffer: type) type { |
| 84 | 86 | }; |
| 85 | 87 | } |
| 86 | 88 | |
| 87 | | pub fn takeByte(self: *Self) u8 { |
| 88 | | defer self.pos += 1; |
| 89 | | return self.buffer[self.pos]; |
| 89 | pub fn rest(self: *Self) Buffer { |
| 90 | return self.buffer[self.pos..]; |
| 91 | } |
| 92 | |
| 93 | pub fn takeArray(self: *Self, comptime len: usize) (if (is_const) *const [len]u8 else *[len]u8) { |
| 94 | defer self.pos += len; |
| 95 | return self.rest()[0..len]; |
| 90 | 96 | } |
| 91 | 97 | |
| 92 | 98 | pub fn takeSlice(self: *Self, count: usize) Buffer { |
| 93 | 99 | defer self.pos += count; |
| 94 | | return self.buffer[self.pos..][0..count]; |
| 100 | return self.rest()[0..count]; |
| 95 | 101 | } |
| 96 | 102 | |
| 97 | | pub fn rest(self: *Self) Buffer { |
| 98 | | return self.buffer[self.pos..]; |
| 103 | pub fn takeInt(self: *Self, I: type, endian: std.builtin.Endian) I { |
| 104 | comptime std.debug.assert(@bitSizeOf(I) % 8 == 0); |
| 105 | return std.mem.readInt(I, self.takeArray(@sizeOf(I)), endian); |
| 106 | } |
| 107 | |
| 108 | pub fn takeIntSlice(self: *Self, I: type, len: usize) (if (is_const) []align(1) const I else []align(1) I) { |
| 109 | comptime std.debug.assert(@bitSizeOf(I) % 8 == 0); |
| 110 | return @ptrCast(self.takeSlice(@sizeOf(I) * len)); |
| 99 | 111 | } |
| 100 | 112 | }; |
| 101 | 113 | } |