aboutsummaryrefslogtreecommitdiff
path: root/internal/flate/decompress_bytes.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2025-11-19 08:00:00 +0800
committerGravatar Runxi Yu2025-11-19 08:00:00 +0800
commit84381e51d253d0fe13838b1c9abc9d272829663f (patch)
tree942e41a45cc90984d7953e4be5d4aa6ce8c4fecc /internal/flate/decompress_bytes.go
parentInitial attempt to make a compressor with less overhead (diff)
signatureNo signature
SliceInflater is probably a better name for that
And let's just basically not use io.Reader at all
Diffstat (limited to 'internal/flate/decompress_bytes.go')
-rw-r--r--internal/flate/decompress_bytes.go69
1 files changed, 17 insertions, 52 deletions
diff --git a/internal/flate/decompress_bytes.go b/internal/flate/decompress_bytes.go
index 2cd9fd89..18fe21fc 100644
--- a/internal/flate/decompress_bytes.go
+++ b/internal/flate/decompress_bytes.go
@@ -7,49 +7,18 @@ import (
"git.sr.ht/~runxiyu/furgit/internal/bufpool"
)
-// byteSliceReader implements Reader over an in-memory byte slice.
-type byteSliceReader struct {
- data []byte
- off int
-}
-
-func (r *byteSliceReader) Reset(data []byte) {
- r.data = data
- r.off = 0
-}
-
-func (r *byteSliceReader) Read(p []byte) (int, error) {
- if r.off >= len(r.data) {
- return 0, io.EOF
- }
- n := copy(p, r.data[r.off:])
- r.off += n
- return n, nil
-}
-
-func (r *byteSliceReader) ReadByte() (byte, error) {
- if r.off >= len(r.data) {
- return 0, io.EOF
- }
- b := r.data[r.off]
- r.off++
- return b, nil
-}
-
-// bufferDecompressor wraps the core decompressor with pooling state so that
-// byte-slice decompressions avoid repeated allocations.
+// bufferDecompressor wraps the custom slice inflater so byte-slice
+// decompressions avoid repeated allocations.
type bufferDecompressor struct {
- dec decompressor
- reader byteSliceReader
+ inflater sliceInflater
}
var bufferDecompressorPool = sync.Pool{
New: func() any {
fixedHuffmanDecoderInit()
d := &bufferDecompressor{}
- d.dec.bits = new([maxNumLit + maxNumDist]int)
- d.dec.codebits = new([numCodes]int)
- d.dec.step = (*decompressor).nextBlock
+ d.inflater.bits = new([maxNumLit + maxNumDist]int)
+ d.inflater.codebits = new([numCodes]int)
return d
},
}
@@ -65,13 +34,9 @@ func Decompress(src []byte) (bufpool.Buffer, int, error) {
// returned value reports how many bytes of src were consumed.
func DecompressDict(src []byte, dict []byte) (bufpool.Buffer, int, error) {
d := bufferDecompressorPool.Get().(*bufferDecompressor)
- defer func() {
- d.reader.Reset(nil)
- bufferDecompressorPool.Put(d)
- }()
+ defer bufferDecompressorPool.Put(d)
- d.reader.Reset(src)
- if err := d.dec.Reset(&d.reader, dict); err != nil {
+ if err := d.inflater.reset(src, dict); err != nil {
return bufpool.Buffer{}, 0, err
}
@@ -79,21 +44,21 @@ func DecompressDict(src []byte, dict []byte) (bufpool.Buffer, int, error) {
out.Resize(0)
for {
- if len(d.dec.toRead) > 0 {
- out.Append(d.dec.toRead)
- d.dec.toRead = nil
+ if len(d.inflater.toRead) > 0 {
+ out.Append(d.inflater.toRead)
+ d.inflater.toRead = nil
continue
}
- if d.dec.err != nil {
- if d.dec.err == io.EOF {
- return out, d.reader.off, nil
+ if d.inflater.err != nil {
+ if d.inflater.err == io.EOF {
+ return out, d.inflater.pos, nil
}
out.Release()
- return bufpool.Buffer{}, 0, d.dec.err
+ return bufpool.Buffer{}, 0, d.inflater.err
}
- d.dec.step(&d.dec)
- if d.dec.err != nil && len(d.dec.toRead) == 0 {
- d.dec.toRead = d.dec.dict.readFlush()
+ d.inflater.step(&d.inflater)
+ if d.inflater.err != nil && len(d.inflater.toRead) == 0 {
+ d.inflater.toRead = d.inflater.dict.readFlush()
}
}
}