github.com/bhojpur/cache@v0.0.4/pkg/ioutils/buffer.go (about)

     1  package ioutils
     2  
     3  // Copyright (c) 2018 Bhojpur Consulting Private Limited, India. All rights reserved.
     4  
     5  // Permission is hereby granted, free of charge, to any person obtaining a copy
     6  // of this software and associated documentation files (the "Software"), to deal
     7  // in the Software without restriction, including without limitation the rights
     8  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     9  // copies of the Software, and to permit persons to whom the Software is
    10  // furnished to do so, subject to the following conditions:
    11  
    12  // The above copyright notice and this permission notice shall be included in
    13  // all copies or substantial portions of the Software.
    14  
    15  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    16  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    17  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    18  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    19  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    20  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    21  // THE SOFTWARE.
    22  
    23  import (
    24  	"errors"
    25  	"io"
    26  )
    27  
    28  var errBufferFull = errors.New("buffer is full")
    29  
    30  type fixedBuffer struct {
    31  	buf      []byte
    32  	pos      int
    33  	lastRead int
    34  }
    35  
    36  func (b *fixedBuffer) Write(p []byte) (int, error) {
    37  	n := copy(b.buf[b.pos:cap(b.buf)], p)
    38  	b.pos += n
    39  
    40  	if n < len(p) {
    41  		if b.pos == cap(b.buf) {
    42  			return n, errBufferFull
    43  		}
    44  		return n, io.ErrShortWrite
    45  	}
    46  	return n, nil
    47  }
    48  
    49  func (b *fixedBuffer) Read(p []byte) (int, error) {
    50  	n := copy(p, b.buf[b.lastRead:b.pos])
    51  	b.lastRead += n
    52  	return n, nil
    53  }
    54  
    55  func (b *fixedBuffer) Len() int {
    56  	return b.pos - b.lastRead
    57  }
    58  
    59  func (b *fixedBuffer) Cap() int {
    60  	return cap(b.buf)
    61  }
    62  
    63  func (b *fixedBuffer) Reset() {
    64  	b.pos = 0
    65  	b.lastRead = 0
    66  	b.buf = b.buf[:0]
    67  }
    68  
    69  func (b *fixedBuffer) String() string {
    70  	return string(b.buf[b.lastRead:b.pos])
    71  }