]> Cypherpunks repositories - gostls13.git/commitdiff
bytes, string: add Reset method to Reader
authorJoe Tsai <joetsai@digital-static.net>
Thu, 31 Mar 2016 23:05:23 +0000 (16:05 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 7 Apr 2016 18:58:01 +0000 (18:58 +0000)
Currently, there is no easy allocation-free way to turn a
[]byte or string into an io.Reader. Thus, we add a Reset method
to bytes.Reader and strings.Reader to allow the reuse of these
Readers with another []byte or string.

This is consistent with the fact that many standard library io.Readers
already support a Reset method of some type:
bufio.Reader
flate.Reader
gzip.Reader
zlib.Reader
debug/dwarf.LineReader
bytes.Buffer
crypto/rc4.Cipher

Fixes #15033

Change-Id: I456fd1af77af6ef0b4ac6228b058ac1458ff3d19
Reviewed-on: https://go-review.googlesource.com/21386
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/bytes/reader.go
src/bytes/reader_test.go
src/strings/reader.go
src/strings/reader_test.go

index 5941ebdab4c96f7781c37b5c770d39191f04c8ec..7aa30578b321e30392ab1854abeacedc0f84ee5b 100644 (file)
@@ -146,5 +146,8 @@ func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
        return
 }
 
+// Reset resets the Reader to be reading from b.
+func (r *Reader) Reset(b []byte) { *r = Reader{b, 0, -1} }
+
 // NewReader returns a new Reader reading from b.
 func NewReader(b []byte) *Reader { return &Reader{b, 0, -1} }
index b929a2826096d501966925b00244c3af79dee42a..add985d57eb99b4588381d70a0c0756ddb67ecc3 100644 (file)
@@ -256,3 +256,23 @@ func TestReaderLenSize(t *testing.T) {
                t.Errorf("Size = %d; want 3", r.Size())
        }
 }
+
+func TestReaderReset(t *testing.T) {
+       r := NewReader([]byte("世界"))
+       if _, _, err := r.ReadRune(); err != nil {
+               t.Errorf("ReadRune: unexpected error: %v", err)
+       }
+
+       const want = "abcdef"
+       r.Reset([]byte(want))
+       if err := r.UnreadRune(); err == nil {
+               t.Errorf("UnreadRune: expected error, got nil")
+       }
+       buf, err := ioutil.ReadAll(r)
+       if err != nil {
+               t.Errorf("ReadAll: unexpected error: %v", err)
+       }
+       if got := string(buf); got != want {
+               t.Errorf("ReadAll: got %q, want %q", got, want)
+       }
+}
index 248e55245c1954ce2379bbc8e8b14d8098773bf7..737873c0992903153c32bed3410daaa650c6d918 100644 (file)
@@ -145,6 +145,9 @@ func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
        return
 }
 
+// Reset resets the Reader to be reading from s.
+func (r *Reader) Reset(s string) { *r = Reader{s, 0, -1} }
+
 // NewReader returns a new Reader reading from s.
 // It is similar to bytes.NewBufferString but more efficient and read-only.
 func NewReader(s string) *Reader { return &Reader{s, 0, -1} }
index 5003a37be4817b1b6701c2fa1e2e729087023c60..7bca2e89a179eb49c32146b3a14d06ceb06dd655 100644 (file)
@@ -170,3 +170,23 @@ func TestReaderLenSize(t *testing.T) {
                t.Errorf("Size = %d; want 3", r.Size())
        }
 }
+
+func TestReaderReset(t *testing.T) {
+       r := strings.NewReader("世界")
+       if _, _, err := r.ReadRune(); err != nil {
+               t.Errorf("ReadRune: unexpected error: %v", err)
+       }
+
+       const want = "abcdef"
+       r.Reset(want)
+       if err := r.UnreadRune(); err == nil {
+               t.Errorf("UnreadRune: expected error, got nil")
+       }
+       buf, err := ioutil.ReadAll(r)
+       if err != nil {
+               t.Errorf("ReadAll: unexpected error: %v", err)
+       }
+       if got := string(buf); got != want {
+               t.Errorf("ReadAll: got %q, want %q", got, want)
+       }
+}