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