mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2024-12-22 18:53:20 +00:00
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
|
package buffer
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
// Writer implements an io.Writer over a byte slice.
|
||
|
type Writer struct {
|
||
|
buf []byte
|
||
|
err error
|
||
|
expand bool
|
||
|
}
|
||
|
|
||
|
// NewWriter returns a new Writer for a given byte slice.
|
||
|
func NewWriter(buf []byte) *Writer {
|
||
|
return &Writer{
|
||
|
buf: buf,
|
||
|
expand: true,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// NewStaticWriter returns a new Writer for a given byte slice. It does not reallocate and expand the byte-slice.
|
||
|
func NewStaticWriter(buf []byte) *Writer {
|
||
|
return &Writer{
|
||
|
buf: buf,
|
||
|
expand: false,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Write writes bytes from the given byte slice and returns the number of bytes written and an error if occurred. When err != nil, n == 0.
|
||
|
func (w *Writer) Write(b []byte) (int, error) {
|
||
|
n := len(b)
|
||
|
end := len(w.buf)
|
||
|
if end+n > cap(w.buf) {
|
||
|
if !w.expand {
|
||
|
w.err = io.EOF
|
||
|
return 0, io.EOF
|
||
|
}
|
||
|
buf := make([]byte, end, 2*cap(w.buf)+n)
|
||
|
copy(buf, w.buf)
|
||
|
w.buf = buf
|
||
|
}
|
||
|
w.buf = w.buf[:end+n]
|
||
|
return copy(w.buf[end:], b), nil
|
||
|
}
|
||
|
|
||
|
// Len returns the length of the underlying byte slice.
|
||
|
func (w *Writer) Len() int {
|
||
|
return len(w.buf)
|
||
|
}
|
||
|
|
||
|
// Bytes returns the underlying byte slice.
|
||
|
func (w *Writer) Bytes() []byte {
|
||
|
return w.buf
|
||
|
}
|
||
|
|
||
|
// Reset empties and reuses the current buffer. Subsequent writes will overwrite the buffer, so any reference to the underlying slice is invalidated after this call.
|
||
|
func (w *Writer) Reset() {
|
||
|
w.buf = w.buf[:0]
|
||
|
}
|
||
|
|
||
|
// Close returns the last error.
|
||
|
func (w *Writer) Close() error {
|
||
|
return w.err
|
||
|
}
|