From f81960bea58e2f74c26a2e71fa05170d63b5e124 Mon Sep 17 00:00:00 2001 From: Neuman Vong Date: Fri, 24 Feb 2017 08:27:23 -0800 Subject: [PATCH] Implement WriterTo Avoids allocation/copy when writing byteview to a writer. --- byteview.go | 15 +++++++++++++++ byteview_test.go | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/byteview.go b/byteview.go index 035a9ee..a2c2c49 100644 --- a/byteview.go +++ b/byteview.go @@ -158,3 +158,18 @@ func (v ByteView) ReadAt(p []byte, off int64) (n int, err error) { } return } + +// WriteTo implements io.WriterTo on the bytes in v. +func (v ByteView) WriteTo(w io.Writer) (n int64, err error) { + var m int + if v.b != nil { + m, err = w.Write(v.b) + } else { + m, err = io.WriteString(w, v.s) + } + if err == nil && m < v.Len() { + err = io.ErrShortWrite + } + n = int64(m) + return +} diff --git a/byteview_test.go b/byteview_test.go index 9ece00f..a09757a 100644 --- a/byteview_test.go +++ b/byteview_test.go @@ -17,6 +17,7 @@ limitations under the License. package groupcache import ( + "bytes" "fmt" "io" "io/ioutil" @@ -47,6 +48,10 @@ func TestByteView(t *testing.T) { if got, err := ioutil.ReadAll(io.NewSectionReader(v, 0, int64(len(s)))); err != nil || string(got) != s { t.Errorf("%s: SectionReader of ReaderAt = %q, %v; want %q", name, got, err, s) } + var dest bytes.Buffer + if _, err := v.WriteTo(&dest); err != nil || !bytes.Equal(dest.Bytes(), []byte(s)) { + t.Errorf("%s: WriteTo = %q, %v; want %q", name, dest.Bytes(), err, s) + } } } }