github.com/bir3/gocompiler@v0.9.2202/extra/compress/zstd/bytereader.go (about)

     1  // Copyright 2019+ Klaus Post. All rights reserved.
     2  // License information can be found in the LICENSE file.
     3  // Based on work by Yann Collet, released under BSD License.
     4  
     5  package zstd
     6  
     7  // byteReader provides a byte reader that reads
     8  // little endian values from a byte stream.
     9  // The input stream is manually advanced.
    10  // The reader performs no bounds checks.
    11  type byteReader struct {
    12  	b   []byte
    13  	off int
    14  }
    15  
    16  // advance the stream b n bytes.
    17  func (b *byteReader) advance(n uint) {
    18  	b.off += int(n)
    19  }
    20  
    21  // overread returns whether we have advanced too far.
    22  func (b *byteReader) overread() bool {
    23  	return b.off > len(b.b)
    24  }
    25  
    26  // Int32 returns a little endian int32 starting at current offset.
    27  func (b byteReader) Int32() int32 {
    28  	b2 := b.b[b.off:]
    29  	b2 = b2[:4]
    30  	v3 := int32(b2[3])
    31  	v2 := int32(b2[2])
    32  	v1 := int32(b2[1])
    33  	v0 := int32(b2[0])
    34  	return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24)
    35  }
    36  
    37  // Uint8 returns the next byte
    38  func (b *byteReader) Uint8() uint8 {
    39  	v := b.b[b.off]
    40  	return v
    41  }
    42  
    43  // Uint32 returns a little endian uint32 starting at current offset.
    44  func (b byteReader) Uint32() uint32 {
    45  	if r := b.remain(); r < 4 {
    46  		// Very rare
    47  		v := uint32(0)
    48  		for i := 1; i <= r; i++ {
    49  			v = (v << 8) | uint32(b.b[len(b.b)-i])
    50  		}
    51  		return v
    52  	}
    53  	b2 := b.b[b.off:]
    54  	b2 = b2[:4]
    55  	v3 := uint32(b2[3])
    56  	v2 := uint32(b2[2])
    57  	v1 := uint32(b2[1])
    58  	v0 := uint32(b2[0])
    59  	return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24)
    60  }
    61  
    62  // Uint32NC returns a little endian uint32 starting at current offset.
    63  // The caller must be sure if there are at least 4 bytes left.
    64  func (b byteReader) Uint32NC() uint32 {
    65  	b2 := b.b[b.off:]
    66  	b2 = b2[:4]
    67  	v3 := uint32(b2[3])
    68  	v2 := uint32(b2[2])
    69  	v1 := uint32(b2[1])
    70  	v0 := uint32(b2[0])
    71  	return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24)
    72  }
    73  
    74  // unread returns the unread portion of the input.
    75  func (b byteReader) unread() []byte {
    76  	return b.b[b.off:]
    77  }
    78  
    79  // remain will return the number of bytes remaining.
    80  func (b byteReader) remain() int {
    81  	return len(b.b) - b.off
    82  }