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 }