github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/ioutils/buffer.go (about)

     1  package ioutils // import "github.com/demonoid81/moby/pkg/ioutils"
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  )
     7  
     8  var errBufferFull = errors.New("buffer is full")
     9  
    10  type fixedBuffer struct {
    11  	buf      []byte
    12  	pos      int
    13  	lastRead int
    14  }
    15  
    16  func (b *fixedBuffer) Write(p []byte) (int, error) {
    17  	n := copy(b.buf[b.pos:cap(b.buf)], p)
    18  	b.pos += n
    19  
    20  	if n < len(p) {
    21  		if b.pos == cap(b.buf) {
    22  			return n, errBufferFull
    23  		}
    24  		return n, io.ErrShortWrite
    25  	}
    26  	return n, nil
    27  }
    28  
    29  func (b *fixedBuffer) Read(p []byte) (int, error) {
    30  	n := copy(p, b.buf[b.lastRead:b.pos])
    31  	b.lastRead += n
    32  	return n, nil
    33  }
    34  
    35  func (b *fixedBuffer) Len() int {
    36  	return b.pos - b.lastRead
    37  }
    38  
    39  func (b *fixedBuffer) Cap() int {
    40  	return cap(b.buf)
    41  }
    42  
    43  func (b *fixedBuffer) Reset() {
    44  	b.pos = 0
    45  	b.lastRead = 0
    46  	b.buf = b.buf[:0]
    47  }
    48  
    49  func (b *fixedBuffer) String() string {
    50  	return string(b.buf[b.lastRead:b.pos])
    51  }