Help us shape the future of Go! Take the 2026 Go Developer Survey

ringbuf

package
v0.17.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 6, 2025 License: MIT Imports: 6 Imported by: 2

Documentation

Overview

Example
var rb RingBuf

buf := make([]byte, 1000)

fmt.Println("writing 5 x 1000 bytes")
fmt.Println(rb.Write(buf))
fmt.Println(rb.Write(buf))
fmt.Println(rb.Write(buf))
fmt.Println(rb.Write(buf))
fmt.Println(rb.Write(buf))

fmt.Println("reading 1000 and then writing 1000 more")
fmt.Println(rb.Read(buf))
fmt.Println(rb.Write(buf))

fmt.Println("reading 5 x 1000 bytes")
fmt.Println(rb.Read(buf))
fmt.Println(rb.Read(buf))
fmt.Println(rb.Read(buf))
fmt.Println(rb.Read(buf))
fmt.Println(rb.Read(buf))

fmt.Println("reading one additional time")
fmt.Println(rb.Read(buf))
Output:

writing 5 x 1000 bytes
1000 <nil>
1000 <nil>
1000 <nil>
1000 <nil>
96 <nil>
reading 1000 and then writing 1000 more
1000 <nil>
1000 <nil>
reading 5 x 1000 bytes
1000 <nil>
1000 <nil>
1000 <nil>
1000 <nil>
96 <nil>
reading one additional time
0 EOF

Index

Examples

Constants

View Source
const (
	// BufferSize is the logical size of the ring buffer.
	BufferSize = 4096
	// SlackSize is reserved for potential slack operations.
	SlackSize = 4096
	// TotalSize is the total size of the underlying array.
	TotalSize = BufferSize + SlackSize
)

Variables

This section is empty.

Functions

This section is empty.

Types

type LimitedReader

type LimitedReader struct {
	// contains filtered or unexported fields
}

LimitedReader wraps a pointer to a Reader and limits the total number of bytes that can be read. The underlying Reader and the remaining limit are stored in unexported fields.

func (*LimitedReader) Buffered

func (lr *LimitedReader) Buffered() int

Buffered returns the number of unread bytes currently buffered, capped to the remaining limit.

func (*LimitedReader) Discard

func (lr *LimitedReader) Discard(n int) (discarded int, err error)

Discard skips the next n bytes, returning the number of bytes discarded.

func (*LimitedReader) DiscardUntil

func (lr *LimitedReader) DiscardUntil(c byte) (discarded int, err error)

DiscardUntil discards bytes until (but not including) the first occurrence of c. It returns the number of bytes discarded. If c is not found and no more data is available, it returns io.EOF.

func (*LimitedReader) Flush added in v0.16.0

func (r *LimitedReader) Flush()

func (*LimitedReader) Peek

func (lr *LimitedReader) Peek(n int) ([]byte, error)

Peek returns the next n unread bytes without advancing the read pointer. If n is greater than the remaining limit, it returns io.EOF.

func (*LimitedReader) Read

func (lr *LimitedReader) Read(p []byte) (n int, err error)

Read implements io.Reader, reading at most lr.n bytes.

func (*LimitedReader) ReadByte

func (lr *LimitedReader) ReadByte() (byte, error)

ReadByte implements io.ByteReader.

func (*LimitedReader) ReadBytes

func (lr *LimitedReader) ReadBytes(n int) ([]byte, error)

ReadBytes reads exactly n bytes from the buffered LimitedReader. If fewer than n bytes are available before reaching the limit, it returns io.EOF.

func (*LimitedReader) Reset

func (r *LimitedReader) Reset(rd io.Reader)

func (*LimitedReader) ResetBytes

func (r *LimitedReader) ResetBytes(b []byte)

func (*LimitedReader) Rewind added in v0.16.0

func (r *LimitedReader) Rewind()

func (*LimitedReader) RingReader added in v0.16.0

func (r *LimitedReader) RingReader() *Reader

func (*LimitedReader) SetManualFlush added in v0.16.0

func (r *LimitedReader) SetManualFlush(v bool)

type Reader

type Reader struct {
	// contains filtered or unexported fields
}

Reader wraps an io.Reader and uses a RingBuf for buffering.

func NewReader

func NewReader(r io.Reader) *Reader

func (*Reader) Buffered

func (r *Reader) Buffered() int

Buffered returns the number of unread bytes currently buffered.

func (*Reader) DebugDump added in v0.16.0

func (r *Reader) DebugDump(w io.Writer)

func (*Reader) Discard

func (r *Reader) Discard(n int) (discarded int, err error)

Discard skips the next n bytes, returning the number of bytes discarded. It fills the buffer as needed.

func (*Reader) DiscardUntil

