mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2024-12-30 02:37:01 +00:00
39 lines
831 B
Go
39 lines
831 B
Go
// Package pool provides internal pool utilities.
|
|
package pool
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// A Pool is a generic wrapper around [sync.Pool] to provide strongly-typed
|
|
// object pooling.
|
|
//
|
|
// Note that SA6002 (ref: https://staticcheck.io/docs/checks/#SA6002) will
|
|
// not be detected, so all internal pool use must take care to only store
|
|
// pointer types.
|
|
type Pool[T any] struct {
|
|
pool sync.Pool
|
|
}
|
|
|
|
// New returns a new [Pool] for T, and will use fn to construct new Ts when
|
|
// the pool is empty.
|
|
func New[T any](fn func() T) *Pool[T] {
|
|
return &Pool[T]{
|
|
pool: sync.Pool{
|
|
New: func() any {
|
|
return fn()
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
// Get gets a T from the pool, or creates a new one if the pool is empty.
|
|
func (p *Pool[T]) Get() T {
|
|
return p.pool.Get().(T)
|
|
}
|
|
|
|
// Put returns x into the pool.
|
|
func (p *Pool[T]) Put(x T) {
|
|
p.pool.Put(x)
|
|
}
|