| package msgp |
| |
| type timer interface { |
| StartTimer() |
| StopTimer() |
| } |
| |
| // EndlessReader is an io.Reader |
| // that loops over the same data |
| // endlessly. It is used for benchmarking. |
| type EndlessReader struct { |
| tb timer |
| data []byte |
| offset int |
| } |
| |
| // NewEndlessReader returns a new endless reader |
| func NewEndlessReader(b []byte, tb timer) *EndlessReader { |
| return &EndlessReader{tb: tb, data: b, offset: 0} |
| } |
| |
| // Read implements io.Reader. In practice, it |
| // always returns (len(p), nil), although it |
| // fills the supplied slice while the benchmark |
| // timer is stopped. |
| func (c *EndlessReader) Read(p []byte) (int, error) { |
| c.tb.StopTimer() |
| var n int |
| l := len(p) |
| m := len(c.data) |
| for n < l { |
| nn := copy(p[n:], c.data[c.offset:]) |
| n += nn |
| c.offset += nn |
| c.offset %= m |
| } |
| c.tb.StartTimer() |
| return n, nil |
| } |