62 lines
1 KiB
Go
62 lines
1 KiB
Go
// Copyright (C) 2022 Marius Schellenberger
|
|
|
|
package fs
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
var Discard io.Writer = discard{}
|
|
|
|
type discard struct{}
|
|
|
|
var _ io.ReaderFrom = discard{}
|
|
|
|
func (discard) Write(p []byte) (int, error) {
|
|
return len(p), nil
|
|
}
|
|
|
|
func (discard) WriteString(s string) (int, error) {
|
|
return len(s), nil
|
|
}
|
|
|
|
const (
|
|
StreamingBufferSize = 32768
|
|
DefaultBufferSize = 8192
|
|
)
|
|
|
|
func poolNewFunc(size int) func() *[]byte {
|
|
return func() *[]byte {
|
|
b := make([]byte, size)
|
|
return &b
|
|
}
|
|
}
|
|
|
|
var (
|
|
streamingPool = newPool(poolNewFunc(StreamingBufferSize))
|
|
blackHolePool = newPool(poolNewFunc(DefaultBufferSize))
|
|
)
|
|
|
|
func SetBufferSize(size int) bool {
|
|
if size < 0 || size == DefaultBufferSize {
|
|
return false
|
|
}
|
|
blackHolePool = newPool(poolNewFunc(size))
|
|
return true
|
|
}
|
|
|
|
func (discard) ReadFrom(r io.Reader) (n int64, err error) {
|
|
bufp := blackHolePool.Get()
|
|
readSize := 0
|
|
for {
|
|
readSize, err = r.Read(*bufp)
|
|
n += int64(readSize)
|
|
if err != nil {
|
|
blackHolePool.Put(bufp)
|
|
if err == io.EOF {
|
|
return n, nil
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|