mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-24 17:35:01 +01:00
40 lines
706 B
Go
40 lines
706 B
Go
package bytecounter
|
|
|
|
import (
|
|
"io"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// ReadCloser wraps an io.ReadCloser, reimplementing
|
|
// its interface and counting the bytes written to during copying.
|
|
type ReadCloser interface {
|
|
io.ReadCloser
|
|
Count() int64
|
|
}
|
|
|
|
// NewReadCloser wraps rc.
|
|
func NewReadCloser(rc io.ReadCloser) ReadCloser {
|
|
return &readCloser{rc, 0}
|
|
}
|
|
|
|
type readCloser struct {
|
|
rc io.ReadCloser
|
|
count int64
|
|
}
|
|
|
|
func (r *readCloser) Count() int64 {
|
|
return atomic.LoadInt64(&r.count)
|
|
}
|
|
|
|
var _ io.ReadCloser = &readCloser{}
|
|
|
|
func (r *readCloser) Close() error {
|
|
return r.rc.Close()
|
|
}
|
|
|
|
func (r *readCloser) Read(p []byte) (int, error) {
|
|
n, err := r.rc.Read(p)
|
|
atomic.AddInt64(&r.count, int64(n))
|
|
return n, err
|
|
}
|