diff options
| author | 2025-11-19 08:00:00 +0800 | |
|---|---|---|
| committer | 2025-11-19 08:00:00 +0800 | |
| commit | 84381e51d253d0fe13838b1c9abc9d272829663f (patch) | |
| tree | 942e41a45cc90984d7953e4be5d4aa6ce8c4fecc /internal/flate/decompress_bytes.go | |
| parent | Initial attempt to make a compressor with less overhead (diff) | |
| signature | No 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.go | 69 |
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() } } } |
