From 5c87d7f84f75741d30f943937d8d5d1cc672cfe7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 7 Mar 2023 07:43:53 +0530 Subject: [PATCH] Cleanup ring buffer implementation --- tools/utils/ring.go | 12 +++++++++--- tools/utils/ring_test.go | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/utils/ring.go b/tools/utils/ring.go index b33f3b4c8..88eb2c0c5 100644 --- a/tools/utils/ring.go +++ b/tools/utils/ring.go @@ -53,7 +53,7 @@ func (self *RingBuffer[T]) Grow(new_size uint64) { self.read_pos = 0 } -func (self *RingBuffer[T]) WriteTillFull(p []T) uint64 { +func (self *RingBuffer[T]) WriteTillFull(p ...T) uint64 { ssz := self.Capacity() available := ssz - self.use_count sz := rb_min(uint64(len(p)), available) @@ -74,7 +74,7 @@ func (self *RingBuffer[T]) WriteTillFull(p []T) uint64 { return sz } -func (self *RingBuffer[T]) WriteAllAndDiscardOld(p []T) { +func (self *RingBuffer[T]) WriteAllAndDiscardOld(p ...T) { ssz := self.Capacity() left := uint64(len(p)) if left >= ssz { // Fast path @@ -85,7 +85,7 @@ func (self *RingBuffer[T]) WriteAllAndDiscardOld(p []T) { return } for { - written := self.WriteTillFull(p) + written := self.WriteTillFull(p...) p = p[written:] left = uint64(len(p)) if left == 0 { @@ -102,6 +102,12 @@ func (self *RingBuffer[T]) ReadTillEmpty(p []T) uint64 { 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) { ssz := self.Capacity() sz = rb_min(sz, self.use_count) diff --git a/tools/utils/ring_test.go b/tools/utils/ring_test.go index c25b1e8fb..e0fa04c06 100644 --- a/tools/utils/ring_test.go +++ b/tools/utils/ring_test.go @@ -26,21 +26,21 @@ func TestRingBuffer(t *testing.T) { 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) - r.WriteTillFull([]int{1, 2, 3, 4}) + r.WriteTillFull(1, 2, 3, 4) test_contents(1, 2, 3, 4) r.Clear() - r.WriteTillFull([]int{1, 2, 3, 4}) + r.WriteTillFull(1, 2, 3, 4) r.ReadTillEmpty([]int{0, 1}) 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) r.Clear() - r.WriteTillFull([]int{1, 2, 3, 4}) - r.WriteAllAndDiscardOld([]int{5, 6, 7, 8, 9}) + r.WriteTillFull(1, 2, 3, 4) + r.WriteAllAndDiscardOld(5, 6, 7, 8, 9) test_contents(2, 3, 4, 5, 6, 7, 8, 9) }