| ... | ... | @@ -150,12 +150,8 @@ pub fn readFirst(self: *RingBuffer, dest: []u8, length: usize) Error!void { |
| 150 | 150 | /// Uses memcpy and so `dest` must not overlap ring buffer data. |
| 151 | 151 | pub fn readFirstAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void { |
| 152 | 152 | assert(length <= self.len() and length <= dest.len); |
| 153 | | const data_start = self.mask(self.read_index); |
| 154 | | const part1_data_end = @min(self.data.len, data_start + length); |
| 155 | | const part1_len = part1_data_end - data_start; |
| 156 | | const part2_len = length - part1_len; |
| 157 | | @memcpy(dest[0..part1_len], self.data[data_start..part1_data_end]); |
| 158 | | @memcpy(dest[part1_len..length], self.data[0..part2_len]); |
| 153 | const slice = self.sliceAt(self.read_index, length); |
| 154 | slice.copyTo(dest); |
| 159 | 155 | self.read_index = self.mask2(self.read_index + length); |
| 160 | 156 | } |
| 161 | 157 | |
| ... | ... | @@ -174,13 +170,12 @@ pub fn readLast(self: *RingBuffer, dest: []u8, length: usize) Error!void { |
| 174 | 170 | /// Reduces write index by `length`. |
| 175 | 171 | pub fn readLastAssumeLength(self: *RingBuffer, dest: []u8, length: usize) void { |
| 176 | 172 | assert(length <= self.len() and length <= dest.len); |
| 177 | | const data_start = self.mask(self.write_index + self.data.len - length); |
| 178 | | const part1_data_end = @min(self.data.len, data_start + length); |
| 179 | | const part1_len = part1_data_end - data_start; |
| 180 | | const part2_len = length - part1_len; |
| 181 | | @memcpy(dest[0..part1_len], self.data[data_start..part1_data_end]); |
| 182 | | @memcpy(dest[part1_len..length], self.data[0..part2_len]); |
| 183 | | self.write_index = if (self.write_index >= self.data.len) self.write_index - length else data_start; |
| 173 | const slice = self.sliceLast(length); |
| 174 | slice.copyTo(dest); |
| 175 | self.write_index = if (self.write_index >= self.data.len) |
| 176 | self.write_index - length |
| 177 | else |
| 178 | self.mask(self.write_index + self.data.len - length); |
| 184 | 179 | } |
| 185 | 180 | |
| 186 | 181 | /// Returns `true` if the ring buffer is empty and `false` otherwise. |
| ... | ... | @@ -206,6 +201,12 @@ pub fn len(self: RingBuffer) usize { |
| 206 | 201 | pub const Slice = struct { |
| 207 | 202 | first: []u8, |
| 208 | 203 | second: []u8, |
| 204 | |
| 205 | /// Copy data from `self` into `dest` |
| 206 | pub fn copyTo(self: Slice, dest: []u8) void { |
| 207 | @memcpy(dest[0..self.first.len], self.first); |
| 208 | @memcpy(dest[self.first.len..][0..self.second.len], self.second); |
| 209 | } |
| 209 | 210 | }; |
| 210 | 211 | |
| 211 | 212 | /// Returns a `Slice` for the region of the ring buffer starting at |