2025-08-11 23:41:22 +08:00
|
|
|
package buffer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"io"
|
|
|
|
)
|
|
|
|
|
|
|
|
// 用于存储不复用的[]byte
|
|
|
|
type Reader struct {
|
|
|
|
bufs [][]byte
|
2025-09-15 19:36:16 +08:00
|
|
|
size int64
|
|
|
|
offset int64
|
2025-08-11 23:41:22 +08:00
|
|
|
}
|
|
|
|
|
2025-09-15 19:36:16 +08:00
|
|
|
func (r *Reader) Size() int64 {
|
|
|
|
return r.size
|
2025-08-11 23:41:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Reader) Append(buf []byte) {
|
2025-09-15 19:36:16 +08:00
|
|
|
r.size += int64(len(buf))
|
2025-08-11 23:41:22 +08:00
|
|
|
r.bufs = append(r.bufs, buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Reader) Read(p []byte) (int, error) {
|
2025-09-15 19:36:16 +08:00
|
|
|
n, err := r.ReadAt(p, r.offset)
|
2025-08-11 23:41:22 +08:00
|
|
|
if n > 0 {
|
2025-09-15 19:36:16 +08:00
|
|
|
r.offset += int64(n)
|
2025-08-11 23:41:22 +08:00
|
|
|
}
|
|
|
|
return n, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Reader) ReadAt(p []byte, off int64) (int, error) {
|
2025-09-15 19:36:16 +08:00
|
|
|
if off < 0 || off >= r.size {
|
2025-08-11 23:41:22 +08:00
|
|
|
return 0, io.EOF
|
|
|
|
}
|
|
|
|
|
2025-09-15 19:36:16 +08:00
|
|
|
n := 0
|
2025-08-11 23:41:22 +08:00
|
|
|
readFrom := false
|
|
|
|
for _, buf := range r.bufs {
|
|
|
|
if readFrom {
|
2025-09-15 19:36:16 +08:00
|
|
|
nn := copy(p[n:], buf)
|
|
|
|
n += nn
|
|
|
|
if n == len(p) {
|
|
|
|
return n, nil
|
|
|
|
}
|
|
|
|
} else if newOff := off - int64(len(buf)); newOff >= 0 {
|
|
|
|
off = newOff
|
|
|
|
} else {
|
|
|
|
nn := copy(p, buf[off:])
|
|
|
|
if nn == len(p) {
|
|
|
|
return nn, nil
|
|
|
|
}
|
|
|
|
n += nn
|
2025-08-11 23:41:22 +08:00
|
|
|
readFrom = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return n, io.EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
|
|
|
|
switch whence {
|
|
|
|
case io.SeekStart:
|
|
|
|
case io.SeekCurrent:
|
2025-09-15 19:36:16 +08:00
|
|
|
offset = r.offset + offset
|
2025-08-11 23:41:22 +08:00
|
|
|
case io.SeekEnd:
|
2025-09-15 19:36:16 +08:00
|
|
|
offset = r.size + offset
|
2025-08-11 23:41:22 +08:00
|
|
|
default:
|
|
|
|
return 0, errors.New("Seek: invalid whence")
|
|
|
|
}
|
|
|
|
|
2025-09-15 19:36:16 +08:00
|
|
|
if offset < 0 || offset > r.size {
|
2025-08-11 23:41:22 +08:00
|
|
|
return 0, errors.New("Seek: invalid offset")
|
|
|
|
}
|
|
|
|
|
2025-09-15 19:36:16 +08:00
|
|
|
r.offset = offset
|
|
|
|
return offset, nil
|
2025-08-11 23:41:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Reader) Reset() {
|
|
|
|
clear(r.bufs)
|
|
|
|
r.bufs = nil
|
2025-09-15 19:36:16 +08:00
|
|
|
r.size = 0
|
2025-08-11 23:41:22 +08:00
|
|
|
r.offset = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewReader(buf ...[]byte) *Reader {
|
2025-09-15 19:36:16 +08:00
|
|
|
b := &Reader{
|
|
|
|
bufs: make([][]byte, 0, len(buf)),
|
|
|
|
}
|
2025-08-11 23:41:22 +08:00
|
|
|
for _, b1 := range buf {
|
|
|
|
b.Append(b1)
|
|
|
|
}
|
|
|
|
return b
|
|
|
|
}
|