| // 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 adapted from 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] |
| } |