bufio: Implement io.ReaderFrom for (*Writer).
This is part 2 of 2 for issue 4028.
benchmark old ns/op new ns/op delta
BenchmarkWriterCopyOptimal 53293 28326 -46.85%
BenchmarkWriterCopyUnoptimal 53757 30537 -43.19%
BenchmarkWriterCopyNoReadFrom 53192 36642 -31.11%
Fixes #4028.
R=nigeltao
CC=golang-dev
https://golang.org/cl/6565056
diff --git a/src/pkg/bufio/bufio.go b/src/pkg/bufio/bufio.go
index d6ba485..d1c5a13 100644
--- a/src/pkg/bufio/bufio.go
+++ b/src/pkg/bufio/bufio.go
@@ -567,6 +567,35 @@
return nn, nil
}
+// ReadFrom implements io.ReaderFrom.
+func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
+ if err = b.Flush(); err != nil {
+ return 0, err
+ }
+ if w, ok := b.wr.(io.ReaderFrom); ok {
+ return w.ReadFrom(r)
+ }
+ var m int
+ for {
+ m, err = r.Read(b.buf[b.n:])
+ if m == 0 {
+ break
+ }
+ b.n += m
+ n += int64(m)
+ if err1 := b.Flush(); err1 != nil {
+ return n, err1
+ }
+ if err != nil {
+ break
+ }
+ }
+ if err == io.EOF {
+ err = nil
+ }
+ return n, err
+}
+
// buffered input and output
// ReadWriter stores pointers to a Reader and a Writer.