mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-05-14 00:51:12 +03:00
53 lines
1.1 KiB
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
|
|
}
|