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
|
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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user