github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/store/bufferedChecksum.go (about)

     1  package store
     2  
     3  import (
     4  	"hash"
     5  )
     6  
     7  /*
     8  Wraps another Checksum with an internal buffer to speed up checksum
     9  calculations.
    10  */
    11  type BufferedChecksum struct {
    12  	in     hash.Hash32
    13  	buffer []byte
    14  	upto   int
    15  }
    16  
    17  /* Create a new BufferedChecksum with DEFAULT_BUFFERSIZE */
    18  func newBufferedChecksum(in hash.Hash32) *BufferedChecksum {
    19  	return newBufferedChecksumWithBuffer(in, 256)
    20  }
    21  
    22  /* Create a new BufferedChecksum with the specified bufferSize */
    23  func newBufferedChecksumWithBuffer(in hash.Hash32, bufferSize int) *BufferedChecksum {
    24  	return &BufferedChecksum{in: in, buffer: make([]byte, bufferSize)}
    25  }
    26  
    27  func (bc *BufferedChecksum) BlockSize() int {
    28  	return bc.in.BlockSize()
    29  }
    30  
    31  func (bc *BufferedChecksum) Reset() {
    32  	bc.upto = 0
    33  	bc.in.Reset()
    34  }
    35  
    36  func (bc *BufferedChecksum) Size() int {
    37  	return bc.in.Size()
    38  }
    39  
    40  func (bc *BufferedChecksum) Sum(p []byte) []byte {
    41  	return bc.in.Sum(p)
    42  }
    43  
    44  func (bc *BufferedChecksum) Sum32() uint32 {
    45  	bc.flush()
    46  	return bc.in.Sum32()
    47  }
    48  
    49  func (bc *BufferedChecksum) flush() {
    50  	if bc.upto > 0 {
    51  		bc.in.Write(bc.buffer[:bc.upto])
    52  	}
    53  	bc.upto = 0
    54  }
    55  
    56  func (bc *BufferedChecksum) Write(p []byte) (int, error) {
    57  	if len(p) >= len(bc.buffer) {
    58  		bc.flush()
    59  		return bc.in.Write(p)
    60  	}
    61  	if bc.upto+len(p) > len(bc.buffer) {
    62  		bc.flush()
    63  	}
    64  	copy(bc.buffer, p)
    65  	bc.upto += len(p)
    66  	return len(p), nil
    67  }