123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package bytebufferpool
- import "io"
- // ByteBuffer provides byte buffer, which can be used for minimizing
- // memory allocations.
- //
- // ByteBuffer may be used with functions appending data to the given []byte
- // slice. See example code for details.
- //
- // Use Get for obtaining an empty byte buffer.
- type ByteBuffer struct {
- // B is a byte buffer to use in append-like workloads.
- // See example code for details.
- B []byte
- }
- // Len returns the size of the byte buffer.
- func (b *ByteBuffer) Len() int {
- return len(b.B)
- }
- // ReadFrom implements io.ReaderFrom.
- //
- // The function appends all the data read from r to b.
- func (b *ByteBuffer) ReadFrom(r io.Reader) (int64, error) {
- p := b.B
- nStart := int64(len(p))
- nMax := int64(cap(p))
- n := nStart
- if nMax == 0 {
- nMax = 64
- p = make([]byte, nMax)
- } else {
- p = p[:nMax]
- }
- for {
- if n == nMax {
- nMax *= 2
- bNew := make([]byte, nMax)
- copy(bNew, p)
- p = bNew
- }
- nn, err := r.Read(p[n:])
- n += int64(nn)
- if err != nil {
- b.B = p[:n]
- n -= nStart
- if err == io.EOF {
- return n, nil
- }
- return n, err
- }
- }
- }
- // WriteTo implements io.WriterTo.
- func (b *ByteBuffer) WriteTo(w io.Writer) (int64, error) {
- n, err := w.Write(b.B)
- return int64(n), err
- }
- // Bytes returns b.B, i.e. all the bytes accumulated in the buffer.
- //
- // The purpose of this function is bytes.Buffer compatibility.
- func (b *ByteBuffer) Bytes() []byte {
- return b.B
- }
- // Write implements io.Writer - it appends p to ByteBuffer.B
- func (b *ByteBuffer) Write(p []byte) (int, error) {
- b.B = append(b.B, p...)
- return len(p), nil
- }
- // WriteByte appends the byte c to the buffer.
- //
- // The purpose of this function is bytes.Buffer compatibility.
- //
- // The function always returns nil.
- func (b *ByteBuffer) WriteByte(c byte) error {
- b.B = append(b.B, c)
- return nil
- }
- // WriteString appends s to ByteBuffer.B.
- func (b *ByteBuffer) WriteString(s string) (int, error) {
- b.B = append(b.B, s...)
- return len(s), nil
- }
- // Set sets ByteBuffer.B to p.
- func (b *ByteBuffer) Set(p []byte) {
- b.B = append(b.B[:0], p...)
- }
- // SetString sets ByteBuffer.B to s.
- func (b *ByteBuffer) SetString(s string) {
- b.B = append(b.B[:0], s...)
- }
- // String returns string representation of ByteBuffer.B.
- func (b *ByteBuffer) String() string {
- return string(b.B)
- }
- // Reset makes ByteBuffer.B empty.
- func (b *ByteBuffer) Reset() {
- b.B = b.B[:0]
- }
|