diff --git a/common/buf/multi.go b/common/buf/multi.go index 2d74ab5c..ec5c5cff 100644 --- a/common/buf/multi.go +++ b/common/buf/multi.go @@ -1,6 +1,9 @@ package buf -import "github.com/sagernet/sing/common" +import ( + "github.com/sagernet/sing/common" + "io" +) func LenMulti(buffers []*Buffer) int { var n int @@ -10,6 +13,34 @@ func LenMulti(buffers []*Buffer) int { return n } +func WriteMulti(writer io.Writer, buffers []*Buffer) error { + for _, buffer := range buffers { + _, err := writer.Write(buffer.Bytes()) + if err != nil { + ReleaseMulti(buffers) + return err + } + buffer.Release() + } + return nil +} + +func MergeMulti(buffers []*Buffer) *Buffer { + switch len(buffers) { + case 0: + panic("empty buffers") + case 1: + return buffers[0] + default: + newBuffer := NewSize(LenMulti(buffers)) + for _, buffer := range buffers { + common.Must1(newBuffer.Write(buffer.Bytes())) + buffer.Release() + } + return newBuffer + } +} + func ToSliceMulti(buffers []*Buffer) [][]byte { return common.Map(buffers, func(it *Buffer) []byte { return it.Bytes()