package msgp

import (
	"testing"
)

// EndlessReader is an io.Reader
// that loops over the same data
// endlessly. It is used for benchmarking.
type EndlessReader struct {
	tb     *testing.B
	data   []byte
	offset int
}

// NewEndlessReader returns a new endless reader
func NewEndlessReader(b []byte, tb *testing.B) *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
}

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
}

Break dependency on "testing" package
Break dependency on "testing" package

Importing the "testing" standard library package automatically registers the
testing commandline flags. This side effect cluttered up the output of --help
for any program that imported msgp.

I replaced the dependency on testing.B with an interface containing the required
methods.
