Cleanup ring buffer implementation
This commit is contained in:
parent
37cebbc817
commit
5c87d7f84f
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user