refactor MultiBuffer append

pull/1435/head
Darien Raymond 2018-11-17 09:12:20 +01:00
parent 650f5e6350
commit 27772a75a7
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
10 changed files with 24 additions and 27 deletions

View File

@ -38,16 +38,13 @@ func ReadAllToBytes(reader io.Reader) ([]byte, error) {
// MultiBuffer is a list of Buffers. The order of Buffer matters. // MultiBuffer is a list of Buffers. The order of Buffer matters.
type MultiBuffer []*Buffer type MultiBuffer []*Buffer
// Append appends buffer to the end of this MultiBuffer // MergeMulti merges content from src to dest, and returns the new address of dest and src
func (mb *MultiBuffer) Append(buf *Buffer) { func MergeMulti(dest MultiBuffer, src MultiBuffer) (MultiBuffer, MultiBuffer) {
if buf != nil { dest = append(dest, src...)
*mb = append(*mb, buf) for idx := range src {
src[idx] = nil
} }
} return dest, src[:0]
// AppendMulti appends a MultiBuffer to the end of this one.
func (mb *MultiBuffer) AppendMulti(buf MultiBuffer) {
*mb = append(*mb, buf...)
} }
// Copy copied the beginning part of the MultiBuffer into the given byte array. // Copy copied the beginning part of the MultiBuffer into the given byte array.
@ -73,7 +70,7 @@ func (mb *MultiBuffer) ReadFrom(reader io.Reader) (int64, error) {
if b.IsEmpty() { if b.IsEmpty() {
b.Release() b.Release()
} else { } else {
mb.Append(b) *mb = append(*mb, b)
} }
totalBytes += int64(b.Len()) totalBytes += int64(b.Len())
if err != nil { if err != nil {
@ -138,7 +135,7 @@ func (mb *MultiBuffer) Write(b []byte) (int, error) {
bb := New() bb := New()
nBytes, _ := bb.Write(b) nBytes, _ := bb.Write(b)
b = b[nBytes:] b = b[nBytes:]
mb.Append(bb) *mb = append(*mb, bb)
} }
return totalBytes, nil return totalBytes, nil
@ -204,7 +201,7 @@ func (mb *MultiBuffer) SliceBySize(size int32) MultiBuffer {
break break
} }
sliceSize += b.Len() sliceSize += b.Len()
slice.Append(b) slice = append(slice, b)
(*mb)[i] = nil (*mb)[i] = nil
} }
*mb = (*mb)[endIndex:] *mb = (*mb)[endIndex:]

View File

@ -33,7 +33,7 @@ func TestMultiBufferAppend(t *testing.T) {
var mb MultiBuffer var mb MultiBuffer
b := New() b := New()
b.WriteString("ab") b.WriteString("ab")
mb.Append(b) mb = append(mb, b)
assert(mb.Len(), Equals, int32(2)) assert(mb.Len(), Equals, int32(2))
} }

View File

@ -51,7 +51,7 @@ func TestReadvReader(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("unexpected error: ", err) t.Fatal("unexpected error: ", err)
} }
rmb.AppendMulti(mb) rmb, _ = MergeMulti(rmb, mb)
if rmb.Len() == size { if rmb.Len() == size {
break break
} }

View File

@ -176,7 +176,7 @@ func (r *AuthenticationReader) readInternal(soft bool, mb *buf.MultiBuffer) erro
if err != nil { if err != nil {
return nil return nil
} }
mb.Append(b) *mb = append(*mb, b)
return nil return nil
} }
@ -289,7 +289,7 @@ func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
mb2Write.Release() mb2Write.Release()
return err return err
} }
mb2Write.Append(eb) mb2Write = append(mb2Write, eb)
if mb.IsEmpty() { if mb.IsEmpty() {
break break
} }
@ -313,7 +313,7 @@ func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error {
continue continue
} }
mb2Write.Append(eb) mb2Write = append(mb2Write, eb)
} }
if mb2Write.IsEmpty() { if mb2Write.IsEmpty() {

View File

@ -60,7 +60,7 @@ func TestAuthenticationReaderWriter(t *testing.T) {
mb2, err := reader.ReadMultiBuffer() mb2, err := reader.ReadMultiBuffer()
assert(err, IsNil) assert(err, IsNil)
mb.AppendMulti(mb2) mb, _ = buf.MergeMulti(mb, mb2)
} }
assert(mb.Len(), Equals, int32(payloadSize)) assert(mb.Len(), Equals, int32(payloadSize))
@ -97,11 +97,11 @@ func TestAuthenticationReaderWriterPacket(t *testing.T) {
var payload buf.MultiBuffer var payload buf.MultiBuffer
pb1 := buf.New() pb1 := buf.New()
pb1.Write([]byte("abcd")) pb1.Write([]byte("abcd"))
payload.Append(pb1) payload = append(payload, pb1)
pb2 := buf.New() pb2 := buf.New()
pb2.Write([]byte("efgh")) pb2.Write([]byte("efgh"))
payload.Append(pb2) payload = append(payload, pb2)
assert(writer.WriteMultiBuffer(payload), IsNil) assert(writer.WriteMultiBuffer(payload), IsNil)
assert(cache.Len(), GreaterThan, int32(0)) assert(cache.Len(), GreaterThan, int32(0))

View File

@ -147,8 +147,8 @@ func (w *ChunkStreamWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
b := buf.New() b := buf.New()
w.sizeEncoder.Encode(uint16(slice.Len()), b.Extend(w.sizeEncoder.SizeBytes())) w.sizeEncoder.Encode(uint16(slice.Len()), b.Extend(w.sizeEncoder.SizeBytes()))
mb2Write.Append(b) mb2Write = append(mb2Write, b)
mb2Write.AppendMulti(slice) mb2Write = append(mb2Write, slice...)
if mb.IsEmpty() { if mb.IsEmpty() {
break break

View File

@ -22,7 +22,7 @@ func readAll(reader buf.Reader) (buf.MultiBuffer, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
mb.AppendMulti(b) mb = append(mb, b...)
} }
return mb, nil return mb, nil
} }

View File

@ -71,8 +71,8 @@ func writeMetaWithFrame(writer buf.Writer, meta FrameMetadata, data buf.MultiBuf
} }
mb2 := make(buf.MultiBuffer, 0, len(data)+1) mb2 := make(buf.MultiBuffer, 0, len(data)+1)
mb2.Append(frame) mb2 = append(mb2, frame)
mb2.AppendMulti(data) mb2 = append(mb2, data...)
return writer.WriteMultiBuffer(mb2) return writer.WriteMultiBuffer(mb2)
} }

View File

@ -196,7 +196,7 @@ func (w *ReceivingWorker) ReadMultiBuffer() buf.MultiBuffer {
break break
} }
w.nextNumber++ w.nextNumber++
mb.Append(seg.Detach()) mb = append(mb, seg.Detach())
seg.Release() seg.Release()
} }

View File

@ -120,7 +120,7 @@ func (p *pipe) writeMultiBufferInternal(mb buf.MultiBuffer) error {
return err return err
} }
p.data.AppendMulti(mb) p.data, _ = buf.MergeMulti(p.data, mb)
return nil return nil
} }