uint64.go raw
1 package ring
2
3 type BufferUint64 struct {
4 Buf []uint64
5 Cursor int
6 Full bool
7 }
8
9 func NewBufferUint64(size int) *BufferUint64 {
10 return &BufferUint64{
11 Buf: make([]uint64, size),
12 Cursor: -1,
13 }
14 }
15
16 // Get returns the value at the given index or nil if nothing
17 func (b *BufferUint64) Get(index int) (out *uint64) {
18 bl := len(b.Buf)
19 if index < bl {
20 cursor := b.Cursor + index
21 if cursor > bl {
22 cursor = cursor - bl
23 }
24 return &b.Buf[cursor]
25 }
26 return
27 }
28
29 func (b *BufferUint64) Add(value uint64) {
30 b.Cursor++
31 if b.Cursor == len(b.Buf) {
32 b.Cursor = 0
33 if !b.Full {
34 b.Full = true
35 }
36 }
37 b.Buf[b.Cursor] = value
38 }
39
40 func (b *BufferUint64) ForEach(fn func(v uint64) error) (err error) {
41 c := b.Cursor
42 i := c + 1
43 if i == len(b.Buf) {
44 // log.L.Debug("hit the end")
45 i = 0
46 }
47 if !b.Full {
48 // log.L.Debug("buffer not yet full")
49 i = 0
50 }
51 // log.L.Debug(b.Buf)
52 for ; ; i++ {
53 if i == len(b.Buf) {
54 // log.L.Debug("passed the end")
55 i = 0
56 }
57 if i == c {
58 // log.L.Debug("reached cursor again")
59 break
60 }
61 // log.L.Debug(i, b.Cursor)
62 if err = fn(b.Buf[i]); err != nil {
63 break
64 }
65 }
66 return
67 }
68