mirror of
https://github.com/fumiama/orbyte.git
synced 2026-06-18 01:26:10 +08:00
init
This commit is contained in:
68
pbuf/pooler.go
Normal file
68
pbuf/pooler.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package pbuf
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
type bufpooler struct{}
|
||||
|
||||
func (bufpooler) New(config any, pooled bytes.Buffer) bytes.Buffer {
|
||||
switch c := config.(type) {
|
||||
case int:
|
||||
pooled.Grow(c)
|
||||
return pooled
|
||||
case []byte:
|
||||
if len(c) > 0 || pooled.Cap() < cap(c) {
|
||||
return *bytes.NewBuffer(c)
|
||||
}
|
||||
return pooled
|
||||
case string:
|
||||
pooled.Grow(len(c))
|
||||
pooled.WriteString(c)
|
||||
return pooled
|
||||
default:
|
||||
panic("config type " + reflect.ValueOf(config).Type().String() + " isn't supported")
|
||||
}
|
||||
}
|
||||
|
||||
func (bufpooler) Parse(obj any, pooled bytes.Buffer) bytes.Buffer {
|
||||
switch o := obj.(type) {
|
||||
case *bytes.Buffer:
|
||||
return *o
|
||||
case bytes.Buffer:
|
||||
return o
|
||||
case []byte:
|
||||
pooled.Write(o)
|
||||
return pooled
|
||||
case string:
|
||||
pooled.WriteString(o)
|
||||
return pooled
|
||||
case io.Reader:
|
||||
_, err := io.Copy(&pooled, o)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return pooled
|
||||
default:
|
||||
panic("object type " + reflect.ValueOf(obj).Type().String() + " isn't supported")
|
||||
}
|
||||
}
|
||||
|
||||
func (bufpooler) Reset(item *bytes.Buffer) {
|
||||
// See https://golang.org/issue/23199
|
||||
const maxSize = 1 << 16
|
||||
if item.Cap() > maxSize { // drop large buffer
|
||||
*item = bytes.Buffer{}
|
||||
return
|
||||
}
|
||||
item.Reset()
|
||||
}
|
||||
|
||||
func (bufpooler) Copy(dst, src *bytes.Buffer) {
|
||||
_, err := io.Copy(dst, src)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user