Sha256: d617011f50dee0a5d629edc6237696c386699474e69edcab416d2e84d8e9fbce

Contents?: true

Size: 1.36 KB

Versions: 122

Compression:

Stored size: 1.36 KB

Contents

package circular

// standard library container/ring package and "one slot open" technique
// as described at WP.

import (
	"container/ring"
	"errors"
)

// Buffer implements a circular buffer supporting both overflow-checked writes
// and unconditional, possibly overwriting, writes.
type Buffer struct {
	start, end *ring.Ring
}

// NewBuffer constructs a new empty circular buffer.
func NewBuffer(size int) *Buffer {
	r := ring.New(size + 1)
	return &Buffer{r, r}
}

// ReadByte removes one byte from the buffer and returns it.
// ReadByte returns an error if the buffer is empty.
func (b *Buffer) ReadByte() (byte, error) {
	if b.start == b.end {
		return 0, errors.New("buffer empty")
	}
	c := b.start.Value.(byte)
	b.start = b.start.Next()
	return c, nil
}

// WriteByte puts byte c in the buffer there is room.
// WriteByte returns an error if the buffer is full.
func (b *Buffer) WriteByte(c byte) error {
	if b.end.Next() == b.start {
		return errors.New("buffer full")
	}
	b.end.Value = c
	b.end = b.end.Next()
	return nil
}

// Overwrite unconditionally puts byte c in the buffer.  If the buffer was
// already full, c overwrites the oldest byte in the buffer.
func (b *Buffer) Overwrite(c byte) {
	b.end.Value = c
	b.end = b.end.Next()
	if b.end == b.start {
		b.start = b.start.Next()
	}
}

// Reset puts the buffer in an empty state.
func (b *Buffer) Reset() {
	b.start = b.end
}

Version data entries

122 entries across 122 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.179 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.178 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.177 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.176 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.175 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.174 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.173 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.172 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.171 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.170 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.169 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.167 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.166 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.165 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.164 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.163 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.162 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.161 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.160 tracks/go/exercises/circular-buffer/example.go