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
}
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)

View File

@ -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)
}