-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
vendor the minimal, noasm version of klauspost/compress/zstd.
Signed-off-by: bwplotka <[email protected]>
- Loading branch information
Showing
31 changed files
with
6,806 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
Copyright (c) 2012 The Go Authors. All rights reserved. | ||
Copyright (c) 2019 Klaus Post. All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are | ||
met: | ||
|
||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above | ||
copyright notice, this list of conditions and the following disclaimer | ||
in the documentation and/or other materials provided with the | ||
distribution. | ||
* Neither the name of Google Inc. nor the names of its | ||
contributors may be used to endorse or promote products derived from | ||
this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
This source code is a stripped down version of zstd from the https://github.com/klauspost/compress/tree/517288e9a6e1dd4dea10ad42ffe2829c58dadf51/zstd. | ||
|
||
Motivation: https://github.com/kubernetes/kubernetes/pull/130569#discussion_r1981503174 | ||
|
||
Changes: | ||
* Remove all but things necessary to use and create zstd.NewWriter for SpeedFastest mode. | ||
* Use github.com/cespare/xxhash/v2 instead of vendored copy. | ||
|
||
The goal is to remove this once stdlib will support zstd. |
167 changes: 167 additions & 0 deletions
167
internal/github.com/klauspost/compress/fse/bitwriter.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
// Copyright 2018 Klaus Post. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. | ||
|
||
package fse | ||
|
||
import "fmt" | ||
|
||
// bitWriter will write bits. | ||
// First bit will be LSB of the first byte of output. | ||
type bitWriter struct { | ||
bitContainer uint64 | ||
nBits uint8 | ||
out []byte | ||
} | ||
|
||
// bitMask16 is bitmasks. Has extra to avoid bounds check. | ||
var bitMask16 = [32]uint16{ | ||
0, 1, 3, 7, 0xF, 0x1F, | ||
0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, | ||
0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, | ||
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
0xFFFF, 0xFFFF} /* up to 16 bits */ | ||
|
||
// addBits16NC will add up to 16 bits. | ||
// It will not check if there is space for them, | ||
// so the caller must ensure that it has flushed recently. | ||
func (b *bitWriter) addBits16NC(value uint16, bits uint8) { | ||
b.bitContainer |= uint64(value&bitMask16[bits&31]) << (b.nBits & 63) | ||
b.nBits += bits | ||
} | ||
|
||
// addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. | ||
// It will not check if there is space for them, so the caller must ensure that it has flushed recently. | ||
func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { | ||
b.bitContainer |= uint64(value) << (b.nBits & 63) | ||
b.nBits += bits | ||
} | ||
|
||
// addBits16ZeroNC will add up to 16 bits. | ||
// It will not check if there is space for them, | ||
// so the caller must ensure that it has flushed recently. | ||
// This is fastest if bits can be zero. | ||
func (b *bitWriter) addBits16ZeroNC(value uint16, bits uint8) { | ||
if bits == 0 { | ||
return | ||
} | ||
value <<= (16 - bits) & 15 | ||
value >>= (16 - bits) & 15 | ||
b.bitContainer |= uint64(value) << (b.nBits & 63) | ||
b.nBits += bits | ||
} | ||
|
||
// flush will flush all pending full bytes. | ||
// There will be at least 56 bits available for writing when this has been called. | ||
// Using flush32 is faster, but leaves less space for writing. | ||
func (b *bitWriter) flush() { | ||
v := b.nBits >> 3 | ||
switch v { | ||
case 0: | ||
case 1: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
) | ||
case 2: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
) | ||
case 3: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
) | ||
case 4: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24), | ||
) | ||
case 5: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24), | ||
byte(b.bitContainer>>32), | ||
) | ||
case 6: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24), | ||
byte(b.bitContainer>>32), | ||
byte(b.bitContainer>>40), | ||
) | ||
case 7: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24), | ||
byte(b.bitContainer>>32), | ||
byte(b.bitContainer>>40), | ||
byte(b.bitContainer>>48), | ||
) | ||
case 8: | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24), | ||
byte(b.bitContainer>>32), | ||
byte(b.bitContainer>>40), | ||
byte(b.bitContainer>>48), | ||
byte(b.bitContainer>>56), | ||
) | ||
default: | ||
panic(fmt.Errorf("bits (%d) > 64", b.nBits)) | ||
} | ||
b.bitContainer >>= v << 3 | ||
b.nBits &= 7 | ||
} | ||
|
||
// flush32 will flush out, so there are at least 32 bits available for writing. | ||
func (b *bitWriter) flush32() { | ||
if b.nBits < 32 { | ||
return | ||
} | ||
b.out = append(b.out, | ||
byte(b.bitContainer), | ||
byte(b.bitContainer>>8), | ||
byte(b.bitContainer>>16), | ||
byte(b.bitContainer>>24)) | ||
b.nBits -= 32 | ||
b.bitContainer >>= 32 | ||
} | ||
|
||
// flushAlign will flush remaining full bytes and align to next byte boundary. | ||
func (b *bitWriter) flushAlign() { | ||
nbBytes := (b.nBits + 7) >> 3 | ||
for i := uint8(0); i < nbBytes; i++ { | ||
b.out = append(b.out, byte(b.bitContainer>>(i*8))) | ||
} | ||
b.nBits = 0 | ||
b.bitContainer = 0 | ||
} | ||
|
||
// close will write the alignment bit and write the final byte(s) | ||
// to the output. | ||
func (b *bitWriter) close() { | ||
// End mark | ||
b.addBits16Clean(1, 1) | ||
// flush until next byte. | ||
b.flushAlign() | ||
} | ||
|
||
// reset and continue writing by appending to out. | ||
func (b *bitWriter) reset(out []byte) { | ||
b.bitContainer = 0 | ||
b.nBits = 0 | ||
b.out = out | ||
} |
37 changes: 37 additions & 0 deletions
37
internal/github.com/klauspost/compress/fse/bytereader.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// Copyright 2018 Klaus Post. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
// Based on work Copyright (c) 2013, Yann Collet, released under BSD License. | ||
|
||
package fse | ||
|
||
// byteReader provides a byte reader that reads | ||
// little endian values from a byte stream. | ||
// The input stream is manually advanced. | ||
// The reader performs no bounds checks. | ||
type byteReader struct { | ||
b []byte | ||
off int | ||
} | ||
|
||
// init will initialize the reader and set the input. | ||
func (b *byteReader) init(in []byte) { | ||
b.b = in | ||
b.off = 0 | ||
} | ||
|
||
// Uint32 returns a little endian uint32 starting at current offset. | ||
func (b byteReader) Uint32() uint32 { | ||
b2 := b.b[b.off:] | ||
b2 = b2[:4] | ||
v3 := uint32(b2[3]) | ||
v2 := uint32(b2[2]) | ||
v1 := uint32(b2[1]) | ||
v0 := uint32(b2[0]) | ||
return v0 | (v1 << 8) | (v2 << 16) | (v3 << 24) | ||
} | ||
|
||
// remain will return the number of bytes remaining. | ||
func (b byteReader) remain() int { | ||
return len(b.b) - b.off | ||
} |
Oops, something went wrong.