| ... | @@ -74,6 +74,7 @@ pub fn writeSlice(self: *RingBuffer, bytes: []const u8) Error!void { | ... | @@ -74,6 +74,7 @@ pub fn writeSlice(self: *RingBuffer, bytes: []const u8) Error!void { |
| 74 | /// bytes will be overwritten. | 74 | /// bytes will be overwritten. |
| 75 | /// Uses memcpy and so `bytes` must not overlap ring buffer data. | 75 | /// Uses memcpy and so `bytes` must not overlap ring buffer data. |
| 76 | pub fn writeSliceAssumeCapacity(self: *RingBuffer, bytes: []const u8) void { | 76 | pub fn writeSliceAssumeCapacity(self: *RingBuffer, bytes: []const u8) void { |
| | 77 | assert(bytes.len <= self.data.len); |
| 77 | const data_start = self.mask(self.write_index); | 78 | const data_start = self.mask(self.write_index); |
| 78 | const part1_data_end = @min(data_start + bytes.len, self.data.len); | 79 | const part1_data_end = @min(data_start + bytes.len, self.data.len); |
| 79 | const part1_len = part1_data_end - data_start; | 80 | const part1_len = part1_data_end - data_start; |
| ... | @@ -104,6 +105,7 @@ pub fn writeSliceForwards(self: *RingBuffer, bytes: []const u8) Error!void { | ... | @@ -104,6 +105,7 @@ pub fn writeSliceForwards(self: *RingBuffer, bytes: []const u8) Error!void { |
| 104 | /// bytes will be overwritten. | 105 | /// bytes will be overwritten. |
| 105 | /// Uses copyForwards and can write slices from this RingBuffer into itself. | 106 | /// Uses copyForwards and can write slices from this RingBuffer into itself. |
| 106 | pub fn writeSliceForwardsAssumeCapacity(self: *RingBuffer, bytes: []const u8) void { | 107 | pub fn writeSliceForwardsAssumeCapacity(self: *RingBuffer, bytes: []const u8) void { |
| | 108 | assert(bytes.len <= self.data.len); |
| 107 | const data_start = self.mask(self.write_index); | 109 | const data_start = self.mask(self.write_index); |
| 108 | const part1_data_end = @min(data_start + bytes.len, self.data.len); | 110 | const part1_data_end = @min(data_start + bytes.len, self.data.len); |
| 109 | const part1_len = part1_data_end - data_start; | 111 | const part1_len = part1_data_end - data_start; |
| ... | @@ -160,6 +162,7 @@ pub fn readFirstAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void | ... | @@ -160,6 +162,7 @@ pub fn readFirstAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void |
| 160 | /// Reads last `length` bytes written to the ring buffer into `dest`; Returns | 162 | /// Reads last `length` bytes written to the ring buffer into `dest`; Returns |
| 161 | /// Error.ReadLengthInvalid if length greater than ring or dest length | 163 | /// Error.ReadLengthInvalid if length greater than ring or dest length |
| 162 | /// Uses memcpy and so `dest` must not overlap ring buffer data. | 164 | /// Uses memcpy and so `dest` must not overlap ring buffer data. |
| | 165 | /// Reduces write index by `length`. |
| 163 | pub fn readLast(self: *RingBuffer, dest: []u8, length: usize) Error!void { | 166 | pub fn readLast(self: *RingBuffer, dest: []u8, length: usize) Error!void { |
| 164 | if (length > self.len() or length > dest.len) return error.ReadLengthInvalid; | 167 | if (length > self.len() or length > dest.len) return error.ReadLengthInvalid; |
| 165 | self.readLastAssumeLength(dest, length); | 168 | self.readLastAssumeLength(dest, length); |
| ... | @@ -168,6 +171,7 @@ pub fn readLast(self: *RingBuffer, dest: []u8, length: usize) Error!void { | ... | @@ -168,6 +171,7 @@ pub fn readLast(self: *RingBuffer, dest: []u8, length: usize) Error!void { |
| 168 | /// Reads last `length` bytes written to the ring buffer into `dest`; | 171 | /// Reads last `length` bytes written to the ring buffer into `dest`; |
| 169 | /// Asserts that length not greater than ring buffer or dest length | 172 | /// Asserts that length not greater than ring buffer or dest length |
| 170 | /// Uses memcpy and so `dest` must not overlap ring buffer data. | 173 | /// Uses memcpy and so `dest` must not overlap ring buffer data. |
| | 174 | /// Reduces write index by `length`. |
| 171 | pub fn readLastAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void { | 175 | pub fn readLastAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void { |
| 172 | assert(length <= self.len() and length <= dest.len); | 176 | assert(length <= self.len() and length <= dest.len); |
| 173 | const data_start = self.mask(self.write_index + self.data.len - length); | 177 | const data_start = self.mask(self.write_index + self.data.len - length); |
| ... | @@ -189,7 +193,7 @@ pub fn isFull(self: RingBuffer) bool { | ... | @@ -189,7 +193,7 @@ pub fn isFull(self: RingBuffer) bool { |
| 189 | return self.mask2(self.write_index + self.data.len) == self.read_index; | 193 | return self.mask2(self.write_index + self.data.len) == self.read_index; |
| 190 | } | 194 | } |
| 191 | | 195 | |
| 192 | /// Returns the length | 196 | /// Returns the length of data available for reading |
| 193 | pub fn len(self: RingBuffer) usize { | 197 | pub fn len(self: RingBuffer) usize { |
| 194 | const wrap_offset = 2 * self.data.len * @intFromBool(self.write_index < self.read_index); | 198 | const wrap_offset = 2 * self.data.len * @intFromBool(self.write_index < self.read_index); |
| 195 | const adjusted_write_index = self.write_index + wrap_offset; | 199 | const adjusted_write_index = self.write_index + wrap_offset; |