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