Files
sing-box-extended/transport/v2raykcp/multi_buffer.go

53 lines
1.1 KiB
Go

package v2raykcp
import "github.com/sagernet/sing/common/buf"
// MultiBuffer is a list of buf.Buffer. The order of Buffer matters.
type MultiBuffer []*buf.Buffer
// ReleaseMulti releases all content of the MultiBuffer and returns an empty MultiBuffer.
func ReleaseMulti(mb MultiBuffer) MultiBuffer {
for i := range mb {
mb[i].Release()
mb[i] = nil
}
return mb[:0]
}
// SplitBytes splits the given amount of bytes from the beginning of the MultiBuffer.
// It returns the new MultiBuffer leftover and number of bytes written into the input byte slice.
func SplitBytes(mb MultiBuffer, b []byte) (MultiBuffer, int) {
totalBytes := 0
endIndex := -1
for i := range mb {
pBuffer := mb[i]
nBytes, _ := pBuffer.Read(b)
totalBytes += nBytes
b = b[nBytes:]
if !pBuffer.IsEmpty() {
endIndex = i
break
}
pBuffer.Release()
mb[i] = nil
}
if endIndex == -1 {
mb = mb[:0]
} else {
mb = mb[endIndex:]
}
return mb, totalBytes
}
// IsEmpty returns true if the MultiBuffer has no content.
func (mb MultiBuffer) IsEmpty() bool {
for _, b := range mb {
if !b.IsEmpty() {
return false
}
}
return true
}