| // Copyright 2022 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Package buffer provides a pool-allocated byte buffer. | |
| package buffer | |
| import "sync" | |
| // Buffer is a byte buffer. | |
| // | |
| // This implementation is adapted from the unexported type buffer | |
| // in go/src/fmt/print.go. | |
| type Buffer []byte | |
| // Having an initial size gives a dramatic speedup. | |
| var bufPool = sync.Pool{ | |
| New: func() any { | |
| b := make([]byte, 0, 1024) | |
| return (*Buffer)(&b) | |
| }, | |
| } | |
| func New() *Buffer { | |
| return bufPool.Get().(*Buffer) | |
| } | |
| func (b *Buffer) Free() { | |
| // To reduce peak allocation, return only smaller buffers to the pool. | |
| const maxBufferSize = 16 << 10 | |
| if cap(*b) <= maxBufferSize { | |
| *b = (*b)[:0] | |
| bufPool.Put(b) | |
| } | |
| } | |
| func (b *Buffer) Reset() { | |
| b.SetLen(0) | |
| } | |
| func (b *Buffer) Write(p []byte) (int, error) { | |
| *b = append(*b, p...) | |
| return len(p), nil | |
| } | |
| func (b *Buffer) WriteString(s string) (int, error) { | |
| *b = append(*b, s...) | |
| return len(s), nil | |
| } | |
| func (b *Buffer) WriteByte(c byte) error { | |
| *b = append(*b, c) | |
| return nil | |
| } | |
| func (b *Buffer) String() string { | |
| return string(*b) | |
| } | |
| func (b *Buffer) Len() int { | |
| return len(*b) | |
| } | |
| func (b *Buffer) SetLen(n int) { | |
| *b = (*b)[:n] | |
| } | |