Codebase list golang-github-valyala-bytebufferpool-upstream / 21a4b21
Implement io.ReaderFrom Aliaksandr Valialkin 7 years ago
2 changed file(s) with 74 addition(s) and 1 deletion(s). Raw diff Collapse all Expand all
1515 B []byte
1616 }
1717
18 // WriteTo implements io.WriterTo
18 // Len returns the size of the byte buffer.
19 func (b *ByteBuffer) Len() int {
20 return len(b.B)
21 }
22
23 // ReadFrom implements io.ReaderFrom.
24 //
25 // The function appends all the data read from r to b.
26 func (b *ByteBuffer) ReadFrom(r io.Reader) (int64, error) {
27 p := b.B
28 nStart := int64(len(p))
29 nMax := int64(cap(p))
30 n := nStart
31 if nMax == 0 {
32 nMax = 64
33 p = make([]byte, nMax)
34 } else {
35 p = p[:nMax]
36 }
37 for {
38 if n == nMax {
39 nMax *= 2
40 bNew := make([]byte, nMax)
41 copy(bNew, p)
42 p = bNew
43 }
44 nn, err := r.Read(p[n:])
45 n += int64(nn)
46 if err != nil {
47 b.B = p[:n]
48 n -= nStart
49 if err == io.EOF {
50 return n, nil
51 }
52 return n, err
53 }
54 }
55 }
56
57 // WriteTo implements io.WriterTo.
1958 func (b *ByteBuffer) WriteTo(w io.Writer) (int64, error) {
2059 n, err := w.Write(b.B)
2160 return int64(n), err
66 "testing"
77 "time"
88 )
9
10 func TestByteBufferReadFrom(t *testing.T) {
11 prefix := "foobar"
12 expectedS := "asadfsdafsadfasdfisdsdfa"
13 prefixLen := int64(len(prefix))
14 expectedN := int64(len(expectedS))
15
16 var bb ByteBuffer
17 bb.WriteString(prefix)
18
19 rf := (io.ReaderFrom)(&bb)
20 for i := 0; i < 20; i++ {
21 r := bytes.NewBufferString(expectedS)
22 n, err := rf.ReadFrom(r)
23 if n != expectedN {
24 t.Fatalf("unexpected n=%d. Expecting %d. iteration %d", n, expectedN, i)
25 }
26 if err != nil {
27 t.Fatalf("unexpected error: %s", err)
28 }
29 bbLen := int64(bb.Len())
30 expectedLen := prefixLen + int64(i+1)*expectedN
31 if bbLen != expectedLen {
32 t.Fatalf("unexpected byteBuffer length: %d. Expecting %d", bbLen, expectedLen)
33 }
34 for j := 0; j < i; j++ {
35 start := prefixLen + int64(j)*expectedN
36 b := bb.B[start : start+expectedN]
37 if string(b) != expectedS {
38 t.Fatalf("unexpected byteBuffer contents: %q. Expecting %q", b, expectedS)
39 }
40 }
41 }
42 }
943
1044 func TestByteBufferWriteTo(t *testing.T) {
1145 expectedS := "foobarbaz"