Ability to get pointers from ring buffer

This commit is contained in:
bloeys
2022-07-24 18:21:58 +04:00
parent 854fb7ac64
commit 75c33325f7

View File

@ -169,14 +169,11 @@ func (it *Iterator[T]) Len() int64 {
return int64(len(it.V1) + len(it.V2)) return int64(len(it.V1) + len(it.V2))
} }
// Next returns the value at Iterator.Curr and done=false func (it *Iterator[T]) NextPtr() (v *T, done bool) {
//
// If there are no more values to return the default value is returned for v and done=true
func (it *Iterator[T]) Next() (v T, done bool) {
if it.InV1 { if it.InV1 {
v = it.V1[it.Curr] v = &it.V1[it.Curr]
it.Curr++ it.Curr++
if it.Curr >= int64(len(it.V1)) { if it.Curr >= int64(len(it.V1)) {
@ -191,25 +188,29 @@ func (it *Iterator[T]) Next() (v T, done bool) {
return v, true return v, true
} }
v = it.V2[it.Curr] v = &it.V2[it.Curr]
it.Curr++ it.Curr++
return v, false return v, false
} }
func (it *Iterator[T]) HasNext() bool { // Next returns the value at Iterator.Curr and done=false
hasNext := it.InV1 || it.Curr < int64(len(it.V2)) //
return hasNext // If there are no more values to return the default value is returned for v and done=true
func (it *Iterator[T]) Next() (v T, done bool) {
var vPtr *T
vPtr, done = it.NextPtr()
if vPtr == nil {
return v, done
} }
func (it *Iterator[T]) HasPrev() bool { return *vPtr, done
hasPrev := (!it.InV1 && it.Curr-1 >= 0) || (it.InV1 && it.Curr > 0)
return hasPrev
} }
// Next returns the value at Iterator.Curr-1 and done=false // Next returns the value at Iterator.Curr-1 and done=false
// //
// If there are no more values to return the default value is returned for v and done=true // If there are no more values to return the default value is returned for v and done=true
func (it *Iterator[T]) Prev() (v T, done bool) { func (it *Iterator[T]) PrevPtr() (v *T, done bool) {
if it.InV1 { if it.InV1 {
@ -218,7 +219,7 @@ func (it *Iterator[T]) Prev() (v T, done bool) {
} }
it.Curr-- it.Curr--
v = it.V1[it.Curr] v = &it.V1[it.Curr]
return v, false return v, false
} }
@ -226,14 +227,25 @@ func (it *Iterator[T]) Prev() (v T, done bool) {
if it.Curr < 0 { if it.Curr < 0 {
it.InV1 = true it.InV1 = true
it.Curr = int64(len(it.V1)) it.Curr = int64(len(it.V1))
return it.Prev() return it.PrevPtr()
} }
v = it.V2[it.Curr] v = &it.V2[it.Curr]
return v, false return v, false
} }
func (it *Iterator[T]) Prev() (v T, done bool) {
var vPtr *T
vPtr, done = it.PrevPtr()
if vPtr == nil {
return v, done
}
return *vPtr, done
}
// NextN calls Next() up to n times and places the result in the passed buffer. // NextN calls Next() up to n times and places the result in the passed buffer.
// 'read' is the actual number of elements put in the buffer. // 'read' is the actual number of elements put in the buffer.
// We might not be able to put 'n' elements because the buffer is too small or because there aren't enough remaining elements // We might not be able to put 'n' elements because the buffer is too small or because there aren't enough remaining elements
@ -291,6 +303,16 @@ func (it *Iterator[T]) PrevN(buf []T, n int) (read int, done bool) {
return read, done return read, done
} }
func (it *Iterator[T]) HasNext() bool {
hasNext := it.InV1 || it.Curr < int64(len(it.V2))
return hasNext
}
func (it *Iterator[T]) HasPrev() bool {
hasPrev := (!it.InV1 && it.Curr-1 >= 0) || (it.InV1 && it.Curr > 0)
return hasPrev
}
// GotoStart adjusts the iterator such that the following Next() call returns the value at index=0 // GotoStart adjusts the iterator such that the following Next() call returns the value at index=0
// and the next Prev() call returns done=true // and the next Prev() call returns done=true
func (it *Iterator[T]) GotoStart() { func (it *Iterator[T]) GotoStart() {