Skip to content

Commit b2cf794

Browse files
committed
Merge branch 'orisano-feat/byte-reader-optimization'
2 parents ab29f6d + 68a6854 commit b2cf794

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

internal/lzma/reader.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func NewReader(p []byte, s uint64, readers []io.ReadCloser) (io.ReadCloser, erro
4141
h := bytes.NewBuffer(p)
4242
_ = binary.Write(h, binary.LittleEndian, s)
4343

44-
lr, err := lzma.NewReader(io.MultiReader(h, readers[0]))
44+
lr, err := lzma.NewReader(multiReader(h, readers[0]))
4545
if err != nil {
4646
return nil, err
4747
}
@@ -51,3 +51,35 @@ func NewReader(p []byte, s uint64, readers []io.ReadCloser) (io.ReadCloser, erro
5151
r: lr,
5252
}, nil
5353
}
54+
55+
func multiReader(b *bytes.Buffer, rc io.ReadCloser) io.Reader {
56+
mr := io.MultiReader(b, rc)
57+
58+
if br, ok := rc.(io.ByteReader); ok {
59+
return &multiByteReader{
60+
b: b,
61+
br: br,
62+
mr: mr,
63+
}
64+
}
65+
66+
return mr
67+
}
68+
69+
type multiByteReader struct {
70+
b *bytes.Buffer
71+
br io.ByteReader
72+
mr io.Reader
73+
}
74+
75+
func (m *multiByteReader) ReadByte() (byte, error) {
76+
if m.b.Len() > 0 {
77+
return m.b.ReadByte()
78+
}
79+
80+
return m.br.ReadByte()
81+
}
82+
83+
func (m *multiByteReader) Read(p []byte) (n int, err error) {
84+
return m.mr.Read(p)
85+
}

0 commit comments

Comments
 (0)