func (r *Reader) DiscardUntil(c byte) (discarded int, err error)

DiscardUntil discards all bytes until (but not including) the first occurrence of c. It returns the number of bytes discarded. If c is not found and no more data is available, it returns io.EOF.

func (*Reader) Flush added in v0.16.0

func (r *Reader) Flush()

func (*Reader) LimitReader

func (r *Reader) LimitReader(n int) *LimitedReader

LimitReader returns a pointer to a LimitedReader wrapping the current Reader. It updates the limit if a LimitedReader already exists.

func (*Reader) Peek

func (r *Reader) Peek(n int) ([]byte, error)

Peek returns the next n unread bytes without advancing the read pointer. It refills the ring buffer until at least n bytes are available or an error occurs.

func (*Reader) Read

func (r *Reader) Read(p []byte) (n int, err error)

Read implements io.Reader. It first ensures that there is data in the ring buffer by calling fill() as needed.

func (*Reader) ReadByte

func (r *Reader) ReadByte() (byte, error)

ReadByte implements io.ByteReader. It refills the ring buffer if necessary.

func (*Reader) ReadBytes

func (r *Reader) ReadBytes(n int) (b []byte, err error)

ReadBytes reads exactly n bytes from the buffered Reader. It fills the buffer as needed; if fewer than n bytes are available, it returns io.EOF.

func (*Reader) Reader added in v0.16.0

func (r *Reader) Reader() io.Reader

func (*Reader) Reset

func (r *Reader) Reset(rd io.Reader)

func (*Reader) ResetBytes

func (r *Reader) ResetBytes(b []byte)

func (*Reader) Rewind added in v0.16.0

func (r *Reader) Rewind()

func (*Reader) RingReader added in v0.16.0

func (r *Reader) RingReader() *Reader

func (*Reader) SetManualFlush added in v0.16.0

func (r *Reader) SetManualFlush(v bool)

func (*Reader) TotalRead added in v0.16.0

func (r *Reader) TotalRead() int

Returns the total number of read bytes from underlying io.Reader since last reset.

type RingBuf

type RingBuf struct {
	// contains filtered or unexported fields
}

RingBuf is a fixed-size ring buffer that implements io.Reader and io.Writer. It maintains two cursors:

  • read: marks the beginning of the unread region
  • write: marks the end of the unread region (and beginning of free space)

The free region is defined as the region from write to read (cyclically).

func (*RingBuf) DebugDump added in v0.16.0

func (rb *RingBuf) DebugDump(wr io.Writer)

func (*RingBuf) FillFrom

func (rb *RingBuf) FillFrom(r io.Reader) (n int64, err error)

FillFrom does one (1) read from an io.Reader into the free buffer.

func (*RingBuf) Flush added in v0.16.0

func (rb *RingBuf) Flush()

Flushes the read region, so that it can be overwritten.

func (*RingBuf) Peek

func (rb *RingBuf) Peek(n int) (buf []byte, err error)

Peek returns the next n unread bytes from the ring buffer without advancing the read pointer. If the requested data is contiguous, it returns a direct slice into rb.buf. If the data wraps around, it copies the wrapped portion into the slack space and returns a contiguous slice.

func (*RingBuf) Read

func (rb *RingBuf) Read(p []byte) (n int, err error)

Read implements io.Reader.

func (*RingBuf) ReadByte

func (rb *RingBuf) ReadByte() (byte, error)

ReadByte implements io.ByteReader.

func (*RingBuf) ReadBytes

func (rb *RingBuf) ReadBytes(n int) (r []byte, err error)

func (*RingBuf) ReadFrom

func (rb *RingBuf) ReadFrom(r io.Reader) (n int64, err error)

ReadFrom implements io.ReaderFrom. It repeatedly calls FillFrom until an error occurs or the buffer is full.

func (*RingBuf) Reset

func (rb *RingBuf) Reset()

func (*RingBuf) Rewind added in v0.16.0

func (rb *RingBuf) Rewind()

Rewinds the read data back to start.

func (*RingBuf) SetManualFlush added in v0.16.0

func (rb *RingBuf) SetManualFlush(v bool)

func (*RingBuf) Write

func (rb *RingBuf) Write(p []byte) (n int, err error)

Write implements io.Writer.

type RingBufferReader

type RingBufferReader interface {
	Buffered() int
	Reset(rd io.Reader)
	ResetBytes(b []byte)
	Read(p []byte) (n int, err error)
	ReadByte() (byte, error)
	Peek(n int) ([]byte, error)
	ReadBytes(n int) (b []byte, err error)
	Discard(n int) (discarded int, err error)
	DiscardUntil(c byte) (discarded int, err error)
	RingReader() *Reader
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL