1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
13 // A Reader implements the io.Reader, io.ReaderAt, io.WriterTo, io.Seeker,
14 // io.ByteScanner, and io.RuneScanner interfaces by reading from
16 // Unlike a Buffer, a Reader is read-only and supports seeking.
19 i
int // current reading index
20 prevRune
int // index of previous rune; or < 0
23 // Len returns the number of bytes of the unread portion of the
25 func (r
*Reader
) Len() int {
32 func (r
*Reader
) Read(b
[]byte) (n
int, err error
) {
39 n
= copy(b
, r
.s
[r
.i
:])
45 func (r
*Reader
) ReadAt(b
[]byte, off
int64) (n
int, err error
) {
47 return 0, errors
.New("bytes: invalid offset")
49 if off
>= int64(len(r
.s
)) {
52 n
= copy(b
, r
.s
[int(off
):])
59 func (r
*Reader
) ReadByte() (b
byte, err error
) {
69 func (r
*Reader
) UnreadByte() error
{
71 return errors
.New("bytes.Reader: at beginning of slice")
78 func (r
*Reader
) ReadRune() (ch rune
, size
int, err error
) {
83 if c
:= r
.s
[r
.i
]; c
< utf8
.RuneSelf
{
85 return rune(c
), 1, nil
87 ch
, size
= utf8
.DecodeRune(r
.s
[r
.i
:])
92 func (r
*Reader
) UnreadRune() error
{
94 return errors
.New("bytes.Reader: previous operation was not ReadRune")
101 // Seek implements the io.Seeker interface.
102 func (r
*Reader
) Seek(offset
int64, whence
int) (int64, error
) {
108 abs
= int64(r
.i
) + offset
110 abs
= int64(len(r
.s
)) + offset
112 return 0, errors
.New("bytes: invalid whence")
115 return 0, errors
.New("bytes: negative position")
118 return 0, errors
.New("bytes: position out of range")
124 // WriteTo implements the io.WriterTo interface.
125 func (r
*Reader
) WriteTo(w io
.Writer
) (n
int64, err error
) {
133 panic("bytes.Reader.WriteTo: invalid Write count")
137 if m
!= len(b
) && err
== nil {
138 err
= io
.ErrShortWrite
143 // NewReader returns a new Reader reading from b.
144 func NewReader(b
[]byte) *Reader
{ return &Reader
{b
, 0, -1} }