circular.go 818 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package msgp
  2. type timer interface {
  3. StartTimer()
  4. StopTimer()
  5. }
  6. // EndlessReader is an io.Reader
  7. // that loops over the same data
  8. // endlessly. It is used for benchmarking.
  9. type EndlessReader struct {
  10. tb timer
  11. data []byte
  12. offset int
  13. }
  14. // NewEndlessReader returns a new endless reader
  15. func NewEndlessReader(b []byte, tb timer) *EndlessReader {
  16. return &EndlessReader{tb: tb, data: b, offset: 0}
  17. }
  18. // Read implements io.Reader. In practice, it
  19. // always returns (len(p), nil), although it
  20. // fills the supplied slice while the benchmark
  21. // timer is stopped.
  22. func (c *EndlessReader) Read(p []byte) (int, error) {
  23. c.tb.StopTimer()
  24. var n int
  25. l := len(p)
  26. m := len(c.data)
  27. for n < l {
  28. nn := copy(p[n:], c.data[c.offset:])
  29. n += nn
  30. c.offset += nn
  31. c.offset %= m
  32. }
  33. c.tb.StartTimer()
  34. return n, nil
  35. }