From 4b748f68b851d1eea8edf188f5778975a45c5cfb Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 28 Aug 2016 14:06:37 +0200 Subject: Solve buffer --- go/circular-buffer/circular_buffer.go | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 go/circular-buffer/circular_buffer.go (limited to 'go/circular-buffer/circular_buffer.go') diff --git a/go/circular-buffer/circular_buffer.go b/go/circular-buffer/circular_buffer.go new file mode 100644 index 0000000..b17ea2b --- /dev/null +++ b/go/circular-buffer/circular_buffer.go @@ -0,0 +1,48 @@ +package circular + +import "errors" + +const testVersion = 3 + +type Buffer struct { + v []byte // values + rpos int // read position + wpos int // write position + n int // occupied cells +} + +func NewBuffer(size int) *Buffer { + return &Buffer{v: make([]byte, size)} +} + +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 +} + +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 +} + +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) + } +} + +func (b *Buffer) Reset() { + b.n = 0 + b.rpos = b.wpos +} -- cgit v1.2.3