summaryrefslogtreecommitdiff
path: root/go/circular-buffer/circular_buffer.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/circular-buffer/circular_buffer.go')
-rw-r--r--go/circular-buffer/circular_buffer.go48
1 files changed, 48 insertions, 0 deletions
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
+}