aboutsummaryrefslogtreecommitdiff
path: root/internal/compress/zlib/reader.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/compress/zlib/reader.go')
-rw-r--r--internal/compress/zlib/reader.go23
1 files changed, 22 insertions, 1 deletions
diff --git a/internal/compress/zlib/reader.go b/internal/compress/zlib/reader.go
index f58a904a..74357525 100644
--- a/internal/compress/zlib/reader.go
+++ b/internal/compress/zlib/reader.go
@@ -34,12 +34,14 @@ and to read that data back:
package zlib
import (
+ "bytes"
"encoding/binary"
"errors"
"hash"
"io"
- "lindenii.org/go/furgit/internal/compress/flate"
+ "github.com/klauspost/compress/flate"
+
"lindenii.org/go/lgo/intconv"
"lindenii.org/go/lgo/sync"
)
@@ -74,6 +76,7 @@ type Reader struct {
trailerRead uint64
err error
scratch [4]byte
+ br bytes.Reader
}
// NewReader creates a new ReadCloser.
@@ -99,6 +102,23 @@ func NewReaderDict(r io.Reader, dict []byte) (*Reader, error) {
return z, nil
}
+// NewReaderBytes is like [NewReader] but reads directly from payload,
+// reusing a [bytes.Reader] pooled with the returned Reader
+// instead of allocating a fresh one per call.
+// It is the caller's responsibility to call Close on the ReadCloser when done.
+func NewReaderBytes(payload []byte) (*Reader, error) {
+ z := readerPool.Get()
+
+ z.br.Reset(payload)
+
+ err := z.reset(&z.br, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ return z, nil
+}
+
// Read decompresses bytes from receiver into p.
func (z *Reader) Read(p []byte) (int, error) {
if z.err != nil {
@@ -167,6 +187,7 @@ func (z *Reader) Close() error {
return z.err
}
+ z.br.Reset(nil)
readerPool.Put(z)
return nil