package circular import "errors" const testVersion = 3 // Buffer is circular buffer type Buffer struct { v []byte // values rpos int // read position wpos int // write position n int // occupied cells } // NewBuffer allocates new buffer func NewBuffer(size int) *Buffer { return &Buffer{v: make([]byte, size)} } // ReadByte reads byte from buffer func (b *Buffer) ReadByte() (byte, error) { if b.n == 0 { return 0, errors.New("empty") } val := b.v[b.rpos] b.rpos = (b.rpos + 1) % len(b.v) b.n-- return val, nil } // WriteByte appends byte to buffer func (b *Buffer) WriteByte(c byte) error { if b.n == len(b.v) { return errors.New("full") } b.v[b.wpos] = c b.wpos = (b.wpos + 1) % len(b.v) b.n++ return nil } // Overwrite oldest value func (b *Buffer) Overwrite(c byte) { if err := b.WriteByte(c); err != nil { b.v[b.rpos] = c b.rpos = (b.rpos + 1) % len(b.v) } } // Reset buffer func (b *Buffer) Reset() { b.n = 0 b.rpos = b.wpos }