Cleanup ring buffer implementation

This commit is contained in:
Kovid Goyal 2023-03-07 07:43:53 +05:30
parent 37cebbc817
commit 5c87d7f84f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 15 additions and 9 deletions

View File

@ -53,7 +53,7 @@ func (self *RingBuffer[T]) Grow(new_size uint64) {
self.read_pos = 0 self.read_pos = 0
} }
func (self *RingBuffer[T]) WriteTillFull(p []T) uint64 { func (self *RingBuffer[T]) WriteTillFull(p ...T) uint64 {
ssz := self.Capacity() ssz := self.Capacity()
available := ssz - self.use_count available := ssz - self.use_count
sz := rb_min(uint64(len(p)), available) sz := rb_min(uint64(len(p)), available)
@ -74,7 +74,7 @@ func (self *RingBuffer[T]) WriteTillFull(p []T) uint64 {
return sz return sz
} }
func (self *RingBuffer[T]) WriteAllAndDiscardOld(p []T) { func (self *RingBuffer[T]) WriteAllAndDiscardOld(p ...T) {
ssz := self.Capacity() ssz := self.Capacity()
left := uint64(len(p)) left := uint64(len(p))
if left >= ssz { // Fast path if left >= ssz { // Fast path
@ -85,7 +85,7 @@ func (self *RingBuffer[T]) WriteAllAndDiscardOld(p []T) {
return return
} }
for { for {
written := self.WriteTillFull(p) written := self.WriteTillFull(p...)
p = p[written:] p = p[written:]
left = uint64(len(p)) left = uint64(len(p))
if left == 0 { if left == 0 {
@ -102,6 +102,12 @@ func (self *RingBuffer[T]) ReadTillEmpty(p []T) uint64 {
return uint64(len(a)) + uint64(len(b)) return uint64(len(a)) + uint64(len(b))
} }
func (self *RingBuffer[T]) ReadAll() []T {
ans := make([]T, self.Len())
self.ReadTillEmpty(ans)
return ans
}
func (self *RingBuffer[T]) slices_to_read(sz uint64) ([]T, []T) { func (self *RingBuffer[T]) slices_to_read(sz uint64) ([]T, []T) {
ssz := self.Capacity() ssz := self.Capacity()
sz = rb_min(sz, self.use_count) sz = rb_min(sz, self.use_count)

View File

@ -26,21 +26,21 @@ func TestRingBuffer(t *testing.T) {
t.Fatalf("Reading contents did not empty the buffer") t.Fatalf("Reading contents did not empty the buffer")
} }
} }
r.WriteTillFull([]int{1, 2, 3, 4}) r.WriteTillFull(1, 2, 3, 4)
test_contents(1, 2, 3, 4) test_contents(1, 2, 3, 4)
r.WriteTillFull([]int{1, 2, 3, 4}) r.WriteTillFull(1, 2, 3, 4)
test_contents(1, 2, 3, 4) test_contents(1, 2, 3, 4)
r.Clear() r.Clear()
r.WriteTillFull([]int{1, 2, 3, 4}) r.WriteTillFull(1, 2, 3, 4)
r.ReadTillEmpty([]int{0, 1}) r.ReadTillEmpty([]int{0, 1})
test_contents(3, 4) test_contents(3, 4)
r.WriteTillFull([]int{1, 2, 3, 4, 5}) r.WriteTillFull(1, 2, 3, 4, 5)
test_contents(1, 2, 3, 4, 5) test_contents(1, 2, 3, 4, 5)
r.Clear() r.Clear()
r.WriteTillFull([]int{1, 2, 3, 4}) r.WriteTillFull(1, 2, 3, 4)
r.WriteAllAndDiscardOld([]int{5, 6, 7, 8, 9}) r.WriteAllAndDiscardOld(5, 6, 7, 8, 9)
test_contents(2, 3, 4, 5, 6, 7, 8, 9) test_contents(2, 3, 4, 5, 6, 7, 8, 9)
} }