Sha256: 2282355193ca2f540040a60956d22b011d2815cc59041418841f2abbe0403c9c

Contents?: true

Size: 1.38 KB

Versions: 274

Compression:

Stored size: 1.38 KB

Contents

package circular

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

import (
	"container/ring"
	"errors"
)

const testVersion = 4

// 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

274 entries across 274 versions & 1 rubygems

Version Path
trackler-2.2.1.56 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.55 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.54 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.53 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.52 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.51 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.50 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.49 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.48 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.47 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.46 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.45 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.44 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.43 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.42 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.41 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.40 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.39 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.38 tracks/go/exercises/circular-buffer/example.go
trackler-2.2.1.37 tracks/go/exercises/circular-buffer/example.go